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