diff --git a/selection.c b/selection.c index e965fb2..3d1fa22 100644 --- a/selection.c +++ b/selection.c @@ -202,14 +202,14 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) if(!lib3270_connected(session)) return; - lib3270_set_cursor_address(session,session->select.end = baddr); - if(!session->selected) { session->select.begin = session->cursor_addr; set_selected(session); } + lib3270_set_cursor_address(session,session->select.end = baddr); + update_selection(session); } @@ -391,3 +391,47 @@ 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; + + if(!lib3270_connected(hSession)) + return -1; + + switch(dir) + { + case LIB3270_DIR_UP: + if(cursor_addr <= hSession->cols) + return EINVAL; + cursor_addr -= hSession->cols; + break; + + case LIB3270_DIR_DOWN: + if(cursor_addr >= (hSession->cols * (hSession->rows-1))) + return EINVAL; + cursor_addr += hSession->cols; + break; + + case LIB3270_DIR_LEFT: + if( (cursor_addr % hSession->cols) < 1) + return EINVAL; + cursor_addr--; + break; + + case LIB3270_DIR_RIGHT: + if( (cursor_addr % hSession->cols) >= (hSession->cols-1)) + return EINVAL; + cursor_addr++; + break; + + default: + return -1; + } + + if(sel) + lib3270_select_to(hSession,cursor_addr); + else + lib3270_set_cursor_address(hSession,cursor_addr); + +} -- libgit2 0.21.2