diff --git a/src/include/pw3270/window.h b/src/include/pw3270/window.h index b01c879..49d0744 100644 --- a/src/include/pw3270/window.h +++ b/src/include/pw3270/window.h @@ -59,6 +59,12 @@ GType pw3270ApplicationWindow_get_type(); GtkWidget * pw3270_application_window_new(GtkApplication * app, const gchar *session_file); + /// @brief Set the active terminal widget. + void pw3270_application_window_set_active_terminal(GtkWidget *window, GtkWidget *terminal); + + /// @brief Get the active terminal widget. + GtkWidget * pw3270_application_window_get_active_terminal(GtkWidget *window); + /// @brief Create a new terminal tab. GtkWidget * pw3270_application_window_new_tab(GtkWidget *window, const gchar *session_file); diff --git a/src/objects/window/page.c b/src/objects/window/page.c index 5995cb0..57503d9 100644 --- a/src/objects/window/page.c +++ b/src/objects/window/page.c @@ -88,7 +88,7 @@ //---------------------------------------------------------------------------------------------------------------------------------- - static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWindow * window); + static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWidget * window); static void session_changed(GtkWidget *terminal, GtkWidget *label); static void disconnected(GtkWidget *terminal, GtkWindow * window); static void connected(GtkWidget *terminal, const gchar *host, GtkWindow * window); @@ -147,8 +147,11 @@ } - static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWindow * window) { + static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWidget * window) { + pw3270_application_window_set_active_terminal(window,terminal); + + /* if(gtk_window_get_default_widget(window) == terminal) { return FALSE; } @@ -186,6 +189,7 @@ } g_strfreev(actions); + */ return FALSE; } @@ -233,14 +237,16 @@ static void destroy(GtkWidget *terminal, GtkWindow * window) { - if(gtk_window_get_default_widget(window) != terminal) { - debug("Terminal %p was destroyed (Default one is %p)",__FUNCTION__,gtk_window_get_default_widget(window)); + if(pw3270_application_window_get_active_terminal(GTK_WIDGET(window)) != terminal) { + debug("Terminal %p was destroyed (Default one is %p)",__FUNCTION__,pw3270_application_window_get_active_terminal(GTK_WIDGET(window))); return; } debug("Default terminal %p was destroyed",__FUNCTION__); - gtk_window_set_default(window,NULL); + pw3270_application_window_set_active_terminal(GTK_WIDGET(window),NULL); + + /* pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host")); // Update actions @@ -264,6 +270,7 @@ } g_strfreev(actions); + */ } diff --git a/src/objects/window/private.h b/src/objects/window/private.h index 69504a3..6a2cb9c 100644 --- a/src/objects/window/private.h +++ b/src/objects/window/private.h @@ -60,6 +60,7 @@ GtkApplicationWindow parent; + GtkWidget * terminal; ///< @brief The active terminal. GtkNotebook * notebook; GtkToolbar * toolbar; diff --git a/src/objects/window/window.c b/src/objects/window/window.c index 3abbedd..1473b0a 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -50,6 +50,9 @@ debug("%s(%p)",__FUNCTION__,widget); + pw3270_application_window_set_active_terminal(widget,NULL); + + /* // Update actions gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget)); @@ -67,8 +70,9 @@ } } - g_strfreev(actions); + */ + // Destroy popups for(ix = 0; ix < G_N_ELEMENTS(window->popups); ix++) { @@ -383,3 +387,60 @@ g_message("Generic action %s was activated",g_action_get_name(G_ACTION(action))); } + GtkWidget * pw3270_application_window_get_active_terminal(GtkWidget *widget) { + return PW3270_APPLICATION_WINDOW(widget)->terminal; + } + + void pw3270_application_window_set_active_terminal(GtkWidget *widget, GtkWidget *terminal) { + + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); + + if(window->terminal == terminal) + return; + + if(terminal && GTK_IS_V3270(terminal)) { + + window->terminal = terminal; + + // Store the active terminal widget. + gtk_widget_grab_default(terminal); + debug("Terminal %p is now default",terminal); + + // Change window title + g_autofree gchar * title = v3270_get_session_title(terminal); + gtk_window_set_title(GTK_WINDOW(window), title); + + pw3270_window_set_subtitle(window, v3270_is_connected(terminal) ? _("Connected to host") : _("Disconnected from host")); + + } else { + + terminal = NULL; + pw3270_window_set_subtitle(window, _("Disconnected from host")); + + } + + // Update actions + size_t ix; + gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(window)); + + for(ix = 0; actions[ix]; ix++) { + +// debug("%s",actions[ix]); + + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(window), actions[ix]); + + if(action) { + + if(V3270_IS_ACTION(action)) { + v3270_action_set_terminal_widget(action,terminal); + } else if(PW3270_IS_ACTION(action)) { + pw3270_action_set_terminal_widget(action,terminal); + } + + } + + } + + g_strfreev(actions); + + } -- libgit2 0.21.2