Commit 595c171ea8a1e854aef2eedcee2d77847ff3a3df

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

Rewriting trace windows as a standard widget (for use in other apps).

src/include/v3270/filetransfer.h
@@ -132,11 +132,11 @@ @@ -132,11 +132,11 @@
132 LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message); 132 LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message);
133 133
134 // FT Dialog widget 134 // FT Dialog widget
135 - #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ())  
136 - #define GTK_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialog)) 135 + #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ())
  136 + #define GTK_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialog))
137 #define GTK_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass)) 137 #define GTK_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass))
138 - #define GTK_IS_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_DIALOG))  
139 - #define GTK_IS_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_DIALOG)) 138 + #define GTK_IS_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_DIALOG))
  139 + #define GTK_IS_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_DIALOG))
140 #define GTK_v3270_ft_settings_dialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass)) 140 #define GTK_v3270_ft_settings_dialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass))
141 141
142 typedef struct _V3270FTSettingsDialog V3270FTSettingsDialog; 142 typedef struct _V3270FTSettingsDialog V3270FTSettingsDialog;
src/include/v3270/trace.h
@@ -32,34 +32,25 @@ @@ -32,34 +32,25 @@
32 #ifndef PW3270_TRACE_H_INCLUDED 32 #ifndef PW3270_TRACE_H_INCLUDED
33 33
34 #include <gtk/gtk.h> 34 #include <gtk/gtk.h>
35 - #include <v3270.h>  
36 - #include <lib3270.h>  
37 35
38 #define PW3270_TRACE_H_INCLUDED 1 36 #define PW3270_TRACE_H_INCLUDED 1
39 37
40 G_BEGIN_DECLS 38 G_BEGIN_DECLS
41 39
42 - #define V3270_TYPE_TRACE (v3270_trace_get_type ())  
43 - #define V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), V3270_TYPE_TRACE, v3270_trace))  
44 - #define V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), V3270_TYPE_TRACE, pw3270_traceClass))  
45 - #define IS_V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), V3270_TYPE_TRACE))  
46 - #define IS_V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), V3270_TYPE_TRACE))  
47 - #define V3270_TRACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), V3270_TYPE_TRACE, v3270_traceClass)) 40 + #define GTK_TYPE_V3270_TRACE (V3270Trace_get_type ())
  41 + #define GTK_V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_TRACE, V3270Trace))
  42 + #define GTK_V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_TRACE, V3270TraceClass))
  43 + #define GTK_IS_V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_TRACE))
  44 + #define GTK_IS_V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_TRACE))
  45 + #define GTK_V3270_TRACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_TRACE, V3270TraceClass))
48 46
49 - typedef struct _v3270_trace v3270_trace;  
50 - typedef struct _v3270_traceClass v3270_traceClass; 47 + typedef struct _V3270Trace V3270Trace;
  48 + typedef struct _V3270TraceClass V3270TraceClass;
51 49
52 - LIB3270_EXPORT GtkWidget * v3270_trace_new();  
53 -  
54 - LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession, const gchar *header);  
55 -  
56 - LIB3270_EXPORT void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession);  
57 - LIB3270_EXPORT GType v3270_trace_get_type(void); 50 + LIB3270_EXPORT GtkWidget * v3270_trace_new(GtkWidget *terminal);
  51 + LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text);
58 LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); 52 LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args);
59 LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); 53 LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... );
60 - LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text);  
61 - LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget);  
62 - LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on);  
63 54
64 G_END_DECLS 55 G_END_DECLS
65 56
src/testprogram/testprogram.c
@@ -37,6 +37,7 @@ @@ -37,6 +37,7 @@
37 #include <v3270/filetransfer.h> 37 #include <v3270/filetransfer.h>
38 #include <v3270/ftprogress.h> 38 #include <v3270/ftprogress.h>
39 #include <v3270/colorscheme.h> 39 #include <v3270/colorscheme.h>
  40 + #include <v3270/trace.h>
