From ab13066f0461eb8d8dd5e48746a2c6b835219f0d Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 2 Jun 2016 16:05:11 -0300 Subject: [PATCH] Passando gerĂȘncia do ponteiro do mouse para a lib3270 --- api.h | 6 +++--- private.h | 1 + resolver.c | 25 ------------------------- screen.c | 18 ++++++++++-------- screenc.h | 8 ++++---- session.c | 3 ++- util.c | 35 +++++++++++++++++++++++++++++++++++ 7 files changed, 55 insertions(+), 41 deletions(-) diff --git a/api.h b/api.h index 201c91c..904877a 100644 --- a/api.h +++ b/api.h @@ -253,9 +253,9 @@ /* Screen processing */ - #define CURSOR_MODE_NORMAL LIB3270_CURSOR_EDITABLE - #define CURSOR_MODE_WAITING LIB3270_CURSOR_WAITING - #define CURSOR_MODE_LOCKED LIB3270_CURSOR_LOCKED +// #define CURSOR_MODE_NORMAL LIB3270_CURSOR_EDITABLE +// #define CURSOR_MODE_WAITING LIB3270_CURSOR_WAITING +// #define CURSOR_MODE_LOCKED LIB3270_CURSOR_LOCKED typedef enum _SCRIPT_STATE { diff --git a/private.h b/private.h index e054479..59bfecf 100644 --- a/private.h +++ b/private.h @@ -382,6 +382,7 @@ struct _h3270 int maxCOLS; unsigned short rows; unsigned short cols; + unsigned short pointer; /**< @brief Current pointer. */ int cursor_addr; int buffer_addr; char flipped; diff --git a/resolver.c b/resolver.c index cf79aee..62f4989 100644 --- a/resolver.c +++ b/resolver.c @@ -180,28 +180,3 @@ static int cresolve_host_and_port(H3270 *h, struct parms *p) return 0; } */ -/* -int resolve_host_and_port(H3270 *hSession, const char *host, char *portname, unsigned short *pport,struct sockaddr *sa, socklen_t *sa_len, char *errmsg, int em_len) -{ - int rc; - LIB3270_MESSAGE saved_status = hSession->oia_status; - struct parms p = { sizeof(struct parms), host, portname, pport, sa, sa_len, errmsg, em_len }; - - trace("Calling resolver for %s status=%d", p.host, (int) saved_status); - - status_changed(hSession,LIB3270_MESSAGE_RESOLVING); - hSession->cursor(hSession,CURSOR_MODE_LOCKED); - - rc = lib3270_call_thread((int (*)(H3270 *, void *)) cresolve_host_and_port,hSession,&p); - - hSession->cursor(hSession,CURSOR_MODE_NORMAL); - - if(saved_status != -1) - status_changed(hSession,saved_status); - - trace("Calling resolver for %s exits with %d", p.host, rc); - - return rc; - -} -*/ diff --git a/screen.c b/screen.c index b359dba..3bb9946 100644 --- a/screen.c +++ b/screen.c @@ -486,9 +486,7 @@ void status_oerr(H3270 *session, int error_type) void status_connecting(H3270 *session, Boolean on) { - if(session->cbk.cursor) - session->cbk.cursor(session,on ? CURSOR_MODE_LOCKED : CURSOR_MODE_NORMAL); - + mcursor_set(session,on ? LIB3270_POINTER_LOCKED : LIB3270_POINTER_UNLOCKED); status_changed(session, on ? LIB3270_MESSAGE_CONNECTING : LIB3270_MESSAGE_NONE); } @@ -506,8 +504,7 @@ void status_reset(H3270 *session) } else { - if(session->cbk.cursor) - session->cbk.cursor(session,CURSOR_MODE_NORMAL); + mcursor_set(session,LIB3270_POINTER_UNLOCKED); status_changed(session,LIB3270_MESSAGE_NONE); } @@ -736,12 +733,17 @@ void popup_system_error(H3270 *session, const char *title, const char *message, va_end(args); } -void mcursor_set(H3270 *session,LIB3270_CURSOR m) +void mcursor_set(H3270 *session,LIB3270_POINTER m) { CHECK_SESSION_HANDLE(session); - if(session->cbk.cursor) - session->cbk.cursor(session,m); + if(session->pointer != ((unsigned short) m)) { + + // Pointer changed + session->pointer = (unsigned short) m; + session->cbk.cursor(session,m & 0x03); + + } } LIB3270_ACTION( testpattern ) diff --git a/screenc.h b/screenc.h index c0be19a..953356e 100644 --- a/screenc.h +++ b/screenc.h @@ -42,11 +42,11 @@ LIB3270_INTERNAL int screen_init(H3270 *session); // LIB3270_INTERNAL Boolean screen_new_display_charsets(char *cslist, char *csname); -LIB3270_INTERNAL void mcursor_set(H3270 *session,LIB3270_CURSOR m); +LIB3270_INTERNAL void mcursor_set(H3270 *session,LIB3270_POINTER m); -#define mcursor_locked(x) mcursor_set(x,CURSOR_MODE_LOCKED) -#define mcursor_normal(x) mcursor_set(x,CURSOR_MODE_NORMAL) -#define mcursor_waiting(x) mcursor_set(x,CURSOR_MODE_WAITING) +#define mcursor_locked(x) mcursor_set(x,LIB3270_POINTER_LOCKED) +#define mcursor_normal(x) mcursor_set(x,LIB3270_POINTER_UNLOCKED) +#define mcursor_waiting(x) mcursor_set(x,LIB3270_POINTER_WAITING) LIB3270_INTERNAL void notify_toggle_changed(H3270 *session, LIB3270_TOGGLE ix, unsigned char value, LIB3270_TOGGLE_TYPE reason); LIB3270_INTERNAL void set_viewsize(H3270 *session, int rows, int cols); diff --git a/session.c b/session.c index b646e67..f1ecba3 100644 --- a/session.c +++ b/session.c @@ -140,7 +140,7 @@ static void update_selection(H3270 *session, int start, int end) { } -static void set_cursor(H3270 *session, LIB3270_CURSOR id) +static void set_cursor(H3270 *session, LIB3270_POINTER id) { } @@ -241,6 +241,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char hSession->colors = 16; hSession->m3279 = 1; hSession->unlock_delay_ms = 350; // 0.35s after last unlock + hSession->pointer = (unsigned short) LIB3270_POINTER_LOCKED; // CSD for(f=0;f<4;f++) diff --git a/util.c b/util.c index 1703899..2acdfb0 100644 --- a/util.c +++ b/util.c @@ -75,6 +75,7 @@ #include "utilc.h" #include "popupsc.h" #include "api.h" +#include #define my_isspace(c) isspace((unsigned char)c) @@ -1013,3 +1014,37 @@ int gettimeofday(struct timeval *tv, void *ignored) } + LIB3270_EXPORT LIB3270_POINTER lib3270_get_pointer(H3270 *hSession, int baddr) + { + static const struct _ptr { + unsigned short id; + LIB3270_POINTER value; + } ptr[] = { + { 0x80, LIB3270_POINTER_MOVE_SELECTION }, + { 0x82, LIB3270_POINTER_SELECTION_TOP }, + { 0x86, LIB3270_POINTER_SELECTION_TOP_RIGHT }, + { 0x84, LIB3270_POINTER_SELECTION_RIGHT }, + { 0x81, LIB3270_POINTER_SELECTION_LEFT }, + { 0x89, LIB3270_POINTER_SELECTION_BOTTOM_LEFT }, + { 0x88, LIB3270_POINTER_SELECTION_BOTTOM }, + { 0x8c, LIB3270_POINTER_SELECTION_BOTTOM_RIGHT }, + { 0x83, LIB3270_POINTER_SELECTION_TOP_LEFT } + }; + + int f; + unsigned short id = lib3270_get_selection_flags(hSession,baddr) & 0x8f; + + if(!lib3270_connected(hSession) || baddr < 0) + return LIB3270_POINTER_LOCKED; + + for(f = 0; f < (sizeof(ptr)/sizeof(ptr[0]));f++) + { + if(ptr[f].id == id) + { + return ptr[f].value; + } + } + + return hSession->pointer; + + } -- libgit2 0.21.2