mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-06 00:30:08 +00:00
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:
parent
91602cca6e
commit
03eb4c38c9
@ -5417,6 +5417,8 @@ GTK_CHECK_VERSION
|
||||
GtkWidgetPath
|
||||
gtk_widget_path_append_type
|
||||
gtk_widget_path_copy
|
||||
gtk_widget_path_ref
|
||||
gtk_widget_path_unref
|
||||
gtk_widget_path_free
|
||||
gtk_widget_path_get_object_type
|
||||
gtk_widget_path_has_parent
|
||||
|
@ -3578,6 +3578,8 @@ gtk_widget_override_symbolic_color
|
||||
gtk_widget_path
|
||||
gtk_widget_path_append_type
|
||||
gtk_widget_path_copy
|
||||
gtk_widget_path_ref
|
||||
gtk_widget_path_unref
|
||||
gtk_widget_path_free
|
||||
gtk_widget_path_get_type
|
||||
gtk_widget_path_get_object_type
|
||||
|
@ -97,6 +97,8 @@ struct GtkPathElement
|
||||
|
||||
struct _GtkWidgetPath
|
||||
{
|
||||
volatile guint ref_count;
|
||||
|
||||
GArray *elems; /* First element contains the described widget */
|
||||
};
|
||||
|
||||
@ -116,6 +118,7 @@ gtk_widget_path_new (void)
|
||||
|
||||
path = g_slice_new0 (GtkWidgetPath);
|
||||
path->elems = g_array_new (FALSE, TRUE, sizeof (GtkPathElement));
|
||||
path->ref_count = 1;
|
||||
|
||||
return path;
|
||||
}
|
||||
@ -174,20 +177,44 @@ gtk_widget_path_copy (const GtkWidgetPath *path)
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_path_free:
|
||||
* gtk_widget_path_ref:
|
||||
* @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
|
||||
gtk_widget_path_free (GtkWidgetPath *path)
|
||||
gtk_widget_path_unref (GtkWidgetPath *path)
|
||||
{
|
||||
guint i;
|
||||
|
||||
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++)
|
||||
{
|
||||
GtkPathElement *elem;
|
||||
@ -205,6 +232,23 @@ gtk_widget_path_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:
|
||||
* @path: a #GtkWidgetPath
|
||||
|
@ -41,6 +41,8 @@ GType gtk_widget_path_get_type (void) G_GNUC_CONST;
|
||||
GtkWidgetPath * gtk_widget_path_new (void);
|
||||
|
||||
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);
|
||||
|
||||
char * gtk_widget_path_to_string (const GtkWidgetPath *path);
|
||||
|
Loading…
Reference in New Issue
Block a user