about summary refs log tree commit diff
path: root/dmenu.c
diff options
context:
space:
mode:
authorConnor Lane Smith <cls@lubutu.com>2011-05-15 21:54:26 +0100
committerConnor Lane Smith <cls@lubutu.com>2011-05-15 21:54:26 +0100
commit11ea52d1709423e0f4e6702aaee2dff2a3b0107e (patch)
treeb850f8349e91a48ff541aa2c97417b2f3b805d41 /dmenu.c
parentefficient incremental search (diff)
downloaddmenu-11ea52d1709423e0f4e6702aaee2dff2a3b0107e.tar.gz
dmenu-11ea52d1709423e0f4e6702aaee2dff2a3b0107e.tar.bz2
dmenu-11ea52d1709423e0f4e6702aaee2dff2a3b0107e.zip
portability
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/dmenu.c b/dmenu.c
index a8a6290..cee73b2 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -3,6 +3,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 #include <unistd.h>
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
@@ -231,13 +232,14 @@ insert(const char *str, ssize_t n) {
 void
 keypress(XKeyEvent *ev) {
 	char buf[32];
-	size_t len;
 	KeySym ksym;
 
-	len = strlen(text);
 	XLookupString(ev, buf, sizeof buf, &ksym, NULL);
-	if(ev->state & ControlMask)
-		switch(tolower(ksym)) {
+	if(ev->state & ControlMask) {
+		KeySym lower, upper;
+
+		XConvertCase(ksym, &lower, &upper);
+		switch(lower) {
 		default:
 			return;
 		case XK_a:
@@ -290,13 +292,14 @@ keypress(XKeyEvent *ev) {
 			XConvertSelection(dc->dpy, XA_PRIMARY, utf8, utf8, win, CurrentTime);
 			return;
 		}
+	}
 	switch(ksym) {
 	default:
 		if(!iscntrl(*buf))
 			insert(buf, strlen(buf));
 		break;
 	case XK_Delete:
-		if(cursor == len)
+		if(text[cursor] == '\0')
 			return;
 		cursor = nextrune(+1);
 	case XK_BackSpace:
@@ -304,8 +307,8 @@ keypress(XKeyEvent *ev) {
 			insert(NULL, nextrune(-1) - cursor);
 		break;
 	case XK_End:
-		if(cursor < len) {
-			cursor = len;
+		if(text[cursor] != '\0') {
+			cursor = strlen(text);
 			break;
 		}
 		if(next) {
@@ -358,7 +361,7 @@ keypress(XKeyEvent *ev) {
 		fputs((sel && !(ev->state & ShiftMask)) ? sel->text : text, stdout);
 		exit(EXIT_SUCCESS);
 	case XK_Right:
-		if(cursor < len) {
+		if(text[cursor] != '\0') {
 			cursor = nextrune(+1);
 			break;
 		}
@@ -385,7 +388,7 @@ void
 match(Bool sub) {
 	size_t len = strlen(text);
 	Item *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
-	Item *item, *next = NULL;
+	Item *item, *next;
 
 	lexact = lprefix = lsubstr = exactend = prefixend = substrend = NULL;
 	for(item = sub ? matches : items; item && item->text; item = next) {