From b6d2cc9aea979cb3557db39dbe65a2870d13e597 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Fri, 16 Mar 2018 16:51:22 +0100 Subject: Fix handling of input strings --- dmenu.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'dmenu.c') diff --git a/dmenu.c b/dmenu.c index 5e9c367..c852e92 100644 --- 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(); } -- cgit v1.2.3-13-gbd6f