[console/wip/msandova/remember-window-size] window: Remember window size




commit b474ed0c0ac3a0ad64cdd8ffebcf5836aa59824c
Author: Maximiliano Sandoval R <msandova gnome org>
Date:   Fri Jul 29 21:46:59 2022 +0200

    window: Remember window size
    
    Fixes: https://gitlab.gnome.org/GNOME/console/-/issues/120
    
    window: Use active window size for new windows

 data/org.gnome.Console.gschema.xml.in |  6 ++++
 src/kgx-application.c                 | 11 +++++--
 src/kgx-application.h                 |  1 +
 src/kgx-pages.c                       |  9 +----
 src/kgx-window.c                      | 62 +++++++++++++++++++++++++++++++++++
 src/kgx-window.h                      |  2 ++
 6 files changed, 80 insertions(+), 11 deletions(-)
---
diff --git a/data/org.gnome.Console.gschema.xml.in b/data/org.gnome.Console.gschema.xml.in
index 8bf5d05..7e87e13 100644
--- a/data/org.gnome.Console.gschema.xml.in
+++ b/data/org.gnome.Console.gschema.xml.in
@@ -21,5 +21,11 @@
     <key name="scrollback-lines" type="x">
       <default>10000</default>
     </key>
+    <key name="window-width" type="i">
+      <default>-1</default>
+    </key>
+    <key name="window-height" type="i">
+      <default>-1</default>
+    </key>
   </schema>
 </schemalist>
diff --git a/src/kgx-application.c b/src/kgx-application.c
index d1b3c92..39fc711 100644
--- a/src/kgx-application.c
+++ b/src/kgx-application.c
@@ -1182,9 +1182,7 @@ kgx_application_add_terminal (KgxApplication *self,
   if (existing_window) {
     window = GTK_WINDOW (existing_window);
   } else {
-    window = g_object_new (KGX_TYPE_WINDOW,
-                           "application", self,
-                           NULL);
+    window = GTK_WINDOW (kgx_window_new (GTK_APPLICATION (self)));
   }
 
   pages = kgx_window_get_pages (KGX_WINDOW (window));
@@ -1196,3 +1194,10 @@ kgx_application_add_terminal (KgxApplication *self,
 
   return KGX_TAB (tab);
 }
+
+
+GSettings *
+kgx_application_get_settings (KgxApplication *self)
+{
+  return self->settings;
+}
diff --git a/src/kgx-application.h b/src/kgx-application.h
index fa401cd..ed12c6e 100644
--- a/src/kgx-application.h
+++ b/src/kgx-application.h
@@ -112,5 +112,6 @@ KgxTab *              kgx_application_add_terminal    (KgxApplication *self,
                                                        GFile          *working_directory,
                                                        GStrv           command,
                                                        const char     *title);
+GSettings *           kgx_application_get_settings    (KgxApplication *self);
 
 G_END_DECLS
diff --git a/src/kgx-pages.c b/src/kgx-pages.c
index d745314..9353ecb 100644
--- a/src/kgx-pages.c
+++ b/src/kgx-pages.c
@@ -436,18 +436,11 @@ create_window (AdwTabView *view,
   GtkApplication *app;
   KgxPages *new_pages;
   KgxPagesPrivate *priv;
-  int width, height;
 
   window = GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (self)));
   app = gtk_window_get_application (window);
 
-  gtk_window_get_default_size (GTK_WINDOW (window), &width, &height);
-
-  new_window = g_object_new (KGX_TYPE_WINDOW,
-                             "application", app,
-                             "default-width", width,
-                             "default-height", height,
-                             NULL);
+  new_window = kgx_window_new (app);
 
   new_pages = kgx_window_get_pages (new_window);
   priv = kgx_pages_get_instance_private (new_pages);
diff --git a/src/kgx-window.c b/src/kgx-window.c
index edb3e37..9c62b39 100644
--- a/src/kgx-window.c
+++ b/src/kgx-window.c
@@ -79,6 +79,29 @@ zoomed (GObject *object, GParamSpec *pspec, gpointer data)
 }
 
 
+static void
+save_window_size (KgxWindow *self)
+{
+  GtkApplication *application;
+  GSettings *settings;
+  int width, height;
+
+  if (!gtk_window_is_active (GTK_WINDOW (self))) {
+    return;
+  }
+
+  application = gtk_window_get_application (GTK_WINDOW (self));
+  settings = kgx_application_get_settings (KGX_APPLICATION (application));
+
+  gtk_window_get_default_size (GTK_WINDOW (self), &width, &height);
+
+  g_debug ("Saving window geometry: %ix%i", width, height);
+
+  g_settings_set_int (settings, "window-width", width);
+  g_settings_set_int (settings, "window-height", height);
+}
+
+
 static void
 kgx_window_constructed (GObject *object)
 {
@@ -179,6 +202,8 @@ close_response (KgxWindow *self)
 {
   self->close_anyway = TRUE;
 
+  save_window_size (self);
+
   gtk_window_destroy (GTK_WINDOW (self));
 }
 
@@ -193,6 +218,7 @@ kgx_window_close_request (GtkWindow *window)
   children = kgx_pages_get_children (KGX_PAGES (self->pages));
 
   if (children->len < 1 || self->close_anyway) {
+    save_window_size (self);
     return FALSE; // Aka no, I don’t want to block closing
   }
 
@@ -626,6 +652,42 @@ kgx_window_init (KgxWindow *self)
 }
 
 
+/**
+ * kgx_window_new:
+ * @application: an application
+ *
+ * Creates a new #KgxWindow.
+ *
+ * Returns: the newly created #KgxWindow
+ */
+KgxWindow *
+kgx_window_new (GtkApplication *application)
+{
+  GtkWindow *active_window;
+  int width, height;
+
+  active_window = gtk_application_get_active_window (application);
+  if (active_window) {
+    gtk_window_get_default_size (active_window, &width, &height);
+  } else {
+    GSettings *settings;
+
+    settings = kgx_application_get_settings (KGX_APPLICATION (application));
+
+    width = g_settings_get_int (settings, "window-width");
+    height = g_settings_get_int (settings, "window-height");
+  }
+
+  g_debug ("Loading window geometry: %ix%i", width, height);
+
+  return g_object_new (KGX_TYPE_WINDOW,
+                       "application", application,
+                       "default-width", width,
+                       "default-height", height,
+                       NULL);
+}
+
+
 /**
  * kgx_window_get_working_dir:
  * @self: the #KgxWindow
diff --git a/src/kgx-window.h b/src/kgx-window.h
index d337ea6..bdfaf02 100644
--- a/src/kgx-window.h
+++ b/src/kgx-window.h
@@ -104,6 +104,8 @@ struct _KgxWindow
 
 G_DECLARE_FINAL_TYPE (KgxWindow, kgx_window, KGX, WINDOW, AdwApplicationWindow)
 
+KgxWindow  *kgx_window_new             (GtkApplication *app);
+
 GFile      *kgx_window_get_working_dir (KgxWindow    *self);
 void        kgx_window_show_status     (KgxWindow    *self,
                                         const char   *status);


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