Commit 2d3ee143241e94cad65afb91a3c84897ecb39f3a

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

Adjustments on trace widget.

src/dialogs/togglebutton.c
@@ -65,6 +65,8 @@ @@ -65,6 +65,8 @@
65 widget->hListener = NULL; 65 widget->hListener = NULL;
66 } 66 }
67 67
  68 + widget->hSession = NULL;
  69 +
68 G_OBJECT_CLASS(V3270ToggleButton_parent_class)->dispose(object); 70 G_OBJECT_CLASS(V3270ToggleButton_parent_class)->dispose(object);
69 71
70 } 72 }
@@ -104,22 +106,57 @@ @@ -104,22 +106,57 @@
104 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),(state == 0 ? FALSE : TRUE)); 106 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),(state == 0 ? FALSE : TRUE));
105 } 107 }
106 108
107 - GtkWidget * v3270_toggle_button_new(GtkWidget *terminal, LIB3270_TOGGLE_ID toggle) 109 + GtkWidget * v3270_toggle_button_new(LIB3270_TOGGLE_ID id)
108 { 110 {
109 - g_return_val_if_fail(GTK_IS_V3270(terminal),NULL); 111 + const LIB3270_TOGGLE * toggle = lib3270_toggle_get_from_id(id);
  112 +
  113 + if(!toggle)
  114 + return NULL;
110 115
111 V3270ToggleButton * widget = GTK_V3270_TOGGLE_BUTTON(g_object_new(GTK_TYPE_V3270_TOGGLE_BUTTON, NULL)); 116 V3270ToggleButton * widget = GTK_V3270_TOGGLE_BUTTON(g_object_new(GTK_TYPE_V3270_TOGGLE_BUTTON, NULL));
112 117
113 - widget->hSession = v3270_get_session(terminal);  
114 - widget->id = toggle; 118 + widget->id = id;
115 119
116 - widget->hListener = lib3270_register_toggle_listener(widget->hSession, widget->id,toggle_listener,widget); 120 + gtk_widget_set_name(GTK_WIDGET(widget),toggle->name);
  121 + gtk_button_set_label(GTK_BUTTON(widget),gettext(toggle->label));
117 122
118 - gtk_widget_set_name(GTK_WIDGET(widget),lib3270_get_toggle_name(toggle));  
119 - gtk_button_set_label(GTK_BUTTON(widget),gettext(lib3270_get_toggle_label(toggle)));  
120 - gtk_widget_set_tooltip_text(GTK_WIDGET(widget),gettext(lib3270_get_toggle_description(toggle))); 123 + if(toggle->description)
  124 + gtk_widget_set_tooltip_text(GTK_WIDGET(widget),gettext(toggle->description));
  125 + else if(toggle->summary)
  126 + gtk_widget_set_tooltip_text(GTK_WIDGET(widget),gettext(toggle->summary));
121 127
122 - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),lib3270_get_toggle(widget->hSession, widget->id)); 128 + gtk_widget_set_sensitive(GTK_WIDGET(widget),FALSE);
123 129
124 return GTK_WIDGET(widget); 130 return GTK_WIDGET(widget);
125 } 131 }
  132 +
  133 + G_GNUC_INTERNAL void v3270_toggle_button_set_session(GtkWidget *button, H3270 *hSession)
  134 + {
  135 + V3270ToggleButton * toggle = GTK_V3270_TOGGLE_BUTTON(button);
  136 +
  137 + if(toggle->hSession == hSession)
  138 + return;
  139 +
  140 + // Disconnect from current session
  141 + if(toggle->hListener)
  142 + {
  143 + lib3270_unregister_toggle_listener(toggle->hSession,toggle->id,toggle->hListener);
  144 + toggle->hListener = NULL;
  145 + }
  146 +
  147 + // Replace session.
  148 + toggle->hSession = hSession;
  149 +
  150 + // Connect to new session.
  151 + if(toggle->hSession)
  152 + {
  153 + toggle->hListener = lib3270_register_toggle_listener(toggle->hSession, toggle->id,toggle_listener,toggle);
  154 + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),lib3270_get_toggle(toggle->hSession, toggle->id));
  155 + gtk_widget_set_sensitive(GTK_WIDGET(toggle),TRUE);
  156 + }
  157 + else
  158 + {
  159 + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),FALSE);
  160 + gtk_widget_set_sensitive(GTK_WIDGET(toggle),FALSE);
  161 + }
  162 + }
