From f2bb20cc15438e6b8d1d7c979681de3cbefac4f6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 8 Jan 2004 23:37:34 +0000 Subject: [PATCH] New function to obtain a list of toplevel widgets constructed by the ui Fri Jan 9 00:34:57 2004 Matthias Clasen * gtk/gtkuimanager.h: * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to obtain a list of toplevel widgets constructed by the ui manager. * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that the values can be combined for gtk_ui_manager_get_toplevels(). * tests/testmerge.c: Add a "Dump toplevels" button to test gtk_ui_manager_get_toplevels(). --- ChangeLog | 12 ++++++ ChangeLog.pre-2-10 | 12 ++++++ ChangeLog.pre-2-4 | 12 ++++++ ChangeLog.pre-2-6 | 12 ++++++ ChangeLog.pre-2-8 | 12 ++++++ docs/reference/ChangeLog | 4 ++ docs/reference/gtk/gtk-sections.txt | 1 + gtk/gtkuimanager.c | 67 ++++++++++++++++++++++++++++- gtk/gtkuimanager.h | 22 +++++----- tests/testmerge.c | 25 +++++++++++ 10 files changed, 168 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ecc812a23..fbec286c0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Fri Jan 9 00:34:57 2004 Matthias Clasen + + * gtk/gtkuimanager.h: + * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to + obtain a list of toplevel widgets constructed by the ui manager. + + * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that + the values can be combined for gtk_ui_manager_get_toplevels(). + + * tests/testmerge.c: Add a "Dump toplevels" button to test + gtk_ui_manager_get_toplevels(). + Wed Jan 7 23:20:06 2004 Matthias Clasen * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 6ecc812a23..fbec286c0a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +Fri Jan 9 00:34:57 2004 Matthias Clasen + + * gtk/gtkuimanager.h: + * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to + obtain a list of toplevel widgets constructed by the ui manager. + + * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that + the values can be combined for gtk_ui_manager_get_toplevels(). + + * tests/testmerge.c: Add a "Dump toplevels" button to test + gtk_ui_manager_get_toplevels(). + Wed Jan 7 23:20:06 2004 Matthias Clasen * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 6ecc812a23..fbec286c0a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +Fri Jan 9 00:34:57 2004 Matthias Clasen + + * gtk/gtkuimanager.h: + * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to + obtain a list of toplevel widgets constructed by the ui manager. + + * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that + the values can be combined for gtk_ui_manager_get_toplevels(). + + * tests/testmerge.c: Add a "Dump toplevels" button to test + gtk_ui_manager_get_toplevels(). + Wed Jan 7 23:20:06 2004 Matthias Clasen * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 6ecc812a23..fbec286c0a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +Fri Jan 9 00:34:57 2004 Matthias Clasen + + * gtk/gtkuimanager.h: + * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to + obtain a list of toplevel widgets constructed by the ui manager. + + * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that + the values can be combined for gtk_ui_manager_get_toplevels(). + + * tests/testmerge.c: Add a "Dump toplevels" button to test + gtk_ui_manager_get_toplevels(). + Wed Jan 7 23:20:06 2004 Matthias Clasen * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 6ecc812a23..fbec286c0a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +Fri Jan 9 00:34:57 2004 Matthias Clasen + + * gtk/gtkuimanager.h: + * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to + obtain a list of toplevel widgets constructed by the ui manager. + + * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that + the values can be combined for gtk_ui_manager_get_toplevels(). + + * tests/testmerge.c: Add a "Dump toplevels" button to test + gtk_ui_manager_get_toplevels(). + Wed Jan 7 23:20:06 2004 Matthias Clasen * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 0337bb7d5f..5ff93a2689 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +Fri Jan 9 00:38:58 2004 Matthias Clasen + + * gtk/gtk-sections.txt: Add gtk_ui_manager_get_toplevels. + Thu Jan 8 00:14:02 2004 Matthias Clasen * gtk/tmpl/gtkmain.sgml (gtk_input_add_full): Fix link in deprecation diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index a5531ebf2b..9747ab463c 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -1951,6 +1951,7 @@ gtk_ui_manager_remove_action_group gtk_ui_manager_get_action_groups gtk_ui_manager_get_accel_group gtk_ui_manager_get_widget +gtk_ui_manager_get_toplevels gtk_ui_manager_get_action gtk_ui_manager_add_ui_from_string gtk_ui_manager_add_ui_from_file diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c index 1178071343..953756e097 100644 --- a/gtk/gtkuimanager.c +++ b/gtk/gtkuimanager.c @@ -558,6 +558,70 @@ gtk_ui_manager_get_widget (GtkUIManager *self, return NODE_INFO (node)->proxy; } +static void +collect_toplevels (GNode *node, + gpointer user_data) +{ + struct { + GtkUIManagerItemType types; + GSList *list; + } *data = user_data; + + switch (NODE_INFO (node)->type) { + case NODE_TYPE_MENUBAR: + if (data->types & GTK_UI_MANAGER_MENUBAR) + data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy); + break; + case NODE_TYPE_TOOLBAR: + if (data->types & GTK_UI_MANAGER_TOOLBAR) + data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy); + break; + case NODE_TYPE_POPUP: + if (data->types & GTK_UI_MANAGER_POPUP) + data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy); + break; + default: ; + } +} + +/** + * gtk_ui_manager_get_toplevels: + * @self: a #GtkUIManager + * @types: specifies the types of toplevel widgets to include. Allowed + * types are #GTK_UI_MANAGER_MENUBAR, #GTK_UI_MANAGER_TOOLBAR and + * #GTK_UI_MANAGER_POPUP. + * + * Obtains a list of all toplevel widgets of the requested types. + * + * Return value: a list of all toplevel widgets of the requested types. + * + * Since: 2.4 + **/ +GSList * +gtk_ui_manager_get_toplevels (GtkUIManager *self, + GtkUIManagerItemType types) +{ + struct { + GtkUIManagerItemType types; + GSList *list; + } data; + + g_return_val_if_fail ((~(GTK_UI_MANAGER_MENUBAR | + GTK_UI_MANAGER_TOOLBAR | + GTK_UI_MANAGER_POPUP) & types) == 0, NULL); + + + data.types = types; + data.list = NULL; + + g_node_children_foreach (self->private_data->root_node, + G_TRAVERSE_ALL, + collect_toplevels, &data); + + return data.list; +} + + /** * gtk_ui_manager_get_action: * @self: a #GtkUIManager @@ -1697,12 +1761,13 @@ static void update_smart_separators (GtkWidget *proxy) { GtkWidget *parent = NULL; - + if (GTK_IS_MENU (proxy) || GTK_IS_TOOLBAR (proxy)) parent = proxy; else if (GTK_IS_MENU_ITEM (proxy) || GTK_IS_TOOL_ITEM (proxy)) parent = gtk_widget_get_parent (proxy); + if (parent) { gboolean visible; diff --git a/gtk/gtkuimanager.h b/gtk/gtkuimanager.h index d6f2c6a6e3..edf043a200 100644 --- a/gtk/gtkuimanager.h +++ b/gtk/gtkuimanager.h @@ -75,16 +75,16 @@ struct _GtkUIManagerClass { }; typedef enum { - GTK_UI_MANAGER_AUTO, - GTK_UI_MANAGER_MENUBAR, - GTK_UI_MANAGER_MENU, - GTK_UI_MANAGER_TOOLBAR, - GTK_UI_MANAGER_PLACEHOLDER, - GTK_UI_MANAGER_POPUP, - GTK_UI_MANAGER_MENUITEM, - GTK_UI_MANAGER_TOOLITEM, - GTK_UI_MANAGER_SEPARATOR, - GTK_UI_MANAGER_ACCELERATOR + GTK_UI_MANAGER_AUTO = 0, + GTK_UI_MANAGER_MENUBAR = 1 << 0, + GTK_UI_MANAGER_MENU = 1 << 1, + GTK_UI_MANAGER_TOOLBAR = 1 << 2, + GTK_UI_MANAGER_PLACEHOLDER = 1 << 3, + GTK_UI_MANAGER_POPUP = 1 << 4, + GTK_UI_MANAGER_MENUITEM = 1 << 5, + GTK_UI_MANAGER_TOOLITEM = 1 << 6, + GTK_UI_MANAGER_SEPARATOR = 1 << 7, + GTK_UI_MANAGER_ACCELERATOR = 1 << 8 } GtkUIManagerItemType; GType gtk_ui_manager_get_type (void); @@ -101,6 +101,8 @@ GList *gtk_ui_manager_get_action_groups (GtkUIManager *self); GtkAccelGroup *gtk_ui_manager_get_accel_group (GtkUIManager *self); GtkWidget *gtk_ui_manager_get_widget (GtkUIManager *self, const gchar *path); +GSList *gtk_ui_manager_get_toplevels (GtkUIManager *self, + GtkUIManagerItemType types); GtkAction *gtk_ui_manager_get_action (GtkUIManager *self, const gchar *path); guint gtk_ui_manager_add_ui_from_string (GtkUIManager *self, diff --git a/tests/testmerge.c b/tests/testmerge.c index 09f190e89b..75d94de5ad 100644 --- a/tests/testmerge.c +++ b/tests/testmerge.c @@ -34,6 +34,27 @@ dump_accels (void) gtk_accel_map_save_fd (STDOUT_FILENO); } +static void +print_toplevel (GtkWidget *widget, gpointer user_data) +{ + g_print ("%s\n", G_OBJECT_TYPE_NAME (widget)); +} + +static void +dump_toplevels (GtkWidget *button, + GtkUIManager *merge) +{ + GSList *toplevels; + + toplevels = gtk_ui_manager_get_toplevels (merge, + GTK_UI_MANAGER_MENUBAR | + GTK_UI_MANAGER_TOOLBAR | + GTK_UI_MANAGER_POPUP); + + g_slist_foreach (toplevels, print_toplevel, NULL); + g_slist_free (toplevels); +} + static void toggle_tearoffs (GtkWidget *button, GtkUIManager *merge) @@ -652,6 +673,10 @@ main (int argc, char **argv) g_signal_connect (button, "clicked", G_CALLBACK (dump_tree), merge); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); + button = gtk_button_new_with_label ("Dump Toplevels"); + g_signal_connect (button, "clicked", G_CALLBACK (dump_toplevels), merge); + gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); + button = gtk_button_new_with_label ("Dump Accels"); g_signal_connect (button, "clicked", G_CALLBACK (dump_accels), NULL); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);