about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHiltjo Posthuma <hiltjo@codemadness.org>2018-03-16 16:51:22 +0100
committerHiltjo Posthuma <hiltjo@codemadness.org>2018-04-22 14:09:05 +0200
commitb6d2cc9aea979cb3557db39dbe65a2870d13e597 (patch)
treee19f4eb0f0639aedfcc5744ef6e7e957ac25333a
parentUpdate LICENSE (diff)
downloaddmenu-b6d2cc9aea979cb3557db39dbe65a2870d13e597.tar.gz
dmenu-b6d2cc9aea979cb3557db39dbe65a2870d13e597.tar.bz2
dmenu-b6d2cc9aea979cb3557db39dbe65a2870d13e597.zip
Fix handling of input strings
-rw-r--r--dmenu.c35
1 files changed, 21 insertions, 14 deletions
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();
 }