← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~bratsche/appmenu-gtk/timer-per-toplevel into lp:appmenu-gtk

 

Cody Russell has proposed merging lp:~bratsche/appmenu-gtk/timer-per-toplevel into lp:appmenu-gtk.

Requested reviews:
  Canonical Desktop Experience Team (canonical-dx-team)
Related bugs:
  #592848 Tabs menu in gnome-terminal does not display correctly
  https://bugs.launchpad.net/bugs/592848

-- 
https://code.launchpad.net/~bratsche/appmenu-gtk/timer-per-toplevel/+merge/29050
Your team ayatana-commits is subscribed to branch lp:appmenu-gtk.
=== modified file 'src/bridge.c'
--- src/bridge.c	2010-06-29 16:08:41 +0000
+++ src/bridge.c	2010-07-02 05:01:23 +0000
@@ -96,7 +96,7 @@
 
 G_DEFINE_DYNAMIC_TYPE(AppMenuBridge, app_menu_bridge, UBUNTU_TYPE_MENU_PROXY)
 
-static guint rebuild_id = 0;
+static GHashTable *rebuild_ids = NULL;
 
 static void
 app_menu_bridge_setup_proxy (AppMenuBridge *bridge)
@@ -447,6 +447,27 @@
   dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget));
 }
 
+static void
+action_notify_cb (GtkAction  *action,
+                  GParamSpec *pspec,
+                  gpointer    data)
+{
+  DbusmenuMenuitem *mi = (DbusmenuMenuitem *)data;
+
+  if (pspec->name == g_intern_static_string ("active"))
+    {
+      dbusmenu_menuitem_property_set_bool (mi,
+                                           DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+                                           gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+    }
+  else if (pspec->name == g_intern_static_string ("label"))
+    {
+      dbusmenu_menuitem_property_set (mi,
+                                      DBUSMENU_MENUITEM_PROP_LABEL,
+                                      gtk_action_get_label (action));
+    }
+}
+
 static DbusmenuMenuitem *
 construct_dbusmenu_for_widget (GtkWidget *widget)
 {
@@ -502,8 +523,26 @@
                             G_CALLBACK (widget_notify_cb),
                             mi);
 
+          if (GTK_IS_ACTIVATABLE (widget))
+            {
+              GtkActivatable *activatable = GTK_ACTIVATABLE (widget);
+
+              if (gtk_activatable_get_use_action_appearance (activatable))
+                {
+                  GtkAction *action = gtk_activatable_get_related_action (activatable);
+
+                  if (action)
+                    {
+                      g_signal_connect_object (action, "notify",
+                                               G_CALLBACK (action_notify_cb),
+                                               mi,
+                                               G_CONNECT_AFTER);
+                    }
+                }
+            }
+
           g_signal_connect (G_OBJECT (mi),
-                            "item_activated",
+                            DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
                             G_CALLBACK (item_activated),
                             widget);
         }
@@ -599,6 +638,13 @@
 {
   rebuild_window_items (data->bridge,
                         data->widget);
+
+  g_hash_table_remove (rebuild_ids, data->widget);
+  if (g_hash_table_size (rebuild_ids) == 0)
+    {
+      g_hash_table_destroy (rebuild_ids);
+    }
+
   g_free (data);
 
   return FALSE;
@@ -608,19 +654,34 @@
 rebuild (AppMenuBridge *bridge,
          GtkWidget     *toplevel)
 {
-  if (rebuild_id > 0)
+  guint id = 0;
+
+  if (rebuild_ids != NULL)
     {
-      g_source_remove (rebuild_id);
-      rebuild_id = 0;
+      id = GPOINTER_TO_UINT (g_hash_table_lookup (rebuild_ids, toplevel));
+
+      if (id > 0)
+        {
+          g_source_remove (id);
+          g_hash_table_remove (rebuild_ids, toplevel);
+          id = 0;
+        }
     }
 
   RebuildData *data = g_new0 (RebuildData, 1);
   data->bridge = bridge;
   data->widget = toplevel;
 
-  rebuild_id = g_timeout_add (500,
-                              (GSourceFunc)do_rebuild,
-                              data);
+  id = g_timeout_add (500,
+                      (GSourceFunc)do_rebuild,
+                      data);
+
+  if (rebuild_ids == NULL)
+    {
+      rebuild_ids = g_hash_table_new (g_direct_hash, g_direct_equal);
+    }
+
+  g_hash_table_insert (rebuild_ids, GUINT_TO_POINTER (id), toplevel);
 }
 
 static void
@@ -774,9 +835,6 @@
   GtkWidget            *toplevel = NULL;
   gboolean              append = FALSE;
 
-  if (GTK_IS_TEAROFF_MENU_ITEM (child))
-    return;
-
   bridge = APP_MENU_BRIDGE (proxy);
   priv = bridge->priv;
 
@@ -821,9 +879,16 @@
 
   if (GTK_IS_WINDOW (toplevel))
     {
-      g_signal_connect (toplevel, "realize",
-                        G_CALLBACK (toplevel_realized),
-                        bridge);
+      if (!gtk_widget_get_realized (toplevel))
+        {
+          g_signal_connect (toplevel, "realize",
+                            G_CALLBACK (toplevel_realized),
+                            bridge);
+        }
+      else
+        {
+          rebuild (bridge, toplevel);
+        }
     }
 }