fixed match() to prefer prefix-matches to strstr-matches in the match list, extended the -y handling, next version is 3.6
This commit is contained in:
		
							parent
							
								
									d058e83570
								
							
						
					
					
						commit
						745c46d8fa
					
				| @ -1,5 +1,5 @@ | |||||||
| # dmenu version
 | # dmenu version
 | ||||||
| VERSION = 3.5 | VERSION = 3.6 | ||||||
| 
 | 
 | ||||||
| # Customize below to fit your system
 | # Customize below to fit your system
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								dmenu.1
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								dmenu.1
									
									
									
									
									
								
							| @ -26,7 +26,9 @@ efficiently. | |||||||
| defines the x coordinate dmenu appears at (0 by default). | defines the x coordinate dmenu appears at (0 by default). | ||||||
| .TP | .TP | ||||||
| .B \-y | .B \-y | ||||||
| defines the y coordinate dmenu appears at (0 by default). | defines the y coordinate dmenu appears at (0 by default). If it is negative, | ||||||
|  | dmenu will appear with the bottom at the given positive coordinate. It it is | ||||||
|  | -0, dmenu appears at the screen bottom. | ||||||
| .TP | .TP | ||||||
| .B \-w | .B \-w | ||||||
| defines the width of the dmenu window (screen width by default). | defines the width of the dmenu window (screen width by default). | ||||||
|  | |||||||
							
								
								
									
										70
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								dmenu.c
									
									
									
									
									
								
							| @ -34,14 +34,16 @@ typedef struct { | |||||||
| 
 | 
 | ||||||
| typedef struct Item Item; | typedef struct Item Item; | ||||||
| struct Item { | struct Item { | ||||||
|  | 	char *text; | ||||||
|  | 	Bool matched; | ||||||
| 	Item *next;		/* traverses all items */ | 	Item *next;		/* traverses all items */ | ||||||
| 	Item *left, *right;	/* traverses items matching current search pattern */ | 	Item *left, *right;	/* traverses items matching current search pattern */ | ||||||
| 	char *text; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* forward declarations */ | /* forward declarations */ | ||||||
| Item *appenditem(Item *i, Item *last); | Item *appenditem(Item *i, Item *last); | ||||||
| void calcoffsets(void); | void calcoffsets(void); | ||||||
|  | char *cistrstr(const char *s, const char *sub); | ||||||
| void cleanup(void); | void cleanup(void); | ||||||
| void drawmenu(void); | void drawmenu(void); | ||||||
| void drawtext(const char *text, unsigned long col[ColLast]); | void drawtext(const char *text, unsigned long col[ColLast]); | ||||||
| @ -56,7 +58,6 @@ void match(char *pattern); | |||||||
| void readstdin(void); | void readstdin(void); | ||||||
| void run(void); | void run(void); | ||||||
| void setup(int x, int y, int w); | 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 textnw(const char *text, unsigned int len); | ||||||
| unsigned int textw(const char *text); | 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 | void | ||||||
| cleanup(void) { | cleanup(void) { | ||||||
| 	Item *itm; | 	Item *itm; | ||||||
| @ -505,8 +529,10 @@ match(char *pattern) { | |||||||
| 	item = j = NULL; | 	item = j = NULL; | ||||||
| 	nitem = 0; | 	nitem = 0; | ||||||
| 	for(i = allitems; i; i = i->next) | 	for(i = allitems; i; i = i->next) | ||||||
| 		if(!fstrncmp(pattern, i->text, plen) | 		if((i->matched = !fstrncmp(pattern, i->text, plen))) | ||||||
| 				|| fstrstr(i->text, pattern)) | 			j = appenditem(i, j); | ||||||
|  | 	for(i = allitems; i; i = i->next) | ||||||
|  | 		if(!i->matched && fstrstr(i->text, pattern)) | ||||||
| 			j = appenditem(i, j); | 			j = appenditem(i, j); | ||||||
| 	curr = prev = next = sel = item; | 	curr = prev = next = sel = item; | ||||||
| 	calcoffsets(); | 	calcoffsets(); | ||||||
| @ -587,6 +613,12 @@ setup(int x, int y, int w) { | |||||||
| 	wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; | 	wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; | ||||||
| 	mw = w ? w : DisplayWidth(dpy, screen); | 	mw = w ? w : DisplayWidth(dpy, screen); | ||||||
| 	mh = dc.font.height + 2; | 	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, | 	win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | ||||||
| 			DefaultDepth(dpy, screen), CopyFromParent, | 			DefaultDepth(dpy, screen), CopyFromParent, | ||||||
| 			DefaultVisual(dpy, screen), | 			DefaultVisual(dpy, screen), | ||||||
| @ -611,29 +643,6 @@ setup(int x, int y, int w) { | |||||||
| 	XMapRaised(dpy, win); | 	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 | unsigned int | ||||||
| textnw(const char *text, unsigned int len) { | textnw(const char *text, unsigned int len) { | ||||||
| 	XRectangle r; | 	XRectangle r; | ||||||
| @ -683,7 +692,12 @@ main(int argc, char *argv[]) { | |||||||
| 			if(++i < argc) x = atoi(argv[i]); | 			if(++i < argc) x = atoi(argv[i]); | ||||||
| 		} | 		} | ||||||
| 		else if(!strcmp(argv[i], "-y")) { | 		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")) { | 		else if(!strcmp(argv[i], "-w")) { | ||||||
| 			if(++i < argc) w = atoi(argv[i]); | 			if(++i < argc) w = atoi(argv[i]); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user