st

st fork
git clone git://git.rr3.xyz/st
Log | Files | Refs | README | LICENSE

commit de3e6f508e922dc3974744551df1d5802e93fa47
parent 4536f46cfff50c66a115755def0155d8e246b02f
Author: robert <robertrussell.72001@gmail.com>
Date:   Fri,  4 Jun 2021 19:15:05 -0700

Add new key table

Diffstat:
Mconfig.def.h | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 190 insertions(+), 0 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -234,6 +234,196 @@ static KeySym mappedkeys[] = { -1 }; */ static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; +typedef union { + struct { + uint l; + char *s; + } str; + struct { + uint n; + uchar m; + char c; + } csi; +} KeyArg; + +typedef int (*KeyEncoder)(char *buf, size_t len, + KeySym sym, uint mod, KeyArg arg); + +typedef struct { + /* Tristate logic. Each bit in set/clr is interpreted as follows: + * set clr + * 0 0 don't care + * 0 1 bit must be clear + * 1 0 bit must be set + * 1 1 unsatisfiable (i.e., useless configuration) */ + KeySym sym; + uint set, clr; + KeyEncoder fn; + KeyArg arg; +} Key; + +int +kencstr(char *buf, size_t len, KeySym sym, uint state, KeyArg arg) +{ + size_t i; + + for (i = 0; i < len-1 && i < arg.str.l; i++) + buf[i] = arg.str.s[i]; + if (len > 0) + buf[i] = '\0'; + return i; +} + +int +kenccsi(char *buf, size_t len, KeySym sym, uint state, KeyArg arg) +{ + uint mod; + + mod = (state >> MODOFFS) & ~arg.csi.m; + if (mod > 0) + return snprintf(buf, len, "\033[%d;%d%c", arg.csi.n, mod+1, arg.csi.c); + else if (n > 1) + return snprintf(buf, len, "\033[%d%c", arg.csi.n, arg.csi.c); + else + return snprintf(buf, len, "\033[%c", arg.csi.c); +} + +#define CURS (1<<0) +#define KPAD (1<<1) +#define NMLK (1<<2) +#define MODOFFS 3 +#define S (1<<3) +#define A (1<<4) +#define C (1<<5) +#define ALLM (S|A|C) + +#define STR(s) kencstr, .arg.str.l = sizeof(s)-1, .arg.str.s = (s) +#define CSI(n_,m_,c_) kenccsi, .arg.csi.n = (n_), .arg.csi.m = (m_), .arg.csi.c = (c_) +#define TILDE(n) CSI((n),0,'~') +#define UNICODE(cp) CSI((cp),S,'u') + +Key keys[] = { + /* SHORTCUTS (must be first) */ + /* XK_Print */ + /* XK_Break */ + /* XK_Num_Lock */ + + /* LATIN1 */ + { XK_space, C, A|S, STR("\0") }, + { XK_space, C|A, S, STR("\033\0") }, + { XK_at, C, 0, UNICODE('@') }, /* '@'-64 is NUL */ + { XK_O, A, 0, UNICODE('O') }, /* ESC O is SS3 */ + { XK_i, C, 0, UNICODE('i') }, /* 'i'-64 is tab */ + { XK_m, C, 0, UNICODE('m') }, /* 'm'-64 is CR */ + { XK_bracketleft, C, 0, UNICODE('[') }, /* '['-64 is ESC */ + { XK_bracketleft, A, 0, UNICODE('[') }, /* ESC [ is CSI */ + + /* MISC */ + { XK_BackSpace, 0, ALLM, STR("\177") }, + { XK_BackSpace, A, C|S, STR("\033\177") }, + { XK_BackSpace, 0, 0, CSI(127,0,'u') }, + { XK_Tab, 0, ALLM, STR("\t") }, + { XK_Tab, A, C|S, STR("\033\t") }, + { XK_Tab, S, 0, CSI(1,S,'Z') }, + { XK_Tab, 0, 0, CSI('\t',0,'u') }, + { XK_Return, 0, ALLM, STR("\r") }, + { XK_Return, A, C|S, STR("\033\r") }, + { XK_Return, 0, 0, CSI('\r',0,'u') }, + { XK_Escape, 0, ALLM, STR("\033") }, + { XK_Escape, A, C|S, STR("\033\033") }, + { XK_Escape, 0, 0, CSI(27,0,'u') }, + { XK_Delete, 0, 0, TILDE(3) }, + { XK_Home, CURS, ALLM, STR("\033OH") }, + { XK_Home, 0, 0, CSI(1,0,'H') }, + { XK_Left, CURS, ALLM, STR("\033OD") }, + { XK_Left, 0, 0, CSI(1,0,'D') }, + { XK_Up, CURS, ALLM, STR("\033OA") }, + { XK_Up, 0, 0, CSI(1,0,'A') }, + { XK_Right, CURS, ALLM, STR("\033OC") }, + { XK_Right, 0, 0, CSI(1,0,'C') }, + { XK_Down, CURS, ALLM, STR("\033OB") }, + { XK_Down, 0, 0, CSI(1,0,'B') }, + { XK_Prior, 0, 0, TILDE(5) }, + { XK_Next, 0, 0, TILDE(6) }, + { XK_End, CURS, ALLM, STR("\033OF") }, + { XK_End, 0, 0, CSI(1,0,'F') }, + { XK_Begin, 0, 0, CSI(1,0,'E') }, + { XK_Select, 0, 0, TILDE(4) }, + { XK_Insert, 0, 0, TILDE(2) }, + { XK_Find, 0, 0, TILDE(1) }, + + /* KEYPAD */ + { XK_KP_Enter, KPAD, NKLK|ALLM, STR("\033OM") }, + { XK_KP_Enter, 0, ALLM, STR("\r") }, + { XK_KP_Enter, A, C|S, STR("\033\r") }, + { XK_KP_Enter, 0, 0, CSI('\r',0,'u') }, + { XK_KP_F1, 0, ALLM, STR("\033OP") }, + { XK_KP_F1, 0, 0, CSI(1,0,'P') }, + { XK_KP_F2, 0, ALLM, STR("\033OQ") }, + { XK_KP_F2, 0, 0, CSI(1,0,'Q') }, + { XK_KP_F3, 0, ALLM, STR("\033OR") }, + { XK_KP_F3, 0, 0, CSI(1,0,'R') }, + { XK_KP_F4, 0, ALLM, STR("\033OS") }, + { XK_KP_F4, 0, 0, CSI(1,0,'S') }, + { XK_KP_Home, CURS, ALLM, STR("\033OH") }, + { XK_KP_Home, 0, 0, CSI(1,0,'H') }, + { XK_KP_Left, CURS, ALLM, STR("\033OD") }, + { XK_KP_Left, 0, 0, CSI(1,0,'D') }, + { XK_KP_Up, CURS, ALLM, STR("\033OA") }, + { XK_KP_Up, 0, 0, CSI(1,0,'A') }, + { XK_KP_Right, CURS, ALLM, STR("\033OC") }, + { XK_KP_Right, 0, 0, CSI(1,0,'C') }, + { XK_KP_Down, CURS, ALLM, STR("\033OB") }, + { XK_KP_Down, 0, 0, CSI(1,0,'B') }, + { XK_KP_Prior, 0, 0, TILDE(5) }, + { XK_KP_Next, 0, 0, TILDE(6) }, + { XK_KP_End, CURS, ALLM, STR("\033OF") }, + { XK_KP_End, 0, 0, CSI(1,0,'F') }, + { XK_KP_Begin, 0, 0, CSI(1,0,'E') }, + { XK_KP_Insert, 0, 0, TILDE(2) }, + { XK_KP_Delete, 0, 0, TILDE(3) }, + { XK_KP_Equal, KPAD, NKLK|ALLM, STR("\033OX") }, + { XK_KP_Multiply, KPAD, NMLK|ALLM, STR("\033Oj") }, + { XK_KP_Add, KPAD, NMLK|ALLM, STR("\033Ok") }, + { XK_KP_Separator, KPAD, NMLK|ALLM, STR("\033Ol") }, + { XK_KP_Subtract, KPAD, NMLK|ALLM, STR("\033Om") }, + { XK_KP_Decimal, KPAD, NMLK|ALLM, STR("\033On") }, + { XK_KP_Divide, KPAD, NMLK|ALLM, STR("\033Oo") }, + { XK_KP_0, KPAD, NMLK|ALLM, STR("\033Op") }, + { XK_KP_1, KPAD, NMLK|ALLM, STR("\033Oq") }, + { XK_KP_2, KPAD, NMLK|ALLM, STR("\033Or") }, + { XK_KP_3, KPAD, NMLK|ALLM, STR("\033Os") }, + { XK_KP_4, KPAD, NMLK|ALLM, STR("\033Ot") }, + { XK_KP_5, KPAD, NMLK|ALLM, STR("\033Ou") }, + { XK_KP_6, KPAD, NMLK|ALLM, STR("\033Ov") }, + { XK_KP_7, KPAD, NMLK|ALLM, STR("\033Ow") }, + { XK_KP_8, KPAD, NMLK|ALLM, STR("\033Ox") }, + { XK_KP_9, KPAD, NMLK|ALLM, STR("\033Oy") }, + + /* FUNCTION */ + { XK_F1, 0, 0, TILDE(11) }, + { XK_F2, 0, 0, TILDE(12) }, + { XK_F3, 0, 0, TILDE(13) }, + { XK_F4, 0, 0, TILDE(14) }, + { XK_F5, 0, 0, TILDE(15) }, + { XK_F6, 0, 0, TILDE(17) }, + { XK_F7, 0, 0, TILDE(18) }, + { XK_F8, 0, 0, TILDE(19) }, + { XK_F9, 0, 0, TILDE(20) }, + { XK_F10, 0, 0, TILDE(21) }, + { XK_F11, 0, 0, TILDE(23) }, + { XK_F12, 0, 0, TILDE(24) }, + { XK_F13, 0, 0, TILDE(25) }, + { XK_F14, 0, 0, TILDE(26) }, + { XK_F15, 0, 0, TILDE(28) }, + { XK_F16, 0, 0, TILDE(29) }, + { XK_F17, 0, 0, TILDE(31) }, + { XK_F18, 0, 0, TILDE(32) }, + { XK_F19, 0, 0, TILDE(33) }, + { XK_F20, 0, 0, TILDE(34) }, +}; + + /* * This is the huge key array which defines all compatibility to the Linux * world. Please decide about changes wisely.