Commit 90abdceb03f97156456b481068dc89f0202fc7b1

Authored by perry.werneck@gmail.com
1 parent 925acbf8

Corrigindo problemas no plugin rexx, iniciando implementação de script para "paste" justificado

@@ -290,6 +290,7 @@ @@ -290,6 +290,7 @@
290 <Unit filename="src/plugins/rx3270/rx3270.cls" /> 290 <Unit filename="src/plugins/rx3270/rx3270.cls" />
291 <Unit filename="src/plugins/rx3270/rx3270.h" /> 291 <Unit filename="src/plugins/rx3270/rx3270.h" />
292 <Unit filename="src/plugins/rx3270/rxapimain.cc" /> 292 <Unit filename="src/plugins/rx3270/rxapimain.cc" />
  293 + <Unit filename="src/plugins/rx3270/sample/clipboard.rex" />
293 <Unit filename="src/plugins/rx3270/sample/object.rex" /> 294 <Unit filename="src/plugins/rx3270/sample/object.rex" />
294 <Unit filename="src/plugins/rx3270/sample/remote.rex" /> 295 <Unit filename="src/plugins/rx3270/sample/remote.rex" />
295 <Unit filename="src/plugins/rx3270/text.cc" /> 296 <Unit filename="src/plugins/rx3270/text.cc" />
src/plugins/dbus3270/gobject.c
@@ -326,7 +326,7 @@ void pw3270_dbus_pa_key(PW3270Dbus *object, int key, DBusGMethodInvocation *cont @@ -326,7 +326,7 @@ void pw3270_dbus_pa_key(PW3270Dbus *object, int key, DBusGMethodInvocation *cont
326 dbus_g_method_return(context,lib3270_get_field_start(pw3270_dbus_get_session_handle(object),baddr)); 326 dbus_g_method_return(context,lib3270_get_field_start(pw3270_dbus_get_session_handle(object),baddr));
327 } 327 }
328 328
329 -void pw3270_dbus_get_field_len(PW3270Dbus *object, int baddr, DBusGMethodInvocation *context) 329 +void pw3270_dbus_get_field_length(PW3270Dbus *object, int baddr, DBusGMethodInvocation *context)
330 { 330 {
331 trace("%s object=%p context=%p",__FUNCTION__,object,context); 331 trace("%s object=%p context=%p",__FUNCTION__,object,context);
332 dbus_g_method_return(context,lib3270_get_field_len(pw3270_dbus_get_session_handle(object),baddr)); 332 dbus_g_method_return(context,lib3270_get_field_len(pw3270_dbus_get_session_handle(object),baddr));
src/plugins/rx3270/local.cc
@@ -123,6 +123,7 @@ @@ -123,6 +123,7 @@
123 123
124 rx3270 * rx3270::create_local(void) 124 rx3270 * rx3270::create_local(void)
125 { 125 {
  126 + trace("%s",__FUNCTION__);
126 return new dynamic(); 127 return new dynamic();
127 } 128 }
128 129
@@ -362,6 +363,8 @@ dynamic::~dynamic() @@ -362,6 +363,8 @@ dynamic::~dynamic()
362 { 363 {
363 static void (*session_free)(void *h); 364 static void (*session_free)(void *h);
364 365
  366 + trace("%s",__FUNCTION__);
  367 +
365 if(!hModule) 368 if(!hModule)
366 return; 369 return;
367 370
src/plugins/rx3270/pluginmain.cc
@@ -64,6 +64,9 @@ @@ -64,6 +64,9 @@
64 { 64 {
65 public: 65 public:
66 plugin(H3270 *hSession); 66 plugin(H3270 *hSession);
  67 + virtual ~plugin();
  68 +
  69 + void free(char *ptr);
67 70
68 char * get_version(void); 71 char * get_version(void);
69 LIB3270_CSTATE get_cstate(void); 72 LIB3270_CSTATE get_cstate(void);
@@ -97,37 +100,41 @@ @@ -97,37 +100,41 @@
97 int set_copy(const char *text); 100 int set_copy(const char *text);
98 char * get_copy(void); 101 char * get_copy(void);
99 102
  103 + char * get_clipboard(void);
  104 +
  105 + protected:
  106 +
100 private: 107 private:
101 - H3270 *hSession; 108 + H3270 * hSession;
102 109
103 }; 110 };
104 111
105 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 112 /*--[ Globals ]--------------------------------------------------------------------------------------*/
106 113
107 - static plugin * session = NULL; #if GTK_CHECK_VERSION(2,32,0) 114 +#if GTK_CHECK_VERSION(2,32,0)
108 static GMutex mutex; #else static GStaticMutex mutex = G_STATIC_MUTEX_INIT; #endif // GTK_CHECK_VERSION 115 static GMutex mutex; #else static GStaticMutex mutex = G_STATIC_MUTEX_INIT; #endif // GTK_CHECK_VERSION
109 116
110 /*--[ Implement ]------------------------------------------------------------------------------------*/ 117 /*--[ Implement ]------------------------------------------------------------------------------------*/
111 118
112 - LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) 119 + static rx3270 * factory(const char *name)
113 { 120 {
  121 + return new plugin(lib3270_get_default_session_handle());
  122 + }
  123 +
  124 + LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window)
  125 + {
  126 + trace("%s",__FUNCTION__);
114 #if GTK_CHECK_VERSION(2,32,0) 127 #if GTK_CHECK_VERSION(2,32,0)
115 g_mutex_init(&mutex); #endif // GTK_CHECK_VERSION 128 g_mutex_init(&mutex); #endif // GTK_CHECK_VERSION
116 - session = new plugin(lib3270_get_default_session_handle());  
117 - session->set_plugin();  
118 - trace("%s: Rexx object is %p",__FUNCTION__,session); 129 + rx3270::set_plugin(factory);
119 return 0; 130 return 0;
120 } 131 }
121 132
122 - LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) 133 + LIB3270_EXPORT int pw3270_plugin_stop(GtkWidget *window)
123 { 134 {
124 - if(session)  
125 - {  
126 - delete session;  
127 - session = NULL;  
128 - }  
129 #if GTK_CHECK_VERSION(2,32,0) 135 #if GTK_CHECK_VERSION(2,32,0)
130 g_mutex_clear(&mutex); #endif // GTK_CHECK_VERSION 136 g_mutex_clear(&mutex); #endif // GTK_CHECK_VERSION
  137 + trace("%s",__FUNCTION__);
131 return 0; 138 return 0;
132 } 139 }
133 140
@@ -136,6 +143,12 @@ @@ -136,6 +143,12 @@
136 this->hSession = hSession; 143 this->hSession = hSession;
137 } 144 }
138 145
  146 + plugin::~plugin()
  147 + {
  148 + trace("%s",__FUNCTION__);
  149 + }
  150 +
  151 +
