~indicator-applet-developers/ido/trunk.13.10

« back to all changes in this revision

Viewing changes to src/idoscalemenuitem.c

  • Committer: Tarmac
  • Author(s): Lars Uebernickel
  • Date: 2013-10-31 19:43:34 UTC
  • mfrom: (153.1.1 13.10)
  • Revision ID: tarmac-20131031194334-1wi4nxt42cb779we
idoscalemenuitem: disconnect signal from parent

This fixes a crash: the widget installed a handler for the parent's hide signal, but was destroyed before the parent without disconnecting the signal. Fixes: https://bugs.launchpad.net/bugs/1246536.

Approved by Sebastien Bacher, Charles Kerr, PS Jenkins bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
static void     ido_scale_menu_item_secondary_image_notify (GtkImage              *image,
53
53
                                                            GParamSpec            *pspec,
54
54
                                                            IdoScaleMenuItem      *item);
55
 
static void     ido_scale_menu_item_notify                 (IdoScaleMenuItem      *item,
56
 
                                                            GParamSpec            *pspec,
57
 
                                                            gpointer               user_data);
 
55
static void     ido_scale_menu_item_parent_set             (GtkWidget             *item,
 
56
                                                            GtkWidget             *previous_parent);
58
57
static void     update_packing                             (IdoScaleMenuItem      *self,
59
58
                                                            IdoScaleMenuItemStyle  style);
60
59
static void     default_primary_clicked_handler            (IdoScaleMenuItem      *self);
265
264
                    G_CALLBACK (ido_scale_menu_item_toggle_size_allocate),
266
265
                    NULL);
267
266
 
268
 
  g_signal_connect (self, "notify",
269
 
                    G_CALLBACK (ido_scale_menu_item_notify),
270
 
                    NULL);
271
 
 
272
267
  gtk_container_add (GTK_CONTAINER (self), hbox);
273
268
 
274
269
  gtk_widget_add_events (GTK_WIDGET(self), GDK_SCROLL_MASK);
288
283
  widget_class->motion_notify_event  = ido_scale_menu_item_motion_notify_event;
289
284
  widget_class->scroll_event         = ido_scale_menu_item_scroll_event;
290
285
  widget_class->size_allocate        = ido_scale_menu_item_size_allocate;
 
286
  widget_class->parent_set           = ido_scale_menu_item_parent_set;
291
287
 
292
288
  gobject_class->constructed  = ido_scale_menu_item_constructed;
293
289
  gobject_class->set_property = ido_scale_menu_item_set_property;
645
641
}
646
642
 
647
643
static void
648
 
ido_scale_menu_item_notify (IdoScaleMenuItem *item,
649
 
                            GParamSpec       *pspec,
650
 
                            gpointer          user_data)
 
644
ido_scale_menu_item_parent_set (GtkWidget *item,
 
645
                                GtkWidget *previous_parent)
 
646
 
651
647
{
652
 
  if (g_strcmp0 (pspec->name, "parent"))
653
 
    {
654
 
      GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (item));
655
 
 
656
 
      if (parent)
657
 
        {
658
 
          g_signal_connect (parent, "hide",
659
 
                            G_CALLBACK (menu_hidden),
660
 
                            item);
661
 
        }
662
 
    }
 
648
  GtkWidget *parent;
 
649
 
 
650
  if (previous_parent)
 
651
    g_signal_handlers_disconnect_by_func (previous_parent, menu_hidden, item);
 
652
 
 
653
  parent = gtk_widget_get_parent (item);
 
654
  if (parent)
 
655
    g_signal_connect (parent, "hide", G_CALLBACK (menu_hidden), item);
663
656
}
664
657
 
665
658
static void