Commit 3dbcb212ef7504b32ef2ba70d4844c58f00f2e76

Authored by perry.werneck@gmail.com
1 parent ae35e78f

Implementando mais métodos de teclado pela estrutura de sessão

Showing 1 changed file with 95 additions and 81 deletions   Show diff stats
src/lib3270/kybd.c
... ... @@ -303,7 +303,7 @@ static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char
303 303 }
304 304 hSession->ta_tail = ta;
305 305  
306   - trace_event(" action queued (kybdlock 0x%x)\n", h3270.kybdlock);
  306 + trace_event(" action queued (kybdlock 0x%x)\n", hSession->kybdlock);
307 307 }
308 308  
309 309 /*
... ... @@ -473,18 +473,18 @@ void kybd_in3270(H3270 *session, int in3270 unused, void *dunno)
473 473 /*
474 474 * Lock the keyboard because of an operator error.
475 475 */
476   -static void operator_error(int error_type)
  476 +static void operator_error(H3270 *hSession, int error_type)
477 477 {
478   - if(h3270.oerr_lock)
  478 + if(hSession->oerr_lock)
479 479 {
480   - status_oerr(NULL,error_type);
481   - mcursor_locked(&h3270);
482   - kybdlock_set(&h3270,(unsigned int)error_type);
483   - flush_ta(&h3270);
  480 + status_oerr(hSession,error_type);
  481 + mcursor_locked(hSession);
  482 + kybdlock_set(hSession,(unsigned int)error_type);
  483 + flush_ta(hSession);
484 484 }
485 485 else
486 486 {
487   - lib3270_ring_bell(NULL);
  487 + lib3270_ring_bell(hSession);
488 488 }
489 489 }
490 490  
... ... @@ -493,7 +493,7 @@ static void operator_error(int error_type)
493 493 * Handle an AID (Attention IDentifier) key. This is the common stuff that
494 494 * gets executed for all AID keys (PFs, PAs, Clear and etc).
495 495 */
496   -static void key_AID(H3270 *session, unsigned char aid_code)
  496 +static void key_AID(H3270 *hSession, unsigned char aid_code)
