Commit 90abdceb03f97156456b481068dc89f0202fc7b1
1 parent
925acbf8
Exists in
master
and in
5 other branches
Corrigindo problemas no plugin rexx, iniciando implementação de script para "paste" justificado
Showing
11 changed files
with
192 additions
and
32 deletions
Show diff stats
pw3270.cbp
... | ... | @@ -290,6 +290,7 @@ |
290 | 290 | <Unit filename="src/plugins/rx3270/rx3270.cls" /> |
291 | 291 | <Unit filename="src/plugins/rx3270/rx3270.h" /> |
292 | 292 | <Unit filename="src/plugins/rx3270/rxapimain.cc" /> |
293 | + <Unit filename="src/plugins/rx3270/sample/clipboard.rex" /> | |
293 | 294 | <Unit filename="src/plugins/rx3270/sample/object.rex" /> |
294 | 295 | <Unit filename="src/plugins/rx3270/sample/remote.rex" /> |
295 | 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 | 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 | 331 | trace("%s object=%p context=%p",__FUNCTION__,object,context); |
332 | 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 | 123 | |
124 | 124 | rx3270 * rx3270::create_local(void) |
125 | 125 | { |
126 | + trace("%s",__FUNCTION__); | |
126 | 127 | return new dynamic(); |
127 | 128 | } |
128 | 129 | |
... | ... | @@ -362,6 +363,8 @@ dynamic::~dynamic() |
362 | 363 | { |
363 | 364 | static void (*session_free)(void *h); |
364 | 365 | |
366 | + trace("%s",__FUNCTION__); | |
367 | + | |
365 | 368 | if(!hModule) |
366 | 369 | return; |
367 | 370 | ... | ... |
src/plugins/rx3270/pluginmain.cc
... | ... | @@ -64,6 +64,9 @@ |
64 | 64 | { |
65 | 65 | public: |
66 | 66 | plugin(H3270 *hSession); |
67 | + virtual ~plugin(); | |
68 | + | |
69 | + void free(char *ptr); | |
67 | 70 | |
68 | 71 | char * get_version(void); |
69 | 72 | LIB3270_CSTATE get_cstate(void); |
... | ... | @@ -97,37 +100,41 @@ |
97 | 100 | int set_copy(const char *text); |
98 | 101 | char * get_copy(void); |
99 | 102 | |
103 | + char * get_clipboard(void); | |
104 | + | |
105 | + protected: | |
106 | + | |
100 | 107 | private: |
101 | - H3270 *hSession; | |
108 | + H3270 * hSession; | |
102 | 109 | |
103 | 110 | }; |
104 | 111 | |
105 | 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 | 115 | static GMutex mutex; #else static GStaticMutex mutex = G_STATIC_MUTEX_INIT; #endif // GTK_CHECK_VERSION |
109 | 116 | |
110 | 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 | 127 | #if GTK_CHECK_VERSION(2,32,0) |
115 | 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 | 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 | 135 | #if GTK_CHECK_VERSION(2,32,0) |
130 | 136 | g_mutex_clear(&mutex); #endif // GTK_CHECK_VERSION |
137 | + trace("%s",__FUNCTION__); | |
131 | 138 | return 0; |
132 | 139 | } |
133 | 140 | |
... | ... | @@ -136,6 +143,12 @@ |
136 | 143 | this->hSession = hSession; |
137 | 144 | } |
138 | 145 | |
146 | + plugin::~plugin() | |
147 | + { | |
148 | + trace("%s",__FUNCTION__); | |
149 | + } | |
150 | + | |
151 | + | |
139 | 152 | char * plugin::get_version(void) |
140 | 153 | { |
141 | 154 | return strdup(lib3270_get_version()); |
... | ... | @@ -258,6 +271,17 @@ |
258 | 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 | 285 | static int REXXENTRY Rexx_IO_exit(RexxExitContext *context, int exitnumber, int subfunction, PEXIT parmBlock) |
262 | 286 | { |
263 | 287 | trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction); |
... | ... | @@ -324,6 +348,8 @@ |
324 | 348 | { |
325 | 349 | RexxArrayObject rxArgs; |
326 | 350 | |
351 | + trace("%s start",__FUNCTION__); | |
352 | + | |
327 | 353 | if(args) |
328 | 354 | { |
329 | 355 | gchar **arg = g_strsplit(args,",",-1); |
... | ... | @@ -381,6 +407,8 @@ |
381 | 407 | } |
382 | 408 | |
383 | 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 | 49 | RexxMethod1(int, rx3270_method_uninit, CSELF, sessionPtr) |
50 | 50 | { |
51 | 51 | rx3270 *hSession = (rx3270 *) sessionPtr; |
52 | + | |
53 | + trace("rx3270_method_uninit hSession=%p",hSession); | |
54 | + | |
52 | 55 | if(hSession) |
53 | 56 | delete hSession; |
57 | + | |
58 | + trace("%s","rx3270_method_uninit"); | |
54 | 59 | return 0; |
55 | 60 | } |
56 | 61 | |
... | ... | @@ -373,3 +378,61 @@ RexxMethod2(int, rx3270_method_get_field_start, CSELF, sessionPtr, OPTIONAL_int, |
373 | 378 | return -1; |
374 | 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 | 45 | |
46 | 46 | #include <string.h> |
47 | 47 | |
48 | + | |
49 | + static rx3270 * factory_default(const char *type); | |
50 | + | |
48 | 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 | 56 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
54 | 57 | |
... | ... | @@ -86,13 +89,21 @@ rx3270::~rx3270() |
86 | 89 | |
87 | 90 | if(defSession == this) |
88 | 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 | 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 | 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 | 174 | int rx3270::set_copy(const char *text) |
... | ... | @@ -165,6 +182,15 @@ char * rx3270::get_copy(void) |
165 | 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 | 33 | |
34 | 34 | ::class rx3270 public subclass object |
35 | 35 | |
36 | - | |
37 | 36 | ::METHOD INIT EXTERNAL "LIBRARY rx3270 rx3270_method_init" |
38 | 37 | ::METHOD UNINIT EXTERNAL "LIBRARY rx3270 rx3270_method_uninit" |
39 | 38 | |
... | ... | @@ -71,15 +70,10 @@ |
71 | 70 | ::METHOD GETFIELDSTART EXTERNAL "LIBRARY rx3270 rx3270_method_get_field_start" |
72 | 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 | 78 | ::method waitForStringAt |
85 | 79 | use arg row, col, key, timeout | ... | ... |
src/plugins/rx3270/rx3270.h
... | ... | @@ -105,6 +105,12 @@ |
105 | 105 | REXX_METHOD_PROTOTYPE(rx3270_method_set_option); |
106 | 106 | REXX_METHOD_PROTOTYPE(rx3270_method_test); |
107 | 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 | 115 | /*---[ Globals ]---------------------------------------------------------------------------------------------*/ |
110 | 116 | |
... | ... | @@ -131,12 +137,15 @@ |
131 | 137 | |
132 | 138 | virtual ~rx3270(); |
133 | 139 | |
140 | + virtual void free(char *ptr); | |
141 | + | |
142 | + | |
134 | 143 | static rx3270 * create(const char *name = NULL); |
135 | 144 | static rx3270 * create_remote(const char *name); |
136 | 145 | static rx3270 * create_local(void); |
137 | 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 | 150 | char * get_3270_string(const char *str); |
142 | 151 | char * get_local_string(const char *str); |
... | ... | @@ -174,6 +183,8 @@ |
174 | 183 | virtual int set_copy(const char *text); |
175 | 184 | virtual char * get_copy(void); |
176 | 185 | |
186 | + virtual char * get_clipboard(void); | |
187 | + | |
177 | 188 | }; |
178 | 189 | |
179 | 190 | rx3270 * create_lib3270_instance(void); | ... | ... |
src/plugins/rx3270/rxapimain.cc
... | ... | @@ -143,6 +143,12 @@ RexxMethodEntry rx3270_methods[] = |
143 | 143 | REXX_METHOD(rx3270_method_test, rx3270_method_test ), |
144 | 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 | 152 | REXX_LAST_METHOD() |
147 | 153 | }; |
148 | 154 | ... | ... |
... | ... | @@ -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 | 236 | const char *text; |
237 | 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 | 244 | if(text) |
242 | 245 | return g_convert(text, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); | ... | ... |