1 /* Copyright (c) 2006,2007 Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include "modest-window-mgr.h"
32 #include "modest-runtime.h"
33 #include "modest-tny-folder.h"
34 #include "modest-ui-actions.h"
35 #include "modest-platform.h"
36 #include "widgets/modest-main-window.h"
37 #include "widgets/modest-msg-edit-window.h"
38 #include "widgets/modest-msg-view-window.h"
41 /* 'private'/'protected' functions */
42 static void modest_window_mgr_class_init (ModestWindowMgrClass *klass);
43 static void modest_window_mgr_init (ModestWindowMgr *obj);
44 static void modest_window_mgr_finalize (GObject *obj);
46 static gboolean on_window_destroy (ModestWindow *window,
48 ModestWindowMgr *self);
57 typedef struct _ModestWindowMgrPrivate ModestWindowMgrPrivate;
58 struct _ModestWindowMgrPrivate {
60 ModestWindow *main_window;
61 gboolean fullscreen_mode;
62 gboolean show_toolbars;
63 gboolean show_toolbars_fullscreen;
65 GSList *windows_that_prevent_hibernation;
66 GSList *preregistered_uids;
67 GHashTable *destroy_handlers;
68 GHashTable *viewer_handlers;
72 #define MODEST_WINDOW_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
73 MODEST_TYPE_WINDOW_MGR, \
74 ModestWindowMgrPrivate))
76 static GObjectClass *parent_class = NULL;
78 /* uncomment the following if you have defined any signals */
79 /* static guint signals[LAST_SIGNAL] = {0}; */
82 modest_window_mgr_get_type (void)
84 static GType my_type = 0;
86 static const GTypeInfo my_info = {
87 sizeof(ModestWindowMgrClass),
89 NULL, /* base finalize */
90 (GClassInitFunc) modest_window_mgr_class_init,
91 NULL, /* class finalize */
92 NULL, /* class data */
93 sizeof(ModestWindowMgr),
95 (GInstanceInitFunc) modest_window_mgr_init,
98 my_type = g_type_register_static (G_TYPE_OBJECT,
106 modest_window_mgr_class_init (ModestWindowMgrClass *klass)
108 GObjectClass *gobject_class;
109 gobject_class = (GObjectClass*) klass;
111 parent_class = g_type_class_peek_parent (klass);
112 gobject_class->finalize = modest_window_mgr_finalize;
114 g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate));
118 modest_window_mgr_init (ModestWindowMgr *obj)
120 ModestWindowMgrPrivate *priv;
122 priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
123 priv->window_list = NULL;
124 priv->main_window = NULL;
125 priv->fullscreen_mode = FALSE;
127 priv->preregistered_uids = NULL;
129 /* Could not initialize it from gconf, singletons are not
131 priv->show_toolbars = FALSE;
132 priv->show_toolbars_fullscreen = FALSE;
133 priv->destroy_handlers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
134 priv->viewer_handlers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
136 priv->closing_time = 0;
140 modest_window_mgr_finalize (GObject *obj)
142 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
144 if (priv->window_list) {
145 GList *iter = priv->window_list;
146 /* unregister pending windows */
148 modest_window_mgr_unregister_window (MODEST_WINDOW_MGR (obj),
149 MODEST_WINDOW (iter->data));
150 iter = g_list_next (iter);
152 g_list_free (priv->window_list);
153 priv->window_list = NULL;
156 g_slist_foreach (priv->preregistered_uids, (GFunc)g_free, NULL);
157 g_slist_free (priv->preregistered_uids);
160 /* Free the hash table with the handlers */
161 if (priv->destroy_handlers) {
162 g_hash_table_destroy (priv->destroy_handlers);
163 priv->destroy_handlers = NULL;
166 if (priv->viewer_handlers) {
167 g_hash_table_destroy (priv->viewer_handlers);
168 priv->viewer_handlers = NULL;
171 /* Do not unref priv->main_window because it does not hold a
174 G_OBJECT_CLASS(parent_class)->finalize (obj);
178 modest_window_mgr_new (void)
180 return MODEST_WINDOW_MGR(g_object_new(MODEST_TYPE_WINDOW_MGR, NULL));
186 /* do we have uid? */
188 has_uid (GSList *list, const gchar *uid)
190 GSList *cursor = list;
196 if (cursor->data && strcmp (cursor->data, uid) == 0)
198 cursor = g_slist_next (cursor);
204 /* remove all from the list have have uid = uid */
206 remove_uid (GSList *list, const gchar *uid)
208 GSList *cursor = list, *start = list;
214 GSList *next = g_slist_next (cursor);
215 if (cursor->data && strcmp (cursor->data, uid) == 0) {
216 g_free (cursor->data);
217 start = g_slist_delete_link (start, cursor);
226 append_uid (GSList *list, const gchar *uid)
228 return g_slist_append (list, g_strdup(uid));
234 modest_window_mgr_register_header (ModestWindowMgr *self, TnyHeader *header)
236 ModestWindowMgrPrivate *priv;
239 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
240 g_return_if_fail (TNY_IS_HEADER(header));
242 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
243 uid = modest_tny_folder_get_header_unique_id (header);
246 if (!has_uid (priv->preregistered_uids, uid)) {
247 g_debug ("registering new uid %s", uid);
248 priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
250 g_debug ("already had uid %s", uid);
256 modest_window_mgr_unregister_header (ModestWindowMgr *self, TnyHeader *header)
258 ModestWindowMgrPrivate *priv;
261 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
262 g_return_if_fail (TNY_IS_HEADER(header));
264 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
265 uid = modest_tny_folder_get_header_unique_id (header);
267 if (!has_uid (priv->preregistered_uids, uid)) {
268 g_debug ("trying to unregister non-existing uid %s", uid);
269 priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
271 g_debug ("unregistering uid %s", uid);
273 if (has_uid (priv->preregistered_uids, uid)) {
274 priv->preregistered_uids = remove_uid (priv->preregistered_uids, uid);
275 if (has_uid (priv->preregistered_uids, uid))
276 g_debug ("BUG: uid %s NOT removed", uid);
278 g_debug ("uid %s removed", uid);
285 compare_msguids (ModestWindow *win,
288 const gchar *msg_uid;
290 if ((!MODEST_IS_MSG_EDIT_WINDOW (win)) && (!MODEST_IS_MSG_VIEW_WINDOW (win)))
293 /* Get message uid from msg window */
294 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
295 msg_uid = modest_msg_edit_window_get_message_uid (MODEST_MSG_EDIT_WINDOW (win));
297 msg_uid = modest_msg_view_window_get_message_uid (MODEST_MSG_VIEW_WINDOW (win));
300 if (msg_uid && uid &&!strcmp (msg_uid, uid))
309 modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *header,
312 ModestWindowMgrPrivate *priv;
314 gboolean has_header, has_window = FALSE;
317 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
318 g_return_val_if_fail (TNY_IS_HEADER(header), FALSE);
320 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
322 uid = modest_tny_folder_get_header_unique_id (header);
327 /* g_debug ("windows in list: %d", g_list_length (priv->window_list)); */
328 /* g_debug ("headers in list: %d", g_slist_length (priv->preregistered_uids)); */
330 has_header = has_uid (priv->preregistered_uids, uid);
332 item = g_list_find_custom (priv->window_list, uid, (GCompareFunc) compare_msguids);
336 if ((!MODEST_IS_MSG_VIEW_WINDOW(item->data)) &&
337 (!MODEST_IS_MSG_EDIT_WINDOW (item->data)))
338 g_debug ("not a valid window!");
340 g_debug ("found a window");
341 *win = MODEST_WINDOW (item->data);
347 return has_header || has_window;
353 modest_window_mgr_register_window (ModestWindowMgr *self,
354 ModestWindow *window)
356 static gboolean first_time = TRUE;
359 ModestWindowMgrPrivate *priv;
362 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
363 g_return_if_fail (MODEST_IS_WINDOW (window));
365 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
367 win = g_list_find (priv->window_list, window);
369 g_warning ("Trying to register an already registered window");
373 /* Check that it's not a second main window */
374 if (MODEST_IS_MAIN_WINDOW (window)) {
375 if (priv->main_window) {
376 g_warning ("Trying to register a second main window");
379 priv->main_window = window;
383 /* remove from the list of pre-registered uids */
384 if (MODEST_IS_MSG_VIEW_WINDOW(window)) {
385 const gchar *uid = modest_msg_view_window_get_message_uid
386 (MODEST_MSG_VIEW_WINDOW (window));
388 g_debug ("registering window for %s", uid);
390 if (!has_uid (priv->preregistered_uids, uid))
391 g_debug ("weird: no uid for window (%s)", uid);
393 priv->preregistered_uids =
394 remove_uid (priv->preregistered_uids,
395 modest_msg_view_window_get_message_uid
396 (MODEST_MSG_VIEW_WINDOW (window)));
397 } else if (MODEST_IS_MSG_EDIT_WINDOW(window)) {
398 const gchar *uid = modest_msg_edit_window_get_message_uid
399 (MODEST_MSG_EDIT_WINDOW (window));
401 g_debug ("registering window for %s", uid);
403 if (!has_uid (priv->preregistered_uids, uid))
404 g_debug ("weird: no uid for window (%s)", uid);
406 priv->preregistered_uids =
407 remove_uid (priv->preregistered_uids,
408 modest_msg_edit_window_get_message_uid
409 (MODEST_MSG_EDIT_WINDOW (window)));
412 /* Add to list. Keep a reference to the window */
413 g_object_ref (window);
414 priv->window_list = g_list_prepend (priv->window_list, window);
416 /* Listen to object destruction */
417 handler_id = g_malloc0 (sizeof (gint));
418 *handler_id = g_signal_connect (window, "delete-event", G_CALLBACK (on_window_destroy), self);
419 g_hash_table_insert (priv->destroy_handlers, window, handler_id);
421 /* If there is a msg view window, let the main window listen the msg-changed signal */
422 if (MODEST_IS_MSG_VIEW_WINDOW(window) && priv->main_window) {
424 handler = g_malloc0 (sizeof (gulong));
425 *handler = g_signal_connect (window, "msg-changed",
426 G_CALLBACK (modest_main_window_on_msg_view_window_msg_changed),
428 g_hash_table_insert (priv->viewer_handlers, window, handler);
431 /* Put into fullscreen if needed */
432 if (priv->fullscreen_mode)
433 gtk_window_fullscreen (GTK_WINDOW (window));
437 ModestConf *conf = modest_runtime_get_conf ();
438 priv->show_toolbars =
439 modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR, NULL);
440 priv->show_toolbars_fullscreen =
441 modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL);
445 /* Show/hide toolbar */
446 if (priv->fullscreen_mode)
447 show = priv->show_toolbars_fullscreen;
449 show = priv->show_toolbars;
450 modest_window_show_toolbar (window, show);
454 on_window_destroy (ModestWindow *window,
456 ModestWindowMgr *self)
458 /* Specific stuff first */
459 if (MODEST_IS_MAIN_WINDOW (window)) {
460 ModestWindowMgrPrivate *priv;
461 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
463 /* If more than one window already opened */
464 if (g_list_length (priv->window_list) > 1) {
466 /* If the user wants to close all the windows */
467 if (modest_main_window_close_all (MODEST_MAIN_WINDOW (window))) {
468 GList *iter = priv->window_list;
470 if (iter->data != window) {
471 GList *tmp = iter->next;
472 on_window_destroy (MODEST_WINDOW (iter->data),
477 iter = g_list_next (iter);
484 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
485 gboolean sent = FALSE;
486 gint response = GTK_RESPONSE_ACCEPT;
487 sent = modest_msg_edit_window_get_sent (MODEST_MSG_EDIT_WINDOW (window));
488 /* Save currently edited message to Drafts if it was not sent */
489 if (!sent && modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (window))) {
492 modest_platform_run_confirmation_dialog (GTK_WINDOW (window),
493 _("mcen_nc_no_email_message_modified_save_changes"));
495 if (response != GTK_RESPONSE_CANCEL)
496 modest_ui_actions_on_save_to_drafts (NULL, MODEST_MSG_EDIT_WINDOW (window));
502 /* Save configuration state (TODO: why edit window does not require this function ?) */
503 if (!MODEST_IS_MSG_EDIT_WINDOW (window))
504 modest_window_save_state (MODEST_WINDOW(window));
507 /* Unregister window */
508 modest_window_mgr_unregister_window (self, window);
514 disconnect_msg_changed (gpointer key,
520 handler_id = (gulong *) value;
521 g_signal_handler_disconnect (G_OBJECT (key), *handler_id);
526 /* interval before retrying to close the application */
527 #define CLOSING_RETRY_INTERVAL 3000
528 /* interval before cancel whatever is left in the queue, and closing anyway */
529 #define MAX_WAIT_FOR_CLOSING 30 * 1000
532 on_quit_maybe (ModestWindowMgr *self)
534 ModestWindowMgrPrivate *priv;
537 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
539 /* it seems, in the meantime some windows were
540 * created. in that case, stop 'on_quit_maybe' */
541 if (priv->window_list) {
542 priv->closing_time = 0;
546 if (priv->closing_time >= MAX_WAIT_FOR_CLOSING) {
547 /* we waited long enough: cancel all remaining operations */
548 g_debug ("%s: we waited long enough (%ds), cancelling queue and quiting",
549 __FUNCTION__, priv->closing_time/1000);
550 /* FIXME: below gives me a lot of:
551 * GLIB CRITICAL ** default - modest_mail_operation_cancel:
552 * assertion `priv->account' failed
553 * which means there is no account for the given operation
554 * so, we're not trying to be nice, we're just quiting.
556 //modest_mail_operation_queue_cancel_all
557 // (modest_runtime_get_mail_operation_queue());
560 /* if there is anything left in our operation queue,
563 queue_num = modest_mail_operation_queue_num_elements
564 (modest_runtime_get_mail_operation_queue());
566 g_debug ("%s: waiting, there are still %d operation(s) queued",
567 __FUNCTION__, queue_num);
568 priv->closing_time += CLOSING_RETRY_INTERVAL;
573 /* so: no windows left, nothing in the queue: quit */
574 priv->closing_time = 0;
581 modest_window_mgr_unregister_window (ModestWindowMgr *self,
582 ModestWindow *window)
585 ModestWindowMgrPrivate *priv;
586 gulong *tmp, handler_id;
588 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
589 g_return_if_fail (MODEST_IS_WINDOW (window));
591 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
593 win = g_list_find (priv->window_list, window);
595 g_warning ("Trying to unregister a window that has not being registered yet");
599 /* If it's the main window unset it */
600 if (priv->main_window == window) {
601 priv->main_window = NULL;
603 /* Disconnect all emissions of msg-changed */
604 g_hash_table_foreach (priv->viewer_handlers,
605 disconnect_msg_changed,
607 g_hash_table_destroy (priv->viewer_handlers);
608 priv->viewer_handlers = NULL;
611 /* Remove the viewer window handler from the hash table. The
612 HashTable could not exist if the main window was closeed
613 when there were other windows remaining */
614 if (MODEST_IS_MSG_VIEW_WINDOW (window) && priv->viewer_handlers) {
615 tmp = (gulong *) g_hash_table_lookup (priv->viewer_handlers, window);
616 g_signal_handler_disconnect (window, *tmp);
617 g_hash_table_remove (priv->viewer_handlers, window);
621 modest_window_save_state (window);
623 /* Remove from list & hash table */
624 priv->window_list = g_list_remove_link (priv->window_list, win);
625 tmp = g_hash_table_lookup (priv->destroy_handlers, window);
627 g_hash_table_remove (priv->destroy_handlers, window);
629 /* Disconnect the "delete-event" handler, we won't need it anymore */
630 g_signal_handler_disconnect (window, handler_id);
632 /* Disconnect all the window signals */
633 modest_window_disconnect_signals (window);
635 /* Destroy the window */
636 gtk_widget_destroy (win->data);
638 /* If there are no more windows registered then exit program */
639 if (priv->window_list == NULL) {
641 ModestConf *conf = modest_runtime_get_conf ();
642 /* Save show toolbar status */
643 modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN,
644 priv->show_toolbars_fullscreen, NULL);
645 modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR,
646 priv->show_toolbars, NULL);
648 g_timeout_add (CLOSING_RETRY_INTERVAL,
649 (GSourceFunc)on_quit_maybe, self);
656 modest_window_mgr_set_fullscreen_mode (ModestWindowMgr *self,
659 ModestWindowMgrPrivate *priv;
662 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
664 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
666 /* If there is no change do nothing */
667 if (priv->fullscreen_mode == on)
670 priv->fullscreen_mode = on;
673 win = priv->window_list;
676 gtk_window_fullscreen (GTK_WINDOW (win->data));
677 modest_window_show_toolbar (MODEST_WINDOW (win->data),
678 priv->show_toolbars_fullscreen);
680 gtk_window_unfullscreen (GTK_WINDOW (win->data));
681 modest_window_show_toolbar (MODEST_WINDOW (win->data),
682 priv->show_toolbars);
684 win = g_list_next (win);
689 modest_window_mgr_get_fullscreen_mode (ModestWindowMgr *self)
691 ModestWindowMgrPrivate *priv;
693 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
695 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
697 return priv->fullscreen_mode;
701 modest_window_mgr_show_toolbars (ModestWindowMgr *self,
702 gboolean show_toolbars,
705 ModestWindowMgrPrivate *priv;
707 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
709 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
711 /* If nothing changes then return. Otherwise cache it, do not
712 save to GConf for the moment, it will be done when all
713 windows become unregistered in order to avoid unnecessary
716 if (priv->show_toolbars_fullscreen == show_toolbars)
719 priv->show_toolbars_fullscreen = show_toolbars;
721 if (priv->show_toolbars == show_toolbars)
724 priv->show_toolbars = show_toolbars;
727 /* Apply now if the view mode is the right one */
728 if ((fullscreen && priv->fullscreen_mode) ||
729 (!fullscreen && !priv->fullscreen_mode)) {
731 GList *win = priv->window_list;
734 modest_window_show_toolbar (MODEST_WINDOW (win->data),
736 win = g_list_next (win);
742 modest_window_mgr_get_main_window (ModestWindowMgr *self)
744 ModestWindowMgrPrivate *priv;
746 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
747 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
749 /* create the main window, if it hasn't been created yet */
750 if (!priv->main_window) {
751 g_debug ("%s: creating main window\n", __FUNCTION__);
752 modest_window_mgr_register_window (self, modest_main_window_new ());
755 return priv->main_window;
759 on_nonhibernating_window_hide(GtkWidget *widget, gpointer user_data)
761 ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
762 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
764 /* Forget this window,
765 * so hibernation will be allowed again if no windows are remembered: */
766 priv->windows_that_prevent_hibernation =
767 g_slist_remove (priv->windows_that_prevent_hibernation, GTK_WINDOW(widget));
771 on_nonhibernating_window_show(GtkWidget *widget, gpointer user_data)
773 ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
774 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
776 GtkWindow *window = GTK_WINDOW (widget);
778 priv->windows_that_prevent_hibernation =
779 g_slist_append (priv->windows_that_prevent_hibernation, window);
781 /* Allow hibernation again when the window has been hidden: */
782 g_signal_connect (window, "hide",
783 G_CALLBACK (on_nonhibernating_window_hide), self);
786 void modest_window_mgr_prevent_hibernation_while_window_is_shown (ModestWindowMgr *self,
789 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
791 if (GTK_WIDGET_VISIBLE(window)) {
792 on_nonhibernating_window_show (GTK_WIDGET (window), self);
794 /* Wait for it to be shown: */
795 g_signal_connect (window, "show",
796 G_CALLBACK (on_nonhibernating_window_show), self);
800 gboolean modest_window_mgr_get_hibernation_is_prevented (ModestWindowMgr *self)
802 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
804 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
806 /* Prevent hibernation if any open windows are currently
807 * preventing hibernation: */
808 return (g_slist_length (priv->windows_that_prevent_hibernation) > 0);
812 void modest_window_mgr_save_state_for_all_windows (ModestWindowMgr *self)
814 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
816 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
818 /* Iterate over all windows */
819 GList *win = priv->window_list;
821 ModestWindow *window = MODEST_WINDOW (win->data);
823 /* This calls the vfunc,
824 * so each window can do its own thing: */
825 modest_window_save_state (window);
828 win = g_list_next (win);