From 7bb1b77534ae033f407234395bc7a81866c04853 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 28 Oct 2019 16:08:19 -0300 Subject: [PATCH] Fixing cleanup segfaults. --- src/objects/actions/abstract.c | 10 +++++----- src/objects/actions/clipboard.c | 4 ++-- src/objects/actions/lib3270/action.c | 10 ++++++++-- src/objects/actions/private.h | 1 + src/objects/window/terminal.c | 29 +++++++++++++++++++++++++++++ src/objects/window/window.c | 29 ++++++++++++++++++++++++++++- 6 files changed, 73 insertions(+), 10 deletions(-) diff --git a/src/objects/actions/abstract.c b/src/objects/actions/abstract.c index 2b0c215..3af4ad5 100644 --- a/src/objects/actions/abstract.c +++ b/src/objects/actions/abstract.c @@ -365,7 +365,11 @@ void pw3270_action_set_terminal_widget(GAction *object, GtkWidget *widget) { - g_return_if_fail(PW3270_IS_ACTION(object) && GTK_IS_V3270(widget)); + g_return_if_fail(PW3270_IS_ACTION(object)); + + if(widget) { + g_return_if_fail(GTK_IS_V3270(widget)); + } pw3270Action * action = PW3270_ACTION(object); @@ -380,10 +384,6 @@ pw3270Action * action = PW3270_ACTION(object); -// debug("%s(%s) action=%p terminal=%p",__FUNCTION__,pw3270_action_get_name(object),action,action->terminal); - -// debug("%s: terminal=%p",__FUNCTION__,action->terminal); - if(action && action->terminal) { return PW3270_ACTION_GET_CLASS(object)->get_enabled(object,action->terminal); } diff --git a/src/objects/actions/clipboard.c b/src/objects/actions/clipboard.c index de67b7d..89ed8f7 100644 --- a/src/objects/actions/clipboard.c +++ b/src/objects/actions/clipboard.c @@ -68,7 +68,7 @@ .summary = N_( "Copy selected area to clipboard." ), .activate = NULL, - .group = LIB3270_ACTION_GROUP_SELECTED, + .group = LIB3270_ACTION_GROUP_SELECTION, .activatable = lib3270_has_selection }; @@ -93,7 +93,7 @@ .summary = N_( "Cut selected area." ), .activate = NULL, - .group = LIB3270_ACTION_GROUP_SELECTED, + .group = LIB3270_ACTION_GROUP_SELECTION, .activatable = lib3270_has_selection }; diff --git a/src/objects/actions/lib3270/action.c b/src/objects/actions/lib3270/action.c index e5bec1c..3a97c50 100644 --- a/src/objects/actions/lib3270/action.c +++ b/src/objects/actions/lib3270/action.c @@ -60,8 +60,13 @@ static gboolean get_enabled(GAction *action, GtkWidget *terminal) { - if(terminal) - return PW3270_LIB3270_ACTION(action)->definition->activatable(v3270_get_session(terminal)) > 0 ? TRUE : FALSE; + if(terminal) { + + H3270 * hSession = v3270_get_session(terminal); + if(hSession) + return PW3270_LIB3270_ACTION(action)->definition->activatable(hSession) > 0 ? TRUE : FALSE; + + } return FALSE; @@ -134,6 +139,7 @@ } static gboolean bg_notify_enabled(GAction *action) { + debug("Action %s was notified (%s)",g_action_get_name(action),g_action_get_enabled(action) ? "Enabled" : "Disabled"); pw3270_action_notify_enabled(action); return FALSE; } diff --git a/src/objects/actions/private.h b/src/objects/actions/private.h index 6fffb48..66ad1ef 100644 --- a/src/objects/actions/private.h +++ b/src/objects/actions/private.h @@ -91,6 +91,7 @@ // Internal actions G_GNUC_INTERNAL GAction * pw3270_connect_action_new(void); G_GNUC_INTERNAL GAction * pw3270_copy_action_new(void); + G_GNUC_INTERNAL GAction * pw3270_cut_action_new(void); G_GNUC_INTERNAL GAction * pw3270_paste_action_new(void); #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index 5bee4e5..933dc6e 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -87,6 +87,34 @@ return FALSE; } + static void on_terminal_destroy(GtkWidget *terminal, GtkWindow * window) { + + if(gtk_window_get_default_widget(window) != terminal) { + return; + } + + gtk_window_set_default(window,NULL); + pw3270_window_set_subtitle(GTK_WIDGET(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++) { + + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(window), actions[ix]); + + if(action && PW3270_IS_ACTION(action)) { + pw3270_action_set_terminal_widget(action,NULL); + } + + } + + g_strfreev(actions); + + } + + static gboolean bg_auto_connect(GtkWidget *terminal) { v3270_reconnect(terminal); return FALSE; @@ -135,6 +163,7 @@ g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label); g_signal_connect(G_OBJECT(terminal), "disconnected", G_CALLBACK(disconnected),window); g_signal_connect(G_OBJECT(terminal), "connected", G_CALLBACK(connected),window); + g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(on_terminal_destroy),window); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_close_tab), terminal); diff --git a/src/objects/window/window.c b/src/objects/window/window.c index 9b3143f..761df55 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -35,7 +35,34 @@ G_DEFINE_TYPE(pw3270ApplicationWindow, pw3270ApplicationWindow, GTK_TYPE_APPLICATION_WINDOW); - static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass G_GNUC_UNUSED(*klass)) { + static void destroy(GtkWidget *widget) { + + debug("%s(%p)",__FUNCTION__,widget); + + // Update actions + size_t ix; + gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget)); + + for(ix = 0; actions[ix]; ix++) { + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget), actions[ix]); + + if(action && PW3270_IS_ACTION(action)) { + pw3270_action_set_terminal_widget(action,NULL); + } + + } + + g_strfreev(actions); + + GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->destroy(widget); + + } + + static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) { + + GtkWidgetClass * widget = GTK_WIDGET_CLASS(klass); + widget->destroy = destroy; + } -- libgit2 0.21.2