several performance tweaks
							parent
							
								
									745c46d8fa
								
							
						
					
					
						commit
						542c58d8d0
					
				
							
								
								
									
										2
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										2
									
								
								Makefile
								
								
								
								
							|  | @ -1,5 +1,5 @@ | |||
| # dmenu - dynamic menu
 | ||||
| # © 2006-2007 Anselm R. Garbe, Sander van Dijk
 | ||||
| # See LICENSE file for copyright and license details.
 | ||||
| 
 | ||||
| include config.mk | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										61
									
								
								dmenu.c
								
								
								
								
							
							
						
						
									
										61
									
								
								dmenu.c
								
								
								
								
							|  | @ -35,13 +35,12 @@ 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 */ | ||||
| }; | ||||
| 
 | ||||
| /* forward declarations */ | ||||
| Item *appenditem(Item *i, Item *last); | ||||
| void appenditem(Item *i, Item **list, Item **last); | ||||
| void calcoffsets(void); | ||||
| char *cistrstr(const char *s, const char *sub); | ||||
| void cleanup(void); | ||||
|  | @ -92,17 +91,15 @@ Window root, win; | |||
| int (*fstrncmp)(const char *, const char *, size_t n) = strncmp; | ||||
| char *(*fstrstr)(const char *, const char *) = strstr; | ||||
| 
 | ||||
| Item * | ||||
| appenditem(Item *i, Item *last) { | ||||
| 	if(!last) | ||||
| 		item = i; | ||||
| void | ||||
| appenditem(Item *i, Item **list, Item **last) { | ||||
| 	if(!(*last)) | ||||
| 		*list = i; | ||||
| 	else | ||||
| 		last->right = i; | ||||
| 	i->left = last; | ||||
| 		(*last)->right = i; | ||||
| 	i->left = *last; | ||||
| 	i->right = NULL; | ||||
| 	last = i; | ||||
| 	nitem++; | ||||
| 	return last; | ||||
| 	*last = i; | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | @ -521,19 +518,47 @@ kpress(XKeyEvent * e) { | |||
| void | ||||
| match(char *pattern) { | ||||
| 	unsigned int plen; | ||||
| 	Item *i, *j; | ||||
| 	Item *i, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend; | ||||
| 
 | ||||
| 	if(!pattern) | ||||
| 		return; | ||||
| 	plen = strlen(pattern); | ||||
| 	item = j = NULL; | ||||
| 	item = lexact = lprefix = lsubstr = itemend = exactend = prefixend = substrend = NULL; | ||||
| 	nitem = 0; | ||||
| 	for(i = allitems; i; i = i->next) | ||||
| 		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); | ||||
| 		if(!fstrncmp(pattern, i->text, plen + 1)) { | ||||
| 			appenditem(i, &lexact, &exactend); | ||||
| 			nitem++; | ||||
| 		} | ||||
| 		else if(!fstrncmp(pattern, i->text, plen)) { | ||||
| 			appenditem(i, &lprefix, &prefixend); | ||||
| 			nitem++; | ||||
| 		} | ||||
| 		else if(fstrstr(i->text, pattern)) { | ||||
| 			appenditem(i, &lsubstr, &substrend); | ||||
| 			nitem++; | ||||
| 		} | ||||
| 	if(lexact) { | ||||
| 		item = lexact; | ||||
| 		itemend = exactend; | ||||
| 	} | ||||
| 	if(lprefix) { | ||||
| 		if(itemend) { | ||||
| 			itemend->right - lprefix; | ||||
| 			lprefix->left = itemend; | ||||
| 		} | ||||
| 		else | ||||
| 			item = lprefix; | ||||
| 		itemend = prefixend; | ||||
| 	} | ||||
| 	if(lsubstr) { | ||||
| 		if(itemend) { | ||||
| 			itemend->right = lsubstr; | ||||
| 			lsubstr->left = itemend; | ||||
| 		} | ||||
| 		else | ||||
| 			item = lsubstr; | ||||
| 	} | ||||
| 	curr = prev = next = sel = item; | ||||
| 	calcoffsets(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue