Commit c72aba7bd7060dc52df82336081b43813945ca5c

Authored by perry.werneck@gmail.com
1 parent 0e329efb

Copia para clipboard funcionando; "text-only" por enquanto

src/gtk/v3270/clipboard.c
... ... @@ -29,6 +29,7 @@
29 29  
30 30 #include <gtk/gtk.h>
31 31 #include <pw3270.h>
  32 + #include <malloc.h>
32 33 #include "v3270.h"
33 34 #include "private.h"
34 35  
... ... @@ -55,14 +56,17 @@ static void clipboard_clear(GtkClipboard *clipboard, GObject *obj)
55 56  
56 57 static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj)
57 58 {
58   -// v3270 *widget = GTK_V3270(obj);
  59 + v3270 * widget = GTK_V3270(obj);
59 60  
60 61 trace("%s: widget=%p target=\"%s\"",__FUNCTION__,obj,targets[target].target);
61 62  
62 63 switch(target)
63 64 {
64 65 case CLIPBOARD_TYPE_TEXT:
65   - gtk_selection_data_set_text(selection,"teste de clipboard",-1);
  66 + if(!widget->clipboard)
  67 + lib3270_ring_bell(widget->host);
  68 + else
  69 + gtk_selection_data_set_text(selection,widget->clipboard,-1);
66 70 break;
67 71  
68 72 default:
... ... @@ -72,8 +76,27 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection,
72 76  
73 77 void v3270_copy_clipboard(v3270 *widget)
74 78 {
  79 + char *text;
75 80 GtkClipboard * clipboard = gtk_widget_get_clipboard(GTK_WIDGET(widget),GDK_SELECTION_CLIPBOARD);
76 81  
  82 + if(widget->clipboard)
  83 + {
  84 + g_free(widget->clipboard);
  85 + widget->clipboard = NULL;
  86 + }
  87 +
  88 + text = lib3270_get_selected(widget->host);
  89 +
  90 + if(!text)
  91 + {
  92 + lib3270_ring_bell(widget->host);
  93 + return;
  94 + }
  95 +
  96 + widget->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(widget->host), NULL, NULL, NULL);
  97 +
  98 + free(text);
  99 +
77 100 if(gtk_clipboard_set_with_owner( clipboard,
78 101 targets,
79 102 G_N_ELEMENTS(targets),
... ...
src/gtk/v3270/keyboard.c
... ... @@ -194,7 +194,7 @@
194 194  
195 195 void v3270_key_commit(GtkIMContext *imcontext, gchar *str, v3270 *widget)
196 196 {
197   - gchar *utf = g_convert((char *) str, -1, "ISO-8859-1", "UTF-8", NULL, NULL, NULL);
  197 + gchar *utf = g_convert((char *) str, -1, lib3270_get_charset(widget->host), "UTF-8", NULL, NULL, NULL);
198 198  
199 199 if(utf)
200 200 {
... ... @@ -203,7 +203,7 @@
203 203 }
204 204 else
205 205 {
206   - gdk_beep();
  206 + lib3270_ring_bell(widget->host);
207 207 }
208 208 }
209 209  
... ...
src/gtk/v3270/v3270.h
... ... @@ -144,6 +144,7 @@
144 144  
145 145 /* private */
146 146 int selecting : 1;
  147 +
147 148 #if GTK_CHECK_VERSION(3,0,0)
148 149  
149 150 #else
... ... @@ -154,6 +155,7 @@
154 155 GSource * timer;
155 156 GtkIMContext * input_method;
156 157 unsigned short keyflags;
  158 + gchar * clipboard; /**< Clipboard contents (text only) */
157 159  
158 160 /* Font info */
159 161 gchar * font_family;
... ...
src/gtk/v3270/widget.c
... ... @@ -554,6 +554,12 @@ static void v3270_destroy(GtkObject *widget)
554 554 terminal->input_method = NULL;
555 555 }
556 556  
  557 + if(terminal->clipboard)
  558 + {
  559 + g_free(terminal->clipboard);
  560 + terminal->clipboard = NULL;
  561 + }
  562 +
557 563 #if GTK_CHECK_VERSION(3,0,0)
558 564 GTK_WIDGET_CLASS(v3270_parent_class)->destroy(widget);
559 565 #else
... ...
src/include/lib3270.h
... ... @@ -596,7 +596,7 @@
596 596 *
597 597 * Get the handle to the GtkWidget who's handling this session.
598 598 *
599   - * @param h Session handle
  599 + * @param h Session handle.
600 600 *
601 601 * @return Associated GtkWidget (can be null)
602 602 *
... ... @@ -608,11 +608,33 @@
608 608 *
609 609 * If available play a sound signal do alert user.
610 610 *
611   - * @param h Session handle
  611 + * @param h Session handle.
612 612 *
613 613 */
614 614 LIB3270_EXPORT void lib3270_ring_bell(H3270 *session);
615 615  
  616 +
  617 + /**
  618 + * Get lib3270's charset.
  619 + *
  620 + * @param h Session handle.
  621 + *
  622 + * @return String with current encoding.
  623 + *
  624 + */
  625 + LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session);
  626 +
  627 + /**
  628 + * Get selected area.
  629 + *
  630 + * @param h Session Handle.
  631 + *
  632 + * @return selected text if available, or NULL. Release it with free()
  633 + *
  634 + */
  635 + LIB3270_EXPORT char * lib3270_get_selected(H3270 *h);
  636 +
  637 +
616 638 LIB3270_EXPORT int lib3270_set_model(H3270 *session, int model);
617 639 LIB3270_EXPORT int lib3270_get_model(H3270 *session);
618 640  
... ...
src/include/lib3270/session.h
... ... @@ -95,6 +95,7 @@
95 95 unsigned short current_port;
96 96  
97 97 // screen info
  98 + char * charset;
98 99 int ov_rows;
99 100 int ov_cols;
100 101 int maxROWS;
... ...
src/lib3270/charset.c
... ... @@ -178,8 +178,7 @@ wide_resource_init(char *csname)
178 178 /*
179 179 * Change character sets.
180 180 */
181   -enum cs_result
182   -charset_init(char *csname)
  181 +enum cs_result charset_init(H3270 *session, char *csname)
183 182 {
184 183 char *cs, *ftcs;
185 184 enum cs_result rc;
... ... @@ -207,17 +206,7 @@ charset_init(char *csname)
207 206 charset_defaults();
208 207 set_cgcsgids(CN);
209 208 set_charset_name(CN);
210   - set_display_charset("iso8859-1");
211   -
212   -/*
213   -#if defined(_WIN32) || defined(LIB3270)
214   - set_display_charset("iso8859-1");
215   -#elif defined(X3270_DISPLAY) || (defined(C3270) && !defined(_WIN32))
216   - (void) screen_new_display_charsets(default_display_charset,"us");
217   -#else
218   - utf8_set_display_charsets(default_display_charset, "us");
219   -#endif
220   -*/
  209 + set_display_charset(session, "ISO-8859-1");
221 210  
222 211 return CS_OKAY;
223 212 }
... ... @@ -373,8 +362,7 @@ set_charset_name(char *csname)
373 362 }
374 363  
375 364 /* Define a charset from resources. */
376   -static enum cs_result
377   -resource_charset(char *csname, char *cs, char *ftcs)
  365 +static enum cs_result resource_charset(char *csname, char *cs, char *ftcs)
378 366 {
379 367 enum cs_result rc;
380 368 int ne = 0;
... ... @@ -454,10 +442,12 @@ resource_charset(char *csname, char *cs, char *ftcs)
454 442 #if defined(_WIN32) /*[*/
455 443 /* See about changing the console output code page. */
456 444 dcs = get_fresource("%s.%s", ResDisplayCharset, csname);
457   - if (dcs != NULL) {
  445 + if (dcs != NULL)
  446 + {
458 447 set_display_charset(dcs);
459   - } else {
460   - set_display_charset("iso8859-1");
  448 + } else
  449 + {
  450 + set_display_charset("ISO-8859-1");
461 451 }
462 452 #endif /*]*/
463 453  
... ... @@ -744,10 +734,13 @@ check_charset(void)
744 734 }
745 735 #endif /*]*/
746 736  
747   -/* Return the current character set name. */
748   -char *
749   -get_charset_name(void)
  737 +void set_display_charset(H3270 *session, char *dcs)
  738 +{
  739 + session->charset = strdup(dcs);
  740 +}
  741 +
  742 +LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session)
750 743 {
751   - return (charset_name != CN)? charset_name:
752   - ((appres.charset != CN)? appres.charset: "us");
  744 + CHECK_SESSION_HANDLE(session);
  745 + return session->charset ? session->charset : "ISO-8859-1";
753 746 }
... ...
src/lib3270/charsetc.h
... ... @@ -35,7 +35,8 @@ LIB3270_INTERNAL char *default_display_charset;
35 35  
36 36 enum cs_result { CS_OKAY, CS_NOTFOUND, CS_BAD, CS_PREREQ, CS_ILLEGAL };
37 37  
38   -LIB3270_INTERNAL enum cs_result charset_init(char *csname);
39   -LIB3270_INTERNAL char *get_charset_name(void);
40   -LIB3270_INTERNAL void set_display_charset(char *dcs);
  38 +LIB3270_INTERNAL enum cs_result charset_init(H3270 *session, char *csname);
  39 +// LIB3270_INTERNAL char *get_charset_name(void);
  40 +
  41 +LIB3270_INTERNAL void set_display_charset(H3270 *session, char *dcs);
41 42  
... ...
src/lib3270/glue.c
... ... @@ -138,6 +138,13 @@ void lib3270_session_free(H3270 *h)
138 138 }
139 139 }
140 140  
  141 + // Release memory
  142 + if(h->charset)
  143 + {
  144 + free(h->charset);
  145 + h->charset = NULL;
  146 + }
  147 +
