about summary refs log tree commit diff
path: root/dmenu.c
diff options
context:
space:
mode:
authorAnselm R Garbe <garbeam@gmail.com>2008-03-18 16:52:51 +0000
committerAnselm R Garbe <garbeam@gmail.com>2008-03-18 16:52:51 +0000
commit745c46d8fa810bbf45ef16e79a0f84c787f1a670 (patch)
tree1d87a0fd83e226d603e592e69a6f8625d287c288 /dmenu.c
parentAdded tag 3.5 for changeset 05e5bd706b3b (diff)
downloaddmenu-745c46d8fa810bbf45ef16e79a0f84c787f1a670.tar.gz
dmenu-745c46d8fa810bbf45ef16e79a0f84c787f1a670.tar.bz2
dmenu-745c46d8fa810bbf45ef16e79a0f84c787f1a670.zip
fixed match() to prefer prefix-matches to strstr-matches in the match list, extended the -y handling, next version is 3.6
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c70
1 files changed, 42 insertions, 28 deletions
diff --git a/dmenu.c b/dmenu.c
index 5f81d25..688fabf 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -34,14 +34,16 @@ typedef struct {
 
 typedef struct Item Item;
 struct Item {
+	char *text;
+	Bool matched;
 	Item *next;		/* traverses all items */
 	Item *left, *right;	/* traverses items matching current search pattern */
-	char *text;
 };
 
 /* forward declarations */
 Item *appenditem(Item *i, Item *last);
 void calcoffsets(void);
+char *cistrstr(const char *s, const char *sub);
 void cleanup(void);
 void drawmenu(void);
 void drawtext(const char *text, unsigned long col[ColLast]);
@@ -56,7 +58,6 @@ void match(char *pattern);
 void readstdin(void);
 void run(void);
 void setup(int x, int y, int w);
-char *cistrstr(const char *s, const char *sub);
 unsigned int textnw(const char *text, unsigned int len);
 unsigned int textw(const char *text);
 
@@ -130,6 +131,29 @@ calcoffsets(void) {
 	}
 }
 
+char *
+cistrstr(const char *s, const char *sub) {
+	int c, csub;
+	unsigned int len;
+
+	if(!sub)
+		return (char *)s;
+	if((c = *sub++) != 0) {
+		c = tolower(c);
+		len = strlen(sub);
+		do {
+			do {
+				if((csub = *s++) == 0)
+					return (NULL);
+			}
+			while(tolower(csub) != c);
+		}
+		while(strncasecmp(s, sub, len) != 0);
+		s--;
+	}
+	return (char *)s;
+}
+
 void
 cleanup(void) {
 	Item *itm;
@@ -505,8 +529,10 @@ match(char *pattern) {
 	item = j = NULL;
 	nitem = 0;
 	for(i = allitems; i; i = i->next)
-		if(!fstrncmp(pattern, i->text, plen)
-				|| fstrstr(i->text, pattern))
+		if((i->matched = !fstrncmp(pattern, i->text, plen)))
+			j = appenditem(i, j);
+	for(i = allitems; i; i = i->next)
+		if(!i->matched && fstrstr(i->text, pattern))
 			j = appenditem(i, j);
 	curr = prev = next = sel = item;
 	calcoffsets();
@@ -587,6 +613,12 @@ setup(int x, int y, int w) {
 	wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask;
 	mw = w ? w : DisplayWidth(dpy, screen);
 	mh = dc.font.height + 2;
+	if(y < 0) {
+		if(y == (int)(unsigned int)-1)
+			y = DisplayHeight(dpy, screen) - mh;
+		else
+			y = (-1 * y) - mh;
+	}
 	win = XCreateWindow(dpy, root, x, y, mw, mh, 0,
 			DefaultDepth(dpy, screen), CopyFromParent,
 			DefaultVisual(dpy, screen),
@@ -611,29 +643,6 @@ setup(int x, int y, int w) {
 	XMapRaised(dpy, win);
 }
 
-char *
-cistrstr(const char *s, const char *sub) {
-	int c, csub;
-	unsigned int len;
-
-	if(!sub)
-		return (char *)s;
-	if((c = *sub++) != 0) {
-		c = tolower(c);
-		len = strlen(sub);
-		do {
-			do {
-				if((csub = *s++) == 0)
-					return (NULL);
-			}
-			while(tolower(csub) != c);
-		}
-		while(strncasecmp(s, sub, len) != 0);
-		s--;
-	}
-	return (char *)s;
-}
-
 unsigned int
 textnw(const char *text, unsigned int len) {
 	XRectangle r;
@@ -683,7 +692,12 @@ main(int argc, char *argv[]) {
 			if(++i < argc) x = atoi(argv[i]);
 		}
 		else if(!strcmp(argv[i], "-y")) {
-			if(++i < argc) y = atoi(argv[i]);
+			if(++i < argc) {
+				if(!strcmp(argv[i], "-0"))
+					y = (int)(unsigned int)-1;
+				else
+					y = atoi(argv[i]);
+			}
 		}
 		else if(!strcmp(argv[i], "-w")) {
 			if(++i < argc) w = atoi(argv[i]);