* Fixes NB#78357, new mail sound is played now with IMAP IDLE events
[modest] / src / maemo / modest-main-window.c
index 2232a2e..37d22ba 100644 (file)
 #include "modest-text-utils.h"
 #include "modest-signal-mgr.h"
 
-#ifdef MODEST_HAVE_HILDON0_WIDGETS
-#include <hildon-widgets/hildon-program.h>
-#else
-#include <hildon/hildon-program.h>
-#endif /*MODEST_HAVE_HILDON0_WIDGETS*/
-
 #define MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS "ModestMainWindowActionAdditions"
 
 #define XALIGN 0.5
@@ -112,15 +106,17 @@ static void on_queue_changed   (ModestMailOperationQueue *queue,
 
 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
 
-static void
-on_account_inserted (TnyAccountStore *accoust_store,
-                     TnyAccount *account,
-                     gpointer user_data);
+static void on_account_inserted (TnyAccountStore *accoust_store,
+                                TnyAccount *account,
+                                gpointer user_data);
 
-static void
-on_account_removed (TnyAccountStore *accoust_store,
-                    TnyAccount *account,
-                    gpointer user_data);
+static void on_account_removed  (TnyAccountStore *accoust_store,
+                                TnyAccount *account,
+                                gpointer user_data);
+
+static void on_account_changed  (TnyAccountStore *account_store,
+                                TnyAccount *account,
+                                gpointer user_data);
 
 static void on_default_account_changed (ModestAccountMgr* mgr,
                                        gpointer user_data);
@@ -146,9 +142,6 @@ static void on_show_account_action_toggled      (GtkToggleAction *action,
 static void on_refresh_account_action_activated   (GtkAction *action,
                                                   gpointer user_data);
 
-static void on_account_updated (ModestAccountMgr* mgr, gchar* account_name,
-                    gpointer user_data);
-
 static void on_send_receive_csm_activated         (GtkMenuItem *item,
                                                   gpointer user_data);
 
@@ -232,6 +225,9 @@ struct _ModestMainWindowPrivate {
        /* "Updating" banner for header view */
        GtkWidget *updating_banner;
        guint updating_banner_timeout;
+
+       /* Display state */
+       osso_display_state_t display_state;
 };
 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                 MODEST_TYPE_MAIN_WINDOW, \
@@ -358,6 +354,7 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->sighandlers = NULL;
        priv->updating_banner = NULL;
        priv->updating_banner_timeout = 0;
+       priv->display_state = OSSO_DISPLAY_ON;
        
        modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
                                            GTK_WINDOW(obj),
@@ -373,10 +370,9 @@ modest_main_window_finalize (GObject *obj)
 
        /* Sanity check: shouldn't be needed, the window mgr should
           call this function before */
-       modest_main_window_disconnect_signals (MODEST_WINDOW (obj));
-
+       modest_main_window_disconnect_signals (MODEST_WINDOW (obj));    
        modest_main_window_cleanup_queue_error_signals ((ModestMainWindow *) obj);
-
+       
        g_slist_free (priv->progress_widgets);
 
        g_byte_array_free (priv->merge_ids, TRUE);
@@ -400,7 +396,7 @@ modest_main_window_finalize (GObject *obj)
                g_source_remove (priv->restore_paned_timeout);
                priv->restore_paned_timeout = 0;
        }
-
+       
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -977,41 +973,29 @@ connect_signals (ModestMainWindow *self)
                                           G_CALLBACK (on_default_account_changed),
                                           self);
 
-       priv->sighandlers = 
-                       modest_signal_mgr_connect (priv->sighandlers,
-                                                  G_OBJECT (modest_runtime_get_account_mgr ()),
-                                                  "account_updated", 
-                                                  G_CALLBACK (on_account_updated),
-                                                  self);
        /* Account store */
        priv->sighandlers = 
                modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_store ()),
+                                          "account_changed", 
+                                          G_CALLBACK (on_account_changed),
+                                          self);
+
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
                                           G_OBJECT (modest_runtime_get_account_store()), 
                                           "password_requested",
                                           G_CALLBACK (modest_ui_actions_on_password_requested), 
                                           self);
 }
 
