diff --git a/Makefile.in b/Makefile.in index 12cd29b..40668f0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -311,6 +311,7 @@ install-sdk: @$(MKDIR) $(DESTDIR)$(includedir)/pw3270 @$(INSTALL_DATA) src/include/pw3270/v3270.h $(DESTDIR)/$(includedir)/pw3270 + @$(INSTALL_DATA) src/include/pw3270/trace.h $(DESTDIR)/$(includedir)/pw3270 @$(INSTALL_DATA) src/include/pw3270.h $(DESTDIR)/$(includedir) @$(MKDIR) $(DESTDIR)/$(libdir)/pkgconfig diff --git a/src/include/pw3270/trace.h b/src/include/pw3270/trace.h index 9f1d836..accdb24 100644 --- a/src/include/pw3270/trace.h +++ b/src/include/pw3270/trace.h @@ -53,6 +53,7 @@ LIB3270_EXPORT void pw3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); LIB3270_EXPORT void pw3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); LIB3270_EXPORT gchar * pw3270_trace_get_command(GtkWidget *widget); + LIB3270_EXPORT void pw3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on); G_END_DECLS diff --git a/src/plugins/rx3270/pluginmain.cc b/src/plugins/rx3270/pluginmain.cc index ef4bfbd..4b76cd6 100644 --- a/src/plugins/rx3270/pluginmain.cc +++ b/src/plugins/rx3270/pluginmain.cc @@ -45,6 +45,7 @@ #include #include #include + #include #include #include #include @@ -65,6 +66,7 @@ { GtkAction * action; GtkWidget * widget; + GtkWidget * trace; const gchar * filename; }; @@ -135,42 +137,134 @@ /*--[ Running rexx scripts ]---------------------------------------------------------------------------------*/ + static void trace_cleanup(GtkWidget *widget, gpointer dunno) + { + rexx_application_data *data = (rexx_application_data *) g_object_get_data(G_OBJECT(widget),"rexx_app_data"); + + trace("%s: data=%p",__FUNCTION__,data); + + if(data) + data->trace = NULL; + + } + + static GtkWidget * get_trace_window(rexx_application_data *data) + { + if(data->trace) + return data->trace; + + data->trace = pw3270_trace_new(); + g_signal_connect(G_OBJECT(data->trace), "destroy",G_CALLBACK(trace_cleanup), NULL); + + pw3270_trace_set_destroy_on_close(data->trace,TRUE); + + g_object_set_data(G_OBJECT(data->trace),"rexx_app_data",data); + + gtk_window_set_title(GTK_WINDOW(data->trace),_("Rexx trace")); + + gtk_window_set_transient_for(GTK_WINDOW(data->trace),GTK_WINDOW(gtk_widget_get_toplevel(data->widget))); + gtk_window_set_destroy_with_parent(GTK_WINDOW(data->trace),TRUE); + + + gtk_window_set_default_size(GTK_WINDOW(data->trace),590,430); + gtk_widget_show_all(data->trace); + return data->trace; + } + + static void read_line(struct rexx_application_data *data, PRXSTRING Retstr) + { + gchar *value = pw3270_trace_get_command(get_trace_window(data)); + + if(value) + { + if(strlen(value) > (RXAUTOBUFLEN-1)) + { + Retstr->strptr = (char *) RexxAllocateMemory(strlen(value)+1); + strcpy(Retstr->strptr,value); + } + else + { + g_snprintf(Retstr->strptr,RXAUTOBUFLEN-1,"%s",value); + } + g_free(value); + } + else + { + *Retstr->strptr = 0; + } + + Retstr->strlength = strlen(Retstr->strptr); + + } + static int REXXENTRY Rexx_IO_exit(RexxExitContext *context, int exitnumber, int subfunction, PEXIT parmBlock) { - trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction); +// trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction); - if(subfunction == RXSIOSAY) + switch(subfunction) { - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(((struct rexx_application_data * )context->GetApplicationData())->widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_OK_CANCEL, - "%s", (((RXSIOSAY_PARM *) parmBlock)->rxsio_string).strptr ); + case RXSIOSAY: // SAY a line to STDOUT + { + struct rexx_application_data *data = (struct rexx_application_data *) context->GetApplicationData(); - gtk_window_set_title(GTK_WINDOW(dialog), _( "Script message" ) ); + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(data->widget)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK_CANCEL, + "%s", (((RXSIOSAY_PARM *) parmBlock)->rxsio_string).strptr ); - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) - context->RaiseException0(Rexx_Error_Program_interrupted); + gtk_window_set_title(GTK_WINDOW(dialog), _( "Script message" ) ); - gtk_widget_destroy(dialog); + if(data->trace) + pw3270_trace_printf(data->trace,"%s\n",(((RXSIOSAY_PARM *) parmBlock)->rxsio_string).strptr); + + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) + context->RaiseException0(Rexx_Error_Program_interrupted); + + gtk_widget_destroy(dialog); + } + break; + + case RXSIOTRC: // Trace output + { + struct rexx_application_data *data = (struct rexx_application_data *) context->GetApplicationData(); + lib3270_write_log(NULL, "rx3270", "%s", (((RXSIOTRC_PARM *) parmBlock)->rxsio_string).strptr); + pw3270_trace_printf(get_trace_window(data),"%s\n",(((RXSIOTRC_PARM *) parmBlock)->rxsio_string).strptr); + } + break; + + case RXSIOTRD: // Read from char stream + read_line((struct rexx_application_data *) context->GetApplicationData(), & (((RXSIODTR_PARM *) parmBlock)->rxsiodtr_retc) ); + break; + + case RXSIODTR: // DEBUG read from char stream + read_line((struct rexx_application_data *) context->GetApplicationData(), & (((RXSIODTR_PARM *) parmBlock)->rxsiodtr_retc) ); + break; + + default: + return RXEXIT_NOT_HANDLED; - return RXEXIT_HANDLED; } - return RXEXIT_NOT_HANDLED; + return RXEXIT_HANDLED; } static void call_rexx_script(GtkAction *action, GtkWidget *widget, const gchar *filename) { const gchar * args = (const gchar *) g_object_get_data(G_OBJECT(action),"args"); - struct rexx_application_data appdata = { action, widget, filename }; + struct rexx_application_data appdata; RexxInstance * instance; RexxThreadContext * threadContext; RexxOption options[25]; RexxContextExit exits[2]; + memset(&appdata,0,sizeof(appdata)); + appdata.action = action; + appdata.widget = widget; + appdata.filename = filename; + memset(options,0,sizeof(options)); memset(exits,0,sizeof(exits)); @@ -185,9 +279,6 @@ options[1].optionName = APPLICATION_DATA; options[1].option = (void *) &appdata; -// options[0].optionName = LOAD_REQUIRED_LIBRARY; -// options[0].option = "rx3270"; - rx3270_set_package_option(&options[2]); options[3].optionName = EXTERNAL_CALL_PATH; @@ -277,6 +368,12 @@ instance->Terminate(); + if(appdata.trace) + { + pw3270_trace_printf(appdata.trace,"%s","** Rexx script ends\n"); + g_object_set_data(G_OBJECT(appdata.trace),"rexx_app_data",NULL); + } + trace("%s ends",__FUNCTION__); } diff --git a/src/plugins/rx3270/rxapimain.cc b/src/plugins/rx3270/rxapimain.cc index 2c9c27a..173c3dc 100644 --- a/src/plugins/rx3270/rxapimain.cc +++ b/src/plugins/rx3270/rxapimain.cc @@ -190,9 +190,6 @@ LIB3270_EXPORT void rx3270_set_package_option(RexxOption *option) { static const RexxLibraryPackage package = { "rx3270", &rx3270_package_entry }; -// package.registeredName = "rx3270"; -// package.table = ; - option->optionName = REGISTER_LIBRARY; option->option = (void *) &package; diff --git a/src/plugins/rx3270/sample/clipboard.rex b/src/plugins/rx3270/sample/clipboard.rex index e4a4e3c..1a8fdf6 100644 --- a/src/plugins/rx3270/sample/clipboard.rex +++ b/src/plugins/rx3270/sample/clipboard.rex @@ -5,6 +5,8 @@ * */ +trace "?R" + host = .rx3270~new("pw3270:a") if host~connected() = 0 then diff --git a/src/pw3270/trace.c b/src/pw3270/trace.c index 4ff2b9f..44c9951 100644 --- a/src/pw3270/trace.c +++ b/src/pw3270/trace.c @@ -55,7 +55,8 @@ GtkWidget * entry; GtkWidget * button; gchar **line; - gboolean * enabled; + gboolean * enabled; + gboolean destroy_on_close; }; const GtkWindowClass * pw3270_trace_get_parent_class(void); @@ -77,16 +78,20 @@ pw3270_trace * hwnd = PW3270_TRACE(window); trace("%s",__FUNCTION__); + + if(hwnd->enabled) + { + if(*hwnd->line) + g_free(*hwnd->line); - if(*hwnd->line) - g_free(*hwnd->line); + *hwnd->line = g_strdup(gtk_entry_get_text(GTK_ENTRY(hwnd->entry))); - *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); - gtk_widget_set_sensitive(hwnd->entry,FALSE); - gtk_widget_set_sensitive(hwnd->button,FALSE); + *hwnd->enabled = FALSE; + } - *hwnd->enabled = FALSE; } #if GTK_CHECK_VERSION(3,0,0) @@ -96,9 +101,12 @@ static void destroy(GtkObject *widget) #endif { pw3270_trace * hwnd = PW3270_TRACE(widget); - - hwnd->line = NULL; - *hwnd->enabled = FALSE; + + if(hwnd->line) + *hwnd->line = NULL; + + if(hwnd->enabled) + *hwnd->enabled = FALSE; #if GTK_CHECK_VERSION(3,0,0) GTK_WIDGET_CLASS(pw3270_trace_parent_class)->destroy(widget); @@ -110,10 +118,19 @@ static void destroy(GtkObject *widget) static gboolean delete_event(GtkWidget *widget, GdkEventAny *event) { - pw3270_trace * hwnd = PW3270_TRACE(widget); - trace("%s",__FUNCTION__); - hwnd->line = NULL; - *hwnd->enabled = FALSE; + pw3270_trace * hwnd = PW3270_TRACE(widget); + + trace("%s destroy=%s",__FUNCTION__,hwnd->destroy_on_close ? "Yes" : "No"); + + 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; } @@ -242,6 +259,14 @@ static void destroy(GtkObject *widget) { gtk_main_iteration(); } + + hwnd->line = NULL; + hwnd->enabled = NULL; return line; } + + LIB3270_EXPORT void pw3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on) + { + PW3270_TRACE(widget)->destroy_on_close = on; + } -- libgit2 0.21.2