Fix handling of input strings - dmenu - dynamic menu | |
git clone git://git.suckless.org/dmenu | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b6d2cc9aea979cb3557db39dbe65a2870d13e597 | |
parent 2f398981feb562285b0a96cd315bf2b3244c7309 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Fri, 16 Mar 2018 16:51:22 +0100 | |
Fix handling of input strings | |
Diffstat: | |
M dmenu.c | 35 +++++++++++++++++++----------… | |
1 file changed, 21 insertions(+), 14 deletions(-) | |
--- | |
diff --git a/dmenu.c b/dmenu.c | |
@@ -308,13 +308,21 @@ keypress(XKeyEvent *ev) | |
{ | |
char buf[32]; | |
int len; | |
- KeySym ksym = NoSymbol; | |
+ KeySym ksym; | |
Status status; | |
len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); | |
- if (status == XBufferOverflow) | |
+ switch (status) { | |
+ default: /* XLookupNone, XBufferOverflow */ | |
return; | |
- if (ev->state & ControlMask) | |
+ case XLookupChars: | |
+ goto insert; | |
+ case XLookupKeySym: | |
+ case XLookupBoth: | |
+ break; | |
+ } | |
+ | |
+ if (ev->state & ControlMask) { | |
switch(ksym) { | |
case XK_a: ksym = XK_Home; break; | |
case XK_b: ksym = XK_Left; break; | |
@@ -352,12 +360,10 @@ keypress(XKeyEvent *ev) | |
return; | |
case XK_Left: | |
movewordedge(-1); | |
- ksym = NoSymbol; | |
- break; | |
+ goto draw; | |
case XK_Right: | |
movewordedge(+1); | |
- ksym = NoSymbol; | |
- break; | |
+ goto draw; | |
case XK_Return: | |
case XK_KP_Enter: | |
break; | |
@@ -367,16 +373,14 @@ keypress(XKeyEvent *ev) | |
default: | |
return; | |
} | |
- else if (ev->state & Mod1Mask) | |
+ } else if (ev->state & Mod1Mask) { | |
switch(ksym) { | |
case XK_b: | |
movewordedge(-1); | |
- ksym = NoSymbol; | |
- break; | |
+ goto draw; | |
case XK_f: | |
movewordedge(+1); | |
- ksym = NoSymbol; | |
- break; | |
+ goto draw; | |
case XK_g: ksym = XK_Home; break; | |
case XK_G: ksym = XK_End; break; | |
case XK_h: ksym = XK_Up; break; | |
@@ -386,13 +390,14 @@ keypress(XKeyEvent *ev) | |
default: | |
return; | |
} | |
+ } | |
+ | |
switch(ksym) { | |
default: | |
+insert: | |
if (!iscntrl(*buf)) | |
insert(buf, len); | |
break; | |
- case NoSymbol: | |
- break; | |
case XK_Delete: | |
if (text[cursor] == '\0') | |
return; | |
@@ -489,6 +494,8 @@ keypress(XKeyEvent *ev) | |
match(); | |
break; | |
} | |
+ | |
+draw: | |
drawmenu(); | |
} | |