-#if 0
-/** Idle handler, to send/receive at startup .*/
-gboolean
-sync_accounts_cb (ModestMainWindow *win)
-{
-       modest_ui_actions_do_send_receive (NULL, MODEST_WINDOW (win));
-       return FALSE; /* Do not call this idle handler again. */
-}
-#endif
-
 static void 
 on_hildon_program_is_topmost_notify(GObject *self,
-                                   GParamSpec *propert_param, gpointer user_data)
+                                   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.
@@ -1022,13 +1006,16 @@ on_hildon_program_is_topmost_notify(GObject *self,
                 * because hibernation should only happen when the application 
                 * is in the background: */
                hildon_program_set_can_hibernate (app, FALSE);
+
+               /* Remove new mail visual notifications */
+               modest_platform_remove_new_mail_notifications (TRUE);
        } 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 ()); 
+                                                                       modest_runtime_get_window_mgr ()); 
        
                if (hibernation_prevented)
                        hildon_program_set_can_hibernate (app, FALSE);
@@ -1037,8 +1024,7 @@ on_hildon_program_is_topmost_notify(GObject *self,
                        modest_osso_save_state();
                        hildon_program_set_can_hibernate (app, TRUE);
                }
-       }
-       
+       }       
 }
 
 static void
@@ -1088,6 +1074,19 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        }
 }
 
+static void 
+osso_display_event_cb (osso_display_state_t state, 
+                      gpointer data)
+{
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (data);
+
+       priv->display_state = state;
+
+       /* Stop blinking if the screen becomes on */
+       if (priv->display_state == OSSO_DISPLAY_ON)
+               modest_platform_remove_new_mail_notifications (TRUE);
+}
+
 ModestWindow *
 modest_main_window_new (void)
 {
@@ -1099,6 +1098,7 @@ modest_main_window_new (void)
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        GtkActionGroup *action_group = NULL;
        GError *error = NULL;
+       HildonProgram *app;
        ModestConf *conf = NULL;
        GtkAction *action = NULL;
        GdkPixbuf *window_icon;
@@ -1175,7 +1175,7 @@ modest_main_window_new (void)
                                    gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
 
        /* Menubar. Update the state of some toggles */
-       parent_priv->menubar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar");
+       parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
        conf = modest_runtime_get_conf ();
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
                                            "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarNormalScreenMenu");
@@ -1234,7 +1234,7 @@ modest_main_window_new (void)
        
        gtk_container_add (GTK_CONTAINER(self), priv->main_vbox);
        
-       HildonProgram *app = hildon_program_get_instance ();
+       app = hildon_program_get_instance ();
        hildon_program_add_window (app, HILDON_WINDOW (self));
        
        g_signal_connect (G_OBJECT(app), "notify::is-topmost",
@@ -1244,18 +1244,23 @@ modest_main_window_new (void)
                          G_CALLBACK (modest_main_window_on_show), folder_win);
                
        /* Set window icon */
-       window_icon = modest_platform_get_icon (MODEST_APP_ICON);
+       window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
        if (window_icon) {
                gtk_window_set_icon (GTK_WINDOW (self), window_icon);
                g_object_unref (window_icon);
        }
 
+       /* Listen for changes in the screen, we don't want to show a
+          led pattern when the display is on for example */
+       osso_hw_set_display_event_cb (modest_maemo_utils_get_osso_context (),
+                                     osso_display_event_cb,
+                                     self); 
+
        /* Dont't restore settings here, 
         * because it requires a gtk_widget_show(), 
         * and we don't want to do that until later,
         * so that the UI is not visible for non-menu D-Bus activation.
         */
-       /* restore_settings (MODEST_MAIN_WINDOW(self), FALSE); */
 
        return MODEST_WINDOW(self);
 }
@@ -1336,6 +1341,53 @@ modest_main_window_get_style (ModestMainWindow *self)
        return priv->style;
 }
 
+static void
+toolbar_resize (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = NULL;
+       ModestWindowPrivate *parent_priv = NULL;
+       GtkWidget *widget;
+       gint static_button_size;
+       ModestWindowMgr *mgr;
+
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+       mgr = modest_runtime_get_window_mgr ();
+       static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?118:108;
+
+       if (parent_priv->toolbar) {
+               /* left size buttons */
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToggleFolders");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->refresh_toolitem), TRUE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->refresh_toolitem), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->sort_toolitem), TRUE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->sort_toolitem), TRUE);
+       }
+               
+}
+
 
 
 static gboolean
@@ -1359,20 +1411,14 @@ modest_main_window_window_state_event (GtkWidget *widget, GdkEventWindowState *e
                if (is_fullscreen != active) {
                        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), is_fullscreen);
                }
+
+               toolbar_resize (MODEST_MAIN_WINDOW (widget));
        }
 
        return FALSE;
 
 }
 
