Commit 7bb1b77534ae033f407234395bc7a81866c04853
1 parent
d4f9d28b
Exists in
master
and in
4 other branches
Fixing cleanup segfaults.
Showing
6 changed files
with
73 additions
and
10 deletions
Show diff stats
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 | ... | ... |