Commit 73de0f1c05ceb51390004eb1bd28f04fa8f8159a

Authored by Perry Werneck
1 parent b0534ef4

Adding method to get a rectangle with the selected region.

src/include/lib3270/selection.h
... ... @@ -134,6 +134,20 @@
134 134 LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end);
135 135  
136 136 /**
  137 + * @brief Get the coordinates of a rectangle containing the selected region.
  138 + *
  139 + * @param hSession Session handle.
  140 + * @param col Pointer to last row.
  141 + * @param row Pointer to first row.
  142 + * @param width Pointer to first col.
  143 + * @param height Pointer to last col.
  144 + *
  145 + * @return 0 if suceeds, error code if not (sets errno).
  146 + *
  147 + */
  148 + LIB3270_EXPORT int lib3270_get_selection_rectangle(H3270 *hSession, unsigned int *col, unsigned int *row, unsigned int *width, unsigned int *height);
  149 +
  150 + /**
137 151 * @brief Get bitmasked flag for the current selection.
138 152 *
139 153 * Calculate flags to help drawing of the correct mouse pointer over a selection.
... ...
src/lib3270/paste.c
... ... @@ -318,6 +318,7 @@ LIB3270_EXPORT int lib3270_paste(H3270 *h, const unsigned char *str)
318 318 if(!lib3270_connected(h))
319 319 {
320 320 lib3270_ring_bell(h);
  321 + errno = ENOTCONN;
321 322 return 0;
322 323 }
323 324  
... ...
src/lib3270/selection/get.c
... ... @@ -141,4 +141,3 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession)
141 141 return lib3270_get_selection(hSession,0,LIB3270_SELECTION_CUT);
142 142 }
143 143  
144   -
... ...
src/lib3270/selection/selection.c
... ... @@ -169,7 +169,7 @@ void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect
169 169 return;
170 170  
171 171 // Do we really need to change selection?
172   - if(start == h->select.start && end == h->select.end && h->selected)
  172 + if( ((int) start) == h->select.start && ((int) end) == h->select.end && h->selected)
173 173 return;
174 174  
175 175 // Start address is inside the screen?
... ... @@ -240,102 +240,6 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba
240 240 return rc;
241 241 }
242 242  
243   -/*
244   -static void clear_chr(H3270 *hSession, int baddr)
245   -{
246   - hSession->text[baddr].chr = ' ';
247   -
248   - hSession->ea_buf[baddr].cc = EBC_null;
249   - hSession->ea_buf[baddr].cs = 0;
250   -
251   - hSession->cbk.update( hSession,
252   - baddr,
253   - hSession->text[baddr].chr,
254   - hSession->text[baddr].attr,
255   - baddr == hSession->cursor_addr );
256   -}
257   -
258   -static char * get_text(H3270 *hSession, unsigned char all, char tok, unsigned char cut)
259   -{
260   - int row, col, baddr;
261   - char * ret;
262   - size_t buflen = (hSession->rows * (hSession->cols+1))+1;
263   - size_t sz = 0;
264   - unsigned short attr = 0xFFFF;
265   -
266   - if(check_online_session(hSession))
267   - return NULL;
268   -
269   - if(!hSession->selected || hSession->select.start == hSession->select.end)
270   - return NULL;
271   -
272   - ret = lib3270_malloc(buflen);
273   -
274   - baddr = 0;
275   - unsigned char fa = 0;
276   -
277   - for(row=0;row < hSession->rows;row++)
278   - {
279   - int cr = 0;
280   -
281   - for(col = 0; col < hSession->cols;col++)
282   - {
283   - if(hSession->ea_buf[baddr].fa) {
284   - fa = hSession->ea_buf[baddr].fa;
285   - }
286   -
287   - if(all || hSession->text[baddr].attr & LIB3270_ATTR_SELECTED)
288   - {
289   - if(tok && attr != hSession->text[baddr].attr)
290   - {
291   - attr = hSession->text[baddr].attr;
292   - ret[sz++] = tok;
293   - ret[sz++] = (attr & 0x0F);
294   - ret[sz++] = ((attr & 0xF0) >> 4);
295   -
296   - }
297   -
298   - cr++;
299   - ret[sz++] = hSession->text[baddr].chr;
300   -
301   - if(cut && !FA_IS_PROTECTED(fa)) {
302   - clear_chr(hSession,baddr);
303   - }
304   -
305   - }
306   - baddr++;
307   - }
308   -
309   - if(cr)
310   - ret[sz++] = '\n';
311   -
312   - if((sz+10) > buflen)
313   - {
314   - buflen += 100;
315   - ret = lib3270_realloc(ret,buflen);
316   - }
317   - }
318   -
319   - if(!sz)
320   - {
321   - lib3270_free(ret);
322   - errno = ENOENT;
323   - return NULL;
324   - }
325   - else if(sz > 1 && ret[sz-1] == '\n') // Remove ending \n
326   - {
327   - ret[sz-1] = 0;
328   - }
329   -
330   - ret[sz++] = 0;
331   -
332   - if(sz != buflen)
333   - ret = lib3270_realloc(ret,sz);
334   -
335   - return ret;
336   -}
337   -*/
338   -
339 243 LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, unsigned char all)
340 244 {
341 245 char * text;
... ... @@ -470,3 +374,56 @@ LIB3270_EXPORT int lib3270_has_selection(H3270 *hSession)
470 374  
471 375 return hSession->selected != 0;
472 376 }
  377 +
  378 +LIB3270_EXPORT int lib3270_get_selection_rectangle(H3270 *hSession, unsigned int *col, unsigned int *row, unsigned int *width, unsigned int *height)
  379 +{
  380 + unsigned int r, c, minRow, minCol, maxRow, maxCol, baddr, count;
  381 +
  382 + if(check_online_session(hSession))
  383 + return errno;
  384 +
  385 + if(!hSession->selected || hSession->select.start == hSession->select.end)
  386 + return errno = ENOENT;
  387 +
  388 + minRow = hSession->rows;
  389 + minCol = hSession->cols;
  390 + maxRow = 0;
  391 + maxCol = 0;
  392 + baddr = 0;
  393 + count = 0;
  394 +
  395 + for(r=0;r < hSession->rows;r++)
  396 + {
  397 + for(c = 0; c < hSession->cols;c++)
  398 + {
  399 + if(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED)
  400 + {
  401 + count++;
  402 +
  403 + if(c < minCol)
  404 + minCol = c;
  405 +
  406 + if(r < minRow)
  407 + minRow = r;
  408 +
  409 + if(c > maxCol)
  410 + maxCol = c;
  411 +
  412 + if(r > maxRow)
  413 + maxRow = r;
  414 + }
  415 + baddr++;
  416 + }
  417 + }
  418 +
  419 + if(!count)
  420 + return errno = ENOENT;
  421 +
  422 + *col = minCol;
  423 + *row = minRow;
  424 + *width = (maxCol - minCol);
  425 + *height = (maxRow - minRow);
  426 +
  427 + return 0;
  428 +}
  429 +
... ...