[gnome-todo] window: load & store geometry
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-todo] window: load & store geometry
- Date: Thu, 27 Aug 2015 02:00:24 +0000 (UTC)
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]