Commit 9d289f73759f8666f5d9d7558ca500a7cd52c257

Authored by perry.werneck@gmail.com
1 parent 877b74f9

Implementando "paste"

Showing 3 changed files with 96 additions and 38 deletions   Show diff stats
@@ -32,14 +32,17 @@ @@ -32,14 +32,17 @@
32 32
33 #include "globals.h" 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 #endif 38 #endif
  39 +*/
  40 +
38 #define XK_3270 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 #include <fcntl.h> 47 #include <fcntl.h>
45 #include "3270ds.h" 48 #include "3270ds.h"
@@ -53,17 +56,18 @@ @@ -53,17 +56,18 @@
53 #include "ctlrc.h" 56 #include "ctlrc.h"
54 #include "ftc.h" 57 #include "ftc.h"
55 #include "hostc.h" 58 #include "hostc.h"
56 -// #include "idlec.h"  
57 -// #include "keymapc.h"  
58 #include "keypadc.h" 59 #include "keypadc.h"
59 #include "kybdc.h" 60 #include "kybdc.h"
60 -// #include "macrosc.h"  
61 #include "popupsc.h" 61 #include "popupsc.h"
62 #include "printc.h" 62 #include "printc.h"
63 #include "screenc.h" 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 #include "statusc.h" 71 #include "statusc.h"
68 #include "tablesc.h" 72 #include "tablesc.h"
69 #include "telnetc.h" 73 #include "telnetc.h"
@@ -76,6 +80,8 @@ @@ -76,6 +80,8 @@
76 #endif /*]*/ 80 #endif /*]*/
77 #include "api.h" 81 #include "api.h"
78 82
  83 +#include <lib3270/popup.h>
  84 +
79 /*---[ Struct ]-------------------------------------------------------------------------------------------------*/ 85 /*---[ Struct ]-------------------------------------------------------------------------------------------------*/
80 86
81 typedef struct _paste_data 87 typedef struct _paste_data
@@ -157,6 +163,15 @@ @@ -157,6 +163,15 @@
157 return c; 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 LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str) 175 LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str)
161 { 176 {
162 PASTE_DATA data; 177 PASTE_DATA data;
@@ -218,3 +233,62 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str) @@ -218,3 +233,62 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str)
218 screen_resume(h); 233 screen_resume(h);
219 return data.qtd; 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 +}
@@ -787,3 +787,13 @@ LIB3270_EXPORT void lib3270_set_popup_handler(int (*handler)(H3270 *, LIB3270_NO @@ -787,3 +787,13 @@ LIB3270_EXPORT void lib3270_set_popup_handler(int (*handler)(H3270 *, LIB3270_NO
787 popup_handler = handler ? handler : logpopup; 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 +}
@@ -345,29 +345,3 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) @@ -345,29 +345,3 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession)
345 return realloc(ret,sz+1); 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 -}