[gimp] app: Save the maximized state of the main window in the sessionrc file.



commit 89760cf044a9aed9b05dfb3f9e6d1da8449018d2
Author: Michael Henning <mikehenning eclipse net>
Date:   Tue Apr 3 20:59:37 2012 -0400

    app: Save the maximized state of the main window in the sessionrc file.

 app/display/gimpimagewindow.c                      |   33 ++++++++++-
 app/display/gimpimagewindow.h                      |    1 +
 app/tests/gimpdir/sessionrc-2-8-single-window      |    3 +-
 app/tests/gimpdir/sessionrc-expected-single-window |    3 +-
 app/tests/test-ui.c                                |   62 ++++++++++++++++++++
 5 files changed, 98 insertions(+), 4 deletions(-)
---
diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c
index 1619714..8021a58 100644
--- a/app/display/gimpimagewindow.c
+++ b/app/display/gimpimagewindow.c
@@ -74,6 +74,9 @@
 /* GtkPaned position of the right docks area */
 #define GIMP_IMAGE_WINDOW_RIGHT_DOCKS_POS  "right-docks-position"
 
+/* Whether the window's maximized or not */
+#define GIMP_IMAGE_WINDOW_MAXIMIZED        "maximized"
+
 
 enum
 {
@@ -805,8 +808,8 @@ gimp_image_window_get_aux_info (GimpSessionManaged *session_managed)
   if (config->single_window_mode)
     {
       GimpSessionInfoAux *aux;
-      char                widthbuf[128];
-  
+      gchar               widthbuf[128];
+
       g_snprintf (widthbuf, sizeof (widthbuf), "%d",
                   gtk_paned_get_position (GTK_PANED (private->left_hpane)));
       aux = gimp_session_info_aux_new (GIMP_IMAGE_WINDOW_LEFT_DOCKS_WIDTH, widthbuf);
@@ -816,6 +819,11 @@ gimp_image_window_get_aux_info (GimpSessionManaged *session_managed)
                   gtk_paned_get_position (GTK_PANED (private->right_hpane)));
       aux = gimp_session_info_aux_new (GIMP_IMAGE_WINDOW_RIGHT_DOCKS_POS, widthbuf);
       aux_info = g_list_append (aux_info, aux);
+
+      aux = gimp_session_info_aux_new (GIMP_IMAGE_WINDOW_MAXIMIZED,
+                                       gimp_image_window_is_maximized (GIMP_IMAGE_WINDOW (session_managed)) ?
+                                       "yes" : "no");
+      aux_info = g_list_append (aux_info, aux);
     }
 
   return aux_info;
@@ -846,6 +854,7 @@ gimp_image_window_set_aux_info (GimpSessionManaged *session_managed,
   gint                    left_docks_width      = -1;
   gint                    right_docks_pos       = -1;
   gboolean                wait_with_right_docks = FALSE;
+  gboolean                maximized             = FALSE;
 
   g_return_if_fail (GIMP_IS_IMAGE_WINDOW (session_managed));
 
@@ -860,6 +869,9 @@ gimp_image_window_set_aux_info (GimpSessionManaged *session_managed,
         width = &left_docks_width;
       else if (! strcmp (aux->name, GIMP_IMAGE_WINDOW_RIGHT_DOCKS_POS))
         width = &right_docks_pos;
+      else if (! strcmp (aux->name, GIMP_IMAGE_WINDOW_MAXIMIZED))
+        if (! g_ascii_strcasecmp (aux->value, "yes"))
+          maximized = TRUE;
 
       if (width)
         sscanf (aux->value, "%d", width);
@@ -899,6 +911,11 @@ gimp_image_window_set_aux_info (GimpSessionManaged *session_managed,
                                   right_docks_pos);
         }
     }
+
+  if (maximized)
+    gtk_window_maximize (GTK_WINDOW (session_managed));
+  else
+    gtk_window_unmaximize (GTK_WINDOW (session_managed));
 }
 
 
@@ -1165,6 +1182,18 @@ gimp_image_window_is_iconified (GimpImageWindow *window)
   return (private->window_state & GDK_WINDOW_STATE_ICONIFIED) != 0;
 }
 
