Hello,

A new serie of patches that fix some problems detected in last serie:

        - Tab problems
        - Return problems in not newline modes
        - arrow problems

Please, if you find some new errors (I am pretty sure something can happen)
notice me. This new series apply over the actual mercurial tip.

Best regards.
>From 931003d3252ab1a0c97b762ae29c5f939db1de44 Mon Sep 17 00:00:00 2001
From: "Roberto E. Vargas Caballero" <k...@shike2.com>
Date: Wed, 14 Nov 2012 11:00:08 +0100
Subject: Fix tab key

When Shift + Tab is pressed X server send the event XK_ISO_Left_Tab with
ShiftMask, so this is the entry we need in config.def.h

This patch also revert the previous patch for this issue because it breaks
the keyboard.
---
 config.def.h |    2 +-
 st.c         |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/config.def.h b/config.def.h
index 5d887fc..972285b 100644
--- a/config.def.h
+++ b/config.def.h
@@ -141,7 +141,7 @@ static Key key[] = {
 	{ XK_Right,         ShiftMask,      "\033[1;2C",     0,    0,    0},
 	{ XK_Right,         ControlMask,    "\033[1;5C",     0,    0,    0},
 	{ XK_Right,         Mod1Mask,       "\033[1;3C",     0,    0,    0},
-	{ XK_Tab,           ShiftMask,      "\033[Z",        0,    0,    0},
+	{ XK_ISO_Left_Tab,  ShiftMask,      "\033[Z",        0,    0,    0},
 	{ XK_Return,        XK_NO_MOD,      "\n",            0,    0,   -1},
 	{ XK_Return,        XK_NO_MOD,      "\r\n",          0,    0,   +1},
 	{ XK_Return,        Mod1Mask,       "\033\n",        0,    0,   -1},
diff --git a/st.c b/st.c
index ca4248a..932253c 100644
--- a/st.c
+++ b/st.c
@@ -2700,7 +2700,7 @@ kmap(KeySym k, uint state) {
 		if(kp->k != k)
 			continue;
 
-		if((state & mask) != mask ||
+		if((state & mask) != mask &&
 				(mask == XK_NO_MOD && state)) {
 			continue;
 		}
-- 
1.7.10.4

>From b3c76defd2fc66584d221cadae3f8d85fb7fe0d5 Mon Sep 17 00:00:00 2001
From: "Roberto E. Vargas Caballero" <k...@shike2.com>
Date: Thu, 15 Nov 2012 10:59:07 +0100
Subject: Fix XK_NO_MOD and XK_ANY_MOD behavior

XK_NO_MOD match a key without modifiers and XK_ANY_MOD match a key does not
matter what modifiers are pressed to. Like they are mask the best value for
XK_ANY_MOD is all the bits to 1, so the and with any state will be equal to
the state. This also imply that is necessary check the case for XK_NO_MOD
(no modifiers at all) with some modifier in state, and the inverse
(some mask different to XK_ANY_MOD or XK_NO_MOD and no modifiers in state).
---
 st.c |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/st.c b/st.c
index 932253c..b8b2bbf 100644
--- a/st.c
+++ b/st.c
@@ -59,8 +59,8 @@
 #define STR_ARG_SIZ   16
 #define DRAW_BUF_SIZ  20*1024
 #define UTF_SIZ       4
-#define XK_NO_MOD     UINT_MAX
-#define XK_ANY_MOD    0
+#define XK_ANY_MOD    UINT_MAX
+#define XK_NO_MOD     0
 
 #define REDRAW_TIMEOUT (80*1000) /* 80 ms */
 
@@ -2700,10 +2700,12 @@ kmap(KeySym k, uint state) {
 		if(kp->k != k)
 			continue;
 
-		if((state & mask) != mask &&
-				(mask == XK_NO_MOD && state)) {
+		if(mask == XK_NO_MOD && state)
+			continue;
+		if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
+			continue;
+		if((state & mask) != state)
 			continue;
-		}
 
 		if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
 				(kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD))) {
-- 
1.7.10.4

>From f752242029dc32ce6ce57bec3353e7f912931856 Mon Sep 17 00:00:00 2001
From: "Roberto E. Vargas Caballero" <k...@shike2.com>
Date: Thu, 15 Nov 2012 11:09:36 +0100
Subject: Use XK_ANY_MOD instead of XK_NO_MOD in key definition

Usually terminal emulators don't generate any sequence for a combination
they don't have registered, for example Shift + Next, but st behavior
previous to the keyboard patch generates the sequence without the modifier,
in this example Next. This patch uses the XK_ANY_MOD in order to get this
same behaviour.
---
 config.def.h |  114 ++++++++++++++++++++++++++++++----------------------------
 1 file changed, 59 insertions(+), 55 deletions(-)

diff --git a/config.def.h b/config.def.h
index 972285b..bd5a888 100644
--- a/config.def.h
+++ b/config.def.h
@@ -72,91 +72,95 @@ static unsigned int defaultucs = 257;
  * * 0: no value
  * * > 0: crlf mode is enabled
  * * < 0: crlf mode is disabled
+ *
+ * Be careful with the order of the definitons because st searchs in
+ * this table sequencially, so any XK_ANY_MOD must be in the last
+ * position for a key.
  */
 
 /* key, mask, output, keypad, cursor, crlf */
 static Key key[] = {
 	/* keysym             mask         string         keypad cursor crlf */
-	{ XK_KP_Home,       XK_NO_MOD,      "\033[H",        0,    0,    0},
 	{ XK_KP_Home,       ShiftMask,      "\033[1;2H",     0,    0,    0},
-	{ XK_KP_Up,         XK_NO_MOD,      "\033Ox",       +1,    0,    0},
-	{ XK_KP_Up,         XK_NO_MOD,      "\033[A",        0,   -1,    0},
-	{ XK_KP_Up,         XK_NO_MOD,      "\033OA",        0,   +1,    0},
-	{ XK_KP_Down,       XK_NO_MOD,      "\033Or",       +1,    0,    0},
-	{ XK_KP_Down,       XK_NO_MOD,      "\033[B",        0,   -1,    0},
-	{ XK_KP_Down,       XK_NO_MOD,      "\033OB",        0,   +1,    0},
-	{ XK_KP_Left,       XK_NO_MOD,      "\033Ot",       +1,    0,    0},
-	{ XK_KP_Left,       XK_NO_MOD,      "\033[D",        0,   -1,    0},
-	{ XK_KP_Left,       XK_NO_MOD,      "\033OD",        0,   +1,    0},
-	{ XK_KP_Right,      XK_NO_MOD,      "\033Ov",       +1,    0,    0},
-	{ XK_KP_Right,      XK_NO_MOD,      "\033[C",        0,   -1,    0},
-	{ XK_KP_Right,      XK_NO_MOD,      "\033OC",        0,   +1,    0},
-	{ XK_KP_Prior,      XK_NO_MOD,      "\033[5~",	     0,    0,    0},
+	{ XK_KP_Home,       XK_ANY_MOD,     "\033[H",        0,    0,    0},
+	{ XK_KP_Up,         XK_ANY_MOD,     "\033Ox",       +1,    0,    0},
+	{ XK_KP_Up,         XK_ANY_MOD,     "\033[A",        0,   -1,    0},
+	{ XK_KP_Up,         XK_ANY_MOD,     "\033OA",        0,   +1,    0},
+	{ XK_KP_Down,       XK_ANY_MOD,     "\033Or",       +1,    0,    0},
+	{ XK_KP_Down,       XK_ANY_MOD,     "\033[B",        0,   -1,    0},
+	{ XK_KP_Down,       XK_ANY_MOD,     "\033OB",        0,   +1,    0},
+	{ XK_KP_Left,       XK_ANY_MOD,     "\033Ot",       +1,    0,    0},
+	{ XK_KP_Left,       XK_ANY_MOD,     "\033[D",        0,   -1,    0},
+	{ XK_KP_Left,       XK_ANY_MOD,     "\033OD",        0,   +1,    0},
+	{ XK_KP_Right,      XK_ANY_MOD,     "\033Ov",       +1,    0,    0},
+	{ XK_KP_Right,      XK_ANY_MOD,     "\033[C",        0,   -1,    0},
+	{ XK_KP_Right,      XK_ANY_MOD,     "\033OC",        0,   +1,    0},
 	{ XK_KP_Prior,      ShiftMask,      "\033[5;2~",     0,    0,    0},
-	{ XK_KP_Begin,      XK_NO_MOD,      "\033[E",        0,    0,    0},
-	{ XK_KP_End,        XK_NO_MOD,      "\033[4~",       0,    0,    0},
+	{ XK_KP_Prior,      XK_ANY_MOD,     "\033[5~",	     0,    0,    0},
+	{ XK_KP_Begin,      XK_ANY_MOD,     "\033[E",        0,    0,    0},
 	{ XK_KP_End,        ShiftMask,      "\033[1;2F",     0,    0,    0},
-	{ XK_KP_Next,       XK_NO_MOD,      "\033[6~",       0,    0,    0},
+	{ XK_KP_End,        XK_ANY_MOD,     "\033[4~",       0,    0,    0},
 	{ XK_KP_Next,       ShiftMask,      "\033[6;2~",     0,    0,    0},
-	{ XK_KP_Insert,     XK_NO_MOD,      "\033[2~",       0,    0,    0},
+	{ XK_KP_Next,       XK_ANY_MOD,     "\033[6~",       0,    0,    0},
 	{ XK_KP_Insert,     ShiftMask,      "\033[2;2~",     0,    0,    0},
-	{ XK_KP_Delete,     XK_NO_MOD,      "\033[3~",       0,    0,    0},
+	{ XK_KP_Insert,     XK_ANY_MOD,     "\033[2~",       0,    0,    0},
 	{ XK_KP_Delete,     ShiftMask,      "\033[3;2~",     0,    0,    0},
-	{ XK_KP_Multiply,   XK_NO_MOD,      "\033Oj",       +1,    0,    0},
-	{ XK_KP_Add,        XK_NO_MOD,      "\033Ok",       +1,    0,    0},
-	{ XK_KP_Enter,      XK_NO_MOD,      "\033OM",       +1,    0,    0},
-	{ XK_KP_Enter,      XK_NO_MOD,      "\n",           -1,    0,   -1},
-	{ XK_KP_Enter,      XK_NO_MOD,      "\r\n",         -1,    0,    0},
-	{ XK_KP_Subtract,   XK_NO_MOD,      "\033Om",       +1,    0,    0},
-	{ XK_KP_Decimal,    XK_NO_MOD,      "\033On",       +1,    0,    0},
-	{ XK_KP_Divide,     XK_NO_MOD,      "\033Oo",       +1,    0,    0},
-	{ XK_KP_0,          XK_NO_MOD,      "\033Op",       +1,    0,    0},
-	{ XK_KP_1,          XK_NO_MOD,      "\033Oq",       +1,    0,    0},
-	{ XK_KP_2,          XK_NO_MOD,      "\033Or",       +1,    0,    0},
-	{ XK_KP_3,          XK_NO_MOD,      "\033Os",       +1,    0,    0},
-	{ XK_KP_4,          XK_NO_MOD,      "\033Ot",       +1,    0,    0},
-	{ XK_KP_5,          XK_NO_MOD,      "\033Ou",       +1,    0,    0},
-	{ XK_KP_6,          XK_NO_MOD,      "\033Ov",       +1,    0,    0},
-	{ XK_KP_7,          XK_NO_MOD,      "\033Ow",       +1,    0,    0},
-	{ XK_KP_8,          XK_NO_MOD,      "\033Ox",       +1,    0,    0},
-	{ XK_KP_9,          XK_NO_MOD,      "\033Oy",       +1,    0,    0},
-	{ XK_BackSpace,     XK_NO_MOD,      "\177",          0,    0,    0},
-	{ XK_Up,            XK_NO_MOD,      "\033[A",        0,   -1,    0},
-	{ XK_Up,            XK_NO_MOD,      "\033OA",        0,   +1,    0},
+	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[3~",       0,    0,    0},
+	{ XK_KP_Multiply,   XK_ANY_MOD,     "\033Oj",       +1,    0,    0},
+	{ XK_KP_Add,        XK_ANY_MOD,     "\033Ok",       +1,    0,    0},
+	{ XK_KP_Enter,      XK_ANY_MOD,     "\033OM",       +1,    0,    0},
+	{ XK_KP_Enter,      XK_ANY_MOD,     "\n",           -1,    0,   +1},
+	{ XK_KP_Enter,      XK_ANY_MOD,     "\r\n",         -1,    0,   -1},
+	{ XK_KP_Subtract,   XK_ANY_MOD,     "\033Om",       +1,    0,    0},
+	{ XK_KP_Decimal,    XK_ANY_MOD,     "\033On",       +1,    0,    0},
+	{ XK_KP_Divide,     XK_ANY_MOD,     "\033Oo",       +1,    0,    0},
+	{ XK_KP_0,          XK_ANY_MOD,     "\033Op",       +1,    0,    0},
+	{ XK_KP_1,          XK_ANY_MOD,     "\033Oq",       +1,    0,    0},
+	{ XK_KP_2,          XK_ANY_MOD,     "\033Or",       +1,    0,    0},
+	{ XK_KP_3,          XK_ANY_MOD,     "\033Os",       +1,    0,    0},
+	{ XK_KP_4,          XK_ANY_MOD,     "\033Ot",       +1,    0,    0},
+	{ XK_KP_5,          XK_ANY_MOD,     "\033Ou",       +1,    0,    0},
+	{ XK_KP_6,          XK_ANY_MOD,     "\033Ov",       +1,    0,    0},
+	{ XK_KP_7,          XK_ANY_MOD,     "\033Ow",       +1,    0,    0},
+	{ XK_KP_8,          XK_ANY_MOD,     "\033Ox",       +1,    0,    0},
+	{ XK_KP_9,          XK_ANY_MOD,     "\033Oy",       +1,    0,    0},
+	{ XK_BackSpace,     XK_ANY_MOD,     "\177",          0,    0,    0},
 	{ XK_Up,            ShiftMask,      "\033[1;2A",     0,    0,    0},
 	{ XK_Up,            ControlMask,    "\033[1;5A",     0,    0,    0},
 	{ XK_Up,            Mod1Mask,       "\033[1;3A",     0,    0,    0},
-	{ XK_Down,          XK_NO_MOD,      "\033[B",        0,   -1,    0},
-	{ XK_Down,          XK_NO_MOD,      "\033OB",        0,   +1,    0},
+	{ XK_Up,            XK_ANY_MOD,     "\033[A",        0,   -1,    0},
+	{ XK_Up,            XK_ANY_MOD,     "\033OA",        0,   +1,    0},
 	{ XK_Down,          ShiftMask,      "\033[1;2B",     0,    0,    0},
 	{ XK_Down,          ControlMask,    "\033[1;5B",     0,    0,    0},
 	{ XK_Down,          Mod1Mask,       "\033[1;3B",     0,    0,    0},
-	{ XK_Left,	    XK_NO_MOD,      "\033[D",        0,   -1,    0},
-	{ XK_Left,          XK_NO_MOD,      "\033OD",        0,   +1,    0},
+	{ XK_Down,          XK_ANY_MOD,     "\033[B",        0,   -1,    0},
+	{ XK_Down,          XK_ANY_MOD,     "\033OB",        0,   +1,    0},
 	{ XK_Left,          ShiftMask,      "\033[1;2D",     0,    0,    0},
 	{ XK_Left,          ControlMask,    "\033[1;5D",     0,    0,    0},
 	{ XK_Left,          Mod1Mask,       "\033[1;3D",     0,    0,    0},
-	{ XK_Right,         XK_NO_MOD,      "\033[C",        0,   -1,    0},
-	{ XK_Right,         XK_NO_MOD,      "\033OC",        0,   +1,    0},
+	{ XK_Left,	    XK_ANY_MOD,     "\033[D",        0,   -1,    0},
+	{ XK_Left,          XK_ANY_MOD,     "\033OD",        0,   +1,    0},
 	{ XK_Right,         ShiftMask,      "\033[1;2C",     0,    0,    0},
 	{ XK_Right,         ControlMask,    "\033[1;5C",     0,    0,    0},
 	{ XK_Right,         Mod1Mask,       "\033[1;3C",     0,    0,    0},
+	{ XK_Right,         XK_ANY_MOD,     "\033[C",        0,   -1,    0},
+	{ XK_Right,         XK_ANY_MOD,     "\033OC",        0,   +1,    0},
 	{ XK_ISO_Left_Tab,  ShiftMask,      "\033[Z",        0,    0,    0},
-	{ XK_Return,        XK_NO_MOD,      "\n",            0,    0,   -1},
-	{ XK_Return,        XK_NO_MOD,      "\r\n",          0,    0,   +1},
-	{ XK_Return,        Mod1Mask,       "\033\n",        0,    0,   -1},
-	{ XK_Return,        Mod1Mask,       "\033\r\n",      0,    0,   +1},
-	{ XK_Insert,        XK_NO_MOD,      "\033[2~",       0,    0,    0},
+	{ XK_Return,        Mod1Mask,       "\033\n",        0,    0,   +1},
+	{ XK_Return,        Mod1Mask,       "\033\r\n",      0,    0,   -1},
+	{ XK_Return,        XK_ANY_MOD,     "\n",            0,    0,   +1},
+	{ XK_Return,        XK_ANY_MOD,     "\r\n",          0,    0,   -1},
 	{ XK_Insert,        ShiftMask,      "\033[2;2~",     0,    0,    0},
-	{ XK_Delete,        XK_NO_MOD,      "\033[3~",       0,    0,    0},
+	{ XK_Insert,        XK_ANY_MOD,     "\033[2~",       0,    0,    0},
 	{ XK_Delete,        ShiftMask,      "\033[3;2~",     0,    0,    0},
-	{ XK_Home,          XK_NO_MOD,      "\033[H",        0,    0,    0},
+	{ XK_Delete,        XK_ANY_MOD,     "\033[3~",       0,    0,    0},
 	{ XK_Home,          ShiftMask,      "\033[1;2H",     0,    0,    0},
-	{ XK_End,           XK_NO_MOD,      "\033[4~",       0,    0,    0},
+	{ XK_Home,          XK_ANY_MOD,     "\033[H",        0,    0,    0},
 	{ XK_End,           ShiftMask,      "\033[1;2F",     0,    0,    0},
+	{ XK_End,           XK_ANY_MOD,     "\033[4~",       0,    0,    0},
 	{ XK_Prior,         XK_NO_MOD,      "\033[5~",       0,    0,    0},
-	{ XK_Next,          XK_NO_MOD,      "\033[6~",       0,    0,    0},
 	{ XK_Next,          ShiftMask,      "\033[6;2~",     0,    0,    0},
+	{ XK_Next,          XK_ANY_MOD,     "\033[6~",       0,    0,    0},
 	{ XK_F1,            XK_NO_MOD,      "\033OP" ,       0,    0,    0},
 	{ XK_F1, /* F13 */  ShiftMask,      "\033[1;2P",     0,    0,    0},
 	{ XK_F1, /* F25 */  ControlMask,    "\033[1;5P",     0,    0,    0},
-- 
1.7.10.4

Reply via email to