Commit c72aba7bd7060dc52df82336081b43813945ca5c
1 parent
0e329efb
Exists in
master
and in
5 other branches
Copia para clipboard funcionando; "text-only" por enquanto
Showing
14 changed files
with
146 additions
and
62 deletions
Show diff stats
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
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
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"); |