+ModestWindow*
+modest_window_mgr_get_main_window (ModestWindowMgr *self, gboolean show)
+{
+ return MODEST_WINDOW_MGR_GET_CLASS (self)->get_main_window (self, show);
+}
+
+static ModestWindow*
+modest_window_mgr_get_main_window_default (ModestWindowMgr *self, gboolean show)
+{
+ ModestWindowMgrPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), NULL);
+
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+ if (priv->main_window)
+ return priv->main_window;
+
+ if (show)
+ return modest_main_window_new ();
+ else return NULL;
+}
+
+
+gboolean
+modest_window_mgr_main_window_exists (ModestWindowMgr *self)
+{
+ ModestWindowMgrPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE);
+ priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ return priv->main_window != NULL;
+}
+
+
+GtkWindow *
+modest_window_mgr_get_modal (ModestWindowMgr *self)
+{
+ return MODEST_WINDOW_MGR_GET_CLASS (self)->get_modal (self);
+}
+
+static GtkWindow *
+modest_window_mgr_get_modal_default (ModestWindowMgr *self)
+{
+ return NULL;
+}
+
+
+void
+modest_window_mgr_set_modal (ModestWindowMgr *self,
+ GtkWindow *window,
+ GtkWindow *parent)
+{
+ MODEST_WINDOW_MGR_GET_CLASS (self)->set_modal (self, window, parent);
+}
+
+static void
+modest_window_mgr_set_modal_default (ModestWindowMgr *self,
+ GtkWindow *window,
+ GtkWindow *parent)
+{
+ return;
+}
+
+
+static void
+on_nonhibernating_window_hide(GtkWidget *widget, gpointer user_data)
+{
+ ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
+ ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ /* Forget this window,
+ * so hibernation will be allowed again if no windows are remembered: */
+ priv->windows_that_prevent_hibernation =
+ g_slist_remove (priv->windows_that_prevent_hibernation, GTK_WINDOW(widget));
+}
+
+static void
+on_nonhibernating_window_show(GtkWidget *widget, gpointer user_data)
+{
+ ModestWindowMgr *self = MODEST_WINDOW_MGR (user_data);
+ ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
+
+ GtkWindow *window = GTK_WINDOW (widget);
+
+ priv->windows_that_prevent_hibernation =
+ g_slist_append (priv->windows_that_prevent_hibernation, window);
+
+ /* Allow hibernation again when the window has been hidden: */
+ g_signal_connect (window, "hide",
+ G_CALLBACK (on_nonhibernating_window_hide), self);
+}
+
+void
+modest_window_mgr_prevent_hibernation_while_window_is_shown (ModestWindowMgr *self,
+ GtkWindow *window)
+{
+ g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
+
+ if (GTK_WIDGET_VISIBLE(window)) {
+ on_nonhibernating_window_show (GTK_WIDGET (window), self);
+ } else {
+ /* Wait for it to be shown: */
+ g_signal_connect (window, "show",
+ G_CALLBACK (on_nonhibernating_window_show), self);