Merge lp:~larsu/indicator-messages/lp1386584 into lp:indicator-messages/15.04
- lp1386584
- Merge into trunk.15.04
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Ted Gould | ||||
Approved revision: | 429 | ||||
Merged at revision: | 433 | ||||
Proposed branch: | lp:~larsu/indicator-messages/lp1386584 | ||||
Merge into: | lp:indicator-messages/15.04 | ||||
Diff against target: |
315 lines (+113/-23) 1 file modified
src/im-application-list.c (+113/-23) |
||||
To merge this branch: | bzr merge lp:~larsu/indicator-messages/lp1386584 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ted Gould (community) | Approve | ||
Sebastien Bacher | Approve | ||
PS Jenkins bot (community) | continuous-integration | Approve | |
Review via email: mp+240773@code.launchpad.net |
Commit message
Escape message and source ids when using them as action names
Description of the change
Escape message and source ids when using them as action names
PS Jenkins bot (ps-jenkins) wrote : | # |
Sebastien Bacher (seb128) wrote : | # |
I didn't review the code but just gave it a round of testing and I can confirm indicator-messages is still working and it's not segfaulting anymore, good job ;-)
Sebastien Bacher (seb128) wrote : | # |
There is no segfault but the notifications fail to clear when you view the messages (it's doing it at least for xchat-gnome and tb, if you get some ping/emails, and go read them, the counter in the launcher is cleared but the envelop stay on blue and the corresponding line is not cleared)
- 429. By Lars Karlitski
-
Also escape message and source ids when removing them from the app
The last commit missed these two places.
Lars Karlitski (larsu) wrote : | # |
You're right. I missed two instances of escaping. Thanks for testing!
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:429
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
Sebastien Bacher (seb128) wrote : | # |
The new version works fine, it resolve the segfault issue as well.
Ted/Charles, could you do a code review for it?
Ted Gould (ted) : | # |
Preview Diff
1 | === modified file 'src/im-application-list.c' | |||
2 | --- src/im-application-list.c 2014-10-10 15:22:50 +0000 | |||
3 | +++ src/im-application-list.c 2014-11-07 11:43:25 +0000 | |||
4 | @@ -134,6 +134,62 @@ | |||
5 | 134 | return retval; | 134 | return retval; |
6 | 135 | } | 135 | } |
7 | 136 | 136 | ||
8 | 137 | static gchar * | ||
9 | 138 | escape_action_name (const gchar *name) | ||
10 | 139 | { | ||
11 | 140 | static const gchar *xdigits = "0123456789abcdef"; | ||
12 | 141 | GString *escaped; | ||
13 | 142 | gchar c; | ||
14 | 143 | |||
15 | 144 | g_return_val_if_fail (name != NULL, NULL); | ||
16 | 145 | |||
17 | 146 | escaped = g_string_new (NULL); | ||
18 | 147 | while ((c = *name++)) | ||
19 | 148 | { | ||
20 | 149 | if (g_ascii_isalnum (c) || c == '.') | ||
21 | 150 | { | ||
22 | 151 | g_string_append_c (escaped, c); | ||
23 | 152 | } | ||
24 | 153 | else | ||
25 | 154 | { | ||
26 | 155 | g_string_append_c (escaped, '-'); | ||
27 | 156 | g_string_append_c (escaped, xdigits[c >> 4]); | ||
28 | 157 | g_string_append_c (escaped, xdigits[c & 0xf]); | ||
29 | 158 | } | ||
30 | 159 | } | ||
31 | 160 | |||
32 | 161 | return g_string_free (escaped, FALSE); | ||
33 | 162 | } | ||
34 | 163 | |||
35 | 164 | static gchar * | ||
36 | 165 | unescape_action_name (const gchar *name) | ||
37 | 166 | { | ||
38 | 167 | GString *unescaped; | ||
39 | 168 | gint i; | ||
40 | 169 | |||
41 | 170 | g_return_val_if_fail (name != NULL, NULL); | ||
42 | 171 | |||
43 | 172 | unescaped = g_string_new (NULL); | ||
44 | 173 | for (i = 0; name[i]; i++) | ||
45 | 174 | { | ||
46 | 175 | gint one, two; | ||
47 | 176 | |||
48 | 177 | if (name[i] == '-' && | ||
49 | 178 | (one = g_ascii_xdigit_value (name[i + 1])) >= 0 && | ||
50 | 179 | (two = g_ascii_xdigit_value (name[i + 2])) >= 0) | ||
51 | 180 | { | ||
52 | 181 | g_string_append_c (unescaped, (one << 4) & two); | ||
53 | 182 | i += 2; | ||
54 | 183 | } | ||
55 | 184 | else | ||
56 | 185 | { | ||
57 | 186 | g_string_append_c (unescaped, name[i]); | ||
58 | 187 | } | ||
59 | 188 | } | ||
60 | 189 | |||
61 | 190 | return g_string_free (unescaped, FALSE); | ||
62 | 191 | } | ||
63 | 192 | |||
64 | 137 | /* Check to see if either of our action groups has any actions, if | 193 | /* Check to see if either of our action groups has any actions, if |
65 | 138 | so return TRUE so we get chosen! */ | 194 | so return TRUE so we get chosen! */ |
66 | 139 | static gboolean | 195 | static gboolean |
67 | @@ -293,12 +349,17 @@ | |||
68 | 293 | im_application_list_source_removed (Application *app, | 349 | im_application_list_source_removed (Application *app, |
69 | 294 | const gchar *id) | 350 | const gchar *id) |
70 | 295 | { | 351 | { |
74 | 296 | g_action_map_remove_action (G_ACTION_MAP(app->source_actions), id); | 352 | gchar *action_name; |
75 | 297 | 353 | ||
76 | 298 | g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id); | 354 | action_name = escape_action_name (id); |
77 | 355 | |||
78 | 356 | g_action_map_remove_action (G_ACTION_MAP(app->source_actions), action_name); | ||
79 | 357 | g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, action_name); | ||
80 | 299 | 358 | ||
81 | 300 | if (application_update_draws_attention(app)) | 359 | if (application_update_draws_attention(app)) |
82 | 301 | im_application_list_update_root_action (app->list); | 360 | im_application_list_update_root_action (app->list); |
83 | 361 | |||
84 | 362 | g_free (action_name); | ||
85 | 302 | } | 363 | } |
86 | 303 | 364 | ||
87 | 304 | static void | 365 | static void |
88 | @@ -307,9 +368,11 @@ | |||
89 | 307 | gpointer user_data) | 368 | gpointer user_data) |
90 | 308 | { | 369 | { |
91 | 309 | Application *app = user_data; | 370 | Application *app = user_data; |
93 | 310 | const gchar *source_id; | 371 | const gchar *action_name; |
94 | 372 | gchar *source_id; | ||
95 | 311 | 373 | ||
97 | 312 | source_id = g_action_get_name (G_ACTION (action)); | 374 | action_name = g_action_get_name (G_ACTION (action)); |
98 | 375 | source_id = unescape_action_name (action_name); | ||
99 | 313 | 376 | ||
100 | 314 | if (g_variant_get_boolean (parameter)) | 377 | if (g_variant_get_boolean (parameter)) |
101 | 315 | { | 378 | { |
102 | @@ -326,20 +389,28 @@ | |||
103 | 326 | app->cancellable, NULL, NULL); | 389 | app->cancellable, NULL, NULL); |
104 | 327 | } | 390 | } |
105 | 328 | 391 | ||
107 | 329 | im_application_list_source_removed (app, source_id); | 392 | im_application_list_source_removed (app, action_name); |
108 | 393 | |||
109 | 394 | g_free (source_id); | ||
110 | 330 | } | 395 | } |
111 | 331 | 396 | ||
112 | 332 | static void | 397 | static void |
113 | 333 | im_application_list_message_removed (Application *app, | 398 | im_application_list_message_removed (Application *app, |
114 | 334 | const gchar *id) | 399 | const gchar *id) |
115 | 335 | { | 400 | { |
118 | 336 | g_action_map_remove_action (G_ACTION_MAP(app->message_actions), id); | 401 | gchar *action_name; |
119 | 337 | g_action_muxer_remove (app->message_sub_actions, id); | 402 | |
120 | 403 | action_name = escape_action_name (id); | ||
121 | 404 | |||
122 | 405 | g_action_map_remove_action (G_ACTION_MAP(app->message_actions), action_name); | ||
123 | 406 | g_action_muxer_remove (app->message_sub_actions, action_name); | ||
124 | 338 | 407 | ||
125 | 339 | if (application_update_draws_attention(app)) | 408 | if (application_update_draws_attention(app)) |
126 | 340 | im_application_list_update_root_action (app->list); | 409 | im_application_list_update_root_action (app->list); |
127 | 341 | 410 | ||
129 | 342 | g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id); | 411 | g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, action_name); |
130 | 412 | |||
131 | 413 | g_free (action_name); | ||
132 | 343 | } | 414 | } |
133 | 344 | 415 | ||
134 | 345 | static void | 416 | static void |
135 | @@ -348,9 +419,11 @@ | |||
136 | 348 | gpointer user_data) | 419 | gpointer user_data) |
137 | 349 | { | 420 | { |
138 | 350 | Application *app = user_data; | 421 | Application *app = user_data; |
140 | 351 | const gchar *message_id; | 422 | const gchar *action_name; |
141 | 423 | gchar *message_id; | ||
142 | 352 | 424 | ||
144 | 353 | message_id = g_action_get_name (G_ACTION (action)); | 425 | action_name = g_action_get_name (G_ACTION (action)); |
145 | 426 | message_id = unescape_action_name (action_name); | ||
146 | 354 | 427 | ||
147 | 355 | if (g_variant_get_boolean (parameter)) | 428 | if (g_variant_get_boolean (parameter)) |
148 | 356 | { | 429 | { |
149 | @@ -369,7 +442,9 @@ | |||
150 | 369 | app->cancellable, NULL, NULL); | 442 | app->cancellable, NULL, NULL); |
151 | 370 | } | 443 | } |
152 | 371 | 444 | ||
154 | 372 | im_application_list_message_removed (app, message_id); | 445 | im_application_list_message_removed (app, action_name); |
155 | 446 | |||
156 | 447 | g_free (message_id); | ||
157 | 373 | } | 448 | } |
158 | 374 | 449 | ||
159 | 375 | static void | 450 | static void |
160 | @@ -379,11 +454,11 @@ | |||
161 | 379 | { | 454 | { |
162 | 380 | Application *app = user_data; | 455 | Application *app = user_data; |
163 | 381 | const gchar *message_id; | 456 | const gchar *message_id; |
165 | 382 | const gchar *action_id; | 457 | gchar *action_id; |
166 | 383 | GVariantBuilder builder; | 458 | GVariantBuilder builder; |
167 | 384 | 459 | ||
168 | 385 | message_id = g_object_get_data (G_OBJECT (action), "message"); | 460 | message_id = g_object_get_data (G_OBJECT (action), "message"); |
170 | 386 | action_id = g_action_get_name (G_ACTION (action)); | 461 | action_id = unescape_action_name (g_action_get_name (G_ACTION (action))); |
171 | 387 | 462 | ||
172 | 388 | g_variant_builder_init (&builder, G_VARIANT_TYPE ("av")); | 463 | g_variant_builder_init (&builder, G_VARIANT_TYPE ("av")); |
173 | 389 | if (parameter) | 464 | if (parameter) |
174 | @@ -397,6 +472,8 @@ | |||
175 | 397 | NULL, NULL); | 472 | NULL, NULL); |
176 | 398 | 473 | ||
177 | 399 | im_application_list_message_removed (app, message_id); | 474 | im_application_list_message_removed (app, message_id); |
178 | 475 | |||
179 | 476 | g_free (action_id); | ||
180 | 400 | } | 477 | } |
181 | 401 | 478 | ||
182 | 402 | static void | 479 | static void |
183 | @@ -799,6 +876,7 @@ | |||
184 | 799 | GVariant *serialized_icon = NULL; | 876 | GVariant *serialized_icon = NULL; |
185 | 800 | GVariant *state; | 877 | GVariant *state; |
186 | 801 | GSimpleAction *action; | 878 | GSimpleAction *action; |
187 | 879 | gchar *action_name; | ||
188 | 802 | 880 | ||
189 | 803 | g_variant_get (source, "(&s&s@avux&sb)", | 881 | g_variant_get (source, "(&s&s@avux&sb)", |
190 | 804 | &id, &label, &maybe_serialized_icon, &count, &time, &string, &draws_attention); | 882 | &id, &label, &maybe_serialized_icon, &count, &time, &string, &draws_attention); |
191 | @@ -809,12 +887,13 @@ | |||
192 | 809 | visible = count > 0 || time != 0 || (string != NULL && string[0] != '\0'); | 887 | visible = count > 0 || time != 0 || (string != NULL && string[0] != '\0'); |
193 | 810 | 888 | ||
194 | 811 | state = g_variant_new ("(uxsb)", count, time, string, draws_attention); | 889 | state = g_variant_new ("(uxsb)", count, time, string, draws_attention); |
196 | 812 | action = g_simple_action_new_stateful (id, G_VARIANT_TYPE_BOOLEAN, state); | 890 | action_name = escape_action_name (id); |
197 | 891 | action = g_simple_action_new_stateful (action_name, G_VARIANT_TYPE_BOOLEAN, state); | ||
198 | 813 | g_signal_connect (action, "activate", G_CALLBACK (im_application_list_source_activated), app); | 892 | g_signal_connect (action, "activate", G_CALLBACK (im_application_list_source_activated), app); |
199 | 814 | 893 | ||
200 | 815 | g_action_map_add_action (G_ACTION_MAP(app->source_actions), G_ACTION (action)); | 894 | g_action_map_add_action (G_ACTION_MAP(app->source_actions), G_ACTION (action)); |
201 | 816 | 895 | ||
203 | 817 | g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, id, label, serialized_icon, visible); | 896 | g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, action_name, label, serialized_icon, visible); |
204 | 818 | 897 | ||
205 | 819 | if (visible && draws_attention && app->draws_attention == FALSE) | 898 | if (visible && draws_attention && app->draws_attention == FALSE) |
206 | 820 | { | 899 | { |
207 | @@ -822,6 +901,7 @@ | |||
208 | 822 | im_application_list_update_root_action (app->list); | 901 | im_application_list_update_root_action (app->list); |
209 | 823 | } | 902 | } |
210 | 824 | 903 | ||
211 | 904 | g_free (action_name); | ||
212 | 825 | g_object_unref (action); | 905 | g_object_unref (action); |
213 | 826 | if (serialized_icon) | 906 | if (serialized_icon) |
214 | 827 | g_variant_unref (serialized_icon); | 907 | g_variant_unref (serialized_icon); |
215 | @@ -841,6 +921,7 @@ | |||
216 | 841 | gboolean draws_attention; | 921 | gboolean draws_attention; |
217 | 842 | GVariant *serialized_icon = NULL; | 922 | GVariant *serialized_icon = NULL; |
218 | 843 | gboolean visible; | 923 | gboolean visible; |
219 | 924 | gchar *action_name; | ||
220 | 844 | 925 | ||
221 | 845 | g_variant_get (source, "(&s&s@avux&sb)", | 926 | g_variant_get (source, "(&s&s@avux&sb)", |
222 | 846 | &id, &label, &maybe_serialized_icon, &count, &time, &string, &draws_attention); | 927 | &id, &label, &maybe_serialized_icon, &count, &time, &string, &draws_attention); |
223 | @@ -848,12 +929,14 @@ | |||
224 | 848 | if (g_variant_n_children (maybe_serialized_icon) == 1) | 929 | if (g_variant_n_children (maybe_serialized_icon) == 1) |
225 | 849 | g_variant_get_child (maybe_serialized_icon, 0, "v", &serialized_icon); | 930 | g_variant_get_child (maybe_serialized_icon, 0, "v", &serialized_icon); |
226 | 850 | 931 | ||
228 | 851 | g_action_group_change_action_state (G_ACTION_GROUP (app->source_actions), id, | 932 | action_name = escape_action_name (id); |
229 | 933 | |||
230 | 934 | g_action_group_change_action_state (G_ACTION_GROUP (app->source_actions), action_name, | ||
231 | 852 | g_variant_new ("(uxsb)", count, time, string, draws_attention)); | 935 | g_variant_new ("(uxsb)", count, time, string, draws_attention)); |
232 | 853 | 936 | ||
233 | 854 | visible = count > 0 || time != 0 || (string != NULL && string[0] != '\0'); | 937 | visible = count > 0 || time != 0 || (string != NULL && string[0] != '\0'); |
234 | 855 | 938 | ||
236 | 856 | g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, serialized_icon, visible); | 939 | g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, action_name, label, serialized_icon, visible); |
237 | 857 | 940 | ||
238 | 858 | if (application_update_draws_attention (app)) | 941 | if (application_update_draws_attention (app)) |
239 | 859 | im_application_list_update_root_action (app->list); | 942 | im_application_list_update_root_action (app->list); |
240 | @@ -861,6 +944,7 @@ | |||
241 | 861 | if (serialized_icon) | 944 | if (serialized_icon) |
242 | 862 | g_variant_unref (serialized_icon); | 945 | g_variant_unref (serialized_icon); |
243 | 863 | g_variant_unref (maybe_serialized_icon); | 946 | g_variant_unref (maybe_serialized_icon); |
244 | 947 | g_free (action_name); | ||
245 | 864 | } | 948 | } |
246 | 865 | 949 | ||
247 | 866 | static void | 950 | static void |
248 | @@ -965,6 +1049,7 @@ | |||
249 | 965 | GSimpleAction *action; | 1049 | GSimpleAction *action; |
250 | 966 | GIcon *app_icon; | 1050 | GIcon *app_icon; |
251 | 967 | GVariant *actions = NULL; | 1051 | GVariant *actions = NULL; |
252 | 1052 | gchar *action_name; | ||
253 | 968 | 1053 | ||
254 | 969 | g_variant_get (message, "(&s@av&s&s&sxaa{sv}b)", | 1054 | g_variant_get (message, "(&s@av&s&s&sxaa{sv}b)", |
255 | 970 | &id, &maybe_serialized_icon, &title, &subtitle, &body, &time, &action_iter, &draws_attention); | 1055 | &id, &maybe_serialized_icon, &title, &subtitle, &body, &time, &action_iter, &draws_attention); |
256 | @@ -972,7 +1057,8 @@ | |||
257 | 972 | if (g_variant_n_children (maybe_serialized_icon) == 1) | 1057 | if (g_variant_n_children (maybe_serialized_icon) == 1) |
258 | 973 | g_variant_get_child (maybe_serialized_icon, 0, "v", &serialized_icon); | 1058 | g_variant_get_child (maybe_serialized_icon, 0, "v", &serialized_icon); |
259 | 974 | 1059 | ||
261 | 975 | action = g_simple_action_new (id, G_VARIANT_TYPE_BOOLEAN); | 1060 | action_name = escape_action_name (id); |
262 | 1061 | action = g_simple_action_new (action_name, G_VARIANT_TYPE_BOOLEAN); | ||
263 | 976 | g_object_set_qdata(G_OBJECT(action), message_action_draws_attention_quark(), GINT_TO_POINTER(draws_attention)); | 1062 | g_object_set_qdata(G_OBJECT(action), message_action_draws_attention_quark(), GINT_TO_POINTER(draws_attention)); |
264 | 977 | g_signal_connect (action, "activate", G_CALLBACK (im_application_list_message_activated), app); | 1063 | g_signal_connect (action, "activate", G_CALLBACK (im_application_list_message_activated), app); |
265 | 978 | g_action_map_add_action (G_ACTION_MAP(app->message_actions), G_ACTION (action)); | 1064 | g_action_map_add_action (G_ACTION_MAP(app->message_actions), G_ACTION (action)); |
266 | @@ -994,6 +1080,7 @@ | |||
267 | 994 | GVariant *hint; | 1080 | GVariant *hint; |
268 | 995 | GVariantBuilder dict_builder; | 1081 | GVariantBuilder dict_builder; |
269 | 996 | gchar *prefixed_name; | 1082 | gchar *prefixed_name; |
270 | 1083 | gchar *escaped_name; | ||
271 | 997 | 1084 | ||
272 | 998 | if (!g_variant_lookup (entry, "name", "&s", &name)) | 1085 | if (!g_variant_lookup (entry, "name", "&s", &name)) |
273 | 999 | { | 1086 | { |
274 | @@ -1005,14 +1092,15 @@ | |||
275 | 1005 | g_variant_lookup (entry, "parameter-type", "&g", &type); | 1092 | g_variant_lookup (entry, "parameter-type", "&g", &type); |
276 | 1006 | hint = g_variant_lookup_value (entry, "parameter-hint", NULL); | 1093 | hint = g_variant_lookup_value (entry, "parameter-hint", NULL); |
277 | 1007 | 1094 | ||
279 | 1008 | action = g_simple_action_new (name, type ? G_VARIANT_TYPE (type) : NULL); | 1095 | escaped_name = escape_action_name (name); |
280 | 1096 | action = g_simple_action_new (escaped_name, type ? G_VARIANT_TYPE (type) : NULL); | ||
281 | 1009 | g_object_set_data_full (G_OBJECT (action), "message", g_strdup (id), g_free); | 1097 | g_object_set_data_full (G_OBJECT (action), "message", g_strdup (id), g_free); |
282 | 1010 | g_signal_connect (action, "activate", G_CALLBACK (im_application_list_sub_message_activated), app); | 1098 | g_signal_connect (action, "activate", G_CALLBACK (im_application_list_sub_message_activated), app); |
283 | 1011 | g_action_map_add_action (G_ACTION_MAP(action_group), G_ACTION (action)); | 1099 | g_action_map_add_action (G_ACTION_MAP(action_group), G_ACTION (action)); |
284 | 1012 | 1100 | ||
285 | 1013 | g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}")); | 1101 | g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}")); |
286 | 1014 | 1102 | ||
288 | 1015 | prefixed_name = g_strjoin (".", app->id, "msg-actions", id, name, NULL); | 1103 | prefixed_name = g_strjoin (".", app->id, "msg-actions", escaped_name, escaped_name, NULL); |
289 | 1016 | g_variant_builder_add (&dict_builder, "{sv}", "name", g_variant_new_string (prefixed_name)); | 1104 | g_variant_builder_add (&dict_builder, "{sv}", "name", g_variant_new_string (prefixed_name)); |
290 | 1017 | 1105 | ||
291 | 1018 | if (label) | 1106 | if (label) |
292 | @@ -1035,9 +1123,10 @@ | |||
293 | 1035 | g_object_unref (action); | 1123 | g_object_unref (action); |
294 | 1036 | g_variant_unref (entry); | 1124 | g_variant_unref (entry); |
295 | 1037 | g_free (prefixed_name); | 1125 | g_free (prefixed_name); |
296 | 1126 | g_free (escaped_name); | ||
297 | 1038 | } | 1127 | } |
298 | 1039 | 1128 | ||
300 | 1040 | g_action_muxer_insert (app->message_sub_actions, id, G_ACTION_GROUP (action_group)); | 1129 | g_action_muxer_insert (app->message_sub_actions, action_name, G_ACTION_GROUP (action_group)); |
301 | 1041 | actions = g_variant_builder_end (&actions_builder); | 1130 | actions = g_variant_builder_end (&actions_builder); |
302 | 1042 | 1131 | ||
303 | 1043 | g_object_unref (action_group); | 1132 | g_object_unref (action_group); |
304 | @@ -1052,9 +1141,10 @@ | |||
305 | 1052 | app_icon = get_symbolic_app_icon (app->info); | 1141 | app_icon = get_symbolic_app_icon (app->info); |
306 | 1053 | 1142 | ||
307 | 1054 | g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, | 1143 | g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, |
309 | 1055 | app->id, app_icon, id, serialized_icon, title, | 1144 | app->id, app_icon, action_name, serialized_icon, title, |
310 | 1056 | subtitle, body, actions, time, draws_attention); | 1145 | subtitle, body, actions, time, draws_attention); |
311 | 1057 | 1146 | ||
312 | 1147 | g_free (action_name); | ||
313 | 1058 | g_variant_iter_free (action_iter); | 1148 | g_variant_iter_free (action_iter); |
314 | 1059 | g_object_unref (action); | 1149 | g_object_unref (action); |
315 | 1060 | if (serialized_icon) | 1150 | if (serialized_icon) |
PASSED: Continuous integration, rev:428 jenkins. qa.ubuntu. com/job/ indicator- messages- ci/138/ jenkins. qa.ubuntu. com/job/ indicator- messages- utopic- amd64-ci/ 18 jenkins. qa.ubuntu. com/job/ indicator- messages- utopic- armhf-ci/ 18 jenkins. qa.ubuntu. com/job/ indicator- messages- utopic- armhf-ci/ 18/artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/indicator- messages- ci/138/ rebuild
http://