From 6fe03c5a522a95633e1e60c8ff2996c67d418add Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 21 Sep 2014 13:13:36 +0200 Subject: [PATCH 1/2] Add function ag_window_is_usable() This function can decide if a given window is usable for opening a new chart. --- src/ag-window.c | 17 +++++++++++++++++ src/ag-window.h | 2 ++ 2 files changed, 19 insertions(+) diff --git a/src/ag-window.c b/src/ag-window.c index 33e7d55..f184f44 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -2767,3 +2767,20 @@ ag_window_load_chart_list(AgWindow *window) return TRUE; } + +/** + * ag_window_is_usable: + * @window: an #AgWindow to test + * + * Checks if the given window is usable for new charts. Usability is + * currently means that it has no charts open. + * + * Returns: TRUE if @window is usable, FALSE otherwise + */ +gboolean +ag_window_is_usable(AgWindow *window) +{ + AgWindowPrivate *priv = ag_window_get_instance_private(window); + + return (priv->current_tab == priv->tab_list); +} diff --git a/src/ag-window.h b/src/ag-window.h index 0475451..8bf51bf 100644 --- a/src/ag-window.h +++ b/src/ag-window.h @@ -59,6 +59,8 @@ void ag_window_change_tab(AgWindow *window, const gchar *tab_name); gboolean ag_window_load_chart_list(AgWindow *window); +gboolean ag_window_is_usable(AgWindow *window); + #define AG_WINDOW_ERROR (ag_window_error_quark()) GQuark ag_window_error_quark(void); From 86e6b7e4e5596623cd7b0329ea6ebb7a886ad89c Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 21 Sep 2014 13:23:19 +0200 Subject: [PATCH 2/2] Prevent AgApp for opening a new window for imports unless necessary It checks the current window, then all the other windows if there is a usable among them. Only if there is none, it will create a new window. --- src/ag-app.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/ag-app.c b/src/ag-app.c index 9a2a5bc..1f30506 100644 --- a/src/ag-app.c +++ b/src/ag-app.c @@ -60,6 +60,36 @@ ag_app_create_window(AgApp *app) return window; } +static GtkWidget * +ag_app_get_usable_window(AgApp *app) +{ + GtkWidget *window; + GList *l; + + // Favour current window + window = GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(app))); + + if (AG_IS_WINDOW(window) && ag_window_is_usable(AG_WINDOW(window))) { + return window; + } + + // Otherwise, let’s use the first existing, usable window + for ( + l = gtk_application_get_windows(GTK_APPLICATION(app)); + l; + l = g_list_next(l) + ) { + if (AG_IS_WINDOW(l->data) && ag_window_is_usable(AG_WINDOW(l->data))) { + return l->data; + } + } + + // If we are still here, no usable windows were found. Let’s create one + window = ag_app_create_window(app); + + return window; +} + static void new_window_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) { @@ -165,11 +195,12 @@ ag_app_import_file(AgApp *app, GFile *file, AgAppImportType type) return; } - window = ag_app_create_window(app); + window = ag_app_get_usable_window(app); ag_window_set_chart(AG_WINDOW(window), chart); ag_window_update_from_chart(AG_WINDOW(window)); g_action_group_activate_action(G_ACTION_GROUP(window), "save", NULL); ag_window_change_tab(AG_WINDOW(window), "chart"); + gtk_window_present(GTK_WINDOW(window)); } static void