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);
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
if (g_list_length (priv->window_list) > 1) {
/* Present the window if it's not visible now */
- if (!gtk_window_has_toplevel_focus (GTK_WINDOW (window)))
+ if (!gtk_window_has_toplevel_focus (GTK_WINDOW (window))) {
gtk_window_present (GTK_WINDOW (window));
+ priv->current_top = window;
+ }
/* Create the confirmation dialog MSG-NOT308 */
dialog_response = modest_platform_run_confirmation_dialog (
GTK_WINDOW (window), _("emev_nc_close_windows"));
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 */
"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);
}
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);
{
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)
{