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:
| M | config.def.c | | | 238 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | x.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)
{
/*