Merge lp:~larsu/indicator-messages/menu-visibility into lp:indicator-messages/14.04

Proposed by Lars Karlitski
Status: Merged
Approved by: Charles Kerr
Approved revision: 408
Merged at revision: 408
Proposed branch: lp:~larsu/indicator-messages/menu-visibility
Merge into: lp:indicator-messages/14.04
Diff against target: 311 lines (+79/-65)
4 files modified
src/im-application-list.c (+17/-16)
src/im-desktop-menu.c (+45/-49)
src/im-menu.c (+14/-0)
src/im-menu.h (+3/-0)
To merge this branch: bzr merge lp:~larsu/indicator-messages/menu-visibility
Reviewer Review Type Date Requested Status
Charles Kerr (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+214501@code.launchpad.net

Commit message

Don't show the messaging menu and the status section when no app is registered for them

Description of the change

Don't show the messaging menu and the status section when no app is registered for them

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Charles Kerr (charlesk) wrote :

LGTM.

Past the actual fix, +1 for the cleanup extract-method on menu_append_status()

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/im-application-list.c'
2--- src/im-application-list.c 2013-10-26 20:58:48 +0000
3+++ src/im-application-list.c 2014-04-07 10:05:20 +0000
4@@ -155,7 +155,7 @@
5 }
6
7 static void
8-im_application_list_update_draws_attention (ImApplicationList *list)
9+im_application_list_update_root_action (ImApplicationList *list)
10 {
11 const gchar *base_icon_name;
12 const gchar *accessible_name;
13@@ -164,6 +164,7 @@
14 GVariant *serialized_icon;
15 GVariantBuilder builder;
16 GVariant *state;
17+ guint n_applications;
18
19 /* Figure out what type of icon we should be drawing */
20 if (g_hash_table_find (list->applications, application_draws_attention, NULL)) {
21@@ -202,10 +203,8 @@
22 g_variant_builder_close(&builder);
23
24 /* visibility */
25- g_variant_builder_open(&builder, G_VARIANT_TYPE_DICT_ENTRY);
26- g_variant_builder_add_value(&builder, g_variant_new_string("visible"));
27- g_variant_builder_add_value(&builder, g_variant_new_variant(g_variant_new_boolean(TRUE)));
28- g_variant_builder_close(&builder);
29+ n_applications = g_hash_table_size (list->applications);
30+ g_variant_builder_add (&builder, "{sv}", "visible", g_variant_new_boolean (n_applications > 0));
31
32 /* Set the state */
33 g_action_group_change_action_state (G_ACTION_GROUP(list->globalactions), "messages", g_variant_builder_end(&builder));
34@@ -294,7 +293,7 @@
35 g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id);
36
37 if (application_update_draws_attention(app))
38- im_application_list_update_draws_attention (app->list);
39+ im_application_list_update_root_action (app->list);
40 }
41
42 static void
43@@ -333,7 +332,7 @@
44 g_action_muxer_remove (app->message_sub_actions, id);
45
46 if (application_update_draws_attention(app))
47- im_application_list_update_draws_attention (app->list);
48+ im_application_list_update_root_action (app->list);
49
50 g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id);
51 }
52@@ -435,7 +434,7 @@
53 g_strfreev (message_actions);
54 }
55
56- im_application_list_update_draws_attention (list);
57+ im_application_list_update_root_action (list);
58 }
59
60 static void
61@@ -601,7 +600,7 @@
62 list->muxer = g_action_muxer_new ();
63 g_action_muxer_insert (list->muxer, NULL, G_ACTION_GROUP (list->globalactions));
64
65- im_application_list_update_draws_attention (list);
66+ im_application_list_update_root_action (list);
67 }
68
69 ImApplicationList *
70@@ -744,6 +743,8 @@
71 g_hash_table_insert (list->applications, (gpointer) app->id, app);
72 g_action_muxer_insert (list->muxer, app->id, G_ACTION_GROUP (app->muxer));
73
74+ im_application_list_update_root_action (list);
75+
76 g_signal_emit (app->list, signals[APP_ADDED], 0, app->id, app->info);
77
78 g_object_unref (launch_action);
79@@ -769,7 +770,7 @@
80 g_hash_table_remove (list->applications, id);
81 g_action_muxer_remove (list->muxer, id);
82
83- im_application_list_update_draws_attention (list);
84+ im_application_list_update_root_action (list);
85 }
86 }
87
88@@ -809,7 +810,7 @@
89 if (visible && draws_attention && app->draws_attention == FALSE)
90 {
91 app->draws_attention = TRUE;
92- im_application_list_update_draws_attention (app->list);
93+ im_application_list_update_root_action (app->list);
94 }
95
96 g_object_unref (action);
97@@ -846,7 +847,7 @@
98 g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, serialized_icon, visible);
99
100 if (application_update_draws_attention (app))
101- im_application_list_update_draws_attention (app->list);
102+ im_application_list_update_root_action (app->list);
103
104 if (serialized_icon)
105 g_variant_unref (serialized_icon);
106@@ -1010,7 +1011,7 @@
107 if (draws_attention && !app->draws_attention)
108 {
109 app->draws_attention = TRUE;
110- im_application_list_update_draws_attention (app->list);
111+ im_application_list_update_root_action (app->list);
112 }
113
114 app_icon = get_symbolic_app_icon (G_APP_INFO (app->info));
115@@ -1084,7 +1085,7 @@
116 g_action_muxer_insert (app->muxer, "msg-actions", G_ACTION_GROUP (app->message_sub_actions));
117
118 app->draws_attention = FALSE;
119- im_application_list_update_draws_attention (app->list);
120+ im_application_list_update_root_action (app->list);
121
122 g_action_group_change_action_state (G_ACTION_GROUP (app->muxer), "launch", g_variant_new_boolean (FALSE));
123
124@@ -1229,7 +1230,7 @@
125
126 g_signal_emit (list, signals[STATUS_SET], 0, status);
127
128- im_application_list_update_draws_attention(list);
129+ im_application_list_update_root_action(list);
130
131 return;
132 }
133@@ -1276,7 +1277,7 @@
134
135 g_simple_action_set_state(list->statusaction, g_variant_new_string(status_ids[final_status]));
136
137- im_application_list_update_draws_attention(list);
138+ im_application_list_update_root_action(list);
139
140 return;
141 }
142
143=== modified file 'src/im-desktop-menu.c'
144--- src/im-desktop-menu.c 2014-03-20 13:28:17 +0000
145+++ src/im-desktop-menu.c 2014-04-07 10:05:20 +0000
146@@ -27,12 +27,54 @@
147 {
148 ImMenu parent;
149
150+ gboolean status_section_visible;
151 GHashTable *source_sections;
152 };
153
154 G_DEFINE_TYPE (ImDesktopMenu, im_desktop_menu, IM_TYPE_MENU);
155
156 static void
157+menu_append_status (GMenu *menu,
158+ const gchar *label,
159+ const gchar *detailed_action,
160+ const gchar *icon_name)
161+{
162+ GMenuItem *item;
163+ GIcon *icon;
164+
165+ icon = g_themed_icon_new (icon_name);
166+
167+ item = g_menu_item_new (label, detailed_action);
168+ g_menu_item_set_icon (item, icon);
169+ g_menu_append_item (menu, item);
170+
171+ g_object_unref (icon);
172+ g_object_unref (item);
173+}
174+
175+static void
176+im_desktop_menu_show_chat_section (ImDesktopMenu *menu)
177+{
178+ GMenu *status_section;
179+
180+ if (menu->status_section_visible)
181+ return;
182+
183+ status_section = g_menu_new ();
184+
185+ menu_append_status (status_section, _("Available"), "indicator.status::available", "user-available");
186+ menu_append_status (status_section, _("Away"), "indicator.status::away", "user-away");
187+ menu_append_status (status_section, _("Busy"), "indicator.status::busy", "user-busy");
188+ menu_append_status (status_section, _("Invisible"), "indicator.status::invisible", "user-invisible");
189+ menu_append_status (status_section, _("Offline"), "indicator.status::offline", "user-offline");
190+
191+ im_menu_prepend_section (IM_MENU (menu), G_MENU_MODEL (status_section));
192+ menu->status_section_visible = TRUE;
193+
194+ g_object_unref (status_section);
195+}
196+
197+static void
198 im_desktop_menu_app_added (ImApplicationList *applist,
199 const gchar *app_id,
200 GDesktopAppInfo *app_info,
201@@ -94,6 +136,9 @@
202 g_clear_object(&shortcuts);
203 }
204
205+ if (g_desktop_app_info_get_boolean (app_info, "X-MessagingMenu-UsesChatSection"))
206+ im_desktop_menu_show_chat_section (menu);
207+
208 source_section = g_menu_new ();
209
210 section = g_menu_new ();
211@@ -261,46 +306,6 @@
212 g_menu_remove (section, 0);
213 }
214
215-static GMenu *
216-create_status_section (void)
217-{
218- GMenu *menu;
219- GMenuItem *item;
220- struct status_item {
221- gchar *label;
222- gchar *action;
223- gchar *icon_name;
224- } status_items[] = {
225- { _("Available"), "indicator.status::available", "user-available" },
226- { _("Away"), "indicator.status::away", "user-away" },
227- { _("Busy"), "indicator.status::busy", "user-busy" },
228- { _("Invisible"), "indicator.status::invisible", "user-invisible" },
229- { _("Offline"), "indicator.status::offline", "user-offline" }
230- };
231- int i;
232-
233- menu = g_menu_new ();
234-
235- item = g_menu_item_new (NULL, NULL);
236-
237- for (i = 0; i < G_N_ELEMENTS (status_items); i++) {
238- GIcon *icon;
239-
240- g_menu_item_set_label (item, status_items[i].label);
241- g_menu_item_set_detailed_action (item, status_items[i].action);
242-
243- icon = g_themed_icon_new (status_items[i].icon_name);
244- g_menu_item_set_icon (item, icon);
245-
246- g_menu_append_item (menu, item);
247-
248- g_object_unref (icon);
249- }
250-
251- g_object_unref (item);
252- return menu;
253-}
254-
255 static void
256 im_desktop_menu_constructed (GObject *object)
257 {
258@@ -308,15 +313,6 @@
259 ImApplicationList *applist;
260
261 {
262- GMenu *status_section;
263-
264- status_section = create_status_section();
265- im_menu_append_section (IM_MENU (menu), G_MENU_MODEL (status_section));
266-
267- g_object_unref (status_section);
268- }
269-
270- {
271 GMenu *clear_section;
272
273 clear_section = g_menu_new ();
274
275=== modified file 'src/im-menu.c'
276--- src/im-menu.c 2013-11-19 10:37:14 +0000
277+++ src/im-menu.c 2014-04-07 10:05:20 +0000
278@@ -149,6 +149,20 @@
279 }
280
281 void
282+im_menu_prepend_section (ImMenu *menu,
283+ GMenuModel *section)
284+{
285+ ImMenuPrivate *priv;
286+
287+ g_return_if_fail (IM_IS_MENU (menu));
288+ g_return_if_fail (G_IS_MENU_MODEL (section));
289+
290+ priv = im_menu_get_instance_private (menu);
291+
292+ g_menu_prepend_section (priv->menu, NULL, section);
293+}
294+
295+void
296 im_menu_append_section (ImMenu *menu,
297 GMenuModel *section)
298 {
299
300=== modified file 'src/im-menu.h'
301--- src/im-menu.h 2013-08-21 02:03:18 +0000
302+++ src/im-menu.h 2014-04-07 10:05:20 +0000
303@@ -53,6 +53,9 @@
304 const gchar *object_path,
305 GError **error);
306
307+void im_menu_prepend_section (ImMenu *menu,
308+ GMenuModel *section);
309+
310 void im_menu_append_section (ImMenu *menu,
311 GMenuModel *section);
312

Subscribers

People subscribed via source and target branches