src/include/internals.h
@@ -160,7 +160,8 @@ @@ -160,7 +160,8 @@
160 typedef struct _V3270ToggleButton V3270ToggleButton; 160 typedef struct _V3270ToggleButton V3270ToggleButton;
161 typedef struct _V3270ToggleButtonClass V3270ToggleButtonClass; 161 typedef struct _V3270ToggleButtonClass V3270ToggleButtonClass;
162 162
163 - G_GNUC_INTERNAL GtkWidget * v3270_toggle_button_new(GtkWidget *widget, LIB3270_TOGGLE_ID toggle); 163 + G_GNUC_INTERNAL GtkWidget * v3270_toggle_button_new(LIB3270_TOGGLE_ID toggle);
  164 + G_GNUC_INTERNAL void v3270_toggle_button_set_session(GtkWidget *button, H3270 *hSession);
164 165
165 // Activity list widget. 166 // Activity list widget.
166 #define GTK_TYPE_V3270_FT_ACTIVITY_LIST (V3270FTActivityList_get_type ()) 167 #define GTK_TYPE_V3270_FT_ACTIVITY_LIST (V3270FTActivityList_get_type ())
src/include/terminal.h
@@ -114,15 +114,6 @@ G_BEGIN_DECLS @@ -114,15 +114,6 @@ G_BEGIN_DECLS
114 int scaled_fonts : 1; /**< Use scaled fonts */ 114 int scaled_fonts : 1; /**< Use scaled fonts */
115 int drawing : 1; /**< Draw widget? */ 115 int drawing : 1; /**< Draw widget? */
116 116
117 - /*  
118 -#if GTK_CHECK_VERSION(3,0,0)  
119 -  
120 -#else  
121 - gint width;  
122 - gint height;  
123 -#endif // GTK_CHECK_VERSION(3,0,0)  
124 - */  
125 -  
126 GSource * timer; 117 GSource * timer;
127 GtkIMContext * input_method; 118 GtkIMContext * input_method;
128 unsigned short keyflags; 119 unsigned short keyflags;
@@ -186,15 +177,17 @@ G_BEGIN_DECLS @@ -186,15 +177,17 @@ G_BEGIN_DECLS
186 GSource * timer; /**< Auto disconnect timer */ 177 GSource * timer; /**< Auto disconnect timer */
187 } activity; 178 } activity;
188 179
189 - char script; /**< @brief Script ID */ 180 + char script; ///< @brief Script ID.
190 181
191 // Blink 182 // Blink
192 struct 183 struct
193 { 184 {
194 - int show : 1; /**< @brief Show element? */  
195 - GSource * timer; /**< @brief Timer source. */ 185 + int show : 1; ///< @brief Show element?
  186 + GSource * timer; ///< @brief Timer source.
196 } blink; 187 } blink;
197 188
  189 + GtkWidget * trace; ///< @brief Trace window handle.
  190 +
198 }; 191 };
199 192
200 G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget); 193 G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget);
src/include/v3270/trace.h
@@ -49,6 +49,9 @@ @@ -49,6 +49,9 @@
49 49
50 LIB3270_EXPORT GType V3270Trace_get_type(void); 50 LIB3270_EXPORT GType V3270Trace_get_type(void);
51 51
  52 + LIB3270_EXPORT gboolean v3270_get_trace(GtkWidget *terminal);
  53 + LIB3270_EXPORT void v3270_set_trace(GtkWidget *terminal, gboolean trace);
  54 +
52 LIB3270_EXPORT GtkWidget * v3270_trace_new(GtkWidget *terminal); 55 LIB3270_EXPORT GtkWidget * v3270_trace_new(GtkWidget *terminal);
53 LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text); 56 LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text);
54 LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); 57 LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args);
src/trace/exec.c
@@ -149,8 +149,8 @@ @@ -149,8 +149,8 @@
149 149
150 g_return_val_if_fail(GTK_IS_V3270_TRACE(t),EINVAL); 150 g_return_val_if_fail(GTK_IS_V3270_TRACE(t),EINVAL);
151 151
152 - V3270Trace * trace = GTK_V3270_TRACE(t);  
153 - H3270 * hSession = v3270_get_session(trace->terminal); 152 + GtkWidget * terminal = v3270_trace_get_terminal(t);
  153 + H3270 * hSession = v3270_trace_get_session(t);
