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,6 +29,7 @@
29 29
30 #include <gtk/gtk.h> 30 #include <gtk/gtk.h>
31 #include <pw3270.h> 31 #include <pw3270.h>
  32 + #include <malloc.h>
32 #include "v3270.h" 33 #include "v3270.h"
33 #include "private.h" 34 #include "private.h"
34 35
@@ -55,14 +56,17 @@ static void clipboard_clear(GtkClipboard *clipboard, GObject *obj) @@ -55,14 +56,17 @@ static void clipboard_clear(GtkClipboard *clipboard, GObject *obj)
55 56
56 static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj) 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 trace("%s: widget=%p target=\"%s\"",__FUNCTION__,obj,targets[target].target); 61 trace("%s: widget=%p target=\"%s\"",__FUNCTION__,obj,targets[target].target);
61 62
62 switch(target) 63 switch(target)
63 { 64 {
64 case CLIPBOARD_TYPE_TEXT: 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 break; 70 break;
67 71
68 default: 72 default:
@@ -72,8 +76,27 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, @@ -72,8 +76,27 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection,
72 76
73 void v3270_copy_clipboard(v3270 *widget) 77 void v3270_copy_clipboard(v3270 *widget)
74 { 78 {
  79 + char *text;
75 GtkClipboard * clipboard = gtk_widget_get_clipboard(GTK_WIDGET(widget),GDK_SELECTION_CLIPBOARD); 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 if(gtk_clipboard_set_with_owner( clipboard, 100 if(gtk_clipboard_set_with_owner( clipboard,
78 targets, 101 targets,
79 G_N_ELEMENTS(targets), 102 G_N_ELEMENTS(targets),
src/gtk/v3270/keyboard.c
@@ -194,7 +194,7 @@ @@ -194,7 +194,7 @@
194 194
195 void v3270_key_commit(GtkIMContext *imcontext, gchar *str, v3270 *widget) 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 if(utf) 199 if(utf)
200 { 200 {
@@ -203,7 +203,7 @@ @@ -203,7 +203,7 @@
203 } 203 }
204 else 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,6 +144,7 @@
144 144
145 /* private */ 145 /* private */
146 int selecting : 1; 146 int selecting : 1;
  147 +
147 #if GTK_CHECK_VERSION(3,0,0) 148 #if GTK_CHECK_VERSION(3,0,0)
148 149
149 #else 150 #else
@@ -154,6 +155,7 @@ @@ -154,6 +155,7 @@
154 GSource * timer; 155 GSource * timer;
155 GtkIMContext * input_method; 156 GtkIMContext * input_method;
156 unsigned short keyflags; 157 unsigned short keyflags;
  158 + gchar * clipboard; /**< Clipboard contents (text only) */
157 159
158 /* Font info */ 160 /* Font info */
159 gchar * font_family; 161 gchar * font_family;
src/gtk/v3270/widget.c
@@ -554,6 +554,12 @@ static void v3270_destroy(GtkObject *widget) @@ -554,6 +554,12 @@ static void v3270_destroy(GtkObject *widget)
554 terminal->input_method = NULL; 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 #if GTK_CHECK_VERSION(3,0,0) 563 #if GTK_CHECK_VERSION(3,0,0)
558 GTK_WIDGET_CLASS(v3270_parent_class)->destroy(widget); 564 GTK_WIDGET_CLASS(v3270_parent_class)->destroy(widget);
559 #else 565 #else
src/include/lib3270.h
@@ -596,7 +596,7 @@ @@ -596,7 +596,7 @@
596 * 596 *
597 * Get the handle to the GtkWidget who's handling this session. 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 * @return Associated GtkWidget (can be null) 601 * @return Associated GtkWidget (can be null)
602 * 602 *
@@ -608,11 +608,33 @@ @@ -608,11 +608,33 @@
608 * 608 *
609 * If available play a sound signal do alert user. 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 LIB3270_EXPORT void lib3270_ring_bell(H3270 *session); 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 LIB3270_EXPORT int lib3270_set_model(H3270 *session, int model); 638 LIB3270_EXPORT int lib3270_set_model(H3270 *session, int model);
617 LIB3270_EXPORT int lib3270_get_model(H3270 *session); 639 LIB3270_EXPORT int lib3270_get_model(H3270 *session);
618 640
src/include/lib3270/session.h
@@ -95,6 +95,7 @@ @@ -95,6 +95,7 @@
95 unsigned short current_port; 95 unsigned short current_port;
96 96
97 // screen info 97 // screen info
  98 + char * charset;
98 int ov_rows; 99 int ov_rows;
99 int ov_cols; 100 int ov_cols;
100 int maxROWS; 101 int maxROWS;
src/lib3270/charset.c
@@ -178,8 +178,7 @@ wide_resource_init(char *csname) @@ -178,8 +178,7 @@ wide_resource_init(char *csname)
178 /* 178 /*
179 * Change character sets. 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 char *cs, *ftcs; 183 char *cs, *ftcs;
185 enum cs_result rc; 184 enum cs_result rc;
@@ -207,17 +206,7 @@ charset_init(char *csname) @@ -207,17 +206,7 @@ charset_init(char *csname)
207 charset_defaults(); 206 charset_defaults();
208 set_cgcsgids(CN); 207 set_cgcsgids(CN);
209 set_charset_name(CN); 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 return CS_OKAY; 211 return CS_OKAY;
223 } 212 }
@@ -373,8 +362,7 @@ set_charset_name(char *csname) @@ -373,8 +362,7 @@ set_charset_name(char *csname)
373 } 362 }
374 363
375 /* Define a charset from resources. */ 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 enum cs_result rc; 367 enum cs_result rc;
380 int ne = 0; 368 int ne = 0;
@@ -454,10 +442,12 @@ resource_charset(char *csname, char *cs, char *ftcs) @@ -454,10 +442,12 @@ resource_charset(char *csname, char *cs, char *ftcs)
454 #if defined(_WIN32) /*[*/ 442 #if defined(_WIN32) /*[*/
455 /* See about changing the console output code page. */ 443 /* See about changing the console output code page. */
456 dcs = get_fresource("%s.%s", ResDisplayCharset, csname); 444 dcs = get_fresource("%s.%s", ResDisplayCharset, csname);
457 - if (dcs != NULL) { 445 + if (dcs != NULL)
  446 + {
458 set_display_charset(dcs); 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 #endif /*]*/ 452 #endif /*]*/
463 453
@@ -744,10 +734,13 @@ check_charset(void) @@ -744,10 +734,13 @@ check_charset(void)
744 } 734 }
745 #endif /*]*/ 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,7 +35,8 @@ LIB3270_INTERNAL char *default_display_charset;
35 35
36 enum cs_result { CS_OKAY, CS_NOTFOUND, CS_BAD, CS_PREREQ, CS_ILLEGAL }; 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,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 static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) 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,10 +266,10 @@ H3270 * lib3270_session_new(const char *model)
259 return NULL; 266 return NULL;
260 267
261 Trace("Charset: %s",appres.charset); 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 kybd_init(); 275 kybd_init();
src/lib3270/macros.c
@@ -99,7 +99,7 @@ @@ -99,7 +99,7 @@
99 99
100 LIB3270_MACRO( encoding ) 100 LIB3270_MACRO( encoding )
101 { 101 {
102 - return strdup("ISO-8859-1"); 102 + return strdup(lib3270_get_charset(hSession));
103 } 103 }
104 104
105 LIB3270_MACRO( get ) 105 LIB3270_MACRO( get )
src/lib3270/printer.c
@@ -314,7 +314,7 @@ printer_start(const char *lu) @@ -314,7 +314,7 @@ printer_start(const char *lu)
314 "for pr3287\n"); 314 "for pr3287\n");
315 (void) fprintf(f, "# Created by %s\n", build); 315 (void) fprintf(f, "# Created by %s\n", build);
316 (void) fprintf(f, "# Chararter set is '%s'\n", 316 (void) fprintf(f, "# Chararter set is '%s'\n",
317 - get_charset_name()); 317 + lib3270_get_charset(&h3270));
318 (void) fprintf(f, "cgcsgid=0x%08lx\n", cgcsgid); 318 (void) fprintf(f, "cgcsgid=0x%08lx\n", cgcsgid);
319 #if defined(X3270_DBCS) /*[*/ 319 #if defined(X3270_DBCS) /*[*/
320 if (dbcs) { 320 if (dbcs) {
src/lib3270/screen.c
@@ -91,11 +91,6 @@ static void status_connect(H3270 *session, int ignored, void *dunno); @@ -91,11 +91,6 @@ static void status_connect(H3270 *session, int ignored, void *dunno);
91 static void status_3270_mode(H3270 *session, int ignored, void *dunno); 91 static void status_3270_mode(H3270 *session, int ignored, void *dunno);
92 static void status_printer(H3270 *session, int on, void *dunno); 92 static void status_printer(H3270 *session, int on, void *dunno);
93 static unsigned short color_from_fa(unsigned char fa); 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 static void addch(H3270 *session, int baddr, unsigned char c, unsigned short attr) 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,6 +36,20 @@
36 36
37 /*--[ Implement ]------------------------------------------------------------------------------------*/ 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 static void update_selected_rectangle(H3270 *session) 53 static void update_selected_rectangle(H3270 *session)
40 { 54 {
41 struct 55 struct
@@ -44,16 +58,10 @@ static void update_selected_rectangle(H3270 *session) @@ -44,16 +58,10 @@ static void update_selected_rectangle(H3270 *session)
44 int col; 58 int col;
45 } p[2]; 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 // Get start & end posision 66 // Get start & end posision
59 p[0].row = (begin/session->cols); 67 p[0].row = (begin/session->cols);
@@ -95,17 +103,10 @@ static void update_selected_rectangle(H3270 *session) @@ -95,17 +103,10 @@ static void update_selected_rectangle(H3270 *session)
95 103
96 static void update_selected_region(H3270 *session) 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 // First remove unselected areas 111 // First remove unselected areas
111 for(baddr = 0; baddr < begin; baddr++) 112 for(baddr = 0; baddr < begin; baddr++)
@@ -310,3 +311,36 @@ LIB3270_ACTION( reselect ) @@ -310,3 +311,36 @@ LIB3270_ACTION( reselect )
310 return 0; 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,7 +429,7 @@ create_tracefile_header(const char *mode)
429 if (appres.extended) 429 if (appres.extended)
430 wtrace(", extended data stream"); 430 wtrace(", extended data stream");
431 wtrace(", %s emulation", appres.m3279 ? "color" : "monochrome"); 431 wtrace(", %s emulation", appres.m3279 ? "color" : "monochrome");
432 - wtrace(", %s charset", get_charset_name()); 432 + wtrace(", %s charset", lib3270_get_charset(&h3270));
433 if (appres.apl_mode) 433 if (appres.apl_mode)
434 wtrace(", APL mode"); 434 wtrace(", APL mode");
435 wtrace("\n"); 435 wtrace("\n");