X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-main-window.c;h=2ead14b8282b41a114b4c0c10880e89f6acd835a;hp=d0e1628621513ca4a3ae2a0adaab9f787567d181;hb=28f2206c21738a94d6a41de73abba693c7ff323d;hpb=cc36ea20ffc9bc9dbd884f511db9bae55f4d97ca diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index d0e1628..2ead14b 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -53,6 +53,14 @@ #include "modest-mail-operation.h" #include "modest-icon-names.h" #include "modest-progress-bar-widget.h" +#include "maemo/modest-osso-state-saving.h" + +#ifdef MODEST_HILDON_VERSION_0 +#include +#else +#include +#endif /*MODEST_HILDON_VERSION_0*/ + /* 'private'/'protected' functions */ static void modest_main_window_class_init (ModestMainWindowClass *klass); @@ -63,8 +71,9 @@ static gboolean modest_main_window_window_state_event (GtkWidget *widget, gpointer userdata); static void connect_signals (ModestMainWindow *self); -static void restore_sizes (ModestMainWindow *self); -static void save_sizes (ModestMainWindow *self); + +static void restore_settings (ModestMainWindow *self); +static void save_state (ModestWindow *self); static void modest_main_window_show_toolbar (ModestWindow *window, gboolean show_toolbar); @@ -124,6 +133,8 @@ struct _ModestMainWindowPrivate { GtkWidget *accounts_popup; GtkWidget *details_widget; + /* Optimized view enabled */ + gboolean optimized_view; ModestHeaderView *header_view; ModestFolderView *folder_view; @@ -161,6 +172,12 @@ static const GtkActionEntry modest_folder_view_action_entries [] = { { "FolderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, NULL }, }; + +static const GtkToggleActionEntry modest_main_window_toggle_action_entries [] = { + { "ToolbarToggleView", MODEST_STOCK_SPLIT_VIEW, N_("gqn_toolb_rss_fldonoff"), "t", NULL, G_CALLBACK (modest_ui_actions_toggle_folders_view), FALSE }, +}; + + /************************************************************************/ GType @@ -192,16 +209,15 @@ modest_main_window_class_init (ModestMainWindowClass *klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass*) klass; - ModestWindowClass *modest_window_class; - - modest_window_class = (ModestWindowClass *) klass; + ModestWindowClass *modest_window_class = (ModestWindowClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = modest_main_window_finalize; - modest_window_class->show_toolbar_func = modest_main_window_show_toolbar; - g_type_class_add_private (gobject_class, sizeof(ModestMainWindowPrivate)); + + modest_window_class->show_toolbar_func = modest_main_window_show_toolbar; + modest_window_class->save_state_func = save_state; } static void @@ -220,6 +236,8 @@ modest_main_window_init (ModestMainWindow *obj) priv->accounts_popup = NULL; priv->details_widget = NULL; + priv->optimized_view = FALSE; + priv->progress_widgets = NULL; priv->progress_bar = NULL; priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL; @@ -268,7 +286,7 @@ modest_main_window_get_child_widget (ModestMainWindow *self, static void -restore_sizes (ModestMainWindow *self) +restore_settings (ModestMainWindow *self) { ModestConf *conf; ModestMainWindowPrivate *priv; @@ -287,9 +305,10 @@ restore_sizes (ModestMainWindow *self) static void -save_sizes (ModestMainWindow *self) +save_state (ModestWindow *window) { ModestConf *conf; + ModestMainWindow* self = MODEST_MAIN_WINDOW(window); ModestMainWindowPrivate *priv; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); @@ -318,7 +337,7 @@ wrap_in_scrolled_window (GtkWidget *win, GtkWidget *widget) static gboolean on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) { - save_sizes (self); + modest_window_save_state (MODEST_WINDOW(self)); return FALSE; } @@ -407,6 +426,45 @@ sync_accounts_cb (ModestMainWindow *win) return FALSE; /* Do not call this idle handler again. */ } +static void on_hildon_program_is_topmost_notify(GObject *self, + GParamSpec *propert_param, gpointer user_data) +{ + HildonProgram *app = HILDON_PROGRAM (self); + + /* + ModestWindow* self = MODEST_WINDOW(user_data); + */ + + /* Note that use of hildon_program_set_can_hibernate() + * is generally referred to as "setting the killable flag", + * though hibernation does not seem equal to death. + * murrayc */ + + if (hildon_program_get_is_topmost (app)) { + /* Prevent hibernation when the progam comes to the foreground, + * because hibernation should only happen when the application + * is in the background: */ + hildon_program_set_can_hibernate (app, FALSE); + } else { + /* Allow hibernation if the program has gone to the background: */ + + /* However, prevent hibernation while the settings are being changed: */ + const gboolean hibernation_prevented = + modest_window_mgr_get_hibernation_is_prevented ( + modest_runtime_get_window_mgr ()); + + if (hibernation_prevented) + hildon_program_set_can_hibernate (app, FALSE); + else { + /* Allow hibernation, after saving the state: */ + modest_osso_save_state(); + hildon_program_set_can_hibernate (app, TRUE); + } + } + +} + + ModestWindow* modest_main_window_new (void) @@ -446,6 +504,11 @@ modest_main_window_new (void) G_N_ELEMENTS (modest_toggle_action_entries), self); + gtk_action_group_add_toggle_actions (action_group, + modest_main_window_toggle_action_entries, + G_N_ELEMENTS (modest_main_window_toggle_action_entries), + self); + gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); g_object_unref (action_group); @@ -521,7 +584,7 @@ modest_main_window_new (void) gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->main_paned, TRUE, TRUE,0); gtk_container_add (GTK_CONTAINER(self), priv->main_vbox); - restore_sizes (MODEST_MAIN_WINDOW(self)); + restore_settings (MODEST_MAIN_WINDOW(self)); /* Set window icon */ window_icon = modest_platform_get_icon (MODEST_APP_ICON); @@ -537,6 +600,27 @@ modest_main_window_new (void) /* do send & receive when we are idle */ g_idle_add ((GSourceFunc)sync_accounts_cb, self); + + HildonProgram *app = hildon_program_get_instance (); + hildon_program_add_window (app, HILDON_WINDOW (self)); + + /* Register HildonProgram signal handlers: */ + /* These are apparently deprecated, according to the + * "HildonApp/HildonAppView to HildonProgram/HildonWindow migration guide", + * though the API reference does not mention that: + * + g_signal_connect (G_OBJECT(app), "topmost_status_lose", + G_CALLBACK (on_hildon_program_save_state), self); + g_signal_connect (G_OBJECT(app), "topmost_status_acquire", + G_CALLBACK (on_hildon_program_status_acquire), self); + */ + g_signal_connect (G_OBJECT(app), "notify::is-topmost", + G_CALLBACK (on_hildon_program_is_topmost_notify), self); + + /* Load previous osso state, for instance if we are being restored from + * hibernation: */ + modest_osso_load_state(); + return MODEST_WINDOW(self); } @@ -568,15 +652,21 @@ modest_main_window_set_style (ModestMainWindow *self, ModestMainWindowStyle style) { ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + GtkAction *action; g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); /* no change -> nothing to do */ if (priv->style == style) return; + /* Get toggle button */ + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarToggleView"); + priv->style = style; switch (style) { @@ -588,6 +678,10 @@ modest_main_window_set_style (ModestMainWindow *self, /* Reparent the contents widget to the main vbox */ gtk_widget_reparent (priv->contents_widget, priv->main_vbox); + g_signal_handlers_block_by_func (action, modest_ui_actions_toggle_folders_view, self); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self); + break; case MODEST_MAIN_WINDOW_STYLE_SPLIT: /* Remove header view */ @@ -597,6 +691,11 @@ modest_main_window_set_style (ModestMainWindow *self, /* Reparent the main paned */ gtk_paned_add2 (GTK_PANED (priv->main_paned), priv->contents_widget); gtk_container_add (GTK_CONTAINER (priv->main_vbox), priv->main_paned); + + g_signal_handlers_block_by_func (action, modest_ui_actions_toggle_folders_view, self); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE); + g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self); + break; default: g_return_if_reached (); @@ -670,10 +769,14 @@ modest_main_window_show_toolbar (ModestWindow *self, GtkWidget *placeholder = NULL; gint insert_index; - parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); - if (!parent_priv->toolbar && show_toolbar) { + /* Set optimized view status */ + priv->optimized_view = !show_toolbar; + + if (!parent_priv->toolbar) { parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar"); @@ -722,14 +825,16 @@ modest_main_window_show_toolbar (ModestWindow *self, NULL, self); } - /* TODO: Why is this sometimes NULL? murrayc */ - if (parent_priv->toolbar) { - if (show_toolbar) { - gtk_widget_show (GTK_WIDGET (parent_priv->toolbar)); - set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL); - } else - gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar)); - } + if (show_toolbar) { + /* Quick hack: this prevents toolbar icons "dance" when progress bar show status is changed */ + /* TODO: resize mode migth be GTK_RESIZE_QUEUE, in order to avoid unneccesary shows */ + gtk_container_set_resize_mode (GTK_CONTAINER(parent_priv->toolbar), GTK_RESIZE_IMMEDIATE); + + gtk_widget_show (GTK_WIDGET (parent_priv->toolbar)); + set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL); + } else + gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar)); + } /* @@ -1054,14 +1159,16 @@ static void set_toolbar_mode (ModestMainWindow *self, ModestToolBarModes mode) { - ModestWindowPrivate *parent_priv; - ModestMainWindowPrivate *priv; - GtkAction *sort_action, *refresh_action, *cancel_action; - + ModestWindowPrivate *parent_priv = NULL; + ModestMainWindowPrivate *priv = NULL; + GtkAction *sort_action = NULL, *refresh_action = NULL, *cancel_action = NULL; + g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); parent_priv = MODEST_WINDOW_GET_PRIVATE(self); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + g_return_if_fail (GTK_IS_TOOLBAR(parent_priv->toolbar)); sort_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSort"); refresh_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive"); @@ -1086,6 +1193,10 @@ set_toolbar_mode (ModestMainWindow *self, if (cancel_action) gtk_action_set_visible (cancel_action, FALSE); + + /* Hide toolbar if optimized view is enabled */ + if (priv->optimized_view) + gtk_widget_hide (GTK_WIDGET(parent_priv->toolbar)); break; case TOOLBAR_MODE_TRANSFER: if (sort_action) @@ -1100,12 +1211,14 @@ set_toolbar_mode (ModestMainWindow *self, } if (priv->progress_bar) gtk_widget_show (priv->progress_bar); + + /* Show toolbar if it's hiden (optimized view ) */ + if (priv->optimized_view) + gtk_widget_show (GTK_WIDGET (parent_priv->toolbar)); break; default: g_return_if_reached (); } - - gtk_widget_show_all (GTK_WIDGET (self)); } static void @@ -1125,6 +1238,28 @@ cancel_progressbar (GtkToolButton *toolbutton, } } +static gboolean +observers_empty (ModestMainWindow *self) +{ + GSList *tmp = NULL; + ModestMainWindowPrivate *priv; + gboolean is_empty = TRUE; + guint pending_ops = 0; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + tmp = priv->progress_widgets; + + /* Check all observers */ + while (tmp && is_empty) { + pending_ops = modest_progress_object_num_pending_operations (MODEST_PROGRESS_OBJECT(tmp->data)); + is_empty = pending_ops == 0; + + tmp = g_slist_next(tmp); + } + + return is_empty; +} + static void on_queue_changed (ModestMailOperationQueue *queue, ModestMailOperation *mail_op, @@ -1160,7 +1295,7 @@ on_queue_changed (ModestMailOperationQueue *queue, switch (type) { case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED: if (mode_changed) - set_toolbar_mode (MODEST_MAIN_WINDOW(self), mode); + set_toolbar_mode (self, mode); if (mode == TOOLBAR_MODE_TRANSFER) { while (tmp) { modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data), @@ -1170,14 +1305,16 @@ on_queue_changed (ModestMailOperationQueue *queue, } break; case MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED: - if (modest_mail_operation_queue_num_elements (queue) == 0) - set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL); if (mode == TOOLBAR_MODE_TRANSFER) { while (tmp) { modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data), mail_op); tmp = g_slist_next (tmp); } + + /* If no more operations are being observed, NORMAL mode is enabled again */ + if (observers_empty (self)) + set_toolbar_mode (self, TOOLBAR_MODE_NORMAL); } break; }