aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-08-01 13:33:42 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-08-01 13:33:42 +0200
commit72ec802e0387953f19520cace2f63e6db919323b (patch)
tree735129dc77e6ad4e4d8eb4e653dec569f9e729a7
parent6f6f19847c045271ae2d39f330576d92a88c1667 (diff)
downloadgtk-vlc-player-72ec802e0387953f19520cace2f63e6db919323b.tar.gz
save/restore window positions
* use X-style geometry strings * glade-configured default window sizes serve as configuration defaults * don't let glade show the windows since after they are shown, gtk_window_parse_geometry() cannot set the default size * prevent (main) window deletion from destroying the window widget so we can still query window properties (like position and size) * explicitly destroy window widgets (currently broken) * saving/restoring window position can be disabled via config file since some window managers can restore positions on their own (KDE...)
-rw-r--r--src/config.c51
-rw-r--r--src/default.ui4
-rw-r--r--src/experiment-player.h11
-rw-r--r--src/main.c69
4 files changed, 130 insertions, 5 deletions
diff --git a/src/config.c b/src/config.c
index 9c0927d..20f8260 100644
--- a/src/config.c
+++ b/src/config.c
@@ -36,7 +36,11 @@
static inline void set_default_string(const gchar *group_name, const gchar *key,
const gchar *string);
+static inline void set_default_boolean(const gchar *group_name, const gchar *key,
+ gboolean boolean);
+
static const gchar *get_group_by_actor(const gchar *actor);
+static const gchar *get_group_by_window(const gchar *window);
static GKeyFile *keyfile;
static gchar *filename = NULL;
@@ -55,6 +59,8 @@ config_init_key_file(void)
CONFIG_KEY_FILE, NULL);
/* initialize defaults */
+ set_default_boolean("Global", "Save-Window-Properties", TRUE);
+
set_default_string("Directories", "Quick-Open", DEFAULT_QUICKOPEN_DIR);
set_default_string("Directories", "Formats", DEFAULT_FORMATS_DIR);
@@ -86,6 +92,51 @@ set_default_string(const gchar *group_name, const gchar *key,
g_key_file_set_string(keyfile, group_name, key, string);
}
+static inline void
+set_default_boolean(const gchar *group_name, const gchar *key,
+ gboolean boolean)
+{
+ if (!g_key_file_has_key(keyfile, group_name, key, NULL))
+ g_key_file_set_boolean(keyfile, group_name, key, boolean);
+}
+
+void
+config_set_save_window_properties(gboolean enabled)
+{
+ g_key_file_set_boolean(keyfile, "Global",
+ "Save-Window-Properties", enabled);
+}
+
+gboolean
+config_get_save_window_properties(void)
+{
+ return g_key_file_get_boolean(keyfile, "Global",
+ "Save-Window-Properties", NULL);
+}
+
+static const gchar *
+get_group_by_window(const gchar *window)
+{
+ static gchar group[255];
+
+ g_snprintf(group, sizeof(group), "%s Window", window);
+ return group;
+}
+
+void
+config_set_window_geometry(const gchar *window, const gchar *geometry)
+{
+ g_key_file_set_string(keyfile, get_group_by_window(window),
+ "Geometry", geometry);
+}
+
+gchar *
+config_get_window_geometry(const gchar *window)
+{
+ return g_key_file_get_string(keyfile, get_group_by_window(window),
+ "Geometry", NULL);
+}
+
void
config_set_quickopen_directory(const gchar *dir)
{
diff --git a/src/default.ui b/src/default.ui
index e360e39..c6e4e0c 100644
--- a/src/default.ui
+++ b/src/default.ui
@@ -5,11 +5,10 @@
<!-- interface-requires gtk-experiment-widgets 0.0 -->
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="player_window">
- <property name="visible">True</property>
<property name="title" translatable="yes">Experiment Player</property>
<property name="default_width">400</property>
<property name="default_height">300</property>
- <signal name="destroy" handler="generic_quit_cb"/>
+ <signal name="delete_event" handler="player_window_delete_event_cb"/>
<child>
<object class="GtkVBox" id="player_window_vbox">
<property name="visible">True</property>
@@ -302,7 +301,6 @@ audio-volume-medium</property>
<property name="stock">gtk-help</property>
</object>
<object class="GtkWindow" id="info_window">
- <property name="visible">True</property>
<property name="title" translatable="yes">Experiment Data</property>
<property name="default_width">680</property>
<property name="default_height">700</property>
diff --git a/src/experiment-player.h b/src/experiment-player.h
index 0096b7a..9556ea8 100644
--- a/src/experiment-player.h
+++ b/src/experiment-player.h
@@ -50,7 +50,11 @@ gboolean load_transcript_file(const gchar *file);
void show_message_dialog_gerror(GError *err);
-extern GtkWidget *about_dialog;
+const gchar *window_get_geometry(GtkWindow *window);
+
+extern GtkWidget *player_window,
+ *info_window,
+ *about_dialog;
extern GtkWidget *player_widget,
*controls_hbox,
@@ -75,6 +79,11 @@ extern gchar *current_filename;
*/
void config_init_key_file(void);
+void config_set_save_window_properties(gboolean enabled);
+gboolean config_get_save_window_properties(void);
+void config_set_window_geometry(const gchar *window, const gchar *geometry);
+gchar *config_get_window_geometry(const gchar *window);
+
void config_set_quickopen_directory(const gchar *dir);
gchar *config_get_quickopen_directory(void);
void config_set_formats_directory(const gchar *dir);
diff --git a/src/main.c b/src/main.c
index 0f3cfd4..0f87ac1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -53,7 +53,9 @@
static inline void button_image_set_from_stock(GtkButton *widget,
const gchar *name);
-GtkWidget *about_dialog;
+GtkWidget *player_window,
+ *info_window,
+ *about_dialog;
GtkWidget *player_widget,
*controls_hbox,
@@ -227,6 +229,18 @@ help_menu_manual_item_activate_cb(GtkWidget *widget __attribute__((unused)),
}
/** @private */
+gboolean
+player_window_delete_event_cb(GtkWidget *widget __attribute__((unused)),
+ GdkEvent *event __attribute__((unused)),
+ gpointer user_data __attribute__((unused)))
+{
+ gtk_main_quit();
+
+ /* do not destroy window (yet) */
+ return TRUE;
+}
+
+/** @private */
void
navigator_widget_time_selected_cb(GtkWidget *widget, gint64 selected_time,
gpointer user_data __attribute__((unused)))
@@ -362,6 +376,20 @@ show_message_dialog_gerror(GError *err)
gtk_widget_destroy(dialog);
}
+const gchar *
+window_get_geometry(GtkWindow *window)
+{
+ static gchar geometry[255];
+ gint width, height, x, y;
+
+ gtk_window_get_size(window, &width, &height);
+ gtk_window_get_position(window, &x, &y);
+ g_snprintf(geometry, sizeof(geometry), "%dx%d+%d+%d",
+ width, height, x, y);
+
+ return geometry;
+}
+
/** @private */
int
main(int argc, char *argv[])
@@ -401,6 +429,8 @@ main(int argc, char *argv[])
gtk_builder_add_from_file(builder, DEFAULT_UI, NULL);
gtk_builder_connect_signals(builder, NULL);
+ BUILDER_INIT(builder, player_window);
+ BUILDER_INIT(builder, info_window);
BUILDER_INIT(builder, about_dialog);
BUILDER_INIT(builder, player_widget);
@@ -511,6 +541,29 @@ main(int argc, char *argv[])
refresh_quickopen_menu(GTK_MENU(quickopen_menu));
+ /* configure windows */
+ gtk_window_set_gravity(GTK_WINDOW(player_window), GDK_GRAVITY_STATIC);
+ gtk_window_set_gravity(GTK_WINDOW(info_window), GDK_GRAVITY_STATIC);
+
+ if (config_get_save_window_properties()) {
+ gchar *geometry;
+
+ geometry = config_get_window_geometry("Player");
+ if (geometry != NULL)
+ gtk_window_parse_geometry(GTK_WINDOW(player_window),
+ geometry);
+ g_free(geometry);
+
+ geometry = config_get_window_geometry("Info");
+ if (geometry != NULL)
+ gtk_window_parse_geometry(GTK_WINDOW(info_window),
+ geometry);
+ g_free(geometry);
+ }
+
+ gtk_widget_show(player_window);
+ gtk_widget_show(info_window);
+
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
@@ -518,6 +571,16 @@ main(int argc, char *argv[])
/*
* update config file
*/
+ if (config_get_save_window_properties()) {
+ const gchar *geometry;
+
+ geometry = window_get_geometry(GTK_WINDOW(player_window));
+ config_set_window_geometry("Player", geometry);
+
+ geometry = window_get_geometry(GTK_WINDOW(info_window));
+ config_set_window_geometry("Info", geometry);
+ }
+
modified_style = gtk_widget_get_modifier_style(transcript_wizard_widget);
config_set_transcript_font(SPEAKER_WIZARD, modified_style->font_desc);
config_set_transcript_text_color(SPEAKER_WIZARD,
@@ -570,5 +633,9 @@ main(int argc, char *argv[])
config_save_key_file();
+ /* destroy all widgets (clean up) */
+ gtk_widget_destroy(player_window);
+ gtk_widget_destroy(info_window);
+
return 0;
} \ No newline at end of file