Commit 96de119b703179e71451925ca3b74147c18ddc9b
1 parent
595c171e
Exists in
master
and in
1 other branch
Refactoring trace window.
Showing
6 changed files
with
161 additions
and
24 deletions
Show diff stats
src/include/v3270.h
... | ... | @@ -183,7 +183,7 @@ |
183 | 183 | #endif // v3270_char |
184 | 184 | |
185 | 185 | LIB3270_EXPORT GtkWidget * v3270_new(void); |
186 | - LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget, const gchar *header); | |
186 | + LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget); | |
187 | 187 | LIB3270_EXPORT GType v3270_get_type(void); |
188 | 188 | LIB3270_EXPORT void v3270_reload(GtkWidget * widget); |
189 | 189 | LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name); | ... | ... |
src/terminal/widget.c
... | ... | @@ -228,6 +228,12 @@ static void v3270_toggle_changed(G_GNUC_UNUSED v3270 *widget, G_GNUC_UNUSED LIB3 |
228 | 228 | { |
229 | 229 | } |
230 | 230 | |
231 | +static void finalize(GObject *object) | |
232 | + { | |
233 | + debug("V3270::%s",__FUNCTION__); | |
234 | + G_OBJECT_CLASS(v3270_parent_class)->finalize(object); | |
235 | + } | |
236 | + | |
231 | 237 | static void v3270_class_init(v3270Class *klass) |
232 | 238 | { |
233 | 239 | GObjectClass * gobject_class = G_OBJECT_CLASS(klass); |
... | ... | @@ -239,6 +245,9 @@ static void v3270_class_init(v3270Class *klass) |
239 | 245 | |
240 | 246 | lib3270_set_log_handler(loghandler); |
241 | 247 | |
248 | + // Object methods | |
249 | + gobject_class->finalize = finalize; | |
250 | + | |
242 | 251 | // Widget methods |
243 | 252 | widget_class->realize = v3270_realize; |
244 | 253 | widget_class->size_allocate = v3270_size_allocate; | ... | ... |
src/testprogram/testprogram.c
... | ... | @@ -150,11 +150,12 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term |
150 | 150 | |
151 | 151 | static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) |
152 | 152 | { |
153 | + /* | |
153 | 154 | GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test")); |
154 | 155 | GtkWidget * trace = v3270_trace_new(terminal); |
155 | 156 | gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),trace,TRUE,TRUE,2); |
157 | + */ | |
156 | 158 | |
157 | - /* | |
158 | 159 | // |
159 | 160 | // Test activity |
160 | 161 | // |
... | ... | @@ -164,11 +165,13 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) |
164 | 165 | v3270_ft_activity_set_remote_filename(activity,"remote_file"); |
165 | 166 | v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP); |
166 | 167 | |
168 | + /* | |
167 | 169 | // |
168 | 170 | // Test settings dialog |
169 | 171 | // |
170 | 172 | GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal); |
171 | 173 | v3270_ft_settings_dialog_append_activity(dialog,activity,NULL); |
174 | + */ | |
172 | 175 | |
173 | 176 | // |
174 | 177 | // Test worker widget |
... | ... | @@ -179,7 +182,6 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) |
179 | 182 | v3270_ft_worker_set_session(worker,v3270_get_session(terminal)); |
180 | 183 | v3270_ft_worker_set_activity(worker,activity); |
181 | 184 | v3270_ft_worker_start(worker); |
182 | - */ | |
183 | 185 | |
184 | 186 | gtk_widget_show_all(dialog); |
185 | 187 | gtk_dialog_run(GTK_DIALOG(dialog)); |
... | ... | @@ -224,15 +226,13 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { |
224 | 226 | // v3270_set_font_family(terminal,"Droid Sans Mono"); |
225 | 227 | g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window); |
226 | 228 | |
227 | - /* | |
228 | - GtkWidget *trace = v3270_new_trace_window(terminal,NULL); | |
229 | + GtkWidget *trace = v3270_new_trace_window(terminal); | |
229 | 230 | if(trace) { |
230 | 231 | g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); |
231 | 232 | lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE); |
232 | 233 | lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); |
233 | 234 | gtk_widget_show_all(trace); |
234 | 235 | } |
235 | - */ | |
236 | 236 | |
237 | 237 | /* |
238 | 238 | v3270_connect(terminal); | ... | ... |
src/trace/exec.c
... | ... | @@ -40,9 +40,9 @@ |
40 | 40 | #include <lib3270/log.h> |
41 | 41 | #include <lib3270/trace.h> |
42 | 42 | #include <lib3270/properties.h> |
43 | + #include <v3270.h> | |
43 | 44 | #include <v3270/trace.h> |
44 | 45 | |
45 | - /* | |
46 | 46 | static const gchar * get_word(gchar **ptr) |
47 | 47 | { |
48 | 48 | gchar *rc = g_strstrip(*ptr); |
... | ... | @@ -59,9 +59,7 @@ |
59 | 59 | |
60 | 60 | return rc; |
61 | 61 | } |
62 | - */ | |
63 | 62 | |
64 | - /* | |
65 | 63 | static int set_property(H3270 *hSession, const gchar *name, const gchar * value) |
66 | 64 | { |
67 | 65 | size_t ix; |
... | ... | @@ -106,11 +104,11 @@ |
106 | 104 | return errno = ENOENT; |
107 | 105 | |
108 | 106 | } |
109 | - */ | |
110 | 107 | |
111 | 108 | int v3270_exec_command(GtkWidget *widget, const gchar *text) |
112 | 109 | { |
113 | - /* | |
110 | + g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); | |
111 | + | |
114 | 112 | H3270 *hSession = v3270_get_session(widget); |
115 | 113 | g_autofree gchar * cmdline = g_strdup(text); |
116 | 114 | |
... | ... | @@ -150,7 +148,6 @@ |
150 | 148 | *(sep++) = 0; |
151 | 149 | set_property(hSession,g_strstrip(cmdline),g_strstrip(sep)); |
152 | 150 | } |
153 | - */ | |
154 | 151 | |
155 | 152 | return errno = ENOENT; |
156 | 153 | } | ... | ... |
src/trace/widget.c
... | ... | @@ -69,10 +69,10 @@ |
69 | 69 | { |
70 | 70 | GtkGrid parent; |
71 | 71 | H3270 * hSession; /// @brief TN3270 Session. |
72 | + GtkWidget * terminal; /// @brief V3270 Widget. | |
72 | 73 | |
73 | 74 | GtkTextBuffer * text; /// @brief Trace window contents. |
74 | - GtkWidget * entry; /// @brief Command line entry. | |
75 | - GtkWidget * run; /// @brief "exec" button. | |
75 | + GtkEntry * entry; /// @brief Command line entry. | |
76 | 76 | |
77 | 77 | /// @brief lib3270's saved trace handler. |
78 | 78 | struct { |
... | ... | @@ -99,6 +99,10 @@ |
99 | 99 | |
100 | 100 | static void set_session(V3270Trace *widget, H3270 *hSession) |
101 | 101 | { |
102 | + // Return if it's the same session. | |
103 | + if(widget->hSession == hSession) | |
104 | + return; | |
105 | + | |
102 | 106 | if(widget->hSession) { |
103 | 107 | lib3270_set_trace_handler(widget->hSession,widget->trace.handler,widget->trace.userdata); |
104 | 108 | } |
... | ... | @@ -116,7 +120,10 @@ |
116 | 120 | { |
117 | 121 | debug("V3270Trace::%s",__FUNCTION__); |
118 | 122 | |
119 | - set_session(GTK_V3270_TRACE(object),NULL); | |
123 | + V3270Trace *trace = GTK_V3270_TRACE(object); | |
124 | + | |
125 | + set_session(trace,NULL); | |
126 | + g_clear_object(&trace->terminal); | |
120 | 127 | |
121 | 128 | G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object); |
122 | 129 | } |
... | ... | @@ -126,8 +133,44 @@ |
126 | 133 | G_OBJECT_CLASS(klass)->finalize = finalize; |
127 | 134 | } |
128 | 135 | |
136 | + static void v3270_trace_execute(GtkWidget *widget, const gchar *cmd) | |
137 | + { | |
138 | + if(!*cmd) | |
139 | + return; | |
140 | + | |
141 | + v3270_trace_printf(widget, "%s\n",cmd); | |
142 | + | |
143 | + V3270Trace *trace = GTK_V3270_TRACE(widget); | |
144 | + | |
145 | + if(trace->terminal) | |
146 | + { | |
147 | + int rc = v3270_exec_command(trace->terminal,cmd); | |
148 | + if(rc) | |
149 | + v3270_trace_printf(widget, "rc=%d (%s)\n",rc,strerror(rc)); | |
150 | + } | |
151 | + else | |
152 | + { | |
153 | + v3270_trace_append_text(widget, "Can't execute command without an associated terminal"); | |
154 | + } | |
155 | + | |
156 | + gtk_entry_set_text(trace->entry, ""); | |
157 | + | |
158 | + } | |
159 | + | |
160 | + static void execute_command(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, GtkWidget *widget) | |
161 | + { | |
162 | + v3270_trace_execute(widget, gtk_entry_get_text(entry)); | |
163 | + } | |
164 | + | |
165 | + static void entry_activated(GtkEntry *entry, GtkWidget *widget) | |
166 | + { | |
167 | + v3270_trace_execute(widget, gtk_entry_get_text(entry)); | |
168 | + } | |
169 | + | |
129 | 170 | static void V3270Trace_init(V3270Trace *widget) |
130 | 171 | { |
172 | + gtk_grid_set_row_spacing(GTK_GRID(widget),6); | |
173 | + gtk_grid_set_column_spacing(GTK_GRID(widget),12); | |
131 | 174 | |
132 | 175 | // Create text view |
133 | 176 | { |
... | ... | @@ -145,20 +188,53 @@ |
145 | 188 | |
146 | 189 | gtk_container_add(GTK_CONTAINER(scrolled),view); |
147 | 190 | |
191 | + gtk_widget_set_can_default(view,FALSE); | |
192 | + | |
148 | 193 | } |
149 | 194 | |
150 | 195 | // Create command line |
151 | 196 | { |
152 | - widget->entry = gtk_entry_new(); | |
153 | - gtk_grid_attach(GTK_GRID(widget),widget->entry,0,1,8,1); | |
154 | - gtk_widget_set_sensitive(widget->entry,FALSE); | |
197 | + widget->entry = GTK_ENTRY(gtk_entry_new()); | |
198 | + | |
199 | + gtk_widget_set_can_default(GTK_WIDGET(widget->entry),TRUE); | |
200 | + gtk_widget_grab_focus(GTK_WIDGET(widget->entry)); | |
201 | + | |
202 | + gtk_entry_set_activates_default(widget->entry,TRUE); | |
203 | + gtk_widget_set_sensitive(GTK_WIDGET(widget->entry),FALSE); | |
204 | + gtk_widget_set_vexpand(GTK_WIDGET(widget->entry),FALSE); | |
205 | + gtk_widget_set_hexpand(GTK_WIDGET(widget->entry),TRUE); | |
206 | + | |
207 | + gtk_entry_set_icon_from_icon_name(widget->entry,GTK_ENTRY_ICON_SECONDARY,"system-run"); | |
208 | + gtk_entry_set_placeholder_text(widget->entry,_("Command to execute")); | |
209 | + | |
210 | + gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->entry),0,1,10,1); | |
211 | + | |
212 | + g_signal_connect(G_OBJECT(widget->entry),"icon-press",G_CALLBACK(execute_command),widget); | |
213 | + g_signal_connect(G_OBJECT(widget->entry),"activate",G_CALLBACK(entry_activated),widget); | |
214 | + | |
215 | + } | |
216 | + | |
155 | 217 | |
156 | - widget->run = gtk_button_new_from_icon_name("system-run",GTK_ICON_SIZE_BUTTON); | |
157 | - gtk_grid_attach(GTK_GRID(widget),widget->run,9,1,1,1); | |
158 | - gtk_widget_set_sensitive(widget->run,FALSE); | |
218 | + } | |
219 | + | |
220 | + LIB3270_EXPORT void v3270_trace_set_terminal(GtkWidget *widget, GtkWidget *terminal) | |
221 | + { | |
222 | + V3270Trace * trace = GTK_V3270_TRACE(widget); | |
223 | + | |
224 | + if(trace->terminal == terminal) | |
225 | + return; | |
159 | 226 | |
227 | + g_clear_object(&trace->terminal); | |
228 | + | |
229 | + if(terminal) | |
230 | + { | |
231 | + trace->terminal = terminal; | |
232 | + g_object_ref_sink(G_OBJECT(terminal)); | |
160 | 233 | } |
161 | 234 | |
235 | + set_session(trace, v3270_get_session(trace->terminal)); | |
236 | + | |
237 | + gtk_widget_set_sensitive(GTK_WIDGET(trace->entry),trace->terminal != NULL); | |
162 | 238 | |
163 | 239 | } |
164 | 240 | |
... | ... | @@ -168,7 +244,7 @@ |
168 | 244 | |
169 | 245 | V3270Trace * widget = GTK_V3270_TRACE(g_object_new(GTK_TYPE_V3270_TRACE, NULL)); |
170 | 246 | |
171 | - set_session(widget, v3270_get_session(terminal)); | |
247 | + v3270_trace_set_terminal(GTK_WIDGET(widget),terminal); | |
172 | 248 | |
173 | 249 | return GTK_WIDGET(widget); |
174 | 250 | } |
... | ... | @@ -203,17 +279,21 @@ |
203 | 279 | |
204 | 280 | LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text) |
205 | 281 | { |
282 | + debug("widget=%p text=\"%s\"",widget,text); | |
283 | + | |
206 | 284 | g_return_if_fail(GTK_IS_V3270_TRACE(widget)); |
207 | 285 | |
208 | 286 | // Enqueue update. |
209 | 287 | struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1); |
288 | + cfg->widget = GTK_V3270_TRACE(widget); | |
289 | + strcpy(cfg->text,text); | |
210 | 290 | gdk_threads_add_idle_full(G_PRIORITY_LOW,(GSourceFunc) bg_append_text,cfg,g_free); |
211 | 291 | |
212 | 292 | } |
213 | 293 | |
214 | 294 | LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) |
215 | 295 | { |
216 | - g_autofree * text = g_strdup_vprintf(fmt,args); | |
296 | + g_autofree gchar * text = g_strdup_vprintf(fmt,args); | |
217 | 297 | v3270_trace_append_text(widget,text); |
218 | 298 | } |
219 | 299 | |
... | ... | @@ -225,3 +305,54 @@ |
225 | 305 | va_end(arg_ptr); |
226 | 306 | } |
227 | 307 | |
308 | + static void menu_item_new(GtkWidget *menu, const gchar *label, GCallback callback, gpointer data) | |
309 | + { | |
310 | + GtkWidget *widget = gtk_menu_item_new_with_mnemonic(label); | |
311 | + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widget); | |
312 | + g_signal_connect(G_OBJECT(widget), "activate", callback, data); | |
313 | + } | |
314 | + | |
315 | + static void menu_save_as(G_GNUC_UNUSED GtkWidget *button, V3270Trace *trace) | |
316 | + { | |
317 | + debug("%s",__FUNCTION__); | |
318 | + } | |
319 | + | |
320 | + static void menu_close(G_GNUC_UNUSED GtkWidget *button, GtkWidget *window) | |
321 | + { | |
322 | + debug("%s",__FUNCTION__); | |
323 | + gtk_widget_destroy(window); | |
324 | + } | |
325 | + | |
326 | + LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget) | |
327 | + { | |
328 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | |
329 | + | |
330 | + GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
331 | + GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | |
332 | + V3270Trace * trace = v3270_trace_new(widget); | |
333 | + | |
334 | + gtk_window_set_default_size(GTK_WINDOW(widget),590,430); | |
335 | + | |
336 | + // Top menu | |
337 | + { | |
338 | + GtkWidget * menubar = gtk_menu_bar_new(); | |
339 | + GtkWidget * topitem = gtk_menu_item_new_with_mnemonic(_("_File")); | |
340 | + GtkWidget * submenu = gtk_menu_new(); | |
341 | + | |
342 | + gtk_menu_item_set_submenu(GTK_MENU_ITEM(topitem), submenu); | |
343 | + gtk_menu_shell_append(GTK_MENU_SHELL(menubar), topitem); | |
344 | + | |
345 | + menu_item_new(submenu,_("Save _As"),G_CALLBACK(menu_save_as),trace); | |
346 | + menu_item_new(submenu,_("_Close"),G_CALLBACK(menu_close),window); | |
347 | + | |
348 | + gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,TRUE,0); | |
349 | + } | |
350 | + | |
351 | + // Trace window | |
352 | + gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(trace),TRUE,TRUE,0); | |
353 | + | |
354 | + gtk_container_add(GTK_CONTAINER(window),vbox); | |
355 | + gtk_widget_show_all(window); | |
356 | + return window; | |
357 | + } | |
358 | + | ... | ... |
v3270.cbp
... | ... | @@ -195,7 +195,7 @@ |
195 | 195 | <Unit filename="src/trace/exec.c"> |
196 | 196 | <Option compilerVar="CC" /> |
197 | 197 | </Unit> |
198 | - <Unit filename="src/trace/trace.c"> | |
198 | + <Unit filename="src/trace/widget.c"> | |
199 | 199 | <Option compilerVar="CC" /> |
200 | 200 | </Unit> |
201 | 201 | <Unit filename="src/v3270/private.h" /> | ... | ... |