Commit 73de0f1c05ceb51390004eb1bd28f04fa8f8159a
1 parent
b0534ef4
Exists in
master
and in
3 other branches
Adding method to get a rectangle with the selected region.
Showing
4 changed files
with
69 additions
and
98 deletions
Show diff stats
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
src/lib3270/selection/get.c
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 | + | ... | ... |