[gnome-todo] window: load & store geometry



commit 87481aa3f63fc1c2c8ff3594b6dd77295f2e4c01
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Wed Aug 26 17:51:57 2015 -0300

    window: load & store geometry

 data/ui/window.ui |    1 +
 src/gtd-manager.c |   16 ++++++
 src/gtd-manager.h |    2 +
 src/gtd-window.c  |  140 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 159 insertions(+), 0 deletions(-)
---
diff --git a/data/ui/window.ui b/data/ui/window.ui
index 09ddfb1..2283a47 100644
--- a/data/ui/window.ui
+++ b/data/ui/window.ui
@@ -16,6 +16,7 @@
     <property name="default_width">800</property>
     <property name="default_height">600</property>
     <signal name="key-press-event" handler="gtd_window__on_key_press_event" object="search_bar" swapped="no" 
/>
+    <signal name="window-state-event" handler="gtd_window__window_state_changed" object="GtdWindow" 
swapped="no"/>
     <child>
       <object class="GtkOverlay" id="overlay">
         <property name="visible">True</property>
diff --git a/src/gtd-manager.c b/src/gtd-manager.c
index b9e1140..375b449 100644
--- a/src/gtd-manager.c
+++ b/src/gtd-manager.c
@@ -1624,6 +1624,22 @@ gtd_manager_set_default_storage (GtdManager *manager,
 }
 
 /**
+ * gtd_manager_get_settings:
+ * @manager: a #GtdManager
+ *
+ * Retrieves the internal #GSettings from @manager.
+ *
+ * Returns: (transfer none): the internal #GSettings of @manager
+ */
+GSettings*
+gtd_manager_get_settings (GtdManager *manager)
+{
+  g_return_val_if_fail (GTD_IS_MANAGER (manager), NULL);
+
+  return manager->priv->settings;
+}
+
+/**
  * gtd_manager_get_is_first_run:
  * @manager: a #GtdManager
  *
diff --git a/src/gtd-manager.h b/src/gtd-manager.h
index 444ced2..12a33b1 100644
--- a/src/gtd-manager.h
+++ b/src/gtd-manager.h
@@ -77,6 +77,8 @@ GtdStorage*             gtd_manager_get_default_storage   (GtdManager
 void                    gtd_manager_set_default_storage   (GtdManager           *manager,
                                                            GtdStorage           *default_storage);
 
+GSettings*              gtd_manager_get_settings          (GtdManager           *manager);
+
 gboolean                gtd_manager_get_is_first_run      (GtdManager           *manager);
 
 void                    gtd_manager_set_is_first_run      (GtdManager           *manager,
diff --git a/src/gtd-window.c b/src/gtd-window.c
index 98edee7..884bc22 100644
--- a/src/gtd-window.c
+++ b/src/gtd-window.c
@@ -66,6 +66,7 @@ typedef struct
   /* loading notification */
   GtdNotification               *loading_notification;
 
+  guint                          save_geometry_timeout_id;
   GtdManager                    *manager;
 } GtdWindowPrivate;
 
@@ -77,6 +78,8 @@ struct _GtdWindow
   GtdWindowPrivate     *priv;
 };
 
+#define              SAVE_GEOMETRY_ID_TIMEOUT                    100 /* ms */
+
 static void          gtd_window__change_storage_action           (GSimpleAction         *simple,
                                                                   GVariant              *parameter,
                                                                   gpointer               user_data);
@@ -94,6 +97,112 @@ enum {
   LAST_PROP
 };
 