-static void
-set_homogeneous (GtkWidget *widget,
-                gpointer data)
-{
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
-}
-
 static void 
 modest_main_window_show_toolbar (ModestWindow *self,
                                 gboolean show_toolbar)
@@ -1397,19 +1443,12 @@ modest_main_window_show_toolbar (ModestWindow *self,
                                                                  "/ToolBar");
                gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
 
-               /* Set homogeneous toolbar */
-               gtk_container_foreach (GTK_CONTAINER (parent_priv->toolbar), 
-                                      set_homogeneous, NULL);
-       
                priv->progress_toolitem = GTK_WIDGET (gtk_tool_item_new ());
                priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel");
                priv->refresh_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive");
                priv->sort_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSort");
-               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
-               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
-               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
-               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
-
+               toolbar_resize (MODEST_MAIN_WINDOW (self));
+               
                /* Add ProgressBar (Transfer toolbar) */ 
                priv->progress_bar = modest_progress_bar_widget_new ();
                gtk_widget_set_no_show_all (priv->progress_bar, TRUE);
@@ -1495,15 +1534,19 @@ on_account_removed (TnyAccountStore *accoust_store,
 }
 
 static void
-on_account_updated (ModestAccountMgr* mgr,
-                    gchar* account_name,
+on_account_changed (TnyAccountStore *account_store,
+                    TnyAccount *account,
                     gpointer user_data)
 {
        ModestMainWindow *win = MODEST_MAIN_WINDOW (user_data);
        
+       /* We need to refresh the details widget because it could have changed */
        if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS) {
                modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
        }
+
+       /* Update the menus as well, the account name could be changed */
+       update_menus (MODEST_MAIN_WINDOW (user_data));
 }
 
 /* 
@@ -1643,6 +1686,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                          (const gchar *) gray_color_markup);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (device_name);
                g_free (label);
@@ -1670,6 +1714,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
 
                        label_w = gtk_label_new (NULL);
                        gtk_label_set_markup (GTK_LABEL (label_w), label);
+                       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                        g_string_free (proto, TRUE);
                        g_free (label);
@@ -1683,6 +1728,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                         modest_tny_folder_store_get_message_count (folder_store));
        label_w = gtk_label_new (NULL);
        gtk_label_set_markup (GTK_LABEL (label_w), label);
+       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
        g_free (label);
 
@@ -1693,6 +1739,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                         modest_tny_folder_store_get_folder_count (folder_store));
        label_w = gtk_label_new (NULL);
        gtk_label_set_markup (GTK_LABEL (label_w), label);
+       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
        g_free (label);
 
@@ -1710,6 +1757,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (label);
        } else if (TNY_IS_ACCOUNT(folder_store)) {
@@ -1730,6 +1778,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                 gray_color_markup, _("mcen_ti_lastupdated"), last_updated_string);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (label);
        }
@@ -1818,8 +1867,12 @@ on_msg_count_changed (ModestHeaderView *header_view,
                folder_empty = (tny_folder_change_get_new_all_count (change) == 0);
        else
                folder_empty = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
+
+       /* Play a sound (if configured) and make the LED blink  */
+       if (changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS)
+               modest_platform_on_new_headers_received (NULL, FALSE);
        
-/*     Check header removed  (hide marked as DELETED headers) */
+       /* Check header removed  (hide marked as DELETED headers) */
        if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) {
                modest_header_view_refilter (MODEST_HEADER_VIEW(priv->header_view));
        }
@@ -1837,7 +1890,7 @@ on_msg_count_changed (ModestHeaderView *header_view,
        else {
                modest_main_window_set_contents_style (main_window,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
-       }       
+       }
 }
 
 
@@ -2178,8 +2231,13 @@ on_mail_operation_started (ModestMailOperation *mail_op,
        /* Add operation observers and change toolbar if neccessary*/
        tmp = priv->progress_widgets;
        if (mode == TOOLBAR_MODE_TRANSFER) {
-               if (mode_changed)
-                       set_toolbar_transfer_mode(self);                    
+               if (mode_changed) {
+                       GObject *source = modest_mail_operation_get_source(mail_op);
+                       if (G_OBJECT (self) == source) {
+                               set_toolbar_transfer_mode(self);
+                       }
+                       g_object_unref (source);
+               }
 
                while (tmp) {
                        modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
@@ -2581,3 +2639,13 @@ on_updating_msg_list (ModestHeaderView *header_view,
                }
        }
 }
+
+gboolean
+modest_main_window_screen_is_on (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = NULL;
+
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+       
+       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
+}