Commit 803eba3bce9ddcadce8c854ade0d87921b471aa9

Authored by Perry Werneck
1 parent 48355f11

Adjusments on preparation for oversize support.

@@ -110,6 +110,9 @@ @@ -110,6 +110,9 @@
110 <Unit filename="src/core/log.c"> 110 <Unit filename="src/core/log.c">
111 <Option compilerVar="CC" /> 111 <Option compilerVar="CC" />
112 </Unit> 112 </Unit>
  113 + <Unit filename="src/core/model.c">
  114 + <Option compilerVar="CC" />
  115 + </Unit>
113 <Unit filename="src/core/options.c"> 116 <Unit filename="src/core/options.c">
114 <Option compilerVar="CC" /> 117 <Option compilerVar="CC" />
115 </Unit> 118 </Unit>
src/core/ansi.c
@@ -533,10 +533,10 @@ static enum lib3270_ansi_state ansi_newline(H3270 *hSession, int GNUC_UNUSED(ig1 @@ -533,10 +533,10 @@ static enum lib3270_ansi_state ansi_newline(H3270 *hSession, int GNUC_UNUSED(ig1
533 { 533 {
534 int nc; 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 cursor_move(hSession,nc); 540 cursor_move(hSession,nc);
541 else 541 else
542 ansi_scroll(hSession); 542 ansi_scroll(hSession);
@@ -552,11 +552,11 @@ ansi_cursor_up(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -552,11 +552,11 @@ ansi_cursor_up(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
552 552
553 if (nn < 1) 553 if (nn < 1)
554 nn = 1; 554 nn = 1;
555 - rr = hSession->cursor_addr / hSession->cols; 555 + rr = hSession->cursor_addr / hSession->view.cols;
556 if (rr - nn < 0) 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 else 558 else
559 - cursor_move(hSession, hSession->cursor_addr - (nn * hSession->cols)); 559 + cursor_move(hSession, hSession->cursor_addr - (nn * hSession->view.cols));
560 hSession->held_wrap = 0; 560 hSession->held_wrap = 0;
561 return DATA; 561 return DATA;
562 } 562 }
@@ -607,17 +607,17 @@ static enum lib3270_ansi_state ansi_reset(H3270 *hSession, int GNUC_UNUSED(ig1), @@ -607,17 +607,17 @@ static enum lib3270_ansi_state ansi_reset(H3270 *hSession, int GNUC_UNUSED(ig1),
607 hSession->saved_altbuffer = 0; 607 hSession->saved_altbuffer = 0;
608 608
609 hSession->scroll_top = 1; 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 hSession->tabs[i] = 0x01; 614 hSession->tabs[i] = 0x01;
615 615
616 hSession->held_wrap = 0; 616 hSession->held_wrap = 0;
617 if (!hSession->ansi_reset) 617 if (!hSession->ansi_reset)
618 { 618 {
619 ctlr_altbuffer(hSession,True); 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 ctlr_altbuffer(hSession,False); 621 ctlr_altbuffer(hSession,False);
622 ctlr_clear(hSession,False); 622 ctlr_clear(hSession,False);
623 hSession->cbk.set_width(hSession,80); 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,8 +630,8 @@ static enum lib3270_ansi_state ansi_reset(H3270 *hSession, int GNUC_UNUSED(ig1),
630 static enum lib3270_ansi_state 630 static enum lib3270_ansi_state
631 ansi_insert_chars(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) 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 int ns; /* chars that are shifting */ 635 int ns; /* chars that are shifting */
636 636
637 if (nn < 1) 637 if (nn < 1)
@@ -656,11 +656,11 @@ ansi_cursor_down(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -656,11 +656,11 @@ ansi_cursor_down(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
656 656
657 if (nn < 1) 657 if (nn < 1)
658 nn = 1; 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 else 662 else
663 - cursor_move(hSession,hSession->cursor_addr + (nn * hSession->cols)); 663 + cursor_move(hSession,hSession->cursor_addr + (nn * hSession->view.cols));
664 hSession->held_wrap = 0; 664 hSession->held_wrap = 0;
665 return DATA; 665 return DATA;
666 } 666 }
@@ -671,11 +671,11 @@ static enum lib3270_ansi_state ansi_cursor_right(H3270 *hSession, int nn, int GN @@ -671,11 +671,11 @@ static enum lib3270_ansi_state ansi_cursor_right(H3270 *hSession, int nn, int GN
671 671
672 if (nn < 1) 672 if (nn < 1)
673 nn = 1; 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 return DATA; 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 cursor_move(hSession,hSession->cursor_addr + nn); 679 cursor_move(hSession,hSession->cursor_addr + nn);
680 hSession->held_wrap = 0; 680 hSession->held_wrap = 0;
681 return DATA; 681 return DATA;
@@ -693,7 +693,7 @@ ansi_cursor_left(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -693,7 +693,7 @@ ansi_cursor_left(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
693 } 693 }
694 if (nn < 1) 694 if (nn < 1)
695 nn = 1; 695 nn = 1;
696 - cc = hSession->cursor_addr % hSession->cols; 696 + cc = hSession->cursor_addr % hSession->view.cols;
697 if (!cc) 697 if (!cc)
698 return DATA; 698 return DATA;
699 if (nn > cc) 699 if (nn > cc)
@@ -706,10 +706,10 @@ static enum lib3270_ansi_state @@ -706,10 +706,10 @@ static enum lib3270_ansi_state
706 ansi_cursor_motion(H3270 *hSession, int n1, int n2) 706 ansi_cursor_motion(H3270 *hSession, int n1, int n2)
707 { 707 {
708 if (n1 < 1) n1 = 1; 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 if (n2 < 1) n2 = 1; 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 hSession->held_wrap = 0; 713 hSession->held_wrap = 0;
714 return DATA; 714 return DATA;
715 } 715 }
@@ -719,14 +719,14 @@ ansi_erase_in_display(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -719,14 +719,14 @@ ansi_erase_in_display(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
719 { 719 {
720 switch (nn) { 720 switch (nn) {
721 case 0: /* below */ 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 break; 723 break;
724 case 1: /* above */ 724 case 1: /* above */
725 ctlr_aclear(hSession, 0, hSession->cursor_addr + 1, 1); 725 ctlr_aclear(hSession, 0, hSession->cursor_addr + 1, 1);
726 break; 726 break;
727 case 2: /* all (without moving cursor) */ 727 case 2: /* all (without moving cursor) */
728 // if (hSession->cursor_addr == 0 && !hSession->is_altbuffer) scroll_save(hSession->rows, True); 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 break; 730 break;
731 } 731 }
732 return DATA; 732 return DATA;
@@ -735,17 +735,17 @@ ansi_erase_in_display(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -735,17 +735,17 @@ ansi_erase_in_display(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
735 static enum lib3270_ansi_state 735 static enum lib3270_ansi_state
736 ansi_erase_in_line(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) 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 switch (nn) { 740 switch (nn) {
741 case 0: /* to right */ 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 break; 743 break;
744 case 1: /* to left */ 744 case 1: /* to left */
745 ctlr_aclear(hSession, hSession->cursor_addr - nc, nc+1, 1); 745 ctlr_aclear(hSession, hSession->cursor_addr - nc, nc+1, 1);
746 break; 746 break;
747 case 2: /* all */ 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 break; 749 break;
750 } 750 }
751 return DATA; 751 return DATA;
@@ -754,7 +754,7 @@ ansi_erase_in_line(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -754,7 +754,7 @@ ansi_erase_in_line(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
754 static enum lib3270_ansi_state 754 static enum lib3270_ansi_state
755 ansi_insert_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) 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 int mr = hSession->scroll_bottom - rr; /* rows left at and below this one */ 758 int mr = hSession->scroll_bottom - rr; /* rows left at and below this one */
759 int ns; /* rows that are shifting */ 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,17 +770,17 @@ ansi_insert_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
770 /* Move the victims down */ 770 /* Move the victims down */
771 ns = mr - nn; 771 ns = mr - nn;
772 if (ns) 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 /* Clear the middle of the screen */ 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 return DATA; 777 return DATA;
778 } 778 }
779 779
780 static enum lib3270_ansi_state 780 static enum lib3270_ansi_state
781 ansi_delete_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) 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 int mr = hSession->scroll_bottom - rr; /* max rows that can be deleted */ 784 int mr = hSession->scroll_bottom - rr; /* max rows that can be deleted */
785 int ns; /* rows that are shifting */ 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,19 +796,19 @@ ansi_delete_lines(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
796 /* Move the surviving rows up */ 796 /* Move the surviving rows up */
797 ns = mr - nn; 797 ns = mr - nn;
798 if (ns) 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 /* Clear the rest of the screen */ 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 return DATA; 803 return DATA;
804 } 804 }
805 805
806 static enum lib3270_ansi_state 806 static enum lib3270_ansi_state
807 ansi_delete_chars(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) 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 if (nn < 1) 813 if (nn < 1)
814 nn = 1; 814 nn = 1;
@@ -947,12 +947,12 @@ static enum lib3270_ansi_state ansi_backspace(H3270 *hSession, int GNUC_UNUSED(i @@ -947,12 +947,12 @@ static enum lib3270_ansi_state ansi_backspace(H3270 *hSession, int GNUC_UNUSED(i
947 947
948 if (hSession->rev_wraparound_mode) 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 cursor_move(hSession,hSession->cursor_addr - 1); 951 cursor_move(hSession,hSession->cursor_addr - 1);
952 } 952 }
953 else 953 else
954 { 954 {
955 - if (hSession->cursor_addr % hSession->cols) 955 + if (hSession->cursor_addr % hSession->view.cols)
956 cursor_move(hSession,hSession->cursor_addr - 1); 956 cursor_move(hSession,hSession->cursor_addr - 1);
957 } 957 }
958 return DATA; 958 return DATA;
@@ -960,8 +960,8 @@ static enum lib3270_ansi_state ansi_backspace(H3270 *hSession, int GNUC_UNUSED(i @@ -960,8 +960,8 @@ static enum lib3270_ansi_state ansi_backspace(H3270 *hSession, int GNUC_UNUSED(i
960 960
961 static enum lib3270_ansi_state ansi_cr(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) 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 if (hSession->auto_newline_mode) 966 if (hSession->auto_newline_mode)
967 (void) ansi_lf(hSession, 0, 0); 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,19 +972,19 @@ static enum lib3270_ansi_state ansi_cr(H3270 *hSession, int GNUC_UNUSED(ig1), in
972 972
973 static enum lib3270_ansi_state ansi_lf(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) 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 hSession->held_wrap = 0; 977 hSession->held_wrap = 0;
978 978
979 // If we're below the scrolling region, don't scroll. 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 cursor_move(hSession,nc); 983 cursor_move(hSession,nc);
984 return DATA; 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 cursor_move(hSession,nc); 988 cursor_move(hSession,nc);
989 else 989 else
990 ansi_scroll(hSession); 990 ansi_scroll(hSession);
@@ -993,13 +993,13 @@ static enum lib3270_ansi_state ansi_lf(H3270 *hSession, int GNUC_UNUSED(ig1), in @@ -993,13 +993,13 @@ static enum lib3270_ansi_state ansi_lf(H3270 *hSession, int GNUC_UNUSED(ig1), in
993 993
994 static enum lib3270_ansi_state ansi_htab(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) 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 int i; 997 int i;
998 998
999 hSession->held_wrap = 0; 999 hSession->held_wrap = 0;
1000 - if (col == hSession->cols-1) 1000 + if (col == hSession->view.cols-1)
1001 return DATA; 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 if (hSession->tabs[i/8] & 1<<(i%8)) 1003 if (hSession->tabs[i/8] & 1<<(i%8))
1004 break; 1004 break;
1005 cursor_move(hSession,hSession->cursor_addr - col + i); 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,14 +1018,14 @@ static enum lib3270_ansi_state ansi_nop(H3270 GNUC_UNUSED(*hSession), int GNUC_U
1018 1018
1019 #define PWRAP { \ 1019 #define PWRAP { \
1020 nc = hSession->cursor_addr + 1; \ 1020 nc = hSession->cursor_addr + 1; \
1021 - if (nc < hSession->scroll_bottom * hSession->cols) \ 1021 + if (nc < hSession->scroll_bottom * hSession->view.cols) \
1022 cursor_move(hSession,nc); \ 1022 cursor_move(hSession,nc); \
1023 else { \ 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 else { \ 1026 else { \
1027 ansi_scroll(hSession); \ 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,13 +1198,13 @@ ansi_printing(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2))
1198 * In my opinion, very strange, but among other things, 'vi' 1198 * In my opinion, very strange, but among other things, 'vi'
1199 * depends on it! 1199 * depends on it!
1200 */ 1200 */
1201 - if (!((hSession->cursor_addr + 1) % hSession->cols)) { 1201 + if (!((hSession->cursor_addr + 1) % hSession->view.cols)) {
1202 hSession->held_wrap = 1; 1202 hSession->held_wrap = 1;
1203 } else { 1203 } else {
1204 PWRAP; 1204 PWRAP;
1205 } 1205 }
1206 } else { 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 cursor_move(hSession,hSession->cursor_addr + 1); 1208 cursor_move(hSession,hSession->cursor_addr + 1);
1209 } 1209 }
1210 return DATA; 1210 return DATA;
@@ -1277,10 +1277,10 @@ static enum lib3270_ansi_state ansi_digit(H3270 *hSession, int GNUC_UNUSED(ig1), @@ -1277,10 +1277,10 @@ static enum lib3270_ansi_state ansi_digit(H3270 *hSession, int GNUC_UNUSED(ig1),
1277 1277
1278 static enum lib3270_ansi_state ansi_reverse_index(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) 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 hSession->held_wrap = 0; 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,7 +1360,7 @@ static enum lib3270_ansi_state ansi_status_report(H3270 *hSession, int nn, int G
1360 break; 1360 break;
1361 1361
1362 case 6: 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 net_sends(hSession,cpr); 1364 net_sends(hSession,cpr);
1365 break; 1365 break;
1366 } 1366 }
@@ -1564,10 +1564,10 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom) @@ -1564,10 +1564,10 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom)
1564 { 1564 {
1565 if (top < 1) 1565 if (top < 1)
1566 top = 1; 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 hSession->scroll_top = top; 1572 hSession->scroll_top = top;
1573 hSession->scroll_bottom = bottom; 1573 hSession->scroll_bottom = bottom;
@@ -1576,7 +1576,7 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom) @@ -1576,7 +1576,7 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom)
1576 else 1576 else
1577 { 1577 {
1578 hSession->scroll_top = 1; 1578 hSession->scroll_top = 1;
1579 - hSession->scroll_bottom = hSession->rows; 1579 + hSession->scroll_bottom = hSession->view.rows;
1580 } 1580 }
1581 return DATA; 1581 return DATA;
1582 } 1582 }
@@ -1651,7 +1651,7 @@ xterm_text_do(H3270 GNUC_UNUSED(*hSession), int GNUC_UNUSED(ig1), int GNUC_UNUSE @@ -1651,7 +1651,7 @@ xterm_text_do(H3270 GNUC_UNUSED(*hSession), int GNUC_UNUSED(ig1), int GNUC_UNUSE
1651 static enum lib3270_ansi_state 1651 static enum lib3270_ansi_state
1652 ansi_htab_set(H3270 *hSession, int GNUC_UNUSED(ig1), int GNUC_UNUSED(ig2)) 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 hSession->tabs[col/8] |= 1<<(col%8); 1656 hSession->tabs[col/8] |= 1<<(col%8);
1657 return DATA; 1657 return DATA;
@@ -1665,11 +1665,11 @@ ansi_htab_clear(H3270 *hSession, int nn, int GNUC_UNUSED(ig2)) @@ -1665,11 +1665,11 @@ ansi_htab_clear(H3270 *hSession, int nn, int GNUC_UNUSED(ig2))
1665 switch (nn) 1665 switch (nn)
1666 { 1666 {
1667 case 0: 1667 case 0:
1668 - col = hSession->cursor_addr % hSession->cols; 1668 + col = hSession->cursor_addr % hSession->view.cols;
1669 hSession->tabs[col/8] &= ~(1<<(col%8)); 1669 hSession->tabs[col/8] &= ~(1<<(col%8));
1670 break; 1670 break;
1671 case 3: 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 hSession->tabs[i] = 0; 1673 hSession->tabs[i] = 0;
1674 break; 1674 break;
1675 } 1675 }
@@ -1684,7 +1684,7 @@ static void ansi_scroll(H3270 *hSession) @@ -1684,7 +1684,7 @@ static void ansi_scroll(H3270 *hSession)
1684 hSession->held_wrap = 0; 1684 hSession->held_wrap = 0;
1685 1685
1686 /* Save the top line */ 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 // if (!hSession->is_altbuffer) 1689 // if (!hSession->is_altbuffer)
1690 // scroll_save(1, False); 1690 // scroll_save(1, False);
@@ -1694,13 +1694,13 @@ static void ansi_scroll(H3270 *hSession) @@ -1694,13 +1694,13 @@ static void ansi_scroll(H3270 *hSession)
1694 1694
1695 /* Scroll all but the last line up */ 1695 /* Scroll all but the last line up */
1696 if (hSession->scroll_bottom > hSession->scroll_top) 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 1); 1700 1);
1701 1701
1702 /* Clear the last line */ 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 /* Callback for when we enter ANSI mode. */ 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,7 +61,7 @@ LIB3270_EXPORT int lib3270_get_field_bounds(H3270 *hSession, int baddr, int *sta
61 61
62 if(end) 62 if(end)
63 { 63 {
64 - int maxlen = (hSession->rows * hSession->cols)-1; 64 + int maxlen = (hSession->view.rows * hSession->view.cols)-1;
65 *end = first + lib3270_field_length(hSession,first); 65 *end = first + lib3270_field_length(hSession,first);
66 if(*end > maxlen) 66 if(*end > maxlen)
67 *end = maxlen; 67 *end = maxlen;
@@ -88,7 +88,7 @@ LIB3270_EXPORT int lib3270_get_word_bounds(H3270 *session, int baddr, int *start @@ -88,7 +88,7 @@ LIB3270_EXPORT int lib3270_get_word_bounds(H3270 *session, int baddr, int *start
88 88
89 if(end) 89 if(end)
90 { 90 {
91 - int maxlen = session->rows * session->cols; 91 + int maxlen = session->view.rows * session->view.cols;
92 for(pos = baddr; pos < maxlen && !isspace(session->text[pos].chr);pos++); 92 for(pos = baddr; pos < maxlen && !isspace(session->text[pos].chr);pos++);
93 93
94 *end = pos < maxlen ? pos-1 : maxlen; 94 *end = pos < maxlen ? pos-1 : maxlen;
src/core/charset.c
@@ -302,10 +302,10 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) @@ -302,10 +302,10 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession)
302 302
303 trace("%s","Showing charset table"); 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 for(f=4;f<=0x0f;f++) 309 for(f=4;f<=0x0f;f++)
310 { 310 {
311 baddr += 2; 311 baddr += 2;
@@ -316,7 +316,7 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) @@ -316,7 +316,7 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession)
316 hSession->ea_buf[baddr+s].gr = hSession->ea_buf[baddr].gr = 0; 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 s = 0x1a; 320 s = 0x1a;
321 for(f=0;f<=0x0f;f++) 321 for(f=0;f<=0x0f;f++)
322 { 322 {
@@ -325,14 +325,14 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) @@ -325,14 +325,14 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession)
325 hSession->ea_buf[baddr+s].cs = hSession->ea_buf[baddr].cs = 0; 325 hSession->ea_buf[baddr+s].cs = hSession->ea_buf[baddr].cs = 0;
326 hSession->ea_buf[baddr+s].cc = hSession->ea_buf[baddr].cc = hSession->charset.asc2ebc[(int) hChars[f]]; 326 hSession->ea_buf[baddr+s].cc = hSession->ea_buf[baddr].cc = hSession->charset.asc2ebc[(int) hChars[f]];
327 hSession->ea_buf[baddr+s].gr = hSession->ea_buf[baddr].gr = 0; 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 chr = 0x40; 331 chr = 0x40;
332 332
333 for(f=0;f<0x0c;f++) 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 for(r=0;r<=0x0f;r++) 336 for(r=0;r<=0x0f;r++)
337 { 337 {
338 hSession->ea_buf[baddr].fg = LIB3270_ATTR_COLOR_YELLOW; 338 hSession->ea_buf[baddr].fg = LIB3270_ATTR_COLOR_YELLOW;
@@ -340,11 +340,11 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession) @@ -340,11 +340,11 @@ LIB3270_EXPORT int lib3270_charsettable(H3270 *hSession)
340 hSession->ea_buf[baddr].cs = 0; 340 hSession->ea_buf[baddr].cs = 0;
341 hSession->ea_buf[baddr].cc = chr++; 341 hSession->ea_buf[baddr].cc = chr++;
342 hSession->ea_buf[baddr].gr = 0; 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 for(ptr=label;*ptr;ptr++) 348 for(ptr=label;*ptr;ptr++)
349 { 349 {
350 hSession->ea_buf[baddr].fg = LIB3270_ATTR_COLOR_WHITE; 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,7 +97,7 @@ static const unsigned char code_table[64] =
97 #define IsBlank(c) ((c == EBC_null) || (c == EBC_space)) 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 #define REGION_CHANGED(h, f, l) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,f,l) 101 #define REGION_CHANGED(h, f, l) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,f,l)
102 #define ONE_CHANGED(h,n) if(lib3270_in_ansi(h)) (h)->cbk.changed(h,n,n+1); 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,7 +136,7 @@ void ctlr_reinit(H3270 *session, unsigned cmask)
136 { 136 {
137 /* Allocate buffers */ 137 /* Allocate buffers */
138 struct lib3270_ea *tmp; 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 session->buffer[0] = tmp = lib3270_calloc(sizeof(struct lib3270_ea), sz+1, session->buffer[0]); 141 session->buffer[0] = tmp = lib3270_calloc(sizeof(struct lib3270_ea), sz+1, session->buffer[0]);
142 session->ea_buf = tmp + 1; 142 session->ea_buf = tmp + 1;
@@ -152,168 +152,6 @@ void ctlr_reinit(H3270 *session, unsigned cmask) @@ -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 void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) 155 void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr)
318 { 156 {
319 static const struct _sz 157 static const struct _sz
@@ -340,23 +178,74 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) @@ -340,23 +178,74 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr)
340 update_model_info(session,mn,sz[idx].cols,sz[idx].rows); 178 update_model_info(session,mn,sz[idx].cols,sz[idx].rows);
341 179
342 // Apply oversize. 180 // Apply oversize.
343 - session->ov_cols = 0;  
344 - session->ov_rows = 0; 181 + session->oversize.cols = 0;
  182 + session->oversize.rows = 0;
345 if (ovc != 0 || ovr != 0) 183 if (ovc != 0 || ovr != 0)
346 { 184 {
347 if (ovc <= 0 || ovr <= 0) 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 else if (ovc * ovr >= 0x4000) 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 else 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,8 +525,8 @@ LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0)
636 return 0; 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 LIB3270_EXPORT int lib3270_get_is_protected(H3270 *hSession, int baddr) 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,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 void ctlr_erase(H3270 *session, int alt) 554 void ctlr_erase(H3270 *session, int alt)
@@ -677,13 +566,12 @@ void ctlr_erase(H3270 *session, int alt) @@ -677,13 +566,12 @@ void ctlr_erase(H3270 *session, int alt)
677 { 566 {
678 // Going from 24x80 to maximum. 567 // Going from 24x80 to maximum.
679 session->cbk.display(session); 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 else 571 else
684 { 572 {
685 // Going from maximum to 24x80. 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 if(session->vcontrol) 576 if(session->vcontrol)
689 { 577 {
@@ -694,7 +582,7 @@ void ctlr_erase(H3270 *session, int alt) @@ -694,7 +582,7 @@ void ctlr_erase(H3270 *session, int alt)
694 if(lib3270_get_toggle(session,LIB3270_TOGGLE_ALTSCREEN)) 582 if(lib3270_get_toggle(session,LIB3270_TOGGLE_ALTSCREEN))
695 set_viewsize(session,24,80); 583 set_viewsize(session,24,80);
696 else 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,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 enum pds process_ds(H3270 *hSession, unsigned char *buf, int buflen) 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,7 +831,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all)
943 space3270out(hSession,3); 831 space3270out(hSession,3);
944 *hSession->obptr++ = ORDER_SBA; 832 *hSession->obptr++ = ORDER_SBA;
945 ENCODE_BADDR(hSession->obptr, baddr); 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 while (!hSession->ea_buf[baddr].fa) 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,7 +1245,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er
1357 END_TEXT("SetBufferAddress"); 1245 END_TEXT("SetBufferAddress");
1358 previous = SBA; 1246 previous = SBA;
1359 trace_ds(hSession,"%s",rcba(hSession,hSession->buffer_addr)); 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 ABORT_WRITE("invalid SBA address"); 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,7 +1396,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er
1508 trace_ds(hSession,"'"); 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 ABORT_WRITE("invalid RA address"); 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,7 +1444,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er
1556 trace_ds(hSession,"%s",rcba(hSession,baddr)); 1444 trace_ds(hSession,"%s",rcba(hSession,baddr));
1557 1445
1558 previous = ORDER; 1446 previous = ORDER;
1559 - if (baddr >= hSession->cols * hSession->rows) 1447 + if (baddr >= hSession->view.cols * hSession->view.rows)
1560 { 1448 {
1561 ABORT_WRITE("invalid EUA address"); 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,7 +1749,7 @@ enum pds ctlr_write(H3270 *hSession, unsigned char buf[], int buflen, Boolean er
1861 DEC_BA(baddr); 1749 DEC_BA(baddr);
1862 while (!aborted && 1750 while (!aborted &&
1863 ((fa_addr >= 0 && baddr != fa_addr) || 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 if (hSession->ea_buf[baddr].cc == FCORDER_SI) { 1753 if (hSession->ea_buf[baddr].cc == FCORDER_SI) {
1866 ABORT_WRITE("double SI"); 1754 ABORT_WRITE("double SI");
1867 } 1755 }
@@ -2069,8 +1957,8 @@ void ctlr_write_sscp_lu(H3270 *hSession, unsigned char buf[], int buflen) @@ -2069,8 +1957,8 @@ void ctlr_write_sscp_lu(H3270 *hSession, unsigned char buf[], int buflen)
2069 * Insert NULLs to the end of the line and advance to 1957 * Insert NULLs to the end of the line and advance to
2070 * the beginning of the next line. 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 ctlr_add(hSession,hSession->buffer_addr, EBC_null, hSession->default_cs); 1963 ctlr_add(hSession,hSession->buffer_addr, EBC_null, hSession->default_cs);
2076 ctlr_add_fg(hSession,hSession->buffer_addr, hSession->default_fg); 1964 ctlr_add_fg(hSession,hSession->buffer_addr, hSession->default_fg);
@@ -2450,7 +2338,7 @@ int ctlr_any_data(H3270 *session) @@ -2450,7 +2338,7 @@ int ctlr_any_data(H3270 *session)
2450 { 2338 {
2451 register int i; 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 if (!IsBlank(session->ea_buf[i].cc)) 2343 if (!IsBlank(session->ea_buf[i].cc))
2456 return 1; 2344 return 1;
@@ -2477,7 +2365,7 @@ void ctlr_clear(H3270 *session, Boolean can_snap) @@ -2477,7 +2365,7 @@ void ctlr_clear(H3270 *session, Boolean can_snap)
2477 #endif 2365 #endif
2478 2366
2479 /* Clear the screen. */ 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 cursor_move(session,0); 2369 cursor_move(session,0);
2482 session->buffer_addr = 0; 2370 session->buffer_addr = 0;
2483 2371
@@ -2506,7 +2394,7 @@ static void ctlr_blanks(H3270 *session) @@ -2506,7 +2394,7 @@ static void ctlr_blanks(H3270 *session)
2506 { 2394 {
2507 int baddr; 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 if (!session->ea_buf[baddr].fa) 2399 if (!session->ea_buf[baddr].fa)
2512 session->ea_buf[baddr].cc = EBC_space; 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,8 +2522,8 @@ static void ctlr_add_ic(H3270 *hSession, int baddr, unsigned char ic)
2634 hSession->ea_buf[baddr].ic = ic; 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 void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int count) 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,8 +2535,8 @@ void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int co
2647 * It's faster to figure out if none of this is true, then do a slow 2535 * It's faster to figure out if none of this is true, then do a slow
2648 * location-at-a-time version only if it happens. 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 ctlr_bcopy(hSession,baddr_from, baddr_to, count, True); 2540 ctlr_bcopy(hSession,baddr_from, baddr_to, count, True);
2653 } else { 2541 } else {
2654 int i, from, to; 2542 int i, from, to;
@@ -2656,12 +2544,12 @@ void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int co @@ -2656,12 +2544,12 @@ void ctlr_wrapping_memmove(H3270 *hSession, int baddr_to, int baddr_from, int co
2656 for (i = 0; i < count; i++) { 2544 for (i = 0; i < count; i++) {
2657 if (baddr_to > baddr_from) { 2545 if (baddr_to > baddr_from) {
2658 /* Shifting right, move left. */ 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 } else { 2549 } else {
2662 /* Shifting left, move right. */ 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 ctlr_bcopy(hSession,from, to, 1, True); 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,7 +2602,7 @@ void ctlr_aclear(H3270 *hSession, int baddr, int count, int GNUC_UNUSED(clear_ea
2714 */ 2602 */
2715 void ctlr_scroll(H3270 *hSession) 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 /* Make sure nothing is selected. (later this can be fixed) */ 2607 /* Make sure nothing is selected. (later this can be fixed) */
2720 // unselect(0, ROWS*COLS); 2608 // unselect(0, ROWS*COLS);
@@ -2722,10 +2610,10 @@ void ctlr_scroll(H3270 *hSession) @@ -2722,10 +2610,10 @@ void ctlr_scroll(H3270 *hSession)
2722 /* Synchronize pending changes prior to this. */ 2610 /* Synchronize pending changes prior to this. */
2723 2611
2724 /* Move ea_buf. */ 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 /* Clear the last line. */ 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 hSession->cbk.display(hSession); 2618 hSession->cbk.display(hSession);
2731 2619
src/core/cursor.c
@@ -263,9 +263,9 @@ static int cursor_up(H3270 *hSession) @@ -263,9 +263,9 @@ static int cursor_up(H3270 *hSession)
263 } 263 }
264 #endif /*]*/ 264 #endif /*]*/
265 265
266 - baddr = hSession->cursor_addr - hSession->cols; 266 + baddr = hSession->cursor_addr - hSession->view.cols;
267 if (baddr < 0) 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 cursor_move(hSession,baddr); 269 cursor_move(hSession,baddr);
270 return 0; 270 return 0;
271 } 271 }
@@ -294,7 +294,7 @@ static int cursor_down(H3270 *hSession) @@ -294,7 +294,7 @@ static int cursor_down(H3270 *hSession)
294 return 0; 294 return 0;
295 } 295 }
296 #endif /*]*/ 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 cursor_move(hSession,baddr); 298 cursor_move(hSession,baddr);
299 return 0; 299 return 0;
300 } 300 }
src/core/keyboard/actions.c
@@ -201,7 +201,8 @@ LIB3270_EXPORT int lib3270_firstfield(H3270 *hSession) @@ -201,7 +201,8 @@ LIB3270_EXPORT int lib3270_firstfield(H3270 *hSession)
201 cursor_move(hSession,0); 201 cursor_move(hSession,0);
202 return 0; 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 return 0; 207 return 0;
207 } 208 }
@@ -288,9 +289,9 @@ static Boolean do_delete(H3270 *hSession) @@ -288,9 +289,9 @@ static Boolean do_delete(H3270 *hSession)
288 } 289 }
289 else 290 else
290 { 291 {
291 - if ((baddr % hSession->cols) == hSession->cols - ndel) 292 + if ((baddr % hSession->view.cols) == hSession->view.cols - ndel)
292 return True; 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 /* Shift the remainder of the field left. */ 297 /* Shift the remainder of the field left. */
@@ -301,8 +302,8 @@ static Boolean do_delete(H3270 *hSession) @@ -301,8 +302,8 @@ static Boolean do_delete(H3270 *hSession)
301 else if (end_baddr != baddr) 302 else if (end_baddr != baddr)
302 { 303 {
303 /* XXX: Need to verify this. */ 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 ctlr_bcopy(hSession,ndel, 0, end_baddr - ndel + 1, 0); 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,7 +574,7 @@ static Boolean ins_prep(H3270 *hSession, int faddr, int baddr, int count)
574 if (faddr == -1) 574 if (faddr == -1)
575 { 575 {
576 /* Unformatted. Use the end of the line. */ 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 else 579 else
580 { 580 {
@@ -639,8 +639,8 @@ static Boolean ins_prep(H3270 *hSession, int faddr, int baddr, int count) @@ -639,8 +639,8 @@ static Boolean ins_prep(H3270 *hSession, int faddr, int baddr, int count)
639 /* Shift right n_nulls worth. */ 639 /* Shift right n_nulls worth. */
640 copy_len = first_null - baddr; 640 copy_len = first_null - baddr;
641 if (copy_len < 0) 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 #if defined(_ST) 645 #if defined(_ST)
646 printf("found %d NULLs at %d\n", n_nulls, first_null); 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,7 +876,7 @@ static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean
876 while (baddr_fill != faddr) { 876 while (baddr_fill != faddr) {
877 877
878 /* Check for backward line wrap. */ 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 Boolean aborted = True; 881 Boolean aborted = True;
882 register int baddr_scan = baddr_fill; 882 register int baddr_scan = baddr_fill;
@@ -891,7 +891,7 @@ static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean @@ -891,7 +891,7 @@ static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean
891 aborted = False; 891 aborted = False;
892 break; 892 break;
893 } 893 }
894 - if (!(baddr_scan % hSession->cols)) 894 + if (!(baddr_scan % hSession->view.cols))
895 break; 895 break;
896 DEC_BA(baddr_scan); 896 DEC_BA(baddr_scan);
897 } 897 }
@@ -947,7 +947,7 @@ LIB3270_EXPORT int lib3270_input_string(H3270 *hSession, const unsigned char *st @@ -947,7 +947,7 @@ LIB3270_EXPORT int lib3270_input_string(H3270 *hSession, const unsigned char *st
947 for(pos = 0; pos < length && str[pos] && !rc; pos++) 947 for(pos = 0; pos < length && str[pos] && !rc; pos++)
948 rc = key_ACharacter(hSession,(str[pos] & 0xff), KT_STD, IA_KEY, NULL); 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 return rc; 952 return rc;
953 } 953 }
@@ -1228,8 +1228,8 @@ LIB3270_EXPORT int lib3270_newline(H3270 *hSession) @@ -1228,8 +1228,8 @@ LIB3270_EXPORT int lib3270_newline(H3270 *hSession)
1228 return 0; 1228 return 0;
1229 } 1229 }
1230 #endif /*]*/ 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 faddr = lib3270_field_addr(hSession,baddr); 1233 faddr = lib3270_field_addr(hSession,baddr);
1234 fa = hSession->ea_buf[faddr].fa; 1234 fa = hSession->ea_buf[faddr].fa;
1235 if (faddr != baddr && !FA_IS_PROTECTED(fa)) 1235 if (faddr != baddr && !FA_IS_PROTECTED(fa))
src/core/model.c 0 → 100644
@@ -0,0 +1,222 @@ @@ -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,8 +193,8 @@ static int set_string(H3270 *hSession, const unsigned char *str, int length)
193 int faddr; 193 int faddr;
194 unsigned char fa; 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 faddr = lib3270_field_addr(hSession,baddr); 198 faddr = lib3270_field_addr(hSession,baddr);
199 fa = hSession->ea_buf[faddr].fa; 199 fa = hSession->ea_buf[faddr].fa;
200 if (faddr != baddr && !FA_IS_PROTECTED(fa)) 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,12 +248,12 @@ LIB3270_EXPORT int lib3270_set_string_at(H3270 *hSession, unsigned int row, unsi
248 row--; 248 row--;
249 col--; 249 col--;
250 250
251 - if(row > hSession->rows || col > hSession->cols) 251 + if(row > hSession->view.rows || col > hSession->view.cols)
252 return - (errno = EOVERFLOW); 252 return - (errno = EOVERFLOW);
253 253
254 hSession->cbk.suspend(hSession); 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 rc = set_string(hSession, str, length); 257 rc = set_string(hSession, str, length);
258 hSession->cbk.resume(hSession); 258 hSession->cbk.resume(hSession);
259 259
src/core/properties/string.c
@@ -132,6 +132,13 @@ @@ -132,6 +132,13 @@
132 NULL // Set value. 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 "", // Property name. 144 "", // Property name.
src/core/screen.c
@@ -99,9 +99,9 @@ LIB3270_EXPORT LIB3270_ATTR lib3270_get_attribute_at_address(H3270 *hSession, un @@ -99,9 +99,9 @@ LIB3270_EXPORT LIB3270_ATTR lib3270_get_attribute_at_address(H3270 *hSession, un
99 if(check_online_session(hSession)) 99 if(check_online_session(hSession))
100 return (LIB3270_ATTR) -1; 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 return (LIB3270_ATTR) -1; 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,9 +112,9 @@ LIB3270_EXPORT int lib3270_is_selected(H3270 *hSession, unsigned int baddr)
112 { 112 {
113 FAIL_IF_NOT_ONLINE(hSession); 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 return -1; 118 return -1;
119 } 119 }
120 120
@@ -125,9 +125,9 @@ LIB3270_EXPORT int lib3270_get_element(H3270 *hSession, unsigned int baddr, unsi @@ -125,9 +125,9 @@ LIB3270_EXPORT int lib3270_get_element(H3270 *hSession, unsigned int baddr, unsi
125 { 125 {
126 FAIL_IF_NOT_ONLINE(hSession); 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 return -1; 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,14 +248,14 @@ static unsigned short calc_attrs(H3270 *session, int baddr, int fa_addr, int fa)
248 LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h) 248 LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h)
249 { 249 {
250 CHECK_SESSION_HANDLE(h); 250 CHECK_SESSION_HANDLE(h);
251 - return h->rows * h->cols; 251 + return h->view.rows * h->view.cols;
252 } 252 }
253 253
254 LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, unsigned int *r, unsigned int *c) 254 LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, unsigned int *r, unsigned int *c)
255 { 255 {
256 CHECK_SESSION_HANDLE(h); 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 // trace("%s: %d - %d",__FUNCTION__, h->rows, h->cols); 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,22 +264,22 @@ LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, unsigned int *r, unsigned
264 LIB3270_EXPORT unsigned int lib3270_get_width(H3270 *h) 264 LIB3270_EXPORT unsigned int lib3270_get_width(H3270 *h)
265 { 265 {
266 CHECK_SESSION_HANDLE(h); 266 CHECK_SESSION_HANDLE(h);
267 - return h->cols; 267 + return h->view.cols;
268 } 268 }
269 269
270 LIB3270_EXPORT unsigned int lib3270_get_height(H3270 *h) 270 LIB3270_EXPORT unsigned int lib3270_get_height(H3270 *h)
271 { 271 {
272 CHECK_SESSION_HANDLE(h); 272 CHECK_SESSION_HANDLE(h);
273 - return h->rows; 273 + return h->view.rows;
274 } 274 }
275 275
276 void update_model_info(H3270 *session, unsigned int model, unsigned int cols, unsigned int rows) 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 return; 279 return;
280 280
281 - session->maxCOLS = cols;  
282 - session->maxROWS = rows; 281 + session->max.cols = cols;
  282 + session->max.rows = rows;
283 session->model_num = model; 283 session->model_num = model;
284 284
285 /* Update the model name. */ 285 /* Update the model name. */
@@ -296,7 +296,7 @@ LIB3270_EXPORT int lib3270_get_contents(H3270 *h, int first, int last, unsigned @@ -296,7 +296,7 @@ LIB3270_EXPORT int lib3270_get_contents(H3270 *h, int first, int last, unsigned
296 296
297 CHECK_SESSION_HANDLE(h); 297 CHECK_SESSION_HANDLE(h);
298 298
299 - len = h->rows * h->cols; 299 + len = h->view.rows * h->view.cols;
300 300
301 if(first > len || last > len || first < 0 || last < 0) 301 if(first > len || last > len || first < 0 || last < 0)
302 return EFAULT; 302 return EFAULT;
@@ -377,7 +377,7 @@ void screen_update(H3270 *session, int bstart, int bend) @@ -377,7 +377,7 @@ void screen_update(H3270 *session, int bstart, int bend)
377 377
378 for(f=first;f<last;f++) 378 for(f=first;f<last;f++)
379 { 379 {
380 - if(f%session->cols == 0) 380 + if(f%session->view.cols == 0)
381 len++; 381 len++;
382 } 382 }
383 383
@@ -430,10 +430,10 @@ LIB3270_EXPORT int lib3270_translate_to_address(H3270 *hSession, unsigned int ro @@ -430,10 +430,10 @@ LIB3270_EXPORT int lib3270_translate_to_address(H3270 *hSession, unsigned int ro
430 row--; 430 row--;
431 col--; 431 col--;
432 432
433 - if(row > hSession->rows || col > hSession->cols) 433 + if(row > hSession->view.rows || col > hSession->view.cols)
434 return - (errno = EOVERFLOW); 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,7 +443,7 @@ LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *hSession, unsigned int badd
443 443
444 trace("%s(%d)",__FUNCTION__,baddr); 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 return - (errno = EOVERFLOW); 447 return - (errno = EOVERFLOW);
448 448
449 if(hSession->selected && !lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_SELECTED)) 449 if(hSession->selected && !lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_SELECTED))
@@ -481,8 +481,8 @@ int cursor_move(H3270 *hSession, int baddr) @@ -481,8 +481,8 @@ int cursor_move(H3270 *hSession, int baddr)
481 hSession->cursor_addr = baddr; 481 hSession->cursor_addr = baddr;
482 hSession->cbk.update_cursor( 482 hSession->cbk.update_cursor(
483 hSession, 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 hSession->text[baddr].chr, 486 hSession->text[baddr].chr,
487 hSession->text[baddr].attr 487 hSession->text[baddr].attr
488 ); 488 );
@@ -652,16 +652,16 @@ void set_viewsize(H3270 *session, unsigned int rows, unsigned int cols) @@ -652,16 +652,16 @@ void set_viewsize(H3270 *session, unsigned int rows, unsigned int cols)
652 { 652 {
653 CHECK_SESSION_HANDLE(session); 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 return; 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 trace("View size changes to %dx%d",rows,cols); 661 trace("View size changes to %dx%d",rows,cols);
662 662
663 if(session->cbk.configure) 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,7 +896,7 @@ LIB3270_EXPORT int lib3270_testpattern(H3270 *hSession)
896 896
897 FAIL_IF_ONLINE(hSession); 897 FAIL_IF_ONLINE(hSession);
898 898
899 - max = (hSession->maxROWS * hSession->maxCOLS); 899 + max = (hSession->max.rows * hSession->max.cols);
900 for(f=0;f<max;f++) 900 for(f=0;f<max;f++)
901 { 901 {
902 if(!pat[row].cc[pos]) 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,7 +273,7 @@ static void set_timer(H3270 GNUC_UNUSED(*session), unsigned char GNUC_UNUSED(on)
273 static void screen_disp(H3270 *session) 273 static void screen_disp(H3270 *session)
274 { 274 {
275 CHECK_SESSION_HANDLE(session); 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 static void nop_int(H3270 GNUC_UNUSED(*session), int GNUC_UNUSED(width)) 279 static void nop_int(H3270 GNUC_UNUSED(*session), int GNUC_UNUSED(width))
@@ -552,14 +552,14 @@ static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int bu @@ -552,14 +552,14 @@ static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int bu
552 GET16(h, &buf[6]); 552 GET16(h, &buf[6]);
553 trace_ds(hSession,",h=%d", h); 553 trace_ds(hSession,",h=%d", h);
554 } else 554 } else
555 - h = hSession->maxROWS; 555 + h = hSession->max.rows;
556 556
557 if (buflen > 9) 557 if (buflen > 9)
558 { 558 {
559 GET16(w, &buf[8]); 559 GET16(w, &buf[8]);
560 trace_ds(hSession,",w=%d", w); 560 trace_ds(hSession,",w=%d", w);
561 } else 561 } else
562 - w = hSession->maxCOLS; 562 + w = hSession->max.cols;
563 563
564 if (buflen > 11) 564 if (buflen > 11)
565 { 565 {
@@ -579,14 +579,14 @@ static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int bu @@ -579,14 +579,14 @@ static enum pds sf_create_partition(H3270 *hSession, unsigned char buf[], int bu
579 GET16(hv, &buf[14]); 579 GET16(hv, &buf[14]);
580 trace_ds(hSession,",hv=%d", hv); 580 trace_ds(hSession,",hv=%d", hv);
581 } else 581 } else
582 - hv = (h > hSession->maxROWS)? hSession->maxROWS: h; 582 + hv = (h > hSession->max.rows)? hSession->max.rows: h;
583 583
584 if (buflen > 17) 584 if (buflen > 17)
585 { 585 {
586 GET16(wv, &buf[16]); 586 GET16(wv, &buf[16]);
587 trace_ds(hSession,",wv=%d", wv); 587 trace_ds(hSession,",wv=%d", wv);
588 } else 588 } else
589 - wv = (w > hSession->maxCOLS)? hSession->maxCOLS: w; 589 + wv = (w > hSession->max.cols)? hSession->max.cols: w;
590 590
591 if (buflen > 19) 591 if (buflen > 19)
592 { 592 {
@@ -787,8 +787,8 @@ static void do_qr_usable_area(H3270 *hSession) @@ -787,8 +787,8 @@ static void do_qr_usable_area(H3270 *hSession)
787 space3270out(hSession,19); 787 space3270out(hSession,19);
788 *hSession->obptr++ = 0x01; /* 12/14-bit addressing */ 788 *hSession->obptr++ = 0x01; /* 12/14-bit addressing */
789 *hSession->obptr++ = 0x00; /* no special character features */ 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 *hSession->obptr++ = 0x01; /* units (mm) */ 792 *hSession->obptr++ = 0x01; /* units (mm) */
793 num = display_widthMM(); 793 num = display_widthMM();
794 denom = display_width(); 794 denom = display_width();
@@ -810,7 +810,7 @@ static void do_qr_usable_area(H3270 *hSession) @@ -810,7 +810,7 @@ static void do_qr_usable_area(H3270 *hSession)
810 SET16(hSession->obptr, (int)denom); /* Yr denominator */ 810 SET16(hSession->obptr, (int)denom); /* Yr denominator */
811 *hSession->obptr++ = *char_width; /* AW */ 811 *hSession->obptr++ = *char_width; /* AW */
812 *hSession->obptr++ = *char_height; /* AH */ 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 static void do_qr_color(H3270 *hSession) 816 static void do_qr_color(H3270 *hSession)
@@ -897,7 +897,7 @@ static void do_qr_alpha_part(H3270 *hSession) @@ -897,7 +897,7 @@ static void do_qr_alpha_part(H3270 *hSession)
897 trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n"); 897 trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n");
898 space3270out(hSession,4); 898 space3270out(hSession,4);
899 *hSession->obptr++ = 0; /* 1 partition */ 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 *hSession->obptr++ = 0; /* no special features */ 901 *hSession->obptr++ = 0; /* no special features */
902 } 902 }
903 903
@@ -1009,8 +1009,8 @@ static void do_qr_imp_part(H3270 *hSession) @@ -1009,8 +1009,8 @@ static void do_qr_imp_part(H3270 *hSession)
1009 *hSession->obptr++ = 0x00; /* reserved */ 1009 *hSession->obptr++ = 0x00; /* reserved */
1010 SET16(hSession->obptr, 80); /* implicit partition width */ 1010 SET16(hSession->obptr, 80); /* implicit partition width */
1011 SET16(hSession->obptr, 24); /* implicit partition height */ 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 static void query_reply_end(H3270 *hSession) 1016 static void query_reply_end(H3270 *hSession)
src/core/telnet.c
@@ -246,9 +246,8 @@ static const char *trsp_flag[2] = { &quot;POSITIVE-RESPONSE&quot;, &quot;NEGATIVE-RESPONSE&quot; }; @@ -246,9 +246,8 @@ static const char *trsp_flag[2] = { &quot;POSITIVE-RESPONSE&quot;, &quot;NEGATIVE-RESPONSE&quot; };
246 #endif /*]*/ 246 #endif /*]*/
247 #endif /*]*/ 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 #if defined(_WIN32) /*[*/ 252 #if defined(_WIN32) /*[*/
254 #define socket_errno() WSAGetLastError() 253 #define socket_errno() WSAGetLastError()
src/core/toggles.c
@@ -338,7 +338,7 @@ LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE ix) @@ -338,7 +338,7 @@ LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE ix)
338 static void toggle_altscreen(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 338 static void toggle_altscreen(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt))
339 { 339 {
340 if(!session->screen_alt) 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 static void toggle_redraw(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 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,7 +77,7 @@ static void wtrace(H3270 *session, const char *fmt, ...);
77 const char * rcba(H3270 *hSession, int baddr) 77 const char * rcba(H3270 *hSession, int baddr)
78 { 78 {
79 static char buf[48]; 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 return buf; 81 return buf;
82 } 82 }
83 83
@@ -262,12 +262,12 @@ void trace_screen(H3270 *session) @@ -262,12 +262,12 @@ void trace_screen(H3270 *session)
262 { 262 {
263 unsigned int row, baddr; 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 unsigned int col; 267 unsigned int col;
268 wtrace(session,"%02d ",row+1); 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 if(session->text[baddr].attr & LIB3270_ATTR_CG) 272 if(session->text[baddr].attr & LIB3270_ATTR_CG)
273 wtrace(session,"%c",'.'); 273 wtrace(session,"%c",'.');
@@ -305,7 +305,7 @@ void trace_ansi_disc(H3270 *hSession) @@ -305,7 +305,7 @@ void trace_ansi_disc(H3270 *hSession)
305 unsigned int i; 305 unsigned int i;
306 306
307 wtrace(hSession,"%c",'\n'); 307 wtrace(hSession,"%c",'\n');
308 - for (i = 0; i < hSession->cols; i++) 308 + for (i = 0; i < hSession->view.cols; i++)
309 wtrace(hSession,"%c",'='); 309 wtrace(hSession,"%c",'=');
310 wtrace(hSession,"%c",'\n'); 310 wtrace(hSession,"%c",'\n');
311 311
src/include/3270ds.h
@@ -141,11 +141,11 @@ @@ -141,11 +141,11 @@
141 #define QR_IMP_PART 0xa6 /* implicit partition */ 141 #define QR_IMP_PART 0xa6 /* implicit partition */
142 #define QR_NULL 0xff /* null */ 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 /** Field attributes. */ 150 /** Field attributes. */
151 #define FA_PRINTABLE 0xc0 ///< @brief these make the character "printable" */ 151 #define FA_PRINTABLE 0xc0 ///< @brief these make the character "printable" */
src/include/lib3270-internals.h
@@ -362,7 +362,7 @@ struct _h3270 @@ -362,7 +362,7 @@ struct _h3270
362 int modified_sel : 1; 362 int modified_sel : 1;
363 int mono : 1; ///< @brief Forces monochrome display 363 int mono : 1; ///< @brief Forces monochrome display
364 int m3279 : 1; 364 int m3279 : 1;
365 - int extended : 1; 365 + int extended : 1; ///< @brief Extended data stream.
366 int typeahead : 1; 366 int typeahead : 1;
367 int numeric_lock : 1; 367 int numeric_lock : 1;
368 int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard. 368 int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard.
@@ -385,8 +385,6 @@ struct _h3270 @@ -385,8 +385,6 @@ struct _h3270
385 int formatted : 1; /**< @brief Formatted screen flag */ 385 int formatted : 1; /**< @brief Formatted screen flag */
386 int starting : 1; /**< @brief Is starting (no first screen)? */ 386 int starting : 1; /**< @brief Is starting (no first screen)? */
387 387
388 - char * oversize;  
389 -  
390 struct lib3270_toggle 388 struct lib3270_toggle
391 { 389 {
392 char value; /**< toggle value */ 390 char value; /**< toggle value */
@@ -428,12 +426,28 @@ struct _h3270 @@ -428,12 +426,28 @@ struct _h3270
428 H3270FT * ft; /**< @brief Active file transfer data */ 426 H3270FT * ft; /**< @brief Active file transfer data */
429 427
430 // screen info 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 LIB3270_POINTER pointer; /**< @brief Current pointer. */ 451 LIB3270_POINTER pointer; /**< @brief Current pointer. */
438 int cursor_addr; 452 int cursor_addr;
439 int buffer_addr; 453 int buffer_addr;
src/include/lib3270.h
@@ -1196,7 +1196,7 @@ @@ -1196,7 +1196,7 @@
1196 * @param col Desired col. 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 * @brief Get address of the first blank. 1202 * @brief Get address of the first blank.
src/include/lib3270/properties.h
@@ -128,6 +128,7 @@ @@ -128,6 +128,7 @@
128 /** 128 /**
129 * @brief Set lib3270 integer property by name. 129 * @brief Set lib3270 integer property by name.
130 * 130 *
  131 + * @param hSession Session handle.
131 * @param name Nome of the property. 132 * @param name Nome of the property.
132 * @param value New property value. 133 * @param value New property value.
133 * @param seconds Time (in seconds) whe should wait for "ready" state (0 = none). 134 * @param seconds Time (in seconds) whe should wait for "ready" state (0 = none).
@@ -137,6 +138,31 @@ @@ -137,6 +138,31 @@
137 */ 138 */
138 LIB3270_EXPORT int lib3270_set_string_property(H3270 * hSession, const char *name, const char * value, int seconds); 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 #ifdef __cplusplus 166 #ifdef __cplusplus
141 } 167 }
142 #endif 168 #endif
src/selection/actions.c
@@ -51,7 +51,7 @@ LIB3270_EXPORT int lib3270_unselect(H3270 *hSession) @@ -51,7 +51,7 @@ LIB3270_EXPORT int lib3270_unselect(H3270 *hSession)
51 { 51 {
52 hSession->selected = 0; 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 if(hSession->text[a].attr & LIB3270_ATTR_SELECTED) 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,7 +94,7 @@ LIB3270_EXPORT int lib3270_select_region(H3270 *h, int start, int end)
94 if(!lib3270_connected(h)) 94 if(!lib3270_connected(h))
95 return ENOTCONN; 95 return ENOTCONN;
96 96
97 - maxlen = (h->rows * h->cols); 97 + maxlen = (h->view.rows * h->view.cols);
98 98
99 // Check bounds 99 // Check bounds
100 if(start < 0 || start > maxlen || end < 0 || end > maxlen || start > end) 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,7 +143,7 @@ LIB3270_EXPORT int lib3270_select_all(H3270 * hSession)
143 { 143 {
144 FAIL_IF_NOT_ONLINE(hSession); 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 return 0; 148 return 0;
149 } 149 }
@@ -200,28 +200,28 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) @@ -200,28 +200,28 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to)
200 if(!lib3270_get_selection_bounds(hSession,&pos[0],&pos[1])) 200 if(!lib3270_get_selection_bounds(hSession,&pos[0],&pos[1]))
201 return from; 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 for(f=0;f<2;f++) 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 if(row < 0) 211 if(row < 0)
212 - rows = - (pos[f] / hSession->cols); 212 + rows = - (pos[f] / hSession->view.cols);
213 213
214 if(col < 0) 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 do_select(hSession,hSession->select.start + step,hSession->select.end + step,hSession->rectsel); 226 do_select(hSession,hSession->select.start + step,hSession->select.end + step,hSession->rectsel);
227 cursor_move(hSession,hSession->select.end); 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,20 +251,20 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig
251 else if((flag&0x8F) == SELECTION_ACTIVE) 251 else if((flag&0x8F) == SELECTION_ACTIVE)
252 return lib3270_move_selected_area(h,origin,baddr); 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 if(flag & SELECTION_LEFT) // Update left margin 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 if(flag & SELECTION_TOP) // Update top margin 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 if(flag & SELECTION_RIGHT) // Update right margin 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 if(flag & SELECTION_BOTTOM) // Update bottom margin 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 trace("origin=%d first=%d last=%d",origin,first,last); 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,28 +291,28 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir
291 switch(dir) 291 switch(dir)
292 { 292 {
293 case LIB3270_DIR_UP: 293 case LIB3270_DIR_UP:
294 - if(start <= ((int) hSession->cols)) 294 + if(start <= ((int) hSession->view.cols))
295 return EINVAL; 295 return EINVAL;
296 - start -= hSession->cols;  
297 - end -= hSession->cols; 296 + start -= hSession->view.cols;
  297 + end -= hSession->view.cols;
298 break; 298 break;
299 299
300 case LIB3270_DIR_DOWN: 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 return EINVAL; 302 return EINVAL;
303 - start += hSession->cols;  
304 - end += hSession->cols; 303 + start += hSession->view.cols;
  304 + end += hSession->view.cols;
305 break; 305 break;
306 306
307 case LIB3270_DIR_LEFT: 307 case LIB3270_DIR_LEFT:
308 - if( (start % hSession->cols) < 1) 308 + if( (start % hSession->view.cols) < 1)
309 return EINVAL; 309 return EINVAL;
310 start--; 310 start--;
311 end--; 311 end--;
312 break; 312 break;
313 313
314 case LIB3270_DIR_RIGHT: 314 case LIB3270_DIR_RIGHT:
315 - if( (end % hSession->cols) >= (hSession->cols-1)) 315 + if( (end % hSession->view.cols) >= (hSession->view.cols-1))
316 return EINVAL; 316 return EINVAL;
317 start++; 317 start++;
318 end++; 318 end++;
src/selection/get.c
@@ -53,7 +53,7 @@ LIB3270_EXPORT char * lib3270_get_selected_text(H3270 *hSession, char tok, LIB32 @@ -53,7 +53,7 @@ LIB3270_EXPORT char * lib3270_get_selected_text(H3270 *hSession, char tok, LIB32
53 { 53 {
54 int row, col, baddr; 54 int row, col, baddr;
55 char * ret; 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 size_t sz = 0; 57 size_t sz = 0;
58 unsigned short attr = 0xFFFF; 58 unsigned short attr = 0xFFFF;
59 char cut = (options & LIB3270_SELECTION_CUT) != 0; 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,11 +73,11 @@ LIB3270_EXPORT char * lib3270_get_selected_text(H3270 *hSession, char tok, LIB32
73 baddr = 0; 73 baddr = 0;
74 unsigned char fa = 0; 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 int cr = 0; 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 if(hSession->ea_buf[baddr].fa) { 82 if(hSession->ea_buf[baddr].fa) {
83 fa = hSession->ea_buf[baddr].fa; 83 fa = hSession->ea_buf[baddr].fa;
src/selection/selection.c
@@ -65,10 +65,10 @@ static void update_selected_rectangle(H3270 *session) @@ -65,10 +65,10 @@ static void update_selected_rectangle(H3270 *session)
65 get_selected_addr(session,&begin,&end); 65 get_selected_addr(session,&begin,&end);
66 66
67 // Get start & end posision 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 if(p[0].row > p[1].row) 73 if(p[0].row > p[1].row)
74 { 74 {
@@ -86,9 +86,9 @@ static void update_selected_rectangle(H3270 *session) @@ -86,9 +86,9 @@ static void update_selected_rectangle(H3270 *session)
86 86
87 // First remove unselected areas 87 // First remove unselected areas
88 baddr = 0; 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 if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (session->text[baddr].attr & LIB3270_ATTR_SELECTED)) 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,9 +101,9 @@ static void update_selected_rectangle(H3270 *session)
101 101
102 // Then, draw selected ones 102 // Then, draw selected ones
103 baddr = 0; 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 if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(session->text[baddr].attr & LIB3270_ATTR_SELECTED)) 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,7 +119,7 @@ static void update_selected_rectangle(H3270 *session)
119 static void update_selected_region(H3270 *session) 119 static void update_selected_region(H3270 *session)
120 { 120 {
121 int baddr,begin,end; 121 int baddr,begin,end;
122 - int len = session->rows*session->cols; 122 + int len = session->view.rows * session->view.cols;
123 123
124 get_selected_addr(session,&begin,&end); 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,7 +167,7 @@ void toggle_rectselect(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LI
167 167
168 void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect) 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 return; 171 return;
172 172
173 // Do we really need to change selection? 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,11 +209,11 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba
209 if(!(lib3270_connected(hSession) && (hSession->text[baddr].attr & LIB3270_ATTR_SELECTED))) 209 if(!(lib3270_connected(hSession) && (hSession->text[baddr].attr & LIB3270_ATTR_SELECTED)))
210 return rc; 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 rc |= SELECTION_ACTIVE; 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 rc |= SELECTION_SINGLE_COL; 218 rc |= SELECTION_SINGLE_COL;
219 } 219 }
@@ -224,20 +224,20 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba @@ -224,20 +224,20 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba
224 224
225 /// FIXME: It should test if baddr is the last element before the +1. 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 rc |= SELECTION_RIGHT; 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 rc |= SELECTION_SINGLE_ROW; 233 rc |= SELECTION_SINGLE_ROW;
234 } 234 }
235 else 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 rc |= SELECTION_TOP; 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 rc |= SELECTION_BOTTOM; 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,7 +254,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u
254 if(check_online_session(h)) 254 if(check_online_session(h))
255 return NULL; 255 return NULL;
256 256
257 - maxlen = h->rows * (h->cols+1); 257 + maxlen = h->view.rows * (h->view.cols+1);
258 258
259 if(start_pos < 0 || start_pos > maxlen || end_pos < 0 || end_pos > maxlen || end_pos < start_pos) 259 if(start_pos < 0 || start_pos > maxlen || end_pos < 0 || end_pos > maxlen || end_pos < start_pos)
260 return NULL; 260 return NULL;
@@ -266,7 +266,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u @@ -266,7 +266,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u
266 if(all || h->text[baddr].attr & LIB3270_ATTR_SELECTED) 266 if(all || h->text[baddr].attr & LIB3270_ATTR_SELECTED)
267 text[sz++] = (h->text[baddr].attr & LIB3270_ATTR_CG) ? ' ' : h->text[baddr].chr; 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 text[sz++] = '\n'; 270 text[sz++] = '\n';
271 } 271 }
272 text[sz++] = 0; 272 text[sz++] = 0;
@@ -291,7 +291,7 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le @@ -291,7 +291,7 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le
291 if(offset < 0) 291 if(offset < 0)
292 offset = lib3270_get_cursor_address(h); 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 if(maxlen <= 0 || offset < 0) 295 if(maxlen <= 0 || offset < 0)
296 { 296 {
297 errno = EOVERFLOW; 297 errno = EOVERFLOW;
@@ -321,7 +321,7 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le @@ -321,7 +321,7 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le
321 offset++; 321 offset++;
322 len--; 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 *(ptr++) = lf; 326 *(ptr++) = lf;
327 len--; 327 len--;
@@ -408,16 +408,16 @@ LIB3270_EXPORT int lib3270_get_selection_rectangle(H3270 *hSession, unsigned int @@ -408,16 +408,16 @@ LIB3270_EXPORT int lib3270_get_selection_rectangle(H3270 *hSession, unsigned int
408 if(!hSession->selected || hSession->select.start == hSession->select.end) 408 if(!hSession->selected || hSession->select.start == hSession->select.end)
409 return errno = ENOENT; 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 maxRow = 0; 413 maxRow = 0;
414 maxCol = 0; 414 maxCol = 0;
415 baddr = 0; 415 baddr = 0;
416 count = 0; 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 if(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED) 422 if(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED)
423 { 423 {