diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h index a1783cd..68d864d 100644 --- a/src/include/v3270/filetransfer.h +++ b/src/include/v3270/filetransfer.h @@ -132,11 +132,11 @@ LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message); // FT Dialog widget - #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ()) - #define GTK_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialog)) + #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ()) + #define GTK_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialog)) #define GTK_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass)) - #define GTK_IS_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_DIALOG)) - #define GTK_IS_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_DIALOG)) + #define GTK_IS_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_DIALOG)) + #define GTK_IS_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_DIALOG)) #define GTK_v3270_ft_settings_dialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass)) typedef struct _V3270FTSettingsDialog V3270FTSettingsDialog; diff --git a/src/include/v3270/trace.h b/src/include/v3270/trace.h index 952eac6..5c384b4 100644 --- a/src/include/v3270/trace.h +++ b/src/include/v3270/trace.h @@ -32,34 +32,25 @@ #ifndef PW3270_TRACE_H_INCLUDED #include - #include - #include #define PW3270_TRACE_H_INCLUDED 1 G_BEGIN_DECLS - #define V3270_TYPE_TRACE (v3270_trace_get_type ()) - #define V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), V3270_TYPE_TRACE, v3270_trace)) - #define V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), V3270_TYPE_TRACE, pw3270_traceClass)) - #define IS_V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), V3270_TYPE_TRACE)) - #define IS_V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), V3270_TYPE_TRACE)) - #define V3270_TRACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), V3270_TYPE_TRACE, v3270_traceClass)) + #define GTK_TYPE_V3270_TRACE (V3270Trace_get_type ()) + #define GTK_V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_TRACE, V3270Trace)) + #define GTK_V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_TRACE, V3270TraceClass)) + #define GTK_IS_V3270_TRACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_TRACE)) + #define GTK_IS_V3270_TRACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_TRACE)) + #define GTK_V3270_TRACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_TRACE, V3270TraceClass)) - typedef struct _v3270_trace v3270_trace; - typedef struct _v3270_traceClass v3270_traceClass; + typedef struct _V3270Trace V3270Trace; + typedef struct _V3270TraceClass V3270TraceClass; - LIB3270_EXPORT GtkWidget * v3270_trace_new(); - - LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession, const gchar *header); - - LIB3270_EXPORT void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession); - LIB3270_EXPORT GType v3270_trace_get_type(void); + 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); LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); - LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text); - LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget); - LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on); G_END_DECLS diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index 8074553..fe6bf67 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -37,6 +37,7 @@ #include #include #include + #include #include #include @@ -149,6 +150,11 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) { + GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test")); + GtkWidget * trace = v3270_trace_new(terminal); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),trace,TRUE,TRUE,2); + + /* // // Test activity // @@ -158,13 +164,11 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) v3270_ft_activity_set_remote_filename(activity,"remote_file"); v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP); - /* // // Test settings dialog // GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal); v3270_ft_settings_dialog_append_activity(dialog,activity,NULL); - */ // // Test worker widget @@ -175,6 +179,7 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) v3270_ft_worker_set_session(worker,v3270_get_session(terminal)); v3270_ft_worker_set_activity(worker,activity); v3270_ft_worker_start(worker); + */ gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); @@ -205,6 +210,7 @@ static void color_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) } + static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { GtkWidget * window = gtk_application_window_new(app); @@ -218,6 +224,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { // v3270_set_font_family(terminal,"Droid Sans Mono"); g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window); + /* GtkWidget *trace = v3270_new_trace_window(terminal,NULL); if(trace) { 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) { lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_DS_TRACE); gtk_widget_show_all(trace); } + */ /* v3270_connect(terminal); diff --git a/src/trace/exec.c b/src/trace/exec.c index 13b50c9..7e0e831 100644 --- a/src/trace/exec.c +++ b/src/trace/exec.c @@ -42,6 +42,7 @@ #include #include + /* static const gchar * get_word(gchar **ptr) { gchar *rc = g_strstrip(*ptr); @@ -58,7 +59,9 @@ return rc; } + */ + /* static int set_property(H3270 *hSession, const gchar *name, const gchar * value) { size_t ix; @@ -103,9 +106,11 @@ return errno = ENOENT; } + */ int v3270_exec_command(GtkWidget *widget, const gchar *text) { + /* H3270 *hSession = v3270_get_session(widget); g_autofree gchar * cmdline = g_strdup(text); @@ -145,6 +150,7 @@ *(sep++) = 0; set_property(hSession,g_strstrip(cmdline),g_strstrip(sep)); } + */ return errno = ENOENT; } diff --git a/src/trace/trace.c b/src/trace/trace.c deleted file mode 100644 index e7e09fe..0000000 --- a/src/trace/trace.c +++ /dev/null @@ -1,535 +0,0 @@ -/* - * "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 trace.c 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 - - #define ENABLE_NLS - #define GETTEXT_PACKAGE PACKAGE_NAME - - #include - #include - - #include - #include - #include - #include - #include - -#if defined( HAVE_SYSLOG ) - #include -#endif // HAVE_SYSLOG - -/*--[ Widget definition ]----------------------------------------------------------------------------*/ - - G_BEGIN_DECLS - - struct _v3270_traceClass - { - GtkWindowClass parent_class; - }; - - struct _v3270_trace - { - GtkWindow parent; - GtkTextBuffer * text; - GtkWidget * entry; - GtkWidget * button; - GtkWidget * scroll; - GtkWidget * view; - H3270 * hSession; - gchar **line; - guint log_handler; - gboolean * enabled; - gboolean destroy_on_close; - - /// @brief lib3270's saved trace handler. - struct { - void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); - void *userdata; - } trace; - - }; - - const GtkWindowClass * v3270_trace_get_parent_class(void); - - G_END_DECLS - - G_DEFINE_TYPE(v3270_trace, v3270_trace, GTK_TYPE_WINDOW); - - static void append_text(v3270_trace *hwnd, const gchar *text); - -/*--[ Implement ]------------------------------------------------------------------------------------*/ - - const GtkWindowClass * v3270_trace_get_parent_class(void) - { - return GTK_WINDOW_CLASS(v3270_trace_parent_class); - } - - static void activate_default(GtkWindow *window) - { - v3270_trace * hwnd = V3270_TRACE(window); - - if(hwnd->enabled) - { - if(*hwnd->line) - g_free(*hwnd->line); - - *hwnd->line = g_strdup(gtk_entry_get_text(GTK_ENTRY(hwnd->entry))); - - gtk_widget_set_sensitive(hwnd->entry,FALSE); - gtk_widget_set_sensitive(hwnd->button,FALSE); - - *hwnd->enabled = FALSE; - } - - } - -static void destroy(GtkWidget *widget) -{ - v3270_trace * hwnd = V3270_TRACE(widget); - - if(hwnd->hSession) - { - lib3270_set_trace_handler(hwnd->hSession,hwnd->trace.handler,hwnd->trace.userdata); - } - - if(hwnd->log_handler) - { - g_log_remove_handler(NULL,hwnd->log_handler); - hwnd->log_handler = 0; - } - - if(hwnd->line) - *hwnd->line = NULL; - - if(hwnd->enabled) - *hwnd->enabled = FALSE; - - } - - static gboolean delete_event(GtkWidget *widget, G_GNUC_UNUSED GdkEventAny *event) - { - v3270_trace * hwnd = V3270_TRACE(widget); - - if(hwnd->line) - *hwnd->line = NULL; - - if(hwnd->enabled) - *hwnd->enabled = FALSE; - - if(hwnd->destroy_on_close) - return FALSE; - - gtk_widget_hide(widget); - return TRUE; - } - - static void v3270_trace_class_init(v3270_traceClass *klass) - { - GtkWindowClass * window_class = GTK_WINDOW_CLASS(klass); - GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass); - - window_class->activate_default = activate_default; - widget_class->delete_event = delete_event; - - widget_class->destroy = destroy; - - } - - static void activate(G_GNUC_UNUSED GtkButton *button, v3270_trace *window) - { - GtkWidget * terminal = GTK_WIDGET(lib3270_get_user_data(window->hSession)); - - int rc = v3270_exec_command(terminal,gtk_entry_get_text(GTK_ENTRY(window->entry))); - - 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)); - gtk_entry_set_text(GTK_ENTRY(window->entry),""); - } - - static void menu_save(G_GNUC_UNUSED GtkWidget *button, v3270_trace *window) - { - GtkWindow * toplevel = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(window))); - GtkWidget * dialog; - - dialog = gtk_file_chooser_dialog_new( _( "Save trace file" ), - toplevel, - GTK_FILE_CHOOSER_ACTION_SAVE, - _( "Cancel" ), GTK_RESPONSE_CANCEL, - _( "Save" ), GTK_RESPONSE_ACCEPT, - NULL ); - - gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); - - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS)); - - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - { - gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - if(filename) - { - GError * error = NULL; - gchar * text; - GtkTextIter start; - GtkTextIter end; - - gtk_text_buffer_get_start_iter(window->text,&start); - gtk_text_buffer_get_end_iter(window->text,&end); - text = gtk_text_buffer_get_text(window->text,&start,&end,FALSE); - - g_file_set_contents(filename,text,-1,&error); - - g_free(text); - - if(error) - { - 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); - - gtk_window_set_title(GTK_WINDOW(popup),_("Can't save file")); - - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); - g_error_free(error); - - gtk_dialog_run(GTK_DIALOG(popup)); - gtk_widget_destroy(popup); - - } - - g_free(filename); - } - } - - gtk_widget_destroy(dialog); - - } - - static void menu_close(G_GNUC_UNUSED GtkWidget *button, GtkWidget *window) - { - gtk_widget_destroy(window); - } - - struct submenu - { - const gchar * label; - GCallback action; - }; - - static void build_menu(GtkWidget *menubar, v3270_trace *window, const gchar *label, const struct submenu *item, size_t sz) - { - size_t f; - GtkWidget * menu = gtk_menu_new(); - GtkWidget * topitem = gtk_menu_item_new_with_mnemonic(label); - - gtk_menu_item_set_submenu(GTK_MENU_ITEM(topitem), menu); - - for(f=0;fhSession = NULL; - - // Trace container - window->scroll = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window->scroll),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); - - window->view = gtk_text_view_new(); - gtk_text_view_set_monospace(GTK_TEXT_VIEW(window->view),TRUE); - - window->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->view)); - gtk_text_view_set_editable(GTK_TEXT_VIEW(window->view), TRUE); - - gtk_container_add(GTK_CONTAINER(window->scroll),window->view); - gtk_box_pack_start(GTK_BOX(vbox),window->scroll,TRUE,TRUE,0); - - // Edit box - widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - gtk_box_pack_start(GTK_BOX(widget),gtk_label_new( _( "Command:" )),FALSE,TRUE,4); - window->entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(widget),window->entry,TRUE,TRUE,4); - //gtk_widget_set_sensitive(window->entry,FALSE); - g_signal_connect(G_OBJECT(window->entry),"activate",G_CALLBACK(activate),window); - - window->button = gtk_button_new_from_icon_name("system-run",GTK_ICON_SIZE_BUTTON); - gtk_box_pack_end(GTK_BOX(widget),window->button,FALSE,FALSE,4); - gtk_widget_set_focus_on_click(GTK_WIDGET(window->button),FALSE); - g_signal_connect(G_OBJECT(window->button),"clicked",G_CALLBACK(activate),window); - - gtk_box_pack_start(GTK_BOX(vbox),widget,FALSE,TRUE,0); - - gtk_widget_show_all(vbox); - - gtk_container_add(GTK_CONTAINER(window),vbox); - - window->log_handler = g_log_set_handler(NULL,G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,(GLogFunc) glog,window); - } - - GtkWidget * v3270_trace_new() - { - return g_object_new(V3270_TYPE_TRACE, NULL); - } - - LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget, const gchar *header) - { - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - return v3270_trace_new_from_session(v3270_get_session(widget), header); - } - - static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args) - { - gchar *ptr = g_strdup_vprintf(fmt,args); - gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_display_charset(hSession),"?",NULL,NULL,NULL); - v3270_trace_printf(GTK_WIDGET(userdata),"%s",utftext); - g_free(utftext); - g_free(ptr); - } - - void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession) { - - v3270_trace * trace = V3270_TRACE(widget); - - if(trace->hSession) { - lib3270_set_trace_handler(trace->hSession,trace->trace.handler,trace->trace.userdata); - } - - trace->hSession = hSession; - - if(hSession) { - lib3270_get_trace_handler(hSession,&trace->trace.handler,&trace->trace.userdata); - lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); - } - - } - - LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession, const gchar *header) { - - GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); - void * terminal = lib3270_get_user_data(hSession); - - V3270_TRACE(widget)->hSession = NULL; - - gtk_window_set_default_size(GTK_WINDOW(widget),590,430); - - if(terminal && GTK_IS_V3270(terminal)) - { - gtk_window_set_attached_to(GTK_WINDOW(widget),GTK_WIDGET(terminal)); - } - - v3270_trace_set_session(widget, hSession); - - if(header) - append_text(V3270_TRACE(widget), header); - - return widget; - } - - struct bg_print_data - { - GtkWidget * widget; - gchar * msg; - }; - - static void append_text(v3270_trace *hwnd, const gchar *text) - { - GtkTextIter itr; - gtk_text_buffer_get_end_iter(hwnd->text,&itr); - - if(g_utf8_validate(text,strlen(text),NULL)) - { - gtk_text_buffer_insert(hwnd->text,&itr,text,strlen(text)); - } - else - { - gtk_text_buffer_insert(hwnd->text,&itr,"** Invalid UTF8 String **",-1); - } - - // gtk_text_buffer_get_end_iter(hwnd->text,&itr); - // gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(hwnd->view), &itr, 0.0, FALSE, 0.0, 0.0); - - //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll)); - //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj)); - //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj); - } - - static gboolean bg_trace_append_text(struct bg_print_data *data) - { - append_text(V3270_TRACE(data->widget),data->msg); - g_free(data->msg); - return FALSE; - } - - void v3270_trace_append_text(GtkWidget *widget, const gchar *text) - { - struct bg_print_data * data = g_new0(struct bg_print_data,1); - - data->widget = widget; - data->msg = g_strdup(text); - - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_append_text, data, g_free); - } - - void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) - { - struct bg_print_data * data = g_new0(struct bg_print_data,1); - - data->widget = widget; - data->msg = g_strdup_vprintf(fmt,args); - - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_append_text, data, g_free); - } - - 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); - } - - LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget) - { - v3270_trace * hwnd = V3270_TRACE(widget); - gchar * line = NULL; - gboolean enabled = TRUE; - - hwnd->line = &line; - hwnd->enabled = &enabled; - - gtk_window_present(GTK_WINDOW(widget)); - gtk_widget_set_sensitive(hwnd->entry,TRUE); - gtk_widget_set_sensitive(hwnd->button,TRUE); - gtk_widget_grab_focus(hwnd->entry); - - while(enabled) - { - gtk_main_iteration(); - } - - hwnd->line = NULL; - hwnd->enabled = NULL; - - return line; - } - - LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on) - { - V3270_TRACE(widget)->destroy_on_close = on; - } diff --git a/src/trace/widget.c b/src/trace/widget.c new file mode 100644 index 0000000..ffa9db0 --- /dev/null +++ b/src/trace/widget.c @@ -0,0 +1,227 @@ +/* + * "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 trace.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +/** + * SECTION:V3270Trace + * @Short_description: A trace monitor widget. + * @Title: V3270Trace + * + * The #V3270Trace shows a text area with the lib3270 trace output. + * + */ + + #include + + #define ENABLE_NLS + #define GETTEXT_PACKAGE PACKAGE_NAME + + #include + #include + + #include + #include + #include + #include + #include + #include + +#if defined( HAVE_SYSLOG ) + #include +#endif // HAVE_SYSLOG + +/*--[ Widget definition ]----------------------------------------------------------------------------*/ + + G_BEGIN_DECLS + + struct _V3270TraceClass + { + GtkGridClass parent_class; + + }; + + struct _V3270Trace + { + GtkGrid parent; + H3270 * hSession; /// @brief TN3270 Session. + + GtkTextBuffer * text; /// @brief Trace window contents. + GtkWidget * entry; /// @brief Command line entry. + GtkWidget * run; /// @brief "exec" button. + + /// @brief lib3270's saved trace handler. + struct { + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); + void *userdata; + } trace; + + }; + + G_END_DECLS + + G_DEFINE_TYPE(V3270Trace, V3270Trace, GTK_TYPE_GRID); + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args) + { + g_autofree gchar *ptr = g_strdup_vprintf(fmt,args); + g_autofree gchar * utftext = g_convert_with_fallback(ptr,-1,"UTF-8",lib3270_get_display_charset(hSession),"?",NULL,NULL,NULL); + + v3270_trace_append_text(GTK_WIDGET(userdata),utftext); + + } + + static void set_session(V3270Trace *widget, H3270 *hSession) + { + if(widget->hSession) { + lib3270_set_trace_handler(widget->hSession,widget->trace.handler,widget->trace.userdata); + } + + widget->hSession = hSession; + + if(hSession) { + lib3270_get_trace_handler(hSession,&widget->trace.handler,&widget->trace.userdata); + lib3270_set_trace_handler(hSession,trace_handler,(void *) widget); + } + + } + + static void finalize(GObject *object) + { + debug("V3270Trace::%s",__FUNCTION__); + + set_session(GTK_V3270_TRACE(object),NULL); + + G_OBJECT_CLASS(V3270Trace_parent_class)->finalize(object); + } + + static void V3270Trace_class_init(G_GNUC_UNUSED V3270TraceClass *klass) + { + G_OBJECT_CLASS(klass)->finalize = finalize; + } + + static void V3270Trace_init(V3270Trace *widget) + { + + // Create text view + { + GtkWidget *scrolled = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); + gtk_widget_set_vexpand(scrolled,TRUE); + gtk_widget_set_hexpand(scrolled,TRUE); + gtk_grid_attach(GTK_GRID(widget),scrolled,0,0,10,1); + + GtkWidget *view = gtk_text_view_new(); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(view),TRUE); + + widget->text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); + gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE); + + gtk_container_add(GTK_CONTAINER(scrolled),view); + + } + + // Create command line + { + widget->entry = gtk_entry_new(); + gtk_grid_attach(GTK_GRID(widget),widget->entry,0,1,8,1); + gtk_widget_set_sensitive(widget->entry,FALSE); + + widget->run = gtk_button_new_from_icon_name("system-run",GTK_ICON_SIZE_BUTTON); + gtk_grid_attach(GTK_GRID(widget),widget->run,9,1,1,1); + gtk_widget_set_sensitive(widget->run,FALSE); + + } + + + } + + LIB3270_EXPORT GtkWidget * v3270_trace_new(GtkWidget *terminal) + { + g_return_val_if_fail(GTK_IS_V3270(terminal),NULL); + + V3270Trace * widget = GTK_V3270_TRACE(g_object_new(GTK_TYPE_V3270_TRACE, NULL)); + + set_session(widget, v3270_get_session(terminal)); + + return GTK_WIDGET(widget); + } + + struct _append_text + { + V3270Trace *widget; + gchar text[1]; + }; + + static void bg_append_text(struct _append_text *cfg) + { + 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(hwnd->text,&itr); + // gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(hwnd->view), &itr, 0.0, FALSE, 0.0, 0.0); + + //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll)); + //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj)); + //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj); + } + + 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); + gdk_threads_add_idle_full(G_PRIORITY_LOW,(GSourceFunc) bg_append_text,cfg,g_free); + + } + + LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) + { + g_autofree * 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); + } + -- libgit2 0.21.2