aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--shell/apps_evolution_shell.schemas.in.in24
-rw-r--r--shell/e-shell-window.c80
3 files changed, 107 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 197d1ddda9..d60ebba840 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-04-28 Sven Herzberg <herzi@gnome-de.org>
+
+ reviewed by: Srinivasa Ragavan
+
+ * shell/apps_evolution_shell.schemas.in.in: added boolean key for the
+ maximized state of the window
+ * shell/e-shell-window.c: added window state saving and updated window
+ size saving to work as expected (fixes bug 243962)
+
2006-04-27 Tor Lillqvist <tml@novell.com>
* win32/libemiscwidgets.def: Add e_expander_get_type which now is
diff --git a/shell/apps_evolution_shell.schemas.in.in b/shell/apps_evolution_shell.schemas.in.in
index 303525c0a1..1a0ea854f3 100644
--- a/shell/apps_evolution_shell.schemas.in.in
+++ b/shell/apps_evolution_shell.schemas.in.in
@@ -95,6 +95,30 @@
</schema>
<schema>
+ <key>/schemas/apps/evolution/shell/view_defaults/maximized</key>
+ <applyto>/apps/evolution/shell/view_defaults/maximized</applyto>
+ <owner>evolution</owner>
+ <type>bool</type>
+ <default>TRUE</default>
+ <locale name="C">
+ <short>Default window state</short>
+ <long>Whether or not the window should be maximized.</long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/evolution/shell/view_defaults/maximized</key>
+ <applyto>/apps/evolution/shell/view_defaults/maximized</applyto>
+ <owner>evolution</owner>
+ <type>bool</type>
+ <default>TRUE</default>
+ <locale name="C">
+ <short>Default window state</short>
+ <long>Whether or not the window should be maximized.</long>
+ </locale>
+ </schema>
+
+ <schema>
<key>/schemas/apps/evolution/shell/view_defaults/buttons_visible</key>
<applyto>/apps/evolution/shell/view_defaults/buttons_visible</applyto>
<owner>evolution</owner>
diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c
index 92c903a203..f0c5903936 100644
--- a/shell/e-shell-window.c
+++ b/shell/e-shell-window.c
@@ -116,6 +116,9 @@ struct _EShellWindowPrivate {
GtkWidget *offline_toggle;
GtkWidget *offline_toggle_image;
GtkWidget *menu_hint_label;
+
+ /* The timeout for saving the window size */
+ guint store_window_size_timer;
};
@@ -859,6 +862,69 @@ impl_finalize (GObject *object)
(* G_OBJECT_CLASS (e_shell_window_parent_class)->finalize) (object);
}
+/* GtkWidget methods */
+static void
+e_shell_window_remove_resize_timer (EShellWindow* self)
+{
+ if (self->priv->store_window_size_timer) {
+ g_source_remove (self->priv->store_window_size_timer);
+ self->priv->store_window_size_timer = 0;
+ }
+}
+
+static gboolean
+impl_window_state (GtkWidget *widget, GdkEventWindowState* ev)
+{
+ gboolean retval = FALSE;
+
+ /* store only if the window state really changed */
+ if ((ev->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
+ GConfClient* client = gconf_client_get_default ();
+ gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/maximized",
+ (ev->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0, NULL);
+ g_object_unref(client);
+ }
+
+ if ((ev->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
+ e_shell_window_remove_resize_timer (E_SHELL_WINDOW (widget));
+ }
+
+ if (GTK_WIDGET_CLASS (e_shell_window_parent_class)->window_state_event) {
+ retval |= GTK_WIDGET_CLASS (e_shell_window_parent_class)->window_state_event (widget, ev);
+ }
+
+ return retval;
+}
+
+static gboolean
+store_window_size (GtkWidget* widget)
+{
+ GConfClient* client = gconf_client_get_default ();
+ gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/width",
+ widget->allocation.width, NULL);
+ gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/height",
+ widget->allocation.height, NULL);
+ g_object_unref(client);
+
+ E_SHELL_WINDOW (widget)->priv->store_window_size_timer = 0;
+ return FALSE; // remove this timeout
+}
+
+static void
+impl_size_alloc (GtkWidget* widget, GtkAllocation* alloc)
+{
+ EShellWindow* self = E_SHELL_WINDOW (widget);
+ e_shell_window_remove_resize_timer(self);
+
+ if (GTK_WIDGET_REALIZED(widget) && !(gdk_window_get_state(widget->window) & GDK_WINDOW_STATE_MAXIMIZED)) {
+ /* update the size storage timer */
+ self->priv->store_window_size_timer = g_timeout_add (1000, (GSourceFunc)store_window_size, self);
+ }
+
+ if (GTK_WIDGET_CLASS (e_shell_window_parent_class)->size_allocate) {
+ GTK_WIDGET_CLASS (e_shell_window_parent_class)->size_allocate (widget, alloc);
+ }
+}
/* Initialization. */
@@ -866,10 +932,14 @@ static void
e_shell_window_class_init (EShellWindowClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->dispose = impl_dispose;
object_class->finalize = impl_finalize;
+ widget_class->window_state_event = impl_window_state;
+ widget_class->size_allocate = impl_size_alloc;
+
signals[COMPONENT_CHANGED] = g_signal_new ("component_changed",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
@@ -951,7 +1021,7 @@ e_shell_window_new (EShell *shell,
setup_widgets (window);
- if(gconf_client_get_bool (gconf_client_get_default(),"/apps/evolution/shell/view_defaults/sidebar_visible",NULL))
+ if(gconf_client_get_bool (gconf_client,"/apps/evolution/shell/view_defaults/sidebar_visible",NULL))
gtk_widget_show (priv->sidebar);
else
gtk_widget_hide (priv->sidebar);
@@ -977,6 +1047,9 @@ e_shell_window_new (EShell *shell,
gtk_window_set_default_size (GTK_WINDOW (window),
gconf_client_get_int (gconf_client, "/apps/evolution/shell/view_defaults/width", NULL),
gconf_client_get_int (gconf_client, "/apps/evolution/shell/view_defaults/height", NULL));
+ if (gconf_client_get_bool (gconf_client, "/apps/evolution/shell/view_defaults/maximized", NULL)) {
+ gtk_window_maximize (GTK_WINDOW (window));
+ }
g_object_unref (gconf_client);
return GTK_WIDGET (window);
@@ -1065,11 +1138,6 @@ e_shell_window_save_defaults (EShellWindow *window)
const char *style;
gboolean visible;
- gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/width",
- GTK_WIDGET (window)->allocation.width, NULL);
- gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/height",
- GTK_WIDGET (window)->allocation.height, NULL);
-
gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/folder_bar/width",
gtk_paned_get_position (GTK_PANED (window->priv->paned)), NULL);