40 #include <lib3270/log.h> 41 #include <lib3270/log.h>
41 #include <stdlib.h> 42 #include <stdlib.h>
42 43
@@ -149,6 +150,11 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term @@ -149,6 +150,11 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term
149 150
150 static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) 151 static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
151 { 152 {
  153 + GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test"));
  154 + 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 +
  157 + /*
152 // 158 //
153 // Test activity 159 // Test activity
154 // 160 //
@@ -158,13 +164,11 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) @@ -158,13 +164,11 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
158 v3270_ft_activity_set_remote_filename(activity,"remote_file"); 164 v3270_ft_activity_set_remote_filename(activity,"remote_file");
159 v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP); 165 v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP);
160 166
161 - /*  
162 // 167 //
163 // Test settings dialog 168 // Test settings dialog
164 // 169 //
165 GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal); 170 GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal);
166 v3270_ft_settings_dialog_append_activity(dialog,activity,NULL); 171 v3270_ft_settings_dialog_append_activity(dialog,activity,NULL);
167 - */  
168 172
169 // 173 //
170 // Test worker widget 174 // Test worker widget
@@ -175,6 +179,7 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) @@ -175,6 +179,7 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
175 v3270_ft_worker_set_session(worker,v3270_get_session(terminal)); 179 v3270_ft_worker_set_session(worker,v3270_get_session(terminal));
176 v3270_ft_worker_set_activity(worker,activity); 180 v3270_ft_worker_set_activity(worker,activity);
177 v3270_ft_worker_start(worker); 181 v3270_ft_worker_start(worker);
  182 + */
178 183
179 gtk_widget_show_all(dialog); 184 gtk_widget_show_all(dialog);
180 gtk_dialog_run(GTK_DIALOG(dialog)); 185 gtk_dialog_run(GTK_DIALOG(dialog));
@@ -205,6 +210,7 @@ static void color_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) @@ -205,6 +210,7 @@ static void color_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
205 210
206 } 211 }
207 212
  213 +
208 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { 214 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
209 215
210 GtkWidget * window = gtk_application_window_new(app); 216 GtkWidget * window = gtk_application_window_new(app);
@@ -218,6 +224,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { @@ -218,6 +224,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
218 // v3270_set_font_family(terminal,"Droid Sans Mono"); 224 // v3270_set_font_family(terminal,"Droid Sans Mono");
219 g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window); 225 g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window);
220 226
  227 + /*
221 GtkWidget *trace = v3270_new_trace_window(terminal,NULL); 228 GtkWidget *trace = v3270_new_trace_window(terminal,NULL);
222 if(trace) { 229 if(trace) {
223 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); 230 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal));
@@ -225,6 +232,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { @@ -225,6 +232,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
225 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); 232 lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE);
226 gtk_widget_show_all(trace); 233 gtk_widget_show_all(trace);
227 } 234 }
  235 + */
228 236
229 /* 237 /*
230 v3270_connect(terminal); 238 v3270_connect(terminal);
src/trace/exec.c
@@ -42,6 +42,7 @@ @@ -42,6 +42,7 @@
42 #include <lib3270/properties.h> 42 #include <lib3270/properties.h>
43 #include <v3270/trace.h> 43 #include <v3270/trace.h>
44 44
  45 + /*
45 static const gchar * get_word(gchar **ptr) 46 static const gchar * get_word(gchar **ptr)
46 { 47 {
47 gchar *rc = g_strstrip(*ptr); 48 gchar *rc = g_strstrip(*ptr);
@@ -58,7 +59,9 @@ @@ -58,7 +59,9 @@
58 59
59 return rc; 60 return rc;
60 } 61 }
  62 + */
61 63
  64 + /*
62 static int set_property(H3270 *hSession, const gchar *name, const gchar * value) 65 static int set_property(H3270 *hSession, const gchar *name, const gchar * value)
63 { 66 {
64 size_t ix; 67 size_t ix;
@@ -103,9 +106,11 @@ @@ -103,9 +106,11 @@
103 return errno = ENOENT; 106 return errno = ENOENT;
104 107
105 } 108 }
  109 + */
