tRemove hardcoded keys form kpress - st - [fork] customized build of st, the si… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit ea782bfc5d34d712bc9391e498935d2d27f3116c | |
parent 93f31166bfff317e050dde1723cfa8302c6f85d3 | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
Date: Tue, 13 Nov 2012 20:04:45 +0100 | |
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(-) | |
Diffstat: | |
M config.def.h | 70 ++++++++++++++++++++++-------… | |
M st.c | 71 +++++++++++++----------------… | |
2 files changed, 79 insertions(+), 62 deletions(-) | |
--- | |
diff --git a/config.def.h b/config.def.h | |
t@@ -56,34 +56,62 @@ static unsigned int defaultucs = 257; | |
/* | |
* 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, … | |
+ { 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 --git a/st.c b/st.c | |
t@@ -228,6 +228,10 @@ typedef struct { | |
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... */ | |
t@@ -2686,17 +2690,29 @@ focus(XEvent *ev) { | |
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; | |
} | |
t@@ -2706,14 +2722,12 @@ kpress(XEvent *ev) { | |
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 */ | |
t@@ -2732,39 +2746,14 @@ kpress(XEvent *ev) { | |
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++; | |
- | |
- *cp++ = '\r', len++; | |
- | |
- if(IS_SET(MODE_CRLF)) | |
- *cp = '\n', len++; | |
- break; | |
- /* 3. X lookup */ | |
- default: | |
- if(len == 0) | |
- return; | |
+ if(len == 0) | |
+ return; | |
- if (len == 1 && meta) | |
- *cp++ = '\033'; | |
+ if (len == 1 && e->state & Mod1Mask) | |
+ *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)) |