Commit 96de119b703179e71451925ca3b74147c18ddc9b

Authored by Perry Werneck
1 parent 595c171e
Exists in master and in 1 other branch develop

Refactoring trace window.

src/include/v3270.h
@@ -183,7 +183,7 @@ @@ -183,7 +183,7 @@
183 #endif // v3270_char 183 #endif // v3270_char
184 184
185 LIB3270_EXPORT GtkWidget * v3270_new(void); 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 LIB3270_EXPORT GType v3270_get_type(void); 187 LIB3270_EXPORT GType v3270_get_type(void);
188 LIB3270_EXPORT void v3270_reload(GtkWidget * widget); 188 LIB3270_EXPORT void v3270_reload(GtkWidget * widget);
189 LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name); 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,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 static void v3270_class_init(v3270Class *klass) 237 static void v3270_class_init(v3270Class *klass)
232 { 238 {
233 GObjectClass * gobject_class = G_OBJECT_CLASS(klass); 239 GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
@@ -239,6 +245,9 @@ static void v3270_class_init(v3270Class *klass) @@ -239,6 +245,9 @@ static void v3270_class_init(v3270Class *klass)
239 245
240 lib3270_set_log_handler(loghandler); 246 lib3270_set_log_handler(loghandler);
241 247
  248 + // Object methods
  249 + gobject_class->finalize = finalize;
  250 +
242 // Widget methods 251 // Widget methods
243 widget_class->realize = v3270_realize; 252 widget_class->realize = v3270_realize;
244 widget_class->size_allocate = v3270_size_allocate; 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,11 +150,12 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term
150 150
151 static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) 151 static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
152 { 152 {
  153 + /*
153 GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test")); 154 GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test"));
154 GtkWidget * trace = v3270_trace_new(terminal); 155 GtkWidget * trace = v3270_trace_new(terminal);
155 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),trace,TRUE,TRUE,2); 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 // Test activity 160 // Test activity
160 // 161 //
@@ -164,11 +165,13 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) @@ -164,11 +165,13 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
164 v3270_ft_activity_set_remote_filename(activity,"remote_file"); 165 v3270_ft_activity_set_remote_filename(activity,"remote_file");
165 v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP); 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 // Test settings dialog 170 // Test settings dialog
169 // 171 //
170 GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal); 172 GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal);
171 v3270_ft_settings_dialog_append_activity(dialog,activity,NULL); 173 v3270_ft_settings_dialog_append_activity(dialog,activity,NULL);
  174 + */
172 175
173 // 176 //
174 // Test worker widget 177 // Test worker widget
@@ -179,7 +182,6 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) @@ -179,7 +182,6 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
179 v3270_ft_worker_set_session(worker,v3270_get_session(terminal)); 182 v3270_ft_worker_set_session(worker,v3270_get_session(terminal));
180 v3270_ft_worker_set_activity(worker,activity); 183 v3270_ft_worker_set_activity(worker,activity);
181 v3270_ft_worker_start(worker); 184 v3270_ft_worker_start(worker);
182 - */  
183 185
184 gtk_widget_show_all(dialog); 186 gtk_widget_show_all(dialog);
185 gtk_dialog_run(GTK_DIALOG(dialog)); 187 gtk_dialog_run(GTK_DIALOG(dialog));
@@ -224,15 +226,13 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { @@ -224,15 +226,13 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
224 // v3270_set_font_family(terminal,"Droid Sans Mono"); 226 // v3270_set_font_family(terminal,"Droid Sans Mono");
225 g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window); 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 if(trace) { 230 if(trace) {
230 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); 231 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal));
231 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE); 232 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE);
232 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); 233 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE);
233 gtk_widget_show_all(trace); 234 gtk_widget_show_all(trace);
234 } 235 }
235 - */  
236 236
237 /* 237 /*
238 v3270_connect(terminal); 238 v3270_connect(terminal);
src/trace/exec.c
@@ -40,9 +40,9 @@ @@ -40,9 +40,9 @@
40 #include <lib3270/log.h> 40 #include <lib3270/log.h>
41 #include <lib3270/trace.h> 41 #include <lib3270/trace.h>
42 #include <lib3270/properties.h> 42 #include <lib3270/properties.h>
  43 + #include <v3270.h>
43 #include <v3270/trace.h> 44 #include <v3270/trace.h>
44 45
45 - /*  
46 static const gchar * get_word(gchar **ptr) 46 static const gchar * get_word(gchar **ptr)
47 { 47 {
48 gchar *rc = g_strstrip(*ptr); 48 gchar *rc = g_strstrip(*ptr);
@@ -59,9 +59,7 @@ @@ -59,9 +59,7 @@
59 59
60 return rc; 60 return rc;
61 } 61 }
62 - */  
63 62
64 - /*  
65 static int set_property(H3270 *hSession, const gchar *name, const gchar * value) 63 static int set_property(H3270 *hSession, const gchar *name, const gchar * value)
66 { 64 {
67 size_t ix; 65 size_t ix;
@@ -106,11 +104,11 @@ @@ -106,11 +104,11 @@
106 return errno = ENOENT; 104 return errno = ENOENT;
107 105
108 } 106 }
109 - */  
110 107
111 int v3270_exec_command(GtkWidget *widget, const gchar *text) 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 H3270 *hSession = v3270_get_session(widget); 112 H3270 *hSession = v3270_get_session(widget);
115 g_autofree gchar * cmdline = g_strdup(text); 113 g_autofree gchar * cmdline = g_strdup(text);
116 114
@@ -150,7 +148,6 @@ @@ -150,7 +148,6 @@
150 *(sep++) = 0; 148 *(sep++) = 0;
151 set_property(hSession,g_strstrip(cmdline),g_strstrip(sep)); 149 set_property(hSession,g_strstrip(cmdline),g_strstrip(sep));
152 } 150 }
153 - */  
154 151
155 return errno = ENOENT; 152 return errno = ENOENT;
156 } 153 }
src/trace/widget.c
@@ -69,10 +69,10 @@ @@ -69,10 +69,10 @@
69 { 69 {
70 GtkGrid parent; 70 GtkGrid parent;
71 H3270 * hSession; /// @brief TN3270 Session. 71 H3270 * hSession; /// @brief TN3270 Session.
  72 + GtkWidget * terminal; /// @brief V3270 Widget.
72 73
73 GtkTextBuffer * text; /// @brief Trace window contents. 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 /// @brief lib3270's saved trace handler. 77 /// @brief lib3270's saved trace handler.
78 struct { 78 struct {
@@ -99,6 +99,10 @@ @@ -99,6 +99,10 @@
99 99
100 static void set_session(V3270Trace *widget, H3270 *hSession) 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 if(widget->hSession) { 106 if(widget->hSession) {
103 lib3270_set_trace_handler(widget->hSession,widget->trace.handler,widget->trace.userdata); 107 lib3270_set_trace_handler(widget->hSession,widget->trace.handler,widget->trace.userdata);
104 } 108 }
@@ -116,7 +120,10 @@ @@ -116,7 +120,10 @@
116 { 120 {
117 debug("V3270Trace::%s",__FUNCTION__); 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 G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object); 128 G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object);
122 } 129 }
@@ -126,8 +133,44 @@ @@ -126,8 +133,44 @@
126 G_OBJECT_CLASS(klass)->finalize = finalize; 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 static void V3270Trace_init(V3270Trace *widget) 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 // Create text view 175 // Create text view
133 { 176 {
@@ -145,20 +188,53 @@ @@ -145,20 +188,53 @@
145 188
146 gtk_container_add(GTK_CONTAINER(scrolled),view); 189 gtk_container_add(GTK_CONTAINER(scrolled),view);
147 190
  191 + gtk_widget_set_can_default(view,FALSE);
  192 +
148 } 193 }
149 194
150 // Create command line 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,7 +244,7 @@
168 244
169 V3270Trace * widget = GTK_V3270_TRACE(g_object_new(GTK_TYPE_V3270_TRACE, NULL)); 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 return GTK_WIDGET(widget); 249 return GTK_WIDGET(widget);
174 } 250 }
@@ -203,17 +279,21 @@ @@ -203,17 +279,21 @@
203 279
204 LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text) 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 g_return_if_fail(GTK_IS_V3270_TRACE(widget)); 284 g_return_if_fail(GTK_IS_V3270_TRACE(widget));
207 285
208 // Enqueue update. 286 // Enqueue update.
209 struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1); 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 gdk_threads_add_idle_full(G_PRIORITY_LOW,(GSourceFunc) bg_append_text,cfg,g_free); 290 gdk_threads_add_idle_full(G_PRIORITY_LOW,(GSourceFunc) bg_append_text,cfg,g_free);
211 291
212 } 292 }
213 293
214 LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) 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 v3270_trace_append_text(widget,text); 297 v3270_trace_append_text(widget,text);
218 } 298 }
219 299
@@ -225,3 +305,54 @@ @@ -225,3 +305,54 @@
225 va_end(arg_ptr); 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 +
@@ -195,7 +195,7 @@ @@ -195,7 +195,7 @@
195 <Unit filename="src/trace/exec.c"> 195 <Unit filename="src/trace/exec.c">
196 <Option compilerVar="CC" /> 196 <Option compilerVar="CC" />
197 </Unit> 197 </Unit>
198 - <Unit filename="src/trace/trace.c"> 198 + <Unit filename="src/trace/widget.c">
199 <Option compilerVar="CC" /> 199 <Option compilerVar="CC" />
200 </Unit> 200 </Unit>
201 <Unit filename="src/v3270/private.h" /> 201 <Unit filename="src/v3270/private.h" />