X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-window-mgr.c;h=9e4cbb2895143f69e8b760e38c81487d573c001c;hb=944290c16e0b02bac4daa0e92db938c8aa3b3831;hp=cf695178117be219c4f254d8033bbf5a3077b1e5;hpb=38f8574e5bbbb3a5caa0f1953c510a4581cb2f2b;p=modest diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index cf69517..9e4cbb2 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -52,6 +52,9 @@ static gboolean on_modal_window_close (GtkWidget *widget, GdkEvent *event, gpointer user_data); +static void on_modal_dialog_destroy (GtkObject *object, + gpointer user_data); + static void on_modal_dialog_close (GtkDialog *dialog, gint arg1, gpointer user_data); @@ -246,6 +249,7 @@ modest_window_mgr_finalize (GObject *obj) } modest_signal_mgr_disconnect_all_and_destroy (priv->window_state_uids); + priv->window_state_uids = NULL; if (priv->window_list) { GList *iter = priv->window_list; @@ -275,6 +279,7 @@ modest_window_mgr_finalize (GObject *obj) } modest_signal_mgr_disconnect_all_and_destroy (priv->modal_handler_uids); + priv->modal_handler_uids = NULL; if (priv->modal_windows) { g_mutex_lock (priv->queue_lock); @@ -420,37 +425,11 @@ modest_window_mgr_register_help_id (ModestWindowMgr *self, GtkWindow *win, const const gchar* modest_window_mgr_get_help_id (ModestWindowMgr *self, GtkWindow *win) { - const gchar* help_id = NULL; - /* we don't need 'self', but for API consistency... */ - g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), NULL); - + g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR (self), NULL); g_return_val_if_fail (win, NULL); - g_return_val_if_fail (GTK_IS_WINDOW(win), NULL); - - if (MODEST_IS_MAIN_WINDOW (win)) { - GtkWidget *folder_view; - TnyFolderStore *folder_store; - - /* Get selected folder */ - folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), - MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); - folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); - - /* Switch help_id */ - if (folder_store && TNY_IS_FOLDER (folder_store)) { - help_id = modest_tny_folder_get_help_id (TNY_FOLDER (folder_store)); - if (!help_id) - g_warning ("%s: BUG: did not get a valid help_id", __FUNCTION__); - } - if (folder_store) - g_object_unref (folder_store); - } - if (!help_id) - help_id = g_object_get_data (G_OBJECT(win), MODEST_WINDOW_HELP_ID_PARAM); - - return help_id; + return g_object_get_data (G_OBJECT(win), MODEST_WINDOW_HELP_ID_PARAM); } static gint @@ -808,7 +787,8 @@ on_window_destroy (ModestWindow *window, cancel_window_operations (window); /* Fake the window system, make it think that there is no window */ - g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0); + if (modest_window_mgr_num_windows (self) == 0) + g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0); no_propagate = TRUE; } @@ -912,16 +892,27 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self, /* cancel open and receive operations */ cancel_window_operations (window); + /* Check if it's the topmost window, and remove the window from the stack. + * This is needed for the cases there's no other topmost window that will + * replace it in topmost handler. + */ + if (window == priv->current_top) + priv->current_top = NULL; + /* Disconnect the "window-state-event" handler, we won't need it anymore */ + if (priv->window_state_uids) { #ifdef MODEST_PLATFORM_MAEMO - priv->window_state_uids = modest_signal_mgr_disconnect (priv->window_state_uids, - G_OBJECT (window), - "notify::is-topmost"); + priv->window_state_uids = + modest_signal_mgr_disconnect (priv->window_state_uids, + G_OBJECT (window), + "notify::is-topmost"); #else - priv->window_state_uids = modest_signal_mgr_disconnect (priv->window_state_uids, - G_OBJECT (window), - "window-state-event"); + priv->window_state_uids = + modest_signal_mgr_disconnect (priv->window_state_uids, + G_OBJECT (window), + "window-state-event"); #endif + } /* Disconnect the "delete-event" handler, we won't need it anymore */ g_signal_handler_disconnect (window, handler_id); @@ -933,7 +924,7 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self, gtk_widget_destroy (win->data); /* If there are no more windows registered emit the signal */ - if (priv->window_list == NULL && priv->banner_counter == 0) + if (modest_window_mgr_num_windows (self) == 0) g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0); } @@ -1116,7 +1107,7 @@ modest_window_mgr_set_modal (ModestWindowMgr *self, g_queue_push_head (priv->modal_windows, window); g_mutex_unlock (priv->queue_lock); - if (GTK_IS_DIALOG (window)) + if (GTK_IS_DIALOG (window)) { /* Note that response is not always enough because it could be captured and removed easily by dialogs but works for most of situations */ @@ -1126,13 +1117,25 @@ modest_window_mgr_set_modal (ModestWindowMgr *self, "response", G_CALLBACK (on_modal_dialog_close), self); - else + /* We need this as well because dialogs are often + destroyed with gtk_widget_destroy and this one will + prevent response from happening */ + priv->modal_handler_uids = + modest_signal_mgr_connect (priv->modal_handler_uids, + G_OBJECT (window), + "destroy", + G_CALLBACK (on_modal_dialog_destroy), + self); + } else { priv->modal_handler_uids = modest_signal_mgr_connect (priv->modal_handler_uids, G_OBJECT (window), "delete-event", G_CALLBACK (on_modal_window_close), self); + } + /* Destroy width parent */ + gtk_window_set_destroy_with_parent (window, TRUE); } @@ -1257,12 +1260,17 @@ remove_modal_from_queue (GtkWidget *widget, g_mutex_unlock (priv->queue_lock); /* Disconnect handler */ - priv->modal_handler_uids = - modest_signal_mgr_disconnect (priv->modal_handler_uids, + priv->modal_handler_uids = + modest_signal_mgr_disconnect (priv->modal_handler_uids, G_OBJECT (widget), - GTK_IS_DIALOG (widget) ? - "response" : - "destroy-event"); + GTK_IS_DIALOG (widget) ? + "response" : + "delete-event"); + if (GTK_IS_DIALOG (widget)) + priv->modal_handler_uids = + modest_signal_mgr_disconnect (priv->modal_handler_uids, + G_OBJECT (widget), + "destroy"); /* Schedule the next one for being shown */ g_idle_add (idle_top_modal, self); @@ -1289,10 +1297,22 @@ on_modal_dialog_close (GtkDialog *dialog, { ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data); - /* Remove modal window from queue */ + /* Remove modal window from queue. Note that if "destroy" + signal was invoked before the response the window could be + already deleted */ remove_modal_from_queue (GTK_WIDGET (dialog), self); } +static void +on_modal_dialog_destroy (GtkObject *object, + gpointer user_data) +{ + ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data); + + /* Remove modal window from queue */ + remove_modal_from_queue (GTK_WIDGET (object), self); +} + gint modest_window_mgr_num_windows (ModestWindowMgr *self) { @@ -1306,6 +1326,10 @@ modest_window_mgr_num_windows (ModestWindowMgr *self) if (priv->window_list) num_windows = g_list_length (priv->window_list); + /* Do not take into account the main window if it was hidden */ + if (priv->main_window && !GTK_WIDGET_VISIBLE (priv->main_window)) + num_windows--; + return num_windows + priv->banner_counter; } @@ -1372,8 +1396,6 @@ modest_window_mgr_unregister_banner (ModestWindowMgr *self) priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); priv->banner_counter--; - if (priv->window_list == NULL && priv->banner_counter == 0) { + if (modest_window_mgr_num_windows (self) == 0) g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0); - } - }