497 497 {
498 498 #if defined(X3270_ANSI) /*[*/
499 499 if (IN_ANSI) {
... ... @@ -523,33 +523,37 @@ static void key_AID(H3270 *session, unsigned char aid_code)
523 523 plugin_aid(aid_code);
524 524 #endif /*]*/
525 525  
526   - trace("IN_SSCP: %d cursor_addr: %d",IN_SSCP,h3270.cursor_addr);
  526 + trace("IN_SSCP: %d cursor_addr: %d",IN_SSCP,hSession->cursor_addr);
527 527  
528   - if (IN_SSCP) {
529   - if (h3270.kybdlock & KL_OIA_MINUS)
  528 + if (IN_SSCP)
  529 + {
  530 + if (hSession->kybdlock & KL_OIA_MINUS)
530 531 return;
531   - if (aid_code != AID_ENTER && aid_code != AID_CLEAR) {
532   - status_changed(&h3270,LIB3270_STATUS_MINUS);
533   - kybdlock_set(&h3270,KL_OIA_MINUS);
  532 + if (aid_code != AID_ENTER && aid_code != AID_CLEAR)
  533 + {
  534 + status_changed(hSession,LIB3270_STATUS_MINUS);
  535 + kybdlock_set(hSession,KL_OIA_MINUS);
534 536 return;
535 537 }
536 538 }
  539 +
537 540 if (IN_SSCP && aid_code == AID_ENTER)
538 541 {
539 542 /* Act as if the host had written our input. */
540   - h3270.buffer_addr = h3270.cursor_addr;
  543 + hSession->buffer_addr = hSession->cursor_addr;
541 544 }
  545 +
542 546 if (!IN_SSCP || aid_code != AID_CLEAR)
543 547 {
544   - status_twait(&h3270);
545   - mcursor_waiting(&h3270);
546   - lib3270_set_toggle(&h3270,LIB3270_TOGGLE_INSERT,0);
547   - kybdlock_set(&h3270,KL_OIA_TWAIT | KL_OIA_LOCKED);
548   - }
549   - h3270.aid = aid_code;
550   - ctlr_read_modified(h3270.aid, False);
551   - ticking_start(&h3270,False);
552   - status_ctlr_done(&h3270);
  548 + status_twait(hSession);
  549 + mcursor_waiting(hSession);
  550 + lib3270_set_toggle(hSession,LIB3270_TOGGLE_INSERT,0);
  551 + kybdlock_set(hSession,KL_OIA_TWAIT | KL_OIA_LOCKED);
  552 + }
  553 + hSession->aid = aid_code;
  554 + ctlr_read_modified(hSession->aid, False);
  555 + ticking_start(hSession,False);
  556 + status_ctlr_done(hSession);
553 557 }
554 558  
555 559 LIB3270_FKEY_ACTION( pfkey )
... ... @@ -656,7 +660,7 @@ static Boolean ins_prep(int faddr, int baddr, int count)
656 660 printf("need %d at %d, tb_start at %d\n", count, baddr, tb_start);
657 661 #endif /*]*/
658 662 if (need - ntb > 0) {
659   - operator_error(KL_OERR_OVERFLOW);
  663 + operator_error(&h3270,KL_OERR_OVERFLOW);
660 664 return False;
661 665 }
662 666  
... ... @@ -761,19 +765,19 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, Boolean
761 765 faddr = find_field_attribute(&h3270,baddr);
762 766 fa = get_field_attribute(&h3270,baddr);
763 767 if (h3270.ea_buf[baddr].fa || FA_IS_PROTECTED(fa)) {
764   - operator_error(KL_OERR_PROTECTED);
  768 + operator_error(&h3270,KL_OERR_PROTECTED);
765 769 return False;
766 770 }
767 771 if (h3270.numeric_lock && FA_IS_NUMERIC(fa) &&
768 772 !((code >= EBC_0 && code <= EBC_9) ||
769 773 code == EBC_minus || code == EBC_period)) {
770   - operator_error(KL_OERR_NUMERIC);
  774 + operator_error(&h3270,KL_OERR_NUMERIC);
771 775 return False;
772 776 }
773 777  
774 778 /* Can't put an SBCS in a DBCS field. */
775 779 if (h3270.ea_buf[faddr].cs == CS_DBCS) {
776   - operator_error(KL_OERR_DBCS);
  780 + operator_error(&h3270,KL_OERR_DBCS);
777 781 return False;
778 782 }
779 783  
... ... @@ -781,7 +785,7 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, Boolean
781 785 if (h3270.ea_buf[baddr].cc == EBC_si) {
782 786 INC_BA(baddr);
783 787 if (baddr == faddr) {
784   - operator_error(KL_OERR_OVERFLOW);
  788 + operator_error(&h3270,KL_OERR_OVERFLOW);
785 789 return False;
786 790 }
787 791 }
... ... @@ -1199,18 +1203,17 @@ LIB3270_ACTION( firstfield )
1199 1203 /*
1200 1204 * Cursor left 1 position.
1201 1205 */
1202   -static void
1203   -do_left(void)
  1206 +static void do_left(H3270 *hSession)
1204 1207 {
1205 1208 register int baddr;
1206 1209 enum dbcs_state d;
1207 1210  
1208   - baddr = h3270.cursor_addr;
  1211 + baddr = hSession->cursor_addr;
1209 1212 DEC_BA(baddr);
1210 1213 d = ctlr_dbcs_state(baddr);
1211 1214 if (IS_LEFT(d))
1212 1215 DEC_BA(baddr);
1213   - cursor_move(&h3270,baddr);
  1216 + cursor_move(hSession,baddr);
1214 1217 }
1215 1218  
1216 1219 LIB3270_CURSOR_ACTION( left )
... ... @@ -1220,7 +1223,7 @@ LIB3270_CURSOR_ACTION( left )
1220 1223 if(KYBDLOCK_IS_OERR(hSession))
1221 1224 {
1222 1225 lib3270_kybdlock_clear(hSession,KL_OERR_MASK);
1223   - status_reset(&h3270);
  1226 + status_reset(hSession);
1224 1227 }
1225 1228 else
1226 1229 {
... ... @@ -1238,7 +1241,7 @@ LIB3270_CURSOR_ACTION( left )
1238 1241  
1239 1242 if (!hSession->flipped)
1240 1243 {
1241   - do_left();
  1244 + do_left(hSession);
1242 1245 }
1243 1246 else
1244 1247 {
... ... @@ -1271,7 +1274,7 @@ do_delete(void)
1271 1274 /* Can't delete a field attribute. */
1272 1275 fa = get_field_attribute(&h3270,baddr);
1273 1276 if (FA_IS_PROTECTED(fa) || h3270.ea_buf[baddr].fa) {
1274   - operator_error(KL_OERR_PROTECTED);
  1277 + operator_error(&h3270,KL_OERR_PROTECTED);
1275 1278 return False;
1276 1279 }
1277 1280 if (h3270.ea_buf[baddr].cc == EBC_so || h3270.ea_buf[baddr].cc == EBC_si) {
... ... @@ -1284,7 +1287,7 @@ do_delete(void)
1284 1287 if (h3270.ea_buf[xaddr].cc == SOSI(h3270.ea_buf[baddr].cc)) {
1285 1288 ndel = 2;
1286 1289 } else {
1287   - operator_error(KL_OERR_PROTECTED);
  1290 + operator_error(&h3270,KL_OERR_PROTECTED);
1288 1291 return False;
1289 1292 }
1290 1293 } else if (IS_DBCS(h3270.ea_buf[baddr].db)) {
... ... @@ -1380,7 +1383,7 @@ LIB3270_ACTION( backspace )
1380 1383 if (hSession->reverse)
1381 1384 (void) do_delete();
1382 1385 else if (!hSession->flipped)
1383   - do_left();
  1386 + do_left(hSession);
1384 1387 else {
1385 1388 register int baddr;
1386 1389  
... ... @@ -1396,29 +1399,32 @@ LIB3270_ACTION( backspace )
1396 1399 /*
1397 1400 * Destructive backspace, like Unix "erase".
1398 1401 */
1399   -static void
1400   -do_erase(void)
  1402 +static void do_erase(H3270 *hSession)
1401 1403 {
1402 1404 int baddr, faddr;
1403 1405 enum dbcs_state d;
1404 1406  
1405   - baddr = h3270.cursor_addr;
1406   - faddr = find_field_attribute(&h3270,baddr);
1407   - if (faddr == baddr || FA_IS_PROTECTED(h3270.ea_buf[baddr].fa)) {
1408   - operator_error(KL_OERR_PROTECTED);
  1407 + baddr = hSession->cursor_addr;
  1408 + faddr = find_field_attribute(hSession,baddr);
  1409 + if (faddr == baddr || FA_IS_PROTECTED(hSession->ea_buf[baddr].fa))
  1410 + {
  1411 + operator_error(hSession,KL_OERR_PROTECTED);
1409 1412 return;
1410 1413 }
  1414 +
1411 1415 if (baddr && faddr == baddr - 1)
1412 1416 return;
1413   - do_left();
  1417 +
  1418 + do_left(hSession);
1414 1419  
1415 1420 /*
1416 1421 * If we are now on an SI, move left again.
1417 1422 */
1418   - if (h3270.ea_buf[h3270.cursor_addr].cc == EBC_si) {
1419   - baddr = h3270.cursor_addr;
  1423 + if (hSession->ea_buf[hSession->cursor_addr].cc == EBC_si)
  1424 + {
  1425 + baddr = hSession->cursor_addr;
1420 1426 DEC_BA(baddr);
1421   - cursor_move(&h3270,baddr);
  1427 + cursor_move(hSession,baddr);
1422 1428 }
1423 1429  
1424 1430 /*
... ... @@ -1427,11 +1433,12 @@ do_erase(void)
1427 1433 * This ensures that if this is the end of a DBCS subfield, we will
1428 1434 * land on the SI, instead of on the character following.
1429 1435 */
1430   - d = ctlr_dbcs_state(h3270.cursor_addr);
1431   - if (IS_RIGHT(d)) {
1432   - baddr = h3270.cursor_addr;
  1436 + d = ctlr_dbcs_state(hSession->cursor_addr);
  1437 + if (IS_RIGHT(d))
  1438 + {
  1439 + baddr = hSession->cursor_addr;
1433 1440 DEC_BA(baddr);
1434   - cursor_move(&h3270,baddr);
  1441 + cursor_move(hSession,baddr);
1435 1442 }
1436 1443  
1437 1444 /*
... ... @@ -1444,29 +1451,32 @@ do_erase(void)
1444 1451 * If we've just erased the last character of a DBCS subfield, erase
1445 1452 * the SO/SI pair as well.
1446 1453 */
1447   - baddr = h3270.cursor_addr;
  1454 + baddr = hSession->cursor_addr;
1448 1455 DEC_BA(baddr);
1449   - if (h3270.ea_buf[baddr].cc == EBC_so && h3270.ea_buf[h3270.cursor_addr].cc == EBC_si) {
1450   - cursor_move(&h3270,baddr);
  1456 + if (hSession->ea_buf[baddr].cc == EBC_so && hSession->ea_buf[hSession->cursor_addr].cc == EBC_si)
  1457 + {
  1458 + cursor_move(hSession,baddr);
1451 1459 (void) do_delete();
1452 1460 }
1453   - h3270.display(&h3270);
  1461 + hSession->display(hSession);
1454 1462 }
1455 1463  
1456 1464 LIB3270_ACTION( erase )
1457 1465 {
1458 1466 // reset_idle_timer();
1459   - if (hSession->kybdlock) {
  1467 + if (hSession->kybdlock)
  1468 + {
1460 1469 ENQUEUE_ACTION(lib3270_erase);
1461 1470 return 0;
1462 1471 }
1463 1472 #if defined(X3270_ANSI) /*[*/
1464   - if (IN_ANSI) {
  1473 + if (IN_ANSI)
  1474 + {
1465 1475 net_send_erase();
1466 1476 return 0;
1467 1477 }
1468 1478 #endif /*]*/
1469   - do_erase();
  1479 + do_erase(hSession);
1470 1480 return 0;
1471 1481 }
1472 1482  
... ... @@ -1508,7 +1518,7 @@ LIB3270_CURSOR_ACTION( right )
1508 1518 }
1509 1519 else
1510 1520 {
1511   - do_left();
  1521 + do_left(hSession);
1512 1522 }
1513 1523 return 0;
1514 1524 }
... ... @@ -1943,7 +1953,7 @@ LIB3270_ACTION( eraseeol )
1943 1953 fa = get_field_attribute(&h3270,baddr);
1944 1954 if (FA_IS_PROTECTED(fa) || h3270.ea_buf[baddr].fa)
1945 1955 {
1946   - operator_error(KL_OERR_PROTECTED);
  1956 + operator_error(&h3270,KL_OERR_PROTECTED);
1947 1957 return -1;
1948 1958 }
1949 1959  
... ... @@ -2007,7 +2017,7 @@ LIB3270_ACTION( eraseeof )
2007 2017 baddr = hSession->cursor_addr;
2008 2018 fa = get_field_attribute(hSession,baddr);
2009 2019 if (FA_IS_PROTECTED(fa) || h3270.ea_buf[baddr].fa) {
2010   - operator_error(KL_OERR_PROTECTED);
  2020 + operator_error(&h3270,KL_OERR_PROTECTED);
2011 2021 return -1;
2012 2022 }
2013 2023 if (hSession->formatted) { /* erase to next field attribute */
... ... @@ -2127,7 +2137,7 @@ LIB3270_ACTION( deleteword )
2127 2137  
2128 2138 /* Make sure we're on a modifiable field. */
2129 2139 if (FA_IS_PROTECTED(fa) || hSession->ea_buf[baddr].fa) {
2130   - operator_error(KL_OERR_PROTECTED);
  2140 + operator_error(&h3270,KL_OERR_PROTECTED);
2131 2141 return -1;
2132 2142 }
2133 2143  
... ... @@ -2139,13 +2149,14 @@ LIB3270_ACTION( deleteword )
2139 2149 return 0;
2140 2150 if (hSession->ea_buf[baddr].cc == EBC_null ||
2141 2151 hSession->ea_buf[baddr].cc == EBC_space)
2142   - do_erase();
  2152 + do_erase(hSession);
2143 2153 else
2144 2154 break;
2145 2155 }
2146 2156  
2147 2157 /* Backspace until the character to the left of the cursor is blank. */
2148   - for (;;) {
  2158 + for (;;)
  2159 + {
2149 2160 baddr = hSession->cursor_addr;
2150 2161 DEC_BA(baddr);
2151 2162 if (hSession->ea_buf[baddr].fa)
... ... @@ -2154,7 +2165,7 @@ LIB3270_ACTION( deleteword )
2154 2165 hSession->ea_buf[baddr].cc == EBC_space)
2155 2166 break;
2156 2167 else
2157   - do_erase();
  2168 + do_erase(hSession);
2158 2169 }
2159 2170 hSession->display(hSession);
2160 2171 return 0;
... ... @@ -2192,7 +2203,7 @@ LIB3270_ACTION( deletefield )
2192 2203 baddr = hSession->cursor_addr;
2193 2204 fa = get_field_attribute(hSession,baddr);
2194 2205 if (FA_IS_PROTECTED(fa) || hSession->ea_buf[baddr].fa) {
2195   - operator_error(KL_OERR_PROTECTED);
  2206 + operator_error(hSession,KL_OERR_PROTECTED);
2196 2207 return -1;
2197 2208 }
2198 2209 while (!hSession->ea_buf[baddr].fa)
... ... @@ -2362,31 +2373,34 @@ kybd_scroll_lock(Boolean lock)
2362 2373 * Move the cursor back within the legal paste area.
2363 2374 * Returns a Boolean indicating success.
2364 2375 */
2365   -static Boolean
2366   -remargin(int lmargin)
  2376 +static Boolean remargin(H3270 *hSession, int lmargin)
2367 2377 {
2368 2378 Boolean ever = False;
2369 2379 int baddr, b0 = 0;
2370 2380 int faddr;
2371 2381 unsigned char fa;
2372 2382  
2373   - baddr = h3270.cursor_addr;
2374   - while (BA_TO_COL(baddr) < lmargin) {
  2383 + baddr = hSession->cursor_addr;
  2384 + while (BA_TO_COL(baddr) < lmargin)
  2385 + {
2375 2386 baddr = ROWCOL_TO_BA(BA_TO_ROW(baddr), lmargin);
2376   - if (!ever) {
  2387 + if (!ever)
  2388 + {
2377 2389 b0 = baddr;
2378 2390 ever = True;
2379 2391 }
2380   - faddr = find_field_attribute(&h3270,baddr);
2381   - fa = h3270.ea_buf[faddr].fa;
2382   - if (faddr == baddr || FA_IS_PROTECTED(fa)) {
2383   - baddr = next_unprotected(&h3270,baddr);
  2392 + faddr = find_field_attribute(hSession,baddr);
  2393 + fa = hSession->ea_buf[faddr].fa;
  2394 +
  2395 + if (faddr == baddr || FA_IS_PROTECTED(fa))
  2396 + {
  2397 + baddr = next_unprotected(hSession,baddr);
2384 2398 if (baddr <= b0)
2385 2399 return False;
2386 2400 }
2387 2401 }
2388 2402  
2389   - cursor_move(&h3270,baddr);
  2403 + cursor_move(hSession,baddr);
2390 2404 return True;
2391 2405 }
2392 2406  
... ... @@ -2462,7 +2476,7 @@ LIB3270_EXPORT int lib3270_emulate_input(H3270 *session, char *s, int len, int p
2462 2476 /* Jump cursor over left margin. */
2463 2477 if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_MARGINED_PASTE) &&
2464 2478 BA_TO_COL(session->cursor_addr) < orig_col) {
2465   - if (!remargin(orig_col))
  2479 + if (!remargin(&h3270,orig_col))
2466 2480 return len-1;
2467 2481 skipped = True;
2468 2482 }
... ... @@ -2743,7 +2757,7 @@ LIB3270_EXPORT int lib3270_emulate_input(H3270 *session, char *s, int len, int p
2743 2757 case BASE:
2744 2758 if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_MARGINED_PASTE) &&
2745 2759 BA_TO_COL(session->cursor_addr) < orig_col) {
2746   - (void) remargin(orig_col);
  2760 + (void) remargin(&h3270,orig_col);
2747 2761 }
2748 2762 break;
2749 2763 case OCTAL:
... ... @@ -2752,7 +2766,7 @@ LIB3270_EXPORT int lib3270_emulate_input(H3270 *session, char *s, int len, int p
2752 2766 state = BASE;
2753 2767 if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_MARGINED_PASTE) &&
2754 2768 BA_TO_COL(session->cursor_addr) < orig_col) {
2755   - (void) remargin(orig_col);
  2769 + (void) remargin(&h3270,orig_col);
2756 2770 }
2757 2771 break;
2758 2772 case BACKPF:
... ...