106 110
107 int v3270_exec_command(GtkWidget *widget, const gchar *text) 111 int v3270_exec_command(GtkWidget *widget, const gchar *text)
108 { 112 {
  113 + /*
109 H3270 *hSession = v3270_get_session(widget); 114 H3270 *hSession = v3270_get_session(widget);
110 g_autofree gchar * cmdline = g_strdup(text); 115 g_autofree gchar * cmdline = g_strdup(text);
111 116
@@ -145,6 +150,7 @@ @@ -145,6 +150,7 @@
145 *(sep++) = 0; 150 *(sep++) = 0;
146 set_property(hSession,g_strstrip(cmdline),g_strstrip(sep)); 151 set_property(hSession,g_strstrip(cmdline),g_strstrip(sep));
147 } 152 }
  153 + */
148 154
149 return errno = ENOENT; 155 return errno = ENOENT;
150 } 156 }
src/trace/trace.c
@@ -1,535 +0,0 @@ @@ -1,535 +0,0 @@
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 trace.c 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 <gtk/gtk.h>  
31 -  
32 - #define ENABLE_NLS  
33 - #define GETTEXT_PACKAGE PACKAGE_NAME  
34 -  
35 - #include <libintl.h>  
36 - #include <glib/gi18n.h>  
37 -  
38 - #include <lib3270.h>  
39 - #include <lib3270/log.h>  
40 - #include <lib3270/trace.h>  
41 - #include <lib3270/properties.h>  
42 - #include <v3270/trace.h>  
43 -  
44 -#if defined( HAVE_SYSLOG )  
45 - #include <syslog.h>  
46 -#endif // HAVE_SYSLOG  
47 -  
48 -/*--[ Widget definition ]----------------------------------------------------------------------------*/  
49 -  
50 - G_BEGIN_DECLS  
51 -  
52 - struct _v3270_traceClass  
53 - {  
54 - GtkWindowClass parent_class;  
55 - };  
56 -  
57 - struct _v3270_trace  
58 - {  
59 - GtkWindow parent;  
60 - GtkTextBuffer * text;  
61 - GtkWidget * entry;  
62 - GtkWidget * button;  
63 - GtkWidget * scroll;  
64 - GtkWidget * view;  
65 - H3270 * hSession;  
66 - gchar **line;  
67 - guint log_handler;  
68 - gboolean * enabled;  
69 - gboolean destroy_on_close;  
70 -  
71 - /// @brief lib3270's saved trace handler.  
72 - struct {  
73 - void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args);  
74 - void *userdata;  
75 - } trace;  
76 -  
77 - };  
78 -  
79 - const GtkWindowClass * v3270_trace_get_parent_class(void);  
80 -  
81 - G_END_DECLS  
82 -  
83 - G_DEFINE_TYPE(v3270_trace, v3270_trace, GTK_TYPE_WINDOW);  
84 -  
85 - static void append_text(v3270_trace *hwnd, const gchar *text);  
86 -  
87 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
88 -  
89 - const GtkWindowClass * v3270_trace_get_parent_class(void)  
90 - {  
91 - return GTK_WINDOW_CLASS(v3270_trace_parent_class);  
92 - }  
93 -  
94 - static void activate_default(GtkWindow *window)  
95 - {  
96 - v3270_trace * hwnd = V3270_TRACE(window);  
97 -  
98 - if(hwnd->enabled)  
99 - {  
100 - if(*hwnd->line)  
101 - g_free(*hwnd->line);  
102 -  
103 - *hwnd->line = g_strdup(gtk_entry_get_text(GTK_ENTRY(hwnd->entry)));  
104 -  
105 - gtk_widget_set_sensitive(hwnd->entry,FALSE);  
106 - gtk_widget_set_sensitive(hwnd->button,FALSE);  
107 -  
108 - *hwnd->enabled = FALSE;  
109 - }  
110 -  
111 - }  
112 -  
113 -static void destroy(GtkWidget *widget)  
114 -{  
115 - v3270_trace * hwnd = V3270_TRACE(widget);  
116 -  
117 - if(hwnd->hSession)  
118 - {  
119 - lib3270_set_trace_handler(hwnd->hSession,hwnd->trace.handler,hwnd->trace.userdata);  
120 - }  
121 -  
122 - if(hwnd->log_handler)  
123 - {  
124 - g_log_remove_handler(NULL,hwnd->log_handler);  
125 - hwnd->log_handler = 0;  
126 - }  
127 -  
128 - if(hwnd->line)  
129 - *hwnd->line = NULL;  
130 -  
131 - if(hwnd->enabled)  
132 - *hwnd->enabled = FALSE;  
133 -  
134 - }  
135 -  
136 - static gboolean delete_event(GtkWidget *widget, G_GNUC_UNUSED GdkEventAny *event)  
137 - {  
138 - v3270_trace * hwnd = V3270_TRACE(widget);  
139 -  
140 - if(hwnd->line)  
141 - *hwnd->line = NULL;  
142 -  
143 - if(hwnd->enabled)  
144 - *hwnd->enabled = FALSE;  
145 -  
146 - if(hwnd->destroy_on_close)  
147 - return FALSE;  
148 -  
149 - gtk_widget_hide(widget);  
150 - return TRUE;  
151 - }  
152 -  
153 - static void v3270_trace_class_init(v3270_traceClass *klass)  
154 - {  
155 - GtkWindowClass * window_class = GTK_WINDOW_CLASS(klass);  
156 - GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass);  
157 -  
158 - window_class->activate_default = activate_default;  
159 - widget_class->delete_event = delete_event;  
160 -  
161 - widget_class->destroy = destroy;  
162 -  
163 - }  
164 -  
165 - static void activate(G_GNUC_UNUSED GtkButton *button, v3270_trace *window)  
166 - {  
167 - GtkWidget * terminal = GTK_WIDGET(lib3270_get_user_data(window->hSession));  
168 -  
169 - int rc = v3270_exec_command(terminal,gtk_entry_get_text(GTK_ENTRY(window->entry)));  
170 -  
171 - v3270_trace_printf(GTK_WIDGET(window),"exec(\"%s\") exits with rc=%d (%s)\n",gtk_entry_get_text(GTK_ENTRY(window->entry)),rc,strerror(rc));  
172 - gtk_entry_set_text(GTK_ENTRY(window->entry),"");  
173 - }  
174 -  
175 - static void menu_save(G_GNUC_UNUSED GtkWidget *button, v3270_trace *window)  
176 - {  
177 - GtkWindow * toplevel = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(window)));  
178 - GtkWidget * dialog;  
179 -  
180 - dialog = gtk_file_chooser_dialog_new( _( "Save trace file" ),  
181 - toplevel,  
182 - GTK_FILE_CHOOSER_ACTION_SAVE,  
183 - _( "Cancel" ), GTK_RESPONSE_CANCEL,  
184 - _( "Save" ), GTK_RESPONSE_ACCEPT,  
185 - NULL );  
186 -  
187 - gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);  
188 -  
189 - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS));  
190 -  
191 - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)  
192 - {  
193 - gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));  
194 - if(filename)  
195 - {  
196 - GError * error = NULL;  
197 - gchar * text;  
198 - GtkTextIter start;  
199 - GtkTextIter end;  
200 -  
201 - gtk_text_buffer_get_start_iter(window->text,&start);  
202 - gtk_text_buffer_get_end_iter(window->text,&end);  
203 - text = gtk_text_buffer_get_text(window->text,&start,&end,FALSE);  
204 -  
205 - g_file_set_contents(filename,text,-1,&error);  
206 -  
207 - g_free(text);  
208 -  
209 - if(error)  
210 - {  
211 - GtkWidget *popup = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,_( "Can't save %s" ),filename);  
212 -  
213 - gtk_window_set_title(GTK_WINDOW(popup),_("Can't save file"));  
214 -  
215 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message);  
216 - g_error_free(error);  
217 -  
218 - gtk_dialog_run(GTK_DIALOG(popup));  
219 - gtk_widget_destroy(popup);  
220 -  
221 - }  
222 -  
223 - g_free(filename);  
224 - }  
225 - }  
226 -  
227 - gtk_widget_destroy(dialog);  
228 -  
229 - }  
230 -  
231 - static void menu_close(G_GNUC_UNUSED GtkWidget *button, GtkWidget *window)  
232 - {  
233 - gtk_widget_destroy(window);  
234 - }  
235 -  
236 - struct submenu  
237 - {  
238 - const gchar * label;  
239 - GCallback action;  
240 - };  
241 -  
242 - static void build_menu(GtkWidget *menubar, v3270_trace *window, const gchar *label, const struct submenu *item, size_t sz)  
243 - {  
244 - size_t f;  
245 - GtkWidget * menu = gtk_menu_new();  
246 - GtkWidget * topitem = gtk_menu_item_new_with_mnemonic(label);  
247 -  
248 - gtk_menu_item_set_submenu(GTK_MENU_ITEM(topitem), menu);  
249 -  
250 - for(f=0;f<sz;f++)  
251 - {  
252 - GtkWidget *widget = gtk_menu_item_new_with_mnemonic(gettext(item[f].label));  
253 - gtk_menu_shell_append(GTK_MENU_SHELL(menu),widget);  
254 - g_signal_connect(G_OBJECT(widget), "activate",item[f].action,window);  
255 - }  
256 -  
257 - gtk_menu_shell_append(GTK_MENU_SHELL(menubar), topitem);  
258 - }  
259 -  
260 - static void glog(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,GtkWidget *window)  
261 - {  
262 - #ifndef LOG_INFO  
263 - #define LOG_INFO 0  
264 - #endif // LOG_INFO  
265 -  
266 - #ifndef LOG_ERR  
267 - #define LOG_ERR 0  
268 - #endif // LOG_ERR  
269 -  
270 - #ifndef LOG_DEBUG  
271 - #define LOG_DEBUG 0  
272 - #endif // LOG_DEBUG  
273 -  
274 - static const struct _logtype  
275 - {  
276 - GLogLevelFlags log_level;  
277 - int priority;  
278 - const gchar * msg;  
279 - } logtype[] =  
280 - {  
281 - { G_LOG_FLAG_RECURSION, LOG_INFO, "recursion" },  
282 - { G_LOG_FLAG_FATAL, LOG_ERR, "fatal error" },  
283 -  
284 - /* GLib log levels */  
285 - { G_LOG_LEVEL_ERROR, LOG_ERR, "error" },  
286 - { G_LOG_LEVEL_CRITICAL, LOG_ERR, "critical error" },  
287 - { G_LOG_LEVEL_WARNING, LOG_ERR, "warning" },  
288 - { G_LOG_LEVEL_MESSAGE, LOG_ERR, "message" },  
289 - { G_LOG_LEVEL_INFO, LOG_INFO, "info" },  
290 - { G_LOG_LEVEL_DEBUG, LOG_DEBUG, "debug" },  
291 - };  
292 -  
293 - size_t f;  
294 -  
295 - for(f=0;f<G_N_ELEMENTS(logtype);f++)  
296 - {  
297 - if(logtype[f].log_level == log_level)  
298 - {  
299 - gchar *ptr;  
300 - gchar *text = g_strdup_printf("%s: %s %s",logtype[f].msg,log_domain ? log_domain : "",message);  
301 - for(ptr = text;*ptr;ptr++)  
302 - {  
303 - if(*ptr < ' ')  
304 - *ptr = ' ';  
305 - }  
306 -  
307 - v3270_trace_printf(window,"%s\n",text);  
308 -  
309 -#ifdef HAVE_SYSLOG  
310 - syslog(logtype[f].priority,"%s",text);  
311 -#endif // HAVE_SYSLOG  
312 - g_free(text);  
313 - return;  
314 - }  
315 - }  
316 -  
317 - v3270_trace_printf(window,"%s %s\n",log_domain ? log_domain : "", message);  
318 -  
319 -#ifdef HAVE_SYSLOG  
320 - syslog(LOG_INFO,"%s %s",log_domain ? log_domain : "", message);  
321 -#endif // HAVE_SYSLOG  
322 -  
323 - }  
324 -  
325 - static void v3270_trace_init(v3270_trace *window)  
326 -{  
327 - GtkWidget * widget;  
328 - GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);  
329 -  
330 - // Top menu  
331 - {  
332 -  
333 - // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html  
334 - static const struct submenu filemenu[] =  
335 - {  
336 - { N_("_Save trace to file"), G_CALLBACK(menu_save) },  
337 - { N_("_Close window"), G_CALLBACK(menu_close) },  
338 -  
339 - };  
340 -  
341 - widget = gtk_menu_bar_new();  
342 -  
343 - build_menu(widget, window, _( "_File" ), filemenu, G_N_ELEMENTS(filemenu));  
344 -  
345 - gtk_box_pack_start(GTK_BOX(vbox),widget,FALSE,TRUE,0);  
346 - }  
347 -  
348 - window->hSession = NULL;  
349 -  
350 - // Trace container  
351 - window->scroll = gtk_scrolled_window_new(NULL,NULL);  
352 - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window->scroll),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);  
353 -  
354 - window->view = gtk_text_view_new();  
355 - gtk_text_view_set_monospace(GTK_TEXT_VIEW(window->view),TRUE);  
356 -  
357 - window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->view));  
358 - gtk_text_view_set_editable(GTK_TEXT_VIEW(window->view), TRUE);  
359 -  
360 - gtk_container_add(GTK_CONTAINER(window->scroll),window->view);  
361 - gtk_box_pack_start(GTK_BOX(vbox),window->scroll,TRUE,TRUE,0);  
362 -  
363 - // Edit box  
364 - widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);  
365 - gtk_box_pack_start(GTK_BOX(widget),gtk_label_new( _( "Command:" )),FALSE,TRUE,4);  
366 - window->entry = gtk_entry_new();  
367 - gtk_box_pack_start(GTK_BOX(widget),window->entry,TRUE,TRUE,4);  
368 - //gtk_widget_set_sensitive(window->entry,FALSE);  
369 - g_signal_connect(G_OBJECT(window->entry),"activate",G_CALLBACK(activate),window);  
370 -  
371 - window->button = gtk_button_new_from_icon_name("system-run",GTK_ICON_SIZE_BUTTON);  
372 - gtk_box_pack_end(GTK_BOX(widget),window->button,FALSE,FALSE,4);  
373 - gtk_widget_set_focus_on_click(GTK_WIDGET(window->button),FALSE);  
374 - g_signal_connect(G_OBJECT(window->button),"clicked",G_CALLBACK(activate),window);  
375 -  
376 - gtk_box_pack_start(GTK_BOX(vbox),widget,FALSE,TRUE,0);  
377 -  
378 - gtk_widget_show_all(vbox);  
379 -  
380 - gtk_container_add(GTK_CONTAINER(window),vbox);  
381 -  
382 - window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window);  
383 - }  
384 -  
385 - GtkWidget * v3270_trace_new()  
386 - {  
387 - return g_object_new(V3270_TYPE_TRACE, NULL);  
388 - }  
389 -  
390 - LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget, const gchar *header)  
391 - {  
392 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
393 - return v3270_trace_new_from_session(v3270_get_session(widget), header);  
394 - }  
395 -  
396 - static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args)  
397 - {  
398 - gchar *ptr = g_strdup_vprintf(fmt,args);  
399 - gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_display_charset(hSession),"?",NULL,NULL,NULL);  
400 - v3270_trace_printf(GTK_WIDGET(userdata),"%s",utftext);  
401 - g_free(utftext);  
402 - g_free(ptr);  
403 - }  
404 -  
405 - void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession) {  
406 -  
407 - v3270_trace * trace = V3270_TRACE(widget);  
408 -  
409 - if(trace->hSession) {  
410 - lib3270_set_trace_handler(trace->hSession,trace->trace.handler,trace->trace.userdata);  
411 - }  
412 -  
413 - trace->hSession = hSession;  
414 -  
415 - if(hSession) {  
416 - lib3270_get_trace_handler(hSession,&trace->trace.handler,&trace->trace.userdata);  
417 - lib3270_set_trace_handler(hSession,trace_handler,(void *) widget);  
418 - }  
419 -  
420 - }  
421 -  
422 - LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession, const gchar *header) {  
423 -  
424 - GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL);  
425 - void * terminal = lib3270_get_user_data(hSession);  
426 -  
427 - V3270_TRACE(widget)->hSession = NULL;  
428 -  
429 - gtk_window_set_default_size(GTK_WINDOW(widget),590,430);  
430 -  
431 - if(terminal && GTK_IS_V3270(terminal))  
432 - {  
433 - gtk_window_set_attached_to(GTK_WINDOW(widget),GTK_WIDGET(terminal));  
434 - }  
435 -  
436 - v3270_trace_set_session(widget, hSession);  
437 -  
438 - if(header)  
439 - append_text(V3270_TRACE(widget), header);  
440 -  
441 - return widget;  
442 - }  
443 -  
444 - struct bg_print_data  
445 - {  
446 - GtkWidget * widget;  
447 - gchar * msg;  
448 - };  
449 -  
450 - static void append_text(v3270_trace *hwnd, const gchar *text)  
451 - {  
452 - GtkTextIter itr;  
453 - gtk_text_buffer_get_end_iter(hwnd->text,&itr);  
454 -  
455 - if(g_utf8_validate(text,strlen(text),NULL))  
456 - {  
457 - gtk_text_buffer_insert(hwnd->text,&itr,text,strlen(text));  
458 - }  
459 - else  
460 - {  
461 - gtk_text_buffer_insert(hwnd->text,&itr,"** Invalid UTF8 String **",-1);  
462 - }  
463 -  
464 - // gtk_text_buffer_get_end_iter(hwnd->text,&itr);  
465 - // gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(hwnd->view), &itr, 0.0, FALSE, 0.0, 0.0);  
466 -  
467 - //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll));  
468 - //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj));  
469 - //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj);  
470 - }  
471 -  
472 - static gboolean bg_trace_append_text(struct bg_print_data *data)  
473 - {  
474 - append_text(V3270_TRACE(data->widget),data->msg);  
475 - g_free(data->msg);  
476 - return FALSE;  
477 - }  
478 -  
479 - void v3270_trace_append_text(GtkWidget *widget, const gchar *text)  
480 - {  
481 - struct bg_print_data * data = g_new0(struct bg_print_data,1);  
482 -  
483 - data->widget = widget;  
484 - data->msg = g_strdup(text);  
485 -  
486 - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_append_text, data, g_free);  
487 - }  
488 -  
489 - void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args)  
490 - {  
491 - struct bg_print_data * data = g_new0(struct bg_print_data,1);  
492 -  
493 - data->widget = widget;  
494 - data->msg = g_strdup_vprintf(fmt,args);  
495 -  
496 - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_append_text, data, g_free);  
497 - }  
498 -  
499 - void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... )  
500 - {  
501 - va_list arg_ptr;  
502 - va_start(arg_ptr, fmt);  
503 - v3270_trace_vprintf(widget,fmt,arg_ptr);  
504 - va_end(arg_ptr);  
505 - }  
506 -  
507 - LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget)  
508 - {  
509 - v3270_trace * hwnd = V3270_TRACE(widget);  
510 - gchar * line = NULL;  
511 - gboolean enabled = TRUE;  
512 -  
513 - hwnd->line = &line;  
514 - hwnd->enabled = &enabled;  
515 -  
516 - gtk_window_present(GTK_WINDOW(widget));  
517 - gtk_widget_set_sensitive(hwnd->entry,TRUE);  
518 - gtk_widget_set_sensitive(hwnd->button,TRUE);  
519 - gtk_widget_grab_focus(hwnd->entry);  
520 -  
521 - while(enabled)  
522 - {  
523 - gtk_main_iteration();  
524 - }  
525 -  
526 - hwnd->line = NULL;  
527 - hwnd->enabled = NULL;  
528 -  
529 - return line;  
530 - }  
531 -  
532 - LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on)  
533 - {  
534 - V3270_TRACE(widget)->destroy_on_close = on;  
535 - }  
src/trace/widget.c 0 → 100644
@@ -0,0 +1,227 @@ @@ -0,0 +1,227 @@
  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 trace.c 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 +/**
  31 + * SECTION:V3270Trace
  32 + * @Short_description: A trace monitor widget.
  33 + * @Title: V3270Trace
  34 + *
  35 + * The #V3270Trace shows a text area with the lib3270 trace output.
  36 + *
  37 + */
  38 +
  39 + #include <gtk/gtk.h>
  40 +
  41 + #define ENABLE_NLS
  42 + #define GETTEXT_PACKAGE PACKAGE_NAME
  43 +
  44 + #include <libintl.h>
  45 + #include <glib/gi18n.h>
  46 +
  47 + #include <v3270.h>
  48 + #include <lib3270.h>
  49 + #include <lib3270/log.h>
  50 + #include <lib3270/trace.h>
  51 + #include <lib3270/properties.h>
  52 + #include <v3270/trace.h>
  53 +
  54 +#if defined( HAVE_SYSLOG )
  55 + #include <syslog.h>
  56 +#endif // HAVE_SYSLOG
  57 +
  58 +/*--[ Widget definition ]----------------------------------------------------------------------------*/
  59 +
  60 + G_BEGIN_DECLS
  61 +
  62 + struct _V3270TraceClass
  63 + {
  64 + GtkGridClass parent_class;
  65 +
  66 + };
  67 +
  68 + struct _V3270Trace
  69 + {
  70 + GtkGrid parent;
  71 + H3270 * hSession; /// @brief TN3270 Session.
  72 +
  73 + GtkTextBuffer * text; /// @brief Trace window contents.
  74 + GtkWidget * entry; /// @brief Command line entry.
  75 + GtkWidget * run; /// @brief "exec" button.
  76 +
  77 + /// @brief lib3270's saved trace handler.
  78 + struct {
  79 + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args);
  80 + void *userdata;
  81 + } trace;
  82 +
  83 + };
  84 +
  85 + G_END_DECLS
  86 +
  87 + G_DEFINE_TYPE(V3270Trace, V3270Trace, GTK_TYPE_GRID);
  88 +
  89 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  90 +
  91 + static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args)
  92 + {
  93 + g_autofree gchar *ptr = g_strdup_vprintf(fmt,args);
  94 + g_autofree gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_display_charset(hSession),"?",NULL,NULL,NULL);
  95 +
  96 + v3270_trace_append_text(GTK_WIDGET(userdata),utftext);
  97 +
  98 + }
  99 +
  100 + static void set_session(V3270Trace *widget, H3270 *hSession)
  101 + {
  102 + if(widget->hSession) {
  103 + lib3270_set_trace_handler(widget->hSession,widget->trace.handler,widget->trace.userdata);
  104 + }
  105 +
  106 + widget->hSession = hSession;
  107 +
  108 + if(hSession) {
  109 + lib3270_get_trace_handler(hSession,&widget->trace.handler,&widget->trace.userdata);
  110 + lib3270_set_trace_handler(hSession,trace_handler,(void *) widget);
  111 + }
  112 +
  113 + }
  114 +
  115 + static void finalize(GObject *object)
  116 + {
  117 + debug("V3270Trace::%s",__FUNCTION__);
  118 +
  119 + set_session(GTK_V3270_TRACE(object),NULL);
  120 +
  121 + G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object);
  122 + }
  123 +
  124 + static void V3270Trace_class_init(G_GNUC_UNUSED V3270TraceClass *klass)
  125 + {
  126 + G_OBJECT_CLASS(klass)->finalize = finalize;
  127 + }
  128 +
  129 + static void V3270Trace_init(V3270Trace *widget)
  130 + {
  131 +
  132 + // Create text view
  133 + {
  134 + GtkWidget *scrolled = gtk_scrolled_window_new(NULL,NULL);
  135 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  136 + gtk_widget_set_vexpand(scrolled,TRUE);
  137 + gtk_widget_set_hexpand(scrolled,TRUE);
  138 + gtk_grid_attach(GTK_GRID(widget),scrolled,0,0,10,1);
  139 +
  140 + GtkWidget *view = gtk_text_view_new();
  141 + gtk_text_view_set_monospace(GTK_TEXT_VIEW(view),TRUE);
  142 +
  143 + widget->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
  144 + gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE);
  145 +
  146 + gtk_container_add(GTK_CONTAINER(scrolled),view);
  147 +
  148 + }
  149 +
  150 + // Create command line
  151 + {
  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);
  155 +
  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);
  159 +
  160 + }
  161 +
  162 +
  163 + }
  164 +
  165 + LIB3270_EXPORT GtkWidget * v3270_trace_new(GtkWidget *terminal)
  166 + {
  167 + g_return_val_if_fail(GTK_IS_V3270(terminal),NULL);
  168 +
  169 + V3270Trace * widget = GTK_V3270_TRACE(g_object_new(GTK_TYPE_V3270_TRACE, NULL));
  170 +
  171 + set_session(widget, v3270_get_session(terminal));
  172 +
  173 + return GTK_WIDGET(widget);
  174 + }
  175 +
  176 + struct _append_text
  177 + {
  178 + V3270Trace *widget;
  179 + gchar text[1];
  180 + };
  181 +
  182 + static void bg_append_text(struct _append_text *cfg)
  183 + {
  184 + GtkTextIter itr;
  185 + gtk_text_buffer_get_end_iter(cfg->widget->text,&itr);
  186 +
  187 + if(g_utf8_validate(cfg->text,strlen(cfg->text),NULL))
  188 + {
  189 + gtk_text_buffer_insert(cfg->widget->text,&itr,cfg->text,strlen(cfg->text));
  190 + }
  191 + else
  192 + {
  193 + gtk_text_buffer_insert(cfg->widget->text,&itr,"** Invalid UTF8 String **",-1);
  194 + }
  195 +
  196 + // gtk_text_buffer_get_end_iter(hwnd->text,&itr);
  197 + // gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(hwnd->view), &itr, 0.0, FALSE, 0.0, 0.0);
  198 +
  199 + //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll));
  200 + //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj));
  201 + //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj);
  202 + }
  203 +
  204 + LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text)
  205 + {
  206 + g_return_if_fail(GTK_IS_V3270_TRACE(widget));
  207 +
  208 + // Enqueue update.
  209 + struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1);
  210 + gdk_threads_add_idle_full(G_PRIORITY_LOW,(GSourceFunc) bg_append_text,cfg,g_free);
  211 +
  212 + }
  213 +
  214 + LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args)
  215 + {
  216 + g_autofree * text = g_strdup_vprintf(fmt,args);
  217 + v3270_trace_append_text(widget,text);
  218 + }
  219 +
  220 + LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... )
  221 + {
  222 + va_list arg_ptr;
  223 + va_start(arg_ptr, fmt);
  224 + v3270_trace_vprintf(widget,fmt,arg_ptr);
  225 + va_end(arg_ptr);
  226 + }
  227 +