154 g_autofree gchar * cmdline = g_strdup(text); 154 g_autofree gchar * cmdline = g_strdup(text);
155 155
156 g_strstrip(cmdline); 156 g_strstrip(cmdline);
@@ -159,13 +159,13 @@ @@ -159,13 +159,13 @@
159 159
160 if(g_str_has_prefix(cmdline,"reload")) 160 if(g_str_has_prefix(cmdline,"reload"))
161 { 161 {
162 - v3270_reload(trace->terminal); 162 + v3270_reload(terminal);
163 return 0; 163 return 0;
164 } 164 }
165 165
166 if(g_str_has_prefix(cmdline,"reconfigure")) 166 if(g_str_has_prefix(cmdline,"reconfigure"))
167 { 167 {
168 - v3270_reconfigure(GTK_V3270(trace->terminal)); 168 + v3270_reconfigure(GTK_V3270(terminal));
169 return 0; 169 return 0;
170 } 170 }
171 171
@@ -184,15 +184,15 @@ @@ -184,15 +184,15 @@
184 if(!(*arg && g_ascii_strcasecmp(arg,"text"))) 184 if(!(*arg && g_ascii_strcasecmp(arg,"text")))
185 { 185 {
186 // No argument or "text" copy text. 186 // No argument or "text" copy text.
187 - v3270_clipboard_set(trace->terminal, V3270_COPY_TEXT, FALSE); 187 + v3270_clipboard_set(terminal, V3270_COPY_TEXT, FALSE);
188 } 188 }
189 else if(!g_ascii_strcasecmp(arg,"table")) 189 else if(!g_ascii_strcasecmp(arg,"table"))
190 { 190 {
191 - v3270_clipboard_set(trace->terminal, V3270_COPY_TABLE, FALSE); 191 + v3270_clipboard_set(terminal, V3270_COPY_TABLE, FALSE);
192 } 192 }
193 else if(!g_ascii_strcasecmp(arg,"append")) 193 else if(!g_ascii_strcasecmp(arg,"append"))
194 { 194 {
195 - v3270_clipboard_set(trace->terminal, V3270_COPY_APPEND, FALSE); 195 + v3270_clipboard_set(terminal, V3270_COPY_APPEND, FALSE);
196 } 196 }
197 else 197 else
198 { 198 {
@@ -212,15 +212,15 @@ @@ -212,15 +212,15 @@
212 if(!(*arg && g_ascii_strcasecmp(arg,"all"))) 212 if(!(*arg && g_ascii_strcasecmp(arg,"all")))
213 { 213 {
214 // No argument or "text" copy text. 214 // No argument or "text" copy text.
215 - v3270_print_all(trace->terminal,NULL); 215 + v3270_print_all(terminal,NULL);
216 } 216 }
217 else if(!g_ascii_strcasecmp(arg,"selected")) 217 else if(!g_ascii_strcasecmp(arg,"selected"))
218 { 218 {
219 - v3270_print_selected(trace->terminal,NULL); 219 + v3270_print_selected(terminal,NULL);
220 } 220 }
221 else if(!g_ascii_strcasecmp(arg,"copy")) 221 else if(!g_ascii_strcasecmp(arg,"copy"))
222 { 222 {
223 - v3270_print_copy(trace->terminal,NULL); 223 + v3270_print_copy(terminal,NULL);
224 } 224 }
225 else 225 else
226 { 226 {
@@ -237,7 +237,7 @@ @@ -237,7 +237,7 @@
237 gchar * arg = cmdline+5; 237 gchar * arg = cmdline+5;
238 g_strstrip(arg); 238 g_strstrip(arg);
239 239
240 - v3270_clipboard_get_from_url(trace->terminal,arg); 240 + v3270_clipboard_get_from_url(terminal,arg);
241 241
242 return 0; 242 return 0;
243 } 243 }
@@ -247,7 +247,7 @@ @@ -247,7 +247,7 @@
247 gchar * str = strchr(cmdline,'?'); 247 gchar * str = strchr(cmdline,'?');
248 *str = 0; 248 *str = 0;
249 g_strstrip(cmdline); 249 g_strstrip(cmdline);
250 - return get_property(trace->terminal,cmdline); 250 + return get_property(terminal,cmdline);
251 } 251 }
252 252
253 if(strchr(cmdline,'=')) 253 if(strchr(cmdline,'='))
@@ -256,14 +256,14 @@ @@ -256,14 +256,14 @@
256 *(value++) = 0; 256 *(value++) = 0;
257 g_strstrip(cmdline); 257 g_strstrip(cmdline);
258 g_strstrip(value); 258 g_strstrip(value);
259 - return set_property(trace->terminal,cmdline,value); 259 + return set_property(terminal,cmdline,value);
260 } 260 }
261 261
262 if(g_str_has_prefix(cmdline,"remap")) 262 if(g_str_has_prefix(cmdline,"remap"))
263 { 263 {
264 gchar *txtptr = cmdline+5; 264 gchar *txtptr = cmdline+5;
265 g_strstrip(txtptr); 265 g_strstrip(txtptr);
266 - v3270_set_remap_filename(trace->terminal,txtptr); 266 + v3270_set_remap_filename(terminal,txtptr);
267 return 0; 267 return 0;
268 } 268 }
269 269
@@ -272,7 +272,7 @@ @@ -272,7 +272,7 @@
272 gchar *txtptr = cmdline+3; 272 gchar *txtptr = cmdline+3;
273 const gchar * name = get_word(&txtptr); 273 const gchar * name = get_word(&txtptr);
274 g_strstrip(txtptr); 274 g_strstrip(txtptr);
275 - return set_property(trace->terminal,name,(*txtptr ? txtptr : "1")); 275 + return set_property(terminal,name,(*txtptr ? txtptr : "1"));
276 } 276 }
277 277
278 if(g_str_has_prefix(cmdline,"get")) 278 if(g_str_has_prefix(cmdline,"get"))
@@ -280,7 +280,7 @@ @@ -280,7 +280,7 @@
280 gchar *txtptr = cmdline+3; 280 gchar *txtptr = cmdline+3;
281 const gchar * name = get_word(&txtptr); 281 const gchar * name = get_word(&txtptr);
282 g_strstrip(txtptr); 282 g_strstrip(txtptr);
283 - return get_property(trace->terminal,name); 283 + return get_property(terminal,name);
284 } 284 }
285 285
286 if(g_str_has_prefix(cmdline,"reset")) 286 if(g_str_has_prefix(cmdline,"reset"))
@@ -288,14 +288,14 @@ @@ -288,14 +288,14 @@
288 gchar *txtptr = cmdline+3; 288 gchar *txtptr = cmdline+3;
289 const gchar * name = get_word(&txtptr); 289 const gchar * name = get_word(&txtptr);
290 g_strstrip(txtptr); 290 g_strstrip(txtptr);
291 - return set_property(trace->terminal,name,(*txtptr ? txtptr : "0")); 291 + return set_property(terminal,name,(*txtptr ? txtptr : "0"));
292 } 292 }
293 293
294 gchar * sep = strchr(cmdline,'='); 294 gchar * sep = strchr(cmdline,'=');
295 if(sep) 295 if(sep)
296 { 296 {
297 *(sep++) = 0; 297 *(sep++) = 0;
298 - return set_property(trace->terminal,g_strstrip(cmdline),g_strstrip(sep)); 298 + return set_property(terminal,g_strstrip(cmdline),g_strstrip(sep));
299 } 299 }
300 else 300 else
301 { 301 {
@@ -316,7 +316,7 @@ @@ -316,7 +316,7 @@
316 if(*args) 316 if(*args)
317 *(args++) = 0; 317 *(args++) = 0;
318 318
319 - g_signal_emit(GTK_WIDGET(trace), v3270_trace_signal[V3270_TRACE_SIGNAL_COMMAND], 0, cmdline, args, &handled); 319 + g_signal_emit(GTK_WIDGET(t), v3270_trace_signal[V3270_TRACE_SIGNAL_COMMAND], 0, cmdline, args, &handled);
320 320
321 if(handled) 321 if(handled)
322 return 0; 322 return 0;
src/trace/private.h
@@ -56,40 +56,15 @@ @@ -56,40 +56,15 @@
56 56
57 G_GNUC_INTERNAL guint v3270_trace_signal[V3270_TRACE_SIGNAL_LAST]; 57 G_GNUC_INTERNAL guint v3270_trace_signal[V3270_TRACE_SIGNAL_LAST];
58 58
59 - G_BEGIN_DECLS  
60 -  
61 - struct _V3270TraceClass  
62 - {  
63 - GtkBoxClass parent_class;  
64 -  
65 - };  
66 -  
67 - struct _V3270Trace  
68 - { 59 + G_GNUC_INTERNAL H3270 * v3270_trace_get_session(GtkWidget *widget);
  60 + G_GNUC_INTERNAL GtkWidget * v3270_trace_get_terminal(GtkWidget *widget);
  61 + G_GNUC_INTERNAL GtkTextBuffer * v3270_trace_get_text_buffer(GtkWidget *widget);
  62 + G_GNUC_INTERNAL GtkScrolledWindow * v3270_trace_get_scrolled_window(GtkWidget *widget);
69 63
70 - GtkBox parent;  
71 - H3270 * hSession; ///< @brief TN3270 Session.  
72 - GtkWidget * terminal; ///< @brief V3270 Widget.  
73 - GtkScrolledWindow * scroll;  
74 -  
75 - GtkTextView * view; ///< @brief Text view;  
76 - GtkTextBuffer * text; ///< @brief Trace window contents.  
77 - GtkEntry * entry; ///< @brief Command line entry.  
78 - GtkWidget * buttons; ///< @brief Button bar.  
79 -  
80 - gchar * filename; ///< @brief Selected file name.  
81 -  
82 - guint log_handler; ///< @brief GTK Log Handler.  
83 -  
84 - /// @brief lib3270's saved trace handler.  
85 - struct {  
86 - void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args);  
87 - void *userdata;  
88 - } trace; 64 + G_BEGIN_DECLS
89 65
90 - };  
91 66
92 - G_END_DECLS 67 + G_END_DECLS
93 68
94 69
95 70
src/trace/text.c 0 → 100644
@@ -0,0 +1,94 @@ @@ -0,0 +1,94 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include "private.h"
  31 +
  32 + #include <lib3270/toggle.h>
  33 + #include <lib3270/properties.h>
  34 + #include <internals.h>
  35 + #include <v3270/dialogs.h>
  36 +
  37 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  38 +
  39 + struct _append_text
  40 + {
  41 + GtkWidget * widget;
  42 + gchar text[1];
  43 + };
  44 +
  45 + static gboolean bg_append_text(struct _append_text *cfg)
  46 + {
  47 + GtkTextBuffer * buffer = v3270_trace_get_text_buffer(cfg->widget);
  48 +
  49 + GtkTextIter itr;
  50 + gtk_text_buffer_get_end_iter(buffer,&itr);
  51 +
  52 + if(g_utf8_validate(cfg->text,strlen(cfg->text),NULL))
  53 + gtk_text_buffer_insert(buffer,&itr,cfg->text,strlen(cfg->text));
  54 + else
  55 + gtk_text_buffer_insert(buffer,&itr,"** Invalid UTF8 String **",-1);
  56 +
  57 + // Move window
  58 + GtkScrolledWindow * scrolled = v3270_trace_get_scrolled_window(cfg->widget);
  59 + GtkAdjustment * vadj = gtk_scrolled_window_get_vadjustment(scrolled);
  60 +
  61 + gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj));
  62 + gtk_scrolled_window_set_vadjustment(scrolled, vadj);
  63 +
  64 + return FALSE;
  65 +
  66 + }
  67 +
  68 + LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text)
  69 + {
  70 + g_return_if_fail(GTK_IS_V3270_TRACE(widget));
  71 +
  72 + // Enqueue update.
  73 + struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1);
  74 + cfg->widget = GTK_V3270_TRACE(widget);
  75 + strcpy(cfg->text,text);
  76 +
  77 + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_append_text, cfg, g_free);
  78 +
  79 + }
  80 +
  81 + LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args)
  82 + {
  83 + g_autofree gchar * text = g_strdup_vprintf(fmt,args);
  84 + v3270_trace_append_text(widget,text);
  85 + }
  86 +
  87 + LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... )
  88 + {
  89 + va_list arg_ptr;
  90 + va_start(arg_ptr, fmt);
  91 + v3270_trace_vprintf(widget,fmt,arg_ptr);
  92 + va_end(arg_ptr);
  93 + }
  94 +
