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