141 148 }
142 149  
143 150 static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor)
... ... @@ -259,10 +266,10 @@ H3270 * lib3270_session_new(const char *model)
259 266 return NULL;
260 267  
261 268 Trace("Charset: %s",appres.charset);
262   - if (charset_init(appres.charset) != CS_OKAY)
  269 + if (charset_init(hSession,appres.charset) != CS_OKAY)
263 270 {
264   - Warning(NULL, _( "Cannot find charset \"%s\", using defaults" ), appres.charset);
265   - (void) charset_init(CN);
  271 + Warning(hSession, _( "Cannot find charset \"%s\", using defaults" ), appres.charset);
  272 + (void) charset_init(hSession,CN);
266 273 }
267 274  
268 275 kybd_init();
... ...
src/lib3270/macros.c
... ... @@ -99,7 +99,7 @@
99 99  
100 100 LIB3270_MACRO( encoding )
101 101 {
102   - return strdup("ISO-8859-1");
  102 + return strdup(lib3270_get_charset(hSession));
103 103 }
104 104  
105 105 LIB3270_MACRO( get )
... ...
src/lib3270/printer.c
... ... @@ -314,7 +314,7 @@ printer_start(const char *lu)
314 314 "for pr3287\n");
315 315 (void) fprintf(f, "# Created by %s\n", build);
316 316 (void) fprintf(f, "# Chararter set is '%s'\n",
317   - get_charset_name());
  317 + lib3270_get_charset(&h3270));