139 char * plugin::get_version(void) 152 char * plugin::get_version(void)
140 { 153 {
141 return strdup(lib3270_get_version()); 154 return strdup(lib3270_get_version());
@@ -258,6 +271,17 @@ @@ -258,6 +271,17 @@
258 return v3270_get_copy(GTK_WIDGET(lib3270_get_widget(hSession))); 271 return v3270_get_copy(GTK_WIDGET(lib3270_get_widget(hSession)));
259 } 272 }
260 273
  274 + char * plugin::get_clipboard(void)
  275 + {
  276 + trace("%s toplevel=%p",__FUNCTION__,pw3270_get_toplevel());
  277 + return gtk_clipboard_wait_for_text(gtk_widget_get_clipboard(pw3270_get_toplevel(),GDK_SELECTION_CLIPBOARD));
  278 + }
  279 +
  280 + void plugin::free(char *ptr)
  281 + {
  282 + g_free(ptr);
  283 + }
  284 +
261 static int REXXENTRY Rexx_IO_exit(RexxExitContext *context, int exitnumber, int subfunction, PEXIT parmBlock) 285 static int REXXENTRY Rexx_IO_exit(RexxExitContext *context, int exitnumber, int subfunction, PEXIT parmBlock)
262 { 286 {
263 trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction); 287 trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction);
@@ -324,6 +348,8 @@ @@ -324,6 +348,8 @@
324 { 348 {
325 RexxArrayObject rxArgs; 349 RexxArrayObject rxArgs;
326 350
  351 + trace("%s start",__FUNCTION__);
  352 +
327 if(args) 353 if(args)
328 { 354 {
329 gchar **arg = g_strsplit(args,",",-1); 355 gchar **arg = g_strsplit(args,",",-1);
@@ -381,6 +407,8 @@ @@ -381,6 +407,8 @@
381 } 407 }
382 408
383 instance->Terminate(); 409 instance->Terminate();
  410 +
  411 + trace("%s ends",__FUNCTION__);
384 } 412 }
385 413
386 } 414 }
src/plugins/rx3270/rexx_methods.cc
@@ -49,8 +49,13 @@ RexxMethod1(int, rx3270_method_init, CSTRING, type) @@ -49,8 +49,13 @@ RexxMethod1(int, rx3270_method_init, CSTRING, type)
49 RexxMethod1(int, rx3270_method_uninit, CSELF, sessionPtr) 49 RexxMethod1(int, rx3270_method_uninit, CSELF, sessionPtr)
50 { 50 {
51 rx3270 *hSession = (rx3270 *) sessionPtr; 51 rx3270 *hSession = (rx3270 *) sessionPtr;
  52 +
  53 + trace("rx3270_method_uninit hSession=%p",hSession);
  54 +
52 if(hSession) 55 if(hSession)
53 delete hSession; 56 delete hSession;
  57 +
  58 + trace("%s","rx3270_method_uninit");
54 return 0; 59 return 0;
55 } 60 }
56 61
@@ -373,3 +378,61 @@ RexxMethod2(int, rx3270_method_get_field_start, CSELF, sessionPtr, OPTIONAL_int, @@ -373,3 +378,61 @@ RexxMethod2(int, rx3270_method_get_field_start, CSELF, sessionPtr, OPTIONAL_int,
373 return -1; 378 return -1;
374 return hSession->get_field_start(baddr); 379 return hSession->get_field_start(baddr);
375 } 380 }
  381 +
  382 +RexxMethod1(RexxStringObject, rx3270_method_get_selection, CSELF, sessionPtr)
  383 +{
  384 + rx3270 * hSession = (rx3270 *) sessionPtr;
  385 +
  386 + if(hSession)
  387 + {
  388 + char *str = hSession->get_copy();
  389 + if(str)
  390 + {
  391 + char * text = hSession->get_local_string(str);
  392 + RexxStringObject ret = context->String((CSTRING) text);
  393 + free(str);
  394 + free(text);
  395 + return ret;
  396 + }
  397 + }
  398 +
  399 + return context->String("");
  400 +}
  401 +
  402 +RexxMethod2(int, rx3270_method_set_selection, CSELF, sessionPtr, CSTRING, text)
  403 +{
  404 + rx3270 * session = (rx3270 *) sessionPtr;
  405 +
  406 + if(session)
  407 + {
  408 + char * str = session->get_3270_string(text);
  409 + int rc;
  410 + rc = session->set_copy(str);
  411 + free(str);
  412 + return rc;
  413 + }
  414 + return -1;
  415 +}
  416 +
  417 +RexxMethod1(RexxStringObject, rx3270_method_get_clipboard, CSELF, sessionPtr)
  418 +{
  419 + rx3270 * hSession = (rx3270 *) sessionPtr;
  420 +
  421 + if(hSession)
  422 + {
  423 + char *str = hSession->get_clipboard();
  424 +
  425 + trace("str=%p (%s)",str,str);
  426 +
  427 + if(str)
  428 + {
  429 + RexxStringObject ret = context->String((CSTRING) str);
  430 + hSession->free(str);
  431 + return ret;
  432 + }
  433 + }
  434 +
  435 + trace("%s","rx3270_method_get_clipboard: Clipboard is empty");
  436 + return context->String("");
  437 +}
  438 +
