[hackers] [st] Remove hardcoded keys form kpress || "Roberto E. Vargas Caballero"

From: <hg_AT_suckless.org>
Date: Tue, 13 Nov 2012 20:08:51 +0100 (CET)

changeset: 401:a99bdad9f1e8
user: "Roberto E. Vargas Caballero" <k0ga_AT_shike2.com>
date: Tue Nov 13 20:04:45 2012 +0100
files: config.def.h st.c
description:
Remove hardcoded keys form kpress
Some keys were in the Key array while others were hardcoded in
kpress().This cause some problems with some keys which can generate more of
one string based in the configuration of the terminal.
---
 config.def.h |   70 ++++++++++++++++++++++++++++++++++++++++-----------------
 st.c         |   71 +++++++++++++++++++++++++---------------------------------
 2 files changed, 79 insertions(+), 62 deletions(-)
diff -r ad5510bcd10a -r a99bdad9f1e8 config.def.h
--- a/config.def.h	Tue Nov 13 20:04:39 2012 +0100
+++ b/config.def.h	Tue Nov 13 20:04:45 2012 +0100
_AT_@ -56,34 +56,62 @@
 
 /*
  * Special keys (change & recompile st.info accordingly)
- * Keep in mind that kpress() in st.c hardcodes some keys.
  *
  * Mask value:
  * * Use XK_ANY_MOD to match the key no matter modifiers state
  * * Use XK_NO_MOD to match the key alone (no modifiers)
+ * keypad value:
+ * * 0: no value
+ * * > 0: keypad application mode enabled
+ * * < 0: keypad application mode disabled
+ * cursor value:
+ * * 0: no value
+ * * > 0: cursor application mode enabled
+ * * < 0: cursor application mode disabled
+ * crlf value
+ * * 0: no value
+ * * > 0: crlf mode is enabled
+ * * < 0: crlf mode is disabled
  */
 
-/* key, mask, output */
+/* key, mask, output, keypad, cursor, crlf */
 static Key key[] = {
-	{ XK_BackSpace, XK_NO_MOD, "\177" },
-	{ XK_Insert,    XK_NO_MOD, "\033[2~" },
-	{ XK_Delete,    XK_NO_MOD, "\033[3~" },
-	{ XK_Home,      XK_NO_MOD, "\033[1~" },
-	{ XK_End,       XK_NO_MOD, "\033[4~" },
-	{ XK_Prior,     XK_NO_MOD, "\033[5~" },
-	{ XK_Next,      XK_NO_MOD, "\033[6~" },
-	{ XK_F1,        XK_NO_MOD, "\033OP"   },
-	{ XK_F2,        XK_NO_MOD, "\033OQ"   },
-	{ XK_F3,        XK_NO_MOD, "\033OR"   },
-	{ XK_F4,        XK_NO_MOD, "\033OS"   },
-	{ XK_F5,        XK_NO_MOD, "\033[15~" },
-	{ XK_F6,        XK_NO_MOD, "\033[17~" },
-	{ XK_F7,        XK_NO_MOD, "\033[18~" },
-	{ XK_F8,        XK_NO_MOD, "\033[19~" },
-	{ XK_F9,        XK_NO_MOD, "\033[20~" },
-	{ XK_F10,       XK_NO_MOD, "\033[21~" },
-	{ XK_F11,       XK_NO_MOD, "\033[23~" },
-	{ XK_F12,       XK_NO_MOD, "\033[24~" },
+	/* keysym             mask         string         keypad cursor crlf */
+	{ 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_Up,            ShiftMask,      "\033[a",        0,    0,    0},
+	{ XK_Down,          XK_NO_MOD,      "\033[B",        0,   -1,    0},
+	{ XK_Down,          XK_NO_MOD,      "\033OB",        0,   +1,    0},
+	{ XK_Down,          ShiftMask,      "\033[b",        0,    0,    0},
+	{ XK_Left,     	    XK_NO_MOD,      "\033[D",        0,   -1,    0},
+	{ XK_Left,          XK_NO_MOD,      "\033OD",        0,   +1,    0},
+	{ XK_Left,          ShiftMask,      "\033[d",        0,    0,    0},
+	{ XK_Right,         XK_NO_MOD,      "\033[C",        0,   -1,    0},
+	{ XK_Right,         XK_NO_MOD,      "\033OC",        0,   +1,    0},
+	{ XK_Right,         ShiftMask,      "\033[c",        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_Delete,        XK_NO_MOD,      "\033[3~",       0,    0,    0},
+	{ XK_Home,          XK_NO_MOD,      "\033[1~",       0,    0,    0},
+	{ XK_End,           XK_NO_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_F1,            XK_NO_MOD,      "\033OP" ,       0,    0,    0},
+	{ XK_F2,            XK_NO_MOD,      "\033OQ" ,       0,    0,    0},
+	{ XK_F3,            XK_NO_MOD,      "\033OR" ,       0,    0,    0},
+	{ XK_F4,            XK_NO_MOD,      "\033OS" ,       0,    0,    0},
+	{ XK_F5,            XK_NO_MOD,      "\033[15~",      0,    0,    0},
+	{ XK_F6,            XK_NO_MOD,      "\033[17~",      0,    0,    0},
+	{ XK_F7,            XK_NO_MOD,      "\033[18~",      0,    0,    0},
+	{ XK_F8,            XK_NO_MOD,      "\033[19~",      0,    0,    0},
+	{ XK_F9,            XK_NO_MOD,      "\033[20~",      0,    0,    0},
+	{ XK_F10,           XK_NO_MOD,      "\033[21~",      0,    0,    0},
+	{ XK_F11,           XK_NO_MOD,      "\033[23~",      0,    0,    0},
+	{ XK_F12,           XK_NO_MOD,      "\033[24~",      0,    0,    0},
 };
 
 /* Internal shortcuts. */
