Commit 803eba3bce9ddcadce8c854ade0d87921b471aa9
1 parent
48355f11
Exists in
master
and in
3 other branches
Adjusments on preparation for oversize support.
Showing
24 changed files
with
582 additions
and
422 deletions
Show diff stats
lib3270.cbp
... | ... | @@ -110,6 +110,9 @@ |
110 | 110 | <Unit filename="src/core/log.c"> |
111 | 111 | <Option compilerVar="CC" /> |
112 | 112 | </Unit> |
113 | + <Unit filename="src/core/model.c"> | |
114 | + <Option compilerVar="CC" /> | |
115 | + </Unit> | |
113 | 116 | <Unit filename="src/core/options.c"> |
114 | 117 | <Option compilerVar="CC" /> |
115 | 118 | </Unit> | ... | ... |
src/core/ansi.c
... | ... | @@ -533,10 +533,10 @@ static enum lib3270_ansi_state ansi_newline(H3270 *hSession, int GNUC_UNUSED(ig1 |
533 | 533 | { |
534 | 534 | int nc; |
535 | 535 | |
536 | - cursor_move(hSession,hSession->cursor_addr - (hSession->cursor_addr % hSession->cols)); | |
537 | - nc = hSession->cursor_addr + hSession->cols; | |
536 | + cursor_move(hSession,hSession->cursor_addr - (hSession->cursor_addr % hSession->view.cols)); | |
537 | + nc = hSession->cursor_addr + hSession->view.cols; | |
538 | 538 | |
539 | - if (nc < hSession->scroll_bottom * hSession->cols) | |
539 | + if (nc < hSession->scroll_bottom * hSession->view.cols) | |
540 | 540 | cursor_move(hSession,nc); |
541 | 541 | else |
542 | 542 | ansi_scroll(hSession); |
... | ... | @@ -552,11 +552,11 @@ ansi_cursor_up(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
552 | 552 | |
553 | 553 | if (nn < 1) |
554 | 554 | nn = 1; |
555 | - rr = hSession->cursor_addr / hSession->cols; | |
555 | + rr = hSession->cursor_addr / hSession->view.cols; | |
556 | 556 | if (rr - nn < 0) |
557 | - cursor_move(hSession, hSession->cursor_addr % hSession->cols); | |
557 | + cursor_move(hSession, hSession->cursor_addr % hSession->view.cols); | |
558 | 558 | else |
559 | - cursor_move(hSession, hSession->cursor_addr - (nn * hSession->cols)); | |
559 | + cursor_move(hSession, hSession->cursor_addr - (nn * hSession->view.cols)); | |
560 | 560 | hSession->held_wrap = 0; |
561 | 561 | return DATA; |
562 | 562 | } |
... | ... | @@ -607,17 +607,17 @@ static enum lib3270_ansi_state ansi_reset(H3270 *hSession, int GNUC_UNUSED(ig1), |
607 | 607 | hSession->saved_altbuffer = 0; |
608 | 608 | |
609 | 609 | hSession->scroll_top = 1; |
610 | - hSession->scroll_bottom = hSession->rows; | |
610 | + hSession->scroll_bottom = hSession->view.rows; | |
611 | 611 | |
612 | - Replace(hSession->tabs, (unsigned char *)lib3270_malloc((hSession->cols+7)/8)); | |
613 | - for (i = 0; i < (hSession->cols+7)/8; i++) | |
612 | + Replace(hSession->tabs, (unsigned char *)lib3270_malloc((hSession->view.cols+7)/8)); | |
613 | + for (i = 0; i < (hSession->view.cols+7)/8; i++) | |
614 | 614 | hSession->tabs[i] = 0x01; |
615 | 615 | |
616 | 616 | hSession->held_wrap = 0; |
617 | 617 | if (!hSession->ansi_reset) |
618 | 618 | { |
619 | 619 | ctlr_altbuffer(hSession,True); |
620 | - ctlr_aclear(hSession, 0, hSession->rows * hSession->cols, 1); | |
620 | + ctlr_aclear(hSession, 0, hSession->view.rows * hSession->view.cols, 1); | |
621 | 621 | ctlr_altbuffer(hSession,False); |
622 | 622 | ctlr_clear(hSession,False); |
623 | 623 | hSession->cbk.set_width(hSession,80); |
... | ... | @@ -630,8 +630,8 @@ static enum lib3270_ansi_state ansi_reset(H3270 *hSession, int GNUC_UNUSED(ig1), |
630 | 630 | static enum lib3270_ansi_state |
631 | 631 | ansi_insert_chars(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
632 | 632 | { |
633 | - int cc = hSession->cursor_addr % hSession->cols; /* current col */ | |
634 | - int mc = hSession->cols - cc; /* max chars that can be inserted */ | |
633 | + int cc = hSession->cursor_addr % hSession->view.cols; /* current col */ | |
634 | + int mc = hSession->view.cols - cc; /* max chars that can be inserted */ | |
635 | 635 | int ns; /* chars that are shifting */ |
636 | 636 | |
637 | 637 | if (nn < 1) |
... | ... | @@ -656,11 +656,11 @@ ansi_cursor_down(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
656 | 656 | |
657 | 657 | if (nn < 1) |
658 | 658 | nn = 1; |
659 | - rr = hSession->cursor_addr / hSession->cols; | |
660 | - if (rr + nn >= hSession->cols) | |
661 | - cursor_move(hSession,(hSession->cols-1)*hSession->cols + (hSession->cursor_addr%hSession->cols)); | |
659 | + rr = hSession->cursor_addr / hSession->view.cols; | |
660 | + if (rr + nn >= hSession->view.cols) | |
661 | + cursor_move(hSession,(hSession->view.cols-1)*hSession->view.cols + (hSession->cursor_addr % hSession->view.cols)); | |
662 | 662 | else |
663 | - cursor_move(hSession,hSession->cursor_addr + (nn * hSession->cols)); | |
663 | + cursor_move(hSession,hSession->cursor_addr + (nn * hSession->view.cols)); | |
664 | 664 | hSession->held_wrap = 0; |
665 | 665 | return DATA; |
666 | 666 | } |
... | ... | @@ -671,11 +671,11 @@ static enum lib3270_ansi_state ansi_cursor_right(H3270 *hSession, int nn, int GN |
671 | 671 | |
672 | 672 | if (nn < 1) |
673 | 673 | nn = 1; |
674 | - cc = hSession->cursor_addr % hSession->cols; | |
675 | - if (cc == hSession->cols-1) | |
674 | + cc = hSession->cursor_addr % hSession->view.cols; | |
675 | + if (cc == hSession->view.cols-1) | |
676 | 676 | return DATA; |
677 | - if (cc + nn >= hSession->cols) | |
678 | - nn = hSession->cols - 1 - cc; | |
677 | + if (cc + nn >= hSession->view.cols) | |
678 | + nn = hSession->view.cols - 1 - cc; | |
679 | 679 | cursor_move(hSession,hSession->cursor_addr + nn); |
680 | 680 | hSession->held_wrap = 0; |
681 | 681 | return DATA; |
... | ... | @@ -693,7 +693,7 @@ ansi_cursor_left(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
693 | 693 | } |
694 | 694 | if (nn < 1) |
695 | 695 | nn = 1; |
696 | - cc = hSession->cursor_addr % hSession->cols; | |
696 | + cc = hSession->cursor_addr % hSession->view.cols; | |
697 | 697 | if (!cc) |
698 | 698 | return DATA; |
699 | 699 | if (nn > cc) |
... | ... | @@ -706,10 +706,10 @@ static enum lib3270_ansi_state |
706 | 706 | ansi_cursor_motion(H3270 *hSession, int n1, int n2) |
707 | 707 | { |
708 | 708 | if (n1 < 1) n1 = 1; |
709 | - if (n1 > hSession->rows) n1 = hSession->rows; | |
709 | + if (n1 > hSession->view.rows) n1 = hSession->view.rows; | |
710 | 710 | if (n2 < 1) n2 = 1; |
711 | - if (n2 > hSession->cols) n2 = hSession->cols; | |
712 | - cursor_move(hSession,(n1 - 1) * hSession->cols + (n2 - 1)); | |
711 | + if (n2 > hSession->view.cols) n2 = hSession->view.cols; | |
712 | + cursor_move(hSession,(n1 - 1) * hSession->view.cols + (n2 - 1)); | |
713 | 713 | hSession->held_wrap = 0; |
714 | 714 | return DATA; |
715 | 715 | } |
... | ... | @@ -719,14 +719,14 @@ ansi_erase_in_display(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
719 | 719 | { |
720 | 720 | switch (nn) { |
721 | 721 | case 0: /* below */ |
722 | - ctlr_aclear(hSession, hSession->cursor_addr, (hSession->rows * hSession->cols) - hSession->cursor_addr, 1); | |
722 | + ctlr_aclear(hSession, hSession->cursor_addr, (hSession->view.rows * hSession->view.cols) - hSession->cursor_addr, 1); | |
723 | 723 | break; |
724 | 724 | case 1: /* above */ |
725 | 725 | ctlr_aclear(hSession, 0, hSession->cursor_addr + 1, 1); |
726 | 726 | break; |
727 | 727 | case 2: /* all (without moving cursor) */ |
728 | 728 | // if (hSession->cursor_addr == 0 && !hSession->is_altbuffer) scroll_save(hSession->rows, True); |
729 | - ctlr_aclear(hSession, 0, hSession->rows * hSession->cols, 1); | |
729 | + ctlr_aclear(hSession, 0, hSession->view.rows * hSession->view.cols, 1); | |
730 | 730 | break; |
731 | 731 | } |
732 | 732 | return DATA; |
... | ... | @@ -735,17 +735,17 @@ ansi_erase_in_display(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
735 | 735 | static enum lib3270_ansi_state |
736 | 736 | ansi_erase_in_line(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
737 | 737 | { |
738 | - int nc = hSession->cursor_addr % hSession->cols; | |
738 | + int nc = hSession->cursor_addr % hSession->view.cols; | |
739 | 739 | |
740 | 740 | switch (nn) { |
741 | 741 | case 0: /* to right */ |
742 | - ctlr_aclear(hSession, hSession->cursor_addr, hSession->cols - nc, 1); | |
742 | + ctlr_aclear(hSession, hSession->cursor_addr, hSession->view.cols - nc, 1); | |
743 | 743 | break; |
744 | 744 | case 1: /* to left */ |
745 | 745 | ctlr_aclear(hSession, hSession->cursor_addr - nc, nc+1, 1); |
746 | 746 | break; |
747 | 747 | case 2: /* all */ |
748 | - ctlr_aclear(hSession, hSession->cursor_addr - nc, hSession->cols, 1); | |
748 | + ctlr_aclear(hSession, hSession->cursor_addr - nc, hSession->view.cols, 1); | |
749 | 749 | break; |
750 | 750 | } |
751 | 751 | return DATA; |
... | ... | @@ -754,7 +754,7 @@ ansi_erase_in_line(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
754 | 754 | static enum lib3270_ansi_state |
755 | 755 | ansi_insert_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
756 | 756 | { |
757 | - int rr = hSession->cursor_addr / hSession->cols; /* current row */ | |
757 | + int rr = hSession->cursor_addr / hSession->view.cols; /* current row */ | |
758 | 758 | int mr = hSession->scroll_bottom - rr; /* rows left at and below this one */ |
759 | 759 | int ns; /* rows that are shifting */ |
760 | 760 | |
... | ... | @@ -770,17 +770,17 @@ ansi_insert_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
770 | 770 | /* Move the victims down */ |
771 | 771 | ns = mr - nn; |
772 | 772 | if (ns) |
773 | - ctlr_bcopy(hSession,rr * hSession->cols, (rr + nn) * hSession->cols, ns * hSession->cols, 1); | |
773 | + ctlr_bcopy(hSession,rr * hSession->view.cols, (rr + nn) * hSession->view.cols, ns * hSession->view.cols, 1); | |
774 | 774 | |
775 | 775 | /* Clear the middle of the screen */ |
776 | - ctlr_aclear(hSession, rr * hSession->cols, nn * hSession->cols, 1); | |
776 | + ctlr_aclear(hSession, rr * hSession->view.cols, nn * hSession->view.cols, 1); | |
777 | 777 | return DATA; |
778 | 778 | } |
779 | 779 | |
780 | 780 | static enum lib3270_ansi_state |
781 | 781 | ansi_delete_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
782 | 782 | { |
783 | - int rr = hSession->cursor_addr / hSession->cols; /* current row */ | |
783 | + int rr = hSession->cursor_addr / hSession->view.cols; /* current row */ | |
784 | 784 | int mr = hSession->scroll_bottom - rr; /* max rows that can be deleted */ |
785 | 785 | int ns; /* rows that are shifting */ |
786 | 786 | |
... | ... | @@ -796,19 +796,19 @@ ansi_delete_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
796 | 796 | /* Move the surviving rows up */ |
797 | 797 | ns = mr - nn; |
798 | 798 | if (ns) |
799 | - ctlr_bcopy(hSession,(rr + nn) * hSession->cols, rr * hSession->cols, ns * hSession->cols, 1); | |
799 | + ctlr_bcopy(hSession,(rr + nn) * hSession->view.cols, rr * hSession->view.cols, ns * hSession->view.cols, 1); | |
800 | 800 | |
801 | 801 | /* Clear the rest of the screen */ |
802 | - ctlr_aclear(hSession, (rr + ns) * hSession->cols, nn * hSession->cols, 1); | |
802 | + ctlr_aclear(hSession, (rr + ns) * hSession->view.cols, nn * hSession->view.cols, 1); | |
803 | 803 | return DATA; |
804 | 804 | } |
805 | 805 | |
806 | 806 | static enum lib3270_ansi_state |
807 | 807 | ansi_delete_chars(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
808 | 808 | { |
809 | - int cc = hSession->cursor_addr % hSession->cols; /* current col */ | |
810 | - int mc = hSession->cols - cc; /* max chars that can be deleted */ | |
811 | - int ns; /* chars that are shifting */ | |
809 | + int cc = hSession->cursor_addr % hSession->view.cols; /* current col */ | |
810 | + int mc = hSession->view.cols - cc; /* max chars that can be deleted */ | |
811 | + int ns; /* chars that are shifting */ | |
812 | 812 | |
813 | 813 | if (nn < 1) |
814 | 814 | nn = 1; |
... | ... | @@ -947,12 +947,12 @@ static enum lib3270_ansi_state ansi_backspace(H3270 *hSession, int GNUC_UNUSED(i |
947 | 947 | |
948 | 948 | if (hSession->rev_wraparound_mode) |
949 | 949 | { |
950 | - if (hSession->cursor_addr > (hSession->scroll_top - 1) * hSession->cols) | |
950 | + if (hSession->cursor_addr > (hSession->scroll_top - 1) * hSession->view.cols) | |
951 | 951 | cursor_move(hSession,hSession->cursor_addr - 1); |
952 | 952 | } |
953 | 953 | else |
954 | 954 | { |
955 | - if (hSession->cursor_addr % hSession->cols) | |
955 | + if (hSession->cursor_addr % hSession->view.cols) | |
956 | 956 | cursor_move(hSession,hSession->cursor_addr - 1); |
957 | 957 | } |
958 | 958 | return DATA; |
... | ... | @@ -960,8 +960,8 @@ static enum lib3270_ansi_state ansi_backspace(H3270 *hSession, int GNUC_UNUSED(i |
960 | 960 | |
961 | 961 | static enum lib3270_ansi_state ansi_cr(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) |
962 | 962 | { |
963 | - if (hSession->cursor_addr % hSession->cols) | |
964 | - cursor_move(hSession,hSession->cursor_addr - (hSession->cursor_addr % hSession->cols)); | |
963 | + if (hSession->cursor_addr % hSession->view.cols) | |
964 | + cursor_move(hSession,hSession->cursor_addr - (hSession->cursor_addr % hSession->view.cols)); | |
965 | 965 | |
966 | 966 | if (hSession->auto_newline_mode) |
967 | 967 | (void) ansi_lf(hSession, 0, 0); |
... | ... | @@ -972,19 +972,19 @@ static enum lib3270_ansi_state ansi_cr(H3270 *hSession, int GNUC_UNUSED(ig1), in |
972 | 972 | |
973 | 973 | static enum lib3270_ansi_state ansi_lf(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) |
974 | 974 | { |
975 | - int nc = hSession->cursor_addr + hSession->cols; | |
975 | + int nc = hSession->cursor_addr + hSession->view.cols; | |
976 | 976 | |
977 | 977 | hSession->held_wrap = 0; |
978 | 978 | |
979 | 979 | // If we're below the scrolling region, don't scroll. |
980 | - if((hSession->cursor_addr / hSession->cols) >= hSession->scroll_bottom) | |
980 | + if((hSession->cursor_addr / hSession->view.cols) >= hSession->scroll_bottom) | |
981 | 981 | { |
982 | - if (nc < hSession->rows * hSession->cols) | |
982 | + if (nc < hSession->view.rows * hSession->view.cols) | |
983 | 983 | cursor_move(hSession,nc); |
984 | 984 | return DATA; |
985 | 985 | } |
986 | 986 | |
987 | - if (nc < hSession->scroll_bottom * hSession->cols) | |
987 | + if (nc < hSession->scroll_bottom * hSession->view.cols) | |
988 | 988 | cursor_move(hSession,nc); |
989 | 989 | else |
990 | 990 | ansi_scroll(hSession); |
... | ... | @@ -993,13 +993,13 @@ static enum lib3270_ansi_state ansi_lf(H3270 *hSession, int GNUC_UNUSED(ig1), in |
993 | 993 | |
994 | 994 | static enum lib3270_ansi_state ansi_htab(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) |
995 | 995 | { |
996 | - int col = hSession->cursor_addr % hSession->cols; | |
996 | + int col = hSession->cursor_addr % hSession->view.cols; | |
997 | 997 | int i; |
998 | 998 | |
999 | 999 | hSession->held_wrap = 0; |
1000 | - if (col == hSession->cols-1) | |
1000 | + if (col == hSession->view.cols-1) | |
1001 | 1001 | return DATA; |
1002 | - for (i = col+1; i < hSession->cols-1; i++) | |
1002 | + for (i = col+1; i < hSession->view.cols-1; i++) | |
1003 | 1003 | if (hSession->tabs[i/8] & 1<<(i%8)) |
1004 | 1004 | break; |
1005 | 1005 | cursor_move(hSession,hSession->cursor_addr - col + i); |
... | ... | @@ -1018,14 +1018,14 @@ static enum lib3270_ansi_state ansi_nop(H3270 GNUC_UNUSED(*hSession), int GNUC_U |
1018 | 1018 | |
1019 | 1019 | #define PWRAP { \ |
1020 | 1020 | nc = hSession->cursor_addr + 1; \ |
1021 | - if (nc < hSession->scroll_bottom * hSession->cols) \ | |
1021 | + if (nc < hSession->scroll_bottom * hSession->view.cols) \ | |
1022 | 1022 | cursor_move(hSession,nc); \ |
1023 | 1023 | else { \ |
1024 | - if (hSession->cursor_addr / hSession->cols >= hSession->scroll_bottom) \ | |
1025 | - cursor_move(hSession,hSession->cursor_addr / hSession->cols * hSession->cols); \ | |
1024 | + if (hSession->cursor_addr / hSession->view.cols >= hSession->scroll_bottom) \ | |
1025 | + cursor_move(hSession,hSession->cursor_addr / hSession->view.cols * hSession->view.cols); \ | |
1026 | 1026 | else { \ |
1027 | 1027 | ansi_scroll(hSession); \ |
1028 | - cursor_move(hSession,nc - hSession->cols); \ | |
1028 | + cursor_move(hSession,nc - hSession->view.cols); \ | |
1029 | 1029 | } \ |
1030 | 1030 | } \ |
1031 | 1031 | } |
... | ... | @@ -1198,13 +1198,13 @@ ansi_printing(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) |
1198 | 1198 | * In my opinion, very strange, but among other things, 'vi' |
1199 | 1199 | * depends on it! |
1200 | 1200 | */ |
1201 | - if (!((hSession->cursor_addr + 1) % hSession->cols)) { | |
1201 | + if (!((hSession->cursor_addr + 1) % hSession->view.cols)) { | |
1202 | 1202 | hSession->held_wrap = 1; |
1203 | 1203 | } else { |
1204 | 1204 | PWRAP; |
1205 | 1205 | } |
1206 | 1206 | } else { |
1207 | - if ((hSession->cursor_addr % hSession->cols) != (hSession->cols - 1)) | |
1207 | + if ((hSession->cursor_addr % hSession->view.cols) != (hSession->view.cols - 1)) | |
1208 | 1208 | cursor_move(hSession,hSession->cursor_addr + 1); |
1209 | 1209 | } |
1210 | 1210 | return DATA; |
... | ... | @@ -1277,10 +1277,10 @@ static enum lib3270_ansi_state ansi_digit(H3270 *hSession, int GNUC_UNUSED(ig1), |
1277 | 1277 | |
1278 | 1278 | static enum lib3270_ansi_state ansi_reverse_index(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) |
1279 | 1279 | { |
1280 | - int rr = hSession->cursor_addr / hSession->cols; /* current row */ | |
1281 | - int np = (hSession->scroll_top - 1) - rr; /* number of rows in the scrolling region, above this line */ | |
1282 | - int ns; /* number of rows to scroll */ | |
1283 | - int nn = 1; /* number of rows to index */ | |
1280 | + int rr = hSession->cursor_addr / hSession->view.cols; /* current row */ | |
1281 | + int np = (hSession->scroll_top - 1) - rr; /* number of rows in the scrolling region, above this line */ | |
1282 | + int ns; /* number of rows to scroll */ | |
1283 | + int nn = 1; /* number of rows to index */ | |
1284 | 1284 | |
1285 | 1285 | hSession->held_wrap = 0; |
1286 | 1286 | |
... | ... | @@ -1360,7 +1360,7 @@ static enum lib3270_ansi_state ansi_status_report(H3270 *hSession, int nn, int G |
1360 | 1360 | break; |
1361 | 1361 | |
1362 | 1362 | case 6: |
1363 | - (void) snprintf(cpr, 22, "\033[%d;%dR",(hSession->cursor_addr/hSession->cols) + 1, (hSession->cursor_addr%hSession->cols) + 1); | |
1363 | + (void) snprintf(cpr, 22, "\033[%d;%dR",(hSession->cursor_addr/hSession->view.cols) + 1, (hSession->cursor_addr%hSession->view.cols) + 1); | |
1364 | 1364 | net_sends(hSession,cpr); |
1365 | 1365 | break; |
1366 | 1366 | } |
... | ... | @@ -1564,10 +1564,10 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom) |
1564 | 1564 | { |
1565 | 1565 | if (top < 1) |
1566 | 1566 | top = 1; |
1567 | - if (bottom > hSession->rows) | |
1568 | - bottom = hSession->rows; | |
1567 | + if (bottom > hSession->view.rows) | |
1568 | + bottom = hSession->view.rows; | |
1569 | 1569 | |
1570 | - if (top <= bottom && (top > 1 || bottom < hSession->rows)) | |
1570 | + if (top <= bottom && (top > 1 || bottom < hSession->view.rows)) | |
1571 | 1571 | { |
1572 | 1572 | hSession->scroll_top = top; |
1573 | 1573 | hSession->scroll_bottom = bottom; |
... | ... | @@ -1576,7 +1576,7 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom) |
1576 | 1576 | else |
1577 | 1577 | { |
1578 | 1578 | hSession->scroll_top = 1; |
1579 | - hSession->scroll_bottom = hSession->rows; | |
1579 | + hSession->scroll_bottom = hSession->view.rows; | |
1580 | 1580 | } |
1581 | 1581 | return DATA; |
1582 | 1582 | } |
... | ... | @@ -1651,7 +1651,7 @@ xterm_text_do(H3270 GNUC_UNUSED(*hSession), int GNUC_UNUSED(ig1), int GNUC_UNUSE |
1651 | 1651 | static enum lib3270_ansi_state |
1652 | 1652 | ansi_htab_set(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) |
1653 | 1653 | { |
1654 | - register int col = hSession->cursor_addr % hSession->cols; | |
1654 | + register int col = hSession->cursor_addr % hSession->view.cols; | |
1655 | 1655 | |
1656 | 1656 | hSession->tabs[col/8] |= 1<<(col%8); |
1657 | 1657 | return DATA; |
... | ... | @@ -1665,11 +1665,11 @@ ansi_htab_clear(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) |
1665 | 1665 | switch (nn) |
1666 | 1666 | { |
1667 | 1667 | case 0: |
1668 | - col = hSession->cursor_addr % hSession->cols; | |
1668 | + col = hSession->cursor_addr % hSession->view.cols; | |
1669 | 1669 | hSession->tabs[col/8] &= ~(1<<(col%8)); |
1670 | 1670 | break; |
1671 | 1671 | case 3: |
1672 | - for (i = 0; i < (hSession->cols+7)/8; i++) | |
1672 | + for (i = 0; i < (hSession->view.cols+7)/8; i++) | |
1673 | 1673 | hSession->tabs[i] = 0; |
1674 | 1674 | break; |
1675 | 1675 | } |
... | ... | @@ -1684,7 +1684,7 @@ static void ansi_scroll(H3270 *hSession) |
1684 | 1684 | hSession->held_wrap = 0; |
1685 | 1685 | |
1686 | 1686 | /* Save the top line */ |
1687 | - if (hSession->scroll_top == 1 && hSession->scroll_bottom == hSession->rows) | |
1687 | + if (hSession->scroll_top == 1 && hSession->scroll_bottom == hSession->view.rows) | |
1688 | 1688 | { |
1689 | 1689 | // if (!hSession->is_altbuffer) |
1690 | 1690 | // scroll_save(1, False); |
... | ... | @@ -1694,13 +1694,13 @@ static void ansi_scroll(H3270 *hSession) |
1694 | 1694 | |
1695 | 1695 | /* Scroll all but the last line up */ |
1696 | 1696 | if (hSession->scroll_bottom > hSession->scroll_top) |
1697 | - ctlr_bcopy(hSession,hSession->scroll_top * hSession->cols, | |
1698 | - (hSession->scroll_top - 1) * hSession->cols, | |
1699 | - (hSession->scroll_bottom - hSession->scroll_top) * hSession->cols, | |
1697 | + ctlr_bcopy(hSession,hSession->scroll_top * hSession->view.cols, | |
1698 | + (hSession->scroll_top - 1) * hSession->view.cols, | |
1699 | + (hSession->scroll_bottom - hSession->scroll_top) * hSession->view.cols, | |
1700 | 1700 | 1); |
1701 | 1701 | |
1702 | 1702 | /* Clear the last line */ |
1703 | - ctlr_aclear(hSession, (hSession->scroll_bottom - 1) * hSession->cols, hSession->cols, 1); | |
1703 | + ctlr_aclear(hSession, (hSession->scroll_bottom - 1) * hSession->view.cols, hSession->view.cols, 1); | |
1704 | 1704 | } |
1705 | 1705 | |
1706 | 1706 | /* Callback for when we enter ANSI mode. */ | ... | ... |
src/core/bounds.c
... | ... | @@ -61,7 +61,7 @@ LIB3270_EXPORT int lib3270_get_field_bounds(H3270 *hSession, int baddr, int *sta |
61 | 61 | |
62 | 62 | if(end) |
63 | 63 | { |
64 | - int maxlen = (hSession->rows * hSession->cols)-1; | |
64 | + int maxlen = (hSession->view.rows * hSession->view.cols)-1; | |
65 | 65 | *end = first + lib3270_field_length(hSession,first); |
66 | 66 | if(*end > maxlen) |
67 | 67 | *end = maxlen; |
... | ... | @@ -88,7 +88,7 @@ LIB3270_EXPORT int lib3270_get_word_bounds(H3270 *session, int baddr, int *start |
88 | 88 | |
89 | 89 | if(end) |
90 | 90 | { |
91 | - int maxlen = session->rows * session->cols; | |
91 | + int maxlen = session->view.rows * session->view.cols; | |
92 | 92 | for(pos = baddr; pos < maxlen && !isspace(session->text[pos].chr);pos++); |
93 | 93 | |
94 | 94 | *end = pos < maxlen ? pos-1 : maxlen; | ... | ... |
src/core/charset.c
... | ... | @@ -302,10 +302,10 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) |
302 | 302 | |
303 | 303 | trace("%s","Showing charset table"); |
304 | 304 | |
305 | - (void) memset((char *) hSession->ea_buf, 0, hSession->rows*hSession->cols*sizeof(struct lib3270_ea)); | |
305 | + (void) memset((char *) hSession->ea_buf, 0, hSession->view.rows * hSession->view.cols * sizeof(struct lib3270_ea)); | |
306 | 306 | |
307 | - baddr = margin_left+hSession->maxCOLS; | |
308 | - s = (hSession->maxCOLS * 0x11); | |
307 | + baddr = margin_left+hSession->max.cols; | |
308 | + s = (hSession->max.cols * 0x11); | |
309 | 309 | for(f=4;f<=0x0f;f++) |
310 | 310 | { |
311 | 311 | baddr += 2; |
... | ... | @@ -316,7 +316,7 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) |
316 | 316 | hSession->ea_buf[baddr+s].gr = hSession->ea_buf[baddr].gr = 0; |
317 | 317 | } |
318 | 318 | |
319 | - baddr = margin_left+(hSession->maxCOLS*2); | |
319 | + baddr = margin_left+(hSession->max.cols*2); | |
320 | 320 | s = 0x1a; |
321 | 321 | for(f=0;f<=0x0f;f++) |
322 | 322 | { |
... | ... | @@ -325,14 +325,14 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) |
325 | 325 | hSession->ea_buf[baddr+s].cs = hSession->ea_buf[baddr].cs = 0; |
326 | 326 | hSession->ea_buf[baddr+s].cc = hSession->ea_buf[baddr].cc = hSession->charset.asc2ebc[(int) hChars[f]]; |
327 | 327 | hSession->ea_buf[baddr+s].gr = hSession->ea_buf[baddr].gr = 0; |
328 | - baddr += hSession->maxCOLS; | |
328 | + baddr += hSession->max.cols; | |
329 | 329 | } |
330 | 330 | |
331 | 331 | chr = 0x40; |
332 | 332 | |
333 | 333 | for(f=0;f<0x0c;f++) |
334 | 334 | { |
335 | - baddr = (margin_left+(hSession->maxCOLS*2))+(f*2)+2; | |
335 | + baddr = (margin_left+(hSession->max.cols*2))+(f*2)+2; | |
336 | 336 | for(r=0;r<=0x0f;r++) |
337 | 337 | { |
338 | 338 | hSession->ea_buf[baddr].fg = LIB3270_ATTR_COLOR_YELLOW; |
... | ... | @@ -340,11 +340,11 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) |
340 | 340 | hSession->ea_buf[baddr].cs = 0; |
341 | 341 | hSession->ea_buf[baddr].cc = chr++; |
342 | 342 | hSession->ea_buf[baddr].gr = 0; |
343 | - baddr += hSession->maxCOLS; | |
343 | + baddr += hSession->max.cols; | |
344 | 344 | } |
345 | 345 | } |
346 | 346 | |
347 | - baddr = margin_left+0x1d+(hSession->maxCOLS*2); | |
347 | + baddr = margin_left+0x1d+(hSession->max.cols*2); | |
348 | 348 | for(ptr=label;*ptr;ptr++) |
349 | 349 | { |
350 | 350 | hSession->ea_buf[baddr].fg = LIB3270_ATTR_COLOR_WHITE; | ... | ... |
src/core/ctlr.c
... | ... | @@ -97,7 +97,7 @@ static const unsigned char code_table[64] = |
97 | 97 | #define IsBlank(c) ((c == EBC_null) || (c == EBC_space)) |
98 | 98 | |
99 | 99 | |
100 | -#define ALL_CHANGED(h) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,0,(h)->rows*(h)->cols); | |
100 | +#define ALL_CHANGED(h) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,0,(h)->view.rows*(h)->view.cols); | |
101 | 101 | #define REGION_CHANGED(h, f, l) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,f,l) |
102 | 102 | #define ONE_CHANGED(h,n) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,n,n+1); |
103 | 103 | |
... | ... | @@ -136,7 +136,7 @@ void ctlr_reinit(H3270 *session, unsigned cmask) |
136 | 136 | { |
137 | 137 | /* Allocate buffers */ |
138 | 138 | struct lib3270_ea *tmp; |
139 | - size_t sz = (session->maxROWS * session->maxCOLS); | |
139 | + size_t sz = (session->max.rows * session->max.cols); | |
140 | 140 | |
141 | 141 | session->buffer[0] = tmp = lib3270_calloc(sizeof(struct lib3270_ea), sz+1, session->buffer[0]); |
142 | 142 | session->ea_buf = tmp + 1; |
... | ... | @@ -152,168 +152,6 @@ void ctlr_reinit(H3270 *session, unsigned cmask) |
152 | 152 | } |
153 | 153 | } |
154 | 154 | |
155 | - /** | |
156 | - * @brief Parse the model number. | |
157 | - * | |
158 | - * @param session Session Handle. | |
159 | - * @param m Model number. | |
160 | - * | |
161 | - * @return -1 (error), 0 (default), or the specified number. | |
162 | - */ | |
163 | -static int parse_model_number(H3270 *session, const char *m) | |
164 | -{ | |
165 | - int sl; | |
166 | - int n; | |
167 | - | |
168 | - if(!m) | |
169 | - return 0; | |
170 | - | |
171 | - sl = strlen(m); | |
172 | - | |
173 | - /* An empty model number is no good. */ | |
174 | - if (!sl) | |
175 | - return 0; | |
176 | - | |
177 | - if (sl > 1) { | |
178 | - /* | |
179 | - * If it's longer than one character, it needs to start with | |
180 | - * '327[89]', and it sets the m3279 resource. | |
181 | - */ | |
182 | - if (!strncmp(m, "3278", 4)) | |
183 | - { | |
184 | - session->m3279 = 0; | |
185 | - } | |
186 | - else if (!strncmp(m, "3279", 4)) | |
187 | - { | |
188 | - session->m3279 = 1; | |
189 | - } | |
190 | - else | |
191 | - { | |
192 | - return -1; | |
193 | - } | |
194 | - m += 4; | |
195 | - sl -= 4; | |
196 | - | |
197 | - /* Check more syntax. -E is allowed, but ignored. */ | |
198 | - switch (m[0]) { | |
199 | - case '\0': | |
200 | - /* Use default model number. */ | |
201 | - return 0; | |
202 | - case '-': | |
203 | - /* Model number specified. */ | |
204 | - m++; | |
205 | - sl--; | |
206 | - break; | |
207 | - default: | |
208 | - return -1; | |
209 | - } | |
210 | - switch (sl) { | |
211 | - case 1: /* n */ | |
212 | - break; | |
213 | - case 3: /* n-E */ | |
214 | - if (strcasecmp(m + 1, "-E")) { | |
215 | - return -1; | |
216 | - } | |
217 | - break; | |
218 | - default: | |
219 | - return -1; | |
220 | - } | |
221 | - } | |
222 | - | |
223 | - /* Check the numeric model number. */ | |
224 | - n = atoi(m); | |
225 | - if (n >= 2 && n <= 5) { | |
226 | - return n; | |
227 | - } else { | |
228 | - return -1; | |
229 | - } | |
230 | - | |
231 | -} | |
232 | - | |
233 | -/** | |
234 | - * @brief Get current 3270 model. | |
235 | - * | |
236 | - * @param hSession selected 3270 session. | |
237 | - * @return Current model number. | |
238 | - */ | |
239 | -int lib3270_get_model_number(H3270 *hSession) | |
240 | -{ | |
241 | - CHECK_SESSION_HANDLE(hSession); | |
242 | - return hSession->model_num; | |
243 | -} | |
244 | - | |
245 | -const char * lib3270_get_model(H3270 *hSession) | |
246 | -{ | |
247 | - CHECK_SESSION_HANDLE(hSession); | |
248 | - return hSession->model_name; | |
249 | -} | |
250 | - | |
251 | -int lib3270_set_model(H3270 *hSession, const char *model) | |
252 | -{ | |
253 | - int ovc, ovr; | |
254 | - char junk; | |
255 | - int model_number; | |
256 | - | |
257 | - if(hSession->cstate != LIB3270_NOT_CONNECTED) | |
258 | - return errno = EISCONN; | |
259 | - | |
260 | - strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH); | |
261 | - hSession->model_name = &hSession->full_model_name[4]; | |
262 | - | |
263 | - if(!*model) | |
264 | - model = "2"; // No model, use the default one | |
265 | - | |
266 | - model_number = parse_model_number(hSession,model); | |
267 | - if (model_number < 0) | |
268 | - { | |
269 | - popup_an_error(hSession,"Invalid model number: %s", model); | |
270 | - model_number = 0; | |
271 | - } | |
272 | - | |
273 | - if (!model_number) | |
274 | - { | |
275 | -#if defined(RESTRICT_3279) | |
276 | - model_number = 3; | |
277 | -#else | |
278 | - model_number = 4; | |
279 | -#endif | |
280 | - } | |
281 | - | |
282 | - if(hSession->mono) | |
283 | - hSession->m3279 = 0; | |
284 | - else | |
285 | - hSession->m3279 = 1; | |
286 | - | |
287 | - if(!hSession->extended) | |
288 | - hSession->oversize = CN; | |
289 | - | |
290 | -#if defined(RESTRICT_3279) | |
291 | - if (hSession->m3279 && model_number == 4) | |
292 | - model_number = 3; | |
293 | -#endif | |
294 | - | |
295 | - trace("Model_number: %d",model_number); | |
296 | - | |
297 | - if (!hSession->extended || hSession->oversize == CN || sscanf(hSession->oversize, "%dx%d%c", &ovc, &ovr, &junk) != 2) | |
298 | - { | |
299 | - ovc = 0; | |
300 | - ovr = 0; | |
301 | - } | |
302 | - ctlr_set_rows_cols(hSession, model_number, ovc, ovr); | |
303 | - | |
304 | - if (hSession->termname != CN) | |
305 | - hSession->termtype = hSession->termname; | |
306 | - else | |
307 | - hSession->termtype = hSession->full_model_name; | |
308 | - | |
309 | - trace("Termtype: %s",hSession->termtype); | |
310 | - | |
311 | - ctlr_reinit(hSession,MODEL_CHANGE); | |
312 | - screen_update(hSession,0,hSession->rows*hSession->cols); | |
313 | - | |
314 | - return 0; | |
315 | -} | |
316 | - | |
317 | 155 | void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) |
318 | 156 | { |
319 | 157 | static const struct _sz |
... | ... | @@ -340,23 +178,74 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) |
340 | 178 | update_model_info(session,mn,sz[idx].cols,sz[idx].rows); |
341 | 179 | |
342 | 180 | // Apply oversize. |
343 | - session->ov_cols = 0; | |
344 | - session->ov_rows = 0; | |
181 | + session->oversize.cols = 0; | |
182 | + session->oversize.rows = 0; | |
345 | 183 | if (ovc != 0 || ovr != 0) |
346 | 184 | { |
347 | 185 | if (ovc <= 0 || ovr <= 0) |
348 | - popup_an_error(session,"Invalid %s %dx%d:\nNegative or zero",ResOversize, ovc, ovr); | |
186 | + { | |
187 | + lib3270_popup_dialog( | |
188 | + session, | |
189 | + LIB3270_NOTIFY_ERROR, | |
190 | + _( "Invalid oversize" ), | |
191 | + _( "The oversize values are invalid." ), \ | |
192 | + _( "%dx%d is negative or zero" ), | |
193 | + ovc, ovr | |
194 | + ); | |
195 | + | |
196 | + // popup_an_error(session,"Invalid %s %dx%d:\nNegative or zero",ResOversize, ovc, ovr); | |
197 | + | |
198 | + } | |
349 | 199 | else if (ovc * ovr >= 0x4000) |
350 | - popup_an_error(session,"Invalid %s %dx%d:\nToo big",ResOversize, ovc, ovr); | |
351 | - else if (ovc > 0 && ovc < session->maxCOLS) | |
352 | - popup_an_error(session,"Invalid %s cols (%d):\nLess than model %d cols (%d)",ResOversize, ovc, session->model_num, session->maxCOLS); | |
353 | - else if (ovr > 0 && ovr < session->maxROWS) | |
354 | - popup_an_error(session,"Invalid %s rows (%d):\nLess than model %d rows (%d)",ResOversize, ovr, session->model_num, session->maxROWS); | |
200 | + { | |
201 | + lib3270_popup_dialog( | |
202 | + session, | |
203 | + LIB3270_NOTIFY_ERROR, | |
204 | + _( "Invalid oversize" ), | |
205 | + _( "The oversize values are too big." ), \ | |
206 | + _( "%dx%d screen size is bigger than the maximum size" ), | |
207 | + ovc, ovr | |
208 | + ); | |
209 | + | |
210 | +// popup_an_error(session,"Invalid %s %dx%d:\nToo big",ResOversize, ovc, ovr); | |
211 | + | |
212 | + } | |
213 | + else if (ovc > 0 && ovc < session->max.cols) | |
214 | + { | |
215 | + | |
216 | + lib3270_popup_dialog( | |
217 | + session, | |
218 | + LIB3270_NOTIFY_ERROR, | |
219 | + _( "Invalid oversize" ), | |
220 | + _( "The oversize width is too small." ), \ | |
221 | + _( "The width %d is less than model %d columns (%d)" ), | |
222 | + ovc, session->model_num, session->max.cols | |
223 | + ); | |
224 | + | |
225 | +// popup_an_error(session,"Invalid %s cols (%d):\nLess than model %d cols (%d)",ResOversize, ovc, session->model_num, session->maxCOLS); | |
226 | + } | |
227 | + else if (ovr > 0 && ovr < session->max.rows) | |
228 | + { | |
229 | + | |
230 | + lib3270_popup_dialog( | |
231 | + session, | |
232 | + LIB3270_NOTIFY_ERROR, | |
233 | + _( "Invalid oversize" ), | |
234 | + _( "The oversize height is too small." ), \ | |
235 | + _( "The height %d is less than model %d rows (%d)" ), | |
236 | + ovr, session->model_num, session->max.rows | |
237 | + ); | |
238 | + | |
239 | +// popup_an_error(session,"Invalid %s rows (%d):\nLess than model %d rows (%d)",ResOversize, ovr, session->model_num, session->maxROWS); | |
240 | + | |
241 | + } | |
355 | 242 | else |
356 | - update_model_info(session,mn,session->ov_cols = ovc,session->ov_rows = ovr); | |
243 | + { | |
244 | + update_model_info(session,mn,session->oversize.cols = ovc,session->oversize.rows = ovr); | |
245 | + } | |
357 | 246 | } |
358 | 247 | |
359 | - set_viewsize(session,sz[idx].rows,sz[idx].cols); | |
248 | + set_viewsize(session,session->max.rows,session->max.cols); | |
360 | 249 | |
361 | 250 | } |
362 | 251 | |
... | ... | @@ -636,8 +525,8 @@ LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0) |
636 | 525 | return 0; |
637 | 526 | } |
638 | 527 | |
639 | -LIB3270_EXPORT int lib3270_get_is_protected_at(H3270 *h, int row, int col) { | |
640 | - return lib3270_get_is_protected(h, ((row-1) * h->cols) + (col-1)); | |
528 | +LIB3270_EXPORT int lib3270_get_is_protected_at(H3270 *h, unsigned int row, unsigned int col) { | |
529 | + return lib3270_get_is_protected(h, ((row-1) * h->view.cols) + (col-1)); | |
641 | 530 | } |
642 | 531 | |
643 | 532 | LIB3270_EXPORT int lib3270_get_is_protected(H3270 *hSession, int baddr) |
... | ... | @@ -659,7 +548,7 @@ LIB3270_EXPORT int lib3270_is_protected(H3270 *h, unsigned int baddr) |
659 | 548 | |
660 | 549 | |
661 | 550 | /** |
662 | - * Perform an erase command, which may include changing the (virtual) screen size. | |
551 | + * @brief Perform an erase command, which may include changing the (virtual) screen size. | |
663 | 552 | * |
664 | 553 | */ |
665 | 554 | void ctlr_erase(H3270 *session, int alt) |
... | ... | @@ -677,13 +566,12 @@ void ctlr_erase(H3270 *session, int alt) |
677 | 566 | { |
678 | 567 | // Going from 24x80 to maximum. |
679 | 568 | session->cbk.display(session); |
680 | - | |
681 | - set_viewsize(session,session->maxROWS,session->maxCOLS); | |
569 | + set_viewsize(session,session->max.rows,session->max.cols); | |
682 | 570 | } |
683 | 571 | else |
684 | 572 | { |
685 | 573 | // Going from maximum to 24x80. |
686 | - if (session->maxROWS > 24 || session->maxCOLS > 80) | |
574 | + if (session->max.rows > 24 || session->max.cols > 80) | |
687 | 575 | { |
688 | 576 | if(session->vcontrol) |
689 | 577 | { |
... | ... | @@ -694,7 +582,7 @@ void ctlr_erase(H3270 *session, int alt) |
694 | 582 | if(lib3270_get_toggle(session,LIB3270_TOGGLE_ALTSCREEN)) |
695 | 583 | set_viewsize(session,24,80); |
696 | 584 | else |
697 | - set_viewsize(session,session->maxROWS,80); | |
585 | + set_viewsize(session,session->max.rows,80); | |
698 | 586 | } |
699 | 587 | } |
700 | 588 | |
... | ... | @@ -702,8 +590,8 @@ void ctlr_erase(H3270 *session, int alt) |
702 | 590 | |
703 | 591 | } |
704 | 592 | |
705 | -/* | |
706 | - * Interpret an incoming 3270 command. | |
593 | +/** | |
594 | + * @brief Interpret an incoming 3270 command. | |
707 | 595 | */ |
708 | 596 | enum pds process_ds(H3270 *hSession, unsigned char *buf, int buflen) |
709 | 597 | { |
... | ... | @@ -943,7 +831,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) |
943 | 831 | space3270out(hSession,3); |
944 | 832 | *hSession->obptr++ = ORDER_SBA; |
945 | 833 | ENCODE_BADDR(hSession->obptr, baddr); |
946 | - trace_ds(hSession," SetBufferAddress%s (Cols: %d Rows: %d)", rcba(hSession,baddr), hSession->cols, hSession->rows); | |
834 | + trace_ds(hSession," SetBufferAddress%s (Cols: %d Rows: %d)", rcba(hSession,baddr), hSession->view.cols, hSession->view.rows); | |
947 | 835 | while (!hSession->ea_buf[baddr].fa) |
948 | 836 | { |
949 | 837 | |
... | ... | @@ -1357,7 +1245,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er |
1357 | 1245 | END_TEXT("SetBufferAddress"); |
1358 | 1246 | previous = SBA; |
1359 | 1247 | trace_ds(hSession,"%s",rcba(hSession,hSession->buffer_addr)); |
1360 | - if(hSession->buffer_addr >= hSession->cols * hSession->rows) | |
1248 | + if(hSession->buffer_addr >= hSession->view.cols * hSession->view.rows) | |
1361 | 1249 | { |
1362 | 1250 | ABORT_WRITE("invalid SBA address"); |
1363 | 1251 | } |
... | ... | @@ -1508,7 +1396,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er |
1508 | 1396 | trace_ds(hSession,"'"); |
1509 | 1397 | |
1510 | 1398 | } |
1511 | - if (baddr >= hSession->cols * hSession->rows) | |
1399 | + if (baddr >= hSession->view.cols * hSession->view.rows) | |
1512 | 1400 | { |
1513 | 1401 | ABORT_WRITE("invalid RA address"); |
1514 | 1402 | } |
... | ... | @@ -1556,7 +1444,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er |
1556 | 1444 | trace_ds(hSession,"%s",rcba(hSession,baddr)); |
1557 | 1445 | |
1558 | 1446 | previous = ORDER; |
1559 | - if (baddr >= hSession->cols * hSession->rows) | |
1447 | + if (baddr >= hSession->view.cols * hSession->view.rows) | |
1560 | 1448 | { |
1561 | 1449 | ABORT_WRITE("invalid EUA address"); |
1562 | 1450 | } |
... | ... | @@ -1861,7 +1749,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er |
1861 | 1749 | DEC_BA(baddr); |
1862 | 1750 | while (!aborted && |
1863 | 1751 | ((fa_addr >= 0 && baddr != fa_addr) || |
1864 | - (fa_addr < 0 && baddr != hSession->rows*hSession->cols - 1))) { | |
1752 | + (fa_addr < 0 && baddr != hSession->view.rows*hSession->view.cols - 1))) { | |
1865 | 1753 | if (hSession->ea_buf[baddr].cc == FCORDER_SI) { |
1866 | 1754 | ABORT_WRITE("double SI"); |
1867 | 1755 | } |
... | ... | @@ -2069,8 +1957,8 @@ void ctlr_write_sscp_lu(H3270 *hSession, unsigned char buf[], int buflen) |
2069 | 1957 | * Insert NULLs to the end of the line and advance to |
2070 | 1958 | * the beginning of the next line. |
2071 | 1959 | */ |
2072 | - s_row = hSession->buffer_addr / hSession->cols; | |
2073 | - while ((hSession->buffer_addr / hSession->cols) == s_row) | |
1960 | + s_row = hSession->buffer_addr / hSession->view.cols; | |
1961 | + while ((hSession->buffer_addr / hSession->view.cols) == s_row) | |
2074 | 1962 | { |
2075 | 1963 | ctlr_add(hSession,hSession->buffer_addr, EBC_null, hSession->default_cs); |
2076 | 1964 | ctlr_add_fg(hSession,hSession->buffer_addr, hSession->default_fg); |
... | ... | @@ -2450,7 +2338,7 @@ int ctlr_any_data(H3270 *session) |
2450 | 2338 | { |
2451 | 2339 | register int i; |
2452 | 2340 | |
2453 | - for(i = 0; i < session->rows*session->cols; i++) | |
2341 | + for(i = 0; i < session->view.rows * session->view.cols; i++) | |
2454 | 2342 | { |
2455 | 2343 | if (!IsBlank(session->ea_buf[i].cc)) |
2456 | 2344 | return 1; |
... | ... | @@ -2477,7 +2365,7 @@ void ctlr_clear(H3270 *session, Boolean can_snap) |
2477 | 2365 | #endif |
2478 | 2366 | |
2479 | 2367 | /* Clear the screen. */ |
2480 | - (void) memset((char *)session->ea_buf, 0, session->rows*session->cols*sizeof(struct lib3270_ea)); | |
2368 | + (void) memset((char *)session->ea_buf, 0, session->view.rows * session->view.cols * sizeof(struct lib3270_ea)); | |
2481 | 2369 | cursor_move(session,0); |
2482 | 2370 | session->buffer_addr = 0; |
2483 | 2371 | |
... | ... | @@ -2506,7 +2394,7 @@ static void ctlr_blanks(H3270 *session) |
2506 | 2394 | { |
2507 | 2395 | int baddr; |
2508 | 2396 | |
2509 | - for (baddr = 0; baddr < session->rows*session->cols; baddr++) | |
2397 | + for (baddr = 0; baddr < session->view.rows * session->view.cols; baddr++) | |
2510 | 2398 | { |
2511 | 2399 | if (!session->ea_buf[baddr].fa) |
2512 | 2400 | session->ea_buf[baddr].cc = EBC_space; |
... | ... | @@ -2634,8 +2522,8 @@ static void ctlr_add_ic(H3270 *hSession, int baddr, unsigned char ic) |
2634 | 2522 | hSession->ea_buf[baddr].ic = ic; |
2635 | 2523 | } |
2636 | 2524 | |
2637 | -/* | |
2638 | - * Wrapping bersion of ctlr_bcopy. | |
2525 | +/** | |
2526 | + * @brief Wrapping bersion of ctlr_bcopy. | |
2639 | 2527 | */ |
2640 | 2528 | void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int count) |
2641 | 2529 | { |
... | ... | @@ -2647,8 +2535,8 @@ void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int co |
2647 | 2535 | * It's faster to figure out if none of this is true, then do a slow |
2648 | 2536 | * location-at-a-time version only if it happens. |
2649 | 2537 | */ |
2650 | - if (baddr_from + count <= hSession->rows*hSession->cols && | |
2651 | - baddr_to + count <= hSession->rows*hSession->cols) { | |
2538 | + if (baddr_from + count <= hSession->view.rows * hSession->view.cols && | |
2539 | + baddr_to + count <= hSession->view.rows * hSession->view.cols) { | |
2652 | 2540 | ctlr_bcopy(hSession,baddr_from, baddr_to, count, True); |
2653 | 2541 | } else { |
2654 | 2542 | int i, from, to; |
... | ... | @@ -2656,12 +2544,12 @@ void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int co |
2656 | 2544 | for (i = 0; i < count; i++) { |
2657 | 2545 | if (baddr_to > baddr_from) { |
2658 | 2546 | /* Shifting right, move left. */ |
2659 | - to = (baddr_to + count - 1 - i) % hSession->rows*hSession->cols; | |
2660 | - from = (baddr_from + count - 1 - i) % hSession->rows*hSession->cols; | |
2547 | + to = (baddr_to + count - 1 - i) % hSession->view.rows * hSession->view.cols; | |
2548 | + from = (baddr_from + count - 1 - i) % hSession->view.rows * hSession->view.cols; | |
2661 | 2549 | } else { |
2662 | 2550 | /* Shifting left, move right. */ |
2663 | - to = (baddr_to + i) % hSession->rows*hSession->cols; | |
2664 | - from = (baddr_from + i) % hSession->rows*hSession->cols; | |
2551 | + to = (baddr_to + i) % hSession->view.rows * hSession->view.cols; | |
2552 | + from = (baddr_from + i) % hSession->view.rows * hSession->view.cols; | |
2665 | 2553 | } |
2666 | 2554 | ctlr_bcopy(hSession,from, to, 1, True); |
2667 | 2555 | } |
... | ... | @@ -2714,7 +2602,7 @@ void ctlr_aclear(H3270 *hSession, int baddr, int count, int GNUC_UNUSED(clear_ea |
2714 | 2602 | */ |
2715 | 2603 | void ctlr_scroll(H3270 *hSession) |
2716 | 2604 | { |
2717 | - int qty = (hSession->rows - 1) * hSession->cols; | |
2605 | + int qty = (hSession->view.rows - 1) * hSession->view.cols; | |
2718 | 2606 | |
2719 | 2607 | /* Make sure nothing is selected. (later this can be fixed) */ |
2720 | 2608 | // unselect(0, ROWS*COLS); |
... | ... | @@ -2722,10 +2610,10 @@ void ctlr_scroll(H3270 *hSession) |
2722 | 2610 | /* Synchronize pending changes prior to this. */ |
2723 | 2611 | |
2724 | 2612 | /* Move ea_buf. */ |
2725 | - (void) memmove(&hSession->ea_buf[0], &hSession->ea_buf[hSession->cols],qty * sizeof(struct lib3270_ea)); | |
2613 | + (void) memmove(&hSession->ea_buf[0], &hSession->ea_buf[hSession->view.cols],qty * sizeof(struct lib3270_ea)); | |
2726 | 2614 | |
2727 | 2615 | /* Clear the last line. */ |
2728 | - (void) memset((char *) &hSession->ea_buf[qty], 0, hSession->cols * sizeof(struct lib3270_ea)); | |
2616 | + (void) memset((char *) &hSession->ea_buf[qty], 0, hSession->view.cols * sizeof(struct lib3270_ea)); | |
2729 | 2617 | |
2730 | 2618 | hSession->cbk.display(hSession); |
2731 | 2619 | ... | ... |
src/core/cursor.c
... | ... | @@ -263,9 +263,9 @@ static int cursor_up(H3270 *hSession) |
263 | 263 | } |
264 | 264 | #endif /*]*/ |
265 | 265 | |
266 | - baddr = hSession->cursor_addr - hSession->cols; | |
266 | + baddr = hSession->cursor_addr - hSession->view.cols; | |
267 | 267 | if (baddr < 0) |
268 | - baddr = (hSession->cursor_addr + (hSession->rows * hSession->cols)) - hSession->cols; | |
268 | + baddr = (hSession->cursor_addr + (hSession->view.rows * hSession->view.cols)) - hSession->view.cols; | |
269 | 269 | cursor_move(hSession,baddr); |
270 | 270 | return 0; |
271 | 271 | } |
... | ... | @@ -294,7 +294,7 @@ static int cursor_down(H3270 *hSession) |
294 | 294 | return 0; |
295 | 295 | } |
296 | 296 | #endif /*]*/ |
297 | - baddr = (hSession->cursor_addr + hSession->cols) % (hSession->cols * hSession->rows); | |
297 | + baddr = (hSession->cursor_addr + hSession->view.cols) % (hSession->view.cols * hSession->view.rows); | |
298 | 298 | cursor_move(hSession,baddr); |
299 | 299 | return 0; |
300 | 300 | } | ... | ... |
src/core/keyboard/actions.c
... | ... | @@ -201,7 +201,8 @@ LIB3270_EXPORT int lib3270_firstfield(H3270 *hSession) |
201 | 201 | cursor_move(hSession,0); |
202 | 202 | return 0; |
203 | 203 | } |
204 | - cursor_move(hSession,lib3270_get_next_unprotected(hSession,hSession->rows*hSession->cols-1)); | |
204 | + | |
205 | + cursor_move(hSession,lib3270_get_next_unprotected(hSession,hSession->view.rows * hSession->view.cols-1)); | |
205 | 206 | |
206 | 207 | return 0; |
207 | 208 | } |
... | ... | @@ -288,9 +289,9 @@ static Boolean do_delete(H3270 *hSession) |
288 | 289 | } |
289 | 290 | else |
290 | 291 | { |
291 | - if ((baddr % hSession->cols) == hSession->cols - ndel) | |
292 | + if ((baddr % hSession->view.cols) == hSession->view.cols - ndel) | |
292 | 293 | return True; |
293 | - end_baddr = baddr + (hSession->cols - (baddr % hSession->cols)) - 1; | |
294 | + end_baddr = baddr + (hSession->view.cols - (baddr % hSession->view.cols)) - 1; | |
294 | 295 | } |
295 | 296 | |
296 | 297 | /* Shift the remainder of the field left. */ |
... | ... | @@ -301,8 +302,8 @@ static Boolean do_delete(H3270 *hSession) |
301 | 302 | else if (end_baddr != baddr) |
302 | 303 | { |
303 | 304 | /* XXX: Need to verify this. */ |
304 | - ctlr_bcopy(hSession,baddr + ndel, baddr,((hSession->rows * hSession->cols) - 1) - (baddr + ndel) + 1, 0); | |
305 | - ctlr_bcopy(hSession,0, (hSession->rows * hSession->cols) - ndel, ndel, 0); | |
305 | + ctlr_bcopy(hSession,baddr + ndel, baddr,((hSession->view.rows * hSession->view.cols) - 1) - (baddr + ndel) + 1, 0); | |
306 | + ctlr_bcopy(hSession,0, (hSession->view.rows * hSession->view.cols) - ndel, ndel, 0); | |
306 | 307 | ctlr_bcopy(hSession,ndel, 0, end_baddr - ndel + 1, 0); |
307 | 308 | } |
308 | 309 | ... | ... |
src/core/keyboard/kybd.c
... | ... | @@ -574,7 +574,7 @@ static Boolean ins_prep(H3270 *hSession, int faddr, int baddr, int count) |
574 | 574 | if (faddr == -1) |
575 | 575 | { |
576 | 576 | /* Unformatted. Use the end of the line. */ |
577 | - next_faddr = (((baddr / hSession->cols) + 1) * hSession->cols) % (hSession->rows*hSession->cols); | |
577 | + next_faddr = (((baddr / hSession->view.cols) + 1) * hSession->view.cols) % (hSession->view.rows*hSession->view.cols); | |
578 | 578 | } |
579 | 579 | else |
580 | 580 | { |
... | ... | @@ -639,8 +639,8 @@ static Boolean ins_prep(H3270 *hSession, int faddr, int baddr, int count) |
639 | 639 | /* Shift right n_nulls worth. */ |
640 | 640 | copy_len = first_null - baddr; |
641 | 641 | if (copy_len < 0) |
642 | - copy_len += hSession->rows*hSession->cols; | |
643 | - to = (baddr + n_nulls) % (hSession->rows*hSession->cols); | |
642 | + copy_len += hSession->view.rows * hSession->view.cols; | |
643 | + to = (baddr + n_nulls) % (hSession->view.rows * hSession->view.cols); | |
644 | 644 | /* |
645 | 645 | #if defined(_ST) |
646 | 646 | printf("found %d NULLs at %d\n", n_nulls, first_null); |
... | ... | @@ -876,7 +876,7 @@ static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean |
876 | 876 | while (baddr_fill != faddr) { |
877 | 877 | |
878 | 878 | /* Check for backward line wrap. */ |
879 | - if ((baddr_fill % hSession->cols) == hSession->cols - 1) | |
879 | + if ((baddr_fill % hSession->view.cols) == hSession->view.cols - 1) | |
880 | 880 | { |
881 | 881 | Boolean aborted = True; |
882 | 882 | register int baddr_scan = baddr_fill; |
... | ... | @@ -891,7 +891,7 @@ static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean |
891 | 891 | aborted = False; |
892 | 892 | break; |
893 | 893 | } |
894 | - if (!(baddr_scan % hSession->cols)) | |
894 | + if (!(baddr_scan % hSession->view.cols)) | |
895 | 895 | break; |
896 | 896 | DEC_BA(baddr_scan); |
897 | 897 | } |
... | ... | @@ -947,7 +947,7 @@ LIB3270_EXPORT int lib3270_input_string(H3270 *hSession, const unsigned char *st |
947 | 947 | for(pos = 0; pos < length && str[pos] && !rc; pos++) |
948 | 948 | rc = key_ACharacter(hSession,(str[pos] & 0xff), KT_STD, IA_KEY, NULL); |
949 | 949 | |
950 | - screen_update(hSession,0,hSession->rows*hSession->cols); | |
950 | + screen_update(hSession,0,hSession->view.rows * hSession->view.cols); | |
951 | 951 | |
952 | 952 | return rc; |
953 | 953 | } |
... | ... | @@ -1228,8 +1228,8 @@ LIB3270_EXPORT int lib3270_newline(H3270 *hSession) |
1228 | 1228 | return 0; |
1229 | 1229 | } |
1230 | 1230 | #endif /*]*/ |
1231 | - baddr = (hSession->cursor_addr + hSession->cols) % (hSession->cols * hSession->rows); /* down */ | |
1232 | - baddr = (baddr / hSession->cols) * hSession->cols; /* 1st col */ | |
1231 | + baddr = (hSession->cursor_addr + hSession->view.cols) % (hSession->view.cols * hSession->view.rows); /* down */ | |
1232 | + baddr = (baddr / hSession->view.cols) * hSession->view.cols; /* 1st col */ | |
1233 | 1233 | faddr = lib3270_field_addr(hSession,baddr); |
1234 | 1234 | fa = hSession->ea_buf[faddr].fa; |
1235 | 1235 | if (faddr != baddr && !FA_IS_PROTECTED(fa)) | ... | ... |
... | ... | @@ -0,0 +1,222 @@ |
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. 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 <lib3270-internals.h> | |
31 | + #include "screen.h" | |
32 | + #include "ctlrc.h" | |
33 | + #include "popupsc.h" | |
34 | + #include <lib3270/trace.h> | |
35 | + #include <lib3270/log.h> | |
36 | + | |
37 | + const char * lib3270_get_oversize(H3270 *hSession) | |
38 | + { | |
39 | + return hSession->oversize.str; | |
40 | + } | |
41 | + | |
42 | + int lib3270_set_oversize(H3270 *hSession, const char GNUC_UNUSED(*value)) | |
43 | + { | |
44 | + if(hSession->cstate != LIB3270_NOT_CONNECTED) | |
45 | + return errno = EISCONN; | |
46 | + | |
47 | + if(!hSession->extended) | |
48 | + return errno = ENOTSUP; | |
49 | + | |
50 | + // TODO: Implement it! | |
51 | + // Replace(hSession->oversize.str,value); | |
52 | + | |
53 | + return errno = ENOTSUP; | |
54 | + | |
55 | + } | |
56 | + | |
57 | +/** | |
58 | + * @brief Get current 3270 model. | |
59 | + * | |
60 | + * @param hSession selected 3270 session. | |
61 | + * @return Current model number. | |
62 | + */ | |
63 | +int lib3270_get_model_number(H3270 *hSession) | |
64 | +{ | |
65 | + CHECK_SESSION_HANDLE(hSession); | |
66 | + return hSession->model_num; | |
67 | +} | |
68 | + | |
69 | +const char * lib3270_get_model(H3270 *hSession) | |
70 | +{ | |
71 | + CHECK_SESSION_HANDLE(hSession); | |
72 | + return hSession->model_name; | |
73 | +} | |
74 | + | |
75 | + /** | |
76 | + * @brief Parse the model number. | |
77 | + * | |
78 | + * @param session Session Handle. | |
79 | + * @param m Model number. | |
80 | + * | |
81 | + * @return -1 (error), 0 (default), or the specified number. | |
82 | + */ | |
83 | +static int parse_model_number(H3270 *session, const char *m) | |
84 | +{ | |
85 | + int sl; | |
86 | + int n; | |
87 | + | |
88 | + if(!m) | |
89 | + return 0; | |
90 | + | |
91 | + sl = strlen(m); | |
92 | + | |
93 | + /* An empty model number is no good. */ | |
94 | + if (!sl) | |
95 | + return 0; | |
96 | + | |
97 | + if (sl > 1) { | |
98 | + /* | |
99 | + * If it's longer than one character, it needs to start with | |
100 | + * '327[89]', and it sets the m3279 resource. | |
101 | + */ | |
102 | + if (!strncmp(m, "3278", 4)) | |
103 | + { | |
104 | + session->m3279 = 0; | |
105 | + } | |
106 | + else if (!strncmp(m, "3279", 4)) | |
107 | + { | |
108 | + session->m3279 = 1; | |
109 | + } | |
110 | + else | |
111 | + { | |
112 | + return -1; | |
113 | + } | |
114 | + m += 4; | |
115 | + sl -= 4; | |
116 | + | |
117 | + /* Check more syntax. -E is allowed, but ignored. */ | |
118 | + switch (m[0]) { | |
119 | + case '\0': | |
120 | + /* Use default model number. */ | |
121 | + return 0; | |
122 | + case '-': | |
123 | + /* Model number specified. */ | |
124 | + m++; | |
125 | + sl--; | |
126 | + break; | |
127 | + default: | |
128 | + return -1; | |
129 | + } | |
130 | + switch (sl) { | |
131 | + case 1: /* n */ | |
132 | + break; | |
133 | + case 3: /* n-E */ | |
134 | + if (strcasecmp(m + 1, "-E")) { | |
135 | + return -1; | |
136 | + } | |
137 | + break; | |
138 | + default: | |
139 | + return -1; | |
140 | + } | |
141 | + } | |
142 | + | |
143 | + /* Check the numeric model number. */ | |
144 | + n = atoi(m); | |
145 | + if (n >= 2 && n <= 5) { | |
146 | + return n; | |
147 | + } else { | |
148 | + return -1; | |
149 | + } | |
150 | + | |
151 | +} | |
152 | + | |
153 | +int lib3270_set_model(H3270 *hSession, const char *model) | |
154 | +{ | |
155 | + int ovc, ovr; | |
156 | + char junk; | |
157 | + int model_number; | |
158 | + | |
159 | + if(hSession->cstate != LIB3270_NOT_CONNECTED) | |
160 | + return errno = EISCONN; | |
161 | + | |
162 | + strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH); | |
163 | + hSession->model_name = &hSession->full_model_name[4]; | |
164 | + | |
165 | + if(!*model) | |
166 | + model = "2"; // No model, use the default one | |
167 | + | |
168 | + model_number = parse_model_number(hSession,model); | |
169 | + if (model_number < 0) | |
170 | + { | |
171 | + popup_an_error(hSession,"Invalid model number: %s", model); | |
172 | + model_number = 0; | |
173 | + } | |
174 | + | |
175 | + if (!model_number) | |
176 | + { | |
177 | +#if defined(RESTRICT_3279) | |
178 | + model_number = 3; | |
179 | +#else | |
180 | + model_number = 4; | |
181 | +#endif | |
182 | + } | |
183 | + | |
184 | + if(hSession->mono) | |
185 | + hSession->m3279 = 0; | |
186 | + else | |
187 | + hSession->m3279 = 1; | |
188 | + | |
189 | + if(!hSession->extended) | |
190 | + { | |
191 | + if(hSession->oversize.str) | |
192 | + lib3270_free(hSession->oversize.str); | |
193 | + hSession->oversize.str = CN; | |
194 | + } | |
195 | + | |
196 | +#if defined(RESTRICT_3279) | |
197 | + if (hSession->m3279 && model_number == 4) | |
198 | + model_number = 3; | |
199 | +#endif | |
200 | + | |
201 | + trace("Model_number: %d",model_number); | |
202 | + | |
203 | + if (!hSession->extended || hSession->oversize.str == CN || sscanf(hSession->oversize.str, "%dx%d%c", &ovc, &ovr, &junk) != 2) | |
204 | + { | |
205 | + ovc = 0; | |
206 | + ovr = 0; | |
207 | + } | |
208 | + ctlr_set_rows_cols(hSession, model_number, ovc, ovr); | |
209 | + | |
210 | + if (hSession->termname != CN) | |
211 | + hSession->termtype = hSession->termname; | |
212 | + else | |
213 | + hSession->termtype = hSession->full_model_name; | |
214 | + | |
215 | + trace("Termtype: %s",hSession->termtype); | |
216 | + | |
217 | + ctlr_reinit(hSession,MODEL_CHANGE); | |
218 | + screen_update(hSession,0,hSession->view.rows*hSession->view.cols); | |
219 | + | |
220 | + return 0; | |
221 | +} | |
222 | + | ... | ... |
src/core/paste.c
... | ... | @@ -193,8 +193,8 @@ static int set_string(H3270 *hSession, const unsigned char *str, int length) |
193 | 193 | int faddr; |
194 | 194 | unsigned char fa; |
195 | 195 | |
196 | - baddr = (hSession->cursor_addr + hSession->cols) % (hSession->cols * hSession->rows); /* down */ | |
197 | - baddr = (baddr / hSession->cols) * hSession->cols; /* 1st col */ | |
196 | + baddr = (hSession->cursor_addr + hSession->view.cols) % (hSession->view.cols * hSession->view.rows); /* down */ | |
197 | + baddr = (baddr / hSession->view.cols) * hSession->view.cols; /* 1st col */ | |
198 | 198 | faddr = lib3270_field_addr(hSession,baddr); |
199 | 199 | fa = hSession->ea_buf[faddr].fa; |
200 | 200 | if (faddr != baddr && !FA_IS_PROTECTED(fa)) |
... | ... | @@ -248,12 +248,12 @@ LIB3270_EXPORT int lib3270_set_string_at(H3270 *hSession, unsigned int row, unsi |
248 | 248 | row--; |
249 | 249 | col--; |
250 | 250 | |
251 | - if(row > hSession->rows || col > hSession->cols) | |
251 | + if(row > hSession->view.rows || col > hSession->view.cols) | |
252 | 252 | return - (errno = EOVERFLOW); |
253 | 253 | |
254 | 254 | hSession->cbk.suspend(hSession); |
255 | 255 | |
256 | - hSession->cursor_addr = (row * hSession->cols) + col; | |
256 | + hSession->cursor_addr = (row * hSession->view.cols) + col; | |
257 | 257 | rc = set_string(hSession, str, length); |
258 | 258 | hSession->cbk.resume(hSession); |
259 | 259 | ... | ... |
src/core/properties/string.c
... | ... | @@ -132,6 +132,13 @@ |
132 | 132 | NULL // Set value. |
133 | 133 | }, |
134 | 134 | |
135 | + { | |
136 | + "oversize", // Property name. | |
137 | + N_( "Screen oversize if larger than the chosen model"), // Property description. | |
138 | + lib3270_get_oversize, // Get value. | |
139 | + lib3270_set_oversize // Set value. | |
140 | + }, | |
141 | + | |
135 | 142 | /* |
136 | 143 | { |
137 | 144 | "", // Property name. | ... | ... |
src/core/screen.c
... | ... | @@ -99,9 +99,9 @@ LIB3270_EXPORT LIB3270_ATTR lib3270_get_attribute_at_address(H3270 *hSession, un |
99 | 99 | if(check_online_session(hSession)) |
100 | 100 | return (LIB3270_ATTR) -1; |
101 | 101 | |
102 | - if(!hSession->text ||baddr > (hSession->rows*hSession->cols)) | |
102 | + if(!hSession->text ||baddr > (hSession->view.rows*hSession->view.cols)) | |
103 | 103 | { |
104 | - errno = EINVAL; | |
104 | + errno = EOVERFLOW; | |
105 | 105 | return (LIB3270_ATTR) -1; |
106 | 106 | } |
107 | 107 | |
... | ... | @@ -112,9 +112,9 @@ LIB3270_EXPORT int lib3270_is_selected(H3270 *hSession, unsigned int baddr) |
112 | 112 | { |
113 | 113 | FAIL_IF_NOT_ONLINE(hSession); |
114 | 114 | |
115 | - if(!hSession->text || baddr > (hSession->rows*hSession->cols)) | |
115 | + if(!hSession->text || baddr > (hSession->view.rows * hSession->view.cols)) | |
116 | 116 | { |
117 | - errno = EINVAL; | |
117 | + errno = EOVERFLOW; | |
118 | 118 | return -1; |
119 | 119 | } |
120 | 120 | |
... | ... | @@ -125,9 +125,9 @@ LIB3270_EXPORT int lib3270_get_element(H3270 *hSession, unsigned int baddr, unsi |
125 | 125 | { |
126 | 126 | FAIL_IF_NOT_ONLINE(hSession); |
127 | 127 | |
128 | - if(!hSession->text || baddr > (hSession->rows*hSession->cols)) | |
128 | + if(!hSession->text || baddr > (hSession->view.rows * hSession->view.cols)) | |
129 | 129 | { |
130 | - errno = EINVAL; | |
130 | + errno = EOVERFLOW; | |
131 | 131 | return -1; |
132 | 132 | } |
133 | 133 | |
... | ... | @@ -248,14 +248,14 @@ static unsigned short calc_attrs(H3270 *session, int baddr, int fa_addr, int fa) |
248 | 248 | LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h) |
249 | 249 | { |
250 | 250 | CHECK_SESSION_HANDLE(h); |
251 | - return h->rows * h->cols; | |
251 | + return h->view.rows * h->view.cols; | |
252 | 252 | } |
253 | 253 | |
254 | 254 | LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, unsigned int *r, unsigned int *c) |
255 | 255 | { |
256 | 256 | CHECK_SESSION_HANDLE(h); |
257 | - *r = h->rows; | |
258 | - *c = h->cols; | |
257 | + *r = h->view.rows; | |
258 | + *c = h->view.cols; | |
259 | 259 | |
260 | 260 | // trace("%s: %d - %d",__FUNCTION__, h->rows, h->cols); |
261 | 261 | |
... | ... | @@ -264,22 +264,22 @@ LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, unsigned int *r, unsigned |
264 | 264 | LIB3270_EXPORT unsigned int lib3270_get_width(H3270 *h) |
265 | 265 | { |
266 | 266 | CHECK_SESSION_HANDLE(h); |
267 | - return h->cols; | |
267 | + return h->view.cols; | |
268 | 268 | } |
269 | 269 | |
270 | 270 | LIB3270_EXPORT unsigned int lib3270_get_height(H3270 *h) |
271 | 271 | { |
272 | 272 | CHECK_SESSION_HANDLE(h); |
273 | - return h->rows; | |
273 | + return h->view.rows; | |
274 | 274 | } |
275 | 275 | |
276 | 276 | void update_model_info(H3270 *session, unsigned int model, unsigned int cols, unsigned int rows) |
277 | 277 | { |
278 | - if(model == session->model_num && session->maxROWS == rows && session->maxCOLS == cols) | |
278 | + if(model == session->model_num && session->max.rows == rows && session->max.cols == cols) | |
279 | 279 | return; |
280 | 280 | |
281 | - session->maxCOLS = cols; | |
282 | - session->maxROWS = rows; | |
281 | + session->max.cols = cols; | |
282 | + session->max.rows = rows; | |
283 | 283 | session->model_num = model; |
284 | 284 | |
285 | 285 | /* Update the model name. */ |
... | ... | @@ -296,7 +296,7 @@ LIB3270_EXPORT int lib3270_get_contents(H3270 *h, int first, int last, unsigned |
296 | 296 | |
297 | 297 | CHECK_SESSION_HANDLE(h); |
298 | 298 | |
299 | - len = h->rows * h->cols; | |
299 | + len = h->view.rows * h->view.cols; | |
300 | 300 | |
301 | 301 | if(first > len || last > len || first < 0 || last < 0) |
302 | 302 | return EFAULT; |
... | ... | @@ -377,7 +377,7 @@ void screen_update(H3270 *session, int bstart, int bend) |
377 | 377 | |
378 | 378 | for(f=first;f<last;f++) |
379 | 379 | { |
380 | - if(f%session->cols == 0) | |
380 | + if(f%session->view.cols == 0) | |
381 | 381 | len++; |
382 | 382 | } |
383 | 383 | |
... | ... | @@ -430,10 +430,10 @@ LIB3270_EXPORT int lib3270_translate_to_address(H3270 *hSession, unsigned int ro |
430 | 430 | row--; |
431 | 431 | col--; |
432 | 432 | |
433 | - if(row > hSession->rows || col > hSession->cols) | |
433 | + if(row > hSession->view.rows || col > hSession->view.cols) | |
434 | 434 | return - (errno = EOVERFLOW); |
435 | 435 | |
436 | - return (row * hSession->cols) + col; | |
436 | + return (row * hSession->view.cols) + col; | |
437 | 437 | } |
438 | 438 | |
439 | 439 | |
... | ... | @@ -443,7 +443,7 @@ LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *hSession, unsigned int badd |
443 | 443 | |
444 | 444 | trace("%s(%d)",__FUNCTION__,baddr); |
445 | 445 | |
446 | - if(baddr > (hSession->rows * hSession->cols)) | |
446 | + if(baddr > (hSession->view.rows * hSession->view.cols)) | |
447 | 447 | return - (errno = EOVERFLOW); |
448 | 448 | |
449 | 449 | if(hSession->selected && !lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_SELECTED)) |
... | ... | @@ -481,8 +481,8 @@ int cursor_move(H3270 *hSession, int baddr) |
481 | 481 | hSession->cursor_addr = baddr; |
482 | 482 | hSession->cbk.update_cursor( |
483 | 483 | hSession, |
484 | - (unsigned short) (baddr/hSession->cols), | |
485 | - (unsigned short) (baddr%hSession->cols), | |
484 | + (unsigned short) (baddr/hSession->view.cols), | |
485 | + (unsigned short) (baddr%hSession->view.cols), | |
486 | 486 | hSession->text[baddr].chr, |
487 | 487 | hSession->text[baddr].attr |
488 | 488 | ); |
... | ... | @@ -652,16 +652,16 @@ void set_viewsize(H3270 *session, unsigned int rows, unsigned int cols) |
652 | 652 | { |
653 | 653 | CHECK_SESSION_HANDLE(session); |
654 | 654 | |
655 | - if(rows == session->rows && session->cols == cols) | |
655 | + if(rows == session->view.rows && session->view.cols == cols) | |
656 | 656 | return; |
657 | 657 | |
658 | - session->rows = rows; | |
659 | - session->cols = cols; | |
658 | + session->view.rows = rows; | |
659 | + session->view.cols = cols; | |
660 | 660 | |
661 | 661 | trace("View size changes to %dx%d",rows,cols); |
662 | 662 | |
663 | 663 | if(session->cbk.configure) |
664 | - session->cbk.configure(session,session->rows,session->cols); | |
664 | + session->cbk.configure(session,session->view.rows,session->view.cols); | |
665 | 665 | |
666 | 666 | } |
667 | 667 | |
... | ... | @@ -896,7 +896,7 @@ LIB3270_EXPORT int lib3270_testpattern(H3270 *hSession) |
896 | 896 | |
897 | 897 | FAIL_IF_ONLINE(hSession); |
898 | 898 | |
899 | - max = (hSession->maxROWS * hSession->maxCOLS); | |
899 | + max = (hSession->max.rows * hSession->max.cols); | |
900 | 900 | for(f=0;f<max;f++) |
901 | 901 | { |
902 | 902 | if(!pat[row].cc[pos]) | ... | ... |
src/core/session.c
... | ... | @@ -273,7 +273,7 @@ static void set_timer(H3270 GNUC_UNUSED(*session), unsigned char GNUC_UNUSED(on) |
273 | 273 | static void screen_disp(H3270 *session) |
274 | 274 | { |
275 | 275 | CHECK_SESSION_HANDLE(session); |
276 | - screen_update(session,0,session->rows*session->cols); | |
276 | + screen_update(session,0,session->view.rows*session->view.cols); | |
277 | 277 | } |
278 | 278 | |
279 | 279 | static void nop_int(H3270 GNUC_UNUSED(*session), int GNUC_UNUSED(width)) | ... | ... |
src/core/sf.c
... | ... | @@ -552,14 +552,14 @@ static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int bu |
552 | 552 | GET16(h, &buf[6]); |
553 | 553 | trace_ds(hSession,",h=%d", h); |
554 | 554 | } else |
555 | - h = hSession->maxROWS; | |
555 | + h = hSession->max.rows; | |
556 | 556 | |
557 | 557 | if (buflen > 9) |
558 | 558 | { |
559 | 559 | GET16(w, &buf[8]); |
560 | 560 | trace_ds(hSession,",w=%d", w); |
561 | 561 | } else |
562 | - w = hSession->maxCOLS; | |
562 | + w = hSession->max.cols; | |
563 | 563 | |
564 | 564 | if (buflen > 11) |
565 | 565 | { |
... | ... | @@ -579,14 +579,14 @@ static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int bu |
579 | 579 | GET16(hv, &buf[14]); |
580 | 580 | trace_ds(hSession,",hv=%d", hv); |
581 | 581 | } else |
582 | - hv = (h > hSession->maxROWS)? hSession->maxROWS: h; | |
582 | + hv = (h > hSession->max.rows)? hSession->max.rows: h; | |
583 | 583 | |
584 | 584 | if (buflen > 17) |
585 | 585 | { |
586 | 586 | GET16(wv, &buf[16]); |
587 | 587 | trace_ds(hSession,",wv=%d", wv); |
588 | 588 | } else |
589 | - wv = (w > hSession->maxCOLS)? hSession->maxCOLS: w; | |
589 | + wv = (w > hSession->max.cols)? hSession->max.cols: w; | |
590 | 590 | |
591 | 591 | if (buflen > 19) |
592 | 592 | { |
... | ... | @@ -787,8 +787,8 @@ static void do_qr_usable_area(H3270 *hSession) |
787 | 787 | space3270out(hSession,19); |
788 | 788 | *hSession->obptr++ = 0x01; /* 12/14-bit addressing */ |
789 | 789 | *hSession->obptr++ = 0x00; /* no special character features */ |
790 | - SET16(hSession->obptr, hSession->maxCOLS); /* usable width */ | |
791 | - SET16(hSession->obptr, hSession->maxROWS); /* usable height */ | |
790 | + SET16(hSession->obptr, hSession->max.cols); /* usable width */ | |
791 | + SET16(hSession->obptr, hSession->max.rows); /* usable height */ | |
792 | 792 | *hSession->obptr++ = 0x01; /* units (mm) */ |
793 | 793 | num = display_widthMM(); |
794 | 794 | denom = display_width(); |
... | ... | @@ -810,7 +810,7 @@ static void do_qr_usable_area(H3270 *hSession) |
810 | 810 | SET16(hSession->obptr, (int)denom); /* Yr denominator */ |
811 | 811 | *hSession->obptr++ = *char_width; /* AW */ |
812 | 812 | *hSession->obptr++ = *char_height; /* AH */ |
813 | - SET16(hSession->obptr, hSession->maxCOLS * hSession->maxROWS); /* buffer, questionable */ | |
813 | + SET16(hSession->obptr, hSession->max.cols * hSession->max.cols); /* buffer, questionable */ | |
814 | 814 | } |
815 | 815 | |
816 | 816 | static void do_qr_color(H3270 *hSession) |
... | ... | @@ -897,7 +897,7 @@ static void do_qr_alpha_part(H3270 *hSession) |
897 | 897 | trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n"); |
898 | 898 | space3270out(hSession,4); |
899 | 899 | *hSession->obptr++ = 0; /* 1 partition */ |
900 | - SET16(hSession->obptr, hSession->maxROWS * hSession->maxCOLS); /* buffer space */ | |
900 | + SET16(hSession->obptr, hSession->max.cols * hSession->max.rows); /* buffer space */ | |
901 | 901 | *hSession->obptr++ = 0; /* no special features */ |
902 | 902 | } |
903 | 903 | |
... | ... | @@ -1009,8 +1009,8 @@ static void do_qr_imp_part(H3270 *hSession) |
1009 | 1009 | *hSession->obptr++ = 0x00; /* reserved */ |
1010 | 1010 | SET16(hSession->obptr, 80); /* implicit partition width */ |
1011 | 1011 | SET16(hSession->obptr, 24); /* implicit partition height */ |
1012 | - SET16(hSession->obptr, hSession->maxCOLS); /* alternate height */ | |
1013 | - SET16(hSession->obptr, hSession->maxROWS); /* alternate width */ | |
1012 | + SET16(hSession->obptr, hSession->max.cols); /* alternate height */ | |
1013 | + SET16(hSession->obptr, hSession->max.rows); /* alternate width */ | |
1014 | 1014 | } |
1015 | 1015 | |
1016 | 1016 | static void query_reply_end(H3270 *hSession) | ... | ... |
src/core/telnet.c
... | ... | @@ -246,9 +246,8 @@ static const char *trsp_flag[2] = { "POSITIVE-RESPONSE", "NEGATIVE-RESPONSE" }; |
246 | 246 | #endif /*]*/ |
247 | 247 | #endif /*]*/ |
248 | 248 | |
249 | -#define XMIT_ROWS hSession->maxROWS | |
250 | -#define XMIT_COLS hSession->maxCOLS | |
251 | - | |
249 | +#define XMIT_ROWS hSession->max.rows | |
250 | +#define XMIT_COLS hSession->max.cols | |
252 | 251 | |
253 | 252 | #if defined(_WIN32) /*[*/ |
254 | 253 | #define socket_errno() WSAGetLastError() | ... | ... |
src/core/toggles.c
... | ... | @@ -338,7 +338,7 @@ LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE ix) |
338 | 338 | static void toggle_altscreen(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) |
339 | 339 | { |
340 | 340 | if(!session->screen_alt) |
341 | - set_viewsize(session,t->value ? 24 : session->maxROWS,80); | |
341 | + set_viewsize(session,t->value ? 24 : session->max.rows,80); | |
342 | 342 | } |
343 | 343 | |
344 | 344 | static void toggle_redraw(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) | ... | ... |
src/core/trace_ds.c
... | ... | @@ -77,7 +77,7 @@ static void wtrace(H3270 *session, const char *fmt, ...); |
77 | 77 | const char * rcba(H3270 *hSession, int baddr) |
78 | 78 | { |
79 | 79 | static char buf[48]; |
80 | - (void) snprintf(buf, 48, "(%d,%d)", baddr/hSession->cols + 1, baddr%hSession->cols + 1); | |
80 | + (void) snprintf(buf, 48, "(%d,%d)", baddr/hSession->view.cols + 1, baddr%hSession->view.cols + 1); | |
81 | 81 | return buf; |
82 | 82 | } |
83 | 83 | |
... | ... | @@ -262,12 +262,12 @@ void trace_screen(H3270 *session) |
262 | 262 | { |
263 | 263 | unsigned int row, baddr; |
264 | 264 | |
265 | - for(row=baddr=0;row < session->rows;row++) | |
265 | + for(row=baddr=0;row < session->view.rows;row++) | |
266 | 266 | { |
267 | 267 | unsigned int col; |
268 | 268 | wtrace(session,"%02d ",row+1); |
269 | 269 | |
270 | - for(col = 0; col < session->cols;col++) | |
270 | + for(col = 0; col < session->view.cols;col++) | |
271 | 271 | { |
272 | 272 | if(session->text[baddr].attr & LIB3270_ATTR_CG) |
273 | 273 | wtrace(session,"%c",'.'); |
... | ... | @@ -305,7 +305,7 @@ void trace_ansi_disc(H3270 *hSession) |
305 | 305 | unsigned int i; |
306 | 306 | |
307 | 307 | wtrace(hSession,"%c",'\n'); |
308 | - for (i = 0; i < hSession->cols; i++) | |
308 | + for (i = 0; i < hSession->view.cols; i++) | |
309 | 309 | wtrace(hSession,"%c",'='); |
310 | 310 | wtrace(hSession,"%c",'\n'); |
311 | 311 | ... | ... |
src/include/3270ds.h
... | ... | @@ -141,11 +141,11 @@ |
141 | 141 | #define QR_IMP_PART 0xa6 /* implicit partition */ |
142 | 142 | #define QR_NULL 0xff /* null */ |
143 | 143 | |
144 | -#define BA_TO_ROW(ba) ((ba) / hSession->cols) | |
145 | -#define BA_TO_COL(ba) ((ba) % hSession->cols) | |
146 | -#define ROWCOL_TO_BA(r,c) (((r) * hSession->cols) + c) | |
147 | -#define INC_BA(ba) { (ba) = ((ba) + 1) % (hSession->cols * hSession->rows); } | |
148 | -#define DEC_BA(ba) { (ba) = (ba) ? (ba - 1) : (((int) (hSession->cols*hSession->rows)) - 1); } | |
144 | +#define BA_TO_ROW(ba) ((ba) / hSession->view.cols) | |
145 | +#define BA_TO_COL(ba) ((ba) % hSession->view.cols) | |
146 | +#define ROWCOL_TO_BA(r,c) (((r) * hSession->view.cols) + c) | |
147 | +#define INC_BA(ba) { (ba) = ((ba) + 1) % (hSession->view.cols * hSession->view.rows); } | |
148 | +#define DEC_BA(ba) { (ba) = (ba) ? (ba - 1) : (((int) (hSession->view.cols*hSession->view.rows)) - 1); } | |
149 | 149 | |
150 | 150 | /** Field attributes. */ |
151 | 151 | #define FA_PRINTABLE 0xc0 ///< @brief these make the character "printable" */ | ... | ... |
src/include/lib3270-internals.h
... | ... | @@ -362,7 +362,7 @@ struct _h3270 |
362 | 362 | int modified_sel : 1; |
363 | 363 | int mono : 1; ///< @brief Forces monochrome display |
364 | 364 | int m3279 : 1; |
365 | - int extended : 1; | |
365 | + int extended : 1; ///< @brief Extended data stream. | |
366 | 366 | int typeahead : 1; |
367 | 367 | int numeric_lock : 1; |
368 | 368 | int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard. |
... | ... | @@ -385,8 +385,6 @@ struct _h3270 |
385 | 385 | int formatted : 1; /**< @brief Formatted screen flag */ |
386 | 386 | int starting : 1; /**< @brief Is starting (no first screen)? */ |
387 | 387 | |
388 | - char * oversize; | |
389 | - | |
390 | 388 | struct lib3270_toggle |
391 | 389 | { |
392 | 390 | char value; /**< toggle value */ |
... | ... | @@ -428,12 +426,28 @@ struct _h3270 |
428 | 426 | H3270FT * ft; /**< @brief Active file transfer data */ |
429 | 427 | |
430 | 428 | // screen info |
431 | - unsigned int ov_rows; | |
432 | - unsigned int ov_cols; | |
433 | - unsigned int maxROWS; | |
434 | - unsigned int maxCOLS; | |
435 | - unsigned int rows; | |
436 | - unsigned int cols; | |
429 | + | |
430 | + // Oversize. | |
431 | + struct | |
432 | + { | |
433 | + char * str; | |
434 | + unsigned int rows; | |
435 | + unsigned int cols; | |
436 | + } oversize; | |
437 | + | |
438 | + // Maximum screen size. | |
439 | + struct | |
440 | + { | |
441 | + unsigned int rows; | |
442 | + unsigned int cols; | |
443 | + } max; | |
444 | + | |
445 | + // View size | |
446 | + struct { | |
447 | + unsigned int rows; | |
448 | + unsigned int cols; | |
449 | + } view; | |
450 | + | |
437 | 451 | LIB3270_POINTER pointer; /**< @brief Current pointer. */ |
438 | 452 | int cursor_addr; |
439 | 453 | int buffer_addr; | ... | ... |
src/include/lib3270.h
... | ... | @@ -1196,7 +1196,7 @@ |
1196 | 1196 | * @param col Desired col. |
1197 | 1197 | * |
1198 | 1198 | */ |
1199 | - LIB3270_EXPORT int lib3270_get_is_protected_at(H3270 *h, int row, int col); | |
1199 | + LIB3270_EXPORT int lib3270_get_is_protected_at(H3270 *h, unsigned int row, unsigned int col); | |
1200 | 1200 | |
1201 | 1201 | /** |
1202 | 1202 | * @brief Get address of the first blank. | ... | ... |
src/include/lib3270/properties.h
... | ... | @@ -128,6 +128,7 @@ |
128 | 128 | /** |
129 | 129 | * @brief Set lib3270 integer property by name. |
130 | 130 | * |
131 | + * @param hSession Session handle. | |
131 | 132 | * @param name Nome of the property. |
132 | 133 | * @param value New property value. |
133 | 134 | * @param seconds Time (in seconds) whe should wait for "ready" state (0 = none). |
... | ... | @@ -137,6 +138,31 @@ |
137 | 138 | */ |
138 | 139 | LIB3270_EXPORT int lib3270_set_string_property(H3270 * hSession, const char *name, const char * value, int seconds); |
139 | 140 | |
141 | + | |
142 | + /** | |
143 | + * @brief Get Oversize. | |
144 | + * | |
145 | + * @param hSession Session handle. | |
146 | + * | |
147 | + * @return Oversize definition (NULL if not set). | |
148 | + * | |
149 | + */ | |
150 | + LIB3270_EXPORT const char * lib3270_get_oversize(H3270 *hSession); | |
151 | + | |
152 | + /** | |
153 | + * @brief Set oversize. | |
154 | + * | |
155 | + * @param hSession Session handle. | |
156 | + * @param value Oversize value. | |
157 | + * | |
158 | + * @return 0 if success, error code if not (sets errno) | |
159 | + * | |
160 | + * @retval EISCONN Already connected to host. | |
161 | + * @retval ENOTSUP Oversize is not supported. | |
162 | + * | |
163 | + */ | |
164 | + LIB3270_EXPORT int lib3270_set_oversize(H3270 *hSession, const char *value); | |
165 | + | |
140 | 166 | #ifdef __cplusplus |
141 | 167 | } |
142 | 168 | #endif | ... | ... |
src/selection/actions.c
... | ... | @@ -51,7 +51,7 @@ LIB3270_EXPORT int lib3270_unselect(H3270 *hSession) |
51 | 51 | { |
52 | 52 | hSession->selected = 0; |
53 | 53 | |
54 | - for(a = 0; a < ((int) (hSession->rows*hSession->cols)); a++) | |
54 | + for(a = 0; a < ((int) (hSession->view.rows * hSession->view.cols)); a++) | |
55 | 55 | { |
56 | 56 | if(hSession->text[a].attr & LIB3270_ATTR_SELECTED) |
57 | 57 | { |
... | ... | @@ -94,7 +94,7 @@ LIB3270_EXPORT int lib3270_select_region(H3270 *h, int start, int end) |
94 | 94 | if(!lib3270_connected(h)) |
95 | 95 | return ENOTCONN; |
96 | 96 | |
97 | - maxlen = (h->rows * h->cols); | |
97 | + maxlen = (h->view.rows * h->view.cols); | |
98 | 98 | |
99 | 99 | // Check bounds |
100 | 100 | if(start < 0 || start > maxlen || end < 0 || end > maxlen || start > end) |
... | ... | @@ -143,7 +143,7 @@ LIB3270_EXPORT int lib3270_select_all(H3270 * hSession) |
143 | 143 | { |
144 | 144 | FAIL_IF_NOT_ONLINE(hSession); |
145 | 145 | |
146 | - do_select(hSession,0,(hSession->rows*hSession->cols)-1,0); | |
146 | + do_select(hSession,0,(hSession->view.rows * hSession->view.cols)-1,0); | |
147 | 147 | |
148 | 148 | return 0; |
149 | 149 | } |
... | ... | @@ -200,28 +200,28 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) |
200 | 200 | if(!lib3270_get_selection_bounds(hSession,&pos[0],&pos[1])) |
201 | 201 | return from; |
202 | 202 | |
203 | - rows = (to / hSession->cols) - (from / hSession->cols); | |
204 | - cols = (to % hSession->cols) - (from % hSession->cols); | |
203 | + rows = (to / hSession->view.cols) - (from / hSession->view.cols); | |
204 | + cols = (to % hSession->view.cols) - (from % hSession->view.cols); | |
205 | 205 | |
206 | 206 | for(f=0;f<2;f++) |
207 | 207 | { |
208 | - int row = (pos[f] / hSession->cols) + rows; | |
209 | - int col = (pos[f] % hSession->cols) + cols; | |
208 | + int row = (pos[f] / hSession->view.cols) + rows; | |
209 | + int col = (pos[f] % hSession->view.cols) + cols; | |
210 | 210 | |
211 | 211 | if(row < 0) |
212 | - rows = - (pos[f] / hSession->cols); | |
212 | + rows = - (pos[f] / hSession->view.cols); | |
213 | 213 | |
214 | 214 | if(col < 0) |
215 | - cols = - (pos[f] % hSession->cols); | |
215 | + cols = - (pos[f] % hSession->view.cols); | |
216 | 216 | |
217 | - if(row >= ((int) hSession->rows)) | |
218 | - rows = hSession->rows - ((pos[f] / hSession->cols)+1); | |
217 | + if(row >= ((int) hSession->view.rows)) | |
218 | + rows = hSession->view.rows - ((pos[f] / hSession->view.cols)+1); | |
219 | 219 | |
220 | - if(col >= ((int) hSession->cols)) | |
221 | - cols = hSession->cols - ((pos[f] % hSession->cols)+1); | |
220 | + if(col >= ((int) hSession->view.cols)) | |
221 | + cols = hSession->view.cols - ((pos[f] % hSession->view.cols)+1); | |
222 | 222 | } |
223 | 223 | |
224 | - step = (rows * hSession->cols) + cols; | |
224 | + step = (rows * hSession->view.cols) + cols; | |
225 | 225 | |
226 | 226 | do_select(hSession,hSession->select.start + step,hSession->select.end + step,hSession->rectsel); |
227 | 227 | cursor_move(hSession,hSession->select.end); |
... | ... | @@ -251,20 +251,20 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig |
251 | 251 | else if((flag&0x8F) == SELECTION_ACTIVE) |
252 | 252 | return lib3270_move_selected_area(h,origin,baddr); |
253 | 253 | |
254 | - row = baddr/h->cols; | |
255 | - col = baddr%h->cols; | |
254 | + row = baddr/h->view.cols; | |
255 | + col = baddr%h->view.cols; | |
256 | 256 | |
257 | 257 | if(flag & SELECTION_LEFT) // Update left margin |
258 | - origin = first = ((first/h->cols)*h->cols) + col; | |
258 | + origin = first = ((first/h->view.cols)*h->view.cols) + col; | |
259 | 259 | |
260 | 260 | if(flag & SELECTION_TOP) // Update top margin |
261 | - origin = first = (row*h->cols) + (first%h->cols); | |
261 | + origin = first = (row*h->view.cols) + (first%h->view.cols); | |
262 | 262 | |
263 | 263 | if(flag & SELECTION_RIGHT) // Update right margin |
264 | - origin = last = ((last/h->cols)*h->cols) + col; | |
264 | + origin = last = ((last/h->view.cols)*h->view.cols) + col; | |
265 | 265 | |
266 | 266 | if(flag & SELECTION_BOTTOM) // Update bottom margin |
267 | - origin = last = (row*h->cols) + (last%h->cols); | |
267 | + origin = last = (row*h->view.cols) + (last%h->view.cols); | |
268 | 268 | |
269 | 269 | trace("origin=%d first=%d last=%d",origin,first,last); |
270 | 270 | |
... | ... | @@ -291,28 +291,28 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir |
291 | 291 | switch(dir) |
292 | 292 | { |
293 | 293 | case LIB3270_DIR_UP: |
294 | - if(start <= ((int) hSession->cols)) | |
294 | + if(start <= ((int) hSession->view.cols)) | |
295 | 295 | return EINVAL; |
296 | - start -= hSession->cols; | |
297 | - end -= hSession->cols; | |
296 | + start -= hSession->view.cols; | |
297 | + end -= hSession->view.cols; | |
298 | 298 | break; |
299 | 299 | |
300 | 300 | case LIB3270_DIR_DOWN: |
301 | - if(end >= ((int) (hSession->cols * (hSession->rows-1)))) | |
301 | + if(end >= ((int) (hSession->view.cols * (hSession->view.rows-1)))) | |
302 | 302 | return EINVAL; |
303 | - start += hSession->cols; | |
304 | - end += hSession->cols; | |
303 | + start += hSession->view.cols; | |
304 | + end += hSession->view.cols; | |
305 | 305 | break; |
306 | 306 | |
307 | 307 | case LIB3270_DIR_LEFT: |
308 | - if( (start % hSession->cols) < 1) | |
308 | + if( (start % hSession->view.cols) < 1) | |
309 | 309 | return EINVAL; |
310 | 310 | start--; |
311 | 311 | end--; |
312 | 312 | break; |
313 | 313 | |
314 | 314 | case LIB3270_DIR_RIGHT: |
315 | - if( (end % hSession->cols) >= (hSession->cols-1)) | |
315 | + if( (end % hSession->view.cols) >= (hSession->view.cols-1)) | |
316 | 316 | return EINVAL; |
317 | 317 | start++; |
318 | 318 | end++; | ... | ... |
src/selection/get.c
... | ... | @@ -53,7 +53,7 @@ LIB3270_EXPORT char * lib3270_get_selected_text(H3270 *hSession, char tok, LIB32 |
53 | 53 | { |
54 | 54 | int row, col, baddr; |
55 | 55 | char * ret; |
56 | - size_t buflen = (hSession->rows * (hSession->cols+1))+1; | |
56 | + size_t buflen = (hSession->view.rows * (hSession->view.cols+1))+1; | |
57 | 57 | size_t sz = 0; |
58 | 58 | unsigned short attr = 0xFFFF; |
59 | 59 | char cut = (options & LIB3270_SELECTION_CUT) != 0; |
... | ... | @@ -73,11 +73,11 @@ LIB3270_EXPORT char * lib3270_get_selected_text(H3270 *hSession, char tok, LIB32 |
73 | 73 | baddr = 0; |
74 | 74 | unsigned char fa = 0; |
75 | 75 | |
76 | - for(row=0;row < ((int) hSession->rows);row++) | |
76 | + for(row=0;row < ((int) hSession->view.rows);row++) | |
77 | 77 | { |
78 | 78 | int cr = 0; |
79 | 79 | |
80 | - for(col = 0; col < ((int) hSession->cols);col++) | |
80 | + for(col = 0; col < ((int) hSession->view.cols);col++) | |
81 | 81 | { |
82 | 82 | if(hSession->ea_buf[baddr].fa) { |
83 | 83 | fa = hSession->ea_buf[baddr].fa; | ... | ... |
src/selection/selection.c
... | ... | @@ -65,10 +65,10 @@ static void update_selected_rectangle(H3270 *session) |
65 | 65 | get_selected_addr(session,&begin,&end); |
66 | 66 | |
67 | 67 | // Get start & end posision |
68 | - p[0].row = (begin/session->cols); | |
69 | - p[0].col = (begin%session->cols); | |
70 | - p[1].row = (end/session->cols); | |
71 | - p[1].col = (end%session->cols); | |
68 | + p[0].row = (begin/session->view.cols); | |
69 | + p[0].col = (begin%session->view.cols); | |
70 | + p[1].row = (end/session->view.cols); | |
71 | + p[1].col = (end%session->view.cols); | |
72 | 72 | |
73 | 73 | if(p[0].row > p[1].row) |
74 | 74 | { |
... | ... | @@ -86,9 +86,9 @@ static void update_selected_rectangle(H3270 *session) |
86 | 86 | |
87 | 87 | // First remove unselected areas |
88 | 88 | baddr = 0; |
89 | - for(row=0;row < ((int) session->rows);row++) | |
89 | + for(row=0;row < ((int) session->view.rows);row++) | |
90 | 90 | { |
91 | - for(col = 0; col < ((int) session->cols);col++) | |
91 | + for(col = 0; col < ((int) session->view.cols);col++) | |
92 | 92 | { |
93 | 93 | if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (session->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
94 | 94 | { |
... | ... | @@ -101,9 +101,9 @@ static void update_selected_rectangle(H3270 *session) |
101 | 101 | |
102 | 102 | // Then, draw selected ones |
103 | 103 | baddr = 0; |
104 | - for(row=0;row < ((int) session->rows);row++) | |
104 | + for(row=0;row < ((int) session->view.rows);row++) | |
105 | 105 | { |
106 | - for(col = 0; col < ((int) session->cols);col++) | |
106 | + for(col = 0; col < ((int) session->view.cols);col++) | |
107 | 107 | { |
108 | 108 | if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(session->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
109 | 109 | { |
... | ... | @@ -119,7 +119,7 @@ static void update_selected_rectangle(H3270 *session) |
119 | 119 | static void update_selected_region(H3270 *session) |
120 | 120 | { |
121 | 121 | int baddr,begin,end; |
122 | - int len = session->rows*session->cols; | |
122 | + int len = session->view.rows * session->view.cols; | |
123 | 123 | |
124 | 124 | get_selected_addr(session,&begin,&end); |
125 | 125 | |
... | ... | @@ -167,7 +167,7 @@ void toggle_rectselect(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LI |
167 | 167 | |
168 | 168 | void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect) |
169 | 169 | { |
170 | - if(end > (h->rows * h->cols)) | |
170 | + if(end > (h->view.rows * h->view.cols)) | |
171 | 171 | return; |
172 | 172 | |
173 | 173 | // Do we really need to change selection? |
... | ... | @@ -209,11 +209,11 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba |
209 | 209 | if(!(lib3270_connected(hSession) && (hSession->text[baddr].attr & LIB3270_ATTR_SELECTED))) |
210 | 210 | return rc; |
211 | 211 | |
212 | - row = baddr / hSession->cols; | |
213 | - col = baddr % hSession->cols; | |
212 | + row = baddr / hSession->view.cols; | |
213 | + col = baddr % hSession->view.cols; | |
214 | 214 | rc |= SELECTION_ACTIVE; |
215 | 215 | |
216 | - if( (hSession->select.start % hSession->cols) == (hSession->select.end % hSession->cols) ) | |
216 | + if( (hSession->select.start % hSession->view.cols) == (hSession->select.end % hSession->view.cols) ) | |
217 | 217 | { |
218 | 218 | rc |= SELECTION_SINGLE_COL; |
219 | 219 | } |
... | ... | @@ -224,20 +224,20 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba |
224 | 224 | |
225 | 225 | /// FIXME: It should test if baddr is the last element before the +1. |
226 | 226 | |
227 | - if( (col == ((int) hSession->cols)) || !(hSession->text[baddr+1].attr & LIB3270_ATTR_SELECTED) ) | |
227 | + if( (col == ((int) hSession->view.cols)) || !(hSession->text[baddr+1].attr & LIB3270_ATTR_SELECTED) ) | |
228 | 228 | rc |= SELECTION_RIGHT; |
229 | 229 | } |
230 | 230 | |
231 | - if( (hSession->select.start / hSession->cols) == (hSession->select.end / hSession->cols) ) | |
231 | + if( (hSession->select.start / hSession->view.cols) == (hSession->select.end / hSession->view.cols) ) | |
232 | 232 | { |
233 | 233 | rc |= SELECTION_SINGLE_ROW; |
234 | 234 | } |
235 | 235 | else |
236 | 236 | { |
237 | - if( (row == 0) || !(hSession->text[baddr-hSession->cols].attr & LIB3270_ATTR_SELECTED) ) | |
237 | + if( (row == 0) || !(hSession->text[baddr-hSession->view.cols].attr & LIB3270_ATTR_SELECTED) ) | |
238 | 238 | rc |= SELECTION_TOP; |
239 | 239 | |
240 | - if( (row == ((int) hSession->rows)) || !(hSession->text[baddr+hSession->cols].attr & LIB3270_ATTR_SELECTED) ) | |
240 | + if( (row == ((int) hSession->view.rows)) || !(hSession->text[baddr+hSession->view.cols].attr & LIB3270_ATTR_SELECTED) ) | |
241 | 241 | rc |= SELECTION_BOTTOM; |
242 | 242 | } |
243 | 243 | |
... | ... | @@ -254,7 +254,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u |
254 | 254 | if(check_online_session(h)) |
255 | 255 | return NULL; |
256 | 256 | |
257 | - maxlen = h->rows * (h->cols+1); | |
257 | + maxlen = h->view.rows * (h->view.cols+1); | |
258 | 258 | |
259 | 259 | if(start_pos < 0 || start_pos > maxlen || end_pos < 0 || end_pos > maxlen || end_pos < start_pos) |
260 | 260 | return NULL; |
... | ... | @@ -266,7 +266,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u |
266 | 266 | if(all || h->text[baddr].attr & LIB3270_ATTR_SELECTED) |
267 | 267 | text[sz++] = (h->text[baddr].attr & LIB3270_ATTR_CG) ? ' ' : h->text[baddr].chr; |
268 | 268 | |
269 | - if((baddr%h->cols) == 0 && sz > 0) | |
269 | + if((baddr%h->view.cols) == 0 && sz > 0) | |
270 | 270 | text[sz++] = '\n'; |
271 | 271 | } |
272 | 272 | text[sz++] = 0; |
... | ... | @@ -291,7 +291,7 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le |
291 | 291 | if(offset < 0) |
292 | 292 | offset = lib3270_get_cursor_address(h); |
293 | 293 | |
294 | - maxlen = (h->rows * (h->cols+ (lf ? 1 : 0) )) - offset; | |
294 | + maxlen = (h->view.rows * (h->view.cols+ (lf ? 1 : 0) )) - offset; | |
295 | 295 | if(maxlen <= 0 || offset < 0) |
296 | 296 | { |
297 | 297 | errno = EOVERFLOW; |
... | ... | @@ -321,7 +321,7 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le |
321 | 321 | offset++; |
322 | 322 | len--; |
323 | 323 | |
324 | - if(lf && (offset%h->cols) == 0 && len > 0) | |
324 | + if(lf && (offset%h->view.cols) == 0 && len > 0) | |
325 | 325 | { |
326 | 326 | *(ptr++) = lf; |
327 | 327 | len--; |
... | ... | @@ -408,16 +408,16 @@ LIB3270_EXPORT int lib3270_get_selection_rectangle(H3270 *hSession, unsigned int |
408 | 408 | if(!hSession->selected || hSession->select.start == hSession->select.end) |
409 | 409 | return errno = ENOENT; |
410 | 410 | |
411 | - minRow = hSession->rows; | |
412 | - minCol = hSession->cols; | |
411 | + minRow = hSession->view.rows; | |
412 | + minCol = hSession->view.cols; | |
413 | 413 | maxRow = 0; |
414 | 414 | maxCol = 0; |
415 | 415 | baddr = 0; |
416 | 416 | count = 0; |
417 | 417 | |
418 | - for(r=0;r < hSession->rows;r++) | |
418 | + for(r=0;r < hSession->view.rows;r++) | |
419 | 419 | { |
420 | - for(c = 0; c < hSession->cols;c++) | |
420 | + for(c = 0; c < hSession->view.cols;c++) | |
421 | 421 | { |
422 | 422 | if(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED) |
423 | 423 | { | ... | ... |