+static void
+gtd_window__load_geometry (GtdWindow *window)
+{
+  GSettings *settings;
+  GVariant *variant;
+  gboolean maximized;
+  const gint32 *position;
+  const gint32 *size;
+  gsize n_elements;
+
+  settings = gtd_manager_get_settings (window->priv->manager);
+
+  /* load window settings: size */
+  variant = g_settings_get_value (settings,
+                                  "window-size");
+  size = g_variant_get_fixed_array (variant,
+                                    &n_elements,
+                                    sizeof (gint32));
+  if (n_elements == 2)
+    gtk_window_set_default_size (GTK_WINDOW (window),
+                                 size[0],
+                                 size[1]);
+  g_variant_unref (variant);
+
+  /* load window settings: position */
+  variant = g_settings_get_value (settings,
+                                  "window-position");
+  position = g_variant_get_fixed_array (variant,
+                                        &n_elements,
+                                        sizeof (gint32));
+  if (n_elements == 2)
+    gtk_window_move (GTK_WINDOW (window),
+                     position[0],
+                     position[1]);
+
+  g_variant_unref (variant);
+
+  /* load window settings: state */
+  maximized = g_settings_get_boolean (settings,
+                                      "window-maximized");
+  if (maximized)
+    gtk_window_maximize (GTK_WINDOW (window));
+}
+
+static gboolean
+gtd_window__save_geometry (gpointer user_data)
+{
+  GtdWindowPrivate *priv;
+  GdkWindowState state;
+  GdkWindow *window;
+  GtkWindow *self;
+  GSettings *settings;
+  gboolean maximized;
+  GVariant *variant;
+  gint32 size[2];
+  gint32 position[2];
+
+  self = GTK_WINDOW (user_data);
+
+  window = gtk_widget_get_window (GTK_WIDGET (self));
+  state = gdk_window_get_state (window);
+  priv = GTD_WINDOW (self)->priv;
+
+  settings = gtd_manager_get_settings (priv->manager);
+
+  /* save window's state */
+  maximized = state & GDK_WINDOW_STATE_MAXIMIZED;
+  g_settings_set_boolean (settings,
+                          "window-maximized",
+                          maximized);
+
+  if (maximized)
+    {
+      priv->save_geometry_timeout_id = 0;
+      return FALSE;
+    }
+
+  /* save window's size */
+  gtk_window_get_size (self,
+                       (gint *) &size[0],
+                       (gint *) &size[1]);
+  variant = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
+                                       size,
+                                       2,
+                                       sizeof (size[0]));
+  g_settings_set_value (settings,
+                        "window-size",
+                        variant);
+
+  /* save windows's position */
+  gtk_window_get_position (self,
+                           (gint *) &position[0],
+                           (gint *) &position[1]);
+  variant = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
+                                       position,
+                                       2,
+                                       sizeof (position[0]));
+  g_settings_set_value (settings,
+                        "window-position",
+                        variant);
+
+  priv->save_geometry_timeout_id = 0;
+
+  return FALSE;
+}
+
 static GtdTaskListItem*
 get_selected_list (GtdWindow *window)
 {
@@ -610,6 +719,32 @@ gtd_window__list_removed (GtdManager  *manager,
   g_list_free (children);
 }
 
+static gboolean
+gtd_window_state_event (GtkWidget           *widget,
+                        GdkEventWindowState *event)
+{
+  GtdWindowPrivate *priv;
+  GtdWindow *window;
+  gboolean retval;
+
+  window = GTD_WINDOW (widget);
+  priv = window->priv;
+
+  if (priv->save_geometry_timeout_id != 0)
+    {
+      g_source_remove (priv->save_geometry_timeout_id);
+      priv->save_geometry_timeout_id = 0;
+    }
+
+  priv->save_geometry_timeout_id = g_timeout_add (SAVE_GEOMETRY_ID_TIMEOUT,
+                                                  gtd_window__save_geometry,
+                                                  window);
+
+  retval = GTK_WIDGET_CLASS (gtd_window_parent_class)->window_state_event (widget, event);
+
+  return retval;
+}
+
 static void
 gtd_window_constructed (GObject *object)
 {
@@ -617,6 +752,9 @@ gtd_window_constructed (GObject *object)
 
   G_OBJECT_CLASS (gtd_window_parent_class)->constructed (object);
 
+  /* load stored size */
+  gtd_window__load_geometry (GTD_WINDOW (object));
+
   gtk_flow_box_set_sort_func (priv->lists_flowbox,
                               (GtkFlowBoxSortFunc) gtd_window__flowbox_sort_func,
                               NULL,
@@ -773,6 +911,8 @@ gtd_window_class_init (GtdWindowClass *klass)
   object_class->get_property = gtd_window_get_property;
   object_class->set_property = gtd_window_set_property;
 
+  widget_class->window_state_event = gtd_window_state_event;
+
   /**
    * GtdWindow::manager:
    *


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