diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-08-01 13:33:42 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-08-01 13:33:42 +0200 |
commit | 72ec802e0387953f19520cace2f63e6db919323b (patch) | |
tree | 735129dc77e6ad4e4d8eb4e653dec569f9e729a7 | |
parent | 6f6f19847c045271ae2d39f330576d92a88c1667 (diff) | |
download | gtk-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.c | 51 | ||||
-rw-r--r-- | src/default.ui | 4 | ||||
-rw-r--r-- | src/experiment-player.h | 11 | ||||
-rw-r--r-- | src/main.c | 69 |
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); @@ -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 |