Commit f0d7d344c9fe63639c629318d5535506e0f10dc2
1 parent
a370c560
Exists in
master
and in
5 other branches
Implementando janela de trace
Showing
10 changed files
with
113 additions
and
23 deletions
Show diff stats
Makefile.in
| @@ -308,6 +308,7 @@ install-sdk: | @@ -308,6 +308,7 @@ install-sdk: | ||
| 308 | @$(INSTALL_DATA) src/include/lib3270/popup.h $(DESTDIR)/$(includedir)/lib3270 | 308 | @$(INSTALL_DATA) src/include/lib3270/popup.h $(DESTDIR)/$(includedir)/lib3270 |
| 309 | @$(INSTALL_DATA) src/include/lib3270/actions.h $(DESTDIR)/$(includedir)/lib3270 | 309 | @$(INSTALL_DATA) src/include/lib3270/actions.h $(DESTDIR)/$(includedir)/lib3270 |
| 310 | @$(INSTALL_DATA) src/include/lib3270/action_table.h $(DESTDIR)/$(includedir)/lib3270 | 310 | @$(INSTALL_DATA) src/include/lib3270/action_table.h $(DESTDIR)/$(includedir)/lib3270 |
| 311 | + @$(INSTALL_DATA) src/include/lib3270/trace.h $(DESTDIR)/$(includedir)/lib3270 | ||
| 311 | 312 | ||
| 312 | @$(MKDIR) $(DESTDIR)$(includedir)/pw3270 | 313 | @$(MKDIR) $(DESTDIR)$(includedir)/pw3270 |
| 313 | @$(INSTALL_DATA) src/include/pw3270/v3270.h $(DESTDIR)/$(includedir)/pw3270 | 314 | @$(INSTALL_DATA) src/include/pw3270/v3270.h $(DESTDIR)/$(includedir)/pw3270 |
src/include/lib3270.h
| @@ -1007,10 +1007,6 @@ | @@ -1007,10 +1007,6 @@ | ||
| 1007 | 1007 | ||
| 1008 | LIB3270_EXPORT int lib3270_clear_operator_error(H3270 *hSession); | 1008 | LIB3270_EXPORT int lib3270_clear_operator_error(H3270 *hSession); |
| 1009 | 1009 | ||
| 1010 | - LIB3270_EXPORT void lib3270_trace_event(H3270 *session, const char *fmt, ...) LIB3270_GNUC_FORMAT(2,3); | ||
| 1011 | - LIB3270_EXPORT void lib3270_set_trace_handler( void (*handler)(H3270 *session, const char *fmt, va_list args) ); | ||
| 1012 | - LIB3270_EXPORT void lib3270_write_dstrace(H3270 *session, const char *fmt, ...) LIB3270_GNUC_FORMAT(2,3); | ||
| 1013 | - | ||
| 1014 | LIB3270_EXPORT LIB3270_OPTION lib3270_get_options(H3270 *hSession); | 1010 | LIB3270_EXPORT LIB3270_OPTION lib3270_get_options(H3270 *hSession); |
| 1015 | LIB3270_EXPORT void lib3270_set_options(H3270 *hSession, LIB3270_OPTION opt); | 1011 | LIB3270_EXPORT void lib3270_set_options(H3270 *hSession, LIB3270_OPTION opt); |
| 1016 | LIB3270_EXPORT int lib3270_set_color_type(H3270 *hSession, unsigned short colortype); | 1012 | LIB3270_EXPORT int lib3270_set_color_type(H3270 *hSession, unsigned short colortype); |
src/include/lib3270/trace.h
| @@ -33,13 +33,18 @@ | @@ -33,13 +33,18 @@ | ||
| 33 | 33 | ||
| 34 | #define LIB3270_TRACE_H_INCLUDED 1 | 34 | #define LIB3270_TRACE_H_INCLUDED 1 |
| 35 | 35 | ||
| 36 | + typedef void (*LIB3270_TRACE_HANDLER)(H3270 *, const char *, va_list); | ||
| 37 | + | ||
| 38 | + | ||
| 36 | /** | 39 | /** |
| 37 | * Set trace handle callback. | 40 | * Set trace handle callback. |
| 38 | * | 41 | * |
| 39 | - * @param handle Callback to write in trace file or show trace window (NULL send all trace to stdout). | 42 | + * @param handle Callback to write in trace file or show trace window (NULL send all trace to stdout/syslog). |
| 43 | + * @param data User data to pass to the trace handler. | ||
| 40 | * | 44 | * |
| 45 | + * @return Current trace handler | ||
| 41 | */ | 46 | */ |
| 42 | - LIB3270_EXPORT void lib3270_set_trace_handler( void (*handler)(H3270 *session, const char *fmt, va_list args) ); | 47 | + LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler( LIB3270_TRACE_HANDLER handler); |
| 43 | 48 | ||
| 44 | /** | 49 | /** |
| 45 | * Write on trace file. | 50 | * Write on trace file. |
src/lib3270/ft.c
src/lib3270/kybd.c
src/lib3270/trace_ds.c
| @@ -38,6 +38,7 @@ | @@ -38,6 +38,7 @@ | ||
| 38 | */ | 38 | */ |
| 39 | 39 | ||
| 40 | #include "globals.h" | 40 | #include "globals.h" |
| 41 | +#include <lib3270/trace.h> | ||
| 41 | 42 | ||
| 42 | #if defined(X3270_TRACE) /*[*/ | 43 | #if defined(X3270_TRACE) /*[*/ |
| 43 | 44 | ||
| @@ -74,9 +75,11 @@ static void wtrace(H3270 *session, const char *fmt, ...); | @@ -74,9 +75,11 @@ static void wtrace(H3270 *session, const char *fmt, ...); | ||
| 74 | static void (*vwtrace)(H3270 *session, const char *fmt, va_list args) = __vwtrace; | 75 | static void (*vwtrace)(H3270 *session, const char *fmt, va_list args) = __vwtrace; |
| 75 | 76 | ||
| 76 | 77 | ||
| 77 | -LIB3270_EXPORT void lib3270_set_trace_handler( void (*handler)(H3270 *session, const char *fmt, va_list args) ) | 78 | +LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler( LIB3270_TRACE_HANDLER handler ) |
| 78 | { | 79 | { |
| 80 | + void (*ret)(H3270 *session, const char *fmt, va_list args) = vwtrace; | ||
| 79 | vwtrace = handler ? handler : __vwtrace; | 81 | vwtrace = handler ? handler : __vwtrace; |
| 82 | + return ret; | ||
| 80 | } | 83 | } |
| 81 | 84 | ||
| 82 | /* display a (row,col) */ | 85 | /* display a (row,col) */ |
| @@ -88,10 +91,6 @@ const char * rcba(H3270 *hSession, int baddr) | @@ -88,10 +91,6 @@ const char * rcba(H3270 *hSession, int baddr) | ||
| 88 | } | 91 | } |
| 89 | 92 | ||
| 90 | /* Data Stream trace print, handles line wraps */ | 93 | /* Data Stream trace print, handles line wraps */ |
| 91 | - | ||
| 92 | -// static char *tdsbuf = CN; | ||
| 93 | -// #define TDS_LEN 75 | ||
| 94 | - | ||
| 95 | static void trace_ds_s(H3270 *hSession, char *s, Boolean can_break) | 94 | static void trace_ds_s(H3270 *hSession, char *s, Boolean can_break) |
| 96 | { | 95 | { |
| 97 | static int dscnt = 0; | 96 | static int dscnt = 0; |
src/plugins/rx3270/pluginmain.cc
| @@ -48,6 +48,7 @@ | @@ -48,6 +48,7 @@ | ||
| 48 | #include <pw3270/trace.h> | 48 | #include <pw3270/trace.h> |
| 49 | #include <lib3270/actions.h> | 49 | #include <lib3270/actions.h> |
| 50 | #include <lib3270/log.h> | 50 | #include <lib3270/log.h> |
| 51 | + #include <lib3270/trace.h> | ||
| 51 | #include <pw3270/class.h> | 52 | #include <pw3270/class.h> |
| 52 | 53 | ||
| 53 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ | 54 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
src/pw3270/main.c
| @@ -40,6 +40,8 @@ | @@ -40,6 +40,8 @@ | ||
| 40 | #include <pw3270/v3270.h> | 40 | #include <pw3270/v3270.h> |
| 41 | #include <pw3270/plugin.h> | 41 | #include <pw3270/plugin.h> |
| 42 | #include "v3270/accessible.h" | 42 | #include "v3270/accessible.h" |
| 43 | +#include <lib3270/trace.h> | ||
| 44 | +#include <pw3270/trace.h> | ||
| 43 | #include <stdlib.h> | 45 | #include <stdlib.h> |
| 44 | 46 | ||
| 45 | #if defined( HAVE_SYSLOG ) | 47 | #if defined( HAVE_SYSLOG ) |
| @@ -51,11 +53,13 @@ | @@ -51,11 +53,13 @@ | ||
| 51 | /*--[ Statics ]--------------------------------------------------------------------------------------*/ | 53 | /*--[ Statics ]--------------------------------------------------------------------------------------*/ |
| 52 | 54 | ||
| 53 | static GtkWidget * toplevel = NULL; | 55 | static GtkWidget * toplevel = NULL; |
| 56 | + static GtkWidget * trace_window = NULL; | ||
| 54 | static unsigned int syscolors = 16; | 57 | static unsigned int syscolors = 16; |
| 55 | static const gchar * systype = NULL; | 58 | static const gchar * systype = NULL; |
| 56 | static const gchar * toggleset = NULL; | 59 | static const gchar * toggleset = NULL; |
| 57 | static const gchar * togglereset = NULL; | 60 | static const gchar * togglereset = NULL; |
| 58 | static const gchar * logfile = NULL; | 61 | static const gchar * logfile = NULL; |
| 62 | + static const gchar * tracefile = NULL; | ||
| 59 | 63 | ||
| 60 | #ifdef HAVE_GTKMAC | 64 | #ifdef HAVE_GTKMAC |
| 61 | GtkOSXApplication * osxapp = NULL; | 65 | GtkOSXApplication * osxapp = NULL; |
| @@ -255,6 +259,72 @@ static void g_logfile(const gchar *log_domain,GLogLevelFlags log_level,const gch | @@ -255,6 +259,72 @@ static void g_logfile(const gchar *log_domain,GLogLevelFlags log_level,const gch | ||
| 255 | } | 259 | } |
| 256 | } | 260 | } |
| 257 | 261 | ||
| 262 | +static void trace_window_destroy(GtkWidget *widget, H3270 *hSession) | ||
| 263 | +{ | ||
| 264 | + trace("%s",__FUNCTION__); | ||
| 265 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0); | ||
| 266 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE,0); | ||
| 267 | + lib3270_set_toggle(hSession,LIB3270_TOGGLE_EVENT_TRACE,0); | ||
| 268 | + trace_window = NULL; | ||
| 269 | +} | ||
| 270 | + | ||
| 271 | +static void g_trace(H3270 *hSession, const char *fmt, va_list args) | ||
| 272 | +{ | ||
| 273 | + gchar *ptr = g_strdup_vprintf(fmt,args); | ||
| 274 | + | ||
| 275 | + if(tracefile) | ||
| 276 | + { | ||
| 277 | + // Has trace file, use it | ||
| 278 | + int err; | ||
| 279 | + | ||
| 280 | + FILE *out = fopen(tracefile,"a"); | ||
| 281 | + err = errno; | ||
| 282 | + | ||
| 283 | + if(!out) | ||
| 284 | + { | ||
| 285 | + // Error opening trace file, notify user and disable it | ||
| 286 | + GtkWidget *popup = gtk_message_dialog_new_with_markup( | ||
| 287 | + GTK_WINDOW(pw3270_get_toplevel()), | ||
| 288 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | ||
| 289 | + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | ||
| 290 | + _( "Can't save trace data to file %s" ),tracefile); | ||
| 291 | + | ||
| 292 | + gtk_window_set_title(GTK_WINDOW(popup),_("Can't open file")); | ||
| 293 | + | ||
| 294 | + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",strerror(err)); | ||
| 295 | + | ||
| 296 | + gtk_dialog_run(GTK_DIALOG(popup)); | ||
| 297 | + gtk_widget_destroy(popup); | ||
| 298 | + | ||
| 299 | + tracefile = NULL; | ||
| 300 | + } | ||
| 301 | + else | ||
| 302 | + { | ||
| 303 | + fprintf(out,"%s",ptr); | ||
| 304 | + fclose(out); | ||
| 305 | + } | ||
| 306 | + } | ||
| 307 | + else | ||
| 308 | + { | ||
| 309 | + // No trace file, open standard window | ||
| 310 | + gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_charset(hSession),"?",NULL,NULL,NULL); | ||
| 311 | + | ||
| 312 | + if(!trace_window) | ||
| 313 | + { | ||
| 314 | + trace_window = pw3270_trace_new(); | ||
| 315 | + pw3270_trace_set_destroy_on_close(trace_window,TRUE); | ||
| 316 | + g_signal_connect(trace_window, "destroy", G_CALLBACK(trace_window_destroy), hSession); | ||
| 317 | + gtk_window_set_default_size(GTK_WINDOW(trace_window),590,430); | ||
| 318 | + gtk_window_set_attached_to(GTK_WINDOW(trace_window),toplevel); | ||
| 319 | + gtk_widget_show(trace_window); | ||
| 320 | + } | ||
| 321 | + pw3270_trace_printf(trace_window,"%s",utftext); | ||
| 322 | + g_free(utftext); | ||
| 323 | + } | ||
| 324 | + | ||
| 325 | + g_free(ptr); | ||
| 326 | +} | ||
| 327 | + | ||
| 258 | int main(int argc, char *argv[]) | 328 | int main(int argc, char *argv[]) |
| 259 | { | 329 | { |
| 260 | static const gchar * session_name = PACKAGE_NAME; | 330 | static const gchar * session_name = PACKAGE_NAME; |
| @@ -333,7 +403,8 @@ int main(int argc, char *argv[]) | @@ -333,7 +403,8 @@ int main(int argc, char *argv[]) | ||
| 333 | #if defined( HAVE_SYSLOG ) | 403 | #if defined( HAVE_SYSLOG ) |
| 334 | { "syslog", 'l', 0, G_OPTION_ARG_NONE, &log_to_syslog, N_( "Send messages to syslog" ), NULL }, | 404 | { "syslog", 'l', 0, G_OPTION_ARG_NONE, &log_to_syslog, N_( "Send messages to syslog" ), NULL }, |
| 335 | #endif | 405 | #endif |
| 336 | - { "log", 'L', 0, G_OPTION_ARG_STRING, &logfile, N_( "Log to file" ), NULL }, | 406 | + { "tracefile", 'T', 0, G_OPTION_ARG_FILENAME, &tracefile, N_( "Set trace filename" ), NULL }, |
| 407 | + { "log", 'L', 0, G_OPTION_ARG_FILENAME, &logfile, N_( "Log to file" ), NULL }, | ||
| 337 | 408 | ||
| 338 | { NULL } | 409 | { NULL } |
| 339 | }; | 410 | }; |
| @@ -388,6 +459,8 @@ int main(int argc, char *argv[]) | @@ -388,6 +459,8 @@ int main(int argc, char *argv[]) | ||
| 388 | g_log_set_default_handler(g_logfile,NULL); | 459 | g_log_set_default_handler(g_logfile,NULL); |
| 389 | } | 460 | } |
| 390 | 461 | ||
| 462 | + lib3270_set_trace_handler(g_trace); | ||
| 463 | + | ||
| 391 | } | 464 | } |
| 392 | 465 | ||
| 393 | { | 466 | { |
| @@ -482,6 +555,9 @@ int main(int argc, char *argv[]) | @@ -482,6 +555,9 @@ int main(int argc, char *argv[]) | ||
| 482 | 555 | ||
| 483 | gtk_main(); | 556 | gtk_main(); |
| 484 | 557 | ||
| 558 | + if(trace_window) | ||
| 559 | + gtk_widget_destroy(trace_window); | ||
| 560 | + | ||
| 485 | pw3270_stop_plugins(toplevel); | 561 | pw3270_stop_plugins(toplevel); |
| 486 | pw3270_deinit_plugins(); | 562 | pw3270_deinit_plugins(); |
| 487 | 563 |
src/pw3270/trace.c
| @@ -36,7 +36,7 @@ | @@ -36,7 +36,7 @@ | ||
| 36 | #include <glib/gi18n.h> | 36 | #include <glib/gi18n.h> |
| 37 | 37 | ||
| 38 | #include <pw3270/trace.h> | 38 | #include <pw3270/trace.h> |
| 39 | - #include <lib3270/log.h> | 39 | + #include "common/common.h" |
| 40 | 40 | ||
| 41 | #if defined( HAVE_SYSLOG ) | 41 | #if defined( HAVE_SYSLOG ) |
| 42 | #include <syslog.h> | 42 | #include <syslog.h> |
| @@ -119,12 +119,6 @@ static void destroy(GtkObject *widget) | @@ -119,12 +119,6 @@ static void destroy(GtkObject *widget) | ||
| 119 | if(hwnd->enabled) | 119 | if(hwnd->enabled) |
| 120 | *hwnd->enabled = FALSE; | 120 | *hwnd->enabled = FALSE; |
| 121 | 121 | ||
| 122 | -#if GTK_CHECK_VERSION(3,0,0) | ||
| 123 | - GTK_WIDGET_CLASS(pw3270_trace_parent_class)->destroy(widget); | ||
| 124 | -#else | ||
| 125 | - GTK_OBJECT_CLASS(pw3270_trace_parent_class)->destroy(widget); | ||
| 126 | -#endif // GTK3 | ||
| 127 | - | ||
| 128 | } | 122 | } |
| 129 | 123 | ||
| 130 | static gboolean delete_event(GtkWidget *widget, GdkEventAny *event) | 124 | static gboolean delete_event(GtkWidget *widget, GdkEventAny *event) |
| @@ -327,9 +321,13 @@ static void destroy(GtkObject *widget) | @@ -327,9 +321,13 @@ static void destroy(GtkObject *widget) | ||
| 327 | 321 | ||
| 328 | static void pw3270_trace_init(pw3270_trace *window) | 322 | static void pw3270_trace_init(pw3270_trace *window) |
| 329 | { | 323 | { |
| 330 | - GtkWidget *widget; | ||
| 331 | - GtkWidget *view; | ||
| 332 | - GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | 324 | + GtkWidget * widget; |
| 325 | + GtkWidget * view; | ||
| 326 | + GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | ||
| 327 | + gchar * fontname = get_string_from_config("trace", "fontname", "Monospace 8"); | ||
| 328 | + PangoFontDescription * fontdesc = pango_font_description_from_string("Monospace 8"); | ||
| 329 | + | ||
| 330 | + g_free(fontname); | ||
| 333 | 331 | ||
| 334 | // Top menu | 332 | // Top menu |
| 335 | { | 333 | { |
| @@ -353,8 +351,16 @@ static void destroy(GtkObject *widget) | @@ -353,8 +351,16 @@ static void destroy(GtkObject *widget) | ||
| 353 | window->scroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); | 351 | window->scroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); |
| 354 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); | 352 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); |
| 355 | view = gtk_text_view_new(); | 353 | view = gtk_text_view_new(); |
| 356 | - window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); | 354 | + |
| 355 | +#if GTK_CHECK_VERSION(3,0,0) | ||
| 356 | + gtk_widget_override_font(GTK_WIDGET(view), fontdesc); | ||
| 357 | +#else | ||
| 358 | + gtk_widget_modify_font(GTK_WIDGET(view), fontdesc); | ||
| 359 | +#endif // GTK_CHECK_VERSION | ||
| 360 | + | ||
| 361 | + window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); | ||
| 357 | gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE); | 362 | gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE); |
| 363 | + | ||
| 358 | #if GTK_CHECK_VERSION(3,8,0) | 364 | #if GTK_CHECK_VERSION(3,8,0) |
| 359 | gtk_container_add(GTK_CONTAINER(widget),view); | 365 | gtk_container_add(GTK_CONTAINER(widget),view); |
| 360 | #else | 366 | #else |
| @@ -383,6 +389,8 @@ static void destroy(GtkObject *widget) | @@ -383,6 +389,8 @@ static void destroy(GtkObject *widget) | ||
| 383 | 389 | ||
| 384 | gtk_container_add(GTK_CONTAINER(window),vbox); | 390 | gtk_container_add(GTK_CONTAINER(window),vbox); |
| 385 | 391 | ||
| 392 | + pango_font_description_free(fontdesc); | ||
| 393 | + | ||
| 386 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); | 394 | window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); |
| 387 | trace("Log handler set to %d",window->log_handler); | 395 | trace("Log handler set to %d",window->log_handler); |
| 388 | 396 |
src/pw3270/v3270/mouse.c
| @@ -35,6 +35,8 @@ | @@ -35,6 +35,8 @@ | ||
| 35 | #include <lib3270/selection.h> | 35 | #include <lib3270/selection.h> |
| 36 | #include <lib3270/actions.h> | 36 | #include <lib3270/actions.h> |
| 37 | #include <lib3270/log.h> | 37 | #include <lib3270/log.h> |
| 38 | + #include <lib3270/trace.h> | ||
| 39 | + | ||
| 38 | 40 | ||
| 39 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ | 41 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
| 40 | 42 |