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"
39 #include "modest-debug.h"
42 /* 'private'/'protected' functions */
43 static void modest_window_mgr_class_init (ModestWindowMgrClass *klass);
44 static void modest_window_mgr_init (ModestWindowMgr *obj);
45 static void modest_window_mgr_finalize (GObject *obj);
47 static gboolean modest_window_mgr_register_window_default (ModestWindowMgr *self,
49 ModestWindow *parent);
50 static void modest_window_mgr_unregister_window_default (ModestWindowMgr *self,
51 ModestWindow *window);
52 static void modest_window_mgr_set_fullscreen_mode_default (ModestWindowMgr *self,
54 static gboolean modest_window_mgr_get_fullscreen_mode_default (ModestWindowMgr *self);
55 static void modest_window_mgr_show_toolbars_default (ModestWindowMgr *self,
57 gboolean show_toolbars,
59 static ModestWindow* modest_window_mgr_get_main_window_default (ModestWindowMgr *self, gboolean show);
60 static GtkWindow *modest_window_mgr_get_modal_default (ModestWindowMgr *self);
61 static void modest_window_mgr_set_modal_default (ModestWindowMgr *self,
64 static void modest_window_mgr_close_all_windows_default (ModestWindowMgr *self);
65 static gboolean modest_window_mgr_find_registered_header_default (ModestWindowMgr *self,
68 static GList *modest_window_mgr_get_window_list_default (ModestWindowMgr *self);
72 WINDOW_LIST_EMPTY_SIGNAL,
76 typedef struct _ModestWindowMgrPrivate ModestWindowMgrPrivate;
77 struct _ModestWindowMgrPrivate {
80 ModestWindow *main_window;
82 GSList *windows_that_prevent_hibernation;
83 GSList *preregistered_uids;
87 GtkWidget *cached_view;
88 GtkWidget *cached_editor;
89 guint idle_load_view_id;
90 guint idle_load_editor_id;
93 #define MODEST_WINDOW_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
94 MODEST_TYPE_WINDOW_MGR, \
95 ModestWindowMgrPrivate))
97 static GObjectClass *parent_class = NULL;
99 /* uncomment the following if you have defined any signals */
100 static guint signals[NUM_SIGNALS] = {0};
103 modest_window_mgr_get_type (void)
105 static GType my_type = 0;
107 static const GTypeInfo my_info = {
108 sizeof(ModestWindowMgrClass),
109 NULL, /* base init */
110 NULL, /* base finalize */
111 (GClassInitFunc) modest_window_mgr_class_init,
112 NULL, /* class finalize */
113 NULL, /* class data */
114 sizeof(ModestWindowMgr),
116 (GInstanceInitFunc) modest_window_mgr_init,
119 my_type = g_type_register_static (G_TYPE_OBJECT,
127 modest_window_mgr_class_init (ModestWindowMgrClass *klass)
129 GObjectClass *gobject_class;
130 ModestWindowMgrClass *mgr_class;
132 gobject_class = (GObjectClass*) klass;
133 mgr_class = (ModestWindowMgrClass *) klass;
135 parent_class = g_type_class_peek_parent (klass);
136 gobject_class->finalize = modest_window_mgr_finalize;
137 mgr_class->register_window = modest_window_mgr_register_window_default;
138 mgr_class->unregister_window = modest_window_mgr_unregister_window_default;
139 mgr_class->set_fullscreen_mode = modest_window_mgr_set_fullscreen_mode_default;
140 mgr_class->get_fullscreen_mode = modest_window_mgr_get_fullscreen_mode_default;
141 mgr_class->show_toolbars = modest_window_mgr_show_toolbars_default;
142 mgr_class->get_main_window = modest_window_mgr_get_main_window_default;
143 mgr_class->get_modal = modest_window_mgr_get_modal_default;
144 mgr_class->set_modal = modest_window_mgr_set_modal_default;
145 mgr_class->close_all_windows = modest_window_mgr_close_all_windows_default;
146 mgr_class->find_registered_header = modest_window_mgr_find_registered_header_default;
147 mgr_class->get_window_list = modest_window_mgr_get_window_list_default;
149 g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate));
153 * ModestWindowMgr::window-list-empty
154 * @self: the #ModestWindowMgr that emits the signal
155 * @user_data: user data set when the signal handler was connected
157 * Issued whenever the window list becomes empty
159 signals[WINDOW_LIST_EMPTY_SIGNAL] =
160 g_signal_new ("window-list-empty",
161 G_TYPE_FROM_CLASS (gobject_class),
163 G_STRUCT_OFFSET (ModestWindowMgrClass, window_list_empty),
165 g_cclosure_marshal_VOID__VOID,
170 idle_load_view (ModestWindowMgr *mgr)
172 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (mgr);
174 priv->cached_view = g_object_new (MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
175 priv->idle_load_view_id = 0;
180 idle_load_editor (ModestWindowMgr *mgr)
182 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (mgr);
184 priv->cached_editor = g_object_new (MODEST_TYPE_MSG_EDIT_WINDOW, NULL);
185 priv->idle_load_editor_id = 0;
190 load_new_view (ModestWindowMgr *self)
192 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
193 if ((priv->cached_view == NULL) && (priv->idle_load_view_id == 0))
194 priv->idle_load_view_id = g_idle_add ((GSourceFunc) idle_load_view, self);
198 load_new_editor (ModestWindowMgr *self)
200 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
201 if ((priv->cached_editor == NULL) && (priv->idle_load_editor_id == 0))
202 priv->idle_load_editor_id = g_idle_add ((GSourceFunc) idle_load_editor, self);
206 modest_window_mgr_init (ModestWindowMgr *obj)
208 ModestWindowMgrPrivate *priv;
210 priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
211 priv->banner_counter = 0;
212 priv->main_window = NULL;
214 priv->preregistered_uids = NULL;
216 priv->closing_time = 0;
218 priv->cached_view = NULL;
219 priv->cached_editor = NULL;
223 modest_window_mgr_finalize (GObject *obj)
225 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
227 if (priv->idle_load_view_id > 0) {
228 g_source_remove (priv->idle_load_view_id);
229 priv->idle_load_view_id = 0;
232 if (priv->idle_load_editor_id > 0) {
233 g_source_remove (priv->idle_load_editor_id);
234 priv->idle_load_editor_id = 0;
237 if (priv->cached_view) {
238 gtk_widget_destroy (priv->cached_view);
239 priv->cached_view = NULL;
241 if (priv->cached_editor) {
242 gtk_widget_destroy (priv->cached_editor);
243 priv->cached_editor = NULL;
246 g_slist_foreach (priv->preregistered_uids, (GFunc)g_free, NULL);
247 g_slist_free (priv->preregistered_uids);
249 G_OBJECT_CLASS(parent_class)->finalize (obj);
253 modest_window_mgr_new (void)
255 return MODEST_WINDOW_MGR(g_object_new(MODEST_TYPE_WINDOW_MGR, NULL));
261 /* do we have uid? */
263 has_uid (GSList *list, const gchar *uid)
265 GSList *cursor = list;
271 if (cursor->data && strcmp (cursor->data, uid) == 0)
273 cursor = g_slist_next (cursor);
279 /* remove all from the list have have uid = uid */
281 remove_uid (GSList *list, const gchar *uid)
283 GSList *cursor = list, *start = list;
289 GSList *next = g_slist_next (cursor);
290 if (cursor->data && strcmp (cursor->data, uid) == 0) {
291 g_free (cursor->data);
292 start = g_slist_delete_link (start, cursor);
301 append_uid (GSList *list, const gchar *uid)
303 return g_slist_append (list, g_strdup(uid));
309 modest_window_mgr_register_header (ModestWindowMgr *self, TnyHeader *header, const gchar *alt_uid)
311 ModestWindowMgrPrivate *priv;
314 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
315 g_return_if_fail (TNY_IS_HEADER(header));
317 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
318 uid = modest_tny_folder_get_header_unique_id (header);
321 uid = g_strdup (alt_uid);
323 if (!has_uid (priv->preregistered_uids, uid)) {
324 MODEST_DEBUG_BLOCK(g_debug ("registering new uid %s", uid););
325 priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
327 MODEST_DEBUG_BLOCK(g_debug ("already had uid %s", uid););
333 modest_window_mgr_unregister_header (ModestWindowMgr *self, TnyHeader *header)
335 ModestWindowMgrPrivate *priv;
338 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
339 g_return_if_fail (TNY_IS_HEADER(header));
341 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
342 uid = modest_tny_folder_get_header_unique_id (header);
344 if (!has_uid (priv->preregistered_uids, uid)) {
345 MODEST_DEBUG_BLOCK(g_debug ("trying to unregister non-existing uid %s", uid););
346 priv->preregistered_uids = append_uid (priv->preregistered_uids, uid);
348 MODEST_DEBUG_BLOCK(g_debug ("unregistering uid %s", uid););
350 if (has_uid (priv->preregistered_uids, uid)) {
351 priv->preregistered_uids = remove_uid (priv->preregistered_uids, uid);
352 if (has_uid (priv->preregistered_uids, uid))
353 g_debug ("BUG: uid %s NOT removed", uid);
355 MODEST_DEBUG_BLOCK(g_debug ("uid %s removed", uid););
362 #define MODEST_WINDOW_HELP_ID_PARAM "help-id"
365 modest_window_mgr_register_help_id (ModestWindowMgr *self, GtkWindow *win, const gchar* help_id)
367 /* we don't need 'self', but for API consistency... */
368 g_return_if_fail (self && MODEST_IS_WINDOW_MGR(self));
370 g_return_if_fail (win && GTK_IS_WINDOW(win));
371 g_return_if_fail (help_id);
373 g_object_set_data_full (G_OBJECT(win), MODEST_WINDOW_HELP_ID_PARAM,
374 g_strdup(help_id), g_free);
379 modest_window_mgr_get_help_id (ModestWindowMgr *self, GtkWindow *win)
381 /* we don't need 'self', but for API consistency... */
382 g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR (self), NULL);
383 g_return_val_if_fail (win, NULL);
385 return g_object_get_data (G_OBJECT(win), MODEST_WINDOW_HELP_ID_PARAM);
389 modest_window_mgr_close_all_windows (ModestWindowMgr *self)
391 MODEST_WINDOW_MGR_GET_CLASS (self)->close_all_windows (self);
395 modest_window_mgr_close_all_windows_default (ModestWindowMgr *self)
402 modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *header,
405 return MODEST_WINDOW_MGR_GET_CLASS (self)->find_registered_header (self, header, win);
409 modest_window_mgr_find_registered_header_default (ModestWindowMgr *self, TnyHeader *header,
412 ModestWindowMgrPrivate *priv = NULL;
414 gboolean has_header = FALSE;
416 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
417 g_return_val_if_fail (TNY_IS_HEADER(header), FALSE);
419 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
421 uid = modest_tny_folder_get_header_unique_id (header);
426 has_header = has_uid (priv->preregistered_uids, uid);
432 modest_window_mgr_get_window_list (ModestWindowMgr *self)
434 return MODEST_WINDOW_MGR_GET_CLASS (self)->get_window_list (self);
438 modest_window_mgr_get_window_list_default (ModestWindowMgr *self)
444 modest_window_mgr_register_window (ModestWindowMgr *self,
445 ModestWindow *window,
446 ModestWindow *parent)
448 return MODEST_WINDOW_MGR_GET_CLASS (self)->register_window (self, window, parent);
452 modest_window_mgr_register_window_default (ModestWindowMgr *self,
453 ModestWindow *window,
454 ModestWindow *parent)
456 ModestWindowMgrPrivate *priv;
458 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
459 g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
461 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
463 /* Check that it's not a second main window */
464 if (MODEST_IS_MAIN_WINDOW (window)) {
465 if (priv->main_window) {
466 g_warning ("%s: trying to register a second main window",
470 priv->main_window = window;
471 load_new_view (self);
472 load_new_editor (self);
476 /* remove from the list of pre-registered uids */
477 if (MODEST_IS_MSG_VIEW_WINDOW(window)) {
478 const gchar *uid = modest_msg_view_window_get_message_uid
479 (MODEST_MSG_VIEW_WINDOW (window));
481 if (!has_uid (priv->preregistered_uids, uid))
482 g_debug ("weird: no uid for window (%s)", uid);
484 MODEST_DEBUG_BLOCK(g_debug ("registering window for %s", uid ? uid : "<none>"););
486 priv->preregistered_uids =
487 remove_uid (priv->preregistered_uids,
488 modest_msg_view_window_get_message_uid
489 (MODEST_MSG_VIEW_WINDOW (window)));
490 } else if (MODEST_IS_MSG_EDIT_WINDOW(window)) {
491 const gchar *uid = modest_msg_edit_window_get_message_uid
492 (MODEST_MSG_EDIT_WINDOW (window));
494 MODEST_DEBUG_BLOCK(g_debug ("registering window for %s", uid););
496 priv->preregistered_uids =
497 remove_uid (priv->preregistered_uids,
498 modest_msg_edit_window_get_message_uid
499 (MODEST_MSG_EDIT_WINDOW (window)));
506 modest_window_mgr_unregister_window (ModestWindowMgr *self,
507 ModestWindow *window)
509 MODEST_WINDOW_MGR_GET_CLASS (self)->unregister_window (self, window);
513 modest_window_mgr_unregister_window_default (ModestWindowMgr *self,
514 ModestWindow *window)
516 ModestWindowMgrPrivate *priv;
518 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
519 g_return_if_fail (MODEST_IS_WINDOW (window));
521 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
524 modest_window_save_state (window);
526 /* Disconnect all the window signals */
527 modest_window_disconnect_signals (window);
529 /* Destroy the window */
530 gtk_widget_destroy (GTK_WIDGET (window));
536 modest_window_mgr_set_fullscreen_mode (ModestWindowMgr *self,
539 MODEST_WINDOW_MGR_GET_CLASS (self)->set_fullscreen_mode (self, on);
543 modest_window_mgr_set_fullscreen_mode_default (ModestWindowMgr *self,
550 modest_window_mgr_get_fullscreen_mode (ModestWindowMgr *self)
552 return MODEST_WINDOW_MGR_GET_CLASS (self)->get_fullscreen_mode (self);
556 modest_window_mgr_get_fullscreen_mode_default (ModestWindowMgr *self)
562 modest_window_mgr_show_toolbars (ModestWindowMgr *self,
564 gboolean show_toolbars,
567 return MODEST_WINDOW_MGR_GET_CLASS (self)->show_toolbars (self, window_type, show_toolbars, fullscreen);
571 modest_window_mgr_show_toolbars_default (ModestWindowMgr *self,
573 gboolean show_toolbars,
580 modest_window_mgr_set_main_window (ModestWindowMgr *self, ModestWindow *win)
582 ModestWindowMgrPrivate *priv;
584 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
586 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
587 priv->main_window = win;
591 modest_window_mgr_get_main_window (ModestWindowMgr *self, gboolean show)
593 return MODEST_WINDOW_MGR_GET_CLASS (self)->get_main_window (self, show);
597 modest_window_mgr_get_main_window_default (ModestWindowMgr *self, gboolean show)
599 ModestWindowMgrPrivate *priv;
601 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
603 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
604 if (priv->main_window)
605 return priv->main_window;
608 return modest_main_window_new ();
614 modest_window_mgr_main_window_exists (ModestWindowMgr *self)
616 ModestWindowMgrPrivate *priv;
618 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
619 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
621 return priv->main_window != NULL;
626 modest_window_mgr_get_modal (ModestWindowMgr *self)
628 return MODEST_WINDOW_MGR_GET_CLASS (self)->get_modal (self);
632 modest_window_mgr_get_modal_default (ModestWindowMgr *self)
639 modest_window_mgr_set_modal (ModestWindowMgr *self,
643 MODEST_WINDOW_MGR_GET_CLASS (self)->set_modal (self, window, parent);
647 modest_window_mgr_set_modal_default (ModestWindowMgr *self,
656 on_nonhibernating_window_hide(GtkWidget *widget, gpointer user_data)
658 ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
659 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
661 /* Forget this window,
662 * so hibernation will be allowed again if no windows are remembered: */
663 priv->windows_that_prevent_hibernation =
664 g_slist_remove (priv->windows_that_prevent_hibernation, GTK_WINDOW(widget));
668 on_nonhibernating_window_show(GtkWidget *widget, gpointer user_data)
670 ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
671 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
673 GtkWindow *window = GTK_WINDOW (widget);
675 priv->windows_that_prevent_hibernation =
676 g_slist_append (priv->windows_that_prevent_hibernation, window);
678 /* Allow hibernation again when the window has been hidden: */
679 g_signal_connect (window, "hide",
680 G_CALLBACK (on_nonhibernating_window_hide), self);
684 modest_window_mgr_prevent_hibernation_while_window_is_shown (ModestWindowMgr *self,
687 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
689 if (GTK_WIDGET_VISIBLE(window)) {
690 on_nonhibernating_window_show (GTK_WIDGET (window), self);
692 /* Wait for it to be shown: */
693 g_signal_connect (window, "show",
694 G_CALLBACK (on_nonhibernating_window_show), self);
699 modest_window_mgr_get_hibernation_is_prevented (ModestWindowMgr *self)
701 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
703 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
705 /* Prevent hibernation if any open windows are currently
706 * preventing hibernation: */
707 return (g_slist_length (priv->windows_that_prevent_hibernation) > 0);
712 modest_window_mgr_save_state_for_all_windows (ModestWindowMgr *self)
716 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
718 /* Iterate over all windows */
719 window_list = modest_window_mgr_get_window_list (self);
722 ModestWindow *window = MODEST_WINDOW (node->data);
724 /* This calls the vfunc,
725 * so each window can do its own thing: */
726 modest_window_save_state (window);
729 node = g_list_next (node);
731 g_list_free (window_list);
735 modest_window_mgr_num_windows (ModestWindowMgr *self)
737 ModestWindowMgrPrivate *priv;
738 gint num_windows = 0;
741 g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), -1);
743 priv = MODEST_WINDOW_MGR_GET_PRIVATE(self);
745 window_list = modest_window_mgr_get_window_list (self);
748 num_windows = g_list_length (window_list);
749 g_list_free (window_list);
752 /* Do not take into account the main window if it was hidden */
753 if (priv->main_window && !GTK_WIDGET_VISIBLE (priv->main_window))
756 return num_windows + priv->banner_counter;
760 modest_window_mgr_get_msg_edit_window (ModestWindowMgr *self)
763 ModestWindowMgrPrivate *priv;
765 g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), NULL);
767 priv = MODEST_WINDOW_MGR_GET_PRIVATE(self);
769 if (priv->cached_editor) {
770 result = priv->cached_editor;
771 priv->cached_editor = NULL;
772 load_new_editor (self);
774 result = g_object_new (MODEST_TYPE_MSG_EDIT_WINDOW, NULL);
781 modest_window_mgr_get_msg_view_window (ModestWindowMgr *self)
784 ModestWindowMgrPrivate *priv;
786 g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), NULL);
788 priv = MODEST_WINDOW_MGR_GET_PRIVATE(self);
790 if (priv->cached_view) {
791 result = priv->cached_view;
792 priv->cached_view = NULL;
793 load_new_view (self);
795 result = g_object_new (MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
802 modest_window_mgr_register_banner (ModestWindowMgr *self)
804 ModestWindowMgrPrivate *priv;
806 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
807 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
809 priv->banner_counter++;
814 modest_window_mgr_unregister_banner (ModestWindowMgr *self)
816 ModestWindowMgrPrivate *priv;
818 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
819 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
821 priv->banner_counter--;
822 if (modest_window_mgr_num_windows (self) == 0)
823 g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0);