Now window manager takes care of display state (fixes NB#97123).
authorJose Dapena Paz <jdapena@igalia.com>
Mon, 12 Jan 2009 12:57:56 +0000 (12:57 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Mon, 12 Jan 2009 12:57:56 +0000 (12:57 +0000)
We were taking care of display state in all the hildon2 windows, and
this is not the way the osso display event API is expected to be used.
The problem was that we got crashes when we removed one of the windows
(for example header window) and we got a display event after this.

pmo-trunk-r7101

src/hildon2/modest-accounts-window.c
src/hildon2/modest-folder-window.c
src/hildon2/modest-header-window.c
src/hildon2/modest-hildon2-window-mgr.c
src/hildon2/modest-platform.c
src/widgets/modest-hildon1-window-mgr.c
src/widgets/modest-window-mgr.c
src/widgets/modest-window-mgr.h

index d5f4e99..ba68fb8 100644 (file)
@@ -70,8 +70,6 @@ struct _ModestAccountsWindowPrivate {
        /* signals */
        GSList *sighandlers;
 
-       /* Display state */
-       osso_display_state_t display_state;
 };
 #define MODEST_ACCOUNTS_WINDOW_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                                            MODEST_TYPE_ACCOUNTS_WINDOW, \
@@ -129,7 +127,6 @@ modest_accounts_window_instance_init (ModestAccountsWindow *obj)
        priv = MODEST_ACCOUNTS_WINDOW_GET_PRIVATE(obj);
 
        priv->sighandlers = NULL;
-       priv->display_state = OSSO_DISPLAY_ON;
        
        priv->account_view = NULL;
        
@@ -182,19 +179,6 @@ connect_signals (ModestAccountsWindow *self)
        
 }
 
-static void 
-osso_display_event_cb (osso_display_state_t state, 
-                      gpointer data)
-{
-       ModestAccountsWindowPrivate *priv = MODEST_ACCOUNTS_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_accounts_window_new (void)
 {
@@ -237,12 +221,6 @@ modest_accounts_window_new (void)
                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,
@@ -252,18 +230,6 @@ modest_accounts_window_new (void)
        return MODEST_WINDOW(self);
 }
 
-gboolean
-modest_accounts_window_screen_is_on (ModestAccountsWindow *self)
-{
-       ModestAccountsWindowPrivate *priv = NULL;
-
-       g_return_val_if_fail (MODEST_IS_ACCOUNTS_WINDOW(self), FALSE);
-
-       priv = MODEST_ACCOUNTS_WINDOW_GET_PRIVATE (self);
-       
-       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
-}
-
 ModestAccountView *
 modest_accounts_window_get_account_view (ModestAccountsWindow *self)
 {
index 34b4973..2d27d48 100644 (file)
@@ -90,8 +90,6 @@ struct _ModestFolderWindowPrivate {
        /* signals */
        GSList *sighandlers;
 
-       /* Display state */
-       osso_display_state_t display_state;
 };
 #define MODEST_FOLDER_WINDOW_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                                          MODEST_TYPE_FOLDER_WINDOW, \
@@ -151,7 +149,6 @@ modest_folder_window_init (ModestFolderWindow *obj)
        priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(obj);
 
        priv->sighandlers = NULL;
-       priv->display_state = OSSO_DISPLAY_ON;
        
        priv->folder_view = NULL;
 
@@ -208,19 +205,6 @@ connect_signals (ModestFolderWindow *self)
        
 }
 
-static void 
-osso_display_event_cb (osso_display_state_t state, 
-                      gpointer data)
-{
-       ModestFolderWindowPrivate *priv = MODEST_FOLDER_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_folder_window_new (TnyFolderStoreQuery *query)
 {
@@ -273,12 +257,6 @@ modest_folder_window_new (TnyFolderStoreQuery *query)
                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,
@@ -305,18 +283,6 @@ modest_folder_window_new (TnyFolderStoreQuery *query)
        return MODEST_WINDOW(self);
 }
 
-gboolean
-modest_folder_window_screen_is_on (ModestFolderWindow *self)
-{
-       ModestFolderWindowPrivate *priv = NULL;
-
-       g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(self), FALSE);
-
-       priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
-       
-       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
-}
-
 ModestFolderView *
 modest_folder_window_get_folder_view (ModestFolderWindow *self)
 {
index bed9327..07352bf 100644 (file)
@@ -87,9 +87,6 @@ struct _ModestHeaderWindowPrivate {
        GSList *sighandlers;
        gulong queue_change_handler;
 
-       /* Display state */
-       osso_display_state_t display_state;
-
        /* progress hint */
        gboolean progress_hint;
 };
@@ -211,7 +208,6 @@ modest_header_window_init (ModestHeaderWindow *obj)
        priv = MODEST_HEADER_WINDOW_GET_PRIVATE(obj);
 
        priv->sighandlers = NULL;
-       priv->display_state = OSSO_DISPLAY_ON;
        
        priv->header_view = NULL;
        priv->empty_view = NULL;
@@ -318,19 +314,6 @@ connect_signals (ModestHeaderWindow *self)
                                  self);
 }
 
-static void 
-osso_display_event_cb (osso_display_state_t state, 
-                      gpointer data)
-{
-       ModestHeaderWindowPrivate *priv = MODEST_HEADER_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);
-}
-
 static GtkWidget *
 create_header_view (ModestWindow *progress_window, TnyFolder *folder)
 {
@@ -432,12 +415,6 @@ modest_header_window_new (TnyFolder *folder)
                g_free (folder_name);
        }
 