diff -r ad5510bcd10a -r a99bdad9f1e8 st.c
--- a/st.c	Tue Nov 13 20:04:39 2012 +0100
+++ b/st.c	Tue Nov 13 20:04:45 2012 +0100
_AT_@ -228,6 +228,10 @@
 	KeySym k;
 	uint mask;
 	char s[ESC_BUF_SIZ];
+	/* three valued logic variables: 0 indifferent, 1 on, -1 off */
+	signed char appkey;		/* application keypad */
+	signed char appcursor;		/* application cursor */
+	signed char crlf;		/* crlf mode          */
 } Key;
 
 /* TODO: use better name for vars... */
_AT_@ -2686,17 +2690,29 @@
 
 char*
 kmap(KeySym k, uint state) {
-	int i;
 	uint mask;
+	Key *kp;
 
 	state &= ~Mod2Mask;
-	for(i = 0; i < LEN(key); i++) {
-		mask = key[i].mask;
+	for(kp = key; kp < key + LEN(key); kp++) {
+		mask = kp->mask;
 
-		if(key[i].k == k && ((state & mask) == mask
-				|| (mask == XK_NO_MOD && !state))) {
-			return (char*)key[i].s;
-		}
+		if(kp->k != k)
+			continue;
+		if((state & mask) != mask &&
+		   (mask == XK_NO_MOD && state))
+			continue;
+		if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
+		   (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD)))
+			continue;
+		if((kp->appcursor < 0 && IS_SET(MODE_APPCURSOR)) ||
+		   (kp->appcursor > 0 && !IS_SET(MODE_APPCURSOR)))
+			continue;
+		if((kp->crlf < 0 && IS_SET(MODE_CRLF)) ||
+		   (kp->crlf > 0 && !IS_SET(MODE_CRLF)))
+			continue;
+
+		return kp->s;
 	}
 	return NULL;
 }
_AT_@ -2706,14 +2722,12 @@
 	XKeyEvent *e = &ev->xkey;
 	KeySym ksym;
 	char xstr[31], buf[32], *customkey, *cp = buf;
-	int len, meta, shift, i;
+	int len, i;
 	Status status;
 
 	if (IS_SET(MODE_KBDLOCK))
 		return;
 
-	meta = e->state & Mod1Mask;
-	shift = e->state & ShiftMask;
 	len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
 
 	/* 1. shortcuts */
_AT_@ -2732,39 +2746,14 @@
 		memcpy(buf, customkey, len);
 	/* 2. hardcoded (overrides X lookup) */
 	} else {
-		switch(ksym) {
-		case XK_Up:
-		case XK_Down:
-		case XK_Left:
-		case XK_Right:
-			/* XXX: shift up/down doesn't work */
-			sprintf(buf, "\033%c%c",
-				IS_SET(MODE_APPKEYPAD) ? 'O' : '[',
-				(shift ? "dacb":"DACB")[ksym - XK_Left]);
-			len = 3;
-			break;
-		case XK_Return:
-			len = 0;
-			if(meta)
-				*cp++ = '\033', len++;
+		if(len == 0)
+			return;
 
-			*cp++ = '\r', len++;
+		if (len == 1 && e->state & Mod1Mask)
+			*cp++ = '\033';
 
-			if(IS_SET(MODE_CRLF))
-				*cp = '\n', len++;
-			break;
-			/* 3. X lookup  */
-		default:
-			if(len == 0)
-				return;
-
-			if (len == 1 && meta)
-				*cp++ = '\033';
-
-			memcpy(cp, xstr, len);
-			len = cp - buf + len;
-			break;
-		}
+		memcpy(cp, xstr, len);
+		len = cp - buf + len;
 	}
 	ttywrite(buf, len);
 	if(IS_SET(MODE_ECHO))
Received on Tue Nov 13 2012 - 20:08:51 CET

This archive was generated by hypermail 2.3.0 : Tue Nov 13 2012 - 20:12:09 CET