← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~chrisccoulson/appmenu-gtk/lp718926 into lp:appmenu-gtk

 

Chris Coulson has proposed merging lp:~chrisccoulson/appmenu-gtk/lp718926 into lp:appmenu-gtk.

Requested reviews:
  Ted Gould (ted)
Related bugs:
  #718926 Some apps don't integrate to appmenu after having their windows closed
  https://bugs.launchpad.net/bugs/718926

For more details, see:
https://code.launchpad.net/~chrisccoulson/appmenu-gtk/lp718926/+merge/51504

Attach to map/unmap signals on toplevel windows, rather than realized/destroyed. This ensures we restore menus for applications which have minimize-to-tray functionality (eg, empathy).

This aligns appmenu-gtk with indicator-appmenu, which destroys menus when a toplevel-window is closed (ie, when an application unmaps its window)
-- 
https://code.launchpad.net/~chrisccoulson/appmenu-gtk/lp718926/+merge/51504
Your team ayatana-commits is subscribed to branch lp:appmenu-gtk.
=== modified file 'src/bridge.c'
--- src/bridge.c	2011-02-11 13:59:10 +0000
+++ src/bridge.c	2011-02-28 09:46:57 +0000
@@ -45,7 +45,7 @@
                                             GtkWidget         *child,
                                             guint              position);
 static gboolean app_menu_bridge_show_local (UbuntuMenuProxy   *proxy);
-static void     toplevel_realized          (GtkWidget         *widget,
+static void     toplevel_mapped            (GtkWidget         *widget,
                                             gpointer           user_data);
 static void     toplevel_notify_cb         (GtkWidget         *widget,
                                             GParamSpec        *pspec,
@@ -205,11 +205,19 @@
 }
 
 static void
-toplevel_destroyed (GtkWidget *widget,
-                    gpointer   user_data)
+toplevel_unmapped (GtkWidget *widget,
+                   gpointer   user_data)
 {
   AppWindowContext *context = (AppWindowContext *)user_data;
 
+  g_signal_handlers_disconnect_by_func(widget,
+                                       G_CALLBACK(toplevel_unmapped),
+                                       user_data);
+
+  g_signal_connect(widget, "map",
+                   G_CALLBACK (toplevel_mapped),
+                   context->bridge);
+
   if (context)
     {
       free_context_contents (context);
@@ -565,12 +573,8 @@
         }
     }
 
-  if (!gtk_widget_get_realized (toplevel))
+  if (!gtk_widget_get_mapped (toplevel))
     {
-      g_signal_connect (toplevel, "realize",
-                        G_CALLBACK (toplevel_realized),
-                        bridge);
-
       return;
     }
 
@@ -608,7 +612,7 @@
       if (context->window != toplevel)
         {
           g_signal_handlers_disconnect_by_func (context->window,
-                                                G_CALLBACK (toplevel_destroyed),
+                                                G_CALLBACK (toplevel_unmapped),
                                                 context);
         }
     }
@@ -618,8 +622,8 @@
       context->window = toplevel;
 
       g_signal_connect (toplevel,
-                        "destroy",
-                        G_CALLBACK (toplevel_destroyed),
+                        "unmap",
+                        G_CALLBACK (toplevel_unmapped),
                         context);
     }
 
@@ -639,11 +643,15 @@
 }
 
 static void
-toplevel_realized (GtkWidget *widget,
-                   gpointer   user_data)
+toplevel_mapped (GtkWidget *widget,
+                 gpointer   user_data)
 {
   AppMenuBridge *bridge = APP_MENU_BRIDGE (user_data);
 
+  g_signal_handlers_disconnect_by_func(widget,
+                                       G_CALLBACK(toplevel_mapped),
+                                       user_data);
+
   if (GTK_IS_WINDOW (widget))
     {
       rebuild (bridge, widget);
@@ -779,14 +787,14 @@
 
   if (GTK_IS_WINDOW (toplevel))
     {
-      if (gtk_widget_get_realized (toplevel))
+      if (gtk_widget_get_mapped (toplevel))
         {
           rebuild (bridge, toplevel);
         }
       else
         {
-          g_signal_connect (toplevel, "realize",
-                            G_CALLBACK (toplevel_realized),
+          g_signal_connect (toplevel, "map",
+                            G_CALLBACK (toplevel_mapped),
                             bridge);
         }
     }


Follow ups