-       /* 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,
@@ -459,18 +436,6 @@ modest_header_window_new (TnyFolder *folder)
        return MODEST_WINDOW(self);
 }
 
-gboolean
-modest_header_window_screen_is_on (ModestHeaderWindow *self)
-{
-       ModestHeaderWindowPrivate *priv = NULL;
-
-       g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(self), FALSE);
-
-       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
-       
-       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
-}
-
 ModestHeaderView *
 modest_header_window_get_header_view (ModestHeaderWindow *self)
 {
index d30af5d..0ea0451 100644 (file)
@@ -42,6 +42,7 @@
 #include "modest-tny-folder.h"
 #include "modest-folder-window.h"
 #include "modest-accounts-window.h"
+#include <modest-maemo-utils.h>
 
 /* 'private'/'protected' functions */
 static void modest_hildon2_window_mgr_class_init (ModestHildon2WindowMgrClass *klass);
@@ -78,6 +79,9 @@ static gboolean window_can_close (ModestWindow *window);
 static gboolean window_has_modals (ModestWindow *window);
 static ModestWindow *modest_hildon2_window_mgr_show_initial_window (ModestWindowMgr *self);
 static ModestWindow *modest_hildon2_window_mgr_get_current_top (ModestWindowMgr *self);
+static gboolean modest_hildon2_window_mgr_screen_is_on (ModestWindowMgr *self);
+static void osso_display_event_cb (osso_display_state_t state, 
+                                  gpointer data);
 
 typedef struct _ModestHildon2WindowMgrPrivate ModestHildon2WindowMgrPrivate;
 struct _ModestHildon2WindowMgrPrivate {
@@ -95,6 +99,9 @@ struct _ModestHildon2WindowMgrPrivate {
 
        GSList       *modal_handler_uids;
        ModestWindow *current_top;
+
+       /* Display state */
+       osso_display_state_t display_state;
 };
 #define MODEST_HILDON2_WINDOW_MGR_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                                                   MODEST_TYPE_HILDON2_WINDOW_MGR, \
@@ -150,6 +157,7 @@ modest_hildon2_window_mgr_class_init (ModestHildon2WindowMgrClass *klass)
        mgr_class->close_all_windows = modest_hildon2_window_mgr_close_all_windows;
        mgr_class->show_initial_window = modest_hildon2_window_mgr_show_initial_window;
        mgr_class->get_current_top = modest_hildon2_window_mgr_get_current_top;
+       mgr_class->screen_is_on = modest_hildon2_window_mgr_screen_is_on;
 
        g_type_class_add_private (gobject_class, sizeof(ModestHildon2WindowMgrPrivate));
 
@@ -177,6 +185,14 @@ modest_hildon2_window_mgr_instance_init (ModestHildon2WindowMgr *obj)
        priv->closing_time = 0;
 
        priv->modal_handler_uids = NULL;
+       priv->display_state = OSSO_DISPLAY_ON;
+
+       /* 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,
+                                     obj); 
+
 }
 
 static void
@@ -187,6 +203,9 @@ modest_hildon2_window_mgr_finalize (GObject *obj)
        modest_signal_mgr_disconnect_all_and_destroy (priv->window_state_uids);
        priv->window_state_uids = NULL;
 
+       osso_hw_set_display_event_cb (modest_maemo_utils_get_osso_context (),
+                                     NULL,
+                                     NULL); 
        if (priv->window_list) {
                GList *iter = priv->window_list;
                /* unregister pending windows */
@@ -756,3 +775,29 @@ modest_hildon2_window_mgr_get_folder_window (ModestHildon2WindowMgr *self)
 
        return (window != NULL) ? MODEST_WINDOW (window->data) : NULL;
 }