src/trace/trace.c
@@ -38,13 +38,58 @@ @@ -38,13 +38,58 @@
38 38
39 #include "private.h" 39 #include "private.h"
40 40
  41 + #include <terminal.h>
41 #include <lib3270/toggle.h> 42 #include <lib3270/toggle.h>
42 #include <lib3270/properties.h> 43 #include <lib3270/properties.h>
43 #include <internals.h> 44 #include <internals.h>
44 #include <v3270/dialogs.h> 45 #include <v3270/dialogs.h>
45 #include "marshal.h" 46 #include "marshal.h"
46 47
47 -/*--[ Widget definition ]----------------------------------------------------------------------------*/ 48 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  49 +
  50 + static const LIB3270_TOGGLE_ID toggles[] = {
  51 + LIB3270_TOGGLE_DS_TRACE,
  52 + LIB3270_TOGGLE_NETWORK_TRACE,
  53 + LIB3270_TOGGLE_EVENT_TRACE,
  54 + LIB3270_TOGGLE_SSL_TRACE,
  55 + LIB3270_TOGGLE_SCREEN_TRACE
  56 + };
  57 +
  58 + struct _V3270TraceClass
  59 + {
  60 + GtkBoxClass parent_class;
  61 +
  62 + };
  63 +
  64 + struct _V3270Trace
  65 + {
  66 +
  67 + GtkBox parent;
  68 + H3270 * hSession; ///< @brief TN3270 Session.
  69 + GtkWidget * terminal; ///< @brief V3270 Widget.
  70 + GtkScrolledWindow * scroll;
  71 +
  72 + GtkTextView * view; ///< @brief Text view;
  73 + GtkTextBuffer * text; ///< @brief Trace window contents.
  74 + GtkEntry * entry; ///< @brief Command line entry.
  75 +
  76 + struct
  77 + {
  78 + GtkWidget * box; ///< @brief Button box.
  79 + GtkWidget * widgets[G_N_ELEMENTS(toggles)];
  80 + } buttons;
  81 +
  82 + gchar * filename; ///< @brief Selected file name.
  83 +
  84 + guint log_handler; ///< @brief GTK Log Handler.
  85 +
  86 + /// @brief lib3270's saved trace handler.
  87 + struct {
  88 + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args);
  89 + void *userdata;
  90 + } trace;
  91 +
  92 + };
