Merge lp:~charlesk/libdbusmenu/lp-977803 into lp:libdbusmenu/0.6
- lp-977803
- Merge into trunk.0.6
Proposed by
Charles Kerr
Status: | Merged |
---|---|
Approved by: | Ted Gould |
Approved revision: | 409 |
Merged at revision: | 408 |
Proposed branch: | lp:~charlesk/libdbusmenu/lp-977803 |
Merge into: | lp:libdbusmenu/0.6 |
Diff against target: |
356 lines (+114/-93) 1 file modified
libdbusmenu-gtk/parser.c (+114/-93) |
To merge this branch: | bzr merge lp:~charlesk/libdbusmenu/lp-977803 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ted Gould (community) | Approve | ||
Review via email: mp+101401@code.launchpad.net |
Commit message
Description of the change
I'm still suspicious about parser.c's signal handling, but this morning's bug #977803 shows that my disconnect-
This commit remembers the handler_id of each signal that we connect to so that we can give more useful warnings at disconnect time.
To post a comment you must log in.
- 409. By Charles Kerr
-
switch the smoke test to a g_debug statement
Revision history for this message
Ted Gould (ted) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'libdbusmenu-gtk/parser.c' | |||
2 | --- libdbusmenu-gtk/parser.c 2012-04-09 16:16:07 +0000 | |||
3 | +++ libdbusmenu-gtk/parser.c 2012-04-10 16:09:19 +0000 | |||
4 | @@ -39,11 +39,27 @@ | |||
5 | 39 | typedef struct _ParserData | 39 | typedef struct _ParserData |
6 | 40 | { | 40 | { |
7 | 41 | GtkWidget *label; | 41 | GtkWidget *label; |
8 | 42 | gulong label_notify_handler_id; | ||
9 | 43 | |||
10 | 42 | GtkAction *action; | 44 | GtkAction *action; |
12 | 43 | GtkWidget *widget; | 45 | gulong action_notify_handler_id; |
13 | 46 | |||
14 | 44 | GtkWidget *shell; | 47 | GtkWidget *shell; |
15 | 48 | gulong item_inserted_handler_id; | ||
16 | 49 | gulong item_removed_handler_id; | ||
17 | 50 | |||
18 | 45 | GtkWidget *image; | 51 | GtkWidget *image; |
19 | 52 | gulong image_notify_handler_id; | ||
20 | 53 | |||
21 | 46 | AtkObject *accessible; | 54 | AtkObject *accessible; |
22 | 55 | gulong a11y_handler_id; | ||
23 | 56 | |||
24 | 57 | GtkWidget *widget; | ||
25 | 58 | gulong widget_notify_handler_id; | ||
26 | 59 | gulong widget_add_handler_id; | ||
27 | 60 | gulong widget_accel_handler_id; | ||
28 | 61 | gulong widget_toggle_handler_id; | ||
29 | 62 | gulong widget_visible_handler_id; | ||
30 | 47 | 63 | ||
31 | 48 | } ParserData; | 64 | } ParserData; |
32 | 49 | 65 | ||
33 | @@ -160,6 +176,41 @@ | |||
34 | 160 | **** | 176 | **** |
35 | 161 | ***/ | 177 | ***/ |
36 | 162 | 178 | ||
37 | 179 | static void | ||
38 | 180 | dbusmenu_gtk_clear_signal_handler (gpointer instance, gulong *handler_id) | ||
39 | 181 | { | ||
40 | 182 | if (handler_id && *handler_id) { | ||
41 | 183 | /* complain if we thought we were connected but aren't */ | ||
42 | 184 | if (!g_signal_handler_is_connected (instance, *handler_id)) { | ||
43 | 185 | g_debug ("%s tried to disconnect signal handler %lu from disconnected %p", G_STRLOC, *handler_id, instance); | ||
44 | 186 | } else { | ||
45 | 187 | g_signal_handler_disconnect (instance, *handler_id); | ||
46 | 188 | *handler_id = 0; | ||
47 | 189 | } | ||
48 | 190 | } | ||
49 | 191 | } | ||
50 | 192 | |||
51 | 193 | /* get the ParserData associated with the specified DbusmenuMenuitem */ | ||
52 | 194 | static ParserData* | ||
53 | 195 | parser_data_get_from_menuitem (DbusmenuMenuitem * item) | ||
54 | 196 | { | ||
55 | 197 | return (ParserData *) g_object_get_data(G_OBJECT(item), PARSER_DATA); | ||
56 | 198 | } | ||
57 | 199 | |||
58 | 200 | /* get the ParserData associated with the specified widget */ | ||
59 | 201 | static ParserData* | ||
60 | 202 | parser_data_get_from_widget (GtkWidget * widget) | ||
61 | 203 | { | ||
62 | 204 | DbusmenuMenuitem * item = dbusmenu_gtk_parse_get_cached_item (widget); | ||
63 | 205 | if (item != NULL) | ||
64 | 206 | return parser_data_get_from_menuitem (item); | ||
65 | 207 | return NULL; | ||
66 | 208 | } | ||
67 | 209 | |||
68 | 210 | /*** | ||
69 | 211 | **** | ||
70 | 212 | ***/ | ||
71 | 213 | |||
72 | 163 | /** | 214 | /** |
73 | 164 | * dbusmenu_gtk_parse_menu_structure: | 215 | * dbusmenu_gtk_parse_menu_structure: |
74 | 165 | * @widget: A #GtkMenuItem or #GtkMenuShell to turn into a #DbusmenuMenuitem | 216 | * @widget: A #GtkMenuItem or #GtkMenuShell to turn into a #DbusmenuMenuitem |
75 | @@ -222,64 +273,47 @@ | |||
76 | 222 | g_return_if_fail (pdata != NULL); | 273 | g_return_if_fail (pdata != NULL); |
77 | 223 | 274 | ||
78 | 224 | if (pdata->label != NULL) { | 275 | if (pdata->label != NULL) { |
84 | 225 | gint i = 0; | 276 | GObject * o = G_OBJECT(pdata->label); |
85 | 226 | i += g_signal_handlers_disconnect_matched(pdata->label, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 277 | dbusmenu_gtk_clear_signal_handler (o, &pdata->label_notify_handler_id); |
86 | 227 | 0, 0, NULL, G_CALLBACK(label_notify_cb), NULL); | 278 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->label); |
82 | 228 | g_warn_if_fail (i != 1); | ||
83 | 229 | g_object_remove_weak_pointer(G_OBJECT(pdata->label), (gpointer*)&pdata->label); | ||
87 | 230 | } | 279 | } |
88 | 231 | 280 | ||
89 | 232 | if (pdata->action != NULL) { | 281 | if (pdata->action != NULL) { |
95 | 233 | gint i = 0; | 282 | GObject * o = G_OBJECT(pdata->action); |
96 | 234 | i += g_signal_handlers_disconnect_matched(pdata->action, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 283 | dbusmenu_gtk_clear_signal_handler (o, &pdata->action_notify_handler_id); |
97 | 235 | 0, 0, NULL, G_CALLBACK(action_notify_cb), NULL); | 284 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->action); |
93 | 236 | g_warn_if_fail (i != 1); | ||
94 | 237 | g_object_remove_weak_pointer(G_OBJECT(pdata->action), (gpointer*)&pdata->action); | ||
98 | 238 | } | 285 | } |
99 | 239 | 286 | ||
100 | 240 | if (pdata->widget != NULL) { | 287 | if (pdata->widget != NULL) { |
101 | 241 | GObject * o = G_OBJECT(pdata->widget); | 288 | GObject * o = G_OBJECT(pdata->widget); |
114 | 242 | gint i = 0; | 289 | dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_notify_handler_id); |
115 | 243 | i += g_signal_handlers_disconnect_matched(o, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 290 | dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_add_handler_id); |
116 | 244 | 0, 0, NULL, G_CALLBACK(widget_notify_cb), NULL); | 291 | dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_accel_handler_id); |
117 | 245 | i += g_signal_handlers_disconnect_matched(o, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 292 | dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_toggle_handler_id); |
118 | 246 | 0, 0, NULL, G_CALLBACK(widget_add_cb), NULL); | 293 | dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_visible_handler_id); |
107 | 247 | i += g_signal_handlers_disconnect_matched(o, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | ||
108 | 248 | 0, 0, NULL, G_CALLBACK(accel_changed), NULL); | ||
109 | 249 | i += g_signal_handlers_disconnect_matched(o, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | ||
110 | 250 | 0, 0, NULL, G_CALLBACK(checkbox_toggled), NULL); | ||
111 | 251 | i += g_signal_handlers_disconnect_matched(o, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | ||
112 | 252 | 0, 0, NULL, G_CALLBACK(menuitem_notify_cb), NULL); | ||
113 | 253 | g_warn_if_fail (i != 5); | ||
119 | 254 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->widget); | 294 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->widget); |
120 | 295 | |||
121 | 255 | /* since the DbusmenuMenuitem is being destroyed, uncache it from the GtkWidget */ | 296 | /* since the DbusmenuMenuitem is being destroyed, uncache it from the GtkWidget */ |
122 | 256 | g_object_steal_data(o, CACHED_MENUITEM); | 297 | g_object_steal_data(o, CACHED_MENUITEM); |
123 | 257 | } | 298 | } |
124 | 258 | 299 | ||
125 | 259 | if (pdata->shell != NULL) { | 300 | if (pdata->shell != NULL) { |
133 | 260 | gint i = 0; | 301 | GObject * o = G_OBJECT(pdata->shell); |
134 | 261 | i += g_signal_handlers_disconnect_matched(pdata->shell, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 302 | dbusmenu_gtk_clear_signal_handler (o, &pdata->item_inserted_handler_id); |
135 | 262 | 0, 0, NULL, G_CALLBACK(item_inserted_cb), NULL); | 303 | dbusmenu_gtk_clear_signal_handler (o, &pdata->item_removed_handler_id); |
136 | 263 | i += g_signal_handlers_disconnect_matched(pdata->shell, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 304 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->shell); |
130 | 264 | 0, 0, NULL, G_CALLBACK(item_removed_cb), NULL); | ||
131 | 265 | g_warn_if_fail (i != 2); | ||
132 | 266 | g_object_remove_weak_pointer(G_OBJECT(pdata->shell), (gpointer*)&pdata->shell); | ||
137 | 267 | } | 305 | } |
138 | 268 | 306 | ||
139 | 269 | if (pdata->image != NULL) { | 307 | if (pdata->image != NULL) { |
145 | 270 | gint i = 0; | 308 | GObject * o = G_OBJECT(pdata->image); |
146 | 271 | i += g_signal_handlers_disconnect_matched(pdata->image, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 309 | dbusmenu_gtk_clear_signal_handler (o, &pdata->image_notify_handler_id); |
147 | 272 | 0, 0, NULL, G_CALLBACK(image_notify_cb), NULL); | 310 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->image); |
143 | 273 | g_warn_if_fail (i != 1); | ||
144 | 274 | g_object_remove_weak_pointer(G_OBJECT(pdata->image), (gpointer*)&pdata->image); | ||
148 | 275 | } | 311 | } |
149 | 276 | 312 | ||
150 | 277 | if (pdata->accessible != NULL) { | 313 | if (pdata->accessible != NULL) { |
156 | 278 | gint i = 0; | 314 | GObject * o = G_OBJECT(pdata->accessible); |
157 | 279 | i += g_signal_handlers_disconnect_matched(pdata->accessible, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, | 315 | dbusmenu_gtk_clear_signal_handler (o, &pdata->a11y_handler_id); |
158 | 280 | 0, 0, NULL, G_CALLBACK(a11y_name_notify_cb), NULL); | 316 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->accessible); |
154 | 281 | g_warn_if_fail (i != 1); | ||
155 | 282 | g_object_remove_weak_pointer(G_OBJECT(pdata->accessible), (gpointer*)&pdata->accessible); | ||
159 | 283 | } | 317 | } |
160 | 284 | 318 | ||
161 | 285 | g_free(pdata); | 319 | g_free(pdata); |
162 | @@ -347,10 +381,10 @@ | |||
163 | 347 | g_return_if_fail(DBUSMENU_IS_MENUITEM(mi)); | 381 | g_return_if_fail(DBUSMENU_IS_MENUITEM(mi)); |
164 | 348 | g_return_if_fail(GTK_IS_MENU_SHELL(menu)); | 382 | g_return_if_fail(GTK_IS_MENU_SHELL(menu)); |
165 | 349 | 383 | ||
167 | 350 | ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(mi), PARSER_DATA); | 384 | ParserData *pdata = parser_data_get_from_menuitem (mi); |
168 | 351 | 385 | ||
169 | 352 | pdata->shell = menu; | 386 | pdata->shell = menu; |
171 | 353 | g_signal_connect (G_OBJECT (menu), | 387 | pdata->item_inserted_handler_id = g_signal_connect (G_OBJECT (menu), |
172 | 354 | #ifdef HAVE_GTK3 | 388 | #ifdef HAVE_GTK3 |
173 | 355 | "insert", | 389 | "insert", |
174 | 356 | #else | 390 | #else |
175 | @@ -358,10 +392,10 @@ | |||
176 | 358 | #endif | 392 | #endif |
177 | 359 | G_CALLBACK (item_inserted_cb), | 393 | G_CALLBACK (item_inserted_cb), |
178 | 360 | mi); | 394 | mi); |
183 | 361 | g_signal_connect (G_OBJECT (menu), | 395 | pdata->item_removed_handler_id = g_signal_connect (G_OBJECT (menu), |
184 | 362 | "remove", | 396 | "remove", |
185 | 363 | G_CALLBACK (item_removed_cb), | 397 | G_CALLBACK (item_removed_cb), |
186 | 364 | mi); | 398 | mi); |
187 | 365 | g_object_add_weak_pointer(G_OBJECT (menu), (gpointer*)&pdata->shell); | 399 | g_object_add_weak_pointer(G_OBJECT (menu), (gpointer*)&pdata->shell); |
188 | 366 | 400 | ||
189 | 367 | /* Some apps (notably Eclipse RCP apps) don't fill contents of submenus | 401 | /* Some apps (notably Eclipse RCP apps) don't fill contents of submenus |
190 | @@ -447,17 +481,18 @@ | |||
191 | 447 | thisitem = construct_dbusmenu_for_widget (widget); | 481 | thisitem = construct_dbusmenu_for_widget (widget); |
192 | 448 | 482 | ||
193 | 449 | if (!gtk_widget_get_visible (widget)) { | 483 | if (!gtk_widget_get_visible (widget)) { |
199 | 450 | g_signal_connect (G_OBJECT (widget), | 484 | ParserData *pdata = parser_data_get_from_menuitem (thisitem); |
200 | 451 | "notify::visible", | 485 | pdata->widget_visible_handler_id = g_signal_connect (G_OBJECT (widget), |
201 | 452 | G_CALLBACK (menuitem_notify_cb), | 486 | "notify::visible", |
202 | 453 | recurse->toplevel); | 487 | G_CALLBACK (menuitem_notify_cb), |
203 | 454 | } | 488 | recurse->toplevel); |
204 | 489 | } | ||
205 | 455 | 490 | ||
206 | 456 | if (GTK_IS_TEAROFF_MENU_ITEM (widget)) { | 491 | if (GTK_IS_TEAROFF_MENU_ITEM (widget)) { |
207 | 457 | dbusmenu_menuitem_property_set_bool (thisitem, | 492 | dbusmenu_menuitem_property_set_bool (thisitem, |
208 | 458 | DBUSMENU_MENUITEM_PROP_VISIBLE, | 493 | DBUSMENU_MENUITEM_PROP_VISIBLE, |
209 | 459 | FALSE); | 494 | FALSE); |
211 | 460 | } | 495 | } |
212 | 461 | } | 496 | } |
213 | 462 | 497 | ||
214 | 463 | /* Check to see if we're in our parents list of children, if we have | 498 | /* Check to see if we're in our parents list of children, if we have |
215 | @@ -584,10 +619,8 @@ | |||
216 | 584 | } | 619 | } |
217 | 585 | else | 620 | else |
218 | 586 | { | 621 | { |
223 | 587 | g_signal_connect (widget, | 622 | pdata->widget_accel_handler_id = g_signal_connect (widget, "accel-closures-changed", |
224 | 588 | "accel-closures-changed", | 623 | G_CALLBACK (accel_changed), mi); |
221 | 589 | G_CALLBACK (accel_changed), | ||
222 | 590 | mi); | ||
225 | 591 | 624 | ||
226 | 592 | if (GTK_IS_CHECK_MENU_ITEM (widget)) | 625 | if (GTK_IS_CHECK_MENU_ITEM (widget)) |
227 | 593 | { | 626 | { |
228 | @@ -599,10 +632,7 @@ | |||
229 | 599 | DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, | 632 | DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, |
230 | 600 | gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED); | 633 | gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED); |
231 | 601 | 634 | ||
236 | 602 | g_signal_connect (widget, | 635 | pdata->widget_toggle_handler_id = g_signal_connect (widget, "activate", G_CALLBACK (checkbox_toggled), mi); |
233 | 603 | "activate", | ||
234 | 604 | G_CALLBACK (checkbox_toggled), | ||
235 | 605 | mi); | ||
237 | 606 | } | 636 | } |
238 | 607 | 637 | ||
239 | 608 | if (GTK_IS_IMAGE_MENU_ITEM (widget)) | 638 | if (GTK_IS_IMAGE_MENU_ITEM (widget)) |
240 | @@ -626,10 +656,7 @@ | |||
241 | 626 | g_free (text); | 656 | g_free (text); |
242 | 627 | 657 | ||
243 | 628 | pdata->label = label; | 658 | pdata->label = label; |
248 | 629 | g_signal_connect (G_OBJECT (label), | 659 | pdata->label_notify_handler_id = g_signal_connect (G_OBJECT (label), "notify", G_CALLBACK(label_notify_cb), mi); |
245 | 630 | "notify", | ||
246 | 631 | G_CALLBACK (label_notify_cb), | ||
247 | 632 | mi); | ||
249 | 633 | g_object_add_weak_pointer(G_OBJECT (label), (gpointer*)&pdata->label); | 660 | g_object_add_weak_pointer(G_OBJECT (label), (gpointer*)&pdata->label); |
250 | 634 | 661 | ||
251 | 635 | AtkObject *accessible = gtk_widget_get_accessible (widget); | 662 | AtkObject *accessible = gtk_widget_get_accessible (widget); |
252 | @@ -646,10 +673,10 @@ | |||
253 | 646 | // An application may set an alternate accessible name in the future, | 673 | // An application may set an alternate accessible name in the future, |
254 | 647 | // so we had better watch out for it. | 674 | // so we had better watch out for it. |
255 | 648 | pdata->accessible = accessible; | 675 | pdata->accessible = accessible; |
260 | 649 | g_signal_connect (G_OBJECT (accessible), | 676 | pdata->a11y_handler_id = g_signal_connect (G_OBJECT (accessible), |
261 | 650 | "notify::accessible-name", | 677 | "notify::accessible-name", |
262 | 651 | G_CALLBACK (a11y_name_notify_cb), | 678 | G_CALLBACK (a11y_name_notify_cb), |
263 | 652 | mi); | 679 | mi); |
264 | 653 | g_object_add_weak_pointer(G_OBJECT (accessible), (gpointer*)&pdata->accessible); | 680 | g_object_add_weak_pointer(G_OBJECT (accessible), (gpointer*)&pdata->accessible); |
265 | 654 | } | 681 | } |
266 | 655 | 682 | ||
267 | @@ -667,10 +694,9 @@ | |||
268 | 667 | sensitive = gtk_action_is_sensitive (action); | 694 | sensitive = gtk_action_is_sensitive (action); |
269 | 668 | 695 | ||
270 | 669 | pdata->action = action; | 696 | pdata->action = action; |
275 | 670 | g_signal_connect_object (action, "notify", | 697 | pdata->action_notify_handler_id = g_signal_connect_object (action, "notify", |
276 | 671 | G_CALLBACK (action_notify_cb), | 698 | G_CALLBACK (action_notify_cb), mi, |
277 | 672 | mi, | 699 | G_CONNECT_AFTER); |
274 | 673 | G_CONNECT_AFTER); | ||
278 | 674 | g_object_add_weak_pointer(G_OBJECT (action), (gpointer*)&pdata->action); | 700 | g_object_add_weak_pointer(G_OBJECT (action), (gpointer*)&pdata->action); |
279 | 675 | } | 701 | } |
280 | 676 | } | 702 | } |
281 | @@ -714,15 +740,11 @@ | |||
282 | 714 | DBUSMENU_MENUITEM_PROP_ENABLED, | 740 | DBUSMENU_MENUITEM_PROP_ENABLED, |
283 | 715 | sensitive); | 741 | sensitive); |
284 | 716 | 742 | ||
289 | 717 | g_signal_connect (widget, | 743 | pdata->widget_notify_handler_id = g_signal_connect (widget, "notify", |
290 | 718 | "notify", | 744 | G_CALLBACK (widget_notify_cb), mi); |
287 | 719 | G_CALLBACK (widget_notify_cb), | ||
288 | 720 | mi); | ||
291 | 721 | 745 | ||
296 | 722 | g_signal_connect (widget, | 746 | pdata->widget_add_handler_id = g_signal_connect (widget, "add", |
297 | 723 | "add", | 747 | G_CALLBACK (widget_add_cb), mi); |
294 | 724 | G_CALLBACK (widget_add_cb), | ||
295 | 725 | mi); | ||
298 | 726 | 748 | ||
299 | 727 | return mi; | 749 | return mi; |
300 | 728 | } | 750 | } |
301 | @@ -742,16 +764,15 @@ | |||
302 | 742 | if (pspec->name == interned_str_visible) | 764 | if (pspec->name == interned_str_visible) |
303 | 743 | { | 765 | { |
304 | 744 | GtkWidget * new_toplevel = gtk_widget_get_toplevel (widget); | 766 | GtkWidget * new_toplevel = gtk_widget_get_toplevel (widget); |
306 | 745 | GtkWidget * old_toplevel = GTK_WIDGET(data); | 767 | GtkWidget * old_toplevel = GTK_WIDGET(data); |
307 | 746 | 768 | ||
308 | 747 | if (new_toplevel == old_toplevel) { | 769 | if (new_toplevel == old_toplevel) { |
309 | 748 | /* TODO: Figure this out -> rebuild (context->bridge, window); */ | 770 | /* TODO: Figure this out -> rebuild (context->bridge, window); */ |
310 | 749 | } | 771 | } |
311 | 750 | 772 | ||
312 | 751 | /* We only care about this once, so let's disconnect now. */ | 773 | /* We only care about this once, so let's disconnect now. */ |
316 | 752 | g_signal_handlers_disconnect_by_func (widget, | 774 | ParserData * pdata = parser_data_get_from_widget (widget); |
317 | 753 | G_CALLBACK (menuitem_notify_cb), | 775 | dbusmenu_gtk_clear_signal_handler (widget, &pdata->widget_visible_handler_id); |
315 | 754 | data); | ||
318 | 755 | } | 776 | } |
319 | 756 | } | 777 | } |
320 | 757 | 778 | ||
321 | @@ -785,17 +806,18 @@ | |||
322 | 785 | if (image != GTK_IMAGE(pdata->image)) { | 806 | if (image != GTK_IMAGE(pdata->image)) { |
323 | 786 | 807 | ||
324 | 787 | if (pdata->image != NULL) { | 808 | if (pdata->image != NULL) { |
327 | 788 | g_signal_handlers_disconnect_by_func(pdata->image, G_CALLBACK(image_notify_cb), menuitem); | 809 | GObject * o = G_OBJECT(pdata->image); |
328 | 789 | g_object_remove_weak_pointer(G_OBJECT(pdata->image), (gpointer*)&pdata->image); | 810 | dbusmenu_gtk_clear_signal_handler (o, &pdata->image_notify_handler_id); |
329 | 811 | g_object_remove_weak_pointer(o, (gpointer*)&pdata->image); | ||
330 | 790 | } | 812 | } |
331 | 791 | 813 | ||
332 | 792 | pdata->image = GTK_WIDGET(image); | 814 | pdata->image = GTK_WIDGET(image); |
333 | 793 | 815 | ||
334 | 794 | if (pdata->image != NULL) { | 816 | if (pdata->image != NULL) { |
339 | 795 | g_signal_connect (G_OBJECT (pdata->image), | 817 | pdata->image_notify_handler_id = g_signal_connect (G_OBJECT (pdata->image), |
340 | 796 | "notify", | 818 | "notify", |
341 | 797 | G_CALLBACK (image_notify_cb), | 819 | G_CALLBACK (image_notify_cb), |
342 | 798 | menuitem); | 820 | menuitem); |
343 | 799 | g_object_add_weak_pointer(G_OBJECT (pdata->image), (gpointer*)&pdata->image); | 821 | g_object_add_weak_pointer(G_OBJECT (pdata->image), (gpointer*)&pdata->image); |
344 | 800 | } | 822 | } |
345 | 801 | } | 823 | } |
346 | @@ -1205,9 +1227,8 @@ | |||
347 | 1205 | */ | 1227 | */ |
348 | 1206 | if (GTK_WIDGET (g_value_get_object (&prop_value)) == NULL) | 1228 | if (GTK_WIDGET (g_value_get_object (&prop_value)) == NULL) |
349 | 1207 | { | 1229 | { |
353 | 1208 | g_signal_handlers_disconnect_by_func (widget, | 1230 | ParserData *pdata = parser_data_get_from_menuitem (child); |
354 | 1209 | G_CALLBACK (widget_notify_cb), | 1231 | dbusmenu_gtk_clear_signal_handler (widget, &pdata->widget_notify_handler_id); |
352 | 1210 | child); | ||
355 | 1211 | 1232 | ||
356 | 1212 | DbusmenuMenuitem *parent = dbusmenu_menuitem_get_parent (child); | 1233 | DbusmenuMenuitem *parent = dbusmenu_menuitem_get_parent (child); |
357 | 1213 | 1234 |