]> Pileus Git - ~andy/gtk/blobdiff - tests/testmerge.c
GtkToolPalette: Change gtk_tool_palette_get_drop_group() return.
[~andy/gtk] / tests / testmerge.c
index d74ed6fd7fa1920a210ab59be3bce5007b4d1e24..a9b1222d25897b205e69753359c9fca38f9e9ec5 100644 (file)
@@ -1,8 +1,35 @@
+/* testmerge.c
+ * Copyright (C) 2003 James Henstridge
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <gtk/gtk.h>
 
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1 
+#endif
+
 struct { const gchar *filename; guint merge_id; } merge_ids[] = {
   { "merge-1.ui", 0 },
   { "merge-2.ui", 0 },
@@ -16,7 +43,7 @@ dump_tree (GtkWidget    *button,
   gchar *dump;
 
   dump = gtk_ui_manager_get_ui (merge);
-  g_message (dump);
+  g_message ("%s", dump);
   g_free (dump);
 }
 
@@ -26,6 +53,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, (GFunc) print_toplevel, NULL);
+  g_slist_free (toplevels);
+}
+
 static void
 toggle_tearoffs (GtkWidget    *button, 
                 GtkUIManager *merge)
@@ -37,9 +85,8 @@ toggle_tearoffs (GtkWidget    *button,
   gtk_ui_manager_set_add_tearoffs (merge, !add_tearoffs);
 }
 
-static void
-toggle_dynamic (GtkWidget    *button, 
-               GtkUIManager *merge)
+static gint
+delayed_toggle_dynamic (GtkUIManager *merge)
 {
   GtkAction *dyn;
   static GtkActionGroup *dynamic = NULL;
@@ -77,16 +124,24 @@ toggle_dynamic (GtkWidget    *button,
                             "dyn1menu", "dyn1", GTK_UI_MANAGER_MENU, 0);
       gtk_ui_manager_add_ui (merge, merge_id, "/menubar/EditMenu/dyn1menu", 
                             "dyn1", "dyn1", GTK_UI_MANAGER_MENUITEM, 0);
-      gtk_ui_manager_add_ui (merge, merge_id, "/menubar/EditMenu/dyn1menu", 
-                            "dyn2", "dyn2", GTK_UI_MANAGER_AUTO, TRUE);
+      gtk_ui_manager_add_ui (merge, merge_id, "/menubar/EditMenu/dyn1menu/dyn1", 
+                            "dyn2", "dyn2", GTK_UI_MANAGER_AUTO, FALSE);
     }
   else 
     {
       gtk_ui_manager_remove_ui (merge, merge_id);
       merge_id = 0;
     }
+
+  return FALSE;
 }
 
+static void
+toggle_dynamic (GtkWidget    *button, 
+               GtkUIManager *merge)
+{
+  gdk_threads_add_timeout (2000, (GSourceFunc)delayed_toggle_dynamic, merge);
+}
 
 static void
 activate_action (GtkAction *action)
@@ -123,12 +178,14 @@ static GtkActionEntry entries[] = {
   { "EditMenuAction", NULL, "_Edit" },
   { "HelpMenuAction", NULL, "_Help" },
   { "JustifyMenuAction", NULL, "_Justify" },
+  { "EmptyMenu1Action", NULL, "Empty 1" },
+  { "EmptyMenu2Action", NULL, "Empty 2" },
   { "Test", NULL, "Test" },
 
   { "QuitAction",  GTK_STOCK_QUIT,  NULL,     "<control>q", "Quit", G_CALLBACK (gtk_main_quit) },
   { "NewAction",   GTK_STOCK_NEW,   NULL,     "<control>n", "Create something", G_CALLBACK (activate_action) },
   { "New2Action",  GTK_STOCK_NEW,   NULL,     "<control>m", "Create something else", G_CALLBACK (activate_action) },
-  { "OpenAction",  GTK_STOCK_OPEN,  NULL,     "<control>o", "Open it", G_CALLBACK (activate_action) },
+  { "OpenAction",  GTK_STOCK_OPEN,  NULL,     NULL,         "Open it", G_CALLBACK (activate_action) },
   { "CutAction",   GTK_STOCK_CUT,   NULL,     "<control>x", "Knive", G_CALLBACK (activate_action) },
   { "CopyAction",  GTK_STOCK_COPY,  NULL,     "<control>c", "Copy", G_CALLBACK (activate_action) },
   { "PasteAction", GTK_STOCK_PASTE, NULL,     "<control>v", "Paste", G_CALLBACK (activate_action) },
@@ -207,7 +264,7 @@ toggle_merge (GtkWidget    *button,
                                           "could not merge %s: %s", merge_ids[mergenum].filename,
                                           err->message);
 
-         g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (gtk_object_destroy), NULL);
+         g_signal_connect (dialog, "response", G_CALLBACK (gtk_object_destroy), NULL);
          gtk_widget_show (dialog);
 
          g_clear_error (&err);
@@ -232,8 +289,8 @@ set_name_func (GtkTreeViewColumn *tree_column,
   char *name;
   
   gtk_tree_model_get (tree_model, iter, 0, &action, -1);
-  g_object_get (G_OBJECT (action), "name", &name, NULL);
-  g_object_set (G_OBJECT (cell), "text", name, NULL);
+  g_object_get (action, "name", &name, NULL);
+  g_object_set (cell, "text", name, NULL);
   g_free (name);
   g_object_unref (action);
 }
@@ -249,8 +306,8 @@ set_sensitive_func (GtkTreeViewColumn *tree_column,
   gboolean sensitive;
   
   gtk_tree_model_get (tree_model, iter, 0, &action, -1);
-  g_object_get (G_OBJECT (action), "sensitive", &sensitive, NULL);
-  g_object_set (G_OBJECT (cell), "active", sensitive, NULL);
+  g_object_get (action, "sensitive", &sensitive, NULL);
+  g_object_set (cell, "active", sensitive, NULL);
   g_object_unref (action);
 }
 
@@ -266,8 +323,8 @@ set_visible_func (GtkTreeViewColumn *tree_column,
   gboolean visible;
   
   gtk_tree_model_get (tree_model, iter, 0, &action, -1);
-  g_object_get (G_OBJECT (action), "visible", &visible, NULL);
-  g_object_set (G_OBJECT (cell), "active", visible, NULL);
+  g_object_get (action, "visible", &visible, NULL);
+  g_object_set (cell, "active", visible, NULL);
   g_object_unref (action);
 }
 
@@ -285,8 +342,8 @@ sensitivity_toggled (GtkCellRendererToggle *cell,
   gtk_tree_model_get_iter (model, &iter, path);
 
   gtk_tree_model_get (model, &iter, 0, &action, -1);
-  g_object_get (G_OBJECT (action), "sensitive", &sensitive, NULL);
-  g_object_set (G_OBJECT (action), "sensitive", !sensitive, NULL);
+  g_object_get (action, "sensitive", &sensitive, NULL);
+  g_object_set (action, "sensitive", !sensitive, NULL);
   gtk_tree_model_row_changed (model, path, &iter);
   gtk_tree_path_free (path);
 }
@@ -305,8 +362,8 @@ visibility_toggled (GtkCellRendererToggle *cell,
   gtk_tree_model_get_iter (model, &iter, path);
 
   gtk_tree_model_get (model, &iter, 0, &action, -1);
-  g_object_get (G_OBJECT (action), "visible", &visible, NULL);
-  g_object_set (G_OBJECT (action), "visible", !visible, NULL);
+  g_object_get (action, "visible", &visible, NULL);
+  g_object_set (action, "visible", !visible, NULL);
   gtk_tree_model_row_changed (model, path, &iter);
   gtk_tree_path_free (path);
 }
@@ -371,6 +428,8 @@ create_tree_view (GtkUIManager *merge)
          gtk_list_store_append (store, &iter);
          gtk_list_store_set (store, &iter, 0, l->data, -1);
        }
+
+      g_list_free (actions);
     }
   
   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
@@ -470,7 +529,7 @@ set_tip (GtkWidget *widget)
   
   if (data) 
     {
-      g_object_get (G_OBJECT (data->action), "tooltip", &tooltip, NULL);
+      g_object_get (data->action, "tooltip", &tooltip, NULL);
       
       gtk_statusbar_push (GTK_STATUSBAR (data->statusbar), 0, 
                          tooltip ? tooltip : "");
@@ -491,7 +550,8 @@ unset_tip (GtkWidget *widget)
 }
                    
 static void
-connect_proxy (GtkAction    *action,
+connect_proxy (GtkUIManager *merge,
+              GtkAction    *action,
               GtkWidget    *proxy,
               GtkWidget    *statusbar)
 {
@@ -518,8 +578,8 @@ connect_proxy (GtkAction    *action,
          g_object_set_data_full (G_OBJECT (proxy), "action-status", 
                                  data, action_status_destroy);
          
-         g_signal_connect (proxy, "select",  G_CALLBACK (set_tip), 0);
-         g_signal_connect (proxy, "deselect", G_CALLBACK (unset_tip), 0);
+         g_signal_connect (proxy, "select",  G_CALLBACK (set_tip), NULL);
+         g_signal_connect (proxy, "deselect", G_CALLBACK (unset_tip), NULL);
        }
     }
 }
@@ -529,7 +589,6 @@ main (int argc, char **argv)
 {
   GtkActionGroup *action_group;
   GtkAction *action;
-  GList *tmp;
   GtkUIManager *merge;
   GtkWidget *window, *table, *frame, *menu_box, *vbox, *view;
   GtkWidget *button, *area, *statusbar;
@@ -541,6 +600,10 @@ main (int argc, char **argv)
   gtk_action_group_add_actions (action_group, 
                                entries, n_entries, 
                                NULL);
+  action = gtk_action_group_get_action (action_group, "EmptyMenu1Action");
+  g_object_set (action, "hide_if_empty", FALSE, NULL);
+  action = gtk_action_group_get_action (action_group, "EmptyMenu2Action");
+  g_object_set (action, "hide_if_empty", TRUE, NULL);
   gtk_action_group_add_toggle_actions (action_group, 
                                       toggle_entries, n_toggle_entries, 
                                       NULL);
@@ -578,25 +641,20 @@ main (int argc, char **argv)
 
   button = gtk_button_new ();
   gtk_box_pack_end (GTK_BOX (menu_box), button, FALSE, FALSE, 0);
-  gtk_action_connect_proxy (gtk_action_group_get_action (action_group, "AboutAction"), 
-                           button);
+  gtk_activatable_set_related_action (GTK_ACTIVATABLE (button),
+                           gtk_action_group_get_action (action_group, "AboutAction"));
+
   gtk_widget_show (button);
 
   button = gtk_check_button_new ();
   gtk_box_pack_end (GTK_BOX (menu_box), button, FALSE, FALSE, 0);
-  gtk_action_connect_proxy (gtk_action_group_get_action (action_group, "BoldAction"), 
-                           button);
+  gtk_activatable_set_related_action (GTK_ACTIVATABLE (button),
+                           gtk_action_group_get_action (action_group, "BoldAction"));
   gtk_widget_show (button);
 
-  for (tmp = gtk_action_group_list_actions (action_group);
-       tmp != NULL;
-       tmp = tmp->next)
-    {
-      action = tmp->data;
-      g_signal_connect (action, "connect-proxy", 
-                       G_CALLBACK (connect_proxy), statusbar);
-    }
   merge = gtk_ui_manager_new ();
+
+  g_signal_connect (merge, "connect-proxy", G_CALLBACK (connect_proxy), statusbar);
   g_signal_connect (area, "button_press_event", G_CALLBACK (area_press), merge);
 
   gtk_ui_manager_insert_action_group (merge, action_group, 0);
@@ -638,6 +696,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);
@@ -649,8 +711,41 @@ main (int argc, char **argv)
   gtk_widget_show_all (window);
   gtk_main ();
 
-  g_object_unref (action_group);
+#ifdef DEBUG_UI_MANAGER
+  {
+    GList *action;
+    
+    g_print ("\n> before unreffing the ui manager <\n");
+    for (action = gtk_action_group_list_actions (action_group);
+        action; 
+        action = action->next)
+      {
+       GtkAction *a = action->data;
+       g_print ("  action %s ref count %d\n", 
+                gtk_action_get_name (a), G_OBJECT (a)->ref_count);
+      }
+  }
+#endif
+
   g_object_unref (merge);
 
+#ifdef DEBUG_UI_MANAGER
+  {
+    GList *action;
+
+    g_print ("\n> after unreffing the ui manager <\n");
+    for (action = gtk_action_group_list_actions (action_group);
+        action; 
+        action = action->next)
+      {
+       GtkAction *a = action->data;
+       g_print ("  action %s ref count %d\n", 
+                gtk_action_get_name (a), G_OBJECT (a)->ref_count);
+      }
+  }
+#endif
+
+  g_object_unref (action_group);
+
   return 0;
 }