From 39ec5f7db10a26970ba79663575e0a159be95658 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 6 Sep 2012 19:21:00 +0000 Subject: [PATCH] Padronizando action que move o cursor ao final do campo ativo, incluindo função de biblioteca que obtem a posição do último caractere do campo --- src/include/lib3270.h | 18 +++++++++++++++++- src/lib3270/kybd.c | 40 ++++++++++++++++++++++++++++------------ src/lib3270/selection.c | 6 ++++++ src/pw3270/actions.c | 6 +++--- src/pw3270/uiparser/parser.c | 2 +- ui/00default.xml | 2 +- 6 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/include/lib3270.h b/src/include/lib3270.h index d4be6b8..8bdb91e 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -125,7 +125,10 @@ LIB3270_DIR_UP, LIB3270_DIR_DOWN, LIB3270_DIR_LEFT, - LIB3270_DIR_RIGHT + LIB3270_DIR_RIGHT, + + LIB3270_DIR_END, + } LIB3270_DIRECTION; /** @@ -782,6 +785,19 @@ LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0); /** + * Get address of the first blank. + * + * Get address of the first blank after the last nonblank in the + * field, or if the field is full, to the last character in the field. + * + * @param hSession Session handle. + * @param baddr Field address. + * + * @return address of the first blank or -1 if invalid. + */ + LIB3270_EXPORT int lib3270_get_field_end(H3270 *hSession, int baddr); + + /** * Find the buffer address of the field attribute for a given buffer address. * * @param h Session handle. diff --git a/src/lib3270/kybd.c b/src/lib3270/kybd.c index 83af1ec..c2a57af 100644 --- a/src/lib3270/kybd.c +++ b/src/lib3270/kybd.c @@ -2346,29 +2346,43 @@ ToggleReverse_action(Widget w unused, XEvent *event, String *params, Cardinal *n */ LIB3270_ACTION( fieldend ) { - int baddr, faddr; - unsigned char fa, c; - int last_nonblank = -1; + int baddr; if (hSession->kybdlock) { ENQUEUE_ACTION( lib3270_fieldend ); return 0; } + + baddr = lib3270_get_field_end(hSession,hSession->cursor_addr); + if(baddr >= 0) + cursor_move(hSession,baddr); + + return 0; +} + +int lib3270_get_field_end(H3270 *hSession, int baddr) +{ + int faddr; + unsigned char fa, c; + int last_nonblank = -1; + #if defined(X3270_ANSI) /*[*/ if (IN_ANSI) - return 0; + return -1; #endif /*]*/ + if (!hSession->formatted) - return 0; - baddr = hSession->cursor_addr; + return -1; + faddr = find_field_attribute(hSession,baddr); fa = hSession->ea_buf[faddr].fa; if (faddr == baddr || FA_IS_PROTECTED(fa)) - return 0; + return -1; baddr = faddr; - while (True) { + while (True) + { INC_BA(baddr); c = hSession->ea_buf[baddr].cc; if (hSession->ea_buf[baddr].fa) @@ -2377,17 +2391,19 @@ LIB3270_ACTION( fieldend ) last_nonblank = baddr; } - if (last_nonblank == -1) { + if (last_nonblank == -1) + { baddr = faddr; INC_BA(baddr); - } else { + } + else + { baddr = last_nonblank; INC_BA(baddr); if (hSession->ea_buf[baddr].fa) baddr = last_nonblank; } - cursor_move(hSession,baddr); - return 0; + return baddr; } /** diff --git a/src/lib3270/selection.c b/src/lib3270/selection.c index c8a4aea..0bd46d2 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -862,6 +862,12 @@ LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, u cursor_addr++; break; + case LIB3270_DIR_END: + cursor_addr = lib3270_get_field_end(hSession,cursor_addr); + if(cursor_addr == -1) + return EINVAL; + break; + default: return -1; } diff --git a/src/pw3270/actions.c b/src/pw3270/actions.c index 6edf3f8..94c3efd 100644 --- a/src/pw3270/actions.c +++ b/src/pw3270/actions.c @@ -320,7 +320,7 @@ static void cursor_move_action(GtkAction *action, GtkWidget *widget) widget, (unsigned int) flags); - lib3270_move_cursor(v3270_get_session(widget),(LIB3270_DIRECTION) (flags & 0x03), (flags & 0x80) ); + lib3270_move_cursor(v3270_get_session(widget),(LIB3270_DIRECTION) (flags & 0x0F), (flags & 0x80) ); } static void connect_move_action(GtkAction *action, GtkWidget *widget, const gchar *target, unsigned short flags, GError **error) @@ -333,7 +333,7 @@ static void connect_move_action(GtkAction *action, GtkWidget *widget, const gcha if(!g_ascii_strcasecmp(target,"selection")) { - g_object_set_data(G_OBJECT(action),"direction",GINT_TO_POINTER((flags & 3))); + g_object_set_data(G_OBJECT(action),"direction",GINT_TO_POINTER((flags & 0x0F))); g_signal_connect(action,"activate",G_CALLBACK(selection_move_action),widget); } else if(!g_ascii_strcasecmp(target,"cursor")) @@ -504,7 +504,7 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash } action_type = ACTION_TYPE_DEFAULT; if(dir != UI_ATTR_DIRECTION_NONE) - flags |= ((unsigned char) dir) & 0x03; + flags |= ((unsigned char) dir) & 0x0F; if(ui_get_bool_attribute("selecting",names,values,FALSE)) flags |= 0x80; diff --git a/src/pw3270/uiparser/parser.c b/src/pw3270/uiparser/parser.c index 518503f..0ec84d7 100644 --- a/src/pw3270/uiparser/parser.c +++ b/src/pw3270/uiparser/parser.c @@ -38,7 +38,7 @@ /*--[ Globals ]--------------------------------------------------------------------------------------*/ -static const gchar * dirname[] = { "up", "down", "left", "right" }; +static const gchar * dirname[] = { "up", "down", "left", "right", "end" }; /*--[ Implement ]------------------------------------------------------------------------------------*/ diff --git a/ui/00default.xml b/ui/00default.xml index 1c343bd..7bb9d02 100644 --- a/ui/00default.xml +++ b/ui/00default.xml @@ -214,7 +214,6 @@ - @@ -233,6 +232,7 @@ + -- libgit2 0.21.2