From e3108b0c42a2923372be7c87ebe9478abe3b045b 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 --- src/include/lib3270.h | 34 +++++++++++++++++++++++++--------- src/include/lib3270/session.h | 2 +- src/lib3270/api.h | 6 +++--- src/lib3270/private.h | 1 + src/lib3270/resolver.c | 25 ------------------------- src/lib3270/screen.c | 18 ++++++++++-------- src/lib3270/screenc.h | 8 ++++---- src/lib3270/session.c | 3 ++- src/lib3270/util.c | 35 +++++++++++++++++++++++++++++++++++ src/pw3270/v3270/mouse.c | 67 ++++++++++--------------------------------------------------------- src/pw3270/v3270/private.h | 7 ++++--- src/pw3270/v3270/widget.c | 10 +++++----- 12 files changed, 100 insertions(+), 116 deletions(-) diff --git a/src/include/lib3270.h b/src/include/lib3270.h index d4cf5a6..380216f 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -204,20 +204,33 @@ /** - * Cursor modes. + * Pointer modes. * - * Cursor modes set by library; an application can us it - * as a hint to change the mouse cursor based on connection status. + * Pointer modes set by library; an application can use it + * as a hint to change the mouse pointer based on connection status. * */ - typedef enum _LIB3270_CURSOR + typedef enum _LIB3270_POINTER { - LIB3270_CURSOR_EDITABLE, /**< Ready for user actions */ - LIB3270_CURSOR_WAITING, /**< Waiting for host */ - LIB3270_CURSOR_LOCKED, /**< Locked, can't receive user actions */ + LIB3270_POINTER_UNLOCKED, /**< Ready for user actions */ + LIB3270_POINTER_WAITING, /**< Waiting for host */ + LIB3270_POINTER_LOCKED, /**< Locked, can't receive user actions */ - LIB3270_CURSOR_USER - } LIB3270_CURSOR; + LIB3270_POINTER_PROTECTED, + LIB3270_POINTER_MOVE_SELECTION, + LIB3270_POINTER_SELECTION_TOP_LEFT, + LIB3270_POINTER_SELECTION_TOP_RIGHT, + LIB3270_POINTER_SELECTION_TOP, + LIB3270_POINTER_SELECTION_BOTTOM_LEFT, + LIB3270_POINTER_SELECTION_BOTTOM_RIGHT, + LIB3270_POINTER_SELECTION_BOTTOM, + LIB3270_POINTER_SELECTION_LEFT, + LIB3270_POINTER_SELECTION_RIGHT, + LIB3270_POINTER_QUESTION, + + LIB3270_POINTER_COUNT + + } LIB3270_POINTER; /** @@ -1118,6 +1131,9 @@ LIB3270_EXPORT const LIB3270_OPTION_ENTRY * lib3270_get_option_list(void); + LIB3270_EXPORT LIB3270_POINTER lib3270_get_pointer(H3270 *hSession, int baddr); + + /** * The host is TSO? * diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h index b3652ab..e02f5c3 100644 --- a/src/include/lib3270/session.h +++ b/src/include/lib3270/session.h @@ -58,7 +58,7 @@ void (*erase)(H3270 *session); void (*suspend)(H3270 *session); void (*resume)(H3270 *session); - void (*cursor)(H3270 *session, LIB3270_CURSOR id); + void (*cursor)(H3270 *session, LIB3270_POINTER id); void (*set_selection)(H3270 *session, unsigned char on); void (*ctlr_done)(H3270 *session); void (*autostart)(H3270 *session); diff --git a/src/lib3270/api.h b/src/lib3270/api.h index 201c91c..904877a 100644 --- a/src/lib3270/api.h +++ b/src/lib3270/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/src/lib3270/private.h b/src/lib3270/private.h index e054479..59bfecf 100644 --- a/src/lib3270/private.h +++ b/src/lib3270/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/src/lib3270/resolver.c b/src/lib3270/resolver.c index cf79aee..62f4989 100644 --- a/src/lib3270/resolver.c +++ b/src/lib3270/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/src/lib3270/screen.c b/src/lib3270/screen.c index b359dba..3bb9946 100644 --- a/src/lib3270/screen.c +++ b/src/lib3270/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/src/lib3270/screenc.h b/src/lib3270/screenc.h index c0be19a..953356e 100644 --- a/src/lib3270/screenc.h +++ b/src/lib3270/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/src/lib3270/session.c b/src/lib3270/session.c index b646e67..f1ecba3 100644 --- a/src/lib3270/session.c +++ b/src/lib3270/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/src/lib3270/util.c b/src/lib3270/util.c index 1703899..2acdfb0 100644 --- a/src/lib3270/util.c +++ b/src/lib3270/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; + + } diff --git a/src/pw3270/v3270/mouse.c b/src/pw3270/v3270/mouse.c index 70d3fff..ca13f11 100644 --- a/src/pw3270/v3270/mouse.c +++ b/src/pw3270/v3270/mouse.c @@ -224,59 +224,12 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) static void update_mouse_pointer(GtkWidget *widget, int baddr) { v3270 * terminal = GTK_V3270(widget); - int id = 0; +// int id = 0; - if(baddr >= 0 && terminal->pointer_id == LIB3270_CURSOR_EDITABLE) + if(baddr >= 0 && terminal->pointer_id == LIB3270_POINTER_UNLOCKED) { - - switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x8f) - { - case 0x80: - id = V3270_CURSOR_MOVE_SELECTION; - break; - - case 0x82: - id = V3270_CURSOR_SELECTION_TOP; - break; - - case 0x86: - id = V3270_CURSOR_SELECTION_TOP_RIGHT; - break; - - case 0x84: - id = V3270_CURSOR_SELECTION_RIGHT; - break; - - case 0x81: - id = V3270_CURSOR_SELECTION_LEFT; - break; - - case 0x89: - id = V3270_CURSOR_SELECTION_BOTTOM_LEFT; - break; - - case 0x88: - id = V3270_CURSOR_SELECTION_BOTTOM; - break; - - case 0x8c: - id = V3270_CURSOR_SELECTION_BOTTOM_RIGHT; - break; - - case 0x83: - id = V3270_CURSOR_SELECTION_TOP_LEFT; - break; - - default: - id = lib3270_is_protected(terminal->host,baddr) ? V3270_CURSOR_PROTECTED : V3270_CURSOR_UNPROTECTED; - - } - - gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[id]); - + gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[lib3270_get_pointer(terminal->host,baddr)]); } - - } void v3270_update_mouse_pointer(GtkWidget *widget) @@ -298,7 +251,7 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) if(!lib3270_connected(terminal->host)) { - gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[V3270_CURSOR_PROTECTED]); + gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[LIB3270_POINTER_LOCKED]); return FALSE; } @@ -323,30 +276,30 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) } else if(event->y >= terminal->oia_rect->y) { - int id = V3270_CURSOR_PROTECTED; + int id = LIB3270_POINTER_PROTECTED; if(event->x >= terminal->oia_rect[V3270_OIA_SSL].x && event->x <= (terminal->oia_rect[V3270_OIA_SSL].x + terminal->oia_rect[V3270_OIA_SSL].width)) { switch(lib3270_get_secure(terminal->host)) { case LIB3270_SSL_UNSECURE: /**< No secure connection */ - id = V3270_CURSOR_QUESTION; + id = LIB3270_POINTER_QUESTION; break; case LIB3270_SSL_NEGOTIATING: /**< Negotiating SSL */ - id = V3270_CURSOR_WAITING; + id = LIB3270_POINTER_WAITING; break; case LIB3270_SSL_NEGOTIATED: /**< Connection secure, no CA or self-signed */ - id = V3270_CURSOR_QUESTION; + id = LIB3270_POINTER_QUESTION; break; case LIB3270_SSL_SECURE: /**< Connection secure with CA check */ - id = V3270_CURSOR_QUESTION; + id = LIB3270_POINTER_QUESTION; break; default: - id = V3270_CURSOR_LOCKED; + id = LIB3270_POINTER_LOCKED; } } diff --git a/src/pw3270/v3270/private.h b/src/pw3270/v3270/private.h index e1ad649..5cb65f2 100644 --- a/src/pw3270/v3270/private.h +++ b/src/pw3270/v3270/private.h @@ -88,6 +88,7 @@ G_BEGIN_DECLS /*--[ Globals ]--------------------------------------------------------------------------------------*/ +/* #define V3270_CURSOR_UNPROTECTED LIB3270_CURSOR_EDITABLE #define V3270_CURSOR_WAITING LIB3270_CURSOR_WAITING #define V3270_CURSOR_LOCKED LIB3270_CURSOR_LOCKED @@ -105,7 +106,7 @@ G_BEGIN_DECLS #define V3270_CURSOR_QUESTION LIB3270_CURSOR_USER+10 #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+11 - +*/ struct v3270_ssl_status_msg { @@ -146,7 +147,7 @@ G_BEGIN_DECLS int baddr; /**< Selection addr */ } selection; - LIB3270_CURSOR pointer_id; + LIB3270_POINTER pointer_id; unsigned char pointer; /**< Mouse pointer ID */ V3270_OIA_FIELD selected_field; /**< Clicked OIA field */ @@ -226,7 +227,7 @@ G_BEGIN_DECLS /*--[ Globals ]--------------------------------------------------------------------------------------*/ G_GNUC_INTERNAL guint v3270_widget_signal[LAST_SIGNAL]; - G_GNUC_INTERNAL GdkCursor * v3270_cursor[V3270_CURSOR_COUNT]; + G_GNUC_INTERNAL GdkCursor * v3270_cursor[LIB3270_POINTER_COUNT]; G_GNUC_INTERNAL GParamSpec * v3270_properties[PROP_LAST]; /*--[ Prototipes ]-----------------------------------------------------------------------------------*/ diff --git a/src/pw3270/v3270/widget.c b/src/pw3270/v3270/widget.c index ec9b6d8..a57c158 100644 --- a/src/pw3270/v3270/widget.c +++ b/src/pw3270/v3270/widget.c @@ -72,8 +72,8 @@ /*--[ Globals ]--------------------------------------------------------------------------------------*/ - guint v3270_widget_signal[LAST_SIGNAL] = { 0 }; - GdkCursor * v3270_cursor[V3270_CURSOR_COUNT] = { 0 }; + guint v3270_widget_signal[LAST_SIGNAL] = { 0 }; + GdkCursor * v3270_cursor[LIB3270_POINTER_COUNT] = { 0 }; /*--[ Prototipes ]-----------------------------------------------------------------------------------*/ @@ -354,7 +354,7 @@ static void v3270_class_init(v3270Class *klass) "help", // V3270_CURSOR_QUESTION }; #else - static const int cr[V3270_CURSOR_COUNT] = + static const int cr[LIB3270_POINTER_COUNT] = { GDK_XTERM, // V3270_CURSOR_UNPROTECTED GDK_WATCH, // V3270_CURSOR_WAITING @@ -375,7 +375,7 @@ static void v3270_class_init(v3270Class *klass) int f; - for(f=0;f