Commit 8ef4f88a13aafc1dee0865c07f4a105ed5db31d6
1 parent
956af88f
Exists in
master
and in
4 other branches
Fixing segfault when the active terminal is closed.
Showing
4 changed files
with
81 additions
and
6 deletions
Show diff stats
src/include/pw3270/window.h
| ... | ... | @@ -59,6 +59,12 @@ |
| 59 | 59 | GType pw3270ApplicationWindow_get_type(); |
| 60 | 60 | GtkWidget * pw3270_application_window_new(GtkApplication * app, const gchar *session_file); |
| 61 | 61 | |
| 62 | + /// @brief Set the active terminal widget. | |
| 63 | + void pw3270_application_window_set_active_terminal(GtkWidget *window, GtkWidget *terminal); | |
| 64 | + | |
| 65 | + /// @brief Get the active terminal widget. | |
| 66 | + GtkWidget * pw3270_application_window_get_active_terminal(GtkWidget *window); | |
| 67 | + | |
| 62 | 68 | /// @brief Create a new terminal tab. |
| 63 | 69 | GtkWidget * pw3270_application_window_new_tab(GtkWidget *window, const gchar *session_file); |
| 64 | 70 | ... | ... |
src/objects/window/page.c
| ... | ... | @@ -88,7 +88,7 @@ |
| 88 | 88 | |
| 89 | 89 | //---------------------------------------------------------------------------------------------------------------------------------- |
| 90 | 90 | |
| 91 | - static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWindow * window); | |
| 91 | + static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWidget * window); | |
| 92 | 92 | static void session_changed(GtkWidget *terminal, GtkWidget *label); |
| 93 | 93 | static void disconnected(GtkWidget *terminal, GtkWindow * window); |
| 94 | 94 | static void connected(GtkWidget *terminal, const gchar *host, GtkWindow * window); |
| ... | ... | @@ -147,8 +147,11 @@ |
| 147 | 147 | |
| 148 | 148 | } |
| 149 | 149 | |
| 150 | - static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWindow * window) { | |
| 150 | + static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent G_GNUC_UNUSED(*event), GtkWidget * window) { | |
| 151 | 151 | |
| 152 | + pw3270_application_window_set_active_terminal(window,terminal); | |
| 153 | + | |
| 154 | + /* | |
| 152 | 155 | if(gtk_window_get_default_widget(window) == terminal) { |
| 153 | 156 | return FALSE; |
| 154 | 157 | } |
| ... | ... | @@ -186,6 +189,7 @@ |
| 186 | 189 | } |
| 187 | 190 | |
| 188 | 191 | g_strfreev(actions); |
| 192 | + */ | |
| 189 | 193 | |
| 190 | 194 | return FALSE; |
| 191 | 195 | } |
| ... | ... | @@ -233,14 +237,16 @@ |
| 233 | 237 | |
| 234 | 238 | static void destroy(GtkWidget *terminal, GtkWindow * window) { |
| 235 | 239 | |
| 236 | - if(gtk_window_get_default_widget(window) != terminal) { | |
| 237 | - debug("Terminal %p was destroyed (Default one is %p)",__FUNCTION__,gtk_window_get_default_widget(window)); | |
| 240 | + if(pw3270_application_window_get_active_terminal(GTK_WIDGET(window)) != terminal) { | |
| 241 | + debug("Terminal %p was destroyed (Default one is %p)",__FUNCTION__,pw3270_application_window_get_active_terminal(GTK_WIDGET(window))); | |
| 238 | 242 | return; |
| 239 | 243 | } |
| 240 | 244 | |
| 241 | 245 | debug("Default terminal %p was destroyed",__FUNCTION__); |
| 242 | 246 | |
| 243 | - gtk_window_set_default(window,NULL); | |
| 247 | + pw3270_application_window_set_active_terminal(GTK_WIDGET(window),NULL); | |
| 248 | + | |
| 249 | + /* | |
| 244 | 250 | pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host")); |
| 245 | 251 | |
| 246 | 252 | // Update actions |
| ... | ... | @@ -264,6 +270,7 @@ |
| 264 | 270 | } |
| 265 | 271 | |
| 266 | 272 | g_strfreev(actions); |
| 273 | + */ | |
| 267 | 274 | |
| 268 | 275 | } |
| 269 | 276 | ... | ... |
src/objects/window/private.h
src/objects/window/window.c
| ... | ... | @@ -50,6 +50,9 @@ |
| 50 | 50 | |
| 51 | 51 | debug("%s(%p)",__FUNCTION__,widget); |
| 52 | 52 | |
| 53 | + pw3270_application_window_set_active_terminal(widget,NULL); | |
| 54 | + | |
| 55 | + /* | |
| 53 | 56 | // Update actions |
| 54 | 57 | gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget)); |
| 55 | 58 | |
| ... | ... | @@ -67,8 +70,9 @@ |
| 67 | 70 | } |
| 68 | 71 | |
| 69 | 72 | } |
| 70 | - | |
| 71 | 73 | g_strfreev(actions); |
| 74 | + */ | |
| 75 | + | |
| 72 | 76 | |
| 73 | 77 | // Destroy popups |
| 74 | 78 | for(ix = 0; ix < G_N_ELEMENTS(window->popups); ix++) { |
| ... | ... | @@ -383,3 +387,60 @@ |
| 383 | 387 | g_message("Generic action %s was activated",g_action_get_name(G_ACTION(action))); |
| 384 | 388 | } |
| 385 | 389 | |
| 390 | + GtkWidget * pw3270_application_window_get_active_terminal(GtkWidget *widget) { | |
| 391 | + return PW3270_APPLICATION_WINDOW(widget)->terminal; | |
| 392 | + } | |
| 393 | + | |
| 394 | + void pw3270_application_window_set_active_terminal(GtkWidget *widget, GtkWidget *terminal) { | |
| 395 | + | |
| 396 | + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); | |
| 397 | + | |
| 398 | + if(window->terminal == terminal) | |
| 399 | + return; | |
| 400 | + | |
| 401 | + if(terminal && GTK_IS_V3270(terminal)) { | |
| 402 | + | |
| 403 | + window->terminal = terminal; | |
| 404 | + | |
| 405 | + // Store the active terminal widget. | |
| 406 | + gtk_widget_grab_default(terminal); | |
| 407 | + debug("Terminal %p is now default",terminal); | |
| 408 | + | |
| 409 | + // Change window title | |
| 410 | + g_autofree gchar * title = v3270_get_session_title(terminal); | |
| 411 | + gtk_window_set_title(GTK_WINDOW(window), title); | |
| 412 | + | |
| 413 | + pw3270_window_set_subtitle(window, v3270_is_connected(terminal) ? _("Connected to host") : _("Disconnected from host")); | |
| 414 | + | |
| 415 | + } else { | |
| 416 | + | |
| 417 | + terminal = NULL; | |
| 418 | + pw3270_window_set_subtitle(window, _("Disconnected from host")); | |
| 419 | + | |
| 420 | + } | |
| 421 | + | |
| 422 | + // Update actions | |
| 423 | + size_t ix; | |
| 424 | + gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(window)); | |
| 425 | + | |
| 426 | + for(ix = 0; actions[ix]; ix++) { | |
| 427 | + | |
| 428 | +// debug("%s",actions[ix]); | |
| 429 | + | |
| 430 | + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(window), actions[ix]); | |
| 431 | + | |
| 432 | + if(action) { | |
| 433 | + | |
| 434 | + if(V3270_IS_ACTION(action)) { | |
| 435 | + v3270_action_set_terminal_widget(action,terminal); | |
| 436 | + } else if(PW3270_IS_ACTION(action)) { | |
| 437 | + pw3270_action_set_terminal_widget(action,terminal); | |
| 438 | + } | |
| 439 | + | |
| 440 | + } | |
| 441 | + | |
| 442 | + } | |
| 443 | + | |
| 444 | + g_strfreev(actions); | |
| 445 | + | |
| 446 | + } | ... | ... |