efficient incremental search
							parent
							
								
									4776d6dc61
								
							
						
					
					
						commit
						4354074607
					
				
							
								
								
									
										37
									
								
								dmenu.c
								
								
								
								
							
							
						
						
									
										37
									
								
								dmenu.c
								
								
								
								
							|  | @ -27,9 +27,9 @@ static void calcoffsets(void); | |||
| static void drawmenu(void); | ||||
| static char *fstrstr(const char *s, const char *sub); | ||||
| static void grabkeyboard(void); | ||||
| static void insert(const char *s, ssize_t n); | ||||
| static void insert(const char *str, ssize_t n); | ||||
| static void keypress(XKeyEvent *ev); | ||||
| static void match(void); | ||||
| static void match(Bool sub); | ||||
| static size_t nextrune(int incr); | ||||
| static void paste(void); | ||||
| static void readstdin(void); | ||||
|  | @ -218,14 +218,14 @@ grabkeyboard(void) { | |||
| } | ||||
| 
 | ||||
| void | ||||
| insert(const char *s, ssize_t n) { | ||||
| insert(const char *str, ssize_t n) { | ||||
| 	if(strlen(text) + n > sizeof text - 1) | ||||
| 		return; | ||||
| 	memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); | ||||
| 	if(n > 0) | ||||
| 		memcpy(&text[cursor], s, n); | ||||
| 		memcpy(&text[cursor], str, n); | ||||
| 	cursor += n; | ||||
| 	match(); | ||||
| 	match(n > 0); | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | @ -269,7 +269,7 @@ keypress(XKeyEvent *ev) { | |||
| 			break; | ||||
| 		case XK_k:  /* delete right */ | ||||
| 			text[cursor] = '\0'; | ||||
| 			match(); | ||||
| 			match(False); | ||||
| 			break; | ||||
| 		case XK_n: | ||||
| 			ksym = XK_Down; | ||||
|  | @ -375,30 +375,31 @@ keypress(XKeyEvent *ev) { | |||
| 			return; | ||||
| 		strncpy(text, sel->text, sizeof text); | ||||
| 		cursor = strlen(text); | ||||
| 		match(); | ||||
| 		match(True); | ||||
| 		break; | ||||
| 	} | ||||
| 	drawmenu(); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| match(void) { | ||||
| match(Bool sub) { | ||||
| 	size_t len = strlen(text); | ||||
| 	Item *item, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend; | ||||
| 	Item *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend; | ||||
| 	Item *item, *next = NULL; | ||||
| 
 | ||||
| 	matches = lexact = lprefix = lsubstr = matchend = exactend = prefixend = substrend = NULL; | ||||
| 	for(item = items; item && item->text; item++) | ||||
| 	lexact = lprefix = lsubstr = exactend = prefixend = substrend = NULL; | ||||
| 	for(item = sub ? matches : items; item && item->text; item = next) { | ||||
| 		next = sub ? item->right : item + 1; | ||||
| 		if(!fstrncmp(text, item->text, len + 1)) | ||||
| 			appenditem(item, &lexact, &exactend); | ||||
| 		else if(!fstrncmp(text, item->text, len)) | ||||
| 			appenditem(item, &lprefix, &prefixend); | ||||
| 		else if(fstrstr(item->text, text)) | ||||
| 			appenditem(item, &lsubstr, &substrend); | ||||
| 
 | ||||
| 	if(lexact) { | ||||
| 		matches = lexact; | ||||
| 		matchend = exactend; | ||||
| 	} | ||||
| 	matches = lexact; | ||||
| 	matchend = exactend; | ||||
| 
 | ||||
| 	if(lprefix) { | ||||
| 		if(matchend) { | ||||
| 			matchend->right = lprefix; | ||||
|  | @ -498,8 +499,8 @@ setup(void) { | |||
| 
 | ||||
| 	normcol[ColBG] = getcolor(dc, normbgcolor); | ||||
| 	normcol[ColFG] = getcolor(dc, normfgcolor); | ||||
| 	selcol[ColBG] = getcolor(dc, selbgcolor); | ||||
| 	selcol[ColFG] = getcolor(dc, selfgcolor); | ||||
| 	selcol[ColBG]  = getcolor(dc, selbgcolor); | ||||
| 	selcol[ColFG]  = getcolor(dc, selfgcolor); | ||||
| 
 | ||||
| 	utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False); | ||||
| 
 | ||||
|  | @ -532,7 +533,7 @@ setup(void) { | |||
| 	} | ||||
| 	inputw = MIN(inputw, mw/3); | ||||
| 	promptw = prompt ? textw(dc, prompt) : 0; | ||||
| 	match(); | ||||
| 	match(False); | ||||
| 
 | ||||
| 	/* menu window */ | ||||
| 	wa.override_redirect = True; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue