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 | + | ... | ... |