aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
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 /src/main.c
parent6f6f19847c045271ae2d39f330576d92a88c1667 (diff)
downloadexperiment-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...)
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c69
1 files changed, 68 insertions, 1 deletions
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