Commit 8469c3a2f87a5779df61f6821ffb3458322733dc

Authored by perry.werneck@gmail.com
1 parent 4d321221

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

@@ -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 }
@@ -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
@@ -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();
@@ -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 )
@@ -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) {
@@ -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 {
@@ -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 +}
@@ -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");