Commit 7bb1b77534ae033f407234395bc7a81866c04853

Authored by Perry Werneck
1 parent d4f9d28b

Fixing cleanup segfaults.

src/objects/actions/abstract.c
... ... @@ -365,7 +365,11 @@
365 365  
366 366 void pw3270_action_set_terminal_widget(GAction *object, GtkWidget *widget) {
367 367  
368   - g_return_if_fail(PW3270_IS_ACTION(object) && GTK_IS_V3270(widget));
  368 + g_return_if_fail(PW3270_IS_ACTION(object));
  369 +
  370 + if(widget) {
  371 + g_return_if_fail(GTK_IS_V3270(widget));
  372 + }
369 373  
370 374 pw3270Action * action = PW3270_ACTION(object);
371 375  
... ... @@ -380,10 +384,6 @@
380 384  
381 385 pw3270Action * action = PW3270_ACTION(object);
382 386  
383   -// debug("%s(%s) action=%p terminal=%p",__FUNCTION__,pw3270_action_get_name(object),action,action->terminal);
384   -
385   -// debug("%s: terminal=%p",__FUNCTION__,action->terminal);
386   -
387 387 if(action && action->terminal) {
388 388 return PW3270_ACTION_GET_CLASS(object)->get_enabled(object,action->terminal);
389 389 }
... ...
src/objects/actions/clipboard.c
... ... @@ -68,7 +68,7 @@
68 68 .summary = N_( "Copy selected area to clipboard." ),
69 69 .activate = NULL,
70 70  
71   - .group = LIB3270_ACTION_GROUP_SELECTED,
  71 + .group = LIB3270_ACTION_GROUP_SELECTION,
72 72 .activatable = lib3270_has_selection
73 73  
74 74 };
... ... @@ -93,7 +93,7 @@
93 93 .summary = N_( "Cut selected area." ),
94 94 .activate = NULL,
95 95  
96   - .group = LIB3270_ACTION_GROUP_SELECTED,
  96 + .group = LIB3270_ACTION_GROUP_SELECTION,
97 97 .activatable = lib3270_has_selection
98 98  
99 99 };
... ...
src/objects/actions/lib3270/action.c
... ... @@ -60,8 +60,13 @@
60 60  
61 61 static gboolean get_enabled(GAction *action, GtkWidget *terminal) {
62 62  
63   - if(terminal)
64   - return PW3270_LIB3270_ACTION(action)->definition->activatable(v3270_get_session(terminal)) > 0 ? TRUE : FALSE;
  63 + if(terminal) {
  64 +
  65 + H3270 * hSession = v3270_get_session(terminal);
  66 + if(hSession)
  67 + return PW3270_LIB3270_ACTION(action)->definition->activatable(hSession) > 0 ? TRUE : FALSE;
  68 +
  69 + }
65 70  
66 71 return FALSE;
67 72  
... ... @@ -134,6 +139,7 @@
134 139 }
135 140  
136 141 static gboolean bg_notify_enabled(GAction *action) {
  142 + debug("Action %s was notified (%s)",g_action_get_name(action),g_action_get_enabled(action) ? "Enabled" : "Disabled");
137 143 pw3270_action_notify_enabled(action);
138 144 return FALSE;
139 145 }
... ...
src/objects/actions/private.h
... ... @@ -91,6 +91,7 @@
91 91 // Internal actions
92 92 G_GNUC_INTERNAL GAction * pw3270_connect_action_new(void);
93 93 G_GNUC_INTERNAL GAction * pw3270_copy_action_new(void);
  94 + G_GNUC_INTERNAL GAction * pw3270_cut_action_new(void);
94 95 G_GNUC_INTERNAL GAction * pw3270_paste_action_new(void);
95 96  
96 97 #endif // PRIVATE_H_INCLUDED
... ...
src/objects/window/terminal.c
... ... @@ -87,6 +87,34 @@
87 87 return FALSE;
88 88 }
89 89  
  90 + static void on_terminal_destroy(GtkWidget *terminal, GtkWindow * window) {
  91 +
  92 + if(gtk_window_get_default_widget(window) != terminal) {
  93 + return;
  94 + }
  95 +
  96 + gtk_window_set_default(window,NULL);
  97 + pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host"));
  98 +
  99 + // Update actions
  100 + size_t ix;
  101 + gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(window));
  102 +
  103 + for(ix = 0; actions[ix]; ix++) {
  104 +
  105 + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(window), actions[ix]);
  106 +
  107 + if(action && PW3270_IS_ACTION(action)) {
  108 + pw3270_action_set_terminal_widget(action,NULL);
  109 + }
  110 +
  111 + }
  112 +
  113 + g_strfreev(actions);
  114 +
  115 + }
  116 +
  117 +
90 118 static gboolean bg_auto_connect(GtkWidget *terminal) {
91 119 v3270_reconnect(terminal);
92 120 return FALSE;
... ... @@ -135,6 +163,7 @@
135 163 g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label);
136 164 g_signal_connect(G_OBJECT(terminal), "disconnected", G_CALLBACK(disconnected),window);
137 165 g_signal_connect(G_OBJECT(terminal), "connected", G_CALLBACK(connected),window);
  166 + g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(on_terminal_destroy),window);
138 167  
139 168 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_close_tab), terminal);
140 169  
... ...
src/objects/window/window.c
... ... @@ -35,7 +35,34 @@
35 35  
36 36 G_DEFINE_TYPE(pw3270ApplicationWindow, pw3270ApplicationWindow, GTK_TYPE_APPLICATION_WINDOW);
37 37  
38   - static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass G_GNUC_UNUSED(*klass)) {
  38 + static void destroy(GtkWidget *widget) {
  39 +
  40 + debug("%s(%p)",__FUNCTION__,widget);
  41 +
  42 + // Update actions
  43 + size_t ix;
  44 + gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget));
  45 +
  46 + for(ix = 0; actions[ix]; ix++) {
  47 + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget), actions[ix]);
  48 +
  49 + if(action && PW3270_IS_ACTION(action)) {
  50 + pw3270_action_set_terminal_widget(action,NULL);
  51 + }
  52 +
  53 + }
  54 +
  55 + g_strfreev(actions);
  56 +
  57 + GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->destroy(widget);
  58 +
  59 + }
  60 +
  61 + static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) {
  62 +
  63 + GtkWidgetClass * widget = GTK_WIDGET_CLASS(klass);
  64 + widget->destroy = destroy;
  65 +
39 66  
40 67 }
41 68  
... ...