48 93
49 guint v3270_trace_signal[V3270_TRACE_SIGNAL_LAST] = { 0 }; 94 guint v3270_trace_signal[V3270_TRACE_SIGNAL_LAST] = { 0 };
50 95
@@ -80,6 +125,11 @@ @@ -80,6 +125,11 @@
80 lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); 125 lib3270_set_trace_handler(hSession,trace_handler,(void *) widget);
81 } 126 }
82 127
  128 + // v3270_toggle_button_set_session
  129 + size_t ix;
  130 + for(ix = 0; ix < G_N_ELEMENTS(toggles); ix++)
  131 + v3270_toggle_button_set_session(widget->buttons.widgets[ix],hSession);
  132 +
83 } 133 }
84 134
85 static void finalize(GObject *object) 135 static void finalize(GObject *object)
@@ -100,7 +150,17 @@ @@ -100,7 +150,17 @@
100 trace->log_handler = 0; 150 trace->log_handler = 0;
101 } 151 }
102 152
103 - set_session(trace,NULL); 153 + if(trace->terminal && GTK_V3270(trace->terminal)->trace == GTK_WIDGET(object))
  154 + {
  155 + debug("V3270Trace::%s - Removing trace widget association",__FUNCTION__);
  156 + GTK_V3270(trace->terminal)->trace = NULL;
  157 + }
  158 +
  159 + if(trace->hSession) {
  160 + lib3270_set_trace_handler(trace->hSession,trace->trace.handler,trace->trace.userdata);
  161 + trace->hSession = NULL;
  162 + }
  163 +