src/plugins/rx3270/rx3270.cc
@@ -45,10 +45,13 @@ @@ -45,10 +45,13 @@
45 45
46 #include <string.h> 46 #include <string.h>
47 47
  48 +
  49 + static rx3270 * factory_default(const char *type);
  50 +
48 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 51 /*--[ Globals ]--------------------------------------------------------------------------------------*/
49 52
50 - static bool plugin = false;  
51 - static rx3270 * defSession = NULL; 53 + static rx3270 * defSession = NULL;
  54 + static rx3270 * (*factory)(const char *type) = factory_default;
52 55
53 /*--[ Implement ]------------------------------------------------------------------------------------*/ 56 /*--[ Implement ]------------------------------------------------------------------------------------*/
54 57
@@ -86,13 +89,21 @@ rx3270::~rx3270() @@ -86,13 +89,21 @@ rx3270::~rx3270()
86 89
87 if(defSession == this) 90 if(defSession == this)
88 defSession = NULL; 91 defSession = NULL;
  92 +
  93 + trace("%s",__FUNCTION__);
89 } 94 }
90 95
91 -rx3270 * rx3270::create(const char *name) 96 +static rx3270 * factory_default(const char *type)
92 { 97 {
93 - if(name && *name)  
94 - return create_remote(name);  
95 - return create_local(); 98 + trace("%s",__FUNCTION__);
  99 + if(type && *type)
  100 + return rx3270::create_remote(type);
  101 + return rx3270::create_local();
  102 +}
  103 +
  104 +rx3270 * rx3270::create(const char *type)
  105 +{
  106 + return factory(type);
96 } 107 }
97 108
98 char * rx3270::get_version(void) 109 char * rx3270::get_version(void)
@@ -149,9 +160,15 @@ int rx3270::wait_for_text_at(int row, int col, const char *key, int timeout) @@ -149,9 +160,15 @@ int rx3270::wait_for_text_at(int row, int col, const char *key, int timeout)
149 return ETIMEDOUT; 160 return ETIMEDOUT;
150 } 161 }
151 162
152 -void rx3270::set_plugin(void) 163 +void rx3270::set_plugin(rx3270 * (*ptr)(const char *name))
153 { 164 {
154 - plugin = true; 165 + trace("%s factory=%p",__FUNCTION__,ptr);
  166 +
  167 + if(ptr)
  168 + factory = ptr;
  169 + else
  170 + factory = factory_default;
  171 +
155 } 172 }
156 173
157 int rx3270::set_copy(const char *text) 174 int rx3270::set_copy(const char *text)
@@ -165,6 +182,15 @@ char * rx3270::get_copy(void) @@ -165,6 +182,15 @@ char * rx3270::get_copy(void)
165 return NULL; 182 return NULL;
166 } 183 }
167 184
  185 +char * rx3270::get_clipboard(void)
  186 +{
  187 + errno = EINVAL;
  188 + return NULL;
  189 +}
