[evolution] Bug #608203 - Left pane of mailer window is really narrow at startup



commit 0cdd9484fec0b1fec0801df7d7e0b05c6544ba9b
Author: Milan Crha <mcrha redhat com>
Date:   Wed Apr 14 12:39:49 2010 +0200

    Bug #608203 - Left pane of mailer window is really narrow at startup

 e-util/gconf-bridge.c          |   32 +++++++++++++++++++++++++++-----
 shell/e-shell-window-private.c |   34 ++++++++++++++++++----------------
 2 files changed, 45 insertions(+), 21 deletions(-)
---
diff --git a/e-util/gconf-bridge.c b/e-util/gconf-bridge.c
index d0f884d..d224b9d 100644
--- a/e-util/gconf-bridge.c
+++ b/e-util/gconf-bridge.c
@@ -53,6 +53,8 @@ typedef struct {
                                 that have not received change notification
                                 yet. */
 
+	GConfValue *use_first_value; /* Not NULL when the object is a Widget and wasn't realized */
+
         GObject *object;
         GParamSpec *prop;
         gulong prop_notify_id;
@@ -263,6 +265,9 @@ prop_binding_sync_prop_to_pref (PropBinding *binding)
                                binding->prop->name,
                                &value);
 
+	if (binding->use_first_value) {
+		gconf_value = binding->use_first_value;
+	} else
         switch (value.g_type) {
         case G_TYPE_STRING:
                 gconf_value = gconf_value_new (GCONF_VALUE_STRING);
@@ -356,10 +361,17 @@ prop_binding_sync_prop_to_pref (PropBinding *binding)
         /* Set to GConf */
         gconf_client_set (bridge->client, binding->key, gconf_value, NULL);
 
-        /* Store until change notification comes in, so that we are able
-         * to ignore it */
-        binding->val_changes = g_slist_append (binding->val_changes,
-                                               gconf_value);
+	if (binding->use_first_value) {
+		gconf_value_free (binding->use_first_value);
+		binding->use_first_value = NULL;
+
+		gconf_client_notify (bridge->client, binding->key);
+	} else {
+		/* Store until change notification comes in, so that we are able
+		 * to ignore it */
+		binding->val_changes = g_slist_append (binding->val_changes,
+						       gconf_value);
+	}
 
 done:
         g_value_unset (&value);
@@ -513,6 +525,7 @@ gconf_bridge_bind_property_full (GConfBridge *bridge,
         binding->id = new_id ();
         binding->delayed_mode = delayed_sync;
         binding->val_changes = NULL;
+	binding->use_first_value = NULL;
         binding->key = g_strdup (key);
         binding->object = object;
         binding->prop = pspec;
@@ -536,7 +549,11 @@ gconf_bridge_bind_property_full (GConfBridge *bridge,
         val = gconf_client_get (bridge->client, key, NULL);
         if (val) {
                 prop_binding_sync_pref_to_prop (binding, val);
-                gconf_value_free (val);
+		if (GTK_IS_WIDGET (object) && !gtk_widget_get_realized (GTK_WIDGET (object))) {
+			binding->use_first_value = val;
+		} else {
+			gconf_value_free (val);
+		}
         }
 
         /* Handle case where watched object gets destroyed */
@@ -627,6 +644,11 @@ prop_binding_unbind (PropBinding *binding)
                         (binding->val_changes, binding->val_changes);
         }
 
+	if (binding->use_first_value) {
+		gconf_value_free (binding->use_first_value);
+		binding->use_first_value = NULL;
+	}
+
         /* The object might have been destroyed .. */
         if (binding->object) {
                 g_signal_handler_disconnect (binding->object,
diff --git a/shell/e-shell-window-private.c b/shell/e-shell-window-private.c
index eda1d91..be5064a 100644
--- a/shell/e-shell-window-private.c
+++ b/shell/e-shell-window-private.c
@@ -412,6 +412,24 @@ e_shell_window_private_constructed (EShellWindow *shell_window)
 
 	bridge = gconf_bridge_get ();
 
+	/* First restore window size, then the rest */
+
+	/* Configure the initial size and position of the window by way
+	 * of either a user-supplied geometry string or the last recorded
+	 * values.  Note that if a geometry string is applied, the window
+	 * size and position are -not- recorded. */
+	if (priv->geometry != NULL) {
+		if (!gtk_window_parse_geometry (window, priv->geometry))
+			g_printerr (
+				"Failed to parse geometry '%s'\n",
+				priv->geometry);
+		g_free (priv->geometry);
+		priv->geometry = NULL;
+	} else {
+		key = "/apps/evolution/shell/view_defaults/window";
+		gconf_bridge_bind_window (bridge, key, window, TRUE, TRUE);
+	}
+
 	object = G_OBJECT (shell_window);
 	key = "/apps/evolution/shell/view_defaults/component_id";
 	gconf_bridge_bind_property (bridge, key, object, "active-view");
@@ -443,22 +461,6 @@ e_shell_window_private_constructed (EShellWindow *shell_window)
 	key = "/apps/evolution/shell/view_defaults/toolbar_visible";
 	gconf_bridge_bind_property (bridge, key, object, "toolbar-visible");
 
-	/* Configure the initial size and position of the window by way
-	 * of either a user-supplied geometry string or the last recorded
-	 * values.  Note that if a geometry string is applied, the window
-	 * size and position are -not- recorded. */
-	if (priv->geometry != NULL) {
-		if (!gtk_window_parse_geometry (window, priv->geometry))
-			g_printerr (
-				"Failed to parse geometry '%s'\n",
-				priv->geometry);
-		g_free (priv->geometry);
-		priv->geometry = NULL;
-	} else {
-		key = "/apps/evolution/shell/view_defaults/window";
-		gconf_bridge_bind_window (bridge, key, window, TRUE, TRUE);
-	}
-
 	shell_window_init_switcher_style (shell_window);
 
 	id = "org.gnome.evolution.shell";



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]