From 2d3ee143241e94cad65afb91a3c84897ecb39f3a Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 14 Nov 2019 13:35:30 -0300 Subject: [PATCH] Adjustments on trace widget. --- src/dialogs/togglebutton.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++--------- src/include/internals.h | 3 ++- src/include/terminal.h | 17 +++++------------ src/include/v3270/trace.h | 3 +++ src/trace/exec.c | 38 +++++++++++++++++++------------------- src/trace/private.h | 37 ++++++------------------------------- src/trace/text.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/trace/trace.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------- v3270.cbp | 3 +++ 9 files changed, 299 insertions(+), 173 deletions(-) create mode 100644 src/trace/text.c diff --git a/src/dialogs/togglebutton.c b/src/dialogs/togglebutton.c index b567876..287ce50 100644 --- a/src/dialogs/togglebutton.c +++ b/src/dialogs/togglebutton.c @@ -65,6 +65,8 @@ widget->hListener = NULL; } + widget->hSession = NULL; + G_OBJECT_CLASS(V3270ToggleButton_parent_class)->dispose(object); } @@ -104,22 +106,57 @@ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),(state == 0 ? FALSE : TRUE)); } - GtkWidget * v3270_toggle_button_new(GtkWidget *terminal, LIB3270_TOGGLE_ID toggle) + GtkWidget * v3270_toggle_button_new(LIB3270_TOGGLE_ID id) { - g_return_val_if_fail(GTK_IS_V3270(terminal),NULL); + const LIB3270_TOGGLE * toggle = lib3270_toggle_get_from_id(id); + + if(!toggle) + return NULL; V3270ToggleButton * widget = GTK_V3270_TOGGLE_BUTTON(g_object_new(GTK_TYPE_V3270_TOGGLE_BUTTON, NULL)); - widget->hSession = v3270_get_session(terminal); - widget->id = toggle; + widget->id = id; - widget->hListener = lib3270_register_toggle_listener(widget->hSession, widget->id,toggle_listener,widget); + gtk_widget_set_name(GTK_WIDGET(widget),toggle->name); + gtk_button_set_label(GTK_BUTTON(widget),gettext(toggle->label)); - gtk_widget_set_name(GTK_WIDGET(widget),lib3270_get_toggle_name(toggle)); - gtk_button_set_label(GTK_BUTTON(widget),gettext(lib3270_get_toggle_label(toggle))); - gtk_widget_set_tooltip_text(GTK_WIDGET(widget),gettext(lib3270_get_toggle_description(toggle))); + if(toggle->description) + gtk_widget_set_tooltip_text(GTK_WIDGET(widget),gettext(toggle->description)); + else if(toggle->summary) + gtk_widget_set_tooltip_text(GTK_WIDGET(widget),gettext(toggle->summary)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),lib3270_get_toggle(widget->hSession, widget->id)); + gtk_widget_set_sensitive(GTK_WIDGET(widget),FALSE); return GTK_WIDGET(widget); } + + G_GNUC_INTERNAL void v3270_toggle_button_set_session(GtkWidget *button, H3270 *hSession) + { + V3270ToggleButton * toggle = GTK_V3270_TOGGLE_BUTTON(button); + + if(toggle->hSession == hSession) + return; + + // Disconnect from current session + if(toggle->hListener) + { + lib3270_unregister_toggle_listener(toggle->hSession,toggle->id,toggle->hListener); + toggle->hListener = NULL; + } + + // Replace session. + toggle->hSession = hSession; + + // Connect to new session. + if(toggle->hSession) + { + toggle->hListener = lib3270_register_toggle_listener(toggle->hSession, toggle->id,toggle_listener,toggle); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),lib3270_get_toggle(toggle->hSession, toggle->id)); + gtk_widget_set_sensitive(GTK_WIDGET(toggle),TRUE); + } + else + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(toggle),FALSE); + } + } diff --git a/src/include/internals.h b/src/include/internals.h index 5765a77..429995c 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -160,7 +160,8 @@ typedef struct _V3270ToggleButton V3270ToggleButton; typedef struct _V3270ToggleButtonClass V3270ToggleButtonClass; - G_GNUC_INTERNAL GtkWidget * v3270_toggle_button_new(GtkWidget *widget, LIB3270_TOGGLE_ID toggle); + G_GNUC_INTERNAL GtkWidget * v3270_toggle_button_new(LIB3270_TOGGLE_ID toggle); + G_GNUC_INTERNAL void v3270_toggle_button_set_session(GtkWidget *button, H3270 *hSession); // Activity list widget. #define GTK_TYPE_V3270_FT_ACTIVITY_LIST (V3270FTActivityList_get_type ()) diff --git a/src/include/terminal.h b/src/include/terminal.h index b9021bd..2aa6b04 100644 --- a/src/include/terminal.h +++ b/src/include/terminal.h @@ -114,15 +114,6 @@ G_BEGIN_DECLS int scaled_fonts : 1; /**< Use scaled fonts */ int drawing : 1; /**< Draw widget? */ - /* -#if GTK_CHECK_VERSION(3,0,0) - -#else - gint width; - gint height; -#endif // GTK_CHECK_VERSION(3,0,0) - */ - GSource * timer; GtkIMContext * input_method; unsigned short keyflags; @@ -186,15 +177,17 @@ G_BEGIN_DECLS GSource * timer; /**< Auto disconnect timer */ } activity; - char script; /**< @brief Script ID */ + char script; ///< @brief Script ID. // Blink struct { - int show : 1; /**< @brief Show element? */ - GSource * timer; /**< @brief Timer source. */ + int show : 1; ///< @brief Show element? + GSource * timer; ///< @brief Timer source. } blink; + GtkWidget * trace; ///< @brief Trace window handle. + }; G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget); diff --git a/src/include/v3270/trace.h b/src/include/v3270/trace.h index b85d3dc..815eeda 100644 --- a/src/include/v3270/trace.h +++ b/src/include/v3270/trace.h @@ -49,6 +49,9 @@ LIB3270_EXPORT GType V3270Trace_get_type(void); + LIB3270_EXPORT gboolean v3270_get_trace(GtkWidget *terminal); + LIB3270_EXPORT void v3270_set_trace(GtkWidget *terminal, gboolean trace); + LIB3270_EXPORT GtkWidget * v3270_trace_new(GtkWidget *terminal); LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text); LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); diff --git a/src/trace/exec.c b/src/trace/exec.c index 144fe09..9330bdc 100644 --- a/src/trace/exec.c +++ b/src/trace/exec.c @@ -149,8 +149,8 @@ g_return_val_if_fail(GTK_IS_V3270_TRACE(t),EINVAL); - V3270Trace * trace = GTK_V3270_TRACE(t); - H3270 * hSession = v3270_get_session(trace->terminal); + GtkWidget * terminal = v3270_trace_get_terminal(t); + H3270 * hSession = v3270_trace_get_session(t); g_autofree gchar * cmdline = g_strdup(text); g_strstrip(cmdline); @@ -159,13 +159,13 @@ if(g_str_has_prefix(cmdline,"reload")) { - v3270_reload(trace->terminal); + v3270_reload(terminal); return 0; } if(g_str_has_prefix(cmdline,"reconfigure")) { - v3270_reconfigure(GTK_V3270(trace->terminal)); + v3270_reconfigure(GTK_V3270(terminal)); return 0; } @@ -184,15 +184,15 @@ if(!(*arg && g_ascii_strcasecmp(arg,"text"))) { // No argument or "text" copy text. - v3270_clipboard_set(trace->terminal, V3270_COPY_TEXT, FALSE); + v3270_clipboard_set(terminal, V3270_COPY_TEXT, FALSE); } else if(!g_ascii_strcasecmp(arg,"table")) { - v3270_clipboard_set(trace->terminal, V3270_COPY_TABLE, FALSE); + v3270_clipboard_set(terminal, V3270_COPY_TABLE, FALSE); } else if(!g_ascii_strcasecmp(arg,"append")) { - v3270_clipboard_set(trace->terminal, V3270_COPY_APPEND, FALSE); + v3270_clipboard_set(terminal, V3270_COPY_APPEND, FALSE); } else { @@ -212,15 +212,15 @@ if(!(*arg && g_ascii_strcasecmp(arg,"all"))) { // No argument or "text" copy text. - v3270_print_all(trace->terminal,NULL); + v3270_print_all(terminal,NULL); } else if(!g_ascii_strcasecmp(arg,"selected")) { - v3270_print_selected(trace->terminal,NULL); + v3270_print_selected(terminal,NULL); } else if(!g_ascii_strcasecmp(arg,"copy")) { - v3270_print_copy(trace->terminal,NULL); + v3270_print_copy(terminal,NULL); } else { @@ -237,7 +237,7 @@ gchar * arg = cmdline+5; g_strstrip(arg); - v3270_clipboard_get_from_url(trace->terminal,arg); + v3270_clipboard_get_from_url(terminal,arg); return 0; } @@ -247,7 +247,7 @@ gchar * str = strchr(cmdline,'?'); *str = 0; g_strstrip(cmdline); - return get_property(trace->terminal,cmdline); + return get_property(terminal,cmdline); } if(strchr(cmdline,'=')) @@ -256,14 +256,14 @@ *(value++) = 0; g_strstrip(cmdline); g_strstrip(value); - return set_property(trace->terminal,cmdline,value); + return set_property(terminal,cmdline,value); } if(g_str_has_prefix(cmdline,"remap")) { gchar *txtptr = cmdline+5; g_strstrip(txtptr); - v3270_set_remap_filename(trace->terminal,txtptr); + v3270_set_remap_filename(terminal,txtptr); return 0; } @@ -272,7 +272,7 @@ gchar *txtptr = cmdline+3; const gchar * name = get_word(&txtptr); g_strstrip(txtptr); - return set_property(trace->terminal,name,(*txtptr ? txtptr : "1")); + return set_property(terminal,name,(*txtptr ? txtptr : "1")); } if(g_str_has_prefix(cmdline,"get")) @@ -280,7 +280,7 @@ gchar *txtptr = cmdline+3; const gchar * name = get_word(&txtptr); g_strstrip(txtptr); - return get_property(trace->terminal,name); + return get_property(terminal,name); } if(g_str_has_prefix(cmdline,"reset")) @@ -288,14 +288,14 @@ gchar *txtptr = cmdline+3; const gchar * name = get_word(&txtptr); g_strstrip(txtptr); - return set_property(trace->terminal,name,(*txtptr ? txtptr : "0")); + return set_property(terminal,name,(*txtptr ? txtptr : "0")); } gchar * sep = strchr(cmdline,'='); if(sep) { *(sep++) = 0; - return set_property(trace->terminal,g_strstrip(cmdline),g_strstrip(sep)); + return set_property(terminal,g_strstrip(cmdline),g_strstrip(sep)); } else { @@ -316,7 +316,7 @@ if(*args) *(args++) = 0; - g_signal_emit(GTK_WIDGET(trace), v3270_trace_signal[V3270_TRACE_SIGNAL_COMMAND], 0, cmdline, args, &handled); + g_signal_emit(GTK_WIDGET(t), v3270_trace_signal[V3270_TRACE_SIGNAL_COMMAND], 0, cmdline, args, &handled); if(handled) return 0; diff --git a/src/trace/private.h b/src/trace/private.h index 6fab6c3..ee97b99 100644 --- a/src/trace/private.h +++ b/src/trace/private.h @@ -56,40 +56,15 @@ G_GNUC_INTERNAL guint v3270_trace_signal[V3270_TRACE_SIGNAL_LAST]; - G_BEGIN_DECLS - - struct _V3270TraceClass - { - GtkBoxClass parent_class; - - }; - - struct _V3270Trace - { + G_GNUC_INTERNAL H3270 * v3270_trace_get_session(GtkWidget *widget); + G_GNUC_INTERNAL GtkWidget * v3270_trace_get_terminal(GtkWidget *widget); + G_GNUC_INTERNAL GtkTextBuffer * v3270_trace_get_text_buffer(GtkWidget *widget); + G_GNUC_INTERNAL GtkScrolledWindow * v3270_trace_get_scrolled_window(GtkWidget *widget); - GtkBox parent; - H3270 * hSession; ///< @brief TN3270 Session. - GtkWidget * terminal; ///< @brief V3270 Widget. - GtkScrolledWindow * scroll; - - GtkTextView * view; ///< @brief Text view; - GtkTextBuffer * text; ///< @brief Trace window contents. - GtkEntry * entry; ///< @brief Command line entry. - GtkWidget * buttons; ///< @brief Button bar. - - gchar * filename; ///< @brief Selected file name. - - guint log_handler; ///< @brief GTK Log Handler. - - /// @brief lib3270's saved trace handler. - struct { - void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); - void *userdata; - } trace; + G_BEGIN_DECLS - }; - G_END_DECLS + G_END_DECLS diff --git a/src/trace/text.c b/src/trace/text.c new file mode 100644 index 0000000..9d376b4 --- /dev/null +++ b/src/trace/text.c @@ -0,0 +1,94 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "private.h" + + #include + #include + #include + #include + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + struct _append_text + { + GtkWidget * widget; + gchar text[1]; + }; + + static gboolean bg_append_text(struct _append_text *cfg) + { + GtkTextBuffer * buffer = v3270_trace_get_text_buffer(cfg->widget); + + GtkTextIter itr; + gtk_text_buffer_get_end_iter(buffer,&itr); + + if(g_utf8_validate(cfg->text,strlen(cfg->text),NULL)) + gtk_text_buffer_insert(buffer,&itr,cfg->text,strlen(cfg->text)); + else + gtk_text_buffer_insert(buffer,&itr,"** Invalid UTF8 String **",-1); + + // Move window + GtkScrolledWindow * scrolled = v3270_trace_get_scrolled_window(cfg->widget); + GtkAdjustment * vadj = gtk_scrolled_window_get_vadjustment(scrolled); + + gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj)); + gtk_scrolled_window_set_vadjustment(scrolled, vadj); + + return FALSE; + + } + + LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text) + { + g_return_if_fail(GTK_IS_V3270_TRACE(widget)); + + // Enqueue update. + struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1); + cfg->widget = GTK_V3270_TRACE(widget); + strcpy(cfg->text,text); + + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_append_text, cfg, g_free); + + } + + LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) + { + g_autofree gchar * text = g_strdup_vprintf(fmt,args); + v3270_trace_append_text(widget,text); + } + + LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ) + { + va_list arg_ptr; + va_start(arg_ptr, fmt); + v3270_trace_vprintf(widget,fmt,arg_ptr); + va_end(arg_ptr); + } + diff --git a/src/trace/trace.c b/src/trace/trace.c index 2789f80..62941c8 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -38,13 +38,58 @@ #include "private.h" + #include #include #include #include #include #include "marshal.h" -/*--[ Widget definition ]----------------------------------------------------------------------------*/ +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + static const LIB3270_TOGGLE_ID toggles[] = { + LIB3270_TOGGLE_DS_TRACE, + LIB3270_TOGGLE_NETWORK_TRACE, + LIB3270_TOGGLE_EVENT_TRACE, + LIB3270_TOGGLE_SSL_TRACE, + LIB3270_TOGGLE_SCREEN_TRACE + }; + + struct _V3270TraceClass + { + GtkBoxClass parent_class; + + }; + + struct _V3270Trace + { + + GtkBox parent; + H3270 * hSession; ///< @brief TN3270 Session. + GtkWidget * terminal; ///< @brief V3270 Widget. + GtkScrolledWindow * scroll; + + GtkTextView * view; ///< @brief Text view; + GtkTextBuffer * text; ///< @brief Trace window contents. + GtkEntry * entry; ///< @brief Command line entry. + + struct + { + GtkWidget * box; ///< @brief Button box. + GtkWidget * widgets[G_N_ELEMENTS(toggles)]; + } buttons; + + gchar * filename; ///< @brief Selected file name. + + guint log_handler; ///< @brief GTK Log Handler. + + /// @brief lib3270's saved trace handler. + struct { + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); + void *userdata; + } trace; + + }; guint v3270_trace_signal[V3270_TRACE_SIGNAL_LAST] = { 0 }; @@ -80,6 +125,11 @@ lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); } + // v3270_toggle_button_set_session + size_t ix; + for(ix = 0; ix < G_N_ELEMENTS(toggles); ix++) + v3270_toggle_button_set_session(widget->buttons.widgets[ix],hSession); + } static void finalize(GObject *object) @@ -100,7 +150,17 @@ trace->log_handler = 0; } - set_session(trace,NULL); + if(trace->terminal && GTK_V3270(trace->terminal)->trace == GTK_WIDGET(object)) + { + debug("V3270Trace::%s - Removing trace widget association",__FUNCTION__); + GTK_V3270(trace->terminal)->trace = NULL; + } + + if(trace->hSession) { + lib3270_set_trace_handler(trace->hSession,trace->trace.handler,trace->trace.userdata); + trace->hSession = NULL; + } + g_clear_object(&trace->terminal); G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object); @@ -224,17 +284,16 @@ gtk_orientable_set_orientation(GTK_ORIENTABLE(widget),GTK_ORIENTATION_VERTICAL); // Create toolbar + GtkWidget *buttons = widget->buttons.box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); { - widget->buttons = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - // https://developer.gnome.org/hig/stable/visual-layout.html.en - gtk_container_set_border_width(GTK_CONTAINER(widget->buttons), 12); - gtk_box_set_spacing(GTK_BOX(widget->buttons),12); + gtk_container_set_border_width(GTK_CONTAINER(buttons), 12); + gtk_box_set_spacing(GTK_BOX(buttons),12); - gtk_button_box_set_layout(GTK_BUTTON_BOX(widget->buttons), GTK_BUTTONBOX_START); + gtk_button_box_set_layout(GTK_BUTTON_BOX(buttons), GTK_BUTTONBOX_START); - gtk_widget_set_valign(widget->buttons,GTK_ALIGN_START); - gtk_box_pack_start(GTK_BOX(widget),widget->buttons,FALSE,FALSE,0); + gtk_widget_set_valign(buttons,GTK_ALIGN_START); + gtk_box_pack_start(GTK_BOX(widget),buttons,FALSE,FALSE,0); } @@ -282,6 +341,26 @@ } + // Create toggle buttons + { + size_t ix; + + for(ix = 0; ix < G_N_ELEMENTS(toggles); ix++) + { + GtkWidget * item = widget->buttons.widgets[ix] = v3270_toggle_button_new(toggles[ix]); + + gtk_widget_set_can_focus(item,FALSE); + gtk_widget_set_can_default(item,FALSE); + +#if GTK_CHECK_VERSION(3,20,0) + gtk_widget_set_focus_on_click(item,FALSE); +#endif // GTK 3,20,0 + + gtk_box_pack_start(GTK_BOX(buttons),item,FALSE,FALSE,0); + + } + } + // Grab GTK messages. widget->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) log_handler, widget); @@ -292,7 +371,7 @@ { g_return_val_if_fail(GTK_IS_V3270_TRACE(widget),NULL); - return GTK_V3270_TRACE(widget)->buttons; + return GTK_V3270_TRACE(widget)->buttons.box; } @@ -307,7 +386,7 @@ gtk_widget_set_focus_on_click(button,FALSE); #endif // GTK 3,20,0 - gtk_box_pack_start(GTK_BOX(GTK_V3270_TRACE(widget)->buttons),button,FALSE,FALSE,0); + gtk_box_pack_start(GTK_BOX(GTK_V3270_TRACE(widget)->buttons.box),button,FALSE,FALSE,0); } @@ -321,101 +400,12 @@ widget->terminal = terminal; g_object_ref_sink(G_OBJECT(terminal)); set_session(widget, v3270_get_session(widget->terminal)); + GTK_V3270(terminal)->trace = GTK_WIDGET(widget); } - // Create toggle buttons - { - size_t ix; - - static const LIB3270_TOGGLE_ID toggles[] = { - LIB3270_TOGGLE_DS_TRACE, - LIB3270_TOGGLE_NETWORK_TRACE, - LIB3270_TOGGLE_EVENT_TRACE, - LIB3270_TOGGLE_SSL_TRACE, - LIB3270_TOGGLE_SCREEN_TRACE - }; - - for(ix = 0; ix < G_N_ELEMENTS(toggles); ix++) - { - GtkWidget * item = v3270_toggle_button_new(widget->terminal,toggles[ix]); - - gtk_widget_set_can_focus(item,FALSE); - gtk_widget_set_can_default(item,FALSE); - -#if GTK_CHECK_VERSION(3,20,0) - gtk_widget_set_focus_on_click(item,FALSE); -#endif // GTK 3,20,0 - - gtk_box_pack_start(GTK_BOX(widget->buttons),item,FALSE,FALSE,0); - - } - } - - return GTK_WIDGET(widget); } - struct _append_text - { - V3270Trace *widget; - gchar text[1]; - }; - - static gboolean bg_append_text(struct _append_text *cfg) - { - if(!GTK_IS_TEXT_BUFFER(cfg->widget->text)) - return FALSE; - - GtkTextIter itr; - gtk_text_buffer_get_end_iter(cfg->widget->text,&itr); - - if(g_utf8_validate(cfg->text,strlen(cfg->text),NULL)) - { - gtk_text_buffer_insert(cfg->widget->text,&itr,cfg->text,strlen(cfg->text)); - } - else - { - gtk_text_buffer_insert(cfg->widget->text,&itr,"** Invalid UTF8 String **",-1); - } - - // gtk_text_buffer_get_end_iter(cfg->widget->text,&itr); - // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(cfg->widget->view), &itr, 0.0, FALSE, 0.0, 0.0); - - GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(cfg->widget->scroll); - gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj)); - gtk_scrolled_window_set_vadjustment(cfg->widget->scroll, vadj); - - return FALSE; - - } - - LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text) - { - g_return_if_fail(GTK_IS_V3270_TRACE(widget)); - - // Enqueue update. - struct _append_text * cfg = g_malloc0(sizeof(struct _append_text)+strlen(text)+1); - cfg->widget = GTK_V3270_TRACE(widget); - strcpy(cfg->text,text); - - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_append_text, cfg, g_free); - - } - - LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) - { - g_autofree gchar * text = g_strdup_vprintf(fmt,args); - v3270_trace_append_text(widget,text); - } - - LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ) - { - va_list arg_ptr; - va_start(arg_ptr, fmt); - v3270_trace_vprintf(widget,fmt,arg_ptr); - va_end(arg_ptr); - } - const gchar * v3270_trace_get_filename(GtkWidget *widget) { g_return_val_if_fail(GTK_IS_V3270_TRACE(widget),NULL); @@ -479,3 +469,33 @@ } } + + H3270 * v3270_trace_get_session(GtkWidget *widget) + { + return GTK_V3270_TRACE(widget)->hSession; + } + + GtkWidget * v3270_trace_get_terminal(GtkWidget *widget) + { + return GTK_V3270_TRACE(widget)->terminal; + } + + GtkTextBuffer * v3270_trace_get_text_buffer(GtkWidget *widget) + { + return GTK_V3270_TRACE(widget)->text; + } + + GtkScrolledWindow * v3270_trace_get_scrolled_window(GtkWidget *widget) + { + return GTK_V3270_TRACE(widget)->scroll; + } + + gboolean v3270_get_trace(GtkWidget *terminal) + { + return GTK_V3270(terminal)->trace != NULL; + } + + void v3270_set_trace(GtkWidget *terminal, gboolean trace) + { + + } diff --git a/v3270.cbp b/v3270.cbp index d8132e8..e599e2f 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -307,6 +307,9 @@