104 g_clear_object(&trace->terminal); 164 g_clear_object(&trace->terminal);
105 165
106 G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object); 166 G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object);
@@ -224,17 +284,16 @@ @@ -224,17 +284,16 @@
224 gtk_orientable_set_orientation(GTK_ORIENTABLE(widget),GTK_ORIENTATION_VERTICAL); 284 gtk_orientable_set_orientation(GTK_ORIENTABLE(widget),GTK_ORIENTATION_VERTICAL);
225 285
226 // Create toolbar 286 // Create toolbar
  287 + GtkWidget *buttons = widget->buttons.box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
227 { 288 {
228 - widget->buttons = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);  
229 -  
230 // https://developer.gnome.org/hig/stable/visual-layout.html.en 289 // https://developer.gnome.org/hig/stable/visual-layout.html.en
231 - gtk_container_set_border_width(GTK_CONTAINER(widget->buttons), 12);  
232 - gtk_box_set_spacing(GTK_BOX(widget->buttons),12); 290 + gtk_container_set_border_width(GTK_CONTAINER(buttons), 12);
  291 + gtk_box_set_spacing(GTK_BOX(buttons),12);
233 292
234 - gtk_button_box_set_layout(GTK_BUTTON_BOX(widget->buttons), GTK_BUTTONBOX_START); 293 + gtk_button_box_set_layout(GTK_BUTTON_BOX(buttons), GTK_BUTTONBOX_START);
235 294
236 - gtk_widget_set_valign(widget->buttons,GTK_ALIGN_START);  
237 - gtk_box_pack_start(GTK_BOX(widget),widget->buttons,FALSE,FALSE,0); 295 + gtk_widget_set_valign(buttons,GTK_ALIGN_START);
  296 + gtk_box_pack_start(GTK_BOX(widget),buttons,FALSE,FALSE,0);
238 297
239 } 298 }
240 299
@@ -282,6 +341,26 @@ @@ -282,6 +341,26 @@
282 341
283 } 342 }
284 343
  344 + // Create toggle buttons
  345 + {
  346 + size_t ix;
  347 +
  348 + for(ix = 0; ix < G_N_ELEMENTS(toggles); ix++)
  349 + {
  350 + GtkWidget * item = widget->buttons.widgets[ix] = v3270_toggle_button_new(toggles[ix]);
  351 +
  352 + gtk_widget_set_can_focus(item,FALSE);
  353 + gtk_widget_set_can_default(item,FALSE);
  354 +
  355 +#if GTK_CHECK_VERSION(3,20,0)
  356 + gtk_widget_set_focus_on_click(item,FALSE);
  357 +#endif // GTK 3,20,0
  358 +
  359 + gtk_box_pack_start(GTK_BOX(buttons),item,FALSE,FALSE,0);
  360 +
  361 + }
  362 + }
  363 +
