Commit 9d289f73759f8666f5d9d7558ca500a7cd52c257
1 parent
877b74f9
Exists in
master
and in
3 other branches
Implementando "paste"
Showing
3 changed files
with
96 additions
and
38 deletions
Show diff stats
paste.c
| ... | ... | @@ -32,14 +32,17 @@ |
| 32 | 32 | |
| 33 | 33 | #include "globals.h" |
| 34 | 34 | |
| 35 | -#if defined(X3270_DISPLAY) /*[*/ | |
| 36 | -#include <X11/Xatom.h> | |
| 35 | +/* | |
| 36 | +#if defined(X3270_DISPLAY) | |
| 37 | + #include <X11/Xatom.h> | |
| 37 | 38 | #endif |
| 39 | +*/ | |
| 40 | + | |
| 38 | 41 | #define XK_3270 |
| 39 | -#if defined(X3270_APL) /*[*/ | |
| 40 | -#define XK_APL | |
| 41 | -#endif /*]*/ | |
| 42 | -//#include <X11/keysym.h> | |
| 42 | + | |
| 43 | +#if defined(X3270_APL) | |
| 44 | + #define XK_APL | |
| 45 | +#endif | |
| 43 | 46 | |
| 44 | 47 | #include <fcntl.h> |
| 45 | 48 | #include "3270ds.h" |
| ... | ... | @@ -53,17 +56,18 @@ |
| 53 | 56 | #include "ctlrc.h" |
| 54 | 57 | #include "ftc.h" |
| 55 | 58 | #include "hostc.h" |
| 56 | -// #include "idlec.h" | |
| 57 | -// #include "keymapc.h" | |
| 58 | 59 | #include "keypadc.h" |
| 59 | 60 | #include "kybdc.h" |
| 60 | -// #include "macrosc.h" | |
| 61 | 61 | #include "popupsc.h" |
| 62 | 62 | #include "printc.h" |
| 63 | 63 | #include "screenc.h" |
| 64 | -// #if defined(X3270_DISPLAY) /*[*/ | |
| 65 | -// #include "selectc.h" | |
| 66 | -// #endif /*]*/ | |
| 64 | + | |
| 65 | +/* | |
| 66 | +#if defined(X3270_DISPLAY) | |
| 67 | + #include "selectc.h" | |
| 68 | +#endif | |
| 69 | +*/ | |
| 70 | + | |
| 67 | 71 | #include "statusc.h" |
| 68 | 72 | #include "tablesc.h" |
| 69 | 73 | #include "telnetc.h" |
| ... | ... | @@ -76,6 +80,8 @@ |
| 76 | 80 | #endif /*]*/ |
| 77 | 81 | #include "api.h" |
| 78 | 82 | |
| 83 | +#include <lib3270/popup.h> | |
| 84 | + | |
| 79 | 85 | /*---[ Struct ]-------------------------------------------------------------------------------------------------*/ |
| 80 | 86 | |
| 81 | 87 | typedef struct _paste_data |
| ... | ... | @@ -157,6 +163,15 @@ |
| 157 | 163 | return c; |
| 158 | 164 | } |
| 159 | 165 | |
| 166 | +/** | |
| 167 | + * Set string at cursor position. | |
| 168 | + * | |
| 169 | + * @param h Session handle. | |
| 170 | + * @param str String to set | |
| 171 | + * | |
| 172 | + * @return Number of characters inserted; <0 in case of error. | |
| 173 | + * | |
| 174 | + */ | |
| 160 | 175 | LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str) |
| 161 | 176 | { |
| 162 | 177 | PASTE_DATA data; |
| ... | ... | @@ -218,3 +233,62 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str) |
| 218 | 233 | screen_resume(h); |
| 219 | 234 | return data.qtd; |
| 220 | 235 | } |
| 236 | + | |
| 237 | +LIB3270_EXPORT int lib3270_paste(H3270 *h, const char *str) | |
| 238 | +{ | |
| 239 | + int sz; | |
| 240 | + CHECK_SESSION_HANDLE(h); | |
| 241 | + | |
| 242 | + if(!lib3270_connected(h)) | |
| 243 | + { | |
| 244 | + lib3270_ring_bell(h); | |
| 245 | + return 0; | |
| 246 | + } | |
| 247 | + | |
| 248 | + if(h->paste_buffer) | |
| 249 | + { | |
| 250 | + free(h->paste_buffer); | |
| 251 | + h->paste_buffer = NULL; | |
| 252 | + } | |
| 253 | + | |
| 254 | + sz = lib3270_set_string(h,str); | |
| 255 | + if(sz < 0) | |
| 256 | + { | |
| 257 | + // Can´t paste | |
| 258 | + lib3270_popup_dialog(h,LIB3270_NOTIFY_WARNING, | |
| 259 | + _( "Action failed" ), | |
| 260 | + _( "Unable to paste text" ), | |
| 261 | + "%s", sz == -EINVAL ? _( "Keyboard is locked" ) : _( "Unexpected error" ) ); | |
| 262 | + return 0; | |
| 263 | + } | |
| 264 | + | |
| 265 | + if(strlen(str) > sz) | |
| 266 | + { | |
| 267 | + h->paste_buffer = strdup(str+sz); | |
| 268 | + return 1; | |
| 269 | + } | |
| 270 | + | |
| 271 | + return 0; | |
| 272 | +} | |
| 273 | + | |
| 274 | +LIB3270_EXPORT int lib3270_pastenext(H3270 *h) | |
| 275 | +{ | |
| 276 | + char * ptr; | |
| 277 | + int rc; | |
| 278 | + | |
| 279 | + CHECK_SESSION_HANDLE(h); | |
| 280 | + | |
| 281 | + if(!(lib3270_connected(h) && h->paste_buffer)) | |
| 282 | + { | |
| 283 | + lib3270_ring_bell(h); | |
| 284 | + return 0; | |
| 285 | + } | |
| 286 | + | |
| 287 | + ptr = h->paste_buffer; | |
| 288 | + h->paste_buffer = NULL; | |
| 289 | + | |
| 290 | + rc = lib3270_paste(h,ptr); | |
| 291 | + | |
| 292 | + free(ptr); | |
| 293 | + return rc; | |
| 294 | +} | ... | ... |
screen.c
| ... | ... | @@ -787,3 +787,13 @@ LIB3270_EXPORT void lib3270_set_popup_handler(int (*handler)(H3270 *, LIB3270_NO |
| 787 | 787 | popup_handler = handler ? handler : logpopup; |
| 788 | 788 | } |
| 789 | 789 | |
| 790 | +LIB3270_EXPORT lib3270_popup_dialog(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *fmt, ...) | |
| 791 | +{ | |
| 792 | + va_list args; | |
| 793 | + | |
| 794 | + CHECK_SESSION_HANDLE(session); | |
| 795 | + | |
| 796 | + va_start(args, fmt); | |
| 797 | + popup_handler(session,id,title ? title : _( "3270 Error" ), message,fmt,args); | |
| 798 | + va_end(args); | |
| 799 | +} | ... | ... |
selection.c
| ... | ... | @@ -345,29 +345,3 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) |
| 345 | 345 | return realloc(ret,sz+1); |
| 346 | 346 | } |
| 347 | 347 | |
| 348 | -LIB3270_EXPORT int lib3270_paste(H3270 *h, const char *str) | |
| 349 | -{ | |
| 350 | - CHECK_SESSION_HANDLE(h); | |
| 351 | - | |
| 352 | - if(!lib3270_connected(h)) | |
| 353 | - { | |
| 354 | - lib3270_ring_bell(h); | |
| 355 | - return 0; | |
| 356 | - } | |
| 357 | - | |
| 358 | - return 0; | |
| 359 | -} | |
| 360 | - | |
| 361 | -LIB3270_EXPORT int lib3270_pastenext(H3270 *h) | |
| 362 | -{ | |
| 363 | - CHECK_SESSION_HANDLE(h); | |
| 364 | - | |
| 365 | - if(!(lib3270_connected(h) && h->paste_buffer)) | |
| 366 | - { | |
| 367 | - lib3270_ring_bell(h); | |
| 368 | - return 0; | |
| 369 | - } | |
| 370 | - | |
| 371 | - | |
| 372 | - return 0; | |
| 373 | -} | ... | ... |