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); | ... | ... |