← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~mterry/appmenu-gtk/toggle-state-is-int into lp:appmenu-gtk/trunk

 

Michael Terry has proposed merging lp:~mterry/appmenu-gtk/toggle-state-is-int into lp:appmenu-gtk/trunk.

Requested reviews:
  Canonical Desktop Experience Team (canonical-dx-team)

For more details, see:
https://code.launchpad.net/~mterry/appmenu-gtk/toggle-state-is-int/+merge/47417

TOGGLE_STATE is an int, not a bool.
-- 
https://code.launchpad.net/~mterry/appmenu-gtk/toggle-state-is-int/+merge/47417
Your team ayatana-commits is subscribed to branch lp:appmenu-gtk/trunk.
=== modified file 'src/bridge.c'
--- src/bridge.c	2011-01-21 16:34:43 +0000
+++ src/bridge.c	2011-01-25 16:34:26 +0000
@@ -88,15 +88,8 @@
   gint count;
   gboolean previous;
   DbusmenuMenuitem *stack[30];
-  gboolean          mode[30];
 } RecurseContext;
 
-enum {
-  SEPARATOR_MODE_SMART,
-  SEPARATOR_MODE_VISIBLE,
-  SEPARATOR_MODE_HIDDEN
-};
-
 G_DEFINE_DYNAMIC_TYPE(AppMenuBridge, app_menu_bridge, UBUNTU_TYPE_MENU_PROXY)
 
 static GHashTable *rebuild_ids = NULL;
@@ -480,17 +473,6 @@
   return label;
 }
 
-static const gchar *
-get_menu_label_text (GtkWidget *menuitem)
-{
-  GtkWidget *label = find_menu_label (menuitem);
-
-  if (label)
-    return gtk_label_get_text (GTK_LABEL (label));
-
-  return NULL;
-}
-
 static void
 item_activated (DbusmenuMenuitem *item, guint timestamp, gpointer user_data)
 {
@@ -508,6 +490,26 @@
 }
 
 static gboolean
+item_about_to_show (DbusmenuMenuitem *item, gpointer user_data)
+{
+  GtkWidget *child;
+
+  if (user_data != NULL)
+    {
+      child = (GtkWidget *)user_data;
+
+      if (GTK_IS_MENU_ITEM (child))
+        {
+          // Only called for items with submens.  So we activate it here in
+          // case the program dynamically creates menus (like empathy does)
+          gtk_menu_item_activate (GTK_MENU_ITEM (child));
+        }
+    }
+
+  return TRUE;
+}
+
+static gboolean
 should_show_image (GtkImage *image)
 {
   GtkWidget *item;
@@ -627,6 +629,41 @@
     {
       update_icon_name (child, widget);
     }
+  else if (pspec->name == g_intern_static_string ("parent"))
+    {
+      /*
+        * We probably should have added a 'remove' method to the
+        * UbuntuMenuProxy early on, but it's late in the cycle now.
+        */
+      if (gtk_widget_get_parent (widget) == NULL)
+        {
+          g_signal_handlers_disconnect_by_func (widget,
+                                                G_CALLBACK (widget_notify_cb),
+                                                child);
+
+          DbusmenuMenuitem *parent = g_object_get_data (G_OBJECT (child), "dbusmenu-parent");
+
+          if (DBUSMENU_IS_MENUITEM (parent) && DBUSMENU_IS_MENUITEM (child))
+            {
+              dbusmenu_menuitem_child_delete (parent, child);
+            }
+        }
+    }
+}
+
+static void
+label_notify_cb (GtkWidget  *widget,
+                 GParamSpec *pspec,
+                 gpointer    data)
+{
+  DbusmenuMenuitem *child = (DbusmenuMenuitem *)data;
+
+  if (pspec->name == g_intern_static_string ("label"))
+    {
+      dbusmenu_menuitem_property_set (child,
+                                      DBUSMENU_MENUITEM_PROP_LABEL,
+                                      gtk_label_get_text (GTK_LABEL (widget)));
+    }
 }
 
 static void
@@ -692,9 +729,9 @@
     }
   else 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)));