285 // Grab GTK messages. 364 // Grab GTK messages.
286 widget->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) log_handler, widget); 365 widget->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) log_handler, widget);
287 366
@@ -292,7 +371,7 @@ @@ -292,7 +371,7 @@
292 { 371 {
293 g_return_val_if_fail(GTK_IS_V3270_TRACE(widget),NULL); 372 g_return_val_if_fail(GTK_IS_V3270_TRACE(widget),NULL);
294 373
295 - return GTK_V3270_TRACE(widget)->buttons; 374 + return GTK_V3270_TRACE(widget)->buttons.box;
296 375
297 } 376 }
298 377
@@ -307,7 +386,7 @@ @@ -307,7 +386,7 @@
307 gtk_widget_set_focus_on_click(button,FALSE); 386 gtk_widget_set_focus_on_click(button,FALSE);
308 #endif // GTK 3,20,0 387 #endif // GTK 3,20,0
309 388
310 - gtk_box_pack_start(GTK_BOX(GTK_V3270_TRACE(widget)->buttons),button,FALSE,FALSE,0); 389 + gtk_box_pack_start(GTK_BOX(GTK_V3270_TRACE(widget)->buttons.box),button,FALSE,FALSE,0);
311 390
312 } 391 }
313 392
@@ -321,101 +400,12 @@ @@ -321,101 +400,12 @@
321 widget->terminal = terminal; 400 widget->terminal = terminal;
322 g_object_ref_sink(G_OBJECT(terminal)); 401 g_object_ref_sink(G_OBJECT(terminal));
323 set_session(widget, v3270_get_session(widget->terminal)); 402 set_session(widget, v3270_get_session(widget->terminal));
  403 + GTK_V3270(terminal)->trace = GTK_WIDGET(widget);
