widgetpath: Make structure refcounted

I want to use widget paths in a way that make a lot more sense with a
refcounted structure. See the following patches.
This commit is contained in:
Benjamin Otte 2011-05-27 16:36:07 +02:00
parent 91602cca6e
commit 03eb4c38c9
4 changed files with 54 additions and 4 deletions

View File

@ -5417,6 +5417,8 @@ GTK_CHECK_VERSION
GtkWidgetPath GtkWidgetPath
gtk_widget_path_append_type gtk_widget_path_append_type
gtk_widget_path_copy gtk_widget_path_copy
gtk_widget_path_ref
gtk_widget_path_unref
gtk_widget_path_free gtk_widget_path_free
gtk_widget_path_get_object_type gtk_widget_path_get_object_type
gtk_widget_path_has_parent gtk_widget_path_has_parent

View File

@ -3578,6 +3578,8 @@ gtk_widget_override_symbolic_color
gtk_widget_path gtk_widget_path
gtk_widget_path_append_type gtk_widget_path_append_type
gtk_widget_path_copy gtk_widget_path_copy
gtk_widget_path_ref
gtk_widget_path_unref
gtk_widget_path_free gtk_widget_path_free
gtk_widget_path_get_type gtk_widget_path_get_type
gtk_widget_path_get_object_type gtk_widget_path_get_object_type

View File

@ -97,6 +97,8 @@ struct GtkPathElement
struct _GtkWidgetPath struct _GtkWidgetPath
{ {
volatile guint ref_count;
GArray *elems; /* First element contains the described widget */ GArray *elems; /* First element contains the described widget */
}; };
@ -116,6 +118,7 @@ gtk_widget_path_new (void)
path = g_slice_new0 (GtkWidgetPath); path = g_slice_new0 (GtkWidgetPath);
path->elems = g_array_new (FALSE, TRUE, sizeof (GtkPathElement)); path->elems = g_array_new (FALSE, TRUE, sizeof (GtkPathElement));
path->ref_count = 1;
return path; return path;
} }
@ -174,20 +177,44 @@ gtk_widget_path_copy (const GtkWidgetPath *path)
} }
/** /**
* gtk_widget_path_free: * gtk_widget_path_ref:
* @path: a #GtkWidgetPath * @path: a #GtkWidgetPath
* *
* Frees a #GtkWidgetPath. * Increments the reference count on @path.
* *
* Since: 3.0 * Returns: @path itself.
*
* Since: 3.2
**/
GtkWidgetPath *
gtk_widget_path_ref (GtkWidgetPath *path)
{
g_return_val_if_fail (path != NULL, path);
g_atomic_int_add (&path->ref_count, 1);
return path;
}
/**
* gtk_widget_path_unref:
* @path: a #GtkWidgetPath
*
* Decrements the reference count on @path, freeing the structure
* if the reference count reaches 0.
*
* Since: 3.2
**/ **/
void void
gtk_widget_path_free (GtkWidgetPath *path) gtk_widget_path_unref (GtkWidgetPath *path)
{ {
guint i; guint i;
g_return_if_fail (path != NULL); g_return_if_fail (path != NULL);
if (!g_atomic_int_dec_and_test (&path->ref_count))
return;
for (i = 0; i < path->elems->len; i++) for (i = 0; i < path->elems->len; i++)
{ {
GtkPathElement *elem; GtkPathElement *elem;
@ -205,6 +232,23 @@ gtk_widget_path_free (GtkWidgetPath *path)
g_slice_free (GtkWidgetPath, path); g_slice_free (GtkWidgetPath, path);
} }
/**
* gtk_widget_path_free:
* @path: a #GtkWidgetPath
*
* Decrements the reference count on @path, freeing the structure
* if the reference count reaches 0.
*
* Since: 3.0
**/
void
gtk_widget_path_free (GtkWidgetPath *path)
{
g_return_if_fail (path != NULL);
gtk_widget_path_unref (path);
}
/** /**
* gtk_widget_path_length: * gtk_widget_path_length:
* @path: a #GtkWidgetPath * @path: a #GtkWidgetPath

View File

@ -41,6 +41,8 @@ GType gtk_widget_path_get_type (void) G_GNUC_CONST;
GtkWidgetPath * gtk_widget_path_new (void); GtkWidgetPath * gtk_widget_path_new (void);
GtkWidgetPath * gtk_widget_path_copy (const GtkWidgetPath *path); GtkWidgetPath * gtk_widget_path_copy (const GtkWidgetPath *path);
GtkWidgetPath * gtk_widget_path_ref (GtkWidgetPath *path);
void gtk_widget_path_unref (GtkWidgetPath *path);
void gtk_widget_path_free (GtkWidgetPath *path); void gtk_widget_path_free (GtkWidgetPath *path);
char * gtk_widget_path_to_string (const GtkWidgetPath *path); char * gtk_widget_path_to_string (const GtkWidgetPath *path);