2009-03-24 Alberto Garcia <agarcia@igalia.com>
authorAlberto Garcia <agarcia@igalia.com>
Tue, 24 Mar 2009 16:58:02 +0000 (16:58 +0000)
committerAlberto Garcia <agarcia@igalia.com>
Tue, 24 Mar 2009 16:58:02 +0000 (16:58 +0000)
* src/hildon-app-menu-private.h
* src/hildon-app-menu.c (hildon_app_menu_find_intruder)
(hildon_app_menu_map, hildon_app_menu_hide_idle)
(hildon_app_menu_key_press, hildon_app_menu_init)
(hildon_app_menu_finalize):
Make sure that all idle functions are removed when the widget is
destroyed.

Fixes: NB#107583 (Hildon app menu crashes in various applications)

ChangeLog
src/hildon-app-menu-private.h
src/hildon-app-menu.c

index 6df2ea7..20879a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2009-03-24  Alberto Garcia  <agarcia@igalia.com>
+
+       * src/hildon-app-menu-private.h
+       * src/hildon-app-menu.c (hildon_app_menu_find_intruder)
+       (hildon_app_menu_map, hildon_app_menu_hide_idle)
+       (hildon_app_menu_key_press, hildon_app_menu_init)
+       (hildon_app_menu_finalize):
+       Make sure that all idle functions are removed when the widget is
+       destroyed.
+
+       Fixes: NB#107583 (Hildon app menu crashes in various applications)
+
 2009-03-24  Claudio Saavedra  <csaavedra@igalia.com>
 
        [Release 2.1.56]
index ddd2cf2..2312632 100644 (file)
@@ -36,6 +36,8 @@ struct                                          _HildonAppMenuPrivate
     GList *buttons;
     GList *filters;
     guint columns;
+    guint find_intruder_idle_id;
+    guint hide_idle_id;
 };
 
 void G_GNUC_INTERNAL
index d35f7cf..9e00e71 100644 (file)
@@ -470,6 +470,8 @@ hildon_app_menu_find_intruder                   (gpointer data)
     GtkWidget *widget = GTK_WIDGET (data);
     HildonAppMenuPrivate *priv = HILDON_APP_MENU_GET_PRIVATE (widget);
 
+    priv->find_intruder_idle_id = 0;
+
     /* If there's a window between the menu and its parent window, hide the menu */
     if (priv->parent_window) {
         gboolean intruder_found = FALSE;
@@ -537,7 +539,7 @@ hildon_app_menu_map                             (GtkWidget *widget)
      * new window appears */
     gtk_window_set_is_temporary (GTK_WINDOW (widget), TRUE);
 
-    gdk_threads_add_idle (hildon_app_menu_find_intruder, widget);
+    priv->find_intruder_idle_id = gdk_threads_add_idle (hildon_app_menu_find_intruder, widget);
 }
 
 static void
@@ -574,7 +576,9 @@ hildon_app_menu_grab_notify                     (GtkWidget *widget,
 static gboolean
 hildon_app_menu_hide_idle                       (gpointer widget)
 {
+    HildonAppMenuPrivate *priv = HILDON_APP_MENU_GET_PRIVATE (widget);
     gtk_widget_hide (GTK_WIDGET (widget));
+    priv->hide_idle_id = 0;
     return FALSE;
 }
 
@@ -627,7 +631,7 @@ hildon_app_menu_key_press                       (GtkWidget   *widget,
 
             if (gtk_accel_group_query (accel_group, accel_key, accel_mods, NULL)) {
                 gtk_window_activate_key (parent_window, event);
-                gdk_threads_add_idle (hildon_app_menu_hide_idle, widget);
+                priv->hide_idle_id = gdk_threads_add_idle (hildon_app_menu_hide_idle, widget);
                 break;
             }
         }
@@ -959,6 +963,8 @@ hildon_app_menu_init                            (HildonAppMenu *menu)
     priv->buttons = NULL;
     priv->filters = NULL;
     priv->columns = 2;
+    priv->find_intruder_idle_id = 0;
+    priv->hide_idle_id = 0;
 
     /* Create boxes and tables */
     priv->filters_hbox = GTK_BOX (gtk_hbox_new (TRUE, 0));
@@ -989,6 +995,16 @@ hildon_app_menu_finalize                        (GObject *object)
 {
     HildonAppMenuPrivate *priv = HILDON_APP_MENU_GET_PRIVATE(object);
 
+    if (priv->find_intruder_idle_id) {
+        g_source_remove (priv->find_intruder_idle_id);
+        priv->find_intruder_idle_id = 0;
+    }
+
+    if (priv->hide_idle_id) {
+        g_source_remove (priv->hide_idle_id);
+        priv->hide_idle_id = 0;
+    }
+
     if (priv->parent_window) {
         g_signal_handlers_disconnect_by_func (priv->parent_window, parent_window_topmost_notify, object);
         g_signal_handlers_disconnect_by_func (priv->parent_window, parent_window_unmapped, object);