From f0d7d344c9fe63639c629318d5535506e0f10dc2 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Mon, 22 Jul 2013 14:27:37 +0000 Subject: [PATCH] Implementando janela de trace --- Makefile.in | 1 + src/include/lib3270.h | 4 ---- src/include/lib3270/trace.h | 9 +++++++-- src/lib3270/ft.c | 1 + src/lib3270/kybd.c | 1 + src/lib3270/trace_ds.c | 9 ++++----- src/plugins/rx3270/pluginmain.cc | 1 + src/pw3270/main.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/pw3270/trace.c | 30 +++++++++++++++++++----------- src/pw3270/v3270/mouse.c | 2 ++ 10 files changed, 113 insertions(+), 23 deletions(-) diff --git a/Makefile.in b/Makefile.in index 40668f0..cffddcd 100644 --- a/Makefile.in +++ b/Makefile.in @@ -308,6 +308,7 @@ install-sdk: @$(INSTALL_DATA) src/include/lib3270/popup.h $(DESTDIR)/$(includedir)/lib3270 @$(INSTALL_DATA) src/include/lib3270/actions.h $(DESTDIR)/$(includedir)/lib3270 @$(INSTALL_DATA) src/include/lib3270/action_table.h $(DESTDIR)/$(includedir)/lib3270 + @$(INSTALL_DATA) src/include/lib3270/trace.h $(DESTDIR)/$(includedir)/lib3270 @$(MKDIR) $(DESTDIR)$(includedir)/pw3270 @$(INSTALL_DATA) src/include/pw3270/v3270.h $(DESTDIR)/$(includedir)/pw3270 diff --git a/src/include/lib3270.h b/src/include/lib3270.h index 560ef05..35658c7 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -1007,10 +1007,6 @@ LIB3270_EXPORT int lib3270_clear_operator_error(H3270 *hSession); - LIB3270_EXPORT void lib3270_trace_event(H3270 *session, const char *fmt, ...) LIB3270_GNUC_FORMAT(2,3); - LIB3270_EXPORT void lib3270_set_trace_handler( void (*handler)(H3270 *session, const char *fmt, va_list args) ); - LIB3270_EXPORT void lib3270_write_dstrace(H3270 *session, const char *fmt, ...) LIB3270_GNUC_FORMAT(2,3); - LIB3270_EXPORT LIB3270_OPTION lib3270_get_options(H3270 *hSession); LIB3270_EXPORT void lib3270_set_options(H3270 *hSession, LIB3270_OPTION opt); LIB3270_EXPORT int lib3270_set_color_type(H3270 *hSession, unsigned short colortype); diff --git a/src/include/lib3270/trace.h b/src/include/lib3270/trace.h index 543b262..e412f73 100644 --- a/src/include/lib3270/trace.h +++ b/src/include/lib3270/trace.h @@ -33,13 +33,18 @@ #define LIB3270_TRACE_H_INCLUDED 1 + typedef void (*LIB3270_TRACE_HANDLER)(H3270 *, const char *, va_list); + + /** * Set trace handle callback. * - * @param handle Callback to write in trace file or show trace window (NULL send all trace to stdout). + * @param handle Callback to write in trace file or show trace window (NULL send all trace to stdout/syslog). + * @param data User data to pass to the trace handler. * + * @return Current trace handler */ - LIB3270_EXPORT void lib3270_set_trace_handler( void (*handler)(H3270 *session, const char *fmt, va_list args) ); + LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler( LIB3270_TRACE_HANDLER handler); /** * Write on trace file. diff --git a/src/lib3270/ft.c b/src/lib3270/ft.c index e53e0d7..8b2270c 100644 --- a/src/lib3270/ft.c +++ b/src/lib3270/ft.c @@ -33,6 +33,7 @@ #include #include #include "globals.h" +#include #include diff --git a/src/lib3270/kybd.c b/src/lib3270/kybd.c index 9552549..ac00510 100644 --- a/src/lib3270/kybd.c +++ b/src/lib3270/kybd.c @@ -39,6 +39,7 @@ struct ta; #define LIB3270_TA struct ta #include "globals.h" +#include #ifndef ANDROID #include diff --git a/src/lib3270/trace_ds.c b/src/lib3270/trace_ds.c index 86a2dc9..271294c 100644 --- a/src/lib3270/trace_ds.c +++ b/src/lib3270/trace_ds.c @@ -38,6 +38,7 @@ */ #include "globals.h" +#include #if defined(X3270_TRACE) /*[*/ @@ -74,9 +75,11 @@ static void wtrace(H3270 *session, const char *fmt, ...); static void (*vwtrace)(H3270 *session, const char *fmt, va_list args) = __vwtrace; -LIB3270_EXPORT void lib3270_set_trace_handler( void (*handler)(H3270 *session, const char *fmt, va_list args) ) +LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler( LIB3270_TRACE_HANDLER handler ) { + void (*ret)(H3270 *session, const char *fmt, va_list args) = vwtrace; vwtrace = handler ? handler : __vwtrace; + return ret; } /* display a (row,col) */ @@ -88,10 +91,6 @@ const char * rcba(H3270 *hSession, int baddr) } /* Data Stream trace print, handles line wraps */ - -// static char *tdsbuf = CN; -// #define TDS_LEN 75 - static void trace_ds_s(H3270 *hSession, char *s, Boolean can_break) { static int dscnt = 0; diff --git a/src/plugins/rx3270/pluginmain.cc b/src/plugins/rx3270/pluginmain.cc index 4b76cd6..f3f737d 100644 --- a/src/plugins/rx3270/pluginmain.cc +++ b/src/plugins/rx3270/pluginmain.cc @@ -48,6 +48,7 @@ #include #include #include + #include #include /*--[ Globals ]--------------------------------------------------------------------------------------*/ diff --git a/src/pw3270/main.c b/src/pw3270/main.c index 38b897f..d6372cd 100644 --- a/src/pw3270/main.c +++ b/src/pw3270/main.c @@ -40,6 +40,8 @@ #include #include #include "v3270/accessible.h" +#include +#include #include #if defined( HAVE_SYSLOG ) @@ -51,11 +53,13 @@ /*--[ Statics ]--------------------------------------------------------------------------------------*/ static GtkWidget * toplevel = NULL; + static GtkWidget * trace_window = NULL; static unsigned int syscolors = 16; static const gchar * systype = NULL; static const gchar * toggleset = NULL; static const gchar * togglereset = NULL; static const gchar * logfile = NULL; + static const gchar * tracefile = NULL; #ifdef HAVE_GTKMAC GtkOSXApplication * osxapp = NULL; @@ -255,6 +259,72 @@ static void g_logfile(const gchar *log_domain,GLogLevelFlags log_level,const gch } } +static void trace_window_destroy(GtkWidget *widget, H3270 *hSession) +{ + trace("%s",__FUNCTION__); + lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0); + lib3270_set_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE,0); + lib3270_set_toggle(hSession,LIB3270_TOGGLE_EVENT_TRACE,0); + trace_window = NULL; +} + +static void g_trace(H3270 *hSession, const char *fmt, va_list args) +{ + gchar *ptr = g_strdup_vprintf(fmt,args); + + if(tracefile) + { + // Has trace file, use it + int err; + + FILE *out = fopen(tracefile,"a"); + err = errno; + + if(!out) + { + // Error opening trace file, notify user and disable it + GtkWidget *popup = gtk_message_dialog_new_with_markup( + GTK_WINDOW(pw3270_get_toplevel()), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, + _( "Can't save trace data to file %s" ),tracefile); + + gtk_window_set_title(GTK_WINDOW(popup),_("Can't open file")); + + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",strerror(err)); + + gtk_dialog_run(GTK_DIALOG(popup)); + gtk_widget_destroy(popup); + + tracefile = NULL; + } + else + { + fprintf(out,"%s",ptr); + fclose(out); + } + } + else + { + // No trace file, open standard window + gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_charset(hSession),"?",NULL,NULL,NULL); + + if(!trace_window) + { + trace_window = pw3270_trace_new(); + pw3270_trace_set_destroy_on_close(trace_window,TRUE); + g_signal_connect(trace_window, "destroy", G_CALLBACK(trace_window_destroy), hSession); + gtk_window_set_default_size(GTK_WINDOW(trace_window),590,430); + gtk_window_set_attached_to(GTK_WINDOW(trace_window),toplevel); + gtk_widget_show(trace_window); + } + pw3270_trace_printf(trace_window,"%s",utftext); + g_free(utftext); + } + + g_free(ptr); +} + int main(int argc, char *argv[]) { static const gchar * session_name = PACKAGE_NAME; @@ -333,7 +403,8 @@ int main(int argc, char *argv[]) #if defined( HAVE_SYSLOG ) { "syslog", 'l', 0, G_OPTION_ARG_NONE, &log_to_syslog, N_( "Send messages to syslog" ), NULL }, #endif - { "log", 'L', 0, G_OPTION_ARG_STRING, &logfile, N_( "Log to file" ), NULL }, + { "tracefile", 'T', 0, G_OPTION_ARG_FILENAME, &tracefile, N_( "Set trace filename" ), NULL }, + { "log", 'L', 0, G_OPTION_ARG_FILENAME, &logfile, N_( "Log to file" ), NULL }, { NULL } }; @@ -388,6 +459,8 @@ int main(int argc, char *argv[]) g_log_set_default_handler(g_logfile,NULL); } + lib3270_set_trace_handler(g_trace); + } { @@ -482,6 +555,9 @@ int main(int argc, char *argv[]) gtk_main(); + if(trace_window) + gtk_widget_destroy(trace_window); + pw3270_stop_plugins(toplevel); pw3270_deinit_plugins(); diff --git a/src/pw3270/trace.c b/src/pw3270/trace.c index 5c916e2..b69f6ac 100644 --- a/src/pw3270/trace.c +++ b/src/pw3270/trace.c @@ -36,7 +36,7 @@ #include #include - #include + #include "common/common.h" #if defined( HAVE_SYSLOG ) #include @@ -119,12 +119,6 @@ static void destroy(GtkObject *widget) if(hwnd->enabled) *hwnd->enabled = FALSE; -#if GTK_CHECK_VERSION(3,0,0) - GTK_WIDGET_CLASS(pw3270_trace_parent_class)->destroy(widget); -#else - GTK_OBJECT_CLASS(pw3270_trace_parent_class)->destroy(widget); -#endif // GTK3 - } static gboolean delete_event(GtkWidget *widget, GdkEventAny *event) @@ -327,9 +321,13 @@ static void destroy(GtkObject *widget) static void pw3270_trace_init(pw3270_trace *window) { - GtkWidget *widget; - GtkWidget *view; - GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + GtkWidget * widget; + GtkWidget * view; + GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + gchar * fontname = get_string_from_config("trace", "fontname", "Monospace 8"); + PangoFontDescription * fontdesc = pango_font_description_from_string("Monospace 8"); + + g_free(fontname); // Top menu { @@ -353,8 +351,16 @@ static void destroy(GtkObject *widget) window->scroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); view = gtk_text_view_new(); - window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); + +#if GTK_CHECK_VERSION(3,0,0) + gtk_widget_override_font(GTK_WIDGET(view), fontdesc); +#else + gtk_widget_modify_font(GTK_WIDGET(view), fontdesc); +#endif // GTK_CHECK_VERSION + + window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE); + #if GTK_CHECK_VERSION(3,8,0) gtk_container_add(GTK_CONTAINER(widget),view); #else @@ -383,6 +389,8 @@ static void destroy(GtkObject *widget) gtk_container_add(GTK_CONTAINER(window),vbox); + pango_font_description_free(fontdesc); + window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); trace("Log handler set to %d",window->log_handler); diff --git a/src/pw3270/v3270/mouse.c b/src/pw3270/v3270/mouse.c index 8f81bc9..8c89395 100644 --- a/src/pw3270/v3270/mouse.c +++ b/src/pw3270/v3270/mouse.c @@ -35,6 +35,8 @@ #include #include #include + #include + /*--[ Globals ]--------------------------------------------------------------------------------------*/ -- libgit2 0.21.2