Commit 9ad7fc9633db7baf8ae86aab3e6b78a96e8de743
1 parent
0e277129
Exists in
master
and in
3 other branches
Updating selection mechanism.
Showing
1 changed file
with
7 additions
and
160 deletions
Show diff stats
src/lib3270/selection/selection.c
@@ -58,7 +58,6 @@ static void update_selected_rectangle(H3270 *session) | @@ -58,7 +58,6 @@ static void update_selected_rectangle(H3270 *session) | ||
58 | int col; | 58 | int col; |
59 | } p[2]; | 59 | } p[2]; |
60 | 60 | ||
61 | - | ||
62 | int begin, end, row, col, baddr; | 61 | int begin, end, row, col, baddr; |
63 | 62 | ||
64 | get_selected_addr(session,&begin,&end); | 63 | get_selected_addr(session,&begin,&end); |
@@ -263,11 +262,11 @@ static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok, Boo | @@ -263,11 +262,11 @@ static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok, Boo | ||
263 | size_t sz = 0; | 262 | size_t sz = 0; |
264 | unsigned short attr = 0xFFFF; | 263 | unsigned short attr = 0xFFFF; |
265 | 264 | ||
266 | - if(!(lib3270_connected(hSession) && hSession->text)) | ||
267 | - { | ||
268 | - errno = ENOTCONN; | 265 | + if(check_online_session(hSession)) |
266 | + return NULL; | ||
267 | + | ||
268 | + if(!hSession->selected || hSession->select.start == hSession->select.end) | ||
269 | return NULL; | 269 | return NULL; |
270 | - } | ||
271 | 270 | ||
272 | ret = lib3270_malloc(buflen); | 271 | ret = lib3270_malloc(buflen); |
273 | 272 | ||
@@ -466,171 +465,19 @@ LIB3270_EXPORT char * lib3270_get_field_text_at(H3270 *session, int baddr) | @@ -466,171 +465,19 @@ LIB3270_EXPORT char * lib3270_get_field_text_at(H3270 *session, int baddr) | ||
466 | 465 | ||
467 | LIB3270_EXPORT int lib3270_has_selection(H3270 *hSession) | 466 | LIB3270_EXPORT int lib3270_has_selection(H3270 *hSession) |
468 | { | 467 | { |
469 | - CHECK_SESSION_HANDLE(hSession); | 468 | + if(check_online_session(hSession)) |
469 | + return 0; | ||
470 | + | ||
470 | return hSession->selected != 0; | 471 | return hSession->selected != 0; |
471 | } | 472 | } |
472 | 473 | ||
473 | LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | 474 | LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) |
474 | { | 475 | { |
475 | - CHECK_SESSION_HANDLE(hSession); | ||
476 | - | ||
477 | - if(!hSession->selected || hSession->select.start == hSession->select.end) | ||
478 | - return NULL; | ||
479 | - | ||
480 | - if(!lib3270_connected(hSession)) | ||
481 | - return NULL; | ||
482 | - | ||
483 | return get_text(hSession,0,0,0); | 476 | return get_text(hSession,0,0,0); |
484 | } | 477 | } |
485 | 478 | ||
486 | LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | 479 | LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
487 | { | 480 | { |
488 | - CHECK_SESSION_HANDLE(hSession); | ||
489 | - | ||
490 | - if(!hSession->selected || hSession->select.start == hSession->select.end) | ||
491 | - return NULL; | ||
492 | - | ||
493 | - if(!lib3270_connected(hSession)) | ||
494 | - return NULL; | ||
495 | - | ||
496 | return get_text(hSession,0,0,1); | 481 | return get_text(hSession,0,0,1); |
497 | } | 482 | } |
498 | 483 | ||
499 | -/* | ||
500 | - | ||
501 | -LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | ||
502 | -{ | ||
503 | - return cut_text(hSession,0); | ||
504 | -} | ||
505 | - | ||
506 | -static void copy_chr(H3270 *hSession, int from, int to) | ||
507 | -{ | ||
508 | - if(hSession->text[from].chr == hSession->text[to].chr) | ||
509 | - return; | ||
510 | - | ||
511 | - hSession->text[to].chr = hSession->text[from].chr; | ||
512 | - | ||
513 | - memcpy(&hSession->ea_buf[to], &hSession->ea_buf[from],sizeof(struct lib3270_ea)); | ||
514 | - hSession->ea_buf[from].fa = 0; | ||
515 | - | ||
516 | - hSession->cbk.update( hSession, | ||
517 | - to, | ||
518 | - hSession->text[to].chr, | ||
519 | - hSession->text[to].attr, | ||
520 | - to == hSession->cursor_addr ); | ||
521 | -} | ||
522 | - | ||
523 | -int cut_addr(H3270 *hSession, int daddr, int saddr, int maxlen, int *sattr) | ||
524 | -{ | ||
525 | - if(hSession->ea_buf[saddr].fa) | ||
526 | - *sattr = hSession->ea_buf[saddr++].fa; | ||
527 | - | ||
528 | - if(FA_IS_PROTECTED(*sattr) || saddr >= maxlen) | ||
529 | - clear_chr(hSession,daddr); | ||
530 | - else | ||
531 | - copy_chr(hSession,saddr++,daddr); | ||
532 | - | ||
533 | - return saddr; | ||
534 | -} | ||
535 | - | ||
536 | -char * cut_text(H3270 *hSession, char tok) | ||
537 | -{ | ||
538 | - unsigned short attr = 0xFFFF; | ||
539 | - | ||
540 | - CHECK_SESSION_HANDLE(hSession); | ||
541 | - | ||
542 | - if(!hSession->selected || hSession->select.start == hSession->select.end) | ||
543 | - return NULL; | ||
544 | - | ||
545 | - if(!(lib3270_connected(hSession) && hSession->text)) | ||
546 | - return NULL; | ||
547 | - | ||
548 | - trace("Rectangle select is %s",lib3270_get_toggle(hSession,LIB3270_TOGGLE_RECTANGLE_SELECT) ? "Active" : "Inactive"); | ||
549 | - | ||
550 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_RECTANGLE_SELECT)) | ||
551 | - { | ||
552 | - // Rectangle cut is not implemented | ||
553 | - lib3270_popup_dialog(hSession, LIB3270_NOTIFY_INFO, _( "Not available" ), _( "Invalid cut action" ), "%s", _( "Can't cut rectangular regions") ); | ||
554 | - } | ||
555 | - else | ||
556 | - { | ||
557 | - int end; | ||
558 | - size_t szText; | ||
559 | - size_t buflen; | ||
560 | - size_t bufpos = 0; | ||
561 | - int daddr; // Destination addr | ||
562 | - int dattr; // Destination addr attribute | ||
563 | - int saddr; // Source addr (First field after the selected area) | ||
564 | - int sattr; // Source addr attribute | ||
565 | - char *text; | ||
566 | - size_t maxlen = hSession->rows * hSession->cols; | ||
567 | - size_t f; | ||
568 | - | ||
569 | - get_selected_addr(hSession,&daddr,&end); | ||
570 | - | ||
571 | - lib3270_set_cursor_address(hSession,daddr); | ||
572 | - | ||
573 | - if(daddr >= end) | ||
574 | - return NULL; | ||
575 | - | ||
576 | - dattr = lib3270_field_attribute(hSession,daddr); // Get first attribute | ||
577 | - | ||
578 | - szText = (end-daddr)+1; | ||
579 | - buflen = szText; | ||
580 | - bufpos = 0; | ||
581 | - | ||
582 | - text = lib3270_malloc(buflen+1); | ||
583 | - | ||
584 | - saddr = daddr+szText; | ||
585 | - sattr = lib3270_field_attribute(hSession,saddr); | ||
586 | - | ||
587 | - for(f=0;f<szText;f++) | ||
588 | - { | ||
589 | - if(hSession->ea_buf[daddr].fa) | ||
590 | - dattr = hSession->ea_buf[daddr].fa; | ||
591 | - | ||
592 | - if((bufpos+10) > buflen) | ||
593 | - { | ||
594 | - buflen += 100; | ||
595 | - text = lib3270_realloc(text,buflen); | ||
596 | - } | ||
597 | - | ||
598 | - if(tok && attr != hSession->text[daddr].attr) | ||
599 | - { | ||
600 | - attr = hSession->text[daddr].attr; | ||
601 | - text[bufpos++] = tok; | ||
602 | - text[bufpos++] = (attr & 0x0F); | ||
603 | - text[bufpos++] = ((attr & 0xF0) >> 4); | ||
604 | - } | ||
605 | - | ||
606 | - text[bufpos++] = hSession->text[daddr].chr; | ||
607 | - | ||
608 | - if(!FA_IS_PROTECTED(dattr)) | ||
609 | - saddr = cut_addr(hSession,daddr,saddr,maxlen,&sattr); | ||
610 | - | ||
611 | - daddr++; | ||
612 | - } | ||
613 | - | ||
614 | - text[bufpos++] = 0; | ||
615 | - text = lib3270_realloc(text,bufpos); | ||
616 | - | ||
617 | - // Move contents of the current field | ||
618 | - while(daddr < (int) (maxlen-1) && !hSession->ea_buf[daddr].fa) | ||
619 | - { | ||
620 | - saddr = cut_addr(hSession,daddr,saddr,maxlen,&sattr); | ||
621 | - daddr++; | ||
622 | - } | ||
623 | - | ||
624 | - if(!hSession->ea_buf[daddr].fa) | ||
625 | - clear_chr(hSession,daddr); | ||
626 | - | ||
627 | - hSession->cbk.changed(hSession,0,maxlen); | ||
628 | - | ||
629 | - lib3270_unselect(hSession); | ||
630 | - return text; | ||
631 | - } | ||
632 | - | ||
633 | - return NULL; | ||
634 | -} | ||
635 | - | ||
636 | -*/ |