324 } 404 }
325 405
326 - // Create toggle buttons  
327 - {  
328 - size_t ix;  
329 -  
330 - static const LIB3270_TOGGLE_ID toggles[] = {  
331 - LIB3270_TOGGLE_DS_TRACE,  
332 - LIB3270_TOGGLE_NETWORK_TRACE,  
333 - LIB3270_TOGGLE_EVENT_TRACE,  
334 - LIB3270_TOGGLE_SSL_TRACE,  
335 - LIB3270_TOGGLE_SCREEN_TRACE  
336 - };  
337 -  
338 - for(ix = 0; ix < G_N_ELEMENTS(toggles); ix++)  
339 - {  
340 - GtkWidget * item = v3270_toggle_button_new(widget->terminal,toggles[ix]);  
341 -  
342 - gtk_widget_set_can_focus(item,FALSE);  
343 - gtk_widget_set_can_default(item,FALSE);  
344 -  
345 -#if GTK_CHECK_VERSION(3,20,0)  
346 - gtk_widget_set_focus_on_click(item,FALSE);  
347 -#endif // GTK 3,20,0  
348 -  
349 - gtk_box_pack_start(GTK_BOX(widget->buttons),item,FALSE,FALSE,0);  
350 -  
351 - }  
352 - }  
353 -  
354 -  
355 return GTK_WIDGET(widget); 406 return GTK_WIDGET(widget);
356 } 407 }
357 408
358 - struct _append_text  
359 - {  
360 - V3270Trace *widget;  
361 - gchar text[1];  
362 - };  
363 -  
364 - static gboolean bg_append_text(struct _append_text *cfg)  
365 - {  
366 - if(!GTK_IS_TEXT_BUFFER(cfg->widget->text))  
367 - return FALSE;  
368 -  
369 - GtkTextIter itr;  
370 - gtk_text_buffer_get_end_iter(cfg->widget->text,&itr);  
371 -  
372 - if(g_utf8_validate(cfg->text,strlen(cfg->text),NULL))  
373 - {  
374 - gtk_text_buffer_insert(cfg->widget->text,&itr,cfg->text,strlen(cfg->text));  
375 - }  
376 - else  
377 - {  
378 - gtk_text_buffer_insert(cfg->widget->text,&itr,"** Invalid UTF8 String **",-1);  
379 - }  
380 -  
381 - // gtk_text_buffer_get_end_iter(cfg->widget->text,&itr);  
382 - // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(cfg->widget->view), &itr, 0.0, FALSE, 0.0, 0.0);  
383 -  
384 - GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(cfg->widget->scroll);  
385 - gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj));  
386 - gtk_scrolled_window_set_vadjustment(cfg->widget->scroll, vadj);  
387 -  
388 - return FALSE;  
389 -  
390 - }  
391 -  
392 - LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text)  
393 - {  
394 - g_return_if_fail(GTK_IS_V3270_TRACE(widget));  
395 -  
396 - // Enqueue update.  
397 - struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1);  
398 - cfg->widget = GTK_V3270_TRACE(widget);  
399 - strcpy(cfg->text,text);  
400 -  
401 - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_append_text, cfg, g_free);  
402 -  
403 - }  
404 -  
405 - LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args)  
406 - {  
407 - g_autofree gchar * text = g_strdup_vprintf(fmt,args);  
408 - v3270_trace_append_text(widget,text);  
409 - }  
410 -  
411 - LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... )  
412 - {  
413 - va_list arg_ptr;  
414 - va_start(arg_ptr, fmt);  
415 - v3270_trace_vprintf(widget,fmt,arg_ptr);  
416 - va_end(arg_ptr);  
417 - }  
418 -  
419 const gchar * v3270_trace_get_filename(GtkWidget *widget) 409 const gchar * v3270_trace_get_filename(GtkWidget *widget)
420 { 410 {
421 g_return_val_if_fail(GTK_IS_V3270_TRACE(widget),NULL); 411 g_return_val_if_fail(GTK_IS_V3270_TRACE(widget),NULL);
@@ -479,3 +469,33 @@ @@ -479,3 +469,33 @@
479 } 469 }
480 470
481 } 471 }
  472 +
  473 + H3270 * v3270_trace_get_session(GtkWidget *widget)
  474 + {
  475 + return GTK_V3270_TRACE(widget)->hSession;
  476 + }
  477 +
  478 + GtkWidget * v3270_trace_get_terminal(GtkWidget *widget)
  479 + {
  480 + return GTK_V3270_TRACE(widget)->terminal;
  481 + }
  482 +
  483 + GtkTextBuffer * v3270_trace_get_text_buffer(GtkWidget *widget)
  484 + {
  485 + return GTK_V3270_TRACE(widget)->text;
  486 + }
  487 +
  488 + GtkScrolledWindow * v3270_trace_get_scrolled_window(GtkWidget *widget)
  489 + {
  490 + return GTK_V3270_TRACE(widget)->scroll;
  491 + }
  492 +
  493 + gboolean v3270_get_trace(GtkWidget *terminal)
  494 + {
  495 + return GTK_V3270(terminal)->trace != NULL;
  496 + }
  497 +
  498 + void v3270_set_trace(GtkWidget *terminal, gboolean trace)
  499 + {
  500 +
  501 + }
@@ -307,6 +307,9 @@ @@ -307,6 +307,9 @@
307 <Option compilerVar="CC" /> 307 <Option compilerVar="CC" />
308 </Unit> 308 </Unit>
309 <Unit filename="src/trace/private.h" /> 309 <Unit filename="src/trace/private.h" />
  310 + <Unit filename="src/trace/text.c">
  311 + <Option compilerVar="CC" />
  312 + </Unit>
310 <Unit filename="src/trace/trace.c"> 313 <Unit filename="src/trace/trace.c">
311 <Option compilerVar="CC" /> 314 <Option compilerVar="CC" />
312 </Unit> 315 </Unit>