From 279ad7c7b7969135e02ecd1577528b6e581c6436 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 18 Jan 2019 15:36:03 -0200 Subject: [PATCH] Fixing bug on cursor movement reported by user --- lib3270.cbp | 3 --- src/lib3270/kybd.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/lib3270/screen.c | 3 +++ src/lib3270/selection.c | 77 ----------------------------------------------------------------------------- 4 files changed, 98 insertions(+), 81 deletions(-) diff --git a/lib3270.cbp b/lib3270.cbp index 0d78c40..207e763 100644 --- a/lib3270.cbp +++ b/lib3270.cbp @@ -161,9 +161,6 @@ - - diff --git a/src/lib3270/kybd.c b/src/lib3270/kybd.c index d3112e2..c444779 100644 --- a/src/lib3270/kybd.c +++ b/src/lib3270/kybd.c @@ -42,6 +42,7 @@ struct ta; #include "private.h" #include +#include #ifndef ANDROID #include @@ -1758,6 +1759,97 @@ LIB3270_EXPORT int lib3270_nextword(H3270 *hSession) } /** + * @brief Move cursor. + * + * @param hSession Session handle. + * @param dir Where to move. + * @param sel Non zero if it's selecting. + * + */ +LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, unsigned char sel) +{ + FAIL_IF_NOT_ONLINE(hSession); + + int cursor_addr = hSession->cursor_addr; + int maxlen = hSession->cols * hSession->rows; + + switch(dir) + { + case LIB3270_DIR_UP: + + if(sel && cursor_addr <= hSession->cols) + return errno = EINVAL; + + cursor_addr -= hSession->cols; + break; + + case LIB3270_DIR_DOWN: + + if(sel && cursor_addr >= (hSession->cols * (hSession->rows-1))) + return errno = EINVAL; + + cursor_addr += hSession->cols; + break; + + case LIB3270_DIR_LEFT: + + if(sel && (cursor_addr % hSession->cols) < 1) + return errno = EINVAL; + + cursor_addr--; + break; + + case LIB3270_DIR_RIGHT: + + if(sel && (cursor_addr % hSession->cols) >= (hSession->cols-1)) + return errno = EINVAL; + + cursor_addr++; + break; + + case LIB3270_DIR_END: + + cursor_addr = lib3270_get_field_end(hSession,cursor_addr); + if(cursor_addr == -1) + return errno = EINVAL; + break; + + default: + errno = EINVAL; + return -1; + } + + if(sel) + { + lib3270_select_to(hSession,cursor_addr); + } + else + { + + if(cursor_addr >= maxlen) + { + cursor_move(hSession,cursor_addr % maxlen); + } + else if(cursor_addr < 0) + { + cursor_move(hSession,cursor_addr + maxlen); + } + else + { + cursor_move(hSession,cursor_addr); + } + + if(hSession->kybdlock && (KYBDLOCK_IS_OERR(hSession))) + { + status_reset(hSession); + } + + } + + return 0; +} + +/** * @brief Cursor up 1 position. */ LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) @@ -1766,6 +1858,7 @@ LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) FAIL_IF_NOT_ONLINE(hSession); + trace("kybdlock=%d OERR=%s",(int) hSession->kybdlock, (KYBDLOCK_IS_OERR(hSession) ? "yes" : "no")); if (hSession->kybdlock) { if (KYBDLOCK_IS_OERR(hSession)) @@ -1776,16 +1869,17 @@ LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) else { ENQUEUE_ACTION(lib3270_cursor_up); -// enq_ta(Up_action, CN, CN); return 0; } } + #if defined(X3270_ANSI) /*[*/ if (IN_ANSI) { ansi_send_up(hSession); return 0; } #endif /*]*/ + baddr = hSession->cursor_addr - hSession->cols; if (baddr < 0) baddr = (hSession->cursor_addr + (hSession->rows * hSession->cols)) - hSession->cols; diff --git a/src/lib3270/screen.c b/src/lib3270/screen.c index bca1855..1b41089 100644 --- a/src/lib3270/screen.c +++ b/src/lib3270/screen.c @@ -568,14 +568,17 @@ void status_reset(H3270 *session) if (session->kybdlock & KL_ENTER_INHIBIT) { + trace("%s",__FUNCTION__); status_changed(session,LIB3270_MESSAGE_INHIBIT); } else if (session->kybdlock & KL_DEFERRED_UNLOCK) { + trace("%s",__FUNCTION__); status_changed(session,LIB3270_MESSAGE_X); } else { + trace("%s",__FUNCTION__); mcursor_set(session,LIB3270_POINTER_UNLOCKED); status_changed(session,LIB3270_MESSAGE_NONE); } diff --git a/src/lib3270/selection.c b/src/lib3270/selection.c index ae0ca43..42c417e 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -908,80 +908,3 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir return 0; } -LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, unsigned char sel) -{ - int cursor_addr = hSession->cursor_addr; - int maxlen = hSession->cols * hSession->rows; - - if(!lib3270_connected(hSession)) - { - errno = ENOTCONN; - return -1; - } - - switch(dir) - { - case LIB3270_DIR_UP: - - if(sel && cursor_addr <= hSession->cols) - return errno = EINVAL; - - cursor_addr -= hSession->cols; - break; - - case LIB3270_DIR_DOWN: - - if(sel && cursor_addr >= (hSession->cols * (hSession->rows-1))) - return errno = EINVAL; - - cursor_addr += hSession->cols; - break; - - case LIB3270_DIR_LEFT: - - if(sel && (cursor_addr % hSession->cols) < 1) - return errno = EINVAL; - - cursor_addr--; - break; - - case LIB3270_DIR_RIGHT: - - if(sel && (cursor_addr % hSession->cols) >= (hSession->cols-1)) - return errno = EINVAL; - - cursor_addr++; - break; - - case LIB3270_DIR_END: - - cursor_addr = lib3270_get_field_end(hSession,cursor_addr); - if(cursor_addr == -1) - return errno = EINVAL; - break; - - default: - errno = EINVAL; - return -1; - } - - if(sel) - { - lib3270_select_to(hSession,cursor_addr); - } - else if(cursor_addr >= maxlen) - { - cursor_move(hSession,cursor_addr % maxlen); - } - else if(cursor_addr < 0) - { - cursor_move(hSession,cursor_addr + maxlen); - } - else - { - cursor_move(hSession,cursor_addr); - } - - return 0; -} - -- libgit2 0.21.2