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