+gboolean
+gimp_image_window_is_maximized (GimpImageWindow *window)
+{
+  GimpImageWindowPrivate *private;
+
+  g_return_val_if_fail (GIMP_IS_IMAGE_WINDOW (window), FALSE);
+
+  private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
+
+  return (private->window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0;
+}
+
 /**
  * gimp_image_window_has_toolbox:
  * @window:
diff --git a/app/display/gimpimagewindow.h b/app/display/gimpimagewindow.h
index 826d8ba..f239629 100644
--- a/app/display/gimpimagewindow.h
+++ b/app/display/gimpimagewindow.h
@@ -81,6 +81,7 @@ void               gimp_image_window_set_show_statusbar   (GimpImageWindow  *win
 gboolean           gimp_image_window_get_show_statusbar   (GimpImageWindow  *window);
 
 gboolean           gimp_image_window_is_iconified         (GimpImageWindow  *window);
+gboolean           gimp_image_window_is_maximized         (GimpImageWindow  *window);
 
 gboolean           gimp_image_window_has_toolbox          (GimpImageWindow  *window);
 
diff --git a/app/tests/gimpdir/sessionrc-2-8-single-window b/app/tests/gimpdir/sessionrc-2-8-single-window
index 772a172..a9b618e 100644
--- a/app/tests/gimpdir/sessionrc-2-8-single-window
+++ b/app/tests/gimpdir/sessionrc-2-8-single-window
@@ -23,7 +23,8 @@
     (open-on-exit)
     (aux-info
         (left-docks-width "80")
-        (right-docks-position "200"))
+        (right-docks-position "200")
+        (maximized "no"))
     (gimp-toolbox
         (side left))
     (gimp-dock
diff --git a/app/tests/gimpdir/sessionrc-expected-single-window b/app/tests/gimpdir/sessionrc-expected-single-window
index 772a172..a9b618e 100644
--- a/app/tests/gimpdir/sessionrc-expected-single-window
+++ b/app/tests/gimpdir/sessionrc-expected-single-window
@@ -23,7 +23,8 @@
     (open-on-exit)
     (aux-info
         (left-docks-width "80")
-        (right-docks-position "200"))
+        (right-docks-position "200")
+        (maximized "no"))
     (gimp-toolbox
         (side left))
     (gimp-dock
diff --git a/app/tests/test-ui.c b/app/tests/test-ui.c
index e6971ce..addbbc6 100644
--- a/app/tests/test-ui.c
+++ b/app/tests/test-ui.c
@@ -43,6 +43,8 @@
 #include "widgets/gimpdockwindow.h"
 #include "widgets/gimphelp-ids.h"
 #include "widgets/gimpsessioninfo.h"
+#include "widgets/gimpsessioninfo-aux.h"
+#include "widgets/gimpsessionmanaged.h"
 #include "widgets/gimptoolbox.h"
 #include "widgets/gimptooloptionseditor.h"
 #include "widgets/gimpuimanager.h"
@@ -89,6 +91,8 @@ static GtkWidget     * gimp_ui_find_window                      (GimpDialogFacto
 static gboolean        gimp_ui_not_toolbox_window               (GObject           *object);
 static gboolean        gimp_ui_multicolumn_not_toolbox_window   (GObject           *object);
 static gboolean        gimp_ui_is_gimp_layer_list               (GObject           *object);
+static int             gimp_ui_aux_data_eqiuvalent              (gconstpointer      _a,
+                                                                 gconstpointer      _b);
 static void            gimp_ui_switch_window_mode               (Gimp              *gimp);
 
 
@@ -571,6 +575,55 @@ show_docks_in_single_window_mode (gconstpointer data)
 }
 
 static void
+maximize_state_in_aux_data (gconstpointer data)
+{
+  Gimp               *gimp    = GIMP (data);
+  GimpDisplay        *display = GIMP_DISPLAY (gimp_get_display_iter (gimp)->data);
+  GimpDisplayShell   *shell   = gimp_display_get_shell (display);
+  GimpImageWindow    *window  = gimp_display_shell_get_window (shell);
+  gint                i;
+
+  for (i = 0; i < 2; i++)
+    {
+      GList              *aux_info = NULL;
+      GimpSessionInfoAux *target_info;
+      gboolean            target_max_state;
+
+      if (i == 0)
+        {
+          target_info = gimp_session_info_aux_new ("maximized" , "yes");
+          target_max_state = TRUE;
+        }
+      else
+        {
+          target_info = gimp_session_info_aux_new ("maximized", "no");
+          target_max_state = FALSE;
+        }
+
+      /* Set the aux info to out target data */
+      aux_info = g_list_append (aux_info, target_info);
+      gimp_session_managed_set_aux_info (GIMP_SESSION_MANAGED (window), aux_info);
+      g_list_free (aux_info);
+
+      /* Give the WM a chance to maximize/unmaximize us */
+      gimp_test_run_mainloop_until_idle ();
+      g_usleep (500 * 1000);
+      gimp_test_run_mainloop_until_idle ();
+
+      /* Make sure the maximize/unmaximize happened */
+      g_assert (gimp_image_window_is_maximized (window) == target_max_state);
+
+      /* Make sure we can read out the window state again */
+      aux_info = gimp_session_managed_get_aux_info (GIMP_SESSION_MANAGED (window));
+      g_assert (g_list_find_custom (aux_info, target_info, gimp_ui_aux_data_eqiuvalent));
+      g_list_free_full (aux_info,
+                        (GDestroyNotify) gimp_session_info_aux_free);
+
+      gimp_session_info_aux_free (target_info);
+    }
+}
+
+static void
 switch_back_to_multi_window_mode (gconstpointer data)
 {
   Gimp *gimp = GIMP (data);
@@ -831,6 +884,14 @@ gimp_ui_is_gimp_layer_list (GObject *object)
   return strcmp (entry->identifier, "gimp-layer-list") == 0;
 }
 
+static int
+gimp_ui_aux_data_eqiuvalent (gconstpointer _a, gconstpointer _b)
+{
+  GimpSessionInfoAux *a = (GimpSessionInfoAux*) _a;
+  GimpSessionInfoAux *b = (GimpSessionInfoAux*) _b;
+  return (strcmp (a->name, b->name) || strcmp (a->value, b->value));
+}
+
 static void
 gimp_ui_switch_window_mode (Gimp *gimp)
 {
@@ -875,6 +936,7 @@ int main(int argc, char **argv)
   ADD_TEST (switch_to_single_window_mode);
   ADD_TEST (hide_docks_in_single_window_mode);
   ADD_TEST (show_docks_in_single_window_mode);
+  ADD_TEST (maximize_state_in_aux_data);
   ADD_TEST (switch_back_to_multi_window_mode);
   ADD_TEST (close_image);
   ADD_TEST (repeatedly_switch_window_mode);



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