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 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" />
... ...