+      dbusmenu_menuitem_property_set_int (mi,
+                                          DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+                                          gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
     }
   else if (pspec->name == g_intern_static_string ("label"))
     {
@@ -704,56 +741,26 @@
     }
 }
 
-/*
- * We probably should have added a 'remove' method to the UbuntuMenuProxy early on,
- * but it's late in the cycle now.
- */
-static void
-child_notify_cb (GtkWidget        *widget,
-                 GParamSpec       *pspec,
-                 DbusmenuMenuitem *mi)
-{
-  if (pspec->name == g_intern_static_string ("parent"))
-    {
-      if (gtk_widget_get_parent (widget) == NULL)
-        {
-          g_signal_handlers_disconnect_by_func (widget,
-                                                G_CALLBACK (child_notify_cb),
-                                                mi);
-
-          DbusmenuMenuitem *parent = g_object_get_data (G_OBJECT (mi), "dbusmenu-parent");
-
-          if (DBUSMENU_IS_MENUITEM (parent) && DBUSMENU_IS_MENUITEM (mi))
-            {
-              dbusmenu_menuitem_child_delete (parent, mi);
-            }
-        }
-    }
-}
-
 static DbusmenuMenuitem *
-construct_dbusmenu_for_widget (GtkWidget *widget, gboolean previous_separator)
+construct_dbusmenu_for_widget (GtkWidget *widget)
 {
   DbusmenuMenuitem *mi = dbusmenu_menuitem_new ();
 
   if (GTK_IS_MENU_ITEM (widget))
     {
+      gboolean visible = FALSE;
+      gboolean sensitive = FALSE;
       if (GTK_IS_SEPARATOR_MENU_ITEM (widget))
         {
           dbusmenu_menuitem_property_set (mi,
                                           "type",
                                           "separator");
 
-          gint mode = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "gtk-separator-mode"));
-
-          dbusmenu_menuitem_property_set_bool (mi,
-                                               DBUSMENU_MENUITEM_PROP_VISIBLE,
-                                               mode == SEPARATOR_MODE_SMART && !previous_separator);
+          visible = gtk_widget_get_visible (widget);
+          sensitive = gtk_widget_get_sensitive (widget);
         }
       else
         {
-          gboolean visible = FALSE;
-          gboolean sensitive = FALSE;
           gboolean label_set = FALSE;
 
           g_signal_connect (widget,
@@ -805,23 +812,22 @@
                 }
             }
 
+          GtkWidget *label = find_menu_label (widget);
+
           dbusmenu_menuitem_property_set (mi,
                                           "label",
-                                          get_menu_label_text (widget));
+                                          label ? gtk_label_get_text (GTK_LABEL (label)) : NULL);
 
-          if (!g_object_get_data (G_OBJECT (widget), "gtk-empty-menu-item") && !GTK_IS_TEAROFF_MENU_ITEM (widget))
+          if (label)
             {
-              visible = gtk_widget_get_visible (widget);
-              sensitive = gtk_widget_get_sensitive (widget);
+              // Sometimes, an app will directly find and modify the label
+              // (like empathy), so watch the label especially for that.
+              g_signal_connect (G_OBJECT (label),
+                                "notify",
+                                G_CALLBACK (label_notify_cb),
+                                mi);
             }
 
-          dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget));
-
-          g_signal_connect (G_OBJECT (widget),
-                            "notify",
-                            G_CALLBACK (widget_notify_cb),
-                            mi);
-
           if (GTK_IS_ACTIVATABLE (widget))
             {
               GtkActivatable *activatable = GTK_ACTIVATABLE (widget);
@@ -843,23 +849,36 @@
                 }
             }
 
-          dbusmenu_menuitem_property_set_bool (mi,
-                                               DBUSMENU_MENUITEM_PROP_VISIBLE,
-                                               visible);
+          if (!g_object_get_data (G_OBJECT (widget), "gtk-empty-menu-item") && !GTK_IS_TEAROFF_MENU_ITEM (widget))
+            {
+              visible = gtk_widget_get_visible (widget);
+              sensitive = gtk_widget_get_sensitive (widget);
+            }
 