318 318 (void) fprintf(f, "cgcsgid=0x%08lx\n", cgcsgid);
319 319 #if defined(X3270_DBCS) /*[*/
320 320 if (dbcs) {
... ...
src/lib3270/screen.c
... ... @@ -91,11 +91,6 @@ static void status_connect(H3270 *session, int ignored, void *dunno);
91 91 static void status_3270_mode(H3270 *session, int ignored, void *dunno);
92 92 static void status_printer(H3270 *session, int on, void *dunno);
93 93 static unsigned short color_from_fa(unsigned char fa);
94   -// static void relabel(H3270 *session, int ignored, void *dunno);
95   -
96   -void set_display_charset(char *dcs)
97   -{
98   -}
99 94  
100 95 static void addch(H3270 *session, int baddr, unsigned char c, unsigned short attr)
101 96 {
... ...
src/lib3270/selection.c
... ... @@ -36,6 +36,20 @@
36 36  
37 37 /*--[ Implement ]------------------------------------------------------------------------------------*/
38 38  
  39 +static void get_selected_addr(H3270 *session, int *begin, int *end)
  40 +{
  41 + if(session->select.begin > session->select.end)
  42 + {
  43 + *end = session->select.begin;
  44 + *begin = session->select.end;
  45 + }
  46 + else
  47 + {
  48 + *begin = session->select.begin;
  49 + *end = session->select.end;
  50 + }
  51 +}
  52 +
39 53 static void update_selected_rectangle(H3270 *session)
40 54 {
41 55 struct
... ... @@ -44,16 +58,10 @@ static void update_selected_rectangle(H3270 *session)
44 58 int col;
45 59 } p[2];
46 60  
47   - int begin = session->select.begin;
48   - int end = session->select.end;
49   - int row, col, baddr;
50 61  
51   - if(begin > end)
52   - {
53   - baddr = end;
54   - end = begin;
55   - begin = baddr;
56   - }
  62 + int begin, end, row, col, baddr;
  63 +
  64 + get_selected_addr(session,&begin,&end);
57 65  
58 66 // Get start & end posision
59 67 p[0].row = (begin/session->cols);
... ... @@ -95,17 +103,10 @@ static void update_selected_rectangle(H3270 *session)
95 103  
96 104 static void update_selected_region(H3270 *session)
97 105 {
98   - int baddr;
99   - int begin = session->select.begin;
100   - int end = session->select.end;
101   - int len = session->rows*session->cols;
  106 + int baddr,begin,end;
  107 + int len = session->rows*session->cols;
102 108  
103   - if(begin > end)
104   - {
105   - baddr = end;
106   - end = begin;
107   - begin = baddr;
108   - }
  109 + get_selected_addr(session,&begin,&end);
109 110  
110 111 // First remove unselected areas
111 112 for(baddr = 0; baddr < begin; baddr++)
... ... @@ -310,3 +311,36 @@ LIB3270_ACTION( reselect )
310 311 return 0;
311 312 }
312 313  
  314 +LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession)
  315 +{
  316 + int row, col, baddr;
  317 + char *ret;
  318 + size_t sz = 0;
  319 +
  320 + if(!hSession->selected || hSession->select.begin == hSession->select.end)
  321 + return NULL;
  322 +
  323 + ret = malloc(hSession->rows * (hSession->cols+1));
  324 +
  325 + baddr = 0;
  326 + for(row=0;row < hSession->rows;row++)
  327 + {
  328 + int cr = 0;
  329 +
  330 + for(col = 0; col < hSession->cols;col++)
  331 + {
  332 + if(hSession->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)
  333 + {
  334 + cr++;
  335 + ret[sz++] = hSession->ea_buf[baddr].chr;
  336 + }
  337 + baddr++;
  338 + }
  339 +
  340 + if(cr)
  341 + ret[sz++] = '\n';
  342 + }
  343 + ret[sz] = 0;
  344 +
  345 + return realloc(ret,sz+1);
  346 +}
... ...
src/lib3270/trace_ds.c
... ... @@ -429,7 +429,7 @@ create_tracefile_header(const char *mode)
429 429 if (appres.extended)
430 430 wtrace(", extended data stream");
431 431 wtrace(", %s emulation", appres.m3279 ? "color" : "monochrome");
432   - wtrace(", %s charset", get_charset_name());
  432 + wtrace(", %s charset", lib3270_get_charset(&h3270));
433 433 if (appres.apl_mode)
434 434 wtrace(", APL mode");
435 435 wtrace("\n");
... ...