diff options
Diffstat (limited to 'gtk/gtkcontainer.c')
-rw-r--r-- | gtk/gtkcontainer.c | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index 52f1c4a30b..74bbaeca82 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -89,6 +89,9 @@ static void gtk_container_children_callback (GtkWidget *widget, static void gtk_container_show_all (GtkWidget *widget); static void gtk_container_hide_all (GtkWidget *widget); +static gchar* gtk_container_child_default_composite_name (GtkContainer *container, + GtkWidget *child); + static guint container_signals[LAST_SIGNAL] = { 0 }; @@ -212,6 +215,7 @@ gtk_container_class_init (GtkContainerClass *class) class->focus = gtk_container_real_focus; class->set_focus_child = gtk_container_real_set_focus_child; class->child_type = NULL; + class->composite_name = gtk_container_child_default_composite_name; } GtkType @@ -1254,7 +1258,7 @@ gtk_container_unregister_toplevel (GtkContainer *container) gtk_widget_unref (GTK_WIDGET (container)); } -GList * +GList* gtk_container_get_toplevels (void) { /* XXX: fixme we should ref all these widgets and duplicate @@ -1263,6 +1267,83 @@ gtk_container_get_toplevels (void) return toplevel_list; } +static void +gtk_container_child_position_callback (GtkWidget *widget, + gpointer client_data) +{ + struct { + GtkWidget *child; + guint i; + guint index; + } *data = client_data; + + data->i++; + if (data->child == widget) + data->index = data->i; +} + +static gchar* +gtk_container_child_default_composite_name (GtkContainer *container, + GtkWidget *child) +{ + struct { + GtkWidget *child; + guint i; + guint index; + } data; + gchar *name; + + /* fallback implementation */ + data.child = child; + data.i = 0; + data.index = 0; + gtk_container_forall (container, + gtk_container_child_position_callback, + &data); + + name = g_strdup_printf ("%s-%u", + gtk_type_name (GTK_OBJECT_TYPE (child)), + data.index); + + return name; +} + +gchar* +gtk_container_child_composite_name (GtkContainer *container, + GtkWidget *child) +{ + g_return_val_if_fail (container != NULL, NULL); + g_return_val_if_fail (GTK_IS_CONTAINER (container), NULL); + g_return_val_if_fail (child != NULL, NULL); + g_return_val_if_fail (GTK_IS_WIDGET (child), NULL); + g_return_val_if_fail (child->parent == GTK_WIDGET (container), NULL); + + if (GTK_WIDGET_COMPOSITE_CHILD (child)) + { + static GQuark quark_composite_name = 0; + gchar *name; + + if (!quark_composite_name) + quark_composite_name = g_quark_from_static_string ("gtk-composite-name"); + + name = gtk_object_get_data_by_id (GTK_OBJECT (child), quark_composite_name); + if (!name) + { + GtkContainerClass *class; + + class = GTK_CONTAINER_CLASS (GTK_OBJECT (container)->klass); + if (class->composite_name) + name = class->composite_name (container, child); + } + else + name = g_strdup (name); + + return name; + } + + return NULL; +} + void gtk_container_real_set_focus_child (GtkContainer *container, GtkWidget *child) |