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 | 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
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
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"); | ... | ... |