Commit 2083e8680040715339f8c93883df51ba054df13b
1 parent
7c8e110b
Exists in
master
and in
3 other branches
Acessibilidade, incluindo limpeza da area selecionada ao mover o cursor, incluin…
…do tratamento multi-sessao em mais métodos de biblioteca
Showing
11 changed files
with
267 additions
and
358 deletions
Show diff stats
ansi.c
... | ... | @@ -520,7 +520,7 @@ dec_restore_cursor(int ig1 unused, int ig2 unused) |
520 | 520 | fg = saved_fg; |
521 | 521 | bg = saved_bg; |
522 | 522 | gr = saved_gr; |
523 | - cursor_move(saved_cursor); | |
523 | + cursor_move(&h3270,saved_cursor); | |
524 | 524 | held_wrap = False; |
525 | 525 | return DATA; |
526 | 526 | } |
... | ... | @@ -530,10 +530,10 @@ ansi_newline(int ig1 unused, int ig2 unused) |
530 | 530 | { |
531 | 531 | int nc; |
532 | 532 | |
533 | - cursor_move(h3270.cursor_addr - (h3270.cursor_addr % h3270.cols)); | |
533 | + cursor_move(&h3270,h3270.cursor_addr - (h3270.cursor_addr % h3270.cols)); | |
534 | 534 | nc = h3270.cursor_addr + h3270.cols; |
535 | 535 | if (nc < scroll_bottom * h3270.cols) |
536 | - cursor_move(nc); | |
536 | + cursor_move(&h3270,nc); | |
537 | 537 | else |
538 | 538 | ansi_scroll(); |
539 | 539 | held_wrap = False; |
... | ... | @@ -549,9 +549,9 @@ ansi_cursor_up(int nn, int ig2 unused) |
549 | 549 | nn = 1; |
550 | 550 | rr = h3270.cursor_addr / h3270.cols; |
551 | 551 | if (rr - nn < 0) |
552 | - cursor_move(h3270.cursor_addr % h3270.cols); | |
552 | + cursor_move(&h3270, h3270.cursor_addr % h3270.cols); | |
553 | 553 | else |
554 | - cursor_move(h3270.cursor_addr - (nn * h3270.cols)); | |
554 | + cursor_move(&h3270, h3270.cursor_addr - (nn * h3270.cols)); | |
555 | 555 | held_wrap = False; |
556 | 556 | return DATA; |
557 | 557 | } |
... | ... | @@ -647,9 +647,9 @@ ansi_cursor_down(int nn, int ig2 unused) |
647 | 647 | nn = 1; |
648 | 648 | rr = h3270.cursor_addr / h3270.cols; |
649 | 649 | if (rr + nn >= h3270.cols) |
650 | - cursor_move((h3270.cols-1)*h3270.cols + (h3270.cursor_addr%h3270.cols)); | |
650 | + cursor_move(&h3270,(h3270.cols-1)*h3270.cols + (h3270.cursor_addr%h3270.cols)); | |
651 | 651 | else |
652 | - cursor_move(h3270.cursor_addr + (nn * h3270.cols)); | |
652 | + cursor_move(&h3270,h3270.cursor_addr + (nn * h3270.cols)); | |
653 | 653 | held_wrap = False; |
654 | 654 | return DATA; |
655 | 655 | } |
... | ... | @@ -666,7 +666,7 @@ ansi_cursor_right(int nn, int ig2 unused) |
666 | 666 | return DATA; |
667 | 667 | if (cc + nn >= h3270.cols) |
668 | 668 | nn = h3270.cols - 1 - cc; |
669 | - cursor_move(h3270.cursor_addr + nn); | |
669 | + cursor_move(&h3270,h3270.cursor_addr + nn); | |
670 | 670 | held_wrap = False; |
671 | 671 | return DATA; |
672 | 672 | } |
... | ... | @@ -687,7 +687,7 @@ ansi_cursor_left(int nn, int ig2 unused) |
687 | 687 | return DATA; |
688 | 688 | if (nn > cc) |
689 | 689 | nn = cc; |
690 | - cursor_move(h3270.cursor_addr - nn); | |
690 | + cursor_move(&h3270,h3270.cursor_addr - nn); | |
691 | 691 | return DATA; |
692 | 692 | } |
693 | 693 | |
... | ... | @@ -698,7 +698,7 @@ ansi_cursor_motion(int n1, int n2) |
698 | 698 | if (n1 > h3270.rows) n1 = h3270.rows; |
699 | 699 | if (n2 < 1) n2 = 1; |
700 | 700 | if (n2 > h3270.cols) n2 = h3270.cols; |
701 | - cursor_move((n1 - 1) * h3270.cols + (n2 - 1)); | |
701 | + cursor_move(&h3270,(n1 - 1) * h3270.cols + (n2 - 1)); | |
702 | 702 | held_wrap = False; |
703 | 703 | return DATA; |
704 | 704 | } |
... | ... | @@ -936,10 +936,10 @@ ansi_backspace(int ig1 unused, int ig2 unused) |
936 | 936 | } |
937 | 937 | if (rev_wraparound_mode) { |
938 | 938 | if (h3270.cursor_addr > (scroll_top - 1) * h3270.cols) |
939 | - cursor_move(h3270.cursor_addr - 1); | |
939 | + cursor_move(&h3270,h3270.cursor_addr - 1); | |
940 | 940 | } else { |
941 | 941 | if (h3270.cursor_addr % h3270.cols) |
942 | - cursor_move(h3270.cursor_addr - 1); | |
942 | + cursor_move(&h3270,h3270.cursor_addr - 1); | |
943 | 943 | } |
944 | 944 | return DATA; |
945 | 945 | } |
... | ... | @@ -948,7 +948,7 @@ static enum state |
948 | 948 | ansi_cr(int ig1 unused, int ig2 unused) |
949 | 949 | { |
950 | 950 | if (h3270.cursor_addr % h3270.cols) |
951 | - cursor_move(h3270.cursor_addr - (h3270.cursor_addr % h3270.cols)); | |
951 | + cursor_move(&h3270,h3270.cursor_addr - (h3270.cursor_addr % h3270.cols)); | |
952 | 952 | if (auto_newline_mode) |
953 | 953 | (void) ansi_lf(0, 0); |
954 | 954 | held_wrap = False; |
... | ... | @@ -965,12 +965,12 @@ ansi_lf(int ig1 unused, int ig2 unused) |
965 | 965 | /* If we're below the scrolling region, don't scroll. */ |
966 | 966 | if ((h3270.cursor_addr / h3270.cols) >= scroll_bottom) { |
967 | 967 | if (nc < h3270.rows * h3270.cols) |
968 | - cursor_move(nc); | |
968 | + cursor_move(&h3270,nc); | |
969 | 969 | return DATA; |
970 | 970 | } |
971 | 971 | |
972 | 972 | if (nc < scroll_bottom * h3270.cols) |
973 | - cursor_move(nc); | |
973 | + cursor_move(&h3270,nc); | |
974 | 974 | else |
975 | 975 | ansi_scroll(); |
976 | 976 | return DATA; |
... | ... | @@ -988,7 +988,7 @@ ansi_htab(int ig1 unused, int ig2 unused) |
988 | 988 | for (i = col+1; i < h3270.cols-1; i++) |
989 | 989 | if (tabs[i/8] & 1<<(i%8)) |
990 | 990 | break; |
991 | - cursor_move(h3270.cursor_addr - col + i); | |
991 | + cursor_move(&h3270,h3270.cursor_addr - col + i); | |
992 | 992 | return DATA; |
993 | 993 | } |
994 | 994 | |
... | ... | @@ -1007,13 +1007,13 @@ ansi_nop(int ig1 unused, int ig2 unused) |
1007 | 1007 | #define PWRAP { \ |
1008 | 1008 | nc = h3270.cursor_addr + 1; \ |
1009 | 1009 | if (nc < scroll_bottom * h3270.cols) \ |
1010 | - cursor_move(nc); \ | |
1010 | + cursor_move(&h3270,nc); \ | |
1011 | 1011 | else { \ |
1012 | 1012 | if (h3270.cursor_addr / h3270.cols >= scroll_bottom) \ |
1013 | - cursor_move(h3270.cursor_addr / h3270.cols * h3270.cols); \ | |
1013 | + cursor_move(&h3270,h3270.cursor_addr / h3270.cols * h3270.cols); \ | |
1014 | 1014 | else { \ |
1015 | 1015 | ansi_scroll(); \ |
1016 | - cursor_move(nc - h3270.cols); \ | |
1016 | + cursor_move(&h3270,nc - h3270.cols); \ | |
1017 | 1017 | } \ |
1018 | 1018 | } \ |
1019 | 1019 | } |
... | ... | @@ -1188,7 +1188,7 @@ ansi_printing(int ig1 unused, int ig2 unused) |
1188 | 1188 | } |
1189 | 1189 | } else { |
1190 | 1190 | if ((h3270.cursor_addr % h3270.cols) != (h3270.cols - 1)) |
1191 | - cursor_move(h3270.cursor_addr + 1); | |
1191 | + cursor_move(&h3270,h3270.cursor_addr + 1); | |
1192 | 1192 | } |
1193 | 1193 | return DATA; |
1194 | 1194 | } |
... | ... | @@ -1554,7 +1554,7 @@ dec_scrolling_region(int top, int bottom) |
1554 | 1554 | if (top <= bottom && (top > 1 || bottom < h3270.rows)) { |
1555 | 1555 | scroll_top = top; |
1556 | 1556 | scroll_bottom = bottom; |
1557 | - cursor_move(0); | |
1557 | + cursor_move(&h3270,0); | |
1558 | 1558 | } else { |
1559 | 1559 | scroll_top = 1; |
1560 | 1560 | scroll_bottom = h3270.rows; | ... | ... |
... | ... | @@ -399,11 +399,6 @@ |
399 | 399 | // LOCAL_EXTERN void screen_suspend(H3270 *session); |
400 | 400 | LOCAL_EXTERN void screen_disp(H3270 *session); |
401 | 401 | |
402 | - /* Cursor calls */ | |
403 | - #define cursor_get_addr(void) lib3270_get_cursor_address(NULL) | |
404 | - #define cursor_set_addr(x) lib3270_set_cursor_address(NULL,x) | |
405 | - #define cursor_move(x) lib3270_set_cursor_address(NULL,x) | |
406 | - | |
407 | 402 | #include <lib3270/actions.h> |
408 | 403 | |
409 | 404 | #define host_connect(n,wait) lib3270_connect(NULL,n,wait) | ... | ... |
ctlr.c
... | ... | @@ -1093,7 +1093,7 @@ ctlr_erase_all_unprotected(void) |
1093 | 1093 | do { |
1094 | 1094 | INC_BA(baddr); |
1095 | 1095 | if (!f) { |
1096 | - cursor_move(baddr); | |
1096 | + cursor_move(&h3270,baddr); | |
1097 | 1097 | f = True; |
1098 | 1098 | } |
1099 | 1099 | if (!h3270.ea_buf[baddr].fa) { |
... | ... | @@ -1108,7 +1108,7 @@ ctlr_erase_all_unprotected(void) |
1108 | 1108 | } |
1109 | 1109 | } while (baddr != sbaddr); |
1110 | 1110 | if (!f) |
1111 | - cursor_move(0); | |
1111 | + cursor_move(&h3270,0); | |
1112 | 1112 | } else { |
1113 | 1113 | ctlr_clear(&h3270,True); |
1114 | 1114 | } |
... | ... | @@ -1264,7 +1264,7 @@ ctlr_write(unsigned char buf[], int buflen, Boolean erase) |
1264 | 1264 | if (previous != SBA) |
1265 | 1265 | trace_ds("%s",rcba(buffer_addr)); |
1266 | 1266 | previous = ORDER; |
1267 | - cursor_move(h3270.buffer_addr); | |
1267 | + cursor_move(&h3270,h3270.buffer_addr); | |
1268 | 1268 | last_cmd = True; |
1269 | 1269 | last_zpt = False; |
1270 | 1270 | break; |
... | ... | @@ -1989,7 +1989,7 @@ ctlr_write_sscp_lu(unsigned char buf[], int buflen) |
1989 | 1989 | break; |
1990 | 1990 | } |
1991 | 1991 | } |
1992 | - cursor_move(h3270.buffer_addr); | |
1992 | + cursor_move(&h3270,h3270.buffer_addr); | |
1993 | 1993 | sscp_start = h3270.buffer_addr; |
1994 | 1994 | |
1995 | 1995 | /* Unlock the keyboard. */ |
... | ... | @@ -2337,7 +2337,7 @@ ctlr_clear(H3270 *session, Boolean can_snap) |
2337 | 2337 | |
2338 | 2338 | /* Clear the screen. */ |
2339 | 2339 | (void) memset((char *)session->ea_buf, 0, session->rows*session->cols*sizeof(struct ea)); |
2340 | - cursor_move(0); | |
2340 | + cursor_move(&h3270,0); | |
2341 | 2341 | session->buffer_addr = 0; |
2342 | 2342 | lib3270_unselect(session); |
2343 | 2343 | session->formatted = False; |
... | ... | @@ -2364,7 +2364,7 @@ ctlr_blanks(void) |
2364 | 2364 | if (!h3270.ea_buf[baddr].fa) |
2365 | 2365 | h3270.ea_buf[baddr].cc = EBC_space; |
2366 | 2366 | } |
2367 | - cursor_move(0); | |
2367 | + cursor_move(&h3270,0); | |
2368 | 2368 | h3270.buffer_addr = 0; |
2369 | 2369 | lib3270_unselect(&h3270); |
2370 | 2370 | h3270.formatted = False; | ... | ... |
globals.h
... | ... | @@ -246,7 +246,8 @@ LIB3270_INTERNAL Widget toplevel; |
246 | 246 | LIB3270_INTERNAL Boolean visible_control; |
247 | 247 | LIB3270_INTERNAL int *xtra_width; |
248 | 248 | |
249 | -#if defined(X3270_DISPLAY) /*[*/ | |
249 | +/* | |
250 | +#if defined(X3270_DISPLAY) | |
250 | 251 | LIB3270_INTERNAL Atom a_delete_me; |
251 | 252 | LIB3270_INTERNAL Atom a_save_yourself; |
252 | 253 | LIB3270_INTERNAL Atom a_state; |
... | ... | @@ -257,7 +258,8 @@ LIB3270_INTERNAL int *xtra_width; |
257 | 258 | LIB3270_INTERNAL Window root_window; |
258 | 259 | LIB3270_INTERNAL char *user_title; |
259 | 260 | LIB3270_INTERNAL unsigned char xk_selector; |
260 | -#endif /*]*/ | |
261 | +#endif | |
262 | +*/ | |
261 | 263 | |
262 | 264 | /* Connection state */ |
263 | 265 | LIB3270_INTERNAL enum ft_state ft_state; |
... | ... | @@ -372,6 +374,7 @@ enum keytype |
372 | 374 | |
373 | 375 | |
374 | 376 | /* Library internal calls */ |
375 | -void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); | |
376 | -void lib3270_initialize(void); | |
377 | +LIB3270_INTERNAL void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); | |
378 | +LIB3270_INTERNAL void lib3270_initialize(void); | |
379 | +LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); | |
377 | 380 | ... | ... |
glue.c
init.c
... | ... | @@ -103,6 +103,10 @@ static void update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) |
103 | 103 | { |
104 | 104 | } |
105 | 105 | |
106 | +static void update_selection(H3270 *session, int start, int end) | |
107 | +{ | |
108 | +} | |
109 | + | |
106 | 110 | static void lib3270_session_init(H3270 *hSession, const char *model) |
107 | 111 | { |
108 | 112 | int ovc, ovr; |
... | ... | @@ -116,16 +120,17 @@ static void lib3270_session_init(H3270 *hSession, const char *model) |
116 | 120 | initialize_toggles(hSession); |
117 | 121 | |
118 | 122 | // Dummy calls to avoid "ifs" |
119 | - hSession->update = update_char; | |
120 | - hSession->update_model = update_model; | |
121 | - hSession->update_cursor = update_cursor; | |
122 | - hSession->set_selection = nop_char; | |
123 | - hSession->ctlr_done = nop; | |
124 | - hSession->changed = changed; | |
125 | - hSession->erase = screen_disp; | |
126 | - hSession->suspend = nop; | |
127 | - hSession->resume = screen_disp; | |
128 | - hSession->update_oia = update_oia; | |
123 | + hSession->update = update_char; | |
124 | + hSession->update_model = update_model; | |
125 | + hSession->update_cursor = update_cursor; | |
126 | + hSession->set_selection = nop_char; | |
127 | + hSession->ctlr_done = nop; | |
128 | + hSession->changed = changed; | |
129 | + hSession->erase = screen_disp; | |
130 | + hSession->suspend = nop; | |
131 | + hSession->resume = screen_disp; | |
132 | + hSession->update_oia = update_oia; | |
133 | + hSession->update_selection = update_selection; | |
129 | 134 | |
130 | 135 | hSession->sock = -1; |
131 | 136 | hSession->model_num = -1; | ... | ... |
kybd.c
... | ... | @@ -966,7 +966,7 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, Boolean |
966 | 966 | else |
967 | 967 | INC_BA(baddr); |
968 | 968 | } |
969 | - cursor_move(baddr); | |
969 | + cursor_move(&h3270,baddr); | |
970 | 970 | } |
971 | 971 | |
972 | 972 | (void) ctlr_dbcs_postprocess(); |
... | ... | @@ -1387,7 +1387,7 @@ LIB3270_KEY_ACTION( tab ) |
1387 | 1387 | return 0; |
1388 | 1388 | } |
1389 | 1389 | #endif /*]*/ |
1390 | - cursor_move(next_unprotected(h3270.cursor_addr)); | |
1390 | + cursor_move(&h3270,next_unprotected(h3270.cursor_addr)); | |
1391 | 1391 | return 0; |
1392 | 1392 | } |
1393 | 1393 | |
... | ... | @@ -1427,12 +1427,12 @@ LIB3270_KEY_ACTION( backtab ) |
1427 | 1427 | break; |
1428 | 1428 | DEC_BA(baddr); |
1429 | 1429 | if (baddr == sbaddr) { |
1430 | - cursor_move(0); | |
1430 | + cursor_move(&h3270,0); | |
1431 | 1431 | return 0; |
1432 | 1432 | } |
1433 | 1433 | } |
1434 | 1434 | INC_BA(baddr); |
1435 | - cursor_move(baddr); | |
1435 | + cursor_move(&h3270,baddr); | |
1436 | 1436 | return 0; |
1437 | 1437 | } |
1438 | 1438 | |
... | ... | @@ -1546,11 +1546,11 @@ LIB3270_ACTION( firstfield ) |
1546 | 1546 | return 0; |
1547 | 1547 | } |
1548 | 1548 | #endif /*]*/ |
1549 | - if (!h3270.formatted) { | |
1550 | - cursor_move(0); | |
1549 | + if (!hSession->formatted) { | |
1550 | + cursor_move(hSession,0); | |
1551 | 1551 | return 0; |
1552 | 1552 | } |
1553 | - cursor_move(next_unprotected(h3270.rows*h3270.cols-1)); | |
1553 | + cursor_move(hSession,next_unprotected(hSession->rows*hSession->cols-1)); | |
1554 | 1554 | |
1555 | 1555 | return 0; |
1556 | 1556 | } |
... | ... | @@ -1570,7 +1570,7 @@ do_left(void) |
1570 | 1570 | d = ctlr_dbcs_state(baddr); |
1571 | 1571 | if (IS_LEFT(d)) |
1572 | 1572 | DEC_BA(baddr); |
1573 | - cursor_move(baddr); | |
1573 | + cursor_move(&h3270,baddr); | |
1574 | 1574 | } |
1575 | 1575 | |
1576 | 1576 | /* |
... | ... | @@ -1603,7 +1603,7 @@ LIB3270_CURSOR_ACTION( left ) |
1603 | 1603 | } |
1604 | 1604 | #endif /*]*/ |
1605 | 1605 | |
1606 | - if (!h3270.flipped) | |
1606 | + if (!hSession->flipped) | |
1607 | 1607 | { |
1608 | 1608 | do_left(); |
1609 | 1609 | } |
... | ... | @@ -1611,10 +1611,10 @@ LIB3270_CURSOR_ACTION( left ) |
1611 | 1611 | { |
1612 | 1612 | register int baddr; |
1613 | 1613 | |
1614 | - baddr = h3270.cursor_addr; | |
1614 | + baddr = hSession->cursor_addr; | |
1615 | 1615 | INC_BA(baddr); |
1616 | 1616 | /* XXX: DBCS? */ |
1617 | - cursor_move(baddr); | |
1617 | + lib3270_set_cursor_address(hSession,baddr); | |
1618 | 1618 | } |
1619 | 1619 | return 0; |
1620 | 1620 | } |
... | ... | @@ -1720,7 +1720,7 @@ LIB3270_ACTION( delete ) |
1720 | 1720 | |
1721 | 1721 | DEC_BA(baddr); |
1722 | 1722 | if (!hSession->ea_buf[baddr].fa) |
1723 | - cursor_move(baddr); | |
1723 | + cursor_move(hSession,baddr); | |
1724 | 1724 | } |
1725 | 1725 | screen_disp(hSession); |
1726 | 1726 | return 0; |
... | ... | @@ -1745,16 +1745,16 @@ LIB3270_ACTION( backspace ) |
1745 | 1745 | #endif /*]*/ |
1746 | 1746 | if (reverse) |
1747 | 1747 | (void) do_delete(); |
1748 | - else if (!h3270.flipped) | |
1748 | + else if (!hSession->flipped) | |
1749 | 1749 | do_left(); |
1750 | 1750 | else { |
1751 | 1751 | register int baddr; |
1752 | 1752 | |
1753 | - baddr = h3270.cursor_addr; | |
1753 | + baddr = hSession->cursor_addr; | |
1754 | 1754 | DEC_BA(baddr); |
1755 | - cursor_move(baddr); | |
1755 | + cursor_move(hSession,baddr); | |
1756 | 1756 | } |
1757 | - screen_disp(&h3270); | |
1757 | + screen_disp(hSession); | |
1758 | 1758 | return 0; |
1759 | 1759 | } |
1760 | 1760 | |
... | ... | @@ -1784,7 +1784,7 @@ do_erase(void) |
1784 | 1784 | if (h3270.ea_buf[h3270.cursor_addr].cc == EBC_si) { |
1785 | 1785 | baddr = h3270.cursor_addr; |
1786 | 1786 | DEC_BA(baddr); |
1787 | - cursor_move(baddr); | |
1787 | + cursor_move(&h3270,baddr); | |
1788 | 1788 | } |
1789 | 1789 | |
1790 | 1790 | /* |
... | ... | @@ -1797,7 +1797,7 @@ do_erase(void) |
1797 | 1797 | if (IS_RIGHT(d)) { |
1798 | 1798 | baddr = h3270.cursor_addr; |
1799 | 1799 | DEC_BA(baddr); |
1800 | - cursor_move(baddr); | |
1800 | + cursor_move(&h3270,baddr); | |
1801 | 1801 | } |
1802 | 1802 | |
1803 | 1803 | /* |
... | ... | @@ -1813,7 +1813,7 @@ do_erase(void) |
1813 | 1813 | baddr = h3270.cursor_addr; |
1814 | 1814 | DEC_BA(baddr); |
1815 | 1815 | if (h3270.ea_buf[baddr].cc == EBC_so && h3270.ea_buf[h3270.cursor_addr].cc == EBC_si) { |
1816 | - cursor_move(baddr); | |
1816 | + cursor_move(&h3270,baddr); | |
1817 | 1817 | (void) do_delete(); |
1818 | 1818 | } |
1819 | 1819 | screen_disp(&h3270); |
... | ... | @@ -1863,14 +1863,14 @@ LIB3270_CURSOR_ACTION( right ) |
1863 | 1863 | return 0; |
1864 | 1864 | } |
1865 | 1865 | #endif /*]*/ |
1866 | - if (!h3270.flipped) | |
1866 | + if (!hSession->flipped) | |
1867 | 1867 | { |
1868 | - baddr = h3270.cursor_addr; | |
1868 | + baddr = hSession->cursor_addr; | |
1869 | 1869 | INC_BA(baddr); |
1870 | 1870 | d = ctlr_dbcs_state(baddr); |
1871 | 1871 | if (IS_RIGHT(d)) |
1872 | 1872 | INC_BA(baddr); |
1873 | - cursor_move(baddr); | |
1873 | + lib3270_set_cursor_address(hSession,baddr); | |
1874 | 1874 | } |
1875 | 1875 | else |
1876 | 1876 | { |
... | ... | @@ -1937,30 +1937,30 @@ LIB3270_ACTION( previousword ) |
1937 | 1937 | if (IN_ANSI) |
1938 | 1938 | return 0; |
1939 | 1939 | #endif /*]*/ |
1940 | - if (!h3270.formatted) | |
1940 | + if (!hSession->formatted) | |
1941 | 1941 | return 0; |
1942 | 1942 | |
1943 | - baddr = h3270.cursor_addr; | |
1944 | - prot = FA_IS_PROTECTED(get_field_attribute(&h3270,baddr)); | |
1943 | + baddr = hSession->cursor_addr; | |
1944 | + prot = FA_IS_PROTECTED(get_field_attribute(hSession,baddr)); | |
1945 | 1945 | |
1946 | 1946 | /* Skip to before this word, if in one now. */ |
1947 | 1947 | if (!prot) { |
1948 | - c = h3270.ea_buf[baddr].cc; | |
1949 | - while (!h3270.ea_buf[baddr].fa && c != EBC_space && c != EBC_null) { | |
1948 | + c = hSession->ea_buf[baddr].cc; | |
1949 | + while (!hSession->ea_buf[baddr].fa && c != EBC_space && c != EBC_null) { | |
1950 | 1950 | DEC_BA(baddr); |
1951 | - if (baddr == h3270.cursor_addr) | |
1951 | + if (baddr == hSession->cursor_addr) | |
1952 | 1952 | return 0; |
1953 | - c = h3270.ea_buf[baddr].cc; | |
1953 | + c = hSession->ea_buf[baddr].cc; | |
1954 | 1954 | } |
1955 | 1955 | } |
1956 | 1956 | baddr0 = baddr; |
1957 | 1957 | |
1958 | 1958 | /* Find the end of the preceding word. */ |
1959 | 1959 | do { |
1960 | - c = h3270.ea_buf[baddr].cc; | |
1961 | - if (h3270.ea_buf[baddr].fa) { | |
1960 | + c = hSession->ea_buf[baddr].cc; | |
1961 | + if (hSession->ea_buf[baddr].fa) { | |
1962 | 1962 | DEC_BA(baddr); |
1963 | - prot = FA_IS_PROTECTED(get_field_attribute(&h3270,baddr)); | |
1963 | + prot = FA_IS_PROTECTED(get_field_attribute(hSession,baddr)); | |
1964 | 1964 | continue; |
1965 | 1965 | } |
1966 | 1966 | if (!prot && c != EBC_space && c != EBC_null) |
... | ... | @@ -1974,13 +1974,13 @@ LIB3270_ACTION( previousword ) |
1974 | 1974 | /* Go it its front. */ |
1975 | 1975 | for (;;) { |
1976 | 1976 | DEC_BA(baddr); |
1977 | - c = h3270.ea_buf[baddr].cc; | |
1978 | - if (h3270.ea_buf[baddr].fa || c == EBC_space || c == EBC_null) { | |
1977 | + c = hSession->ea_buf[baddr].cc; | |
1978 | + if (hSession->ea_buf[baddr].fa || c == EBC_space || c == EBC_null) { | |
1979 | 1979 | break; |
1980 | 1980 | } |
1981 | 1981 | } |
1982 | 1982 | INC_BA(baddr); |
1983 | - cursor_move(baddr); | |
1983 | + cursor_move(hSession,baddr); | |
1984 | 1984 | return 0; |
1985 | 1985 | } |
1986 | 1986 | |
... | ... | @@ -2088,62 +2088,54 @@ LIB3270_ACTION( nextword ) |
2088 | 2088 | if (IN_ANSI) |
2089 | 2089 | return 0; |
2090 | 2090 | #endif /*]*/ |
2091 | - if (!h3270.formatted) | |
2091 | + if (!hSession->formatted) | |
2092 | 2092 | return 0; |
2093 | 2093 | |
2094 | 2094 | /* If not in an unprotected field, go to the next unprotected word. */ |
2095 | - if (h3270.ea_buf[h3270.cursor_addr].fa || | |
2096 | - FA_IS_PROTECTED(get_field_attribute(&h3270,h3270.cursor_addr))) { | |
2097 | - baddr = nu_word(h3270.cursor_addr); | |
2095 | + if (hSession->ea_buf[hSession->cursor_addr].fa || | |
2096 | + FA_IS_PROTECTED(get_field_attribute(hSession,hSession->cursor_addr))) { | |
2097 | + baddr = nu_word(hSession->cursor_addr); | |
2098 | 2098 | if (baddr != -1) |
2099 | - cursor_move(baddr); | |
2099 | + cursor_move(hSession,baddr); | |
2100 | 2100 | return 0; |
2101 | 2101 | } |
2102 | 2102 | |
2103 | 2103 | /* If there's another word in this field, go to it. */ |
2104 | - baddr = nt_word(h3270.cursor_addr); | |
2104 | + baddr = nt_word(hSession->cursor_addr); | |
2105 | 2105 | if (baddr != -1) { |
2106 | - cursor_move(baddr); | |
2106 | + cursor_move(hSession,baddr); | |
2107 | 2107 | return 0; |
2108 | 2108 | } |
2109 | 2109 | |
2110 | 2110 | /* If in a word, go to just after its end. */ |
2111 | - c = h3270.ea_buf[h3270.cursor_addr].cc; | |
2111 | + c = hSession->ea_buf[hSession->cursor_addr].cc; | |
2112 | 2112 | if (c != EBC_space && c != EBC_null) { |
2113 | - baddr = h3270.cursor_addr; | |
2113 | + baddr = hSession->cursor_addr; | |
2114 | 2114 | do { |
2115 | - c = h3270.ea_buf[baddr].cc; | |
2115 | + c = hSession->ea_buf[baddr].cc; | |
2116 | 2116 | if (c == EBC_space || c == EBC_null) { |
2117 | - cursor_move(baddr); | |
2117 | + cursor_move(hSession,baddr); | |
2118 | 2118 | return 0; |
2119 | - } else if (h3270.ea_buf[baddr].fa) { | |
2119 | + } else if (hSession->ea_buf[baddr].fa) { | |
2120 | 2120 | baddr = nu_word(baddr); |
2121 | 2121 | if (baddr != -1) |
2122 | - cursor_move(baddr); | |
2122 | + cursor_move(hSession,baddr); | |
2123 | 2123 | return 0; |
2124 | 2124 | } |
2125 | 2125 | INC_BA(baddr); |
2126 | - } while (baddr != h3270.cursor_addr); | |
2126 | + } while (baddr != hSession->cursor_addr); | |
2127 | 2127 | } |
2128 | 2128 | /* Otherwise, go to the next unprotected word. */ |
2129 | 2129 | else { |
2130 | - baddr = nu_word(h3270.cursor_addr); | |
2130 | + baddr = nu_word(hSession->cursor_addr); | |
2131 | 2131 | if (baddr != -1) |
2132 | - cursor_move(baddr); | |
2132 | + cursor_move(hSession,baddr); | |
2133 | 2133 | } |
2134 | 2134 | |
2135 | 2135 | return 0; |
2136 | 2136 | } |
2137 | 2137 | |
2138 | 2138 | |
2139 | -/* | |
2140 | - * Cursor up 1 position. | |
2141 | - */ /* | |
2142 | -void Up_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params) | |
2143 | -{ | |
2144 | - action_CursorUp(); | |
2145 | -} | |
2146 | -*/ | |
2147 | 2139 | |
2148 | 2140 | /** |
2149 | 2141 | * Cursor up 1 position. |
... | ... | @@ -2175,24 +2167,13 @@ LIB3270_CURSOR_ACTION( up ) |
2175 | 2167 | return 0; |
2176 | 2168 | } |
2177 | 2169 | #endif /*]*/ |
2178 | - baddr = h3270.cursor_addr - h3270.cols; | |
2170 | + baddr = hSession->cursor_addr - hSession->cols; | |
2179 | 2171 | if (baddr < 0) |
2180 | - baddr = (h3270.cursor_addr + (h3270.rows * h3270.cols)) - h3270.cols; | |
2181 | - cursor_move(baddr); | |
2172 | + baddr = (hSession->cursor_addr + (hSession->rows * hSession->cols)) - hSession->cols; | |
2173 | + lib3270_set_cursor_address(hSession,baddr); | |
2182 | 2174 | return 0; |
2183 | 2175 | } |
2184 | 2176 | |
2185 | - | |
2186 | -/* | |
2187 | - * Cursor down 1 position. | |
2188 | - */ /* | |
2189 | -void | |
2190 | -Down_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params) | |
2191 | -{ | |
2192 | - action_CursorDown(); | |
2193 | -} | |
2194 | -*/ | |
2195 | - | |
2196 | 2177 | /** |
2197 | 2178 | * Cursor down 1 position. |
2198 | 2179 | * |
... | ... | @@ -2224,8 +2205,8 @@ LIB3270_CURSOR_ACTION( down ) |
2224 | 2205 | return 0; |
2225 | 2206 | } |
2226 | 2207 | #endif /*]*/ |
2227 | - baddr = (h3270.cursor_addr + h3270.cols) % (h3270.cols * h3270.rows); | |
2228 | - cursor_move(baddr); | |
2208 | + baddr = (hSession->cursor_addr + hSession->cols) % (hSession->cols * hSession->rows); | |
2209 | + lib3270_set_cursor_address(hSession,baddr); | |
2229 | 2210 | return 0; |
2230 | 2211 | } |
2231 | 2212 | |
... | ... | @@ -2252,14 +2233,14 @@ LIB3270_CURSOR_ACTION( newline ) |
2252 | 2233 | return 0; |
2253 | 2234 | } |
2254 | 2235 | #endif /*]*/ |
2255 | - baddr = (h3270.cursor_addr + h3270.cols) % (h3270.cols * h3270.rows); /* down */ | |
2256 | - baddr = (baddr / h3270.cols) * h3270.cols; /* 1st col */ | |
2257 | - faddr = find_field_attribute(&h3270,baddr); | |
2258 | - fa = h3270.ea_buf[faddr].fa; | |
2236 | + baddr = (hSession->cursor_addr + hSession->cols) % (hSession->cols * hSession->rows); /* down */ | |
2237 | + baddr = (baddr / hSession->cols) * hSession->cols; /* 1st col */ | |
2238 | + faddr = find_field_attribute(hSession,baddr); | |
2239 | + fa = hSession->ea_buf[faddr].fa; | |
2259 | 2240 | if (faddr != baddr && !FA_IS_PROTECTED(fa)) |
2260 | - cursor_move(baddr); | |
2241 | + cursor_move(hSession,baddr); | |
2261 | 2242 | else |
2262 | - cursor_move(next_unprotected(baddr)); | |
2243 | + cursor_move(hSession,next_unprotected(baddr)); | |
2263 | 2244 | |
2264 | 2245 | return 0; |
2265 | 2246 | } |
... | ... | @@ -2282,7 +2263,7 @@ LIB3270_ACTION( dup ) |
2282 | 2263 | if (key_Character(EBC_dup, False, False, NULL)) |
2283 | 2264 | { |
2284 | 2265 | screen_disp(hSession); |
2285 | - cursor_move(next_unprotected(hSession->cursor_addr)); | |
2266 | + cursor_move(hSession,next_unprotected(hSession->cursor_addr)); | |
2286 | 2267 | } |
2287 | 2268 | } |
2288 | 2269 | |
... | ... | @@ -2369,8 +2350,8 @@ LIB3270_ACTION( clear ) |
2369 | 2350 | } |
2370 | 2351 | #endif /*]*/ |
2371 | 2352 | h3270.buffer_addr = 0; |
2372 | - ctlr_clear(&h3270,True); | |
2373 | - cursor_move(0); | |
2353 | + ctlr_clear(hSession,True); | |
2354 | + cursor_move(hSession,0); | |
2374 | 2355 | if (CONNECTED) |
2375 | 2356 | key_AID(AID_CLEAR); |
2376 | 2357 | return 0; |
... | ... | @@ -2626,37 +2607,37 @@ LIB3270_ACTION( eraseinput ) |
2626 | 2607 | /* find first field attribute */ |
2627 | 2608 | baddr = 0; |
2628 | 2609 | do { |
2629 | - if (h3270.ea_buf[baddr].fa) | |
2610 | + if (hSession->ea_buf[baddr].fa) | |
2630 | 2611 | break; |
2631 | 2612 | INC_BA(baddr); |
2632 | 2613 | } while (baddr != 0); |
2633 | 2614 | sbaddr = baddr; |
2634 | 2615 | f = False; |
2635 | 2616 | do { |
2636 | - fa = h3270.ea_buf[baddr].fa; | |
2617 | + fa = hSession->ea_buf[baddr].fa; | |
2637 | 2618 | if (!FA_IS_PROTECTED(fa)) { |
2638 | 2619 | mdt_clear(baddr); |
2639 | 2620 | do { |
2640 | 2621 | INC_BA(baddr); |
2641 | 2622 | if (!f) { |
2642 | - cursor_move(baddr); | |
2623 | + cursor_move(hSession,baddr); | |
2643 | 2624 | f = True; |
2644 | 2625 | } |
2645 | - if (!h3270.ea_buf[baddr].fa) { | |
2626 | + if (!hSession->ea_buf[baddr].fa) { | |
2646 | 2627 | ctlr_add(baddr, EBC_null, 0); |
2647 | 2628 | } |
2648 | - } while (!h3270.ea_buf[baddr].fa); | |
2629 | + } while (!hSession->ea_buf[baddr].fa); | |
2649 | 2630 | } else { /* skip protected */ |
2650 | 2631 | do { |
2651 | 2632 | INC_BA(baddr); |
2652 | - } while (!h3270.ea_buf[baddr].fa); | |
2633 | + } while (!hSession->ea_buf[baddr].fa); | |
2653 | 2634 | } |
2654 | 2635 | } while (baddr != sbaddr); |
2655 | 2636 | if (!f) |
2656 | - cursor_move(0); | |
2637 | + cursor_move(hSession,0); | |
2657 | 2638 | } else { |
2658 | 2639 | ctlr_clear(hSession,True); |
2659 | - cursor_move(0); | |
2640 | + cursor_move(hSession,0); | |
2660 | 2641 | } |
2661 | 2642 | screen_disp(hSession); |
2662 | 2643 | return 0; |
... | ... | @@ -2768,7 +2749,7 @@ LIB3270_ACTION( deletefield ) |
2768 | 2749 | DEC_BA(baddr); |
2769 | 2750 | INC_BA(baddr); |
2770 | 2751 | mdt_set(hSession->cursor_addr); |
2771 | - cursor_move(baddr); | |
2752 | + cursor_move(hSession,baddr); | |
2772 | 2753 | while (!hSession->ea_buf[baddr].fa) { |
2773 | 2754 | ctlr_add(baddr, EBC_null, 0); |
2774 | 2755 | INC_BA(baddr); |
... | ... | @@ -2883,10 +2864,10 @@ LIB3270_ACTION( fieldend ) |
2883 | 2864 | } else { |
2884 | 2865 | baddr = last_nonblank; |
2885 | 2866 | INC_BA(baddr); |
2886 | - if (h3270.ea_buf[baddr].fa) | |
2867 | + if (hSession->ea_buf[baddr].fa) | |
2887 | 2868 | baddr = last_nonblank; |
2888 | 2869 | } |
2889 | - cursor_move(baddr); | |
2870 | + cursor_move(hSession,baddr); | |
2890 | 2871 | return 0; |
2891 | 2872 | } |
2892 | 2873 | |
... | ... | @@ -2956,7 +2937,7 @@ remargin(int lmargin) |
2956 | 2937 | } |
2957 | 2938 | } |
2958 | 2939 | |
2959 | - cursor_move(baddr); | |
2940 | + cursor_move(&h3270,baddr); | |
2960 | 2941 | return True; |
2961 | 2942 | } |
2962 | 2943 | |
... | ... | @@ -3347,112 +3328,6 @@ LIB3270_EXPORT int lib3270_emulate_input(H3270 *session, char *s, int len, int p |
3347 | 3328 | return len; |
3348 | 3329 | } |
3349 | 3330 | |
3350 | -/* | |
3351 | - * Pretend that a sequence of hexadecimal characters was entered at the | |
3352 | - * keyboard. The input is a sequence of hexadecimal bytes, 2 characters | |
3353 | - * per byte. If connected in ANSI mode, these are treated as ASCII | |
3354 | - * characters; if in 3270 mode, they are considered EBCDIC. | |
3355 | - * | |
3356 | - * Graphic Escapes are handled as \E. | |
3357 | - */ /* | |
3358 | -void | |
3359 | -hex_input(char *s) | |
3360 | -{ | |
3361 | - char *t; | |
3362 | - Boolean escaped; | |
3363 | -#if defined(X3270_ANSI) | |
3364 | - unsigned char *xbuf = (unsigned char *)NULL; | |
3365 | - unsigned char *tbuf = (unsigned char *)NULL; | |
3366 | - int nbytes = 0; | |
3367 | -#endif | |
3368 | - | |
3369 | - // Validate the string. | |
3370 | - if (strlen(s) % 2) { | |
3371 | - popup_an_error("%s: Odd number of characters in specification", | |
3372 | - action_name(HexString_action)); | |
3373 | -// cancel_if_idle_command(); | |
3374 | - return; | |
3375 | - } | |
3376 | - t = s; | |
3377 | - escaped = False; | |
3378 | - while (*t) { | |
3379 | - if (isxdigit(*t) && isxdigit(*(t + 1))) { | |
3380 | - escaped = False; | |
3381 | -#if defined(X3270_ANSI) | |
3382 | - nbytes++; | |
3383 | -#endif | |
3384 | - } else if (!strncmp(t, "\\E", 2) || !strncmp(t, "\\e", 2)) { | |
3385 | - if (escaped) { | |
3386 | - popup_an_error("%s: Double \\E", | |
3387 | - action_name(HexString_action)); | |
3388 | -// cancel_if_idle_command(); | |
3389 | - return; | |
3390 | - } | |
3391 | - if (!IN_3270) { | |
3392 | - popup_an_error("%s: \\E in ANSI mode", | |
3393 | - action_name(HexString_action)); | |
3394 | -// cancel_if_idle_command(); | |
3395 | - return; | |
3396 | - } | |
3397 | - escaped = True; | |
3398 | - } else { | |
3399 | - popup_an_error("%s: Illegal character in specification", | |
3400 | - action_name(HexString_action)); | |
3401 | -// cancel_if_idle_command(); | |
3402 | - return; | |
3403 | - } | |
3404 | - t += 2; | |
3405 | - } | |
3406 | - if (escaped) { | |
3407 | - popup_an_error("%s: Nothing follows \\E", | |
3408 | - action_name(HexString_action)); | |
3409 | -// cancel_if_idle_command(); | |
3410 | - return; | |
3411 | - } | |
3412 | - | |
3413 | -#if defined(X3270_ANSI) | |
3414 | - // Allocate a temporary buffer. | |
3415 | - if (!IN_3270 && nbytes) | |
3416 | - tbuf = xbuf = (unsigned char *)Malloc(nbytes); | |
3417 | -#endif | |
3418 | - | |
3419 | - // Pump it in. | |
3420 | - t = s; | |
3421 | - escaped = False; | |
3422 | - while (*t) { | |
3423 | - if (isxdigit(*t) && isxdigit(*(t + 1))) { | |
3424 | - unsigned c; | |
3425 | - | |
3426 | - c = (FROM_HEX(*t) * 16) + FROM_HEX(*(t + 1)); | |
3427 | - if (IN_3270) | |
3428 | - key_Character(c, escaped, True, NULL); | |
3429 | -#if defined(X3270_ANSI) | |
3430 | - else | |
3431 | - *tbuf++ = (unsigned char)c; | |
3432 | -#endif | |
3433 | - escaped = False; | |
3434 | - } else if (!strncmp(t, "\\E", 2) || !strncmp(t, "\\e", 2)) { | |
3435 | - escaped = True; | |
3436 | - } | |
3437 | - t += 2; | |
3438 | - } | |
3439 | -#if defined(X3270_ANSI) | |
3440 | - if (!IN_3270 && nbytes) { | |
3441 | - net_hexansi_out(xbuf, nbytes); | |
3442 | - Free(xbuf); | |
3443 | - } | |
3444 | -#endif | |
3445 | -} | |
3446 | -*/ | |
3447 | - | |
3448 | -/* | |
3449 | -void | |
3450 | -ignore_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params) | |
3451 | -{ | |
3452 | -// reset_idle_timer(); | |
3453 | -} | |
3454 | -*/ | |
3455 | - | |
3456 | 3331 | #if defined(X3270_FT) /*[*/ |
3457 | 3332 | /* |
3458 | 3333 | * Set up the cursor and input field for command input. |
... | ... | @@ -3496,7 +3371,7 @@ kybd_prime(void) |
3496 | 3371 | } |
3497 | 3372 | |
3498 | 3373 | /* Move the cursor to the beginning of the field. */ |
3499 | - cursor_move(baddr); | |
3374 | + cursor_move(&h3270,baddr); | |
3500 | 3375 | |
3501 | 3376 | /* Erase it. */ |
3502 | 3377 | while (!h3270.ea_buf[baddr].fa) { | ... | ... |
paste.c
... | ... | @@ -128,7 +128,7 @@ |
128 | 128 | } |
129 | 129 | |
130 | 130 | } |
131 | - cursor_move(baddr); | |
131 | + cursor_move(session,baddr); | |
132 | 132 | } |
133 | 133 | |
134 | 134 | return -1; |
... | ... | @@ -210,9 +210,9 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str) |
210 | 210 | faddr = find_field_attribute(h,baddr); |
211 | 211 | fa = h->ea_buf[faddr].fa; |
212 | 212 | if (faddr != baddr && !FA_IS_PROTECTED(fa)) |
213 | - cursor_move(baddr); | |
213 | + cursor_move(h,baddr); | |
214 | 214 | else |
215 | - cursor_move(next_unprotected(baddr)); | |
215 | + cursor_move(h,next_unprotected(baddr)); | |
216 | 216 | data.row = BA_TO_ROW(h->cursor_addr); |
217 | 217 | } |
218 | 218 | last = ' '; | ... | ... |
screen.c
... | ... | @@ -376,10 +376,18 @@ LIB3270_EXPORT int lib3270_get_cursor_address(H3270 *h) |
376 | 376 | |
377 | 377 | LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr) |
378 | 378 | { |
379 | - int ret; | |
380 | - | |
381 | 379 | CHECK_SESSION_HANDLE(h); |
382 | 380 | |
381 | + if(h->selected && !lib3270_get_toggle(h,LIB3270_TOGGLE_KEEP_SELECTED)) | |
382 | + lib3270_unselect(h); | |
383 | + | |
384 | + return cursor_move(h,baddr); | |
385 | +} | |
386 | + | |
387 | +int cursor_move(H3270 *h, int baddr) | |
388 | +{ | |
389 | + int ret; | |
390 | + | |
383 | 391 | ret = h->cursor_addr; |
384 | 392 | |
385 | 393 | if(ret == baddr) | ... | ... |
selection.c
... | ... | @@ -40,20 +40,20 @@ |
40 | 40 | #define SELECTION_BOTTOM 0x08 |
41 | 41 | #define SELECTION_ACTIVE 0x10 |
42 | 42 | |
43 | - static void update_selection(H3270 *session); | |
43 | + static void select_region(H3270 *h, int start, int end); | |
44 | 44 | |
45 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
45 | + /*--[ Implement ]------------------------------------------------------------------------------------*/ | |
46 | 46 | |
47 | -static void get_selected_addr(H3270 *session, int *begin, int *end) | |
47 | +static void get_selected_addr(H3270 *session, int *start, int *end) | |
48 | 48 | { |
49 | - if(session->select.begin > session->select.end) | |
49 | + if(session->select.start > session->select.end) | |
50 | 50 | { |
51 | - *end = session->select.begin; | |
52 | - *begin = session->select.end; | |
51 | + *end = session->select.start; | |
52 | + *start = session->select.end; | |
53 | 53 | } |
54 | 54 | else |
55 | 55 | { |
56 | - *begin = session->select.begin; | |
56 | + *start = session->select.start; | |
57 | 57 | *end = session->select.end; |
58 | 58 | } |
59 | 59 | } |
... | ... | @@ -161,23 +161,6 @@ static void update_selected_region(H3270 *session) |
161 | 161 | |
162 | 162 | } |
163 | 163 | |
164 | -void update_selection(H3270 *session) | |
165 | -{ | |
166 | - if(lib3270_get_toggle(session,LIB3270_TOGGLE_RECTANGLE_SELECT)) | |
167 | - update_selected_rectangle(session); | |
168 | - else | |
169 | - update_selected_region(session); | |
170 | -} | |
171 | - | |
172 | -static void set_selected(H3270 *session) | |
173 | -{ | |
174 | - if(session->selected) | |
175 | - return; | |
176 | - | |
177 | - session->selected = 1; | |
178 | - session->set_selection(session,1); | |
179 | -} | |
180 | - | |
181 | 164 | void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt) |
182 | 165 | { |
183 | 166 | if(!session->selected) |
... | ... | @@ -195,42 +178,86 @@ LIB3270_ACTION(unselect) |
195 | 178 | |
196 | 179 | CHECK_SESSION_HANDLE(hSession); |
197 | 180 | |
198 | - if(!hSession->selected) | |
199 | - return 0; | |
200 | - | |
201 | - hSession->selected = 0; | |
202 | - | |
203 | - for(a = 0; a < hSession->rows*hSession->cols; a++) | |
181 | + if(hSession->selected) | |
204 | 182 | { |
205 | - if(hSession->text[a].attr & LIB3270_ATTR_SELECTED) | |
183 | + hSession->selected = 0; | |
184 | + | |
185 | + for(a = 0; a < hSession->rows*hSession->cols; a++) | |
206 | 186 | { |
207 | - hSession->text[a].attr &= ~LIB3270_ATTR_SELECTED; | |
208 | - if(hSession->update) | |
209 | - hSession->update(hSession,a,hSession->text[a].chr,hSession->text[a].attr,a == hSession->cursor_addr); | |
187 | + if(hSession->text[a].attr & LIB3270_ATTR_SELECTED) | |
188 | + { | |
189 | + hSession->text[a].attr &= ~LIB3270_ATTR_SELECTED; | |
190 | + if(hSession->update) | |
191 | + hSession->update(hSession,a,hSession->text[a].chr,hSession->text[a].attr,a == hSession->cursor_addr); | |
192 | + } | |
210 | 193 | } |
211 | - } | |
212 | 194 | |
213 | - hSession->set_selection(hSession,0); | |
195 | + hSession->set_selection(hSession,0); | |
196 | + hSession->update_selection(hSession,-1,-1); | |
197 | + } | |
214 | 198 | |
215 | 199 | return 0; |
216 | 200 | } |
217 | 201 | |
218 | 202 | LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) |
219 | 203 | { |
204 | + int start, end; | |
205 | + | |
220 | 206 | CHECK_SESSION_HANDLE(session); |
221 | 207 | |
222 | 208 | if(!lib3270_connected(session)) |
223 | 209 | return; |
224 | 210 | |
225 | - if(!session->selected) | |
211 | + start = session->selected ? session->select.start : session->cursor_addr; | |
212 | + | |
213 | + cursor_move(session,end = baddr); | |
214 | + | |
215 | + select_region(session,start,end); | |
216 | + | |
217 | +} | |
218 | + | |
219 | +LIB3270_EXPORT void lib3270_select_region(H3270 *h, int start, int end) | |
220 | +{ | |
221 | + int maxlen; | |
222 | + | |
223 | + CHECK_SESSION_HANDLE(h); | |
224 | + | |
225 | + if(!lib3270_connected(h)) | |
226 | + return; | |
227 | + | |
228 | + maxlen = (h->rows * h->cols); | |
229 | + | |
230 | + // Check bounds | |
231 | + if(start < 0 || start > maxlen || end < 0 || end > maxlen || start > end) | |
232 | + return; | |
233 | + | |
234 | + select_region(h,start,end); | |
235 | + cursor_move(h,h->select.end); | |
236 | + | |
237 | +} | |
238 | + | |
239 | +static void select_region(H3270 *h, int start, int end) | |
240 | +{ | |
241 | + | |
242 | + // Do we really need to change selection? | |
243 | + if(start == h->select.start && end == h->select.end && h->selected) | |
244 | + return; | |
245 | + | |
246 | + h->select.start = start; | |
247 | + h->select.end = end; | |
248 | + | |
249 | + if(lib3270_get_toggle(h,LIB3270_TOGGLE_RECTANGLE_SELECT)) | |
250 | + update_selected_rectangle(h); | |
251 | + else | |
252 | + update_selected_region(h); | |
253 | + | |
254 | + if(!h->selected) | |
226 | 255 | { |
227 | - session->select.begin = session->cursor_addr; | |
228 | - set_selected(session); | |
256 | + h->selected = 1; | |
257 | + h->set_selection(h,1); | |
229 | 258 | } |
230 | 259 | |
231 | - lib3270_set_cursor_address(session,session->select.end = baddr); | |
232 | - | |
233 | - update_selection(session); | |
260 | + h->update_selection(h,start,end); | |
234 | 261 | |
235 | 262 | } |
236 | 263 | |
... | ... | @@ -265,7 +292,7 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba |
265 | 292 | |
266 | 293 | LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr) |
267 | 294 | { |
268 | - int pos, len; | |
295 | + int pos, len, start, end; | |
269 | 296 | |
270 | 297 | CHECK_SESSION_HANDLE(session); |
271 | 298 | |
... | ... | @@ -275,20 +302,20 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr) |
275 | 302 | return; |
276 | 303 | } |
277 | 304 | |
305 | + start = session->select.start; | |
278 | 306 | for(pos = baddr; pos > 0 && !isspace(session->text[pos].chr);pos--); |
279 | - session->select.begin = pos > 0 ? pos+1 : 0; | |
307 | + start = pos > 0 ? pos+1 : 0; | |
280 | 308 | |
281 | 309 | len = session->rows * session->cols; |
282 | 310 | for(pos = baddr; pos < len && !isspace(session->text[pos].chr);pos++); |
283 | - session->select.end = pos < len ? pos-1 : len; | |
311 | + end = pos < len ? pos-1 : len; | |
284 | 312 | |
285 | - set_selected(session); | |
286 | - update_selected_region(session); | |
313 | + select_region(session,start,end); | |
287 | 314 | } |
288 | 315 | |
289 | 316 | LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr) |
290 | 317 | { |
291 | - int start,len; | |
318 | + int start, end,len; | |
292 | 319 | |
293 | 320 | CHECK_SESSION_HANDLE(session); |
294 | 321 | |
... | ... | @@ -306,16 +333,14 @@ LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr) |
306 | 333 | return -1; |
307 | 334 | } |
308 | 335 | |
309 | - session->select.begin = (start+1); | |
336 | + start++; | |
310 | 337 | |
311 | 338 | len = (session->rows * session->cols)-1; |
339 | + end = start + lib3270_field_length(session,start); | |
340 | + if(end > len) | |
341 | + end = len; | |
312 | 342 | |
313 | - session->select.end = start + lib3270_field_length(session,start); | |
314 | - if(session->select.end > len) | |
315 | - session->select.end = len; | |
316 | - | |
317 | - set_selected(session); | |
318 | - update_selected_region(session); | |
343 | + select_region(session,start,end); | |
319 | 344 | |
320 | 345 | return 0; |
321 | 346 | } |
... | ... | @@ -332,9 +357,11 @@ LIB3270_ACTION( selectall ) |
332 | 357 | int len, baddr; |
333 | 358 | |
334 | 359 | CHECK_SESSION_HANDLE(hSession); |
360 | + | |
361 | + select_region(hSession,0,hSession->rows*hSession->cols); | |
362 | +/* | |
335 | 363 | len = hSession->rows*hSession->cols; |
336 | 364 | |
337 | - // First remove unselected areas | |
338 | 365 | for(baddr = 0; baddr < len; baddr++) |
339 | 366 | { |
340 | 367 | if(!(hSession->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
... | ... | @@ -345,19 +372,20 @@ LIB3270_ACTION( selectall ) |
345 | 372 | } |
346 | 373 | |
347 | 374 | set_selected(hSession); |
348 | - | |
375 | +*/ | |
349 | 376 | return 0; |
350 | 377 | } |
351 | 378 | |
352 | 379 | LIB3270_ACTION( reselect ) |
353 | 380 | { |
381 | + int start, end; | |
382 | + | |
354 | 383 | CHECK_SESSION_HANDLE(hSession); |
355 | 384 | |
356 | - if(!lib3270_connected(hSession) || hSession->select.begin == hSession->select.end || hSession->selected) | |
385 | + if(!lib3270_connected(hSession) || hSession->select.start == hSession->select.end || hSession->selected) | |
357 | 386 | return 0; |
358 | 387 | |
359 | - update_selection(hSession); | |
360 | - set_selected(hSession); | |
388 | + select_region(hSession, hSession->select.start,hSession->select.end); | |
361 | 389 | |
362 | 390 | return 0; |
363 | 391 | } |
... | ... | @@ -463,7 +491,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) |
463 | 491 | buffer = malloc(len+1); |
464 | 492 | ptr = buffer; |
465 | 493 | |
466 | - trace("len=%d buffer=%p",len,buffer); | |
494 | +// trace("len=%d buffer=%p",len,buffer); | |
467 | 495 | |
468 | 496 | while(len > 0) |
469 | 497 | { |
... | ... | @@ -484,7 +512,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) |
484 | 512 | len--; |
485 | 513 | } |
486 | 514 | } |
487 | - trace("len=%d buffer=%p pos=%d",len,buffer,ptr-buffer); | |
515 | +// trace("len=%d buffer=%p pos=%d",len,buffer,ptr-buffer); | |
488 | 516 | |
489 | 517 | *ptr = 0; |
490 | 518 | |
... | ... | @@ -493,7 +521,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) |
493 | 521 | |
494 | 522 | LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) |
495 | 523 | { |
496 | - if(!hSession->selected || hSession->select.begin == hSession->select.end) | |
524 | + if(!hSession->selected || hSession->select.start == hSession->select.end) | |
497 | 525 | return NULL; |
498 | 526 | |
499 | 527 | if(!lib3270_connected(hSession)) |
... | ... | @@ -509,18 +537,18 @@ LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int |
509 | 537 | |
510 | 538 | CHECK_SESSION_HANDLE(hSession); |
511 | 539 | |
512 | - if(!hSession->selected || hSession->select.begin == hSession->select.end) | |
540 | + if(!hSession->selected || hSession->select.start == hSession->select.end) | |
513 | 541 | return 0; |
514 | 542 | |
515 | - if(hSession->select.end > hSession->select.begin) | |
543 | + if(hSession->select.end > hSession->select.start) | |
516 | 544 | { |
517 | - first = hSession->select.begin; | |
545 | + first = hSession->select.start; | |
518 | 546 | last = hSession->select.end; |
519 | 547 | } |
520 | 548 | else |
521 | 549 | { |
522 | 550 | first = hSession->select.end; |
523 | - last = hSession->select.begin; | |
551 | + last = hSession->select.start; | |
524 | 552 | } |
525 | 553 | |
526 | 554 | if(start) |
... | ... | @@ -535,7 +563,7 @@ LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int |
535 | 563 | LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) |
536 | 564 | { |
537 | 565 | int pos[2]; |
538 | - int rows, cols, f, step; | |
566 | + int rows, cols, f, step, start, end; | |
539 | 567 | |
540 | 568 | if(!lib3270_get_selection_bounds(hSession,&pos[0],&pos[1])) |
541 | 569 | return from; |
... | ... | @@ -561,13 +589,10 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) |
561 | 589 | cols = hSession->cols - ((pos[f] % hSession->cols)+1); |
562 | 590 | } |
563 | 591 | |
564 | - step = (rows * hSession->cols) + cols; | |
592 | + step = (rows * hSession->cols) + cols; | |
565 | 593 | |
566 | - hSession->select.begin += step; | |
567 | - hSession->select.end += step; | |
568 | - | |
569 | - update_selection(hSession); | |
570 | - lib3270_set_cursor_address(hSession,hSession->select.end); | |
594 | + select_region(hSession,hSession->select.start + step,hSession->select.end + step); | |
595 | + cursor_move(hSession,hSession->select.end); | |
571 | 596 | |
572 | 597 | return from+step; |
573 | 598 | } |
... | ... | @@ -601,19 +626,12 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig |
601 | 626 | if(flag & SELECTION_BOTTOM) // Update bottom margin |
602 | 627 | origin = last = (row*h->cols) + (last%h->cols); |
603 | 628 | |
604 | - if(h->select.begin < h->select.end) | |
605 | - { | |
606 | - h->select.begin = first; | |
607 | - h->select.end = last; | |
608 | - } | |
629 | + if(first < last) | |
630 | + select_region(h,first,last); | |
609 | 631 | else |
610 | - { | |
611 | - h->select.begin = last; | |
612 | - h->select.end = first; | |
613 | - } | |
632 | + select_region(h,last,first); | |
614 | 633 | |
615 | - update_selection(h); | |
616 | - lib3270_set_cursor_address(h,h->select.end); | |
634 | + cursor_move(h,h->select.end); | |
617 | 635 | |
618 | 636 | return origin; |
619 | 637 | } |
... | ... | @@ -621,45 +639,50 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig |
621 | 639 | |
622 | 640 | LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir) |
623 | 641 | { |
624 | - if(!hSession->selected || hSession->select.begin == hSession->select.end) | |
642 | + int start, end; | |
643 | + | |
644 | + if(!hSession->selected || hSession->select.start == hSession->select.end) | |
625 | 645 | return ENOENT; |
626 | 646 | |
647 | + start = hSession->select.start; | |
648 | + end = hSession->select.end; | |
649 | + | |
627 | 650 | switch(dir) |
628 | 651 | { |
629 | 652 | case LIB3270_DIR_UP: |
630 | - if(hSession->select.begin <= hSession->cols) | |
653 | + if(start <= hSession->cols) | |
631 | 654 | return EINVAL; |
632 | - hSession->select.begin -= hSession->cols; | |
633 | - hSession->select.end -= hSession->cols; | |
655 | + start -= hSession->cols; | |
656 | + end -= hSession->cols; | |
634 | 657 | break; |
635 | 658 | |
636 | 659 | case LIB3270_DIR_DOWN: |
637 | - if(hSession->select.end >= (hSession->cols * (hSession->rows-1))) | |
660 | + if(end >= (hSession->cols * (hSession->rows-1))) | |
638 | 661 | return EINVAL; |
639 | - hSession->select.begin += hSession->cols; | |
640 | - hSession->select.end += hSession->cols; | |
662 | + start += hSession->cols; | |
663 | + end += hSession->cols; | |
641 | 664 | break; |
642 | 665 | |
643 | 666 | case LIB3270_DIR_LEFT: |
644 | - if( (hSession->select.begin % hSession->cols) < 1) | |
667 | + if( (start % hSession->cols) < 1) | |
645 | 668 | return EINVAL; |
646 | - hSession->select.begin--; | |
647 | - hSession->select.end--; | |
669 | + start--; | |
670 | + end--; | |
648 | 671 | break; |
649 | 672 | |
650 | 673 | case LIB3270_DIR_RIGHT: |
651 | - if( (hSession->select.end % hSession->cols) >= (hSession->cols-1)) | |
674 | + if( (end % hSession->cols) >= (hSession->cols-1)) | |
652 | 675 | return EINVAL; |
653 | - hSession->select.begin++; | |
654 | - hSession->select.end++; | |
676 | + start++; | |
677 | + end++; | |
655 | 678 | break; |
656 | 679 | |
657 | 680 | default: |
658 | 681 | return -1; |
659 | 682 | } |
660 | 683 | |
661 | - update_selection(hSession); | |
662 | - lib3270_set_cursor_address(hSession,hSession->select.end); | |
684 | + select_region(hSession,start,end); | |
685 | + cursor_move(hSession,hSession->select.end); | |
663 | 686 | |
664 | 687 | return 0; |
665 | 688 | } |
... | ... | @@ -704,6 +727,6 @@ LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, u |
704 | 727 | if(sel) |
705 | 728 | lib3270_select_to(hSession,cursor_addr); |
706 | 729 | else |
707 | - lib3270_set_cursor_address(hSession,cursor_addr); | |
708 | - | |
730 | + cursor_move(hSession,cursor_addr); | |
709 | 731 | } |
732 | + | ... | ... |