-          dbusmenu_menuitem_property_set_bool (mi,
-                                               DBUSMENU_MENUITEM_PROP_ENABLED,
-                                               sensitive);
+          dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget));
 
           g_signal_connect (G_OBJECT (mi),
                             DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
                             G_CALLBACK (item_activated),
                             widget);
+
+          g_signal_connect (G_OBJECT (mi),
+                            DBUSMENU_MENUITEM_SIGNAL_ABOUT_TO_SHOW,
+                            G_CALLBACK (item_about_to_show),
+                            widget);
         }
 
+      dbusmenu_menuitem_property_set_bool (mi,
+                                           DBUSMENU_MENUITEM_PROP_VISIBLE,
+                                           visible);
+
+      dbusmenu_menuitem_property_set_bool (mi,
+                                           DBUSMENU_MENUITEM_PROP_ENABLED,
+                                           sensitive);
+
       g_signal_connect (widget,
                         "notify",
-                        G_CALLBACK (child_notify_cb),
+                        G_CALLBACK (widget_notify_cb),
                         mi);
     }
 
@@ -873,7 +892,6 @@
   if (GTK_IS_CONTAINER (widget))
     {
       gboolean increment = GTK_IS_MENU_BAR (widget) || GTK_IS_MENU_ITEM (widget);
-      gboolean previous_separator = FALSE;
 
       if (increment)
         recurse->count++;
@@ -904,34 +922,6 @@
 
       if (recurse->count > -1 && increment)
         {
-          /* If this is a separator, find out if we've already displayed a visible separator during
-           * this run.  GtkUIManager internally defines the following separator modes:
-           *
-           * SEPARATOR_MODE_SMART
-           * SEPARATOR_MODE_VISIBLE
-           * SEPARATOR_MODE_HIDDEN
-           *
-           * construct_dbusmenu_for_widget() will mark a smart separator as visible in a run of
-           * separators unless it is following another smart separator anywhere in that run.
-           */
-          if (GTK_IS_SEPARATOR_MENU_ITEM (widget))
-            {
-              if (recurse->stack[recurse->count] != NULL)
-                {
-                  const gchar *type = dbusmenu_menuitem_property_get (recurse->stack[recurse->count],
-                                                                      DBUSMENU_MENUITEM_PROP_TYPE);
-
-                  if (g_strcmp0 (type, "separator") == 0)
-                    {
-                      /* Get the previous separator mode. */
-                      gint mode = recurse->mode[recurse->count];
-
-                      if (mode == SEPARATOR_MODE_SMART)
-                        previous_separator = TRUE;
-                    }
-                }
-            }
-
           DbusmenuMenuitem *dmi = g_hash_table_lookup (recurse->context->lookup, widget);
           if (dmi != NULL)
             {
@@ -942,25 +932,10 @@
             }
           else
             {
-              recurse->stack[recurse->count] = construct_dbusmenu_for_widget (widget, previous_separator);
+              recurse->stack[recurse->count] = construct_dbusmenu_for_widget (widget);
               g_hash_table_insert (recurse->context->lookup, widget, recurse->stack[recurse->count]);
             }
 
-          if (GTK_IS_SEPARATOR_MENU_ITEM (widget))
-            {
-              /* If the previous separator was mode 1, let's pretend that this separator is also mode 1.
-               * That means for the remainder of this run of separators, all will be marked as mode 1.
-               */
-              if (previous_separator)
-                {
-                  recurse->mode[recurse->count] = SEPARATOR_MODE_SMART;
-                }
-              else
-                {
-                  recurse->mode[recurse->count] = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "gtk-separator-mode"));
-                }
-            }
-
           if (!gtk_widget_get_visible (widget))
             {
               g_signal_connect (G_OBJECT (widget),
@@ -1341,7 +1316,7 @@
 
           if (mi != NULL)
             {
-              DbusmenuMenuitem *child_dmi = construct_dbusmenu_for_widget (child, FALSE);
+              DbusmenuMenuitem *child_dmi = construct_dbusmenu_for_widget (child);
 
               g_object_set_data (G_OBJECT (child_dmi), "dbusmenu-parent", mi);
               dbusmenu_menuitem_child_add_position (mi,


Follow ups