[geany/geany] 437377: plugin api: convert StashGroup to GBoxed internally
Thomas Martitz
git-noreply at xxxxx
Tue Jan 19 16:08:59 UTC 2016
Branch: refs/heads/master
Author: Thomas Martitz <kugel at rockbox.org>
Committer: Thomas Martitz <kugel at rockbox.org>
Date: Tue, 19 Jan 2016 16:08:59 UTC
Commit: 43737733acc46eee7dff88eb922622694faba29b
https://github.com/geany/geany/commit/43737733acc46eee7dff88eb922622694faba29b
Log Message:
-----------
plugin api: convert StashGroup to GBoxed internally
Because the stash_group_new() is an exported API, it has to be at least a boxed
type to be usable for gobject introspection. The boxed type uses reference
counting as opposed to memory duplication.
The obligatory stash_group_dup() is not exported (doesn't have to).
Modified Paths:
--------------
src/stash.c
src/stash.h
Modified: src/stash.c
46 lines changed, 33 insertions(+), 13 deletions(-)
===================================================================
@@ -123,6 +123,7 @@ typedef struct StashPref StashPref;
struct StashGroup
{
+ guint refcount; /* ref count for GBoxed implementation */
const gchar *name; /* group name to use in the keyfile */
GPtrArray *entries; /* array of (StashPref*) */
gboolean various; /* mark group for display/edit in stash treeview */
@@ -347,17 +348,27 @@ gint stash_group_save_to_file(StashGroup *group, const gchar *filename,
}
+static void free_stash_pref(StashPref *pref)
+{
+ if (pref->widget_type == GTK_TYPE_RADIO_BUTTON)
+ g_free(pref->extra.radio_buttons);
+
+ g_slice_free(StashPref, pref);
+}
+
+
/** Creates a new group.
* @param name Name used for @c GKeyFile group.
* @return Group. */
GEANY_API_SYMBOL
StashGroup *stash_group_new(const gchar *name)
{
- StashGroup *group = g_new0(StashGroup, 1);
+ StashGroup *group = g_slice_new0(StashGroup);
group->name = name;
- group->entries = g_ptr_array_new();
+ group->entries = g_ptr_array_new_with_free_func((GDestroyNotify) free_stash_pref);
group->use_defaults = TRUE;
+ group->refcount = 1;
return group;
}
@@ -386,27 +397,36 @@ void stash_group_free_settings(StashGroup *group)
}
+static StashGroup *stash_group_dup(StashGroup *src)
+{
+ g_atomic_int_inc(&src->refcount);
+
+ return src;
+}
+
+
/** Frees a group.
* @param group . */
GEANY_API_SYMBOL
void stash_group_free(StashGroup *group)
{
- StashPref *entry;
- guint i;
-
- foreach_ptr_array(entry, i, group->entries)
+ if (g_atomic_int_dec_and_test(&group->refcount))
{
- if (entry->widget_type == GTK_TYPE_RADIO_BUTTON)
- {
- g_free(entry->extra.radio_buttons);
- }
- g_slice_free(StashPref, entry);
+ g_ptr_array_free(group->entries, TRUE);
+ g_slice_free(StashGroup, group);
}
- g_ptr_array_free(group->entries, TRUE);
- g_free(group);
}
+/** Gets the GBoxed-derived GType for StashGroup
+ *
+ * @return StashGroup type . */
+GEANY_API_SYMBOL
+GType stash_group_get_type(void);
+
+G_DEFINE_BOXED_TYPE(StashGroup, stash_group, stash_group_dup, stash_group_free);
+
+
/* Used for selecting groups passed to stash_tree_setup().
* @c FALSE by default. */
void stash_group_set_various(StashGroup *group, gboolean various)
Modified: src/stash.h
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -33,6 +33,7 @@ typedef struct StashGroup StashGroup;
* stash_group_display() and stash_group_update(). */
typedef gconstpointer StashWidgetID;
+GType stash_group_get_type(void);
StashGroup *stash_group_new(const gchar *name);
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list