168 190
  191 +void rx3270::free(char *ptr)
  192 +{
  193 + free(ptr);
  194 +}
169 195
170 196
src/plugins/rx3270/rx3270.cls
@@ -33,7 +33,6 @@ @@ -33,7 +33,6 @@
33 33
34 ::class rx3270 public subclass object 34 ::class rx3270 public subclass object
35 35
36 -  
37 ::METHOD INIT EXTERNAL "LIBRARY rx3270 rx3270_method_init" 36 ::METHOD INIT EXTERNAL "LIBRARY rx3270 rx3270_method_init"
38 ::METHOD UNINIT EXTERNAL "LIBRARY rx3270 rx3270_method_uninit" 37 ::METHOD UNINIT EXTERNAL "LIBRARY rx3270 rx3270_method_uninit"
39 38
@@ -71,15 +70,10 @@ @@ -71,15 +70,10 @@
71 ::METHOD GETFIELDSTART EXTERNAL "LIBRARY rx3270 rx3270_method_get_field_start" 70 ::METHOD GETFIELDSTART EXTERNAL "LIBRARY rx3270 rx3270_method_get_field_start"
72 ::METHOD GETFIELDLEN EXTERNAL "LIBRARY rx3270 rx3270_method_get_field_len" 71 ::METHOD GETFIELDLEN EXTERNAL "LIBRARY rx3270 rx3270_method_get_field_len"
73 72
74 -/*  
75 -getConnectionState  
76 -waitForEvents  
77 -RunMode  
78 -  
79 -::method isConnected  
80 -return self~getConnectionState() = "CONNECTED_TN3270E" 73 +::METHOD GETSELECTION EXTERNAL "LIBRARY rx3270 rx3270_method_get_selection"
  74 +::METHOD SETSELECTION EXTERNAL "LIBRARY rx3270 rx3270_method_set_selection"
81 75
82 -*/ 76 +::METHOD GETCLIPBOARD EXTERNAL "LIBRARY rx3270 rx3270_method_get_clipboard"
83 77
84 ::method waitForStringAt 78 ::method waitForStringAt
85 use arg row, col, key, timeout 79 use arg row, col, key, timeout
src/plugins/rx3270/rx3270.h
@@ -105,6 +105,12 @@ @@ -105,6 +105,12 @@
105 REXX_METHOD_PROTOTYPE(rx3270_method_set_option); 105 REXX_METHOD_PROTOTYPE(rx3270_method_set_option);
106 REXX_METHOD_PROTOTYPE(rx3270_method_test); 106 REXX_METHOD_PROTOTYPE(rx3270_method_test);
107 REXX_METHOD_PROTOTYPE(rx3270_method_wait_for_text_at); 107 REXX_METHOD_PROTOTYPE(rx3270_method_wait_for_text_at);
  108 + REXX_METHOD_PROTOTYPE(rx3270_method_get_field_len);
  109 + REXX_METHOD_PROTOTYPE(rx3270_method_get_field_start);
  110 + REXX_METHOD_PROTOTYPE(rx3270_method_get_selection);
  111 + REXX_METHOD_PROTOTYPE(rx3270_method_set_selection);
  112 + REXX_METHOD_PROTOTYPE(rx3270_method_get_clipboard);
  113 +
