+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]
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;
* 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
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;
}
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;
}
}
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));
{
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);