Commit 7c8e110b28c52dbb54f2b5d52b7d700b52288f30
1 parent
05e7e63d
Exists in
master
and in
3 other branches
Iniciando implementação de seleção acessível
Showing
1 changed file
with
52 additions
and
9 deletions
Show diff stats
selection.c
... | ... | @@ -407,6 +407,41 @@ static char * get_text(H3270 *hSession,unsigned char all) |
407 | 407 | return ret; |
408 | 408 | } |
409 | 409 | |
410 | +LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, unsigned char all) | |
411 | +{ | |
412 | + char * text; | |
413 | + int maxlen; | |
414 | + int sz = 0; | |
415 | + int baddr; | |
416 | + | |
417 | + CHECK_SESSION_HANDLE(h); | |
418 | + | |
419 | + if(!lib3270_connected(h)) | |
420 | + return NULL; | |
421 | + | |
422 | + maxlen = h->rows * (h->cols+1); | |
423 | + | |
424 | + if(start_pos < 0 || start_pos > maxlen || end_pos < 0 || end_pos > maxlen || end_pos < start_pos) | |
425 | + return NULL; | |
426 | + | |
427 | + text = malloc(maxlen); | |
428 | + | |
429 | + for(baddr=start_pos;baddr<end_pos;baddr++) | |
430 | + { | |
431 | + if(all || h->text[baddr].attr & LIB3270_ATTR_SELECTED) | |
432 | + text[sz++] = (h->text[baddr].attr & LIB3270_ATTR_CG) ? ' ' : h->text[baddr].chr; | |
433 | + | |
434 | + if((baddr%h->cols) == 0 && sz > 0) | |
435 | + text[sz++] = '\n'; | |
436 | + } | |
437 | + text[sz++] = 0; | |
438 | + | |
439 | + return realloc(text,sz); | |
440 | +} | |
441 | + | |
442 | + | |
443 | + | |
444 | + | |
410 | 445 | LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) |
411 | 446 | { |
412 | 447 | char * buffer; |
... | ... | @@ -468,25 +503,33 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) |
468 | 503 | return get_text(hSession,0); |
469 | 504 | } |
470 | 505 | |
471 | -LIB3270_EXPORT int lib3270_get_selected_addr(H3270 *hSession, int *begin, int *end) | |
506 | +LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end) | |
472 | 507 | { |
508 | + int first, last; | |
509 | + | |
473 | 510 | CHECK_SESSION_HANDLE(hSession); |
474 | 511 | |
475 | 512 | if(!hSession->selected || hSession->select.begin == hSession->select.end) |
476 | - return -1; | |
513 | + return 0; | |
477 | 514 | |
478 | 515 | if(hSession->select.end > hSession->select.begin) |
479 | 516 | { |
480 | - *begin = hSession->select.begin; | |
481 | - *end = hSession->select.end; | |
517 | + first = hSession->select.begin; | |
518 | + last = hSession->select.end; | |
482 | 519 | } |
483 | 520 | else |
484 | 521 | { |
485 | - *begin = hSession->select.end; | |
486 | - *end = hSession->select.begin; | |
522 | + first = hSession->select.end; | |
523 | + last = hSession->select.begin; | |
487 | 524 | } |
488 | 525 | |
489 | - return 0; | |
526 | + if(start) | |
527 | + *start = first; | |
528 | + | |
529 | + if(end) | |
530 | + *end = last; | |
531 | + | |
532 | + return 1; | |
490 | 533 | } |
491 | 534 | |
492 | 535 | LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) |
... | ... | @@ -494,7 +537,7 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) |
494 | 537 | int pos[2]; |
495 | 538 | int rows, cols, f, step; |
496 | 539 | |
497 | - if(lib3270_get_selected_addr(hSession,&pos[0],&pos[1])) | |
540 | + if(!lib3270_get_selection_bounds(hSession,&pos[0],&pos[1])) | |
498 | 541 | return from; |
499 | 542 | |
500 | 543 | rows = (to / hSession->cols) - (from / hSession->cols); |
... | ... | @@ -533,7 +576,7 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig |
533 | 576 | { |
534 | 577 | int first, last, row, col; |
535 | 578 | |
536 | - if(lib3270_get_selected_addr(h,&first,&last)) | |
579 | + if(!lib3270_get_selection_bounds(h,&first,&last)) | |
537 | 580 | return origin; |
538 | 581 | |
539 | 582 | flag &= 0x1f; | ... | ... |