Merge lp:~chrisccoulson/appmenu-gtk/lp718926 into lp:appmenu-gtk/0.4

Proposed by Chris Coulson
Status: Merged
Approved by: Ted Gould
Approved revision: 120
Merged at revision: 122
Proposed branch: lp:~chrisccoulson/appmenu-gtk/lp718926
Merge into: lp:appmenu-gtk/0.4
Diff against target: 109 lines (+25/-16)
1 file modified
src/bridge.c (+25/-16)
To merge this branch: bzr merge lp:~chrisccoulson/appmenu-gtk/lp718926
Reviewer Review Type Date Requested Status
Ted Gould (community) Approve
Michael Terry Approve
Review via email: mp+51504@code.launchpad.net

Description of the change

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)

To post a comment you must log in.
Revision history for this message
Michael Terry (mterry) wrote :

Looks reasonable to me.

review: Approve
Revision history for this message
Michael Terry (mterry) wrote :

Hrm, this causes bug 727843. Looking into it.

Revision history for this message
Ted Gould (ted) wrote :

Marking as "Work in Progress" while mterry investigates.

Revision history for this message
Michael Terry (mterry) wrote :
120. By Chris Coulson

Merge from lp:~mterry/appmenu-gtk/lp718926

Revision history for this message
Ted Gould (ted) wrote :

Approving with mterry's fix.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/bridge.c'
2--- src/bridge.c 2011-03-02 18:25:44 +0000
3+++ src/bridge.c 2011-03-03 16:04:11 +0000
4@@ -47,7 +47,7 @@
5 GtkWidget *child,
6 guint position);
7 static gboolean app_menu_bridge_show_local (UbuntuMenuProxy *proxy);
8-static void toplevel_realized (GtkWidget *widget,
9+static void toplevel_mapped (GtkWidget *widget,
10 gpointer user_data);
11 static void mnemonic_shown_cb (GtkWidget *widget,
12 GParamSpec *pspec,
13@@ -214,11 +214,15 @@
14 }
15
16 static void
17-toplevel_destroyed (GtkWidget *widget,
18- gpointer user_data)
19+toplevel_unmapped (GtkWidget *widget,
20+ gpointer user_data)
21 {
22 AppWindowContext *context = (AppWindowContext *)user_data;
23
24+ g_signal_handlers_disconnect_by_func(widget,
25+ G_CALLBACK(toplevel_unmapped),
26+ user_data);
27+
28 if (context)
29 {
30 free_context_contents (context);
31@@ -577,6 +581,15 @@
32 XID xid;
33 AppWindowContext *context = NULL;
34
35+ /* Disconnect any "map" signal and reconnect, which guarantees that there is
36+ at least one and at most one listener */
37+ g_signal_handlers_disconnect_by_func(toplevel,
38+ G_CALLBACK(toplevel_mapped),
39+ bridge);
40+ g_signal_connect (toplevel, "map",
41+ G_CALLBACK (toplevel_mapped),
42+ bridge);
43+
44 if (!GTK_IS_WINDOW (toplevel))
45 {
46 g_signal_connect (G_OBJECT (toplevel),
47@@ -602,12 +615,8 @@
48 }
49 }
50
51- if (!gtk_widget_get_realized (toplevel))
52+ if (!gtk_widget_get_mapped (toplevel))
53 {
54- g_signal_connect (toplevel, "realize",
55- G_CALLBACK (toplevel_realized),
56- bridge);
57-
58 return;
59 }
60
61@@ -645,7 +654,7 @@
62 if (context->window != toplevel)
63 {
64 g_signal_handlers_disconnect_by_func (context->window,
65- G_CALLBACK (toplevel_destroyed),
66+ G_CALLBACK (toplevel_unmapped),
67 context);
68 }
69 }
70@@ -661,8 +670,8 @@
71
72 g_object_add_weak_pointer(G_OBJECT(context->window), (gpointer *)&(context->window));
73 g_signal_connect (toplevel,
74- "destroy",
75- G_CALLBACK (toplevel_destroyed),
76+ "unmap",
77+ G_CALLBACK (toplevel_unmapped),
78 context);
79 }
80
81@@ -695,8 +704,8 @@
82 }
83
84 static void
85-toplevel_realized (GtkWidget *widget,
86- gpointer user_data)
87+toplevel_mapped (GtkWidget *widget,
88+ gpointer user_data)
89 {
90 AppMenuBridge *bridge = APP_MENU_BRIDGE (user_data);
91
92@@ -835,14 +844,14 @@
93
94 if (GTK_IS_WINDOW (toplevel))
95 {
96- if (gtk_widget_get_realized (toplevel))
97+ if (gtk_widget_get_mapped (toplevel))
98 {
99 rebuild (bridge, toplevel);
100 }
101 else
102 {
103- g_signal_connect (toplevel, "realize",
104- G_CALLBACK (toplevel_realized),
105+ g_signal_connect (toplevel, "map",
106+ G_CALLBACK (toplevel_mapped),
107 bridge);
108 }
109 }

Subscribers

People subscribed via source and target branches