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,6 +59,12 @@ | ||
59 | GType pw3270ApplicationWindow_get_type(); | 59 | GType pw3270ApplicationWindow_get_type(); |
60 | GtkWidget * pw3270_application_window_new(GtkApplication * app, const gchar *session_file); | 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 | /// @brief Create a new terminal tab. | 68 | /// @brief Create a new terminal tab. |
63 | GtkWidget * pw3270_application_window_new_tab(GtkWidget *window, const gchar *session_file); | 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,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 | static void session_changed(GtkWidget *terminal, GtkWidget *label); | 92 | static void session_changed(GtkWidget *terminal, GtkWidget *label); |
93 | static void disconnected(GtkWidget *terminal, GtkWindow * window); | 93 | static void disconnected(GtkWidget *terminal, GtkWindow * window); |
94 | static void connected(GtkWidget *terminal, const gchar *host, GtkWindow * window); | 94 | static void connected(GtkWidget *terminal, const gchar *host, GtkWindow * window); |
@@ -147,8 +147,11 @@ | @@ -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 | if(gtk_window_get_default_widget(window) == terminal) { | 155 | if(gtk_window_get_default_widget(window) == terminal) { |
153 | return FALSE; | 156 | return FALSE; |
154 | } | 157 | } |
@@ -186,6 +189,7 @@ | @@ -186,6 +189,7 @@ | ||
186 | } | 189 | } |
187 | 190 | ||
188 | g_strfreev(actions); | 191 | g_strfreev(actions); |
192 | + */ | ||
189 | 193 | ||
190 | return FALSE; | 194 | return FALSE; |
191 | } | 195 | } |
@@ -233,14 +237,16 @@ | @@ -233,14 +237,16 @@ | ||
233 | 237 | ||
234 | static void destroy(GtkWidget *terminal, GtkWindow * window) { | 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 | return; | 242 | return; |
239 | } | 243 | } |
240 | 244 | ||
241 | debug("Default terminal %p was destroyed",__FUNCTION__); | 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 | pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host")); | 250 | pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host")); |
245 | 251 | ||
246 | // Update actions | 252 | // Update actions |
@@ -264,6 +270,7 @@ | @@ -264,6 +270,7 @@ | ||
264 | } | 270 | } |
265 | 271 | ||
266 | g_strfreev(actions); | 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,6 +50,9 @@ | ||
50 | 50 | ||
51 | debug("%s(%p)",__FUNCTION__,widget); | 51 | debug("%s(%p)",__FUNCTION__,widget); |
52 | 52 | ||
53 | + pw3270_application_window_set_active_terminal(widget,NULL); | ||
54 | + | ||
55 | + /* | ||
53 | // Update actions | 56 | // Update actions |
54 | gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget)); | 57 | gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget)); |
55 | 58 | ||
@@ -67,8 +70,9 @@ | @@ -67,8 +70,9 @@ | ||
67 | } | 70 | } |
68 | 71 | ||
69 | } | 72 | } |
70 | - | ||
71 | g_strfreev(actions); | 73 | g_strfreev(actions); |
74 | + */ | ||
75 | + | ||
72 | 76 | ||
73 | // Destroy popups | 77 | // Destroy popups |
74 | for(ix = 0; ix < G_N_ELEMENTS(window->popups); ix++) { | 78 | for(ix = 0; ix < G_N_ELEMENTS(window->popups); ix++) { |
@@ -383,3 +387,60 @@ | @@ -383,3 +387,60 @@ | ||
383 | g_message("Generic action %s was activated",g_action_get_name(G_ACTION(action))); | 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 | + } |