Commit b0534ef40082259cf324a148937ad71efe8118c5
1 parent
9ad7fc96
Exists in
master
and in
3 other branches
Improving cut&paste methods.
Showing
6 changed files
with
189 additions
and
34 deletions
Show diff stats
lib3270.cbp
... | ... | @@ -220,6 +220,9 @@ |
220 | 220 | <Unit filename="src/lib3270/selection/actions.c"> |
221 | 221 | <Option compilerVar="CC" /> |
222 | 222 | </Unit> |
223 | + <Unit filename="src/lib3270/selection/get.c"> | |
224 | + <Option compilerVar="CC" /> | |
225 | + </Unit> | |
223 | 226 | <Unit filename="src/lib3270/selection/selection.c"> |
224 | 227 | <Option compilerVar="CC" /> |
225 | 228 | </Unit> | ... | ... |
src/include/lib3270.h
... | ... | @@ -1040,7 +1040,7 @@ |
1040 | 1040 | * @return selected text if available, or NULL. Release it with free() |
1041 | 1041 | * |
1042 | 1042 | */ |
1043 | - LIB3270_EXPORT char * lib3270_get_selected(H3270 *h); | |
1043 | + LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession); | |
1044 | 1044 | |
1045 | 1045 | LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession); |
1046 | 1046 | ... | ... |
src/include/lib3270/selection.h
... | ... | @@ -24,11 +24,16 @@ |
24 | 24 | * |
25 | 25 | * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) |
26 | 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) |
27 | - * licinio@bb.com.br (Licínio Luis Branco) | |
28 | - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
29 | 27 | * |
30 | 28 | */ |
31 | 29 | |
30 | + /** | |
31 | + * @brief LIB3270 calls for managing selected area. | |
32 | + * | |
33 | + * @author perry.werneck@gmail.com | |
34 | + * | |
35 | + */ | |
36 | + | |
32 | 37 | #ifndef LIB3270_SELECTION_H_INCLUDED |
33 | 38 | |
34 | 39 | #define LIB3270_SELECTION_H_INCLUDED 1 |
... | ... | @@ -41,7 +46,21 @@ |
41 | 46 | LIB3270_EXPORT int lib3270_select_all(H3270 *session); |
42 | 47 | |
43 | 48 | /** |
44 | - * "Paste" supplied string. | |
49 | + * @brief Get selection options. | |
50 | + * | |
51 | + * @see lib3270_get_selection | |
52 | + * | |
53 | + */ | |
54 | + typedef enum _LIB3270_SELECTION_OPTIONS { | |
55 | + | |
56 | + LIB3270_SELECTION_CUT = 0x0001, ///< @brief Cut selected data (if available). | |
57 | + LIB3270_SELECTION_ALL = 0x0002, ///< @brief Get all data (the default is get only selected data). | |
58 | + LIB3270_SELECTION_UNPROTECTED_ONLY = 0x0004, ///< @brief Get only unprotected contents. | |
59 | + | |
60 | + } LIB3270_SELECTION_OPTIONS; | |
61 | + | |
62 | + /** | |
63 | + * @brief "Paste" supplied string. | |
45 | 64 | * |
46 | 65 | * @param h Session handle. |
47 | 66 | * @param str String to paste. |
... | ... | @@ -54,7 +73,7 @@ |
54 | 73 | LIB3270_EXPORT int lib3270_paste(H3270 *h, const unsigned char *str); |
55 | 74 | |
56 | 75 | /** |
57 | - * Paste remaining string. | |
76 | + * @brief Paste remaining string. | |
58 | 77 | * |
59 | 78 | * @param h Session handle. |
60 | 79 | * |
... | ... | @@ -66,7 +85,7 @@ |
66 | 85 | LIB3270_EXPORT int lib3270_pastenext(H3270 *h); |
67 | 86 | |
68 | 87 | /** |
69 | - * Move selected box 1 char in the selected direction. | |
88 | + * @brief Move selected box 1 char in the selected direction. | |
70 | 89 | * |
71 | 90 | * @param h Session handle. |
72 | 91 | * @param dir Direction to move |
... | ... | @@ -76,7 +95,7 @@ |
76 | 95 | LIB3270_EXPORT int lib3270_move_selection(H3270 *h, LIB3270_DIRECTION dir); |
77 | 96 | |
78 | 97 | /** |
79 | - * Move selected box. | |
98 | + * @brief Move selected box. | |
80 | 99 | * |
81 | 100 | * @param h Session handle. |
82 | 101 | * @param from Address of origin position inside the selected buffer. |
... | ... | @@ -88,7 +107,7 @@ |
88 | 107 | LIB3270_EXPORT int lib3270_move_selected_area(H3270 *h, int from, int to); |
89 | 108 | |
90 | 109 | /** |
91 | - * Drag selected region. | |
110 | + * @brief Drag selected region. | |
92 | 111 | * |
93 | 112 | * Move or resize selected box according to the selection flags. |
94 | 113 | * |
... | ... | @@ -103,7 +122,7 @@ |
103 | 122 | LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int origin, int baddr); |
104 | 123 | |
105 | 124 | /** |
106 | - * Gets the selected range of characters in the screen | |
125 | + * @brief Gets the selected range of characters in the screen | |
107 | 126 | * |
108 | 127 | * @param h Session handle. |
109 | 128 | * @param start return location for start of selection, as a character offset. |
... | ... | @@ -115,7 +134,7 @@ |
115 | 134 | LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end); |
116 | 135 | |
117 | 136 | /** |
118 | - * Get bitmasked flag for the current selection. | |
137 | + * @brief Get bitmasked flag for the current selection. | |
119 | 138 | * |
120 | 139 | * Calculate flags to help drawing of the correct mouse pointer over a selection. |
121 | 140 | * |
... | ... | @@ -127,7 +146,7 @@ |
127 | 146 | LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *h, int baddr); |
128 | 147 | |
129 | 148 | /** |
130 | - * Get a string from required region. | |
149 | + * @brief Get a string from required region. | |
131 | 150 | * |
132 | 151 | * @param h Session handle. |
133 | 152 | * @param start_pos First char to get. |
... | ... | @@ -141,7 +160,7 @@ |
141 | 160 | |
142 | 161 | |
143 | 162 | /** |
144 | - * Selects a range of characters in the screen. | |
163 | + * @brief Selects a range of characters in the screen. | |
145 | 164 | * |
146 | 165 | * @param h Session handle. |
147 | 166 | * @param start_offset Start offset. | ... | ... |
src/lib3270/private.h
... | ... | @@ -670,7 +670,7 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); |
670 | 670 | |
671 | 671 | LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block); |
672 | 672 | |
673 | -LIB3270_INTERNAL void do_select(H3270 *h, int start, int end, int rect); | |
673 | +LIB3270_INTERNAL void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect); | |
674 | 674 | |
675 | 675 | |
676 | 676 | /** | ... | ... |
... | ... | @@ -0,0 +1,144 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | + * | |
21 | + * Este programa está nomeado como - e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | + #include "../private.h" | |
31 | + #include <lib3270.h> | |
32 | + #include <lib3270/session.h> | |
33 | + #include <lib3270/selection.h> | |
34 | + #include "3270ds.h" | |
35 | + | |
36 | + /*--[ Implement ]------------------------------------------------------------------------------------*/ | |
37 | + | |
38 | +static void clear_chr(H3270 *hSession, int baddr) | |
39 | +{ | |
40 | + hSession->text[baddr].chr = ' '; | |
41 | + | |
42 | + hSession->ea_buf[baddr].cc = EBC_null; | |
43 | + hSession->ea_buf[baddr].cs = 0; | |
44 | + | |
45 | + hSession->cbk.update( hSession, | |
46 | + baddr, | |
47 | + hSession->text[baddr].chr, | |
48 | + hSession->text[baddr].attr, | |
49 | + baddr == hSession->cursor_addr ); | |
50 | +} | |
51 | + | |
52 | +LIB3270_EXPORT char * lib3270_get_selection(H3270 *hSession, char tok, LIB3270_SELECTION_OPTIONS options) | |
53 | +{ | |
54 | + int row, col, baddr; | |
55 | + char * ret; | |
56 | + size_t buflen = (hSession->rows * (hSession->cols+1))+1; | |
57 | + size_t sz = 0; | |
58 | + unsigned short attr = 0xFFFF; | |
59 | + char cut = (options & LIB3270_SELECTION_CUT) != 0; | |
60 | + char all = (options & LIB3270_SELECTION_ALL) != 0; | |
61 | + | |
62 | + if(check_online_session(hSession)) | |
63 | + return NULL; | |
64 | + | |
65 | + if(!hSession->selected || hSession->select.start == hSession->select.end) | |
66 | + return NULL; | |
67 | + | |
68 | + ret = lib3270_malloc(buflen); | |
69 | + | |
70 | + baddr = 0; | |
71 | + unsigned char fa = 0; | |
72 | + | |
73 | + for(row=0;row < ((int) hSession->rows);row++) | |
74 | + { | |
75 | + int cr = 0; | |
76 | + | |
77 | + for(col = 0; col < ((int) hSession->cols);col++) | |
78 | + { | |
79 | + if(hSession->ea_buf[baddr].fa) { | |
80 | + fa = hSession->ea_buf[baddr].fa; | |
81 | + } | |
82 | + | |
83 | + if(all || hSession->text[baddr].attr & LIB3270_ATTR_SELECTED) | |
84 | + { | |
85 | + if(tok && attr != hSession->text[baddr].attr) | |
86 | + { | |
87 | + attr = hSession->text[baddr].attr; | |
88 | + ret[sz++] = tok; | |
89 | + ret[sz++] = (attr & 0x0F); | |
90 | + ret[sz++] = ((attr & 0xF0) >> 4); | |
91 | + | |
92 | + } | |
93 | + | |
94 | + cr++; | |
95 | + ret[sz++] = hSession->text[baddr].chr; | |
96 | + | |
97 | + if(cut && !FA_IS_PROTECTED(fa)) { | |
98 | + clear_chr(hSession,baddr); | |
99 | + } | |
100 | + | |
101 | + } | |
102 | + baddr++; | |
103 | + } | |
104 | + | |
105 | + if(cr) | |
106 | + ret[sz++] = '\n'; | |
107 | + | |
108 | + if((sz+10) > buflen) | |
109 | + { | |
110 | + buflen += 100; | |
111 | + ret = lib3270_realloc(ret,buflen); | |
112 | + } | |
113 | + } | |
114 | + | |
115 | + if(!sz) | |
116 | + { | |
117 | + lib3270_free(ret); | |
118 | + errno = ENOENT; | |
119 | + return NULL; | |
120 | + } | |
121 | + else if(sz > 1 && ret[sz-1] == '\n') // Remove ending \n | |
122 | + { | |
123 | + ret[sz-1] = 0; | |
124 | + } | |
125 | + | |
126 | + ret[sz++] = 0; | |
127 | + | |
128 | + if(sz != buflen) | |
129 | + ret = lib3270_realloc(ret,sz); | |
130 | + | |
131 | + return ret; | |
132 | +} | |
133 | + | |
134 | +LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | |
135 | +{ | |
136 | + return lib3270_get_selection(hSession,0,0); | |
137 | +} | |
138 | + | |
139 | +LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | |
140 | +{ | |
141 | + return lib3270_get_selection(hSession,0,LIB3270_SELECTION_CUT); | |
142 | +} | |
143 | + | |
144 | + | ... | ... |
src/lib3270/selection/selection.c
... | ... | @@ -84,9 +84,9 @@ static void update_selected_rectangle(H3270 *session) |
84 | 84 | |
85 | 85 | // First remove unselected areas |
86 | 86 | baddr = 0; |
87 | - for(row=0;row < session->rows;row++) | |
87 | + for(row=0;row < ((int) session->rows);row++) | |
88 | 88 | { |
89 | - for(col = 0; col < session->cols;col++) | |
89 | + for(col = 0; col < ((int) session->cols);col++) | |
90 | 90 | { |
91 | 91 | if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (session->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
92 | 92 | { |
... | ... | @@ -99,9 +99,9 @@ static void update_selected_rectangle(H3270 *session) |
99 | 99 | |
100 | 100 | // Then, draw selected ones |
101 | 101 | baddr = 0; |
102 | - for(row=0;row < session->rows;row++) | |
102 | + for(row=0;row < ((int) session->rows);row++) | |
103 | 103 | { |
104 | - for(col = 0; col < session->cols;col++) | |
104 | + for(col = 0; col < ((int) session->cols);col++) | |
105 | 105 | { |
106 | 106 | if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(session->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
107 | 107 | { |
... | ... | @@ -163,9 +163,9 @@ void toggle_rectselect(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LI |
163 | 163 | update_selected_region(session); |
164 | 164 | } |
165 | 165 | |
166 | -void do_select(H3270 *h, int start, int end, int rect) | |
166 | +void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect) | |
167 | 167 | { |
168 | - if(start < 0 || end > (h->rows * h->cols)) | |
168 | + if(end > (h->rows * h->cols)) | |
169 | 169 | return; |
170 | 170 | |
171 | 171 | // Do we really need to change selection? |
... | ... | @@ -240,6 +240,7 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba |
240 | 240 | return rc; |
241 | 241 | } |
242 | 242 | |
243 | +/* | |
243 | 244 | static void clear_chr(H3270 *hSession, int baddr) |
244 | 245 | { |
245 | 246 | hSession->text[baddr].chr = ' '; |
... | ... | @@ -254,7 +255,7 @@ static void clear_chr(H3270 *hSession, int baddr) |
254 | 255 | baddr == hSession->cursor_addr ); |
255 | 256 | } |
256 | 257 | |
257 | -static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok, Boolean cut) | |
258 | +static char * get_text(H3270 *hSession, unsigned char all, char tok, unsigned char cut) | |
258 | 259 | { |
259 | 260 | int row, col, baddr; |
260 | 261 | char * ret; |
... | ... | @@ -333,6 +334,7 @@ static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok, Boo |
333 | 334 | |
334 | 335 | return ret; |
335 | 336 | } |
337 | +*/ | |
336 | 338 | |
337 | 339 | LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, unsigned char all) |
338 | 340 | { |
... | ... | @@ -341,9 +343,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u |
341 | 343 | int sz = 0; |
342 | 344 | int baddr; |
343 | 345 | |
344 | - CHECK_SESSION_HANDLE(h); | |
345 | - | |
346 | - if(!lib3270_connected(h)) | |
346 | + if(check_online_session(h)) | |
347 | 347 | return NULL; |
348 | 348 | |
349 | 349 | maxlen = h->rows * (h->cols+1); |
... | ... | @@ -470,14 +470,3 @@ LIB3270_EXPORT int lib3270_has_selection(H3270 *hSession) |
470 | 470 | |
471 | 471 | return hSession->selected != 0; |
472 | 472 | } |
473 | - | |
474 | -LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | |
475 | -{ | |
476 | - return get_text(hSession,0,0,0); | |
477 | -} | |
478 | - | |
479 | -LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | |
480 | -{ | |
481 | - return get_text(hSession,0,0,1); | |
482 | -} | |
483 | - | ... | ... |