+
+static gboolean
+modest_hildon2_window_mgr_screen_is_on (ModestWindowMgr *self)
+{
+       ModestHildon2WindowMgrPrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_HILDON2_WINDOW_MGR (self), FALSE);
+
+       priv = MODEST_HILDON2_WINDOW_MGR_GET_PRIVATE (self);
+       
+       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
+}
+
+static void 
+osso_display_event_cb (osso_display_state_t state, 
+                      gpointer data)
+{
+       ModestHildon2WindowMgrPrivate *priv = MODEST_HILDON2_WINDOW_MGR_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);
+}
+
index cba3df5..19c8883 100644 (file)
@@ -1386,11 +1386,13 @@ modest_platform_set_update_interval (guint minutes)
 void
 modest_platform_push_email_notification(void)
 {
-       gboolean screen_on = TRUE, app_in_foreground;
+       gboolean screen_on, app_in_foreground;
 
        /* Get the window status */
        app_in_foreground = hildon_program_get_is_topmost (hildon_program_get_instance ());
 
+       screen_on = modest_window_mgr_screen_is_on (modest_runtime_get_window_mgr ());
+
        /* If the screen is on and the app is in the
           foreground we don't show anything */
        if (!(screen_on && app_in_foreground)) {
index 01a2434..2a56f3b 100644 (file)
@@ -86,6 +86,7 @@ static gboolean modest_hildon1_window_mgr_find_registered_header (ModestWindowMg
 static GList *modest_hildon1_window_mgr_get_window_list (ModestWindowMgr *self);
 static gboolean modest_hildon1_window_mgr_close_all_windows (ModestWindowMgr *self);
 static ModestWindow *modest_hildon1_window_mgr_get_current_top (ModestWindowMgr *self);
+static gboolean modest_hildon1_window_mgr_screen_is_on (ModestWindowMgr *self);
 
 typedef struct _ModestHildon1WindowMgrPrivate ModestHildon1WindowMgrPrivate;
 struct _ModestHildon1WindowMgrPrivate {
@@ -157,6 +158,7 @@ modest_hildon1_window_mgr_class_init (ModestHildon1WindowMgrClass *klass)
        mgr_class->get_window_list = modest_hildon1_window_mgr_get_window_list;
        mgr_class->close_all_windows = modest_hildon1_window_mgr_close_all_windows;
        mgr_class->get_current_top = modest_hildon1_window_mgr_get_current_top;
+       mgr_class->screen_is_on = modest_hildon1_window_mgr_screen_is_on;
 
        g_type_class_add_private (gobject_class, sizeof(ModestHildon1WindowMgrPrivate));
 
@@ -1036,3 +1038,19 @@ modest_hildon1_window_mgr_get_current_top (ModestWindowMgr *self)
 
        return priv->current_top;
 }
+
+static gboolean
+modest_hildon1_window_mgr_screen_is_on (ModestWindowMgr *self)
+{
+       ModestHildon1WindowMgrPrivate *priv;
+       ModestWindow *main_window;
+
+       priv = MODEST_HILDON1_WINDOW_MGR_GET_PRIVATE (self);
+
+       main_window = modest_window_mgr_get_main_window (self, FALSE);
+       if (main_window && MODEST_IS_MAIN_WINDOW (main_window)) {
+               return modest_main_window_screen_is_on (MODEST_MAIN_WINDOW (main_window));
+       } else {
+               return TRUE;
+       }
+}
index 228e036..6566de0 100644 (file)
@@ -68,6 +68,7 @@ static gboolean modest_window_mgr_find_registered_header_default (ModestWindowMg
 static GList *modest_window_mgr_get_window_list_default (ModestWindowMgr *self);
 static ModestWindow *modest_window_mgr_show_initial_window_default (ModestWindowMgr *self);
 static ModestWindow *modest_window_mgr_get_current_top_default (ModestWindowMgr *self);
+static gboolean modest_window_mgr_screen_is_on_default (ModestWindowMgr *self);
 
 /* list my signals  */
 enum {
@@ -149,6 +150,7 @@ modest_window_mgr_class_init (ModestWindowMgrClass *klass)
        mgr_class->get_window_list = modest_window_mgr_get_window_list_default;
        mgr_class->show_initial_window = modest_window_mgr_show_initial_window_default;
        mgr_class->get_current_top = modest_window_mgr_get_current_top_default;
+       mgr_class->screen_is_on = modest_window_mgr_screen_is_on_default;
 
        g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate));
 
@@ -877,3 +879,17 @@ modest_window_mgr_get_current_top_default (ModestWindowMgr *self)
 {
        g_return_val_if_reached (NULL);
 }
+
+gboolean
+modest_window_mgr_screen_is_on (ModestWindowMgr *self)
+{
+       return MODEST_WINDOW_MGR_GET_CLASS (self)->screen_is_on (self);
+}
+
+static gboolean
+modest_window_mgr_screen_is_on_default (ModestWindowMgr *self)
+{
+       /* Default implementation is assuming screen is always on */
+
+       return TRUE;
+}
index 34a87ef..bd82e2e 100644 (file)
@@ -79,6 +79,7 @@ struct _ModestWindowMgrClass {
        GList *               (*get_window_list)                (ModestWindowMgr *self);
        ModestWindow *        (*show_initial_window)            (ModestWindowMgr *self);
        ModestWindow *        (*get_current_top)                (ModestWindowMgr *self);
+       gboolean              (*screen_is_on)                   (ModestWindowMgr *self);
        /* Signals */
        void (*window_list_empty) (ModestWindowMgr *self);
 };
@@ -403,6 +404,16 @@ ModestWindow* modest_window_mgr_show_initial_window (ModestWindowMgr *self);
  **/
 ModestWindow* modest_window_mgr_get_current_top (ModestWindowMgr *self);
 
+/**
+ * modest_window_mgr_screen_is_on:
+ * @self: a #ModestWindowMgr
+ *
+ * this function returns if device display is on or not
+ *
+ * Returns: %TRUE if screen is on, %FALSE if not
+ */
+gboolean modest_window_mgr_screen_is_on (ModestWindowMgr *self);
+
 G_END_DECLS
 
 #endif /* __MODEST_WINDOW_MGR_H__ */