Make style properties in dynamic types work better

This commit is contained in:
Matthias Clasen 2006-05-24 18:03:19 +00:00
parent aa12ca9522
commit 15eef255e3
3 changed files with 73 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2006-05-24 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkwidget.c: Remove style properties when a widget
class gets finalized, to make style properties work in
dynamic types. (#342513, Christian Persch)
2006-05-24 Henrique Romano <henrique@async.com.br>
* gtk/gtkcellview.c: (gtk_cell_view_class_init),

View File

@ -1,3 +1,9 @@
2006-05-24 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkwidget.c: Remove style properties when a widget
class gets finalized, to make style properties work in
dynamic types. (#342513, Christian Persch)
2006-05-24 Henrique Romano <henrique@async.com.br>
* gtk/gtkcellview.c: (gtk_cell_view_class_init),

View File

@ -159,6 +159,9 @@ struct _GtkStateData
/* --- prototypes --- */
static void gtk_widget_class_init (GtkWidgetClass *klass);
static void gtk_widget_base_class_finalize (GtkWidgetClass *klass);
static void gtk_widget_init (GtkWidget *widget);
static void gtk_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
@ -233,6 +236,7 @@ static void gtk_widget_get_draw_rectangle (GtkWidget *widget,
/* --- variables --- */
static gpointer gtk_widget_parent_class = NULL;
static guint widget_signals[LAST_SIGNAL] = { 0 };
static GtkStyle *gtk_default_style = NULL;
static GSList *colormap_stack = NULL;
@ -258,9 +262,44 @@ GParamSpecPool *_gtk_widget_child_property_pool = NULL;
GObjectNotifyContext *_gtk_widget_child_property_notify_context = NULL;
/* --- functions --- */
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkWidget, gtk_widget, GTK_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (ATK_TYPE_IMPLEMENTOR,
gtk_widget_accessible_interface_init))
GType
gtk_widget_get_type (void)
{
static GType widget_type = 0;
if (G_UNLIKELY (widget_type == 0))
{
const GTypeInfo widget_info =
{
sizeof (GtkWidgetClass),
NULL, /* base_init */
(GBaseFinalizeFunc) gtk_widget_base_class_finalize,
(GClassInitFunc) gtk_widget_class_init,
NULL, /* class_finalize */
NULL, /* class_init */
sizeof (GtkWidget),
0, /* n_preallocs */
(GInstanceInitFunc) gtk_widget_init,
NULL, /* value_table */
};
const GInterfaceInfo accessibility_info =
{
(GInterfaceInitFunc) gtk_widget_accessible_interface_init,
(GInterfaceFinalizeFunc) NULL,
NULL /* interface data */
};
widget_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkWidget",
&widget_info, G_TYPE_FLAG_ABSTRACT);
g_type_add_interface_static (widget_type, ATK_TYPE_IMPLEMENTOR,
&accessibility_info) ;
}
return widget_type;
}
static void
child_property_notify_dispatcher (GObject *object,
@ -277,7 +316,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
GtkBindingSet *binding_set;
gtk_widget_parent_class = g_type_class_peek_parent (klass);
quark_property_parser = g_quark_from_static_string ("gtk-rc-property-parser");
quark_aux_info = g_quark_from_static_string ("gtk-aux-info");
quark_accel_path = g_quark_from_static_string ("gtk-accel-path");
@ -1601,6 +1642,22 @@ gtk_widget_class_init (GtkWidgetClass *klass)
GTK_PARAM_READABLE));
}
static void
gtk_widget_base_class_finalize (GtkWidgetClass *klass)
{
GList *list, *node;
list = g_param_spec_pool_list_owned (style_property_spec_pool, G_OBJECT_CLASS_TYPE (klass));
for (node = list; node; node = node->next)
{
GParamSpec *pspec = node->data;
g_param_spec_pool_remove (style_property_spec_pool, pspec);
g_param_spec_unref (pspec);
}
g_list_free (list);
}
static void
gtk_widget_set_property (GObject *object,
guint prop_id,