108 114
109 /*---[ Globals ]---------------------------------------------------------------------------------------------*/ 115 /*---[ Globals ]---------------------------------------------------------------------------------------------*/
110 116
@@ -131,12 +137,15 @@ @@ -131,12 +137,15 @@
131 137
132 virtual ~rx3270(); 138 virtual ~rx3270();
133 139
  140 + virtual void free(char *ptr);
  141 +
  142 +
134 static rx3270 * create(const char *name = NULL); 143 static rx3270 * create(const char *name = NULL);
135 static rx3270 * create_remote(const char *name); 144 static rx3270 * create_remote(const char *name);
136 static rx3270 * create_local(void); 145 static rx3270 * create_local(void);
137 static rx3270 * get_default(void); 146 static rx3270 * get_default(void);
138 147
139 - static void set_plugin(void); 148 + static void set_plugin(rx3270 * (*factory)(const char *name));
140 149
141 char * get_3270_string(const char *str); 150 char * get_3270_string(const char *str);
142 char * get_local_string(const char *str); 151 char * get_local_string(const char *str);
@@ -174,6 +183,8 @@ @@ -174,6 +183,8 @@
174 virtual int set_copy(const char *text); 183 virtual int set_copy(const char *text);
175 virtual char * get_copy(void); 184 virtual char * get_copy(void);
176 185
  186 + virtual char * get_clipboard(void);
  187 +
177 }; 188 };
178 189
179 rx3270 * create_lib3270_instance(void); 190 rx3270 * create_lib3270_instance(void);
src/plugins/rx3270/rxapimain.cc
@@ -143,6 +143,12 @@ RexxMethodEntry rx3270_methods[] = @@ -143,6 +143,12 @@ RexxMethodEntry rx3270_methods[] =
143 REXX_METHOD(rx3270_method_test, rx3270_method_test ), 143 REXX_METHOD(rx3270_method_test, rx3270_method_test ),
144 REXX_METHOD(rx3270_method_wait_for_text_at, rx3270_method_wait_for_text_at ), 144 REXX_METHOD(rx3270_method_wait_for_text_at, rx3270_method_wait_for_text_at ),
145 145
  146 + REXX_METHOD(rx3270_method_get_field_len, rx3270_method_get_field_len ),
  147 + REXX_METHOD(rx3270_method_get_field_start, rx3270_method_get_field_start ),
  148 + REXX_METHOD(rx3270_method_get_selection, rx3270_method_get_selection ),
  149 + REXX_METHOD(rx3270_method_set_selection, rx3270_method_set_selection ),
  150 + REXX_METHOD(rx3270_method_get_clipboard, rx3270_method_get_clipboard ),
  151 +
146 REXX_LAST_METHOD() 152 REXX_LAST_METHOD()
147 }; 153 };
148 154
src/plugins/rx3270/sample/clipboard.rex 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +/*
  2 + * Sample rexx code to justified paste the clipboard contents.
  3 + *
  4 + * Autor: Perry Werneck <perry.werneck@gmail.com>
  5 + *
  6 + */
  7 +
  8 + host = .rx3270~new("")
  9 +
  10 + text = host~GetClipboard()
  11 + if text = "" then
  12 + do
  13 + say "Clipboard is empty"
  14 + return 0
  15 + end
  16 +
  17 + say "["||text||"]"
  18 +
  19 +
  20 +return 0
  21 +
  22 +::requires "rx3270.cls"
  23 +
  24 +
  25 +
src/pw3270/v3270/selection.c
@@ -236,7 +236,10 @@ gchar * v3270_get_copy(GtkWidget *widget) @@ -236,7 +236,10 @@ gchar * v3270_get_copy(GtkWidget *widget)
236 const char *text; 236 const char *text;
237 g_return_val_if_fail(GTK_IS_V3270(widget),NULL); 237 g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
238 238
239 - text = update_selected_text(widget,FALSE); 239 + text = GTK_V3270(widget)->selection.text;
  240 +
  241 + if(!text)
  242 + text = update_selected_text(widget,FALSE);
240 243
241 if(text) 244 if(text)
242 return g_convert(text, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); 245 return g_convert(text, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);