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
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   -}
... ...