[gnome-calendar] gcal-application: save window position and size
- From: Erick Pérez Castellanos <erickpc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] gcal-application: save window position and size
- Date: Tue, 28 May 2013 12:24:50 +0000 (UTC)
commit 262a50a32f3f737f5079d0c19030e63267079717
Author: Erick Pérez Castellanos <erick red gmail com>
Date: Fri May 17 14:30:38 2013 -0400
gcal-application: save window position and size
Format fixes in gcal-application.h
Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=700039
data/org.gnome.calendar.gschema.xml.in | 10 +++
src/gcal-application.c | 131 +++++++++++++++++++++++++++-----
2 files changed, 122 insertions(+), 19 deletions(-)
---
diff --git a/data/org.gnome.calendar.gschema.xml.in b/data/org.gnome.calendar.gschema.xml.in
index 29aace8..2e9517c 100644
--- a/data/org.gnome.calendar.gschema.xml.in
+++ b/data/org.gnome.calendar.gschema.xml.in
@@ -5,6 +5,16 @@
<_summary>Window maximized</_summary>
<_description>Window maximized state</_description>
</key>
+ <key name="window-size" type="ai">
+ <default>[768, 600]</default>
+ <_summary>Window size</_summary>
+ <_description>Window size (width and height).</_description>
+ </key>
+ <key name="window-position" type="ai">
+ <default>[]</default>
+ <_summary>Window position</_summary>
+ <_description>Window position (x and y).</_description>
+ </key>
<key name="active-view" enum="org.gnome.calendar.GcalWindowViewType">
<default>'month'</default>
<_summary>Type of the active view</_summary>
diff --git a/src/gcal-application.c b/src/gcal-application.c
index e969a24..32eec85 100644
--- a/src/gcal-application.c
+++ b/src/gcal-application.c
@@ -41,32 +41,40 @@ struct _GcalApplicationPrivate
GtkCssProvider *provider;
};
-static void gcal_application_finalize (GObject *object);
+static void gcal_application_finalize (GObject *object);
-static void gcal_application_activate (GApplication *app);
+static void gcal_application_activate (GApplication *app);
-static void gcal_application_startup (GApplication *app);
+static void gcal_application_startup (GApplication *app);
-static gint gcal_application_command_line (GApplication *app,
- GApplicationCommandLine *command_line);
+static gint gcal_application_command_line (GApplication *app,
+ GApplicationCommandLine *command_line);
-static void gcal_application_set_app_menu (GApplication *app);
+static void gcal_application_set_app_menu (GApplication *app);
-static void gcal_application_changed_view (GSettings *settings,
- gchar *key,
- gpointer user_data);
+static void gcal_application_changed_view (GSettings *settings,
+ gchar *key,
+ gpointer user_data);
-static void gcal_application_change_view (GSimpleAction *simple,
- GVariant *parameter,
- gpointer user_data);
+static void gcal_application_change_view (GSimpleAction *simple,
+ GVariant *parameter,
+ gpointer user_data);
-static void gcal_application_show_about (GSimpleAction *simple,
- GVariant *parameter,
- gpointer user_data);
+static void gcal_application_show_about (GSimpleAction *simple,
+ GVariant *parameter,
+ gpointer user_data);
-static void gcal_application_quit (GSimpleAction *simple,
- GVariant *parameter,
- gpointer user_data);
+static void gcal_application_quit (GSimpleAction *simple,
+ GVariant *parameter,
+ gpointer user_data);
+
+static gboolean gcal_application_window_state_changed (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+static gboolean gcal_application_window_configured (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
G_DEFINE_TYPE (GcalApplication, gcal_application, GTK_TYPE_APPLICATION);
@@ -132,6 +140,12 @@ gcal_application_activate (GApplication *application)
}
else
{
+ GVariant *variant;
+ gboolean maximized;
+ const gint32 *position;
+ const gint32 *size;
+ gsize n_elements;
+
priv->window =
gcal_window_new_with_view (GCAL_APPLICATION (application),
g_settings_get_enum (priv->settings,
@@ -145,8 +159,34 @@ gcal_application_activate (GApplication *application)
gtk_window_set_hide_titlebar_when_maximized (GTK_WINDOW (priv->window),
TRUE);
- gtk_window_maximize (GTK_WINDOW (priv->window));
+
+ variant = g_settings_get_value (priv->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 (priv->window), size[0], size[1]);
+ g_variant_unref (variant);
+
+ variant = g_settings_get_value (priv->settings, "window-position");
+ position = g_variant_get_fixed_array (variant, &n_elements, sizeof (gint32));
+ if (n_elements == 2)
+ gtk_window_move (GTK_WINDOW (priv->window), position[0], position[1]);
+ g_variant_unref (variant);
+
+ maximized = g_settings_get_boolean (priv->settings, "window-maximized");
+ if (maximized)
+ gtk_window_maximize (GTK_WINDOW (priv->window));
+
gtk_widget_show_all (priv->window);
+
+ g_signal_connect (priv->window,
+ "window-state-event",
+ G_CALLBACK (gcal_application_window_state_changed),
+ application);
+
+ g_signal_connect (priv->window,
+ "configure-event",
+ G_CALLBACK (gcal_application_window_configured),
+ application);
}
}
@@ -376,6 +416,59 @@ gcal_application_quit (GSimpleAction *simple,
g_application_quit (app);
}
+static gboolean
+gcal_application_window_state_changed (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ GcalApplicationPrivate *priv;
+ GdkWindowState state;
+ gboolean maximized;
+
+ priv = GCAL_APPLICATION (user_data)->priv;
+ state = gdk_window_get_state (gtk_widget_get_window (widget));
+ maximized = state & GDK_WINDOW_STATE_MAXIMIZED;
+
+ g_settings_set_boolean (priv->settings, "window-maximized", maximized);
+
+ return FALSE;
+}
+
+static gboolean
+gcal_application_window_configured (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ GcalApplicationPrivate *priv;
+ GVariant *variant;
+ GdkWindowState state;
+ gint32 size[2];
+ gint32 position[2];
+
+ priv = GCAL_APPLICATION (user_data)->priv;
+ state = gdk_window_get_state (gtk_widget_get_window (widget));
+ if (state & GDK_WINDOW_STATE_MAXIMIZED)
+ return FALSE;
+
+ gtk_window_get_size (GTK_WINDOW (priv->window),
+ (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 (priv->settings, "window-size", variant);
+
+ gtk_window_get_position (GTK_WINDOW (priv->window),
+ (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 (priv->settings, "window-position", variant);
+
+ return FALSE;
+}
+
/* Public API */
GcalApplication*
gcal_application_new (void)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]