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 "widgets/modest-main-window.h"
34 #include "widgets/modest-msg-edit-window.h"
35 #include "widgets/modest-msg-view-window.h"
36 /* include other impl specific header files */
38 /* 'private'/'protected' functions */
39 static void modest_window_mgr_class_init (ModestWindowMgrClass *klass);
40 static void modest_window_mgr_init (ModestWindowMgr *obj);
41 static void modest_window_mgr_finalize (GObject *obj);
43 static void on_window_destroy (ModestWindow *window,
44 ModestWindowMgr *self);
53 typedef struct _ModestWindowMgrPrivate ModestWindowMgrPrivate;
54 struct _ModestWindowMgrPrivate {
56 ModestWindow *main_window;
57 gboolean fullscreen_mode;
58 gboolean show_toolbars;
59 gboolean show_toolbars_fullscreen;
61 #define MODEST_WINDOW_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
62 MODEST_TYPE_WINDOW_MGR, \
63 ModestWindowMgrPrivate))
65 static GObjectClass *parent_class = NULL;
67 /* uncomment the following if you have defined any signals */
68 /* static guint signals[LAST_SIGNAL] = {0}; */
71 modest_window_mgr_get_type (void)
73 static GType my_type = 0;
75 static const GTypeInfo my_info = {
76 sizeof(ModestWindowMgrClass),
78 NULL, /* base finalize */
79 (GClassInitFunc) modest_window_mgr_class_init,
80 NULL, /* class finalize */
81 NULL, /* class data */
82 sizeof(ModestWindowMgr),
84 (GInstanceInitFunc) modest_window_mgr_init,
87 my_type = g_type_register_static (G_TYPE_OBJECT,
95 modest_window_mgr_class_init (ModestWindowMgrClass *klass)
97 GObjectClass *gobject_class;
98 gobject_class = (GObjectClass*) klass;
100 parent_class = g_type_class_peek_parent (klass);
101 gobject_class->finalize = modest_window_mgr_finalize;
103 g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate));
107 modest_window_mgr_init (ModestWindowMgr *obj)
109 ModestWindowMgrPrivate *priv;
111 priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
112 priv->window_list = NULL;
113 priv->main_window = NULL;
114 priv->fullscreen_mode = FALSE;
116 /* Could not initialize it from gconf, singletons are not
118 priv->show_toolbars = FALSE;
119 priv->show_toolbars_fullscreen = FALSE;
123 modest_window_mgr_finalize (GObject *obj)
125 ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
127 if (priv->window_list) {
128 GList *iter = priv->window_list;
129 /* unregister pending windows */
131 modest_window_mgr_unregister_window (MODEST_WINDOW_MGR (obj),
132 MODEST_WINDOW (iter->data));
133 iter = g_list_next (iter);
135 g_list_free (priv->window_list);
136 priv->window_list = NULL;
139 /* Do not unref priv->main_window because it does not hold a
142 G_OBJECT_CLASS(parent_class)->finalize (obj);
146 modest_window_mgr_new (void)
148 return MODEST_WINDOW_MGR(g_object_new(MODEST_TYPE_WINDOW_MGR, NULL));
152 modest_window_mgr_register_window (ModestWindowMgr *self,
153 ModestWindow *window)
155 static gboolean first_time = TRUE;
158 ModestWindowMgrPrivate *priv;
160 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
161 g_return_if_fail (MODEST_IS_WINDOW (window));
163 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
165 win = g_list_find (priv->window_list, window);
167 g_warning ("Trying to register an already registered window");
171 /* Check that it's not a second main window */
172 if (MODEST_IS_MAIN_WINDOW (window)) {
173 if (priv->main_window) {
174 g_warning ("Trying to register a second main window");
177 priv->main_window = window;
181 /* Add to list. Keep a reference to the window */
182 g_object_ref (window);
183 priv->window_list = g_list_prepend (priv->window_list, window);
185 /* Listen to object destruction */
186 g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), self);
188 /* Put into fullscreen if needed */
189 if (priv->fullscreen_mode)
190 gtk_window_fullscreen (GTK_WINDOW (window));
194 ModestConf *conf = modest_runtime_get_conf ();
195 priv->show_toolbars =
196 modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR, NULL);
197 priv->show_toolbars_fullscreen =
198 modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL);
202 /* Show/hide toolbar */
203 if (priv->fullscreen_mode)
204 show = priv->show_toolbars_fullscreen;
206 show = priv->show_toolbars;
207 modest_window_show_toolbar (window, show);
211 on_window_destroy (ModestWindow *window, ModestWindowMgr *self)
213 /* Specific stuff first */
214 if (MODEST_IS_MAIN_WINDOW (window)) {
215 ModestWindowMgrPrivate *priv;
216 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
218 /* If more than one window already opened */
219 if (g_list_length (priv->window_list) > 1) {
221 /* If the user wants to close all the windows */
222 if (modest_main_window_close_all (MODEST_MAIN_WINDOW (window))) {
223 GList *iter = priv->window_list;
225 if (iter->data != window) {
226 GList *tmp = iter->next;
227 on_window_destroy (MODEST_WINDOW (iter->data),
231 iter = g_list_next (iter);
237 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
238 /* TODO: Save currently edited message to Drafts
243 /* Unregister window */
244 modest_window_mgr_unregister_window (self, window);
248 modest_window_mgr_unregister_window (ModestWindowMgr *self,
249 ModestWindow *window)
252 ModestWindowMgrPrivate *priv;
254 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
255 g_return_if_fail (MODEST_IS_WINDOW (window));
257 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
259 win = g_list_find (priv->window_list, window);
261 g_warning ("Trying to unregister a window that has not being registered yet");
265 /* Remove from list. Remove the reference to the window */
266 g_object_unref (win->data);
267 priv->window_list = g_list_remove_link (priv->window_list, win);
269 /* If there are no more windows registered then exit program */
270 if (priv->window_list == NULL) {
271 ModestConf *conf = modest_runtime_get_conf ();
273 /* Save show toolbar status */
274 modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN,
275 priv->show_toolbars_fullscreen, NULL);
276 modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR,
277 priv->show_toolbars, NULL);
285 compare_msguids (ModestWindow *win,
288 const gchar *msg_uid;
290 if (!MODEST_IS_MSG_VIEW_WINDOW (win))
293 /* Get message uid from msg window */
294 msg_uid = modest_msg_view_window_get_message_uid (MODEST_MSG_VIEW_WINDOW (win));
295 if (msg_uid && !strcmp (msg_uid, uid))
302 modest_window_mgr_find_window_by_msguid (ModestWindowMgr *self,
305 ModestWindowMgrPrivate *priv;
308 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
309 g_return_val_if_fail (msguid != NULL, NULL);
311 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
313 /* Look for the window */
314 if (priv->window_list)
315 win = g_list_find_custom (priv->window_list,
317 (GCompareFunc) compare_msguids);
326 modest_window_mgr_set_fullscreen_mode (ModestWindowMgr *self,
329 ModestWindowMgrPrivate *priv;
332 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
334 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
336 /* If there is no change do nothing */
337 if (priv->fullscreen_mode == on)
340 priv->fullscreen_mode = on;
343 win = priv->window_list;
346 gtk_window_fullscreen (GTK_WINDOW (win->data));
347 modest_window_show_toolbar (MODEST_WINDOW (win->data),
348 priv->show_toolbars_fullscreen);
350 gtk_window_unfullscreen (GTK_WINDOW (win->data));
351 modest_window_show_toolbar (MODEST_WINDOW (win->data),
352 priv->show_toolbars);
354 win = g_list_next (win);
359 modest_window_mgr_get_fullscreen_mode (ModestWindowMgr *self)
361 ModestWindowMgrPrivate *priv;
363 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
365 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
367 return priv->fullscreen_mode;
371 modest_window_mgr_show_toolbars (ModestWindowMgr *self,
372 gboolean show_toolbars,
375 ModestWindowMgrPrivate *priv;
377 g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
379 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
381 /* If nothing changes then return. Otherwise cache it, do not
382 save to GConf for the moment, it will be done when all
383 windows become unregistered in order to avoid unnecessary
386 if (priv->show_toolbars_fullscreen == show_toolbars)
389 priv->show_toolbars_fullscreen = show_toolbars;
391 if (priv->show_toolbars == show_toolbars)
394 priv->show_toolbars = show_toolbars;
397 /* Apply now if the view mode is the right one */
398 if ((fullscreen && priv->fullscreen_mode) ||
399 (!fullscreen && !priv->fullscreen_mode)) {
401 GList *win = priv->window_list;
404 modest_window_show_toolbar (MODEST_WINDOW (win->data),
406 win = g_list_next (win);
412 modest_window_mgr_get_main_window (ModestWindowMgr *self)
414 ModestWindowMgrPrivate *priv;
416 g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
418 priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
420 return priv->main_window;