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 {
61 ModestWindow *main_window;
62 GtkDialog *easysetup_dialog;
64 gboolean fullscreen_mode;
65 gboolean show_toolbars;
66 gboolean show_toolbars_fullscreen;
68 GSList *windows_that_prevent_hibernation;
69 GSList *preregistered_uids;
70 GHashTable *destroy_handlers;
71 GHashTable *viewer_handlers;
75 #define MODEST_WINDOW_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
76 MODEST_TYPE_WINDOW_MGR, \
77 ModestWindowMgrPrivate))
79 static GObjectClass *parent_class = NULL;
81 /* uncomment the following if you have defined any signals */
82 /* static guint signals[LAST_SIGNAL] = {0}; */
85 modest_window_mgr_get_type (void)
87 static GType my_type = 0;
89 static const GTypeInfo my_info = {
90 sizeof(ModestWindowMgrClass),
92 NULL, /* base finalize */
93 (GClassInitFunc) modest_window_mgr_class_init,
94 NULL, /* class finalize */
95 NULL, /* class data */
96 sizeof(ModestWindowMgr),
98 (GInstanceInitFunc) modest_window_mgr_init,
101 my_type = g_type_register_static (G_TYPE_OBJECT,
109 modest_window_mgr_class_init (ModestWindowMgrClass *klass)
111 GObjectClass *gobject_class;
112 gobject_class = (GObjectClass*) klass;
114 parent_class = g_type_class_peek_parent (klass);
115 gobject_class->finalize = modest_window_mgr_finalize;
117 g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate));
121 modest_window_mgr_init (ModestWindowMgr *obj)
123 ModestWindowMgrPrivate *priv;
125 priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
126 priv->window_list = NULL;
127 priv->main_window = NULL;
128 priv->fullscreen_mode = FALSE;
129 priv->easysetup_dialog = NULL;
131 priv->preregistered_uids = NULL;
133 /* Could not initialize it from gconf, singletons are not
135 priv->show_toolbars = FALSE;
136 priv->show_toolbars_fullscreen = FALSE;
137 priv->destroy_handlers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
138 priv->viewer_handlers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
140 priv->closing_time = 0;
144 modest_window_mgr_finalize (GObject *obj)
146 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
148 if (priv->window_list) {
149 GList *iter = priv->window_list;
150 /* unregister pending windows */
152 modest_window_mgr_unregister_window (MODEST_WINDOW_MGR (obj),
153 MODEST_WINDOW (iter->data));
154 iter = g_list_next (iter);
156 g_list_free (priv->window_list);
157 priv->window_list = NULL;
160 g_slist_foreach (priv->preregistered_uids, (GFunc)g_free, NULL);
161 g_slist_free (priv->preregistered_uids);
164 /* Free the hash table with the handlers */
165 if (priv->destroy_handlers) {
166 g_hash_table_destroy (priv->destroy_handlers);
167 priv->destroy_handlers = NULL;
170 if (priv->viewer_handlers) {
171 g_hash_table_destroy (priv->viewer_handlers);
172 priv->viewer_handlers = NULL;
175 if (priv->easysetup_dialog) {
176 g_warning ("%s: forgot to destroy an easysetup dialog somewhere",
178 gtk_widget_destroy (GTK_WIDGET(priv->easysetup_dialog));
179 priv->easysetup_dialog = NULL;
182 /* Do not unref priv->main_window because it does not hold a
186 G_OBJECT_CLASS(parent_class)->finalize (obj);
190 modest_window_mgr_new (void)
192 return MODEST_WINDOW_MGR(g_object_new(MODEST_TYPE_WINDOW_MGR, NULL));
198 /* do we have uid? */
200 has_uid (GSList *list, const gchar *uid)
202 GSList *cursor = list;
208 if (cursor->data && strcmp (cursor->data, uid) == 0)
210 cursor = g_slist_next (cursor);
216 /* remove all from the list have have uid = uid */
218 remove_uid (GSList *list, const gchar *uid)
220 GSList *cursor = list, *start = list;
226 GSList *next = g_slist_next (cursor);
227 if (cursor->data && strcmp (cursor->data, uid) == 0) {
228 g_free (cursor->data);
229 start = g_slist_delete_link (start, cursor);
238 append_uid (GSList *list, const gchar *uid)
240 return g_slist_append (list, g_strdup(uid));
246 modest_window_mgr_register_header (ModestWindowMgr *self, TnyHeader *header)
248 ModestWindowMgrPrivate *priv;
251 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
252 g_return_if_fail (TNY_IS_HEADER(header));
254 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
255 uid = modest_tny_folder_get_header_unique_id (header);
258 if (!has_uid (priv->preregistered_uids, uid)) {
259 g_debug ("registering new uid %s", uid);
260 priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
262 g_debug ("already had uid %s", uid);
268 modest_window_mgr_unregister_header (ModestWindowMgr *self, TnyHeader *header)
270 ModestWindowMgrPrivate *priv;
273 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
274 g_return_if_fail (TNY_IS_HEADER(header));
276 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
277 uid = modest_tny_folder_get_header_unique_id (header);
279 if (!has_uid (priv->preregistered_uids, uid)) {
280 g_debug ("trying to unregister non-existing uid %s", uid);
281 priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
283 g_debug ("unregistering uid %s", uid);
285 if (has_uid (priv->preregistered_uids, uid)) {
286 priv->preregistered_uids = remove_uid (priv->preregistered_uids, uid);
287 if (has_uid (priv->preregistered_uids, uid))
288 g_debug ("BUG: uid %s NOT removed", uid);
290 g_debug ("uid %s removed", uid);
297 compare_msguids (ModestWindow *win,
300 const gchar *msg_uid;
302 if ((!MODEST_IS_MSG_EDIT_WINDOW (win)) && (!MODEST_IS_MSG_VIEW_WINDOW (win)))
305 /* Get message uid from msg window */
306 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
307 msg_uid = modest_msg_edit_window_get_message_uid (MODEST_MSG_EDIT_WINDOW (win));
308 if (msg_uid && uid &&!strcmp (msg_uid, uid))
311 msg_uid = modest_msg_view_window_get_message_uid (MODEST_MSG_VIEW_WINDOW (win));
314 if (msg_uid && uid &&!strcmp (msg_uid, uid))
322 modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *header,
325 ModestWindowMgrPrivate *priv;
327 gboolean has_header, has_window = FALSE;
330 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
331 g_return_val_if_fail (TNY_IS_HEADER(header), FALSE);
333 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
335 uid = modest_tny_folder_get_header_unique_id (header);
340 has_header = has_uid (priv->preregistered_uids, uid);
342 item = g_list_find_custom (priv->window_list, uid, (GCompareFunc) compare_msguids);
346 if ((!MODEST_IS_MSG_VIEW_WINDOW(item->data)) &&
347 (!MODEST_IS_MSG_EDIT_WINDOW (item->data)))
348 g_debug ("not a valid window!");
350 g_debug ("found a window");
351 *win = MODEST_WINDOW (item->data);
357 return has_header || has_window;
363 modest_window_mgr_register_window (ModestWindowMgr *self,
364 ModestWindow *window)
366 static gboolean first_time = TRUE;
369 ModestWindowMgrPrivate *priv;
372 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
373 g_return_if_fail (GTK_IS_WINDOW (window));
375 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
377 win = g_list_find (priv->window_list, window);
379 g_warning ("%s: trying to re-register a window",
384 /* Check that it's not a second main window */
385 if (MODEST_IS_MAIN_WINDOW (window)) {
386 if (priv->main_window) {
387 g_warning ("%s: trying to register a second main window",
391 priv->main_window = window;
395 /* remove from the list of pre-registered uids */
396 if (MODEST_IS_MSG_VIEW_WINDOW(window)) {
397 const gchar *uid = modest_msg_view_window_get_message_uid
398 (MODEST_MSG_VIEW_WINDOW (window));
400 if (!has_uid (priv->preregistered_uids, uid))
401 g_debug ("weird: no uid for window (%s)", uid);
403 g_debug ("registering window for %s", uid ? uid : "<none>");
405 priv->preregistered_uids =
406 remove_uid (priv->preregistered_uids,
407 modest_msg_view_window_get_message_uid
408 (MODEST_MSG_VIEW_WINDOW (window)));
410 } else if (MODEST_IS_MSG_EDIT_WINDOW(window)) {
411 const gchar *uid = modest_msg_edit_window_get_message_uid
412 (MODEST_MSG_EDIT_WINDOW (window));
414 g_debug ("registering window for %s", uid);
416 priv->preregistered_uids =
417 remove_uid (priv->preregistered_uids,
418 modest_msg_edit_window_get_message_uid
419 (MODEST_MSG_EDIT_WINDOW (window)));
422 /* Add to list. Keep a reference to the window */
423 g_object_ref (window);
424 priv->window_list = g_list_prepend (priv->window_list, window);
426 /* Listen to object destruction */
427 handler_id = g_malloc0 (sizeof (gint));
428 *handler_id = g_signal_connect (window, "delete-event", G_CALLBACK (on_window_destroy), self);
429 g_hash_table_insert (priv->destroy_handlers, window, handler_id);
431 /* If there is a msg view window, let the main window listen the msg-changed signal */
432 if (MODEST_IS_MSG_VIEW_WINDOW(window) && priv->main_window) {
434 handler = g_malloc0 (sizeof (gulong));
435 *handler = g_signal_connect (window, "msg-changed",
436 G_CALLBACK (modest_main_window_on_msg_view_window_msg_changed),
438 g_hash_table_insert (priv->viewer_handlers, window, handler);
441 /* Put into fullscreen if needed */
442 if (priv->fullscreen_mode)
443 gtk_window_fullscreen (GTK_WINDOW (window));
447 ModestConf *conf = modest_runtime_get_conf ();
448 priv->show_toolbars =
449 modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR, NULL);
450 priv->show_toolbars_fullscreen =
451 modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL);
455 /* Show/hide toolbar */
456 if (priv->fullscreen_mode)
457 show = priv->show_toolbars_fullscreen;
459 show = priv->show_toolbars;
460 modest_window_show_toolbar (window, show);
464 on_window_destroy (ModestWindow *window,
466 ModestWindowMgr *self)
468 /* Specific stuff first */
469 if (MODEST_IS_MAIN_WINDOW (window)) {
470 ModestWindowMgrPrivate *priv;
471 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
473 /* If more than one window already opened */
474 if (g_list_length (priv->window_list) > 1) {
476 /* If the user wants to close all the windows */
477 if (modest_main_window_close_all (MODEST_MAIN_WINDOW (window))) {
478 GList *iter = priv->window_list;
480 if (iter->data != window) {
481 GList *tmp = iter->next;
482 on_window_destroy (MODEST_WINDOW (iter->data),
487 iter = g_list_next (iter);
494 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
495 gboolean sent = FALSE;
496 gint response = GTK_RESPONSE_ACCEPT;
497 sent = modest_msg_edit_window_get_sent (MODEST_MSG_EDIT_WINDOW (window));
498 /* Save currently edited message to Drafts if it was not sent */
499 if (!sent && modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (window))) {
502 modest_platform_run_confirmation_dialog (GTK_WINDOW (window),
503 _("mcen_nc_no_email_message_modified_save_changes"));
505 if (response != GTK_RESPONSE_CANCEL)
506 modest_ui_actions_on_save_to_drafts (NULL, MODEST_MSG_EDIT_WINDOW (window));
512 /* Save configuration state (TODO: why edit window does not require this function ?) */
513 if (!MODEST_IS_MSG_EDIT_WINDOW (window))
514 modest_window_save_state (MODEST_WINDOW(window));
517 /* Unregister window */
518 modest_window_mgr_unregister_window (self, window);
524 disconnect_msg_changed (gpointer key,
530 handler_id = (gulong *) value;
531 g_signal_handler_disconnect (G_OBJECT (key), *handler_id);
536 /* interval before retrying to close the application */
537 #define CLOSING_RETRY_INTERVAL 3000
538 /* interval before cancel whatever is left in the queue, and closing anyway */
539 #define MAX_WAIT_FOR_CLOSING 30 * 1000
542 on_quit_maybe (ModestWindowMgr *self)
544 ModestWindowMgrPrivate *priv;
547 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
549 /* it seems, in the meantime some windows were
550 * created. in that case, stop 'on_quit_maybe' */
551 if (priv->window_list) {
552 priv->closing_time = 0;
556 if (priv->closing_time >= MAX_WAIT_FOR_CLOSING) {
557 /* we waited long enough: cancel all remaining operations */
558 g_debug ("%s: we waited long enough (%ds), cancelling queue and quiting",
559 __FUNCTION__, priv->closing_time/1000);
560 /* FIXME: below gives me a lot of:
561 * GLIB CRITICAL ** default - modest_mail_operation_cancel:
562 * assertion `priv->account' failed
563 * which means there is no account for the given operation
564 * so, we're not trying to be nice, we're just quiting.
566 //modest_mail_operation_queue_cancel_all
567 // (modest_runtime_get_mail_operation_queue());
570 /* if there is anything left in our operation queue,
573 queue_num = modest_mail_operation_queue_num_elements
574 (modest_runtime_get_mail_operation_queue());
576 g_debug ("%s: waiting, there are still %d operation(s) queued",
577 __FUNCTION__, queue_num);
578 priv->closing_time += CLOSING_RETRY_INTERVAL;
583 /* so: no windows left, nothing in the queue: quit */
584 priv->closing_time = 0;
591 modest_window_mgr_unregister_window (ModestWindowMgr *self,
592 ModestWindow *window)
595 ModestWindowMgrPrivate *priv;
596 gulong *tmp, handler_id;
598 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
599 g_return_if_fail (MODEST_IS_WINDOW (window));
601 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
603 win = g_list_find (priv->window_list, window);
605 g_warning ("Trying to unregister a window that has not being registered yet");
609 /* If it's the main window unset it */
610 if (priv->main_window == window) {
611 priv->main_window = NULL;
613 /* Disconnect all emissions of msg-changed */
614 if (priv->viewer_handlers) {
615 g_hash_table_foreach (priv->viewer_handlers,
616 disconnect_msg_changed,
618 g_hash_table_destroy (priv->viewer_handlers);
619 priv->viewer_handlers = NULL;
623 /* Remove the viewer window handler from the hash table. The
624 HashTable could not exist if the main window was closeed
625 when there were other windows remaining */
626 if (MODEST_IS_MSG_VIEW_WINDOW (window) && priv->viewer_handlers) {
627 tmp = (gulong *) g_hash_table_lookup (priv->viewer_handlers, window);
628 g_signal_handler_disconnect (window, *tmp);
629 g_hash_table_remove (priv->viewer_handlers, window);
633 modest_window_save_state (window);
635 /* Remove from list & hash table */
636 priv->window_list = g_list_remove_link (priv->window_list, win);
637 tmp = g_hash_table_lookup (priv->destroy_handlers, window);
639 g_hash_table_remove (priv->destroy_handlers, window);
641 /* Disconnect the "delete-event" handler, we won't need it anymore */
642 g_signal_handler_disconnect (window, handler_id);
644 /* Disconnect all the window signals */
645 modest_window_disconnect_signals (window);
647 /* Destroy the window */
648 gtk_widget_destroy (win->data);
650 /* If there are no more windows registered then exit program */
651 if (priv->window_list == NULL) {
653 ModestConf *conf = modest_runtime_get_conf ();
654 /* Save show toolbar status */
655 modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN,
656 priv->show_toolbars_fullscreen, NULL);
657 modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR,
658 priv->show_toolbars, NULL);
660 g_timeout_add (CLOSING_RETRY_INTERVAL,
661 (GSourceFunc)on_quit_maybe, self);
668 modest_window_mgr_set_fullscreen_mode (ModestWindowMgr *self,
671 ModestWindowMgrPrivate *priv;
674 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
676 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
678 /* If there is no change do nothing */
679 if (priv->fullscreen_mode == on)
682 priv->fullscreen_mode = on;
685 win = priv->window_list;
688 gtk_window_fullscreen (GTK_WINDOW (win->data));
689 modest_window_show_toolbar (MODEST_WINDOW (win->data),
690 priv->show_toolbars_fullscreen);
692 gtk_window_unfullscreen (GTK_WINDOW (win->data));
693 modest_window_show_toolbar (MODEST_WINDOW (win->data),
694 priv->show_toolbars);
696 win = g_list_next (win);
701 modest_window_mgr_get_fullscreen_mode (ModestWindowMgr *self)
703 ModestWindowMgrPrivate *priv;
705 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
707 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
709 return priv->fullscreen_mode;
713 modest_window_mgr_show_toolbars (ModestWindowMgr *self,
714 gboolean show_toolbars,
717 ModestWindowMgrPrivate *priv;
719 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
721 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
723 /* If nothing changes then return. Otherwise cache it, do not
724 save to GConf for the moment, it will be done when all
725 windows become unregistered in order to avoid unnecessary
728 if (priv->show_toolbars_fullscreen == show_toolbars)
731 priv->show_toolbars_fullscreen = show_toolbars;
733 if (priv->show_toolbars == show_toolbars)
736 priv->show_toolbars = show_toolbars;
739 /* Apply now if the view mode is the right one */
740 if ((fullscreen && priv->fullscreen_mode) ||
741 (!fullscreen && !priv->fullscreen_mode)) {
743 GList *win = priv->window_list;
746 modest_window_show_toolbar (MODEST_WINDOW (win->data),
748 win = g_list_next (win);
754 modest_window_mgr_get_main_window (ModestWindowMgr *self)
756 ModestWindowMgrPrivate *priv;
758 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
759 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
761 /* create the main window, if it hasn't been created yet */
762 if (!priv->main_window) {
763 /* modest_window_mgr_register_window will set priv->main_window */
764 modest_window_mgr_register_window (self, modest_main_window_new ());
765 g_debug ("%s: created main window: %p\n", __FUNCTION__, priv->main_window);
768 return priv->main_window;
773 modest_window_mgr_get_easysetup_dialog (ModestWindowMgr *self)
775 ModestWindowMgrPrivate *priv;
777 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
778 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
780 return priv->easysetup_dialog;
785 modest_window_mgr_set_easysetup_dialog (ModestWindowMgr *self, GtkDialog *dialog)
787 ModestWindowMgrPrivate *priv;
789 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
790 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
792 return priv->easysetup_dialog = dialog;
797 on_nonhibernating_window_hide(GtkWidget *widget, gpointer user_data)
799 ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
800 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
802 /* Forget this window,
803 * so hibernation will be allowed again if no windows are remembered: */
804 priv->windows_that_prevent_hibernation =
805 g_slist_remove (priv->windows_that_prevent_hibernation, GTK_WINDOW(widget));
809 on_nonhibernating_window_show(GtkWidget *widget, gpointer user_data)
811 ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
812 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
814 GtkWindow *window = GTK_WINDOW (widget);
816 priv->windows_that_prevent_hibernation =
817 g_slist_append (priv->windows_that_prevent_hibernation, window);
819 /* Allow hibernation again when the window has been hidden: */
820 g_signal_connect (window, "hide",
821 G_CALLBACK (on_nonhibernating_window_hide), self);
825 modest_window_mgr_prevent_hibernation_while_window_is_shown (ModestWindowMgr *self,
828 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
830 if (GTK_WIDGET_VISIBLE(window)) {
831 on_nonhibernating_window_show (GTK_WIDGET (window), self);
833 /* Wait for it to be shown: */
834 g_signal_connect (window, "show",
835 G_CALLBACK (on_nonhibernating_window_show), self);
840 modest_window_mgr_get_hibernation_is_prevented (ModestWindowMgr *self)
842 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
844 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
846 /* Prevent hibernation if any open windows are currently
847 * preventing hibernation: */
848 return (g_slist_length (priv->windows_that_prevent_hibernation) > 0);
853 modest_window_mgr_save_state_for_all_windows (ModestWindowMgr *self)
855 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
857 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
859 /* Iterate over all windows */
860 GList *win = priv->window_list;
862 ModestWindow *window = MODEST_WINDOW (win->data);
864 /* This calls the vfunc,
865 * so each window can do its own thing: */
866 modest_window_save_state (window);
869 win = g_list_next (win);