X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-main-window.c;h=68bf108e090ec0be75f4618688c57897e04bb5d8;hp=fb45c74fe454f5d023a25743256baa3092bb96a3;hb=976c05744180efac28a9dc421acefcff18659d67;hpb=54e61fc8923457830fbeb45b4937efa164a0f764 diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index fb45c74..68bf108 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); @@ -124,6 +132,8 @@ struct _ModestMainWindowPrivate { GtkWidget *accounts_popup; GtkWidget *details_widget; + /* Optimized view enabled */ + gboolean optimized_view; ModestHeaderView *header_view; ModestFolderView *folder_view; @@ -226,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; @@ -413,6 +425,44 @@ 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: */ + gboolean settings_dialog_is_open = FALSE; + + if (settings_dialog_is_open) + 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) @@ -548,6 +598,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); } @@ -696,10 +767,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); + + /* Set optimized view status */ + priv->optimized_view = !show_toolbar; - if (!parent_priv->toolbar && show_toolbar) { + if (!parent_priv->toolbar) { parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar"); @@ -748,18 +823,16 @@ modest_main_window_show_toolbar (ModestWindow *self, NULL, self); } - /* TODO: Why is this sometimes NULL? murrayc */ - if (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); + 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)); - 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)); - } } /* @@ -1084,14 +1157,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"); @@ -1116,6 +1191,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) @@ -1130,12 +1209,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