st

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

commit 16b24eac12ba4a920a5cdbaa76942a2167956f92
parent e404837f9bd57f61ed1e24b4e298256aed14c8b1
Author: robert <robertrussell.72001@gmail.com>
Date:   Wed, 29 Dec 2021 19:20:29 -0800

Add support for key release events

Diffstat:
Mconfig.def.c | 238++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mx.c | 44++++++++++++++++++++++++++------------------
2 files changed, 145 insertions(+), 137 deletions(-)

diff --git a/config.def.c b/config.def.c @@ -169,131 +169,131 @@ Btn btns[] = { /* TODO: add RELS to clr */ Key keys[] = { /* Shortcuts (must be first to get precedence) */ - { XK_Home, TERMMOD, KEXCL(TERMMOD), zoomrst, ARG_DUMMY }, - { XK_Prior, TERMMOD, KEXCL(TERMMOD), zoomrel, {.d = +1} }, - { XK_Next, TERMMOD, KEXCL(TERMMOD), zoomrel, {.d = -1} }, - { XK_Print, C, KEXCL(C), togprinter, ARG_DUMMY }, - { XK_Print, S, KEXCL(S), printscreen, ARG_DUMMY }, - { XK_Print, 0, 0, selprint, ARG_DUMMY }, - { XK_Insert, S, KEXCL(S), selpaste, ARG_DUMMY }, - { XK_Break, 0, 0, sendbreak, ARG_DUMMY }, - { XK_Num_Lock, TERMMOD, KEXCL(TERMMOD), numlock, ARG_DUMMY }, - { XK_C, TERMMOD, KEXCL(TERMMOD), clipcopy, ARG_DUMMY }, - { XK_V, TERMMOD, KEXCL(TERMMOD), clippaste, ARG_DUMMY }, - { XK_Y, TERMMOD, KEXCL(TERMMOD), selpaste, ARG_DUMMY }, - - /* ASCII special cases (kpress handles most cases already) */ - { XK_space, S, 0, SENDCSI(' ',0,'u') }, - { XK_space, C, KEXCL(C), SENDSTR("\0") }, - { XK_space, C|A, KEXCL(C|A), SENDSTR("\033\0") }, - { XK_O, A, 0, SENDUNICODE('O') }, /* ESC O is SS3 */ - { XK_i, C, 0, SENDUNICODE('i') }, /* 'i'-0x60 is tab */ - { XK_m, C, 0, SENDUNICODE('m') }, /* 'm'-0x60 is CR */ - { XK_bracketleft, A, 0, SENDUNICODE('[') }, /* ESC [ is CSI */ + { XK_Home, TERMMOD, KEXCL(TERMMOD)|R, zoomrst, ARG_DUMMY }, + { XK_Prior, TERMMOD, KEXCL(TERMMOD)|R, zoomrel, {.d = +1} }, + { XK_Next, TERMMOD, KEXCL(TERMMOD)|R, zoomrel, {.d = -1} }, + { XK_Print, C, KEXCL(C)|R, togprinter, ARG_DUMMY }, + { XK_Print, S, KEXCL(S)|R, printscreen, ARG_DUMMY }, + { XK_Print, 0, R, selprint, ARG_DUMMY }, + { XK_Insert, S, KEXCL(S)|R, selpaste, ARG_DUMMY }, + { XK_Break, 0, R, sendbreak, ARG_DUMMY }, + { XK_Num_Lock, TERMMOD, KEXCL(TERMMOD)|R, numlock, ARG_DUMMY }, + { XK_C, TERMMOD, KEXCL(TERMMOD)|R, clipcopy, ARG_DUMMY }, + { XK_V, TERMMOD, KEXCL(TERMMOD)|R, clippaste, ARG_DUMMY }, + { XK_Y, TERMMOD, KEXCL(TERMMOD)|R, selpaste, ARG_DUMMY }, + + /* ASCII special cases (handlesym handles most cases already) */ + { XK_space, S, R, SENDCSI(' ',0,'u') }, + { XK_space, C, KEXCL(C)|R, SENDSTR("\0") }, + { XK_space, C|A, KEXCL(C|A)|R, SENDSTR("\033\0") }, + { XK_O, A, R, SENDUNICODE('O') }, /* ESC O is SS3 */ + { XK_i, C, R, SENDUNICODE('i') }, /* 'i'-0x60 is tab */ + { XK_m, C, R, SENDUNICODE('m') }, /* 'm'-0x60 is CR */ + { XK_bracketleft, A, R, SENDUNICODE('[') }, /* ESC [ is CSI */ /* Misc */ - { XK_BackSpace, 0, KMOD, SENDSTR("\177") }, - { XK_BackSpace, A, KEXCL(A), SENDSTR("\033\177") }, - { XK_BackSpace, 0, 0, SENDCSI(127,0,'u') }, - { XK_Tab, 0, KMOD, SENDSTR("\t") }, - { XK_Tab, A, KEXCL(A), SENDSTR("\033\t") }, - { XK_Tab, S, 0, SENDCSI(1,S,'Z') }, - { XK_Tab, 0, 0, SENDCSI('\t',0,'u') }, - { XK_Return, 0, KMOD, SENDSTR("\r") }, - { XK_Return, A, KEXCL(A), SENDSTR("\033\r") }, - { XK_Return, 0, 0, SENDCSI('\r',0,'u') }, - { XK_Escape, 0, KMOD, SENDSTR("\033") }, - { XK_Escape, A, KEXCL(A), SENDSTR("\033\033") }, - { XK_Escape, 0, 0, SENDCSI(27,0,'u') }, - { XK_Delete, 0, 0, SENDTILDE(3) }, - { XK_Home, CURS, KMOD, SENDSTR("\033OH") }, - { XK_Home, 0, 0, SENDCSI(1,0,'H') }, - { XK_Left, CURS, KMOD, SENDSTR("\033OD") }, - { XK_Left, 0, 0, SENDCSI(1,0,'D') }, - { XK_Up, CURS, KMOD, SENDSTR("\033OA") }, - { XK_Up, 0, 0, SENDCSI(1,0,'A') }, - { XK_Right, CURS, KMOD, SENDSTR("\033OC") }, - { XK_Right, 0, 0, SENDCSI(1,0,'C') }, - { XK_Down, CURS, KMOD, SENDSTR("\033OB") }, - { XK_Down, 0, 0, SENDCSI(1,0,'B') }, - { XK_Prior, 0, 0, SENDTILDE(5) }, - { XK_Next, 0, 0, SENDTILDE(6) }, - { XK_End, CURS, KMOD, SENDSTR("\033OF") }, - { XK_End, 0, 0, SENDCSI(1,0,'F') }, - { XK_Begin, 0, 0, SENDCSI(1,0,'E') }, - { XK_Select, 0, 0, SENDTILDE(4) }, - { XK_Insert, 0, 0, SENDTILDE(2) }, - { XK_Find, 0, 0, SENDTILDE(1) }, + { XK_BackSpace, 0, KMOD|R, SENDSTR("\177") }, + { XK_BackSpace, A, KEXCL(A)|R, SENDSTR("\033\177") }, + { XK_BackSpace, 0, R, SENDCSI(127,0,'u') }, + { XK_Tab, 0, KMOD|R, SENDSTR("\t") }, + { XK_Tab, A, KEXCL(A)|R, SENDSTR("\033\t") }, + { XK_Tab, S, R, SENDCSI(1,S,'Z') }, + { XK_Tab, 0, R, SENDCSI('\t',0,'u') }, + { XK_Return, 0, KMOD|R, SENDSTR("\r") }, + { XK_Return, A, KEXCL(A)|R, SENDSTR("\033\r") }, + { XK_Return, 0, R, SENDCSI('\r',0,'u') }, + { XK_Escape, 0, KMOD|R, SENDSTR("\033") }, + { XK_Escape, A, KEXCL(A)|R, SENDSTR("\033\033") }, + { XK_Escape, 0, R, SENDCSI(27,0,'u') }, + { XK_Delete, 0, R, SENDTILDE(3) }, + { XK_Home, CURS, KMOD|R, SENDSTR("\033OH") }, + { XK_Home, 0, R, SENDCSI(1,0,'H') }, + { XK_Left, CURS, KMOD|R, SENDSTR("\033OD") }, + { XK_Left, 0, R, SENDCSI(1,0,'D') }, + { XK_Up, CURS, KMOD|R, SENDSTR("\033OA") }, + { XK_Up, 0, R, SENDCSI(1,0,'A') }, + { XK_Right, CURS, KMOD|R, SENDSTR("\033OC") }, + { XK_Right, 0, R, SENDCSI(1,0,'C') }, + { XK_Down, CURS, KMOD|R, SENDSTR("\033OB") }, + { XK_Down, 0, R, SENDCSI(1,0,'B') }, + { XK_Prior, 0, R, SENDTILDE(5) }, + { XK_Next, 0, R, SENDTILDE(6) }, + { XK_End, CURS, KMOD|R, SENDSTR("\033OF") }, + { XK_End, 0, R, SENDCSI(1,0,'F') }, + { XK_Begin, 0, R, SENDCSI(1,0,'E') }, + { XK_Select, 0, R, SENDTILDE(4) }, + { XK_Insert, 0, R, SENDTILDE(2) }, + { XK_Find, 0, R, SENDTILDE(1) }, /* Keypad */ - { XK_KP_Enter, KPAD, NMLK|KMOD, SENDSTR("\033OM") }, - { XK_KP_Enter, 0, KMOD, SENDSTR("\r") }, - { XK_KP_Enter, A, KEXCL(A), SENDSTR("\033\r") }, - { XK_KP_Enter, 0, 0, SENDCSI('\r',0,'u') }, - { XK_KP_F1, 0, KMOD, SENDSTR("\033OP") }, - { XK_KP_F1, 0, 0, SENDCSI(1,0,'P') }, - { XK_KP_F2, 0, KMOD, SENDSTR("\033OQ") }, - { XK_KP_F2, 0, 0, SENDCSI(1,0,'Q') }, - { XK_KP_F3, 0, KMOD, SENDSTR("\033OR") }, - { XK_KP_F3, 0, 0, SENDCSI(1,0,'R') }, - { XK_KP_F4, 0, KMOD, SENDSTR("\033OS") }, - { XK_KP_F4, 0, 0, SENDCSI(1,0,'S') }, - { XK_KP_Home, CURS, KMOD, SENDSTR("\033OH") }, - { XK_KP_Home, 0, 0, SENDCSI(1,0,'H') }, - { XK_KP_Left, CURS, KMOD, SENDSTR("\033OD") }, - { XK_KP_Left, 0, 0, SENDCSI(1,0,'D') }, - { XK_KP_Up, CURS, KMOD, SENDSTR("\033OA") }, - { XK_KP_Up, 0, 0, SENDCSI(1,0,'A') }, - { XK_KP_Right, CURS, KMOD, SENDSTR("\033OC") }, - { XK_KP_Right, 0, 0, SENDCSI(1,0,'C') }, - { XK_KP_Down, CURS, KMOD, SENDSTR("\033OB") }, - { XK_KP_Down, 0, 0, SENDCSI(1,0,'B') }, - { XK_KP_Prior, 0, 0, SENDTILDE(5) }, - { XK_KP_Next, 0, 0, SENDTILDE(6) }, - { XK_KP_End, CURS, KMOD, SENDSTR("\033OF") }, - { XK_KP_End, 0, 0, SENDCSI(1,0,'F') }, - { XK_KP_Begin, 0, 0, SENDCSI(1,0,'E') }, - { XK_KP_Insert, 0, 0, SENDTILDE(2) }, - { XK_KP_Delete, 0, 0, SENDTILDE(3) }, - { XK_KP_Equal, KPAD, NMLK|KMOD, SENDSTR("\033OX") }, - { XK_KP_Multiply, KPAD, NMLK|KMOD, SENDSTR("\033Oj") }, - { XK_KP_Add, KPAD, NMLK|KMOD, SENDSTR("\033Ok") }, - { XK_KP_Separator, KPAD, NMLK|KMOD, SENDSTR("\033Ol") }, - { XK_KP_Subtract, KPAD, NMLK|KMOD, SENDSTR("\033Om") }, - { XK_KP_Decimal, KPAD, NMLK|KMOD, SENDSTR("\033On") }, - { XK_KP_Divide, KPAD, NMLK|KMOD, SENDSTR("\033Oo") }, - { XK_KP_0, KPAD, NMLK|KMOD, SENDSTR("\033Op") }, - { XK_KP_1, KPAD, NMLK|KMOD, SENDSTR("\033Oq") }, - { XK_KP_2, KPAD, NMLK|KMOD, SENDSTR("\033Or") }, - { XK_KP_3, KPAD, NMLK|KMOD, SENDSTR("\033Os") }, - { XK_KP_4, KPAD, NMLK|KMOD, SENDSTR("\033Ot") }, - { XK_KP_5, KPAD, NMLK|KMOD, SENDSTR("\033Ou") }, - { XK_KP_6, KPAD, NMLK|KMOD, SENDSTR("\033Ov") }, - { XK_KP_7, KPAD, NMLK|KMOD, SENDSTR("\033Ow") }, - { XK_KP_8, KPAD, NMLK|KMOD, SENDSTR("\033Ox") }, - { XK_KP_9, KPAD, NMLK|KMOD, SENDSTR("\033Oy") }, + { XK_KP_Enter, KPAD, NMLK|KMOD|R, SENDSTR("\033OM") }, + { XK_KP_Enter, 0, KMOD|R, SENDSTR("\r") }, + { XK_KP_Enter, A, KEXCL(A)|R, SENDSTR("\033\r") }, + { XK_KP_Enter, 0, R, SENDCSI('\r',0,'u') }, + { XK_KP_F1, 0, KMOD|R, SENDSTR("\033OP") }, + { XK_KP_F1, 0, R, SENDCSI(1,0,'P') }, + { XK_KP_F2, 0, KMOD|R, SENDSTR("\033OQ") }, + { XK_KP_F2, 0, R, SENDCSI(1,0,'Q') }, + { XK_KP_F3, 0, KMOD|R, SENDSTR("\033OR") }, + { XK_KP_F3, 0, R, SENDCSI(1,0,'R') }, + { XK_KP_F4, 0, KMOD|R, SENDSTR("\033OS") }, + { XK_KP_F4, 0, R, SENDCSI(1,0,'S') }, + { XK_KP_Home, CURS, KMOD|R, SENDSTR("\033OH") }, + { XK_KP_Home, 0, R, SENDCSI(1,0,'H') }, + { XK_KP_Left, CURS, KMOD|R, SENDSTR("\033OD") }, + { XK_KP_Left, 0, R, SENDCSI(1,0,'D') }, + { XK_KP_Up, CURS, KMOD|R, SENDSTR("\033OA") }, + { XK_KP_Up, 0, R, SENDCSI(1,0,'A') }, + { XK_KP_Right, CURS, KMOD|R, SENDSTR("\033OC") }, + { XK_KP_Right, 0, R, SENDCSI(1,0,'C') }, + { XK_KP_Down, CURS, KMOD|R, SENDSTR("\033OB") }, + { XK_KP_Down, 0, R, SENDCSI(1,0,'B') }, + { XK_KP_Prior, 0, R, SENDTILDE(5) }, + { XK_KP_Next, 0, R, SENDTILDE(6) }, + { XK_KP_End, CURS, KMOD|R, SENDSTR("\033OF") }, + { XK_KP_End, 0, R, SENDCSI(1,0,'F') }, + { XK_KP_Begin, 0, R, SENDCSI(1,0,'E') }, + { XK_KP_Insert, 0, R, SENDTILDE(2) }, + { XK_KP_Delete, 0, R, SENDTILDE(3) }, + { XK_KP_Equal, KPAD, NMLK|KMOD|R, SENDSTR("\033OX") }, + { XK_KP_Multiply, KPAD, NMLK|KMOD|R, SENDSTR("\033Oj") }, + { XK_KP_Add, KPAD, NMLK|KMOD|R, SENDSTR("\033Ok") }, + { XK_KP_Separator, KPAD, NMLK|KMOD|R, SENDSTR("\033Ol") }, + { XK_KP_Subtract, KPAD, NMLK|KMOD|R, SENDSTR("\033Om") }, + { XK_KP_Decimal, KPAD, NMLK|KMOD|R, SENDSTR("\033On") }, + { XK_KP_Divide, KPAD, NMLK|KMOD|R, SENDSTR("\033Oo") }, + { XK_KP_0, KPAD, NMLK|KMOD|R, SENDSTR("\033Op") }, + { XK_KP_1, KPAD, NMLK|KMOD|R, SENDSTR("\033Oq") }, + { XK_KP_2, KPAD, NMLK|KMOD|R, SENDSTR("\033Or") }, + { XK_KP_3, KPAD, NMLK|KMOD|R, SENDSTR("\033Os") }, + { XK_KP_4, KPAD, NMLK|KMOD|R, SENDSTR("\033Ot") }, + { XK_KP_5, KPAD, NMLK|KMOD|R, SENDSTR("\033Ou") }, + { XK_KP_6, KPAD, NMLK|KMOD|R, SENDSTR("\033Ov") }, + { XK_KP_7, KPAD, NMLK|KMOD|R, SENDSTR("\033Ow") }, + { XK_KP_8, KPAD, NMLK|KMOD|R, SENDSTR("\033Ox") }, + { XK_KP_9, KPAD, NMLK|KMOD|R, SENDSTR("\033Oy") }, /* Function */ - { XK_F1, 0, 0, SENDTILDE(11) }, - { XK_F2, 0, 0, SENDTILDE(12) }, - { XK_F3, 0, 0, SENDTILDE(13) }, - { XK_F4, 0, 0, SENDTILDE(14) }, - { XK_F5, 0, 0, SENDTILDE(15) }, - { XK_F6, 0, 0, SENDTILDE(17) }, - { XK_F7, 0, 0, SENDTILDE(18) }, - { XK_F8, 0, 0, SENDTILDE(19) }, - { XK_F9, 0, 0, SENDTILDE(20) }, - { XK_F10, 0, 0, SENDTILDE(21) }, - { XK_F11, 0, 0, SENDTILDE(23) }, - { XK_F12, 0, 0, SENDTILDE(24) }, - { XK_F13, 0, 0, SENDTILDE(25) }, - { XK_F14, 0, 0, SENDTILDE(26) }, - { XK_F15, 0, 0, SENDTILDE(28) }, - { XK_F16, 0, 0, SENDTILDE(29) }, - { XK_F17, 0, 0, SENDTILDE(31) }, - { XK_F18, 0, 0, SENDTILDE(32) }, - { XK_F19, 0, 0, SENDTILDE(33) }, - { XK_F20, 0, 0, SENDTILDE(34) }, + { XK_F1, 0, R, SENDTILDE(11) }, + { XK_F2, 0, R, SENDTILDE(12) }, + { XK_F3, 0, R, SENDTILDE(13) }, + { XK_F4, 0, R, SENDTILDE(14) }, + { XK_F5, 0, R, SENDTILDE(15) }, + { XK_F6, 0, R, SENDTILDE(17) }, + { XK_F7, 0, R, SENDTILDE(18) }, + { XK_F8, 0, R, SENDTILDE(19) }, + { XK_F9, 0, R, SENDTILDE(20) }, + { XK_F10, 0, R, SENDTILDE(21) }, + { XK_F11, 0, R, SENDTILDE(23) }, + { XK_F12, 0, R, SENDTILDE(24) }, + { XK_F13, 0, R, SENDTILDE(25) }, + { XK_F14, 0, R, SENDTILDE(26) }, + { XK_F15, 0, R, SENDTILDE(28) }, + { XK_F16, 0, R, SENDTILDE(29) }, + { XK_F17, 0, R, SENDTILDE(31) }, + { XK_F18, 0, R, SENDTILDE(32) }, + { XK_F19, 0, R, SENDTILDE(33) }, + { XK_F20, 0, R, SENDTILDE(34) }, /* libtermkey only recognizes up to F20. */ { 0 }, diff --git a/x.c b/x.c @@ -131,6 +131,7 @@ static void unmap(XEvent *); static int handlesym(KeySym, uint); static void kaction(XKeyEvent *, int); static void kpress(XEvent *); +static void krelease(XEvent *); static void cmessage(XEvent *); static void resize(XEvent *); static void focus(XEvent *); @@ -151,6 +152,7 @@ static void usage(void); static void (*handler[LASTEvent])(XEvent *) = { [KeyPress] = kpress, + [KeyRelease] = krelease, [ClientMessage] = cmessage, [ConfigureNotify] = resize, [VisibilityNotify] = visibility, @@ -410,10 +412,8 @@ bpress(XEvent *e) return; if (e->xbutton.button == Button1) { - /* - * If the user clicks below predefined timeouts specific - * snapping behaviour is exposed. - */ + /* If the user clicks below predefined timeouts specific + * snapping behaviour is exposed. */ clock_gettime(CLOCK_MONOTONIC, &now); if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { snap = SNAP_LINE; @@ -430,6 +430,20 @@ bpress(XEvent *e) } void +brelease(XEvent *e) +{ + if (IS_SET(MODE_MOUSE)) { + mousereport(e); + return; + } + + if (baction(&e->xbutton, 1)) + return; + if (e->xbutton.button == Button1) + mousesel(e, 1); +} + +void propnotify(XEvent *e) { XPropertyEvent *xpev; @@ -615,20 +629,6 @@ xsetsel(char *str) } void -brelease(XEvent *e) -{ - if (IS_SET(MODE_MOUSE)) { - mousereport(e); - return; - } - - if (baction(&e->xbutton, 1)) - return; - if (e->xbutton.button == Button1) - mousesel(e, 1); -} - -void bmotion(XEvent *e) { if (IS_SET(MODE_MOUSE)) { @@ -1783,6 +1783,14 @@ kpress(XEvent *e) } void +krelease(XEvent *e) +{ + if (IS_SET(MODE_KBDLOCK)) + return; + kaction(&e->xkey, 1); +} + +void cmessage(XEvent *e) { /*