| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -34,6 +34,7 @@ static void calcoffsetsh(void); | 
															
														
														
													
														
															
																 | 
																 | 
																static void calcoffsetsv(void); | 
																 | 
																 | 
																static void calcoffsetsv(void); | 
															
														
														
													
														
															
																 | 
																 | 
																static char *cistrstr(const char *s, const char *sub); | 
																 | 
																 | 
																static char *cistrstr(const char *s, const char *sub); | 
															
														
														
													
														
															
																 | 
																 | 
																static void cleanup(void); | 
																 | 
																 | 
																static void cleanup(void); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static void dinput(void); | 
															
														
														
													
														
															
																 | 
																 | 
																static void drawmenu(void); | 
																 | 
																 | 
																static void drawmenu(void); | 
															
														
														
													
														
															
																 | 
																 | 
																static void drawmenuh(void); | 
																 | 
																 | 
																static void drawmenuh(void); | 
															
														
														
													
														
															
																 | 
																 | 
																static void drawmenuv(void); | 
																 | 
																 | 
																static void drawmenuv(void); | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -89,28 +90,25 @@ void | 
															
														
														
													
														
															
																 | 
																 | 
																calcoffsetsh(void) { | 
																 | 
																 | 
																calcoffsetsh(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int w; | 
																 | 
																 | 
																	unsigned int w; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!curr) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		return; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	w = promptw + cmdw + 2 * spaceitem; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	for(next = curr; next && w < mw; next=next->right) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		w += MIN(textw(next->text), mw / 3); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	w = promptw + cmdw + 2 * spaceitem; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	for(prev = curr; prev && prev->left && w < mw; prev=prev->left) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		w += MIN(textw(prev->left->text), mw / 3); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	w = promptw + cmdw + (2 * spaceitem); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	for(next = curr; next; next = next->right) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if((w += MIN(textw(next->text), mw / 3)) > mw) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	w = promptw + cmdw + (2 * spaceitem); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	for(prev = curr; prev && prev->left; prev = prev->left) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if((w += MIN(textw(prev->left->text), mw / 3)) > mw) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																void | 
																 | 
																 | 
																void | 
															
														
														
													
														
															
																 | 
																 | 
																calcoffsetsv(void) { | 
																 | 
																 | 
																calcoffsetsv(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																	unsigned int h; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	unsigned int i; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!curr) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		return; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	h = (dc.font.height + 2) * lines; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	for(next = curr; next && h > 0; next = next->right) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		h -= dc.font.height + 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	h = (dc.font.height + 2) * lines; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	for(prev = curr; prev && prev->left && h > 0; prev = prev->left) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		h -= dc.font.height + 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	next = prev = curr; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	for(i = 0; i < lines && next; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		next = next->right; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	for(i = 0; i < lines && prev && prev->left; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		prev = prev->left; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																char * | 
																 | 
																 | 
																char * | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -150,6 +148,13 @@ cleanup(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																	XUngrabKeyboard(dpy, CurrentTime); | 
																 | 
																 | 
																	XUngrabKeyboard(dpy, CurrentTime); | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																void | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																dinput(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	cleanup(); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	execlp("dinput", "dinput", text, NULL); /* todo: argv */ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	eprint("cannot exec dinput\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																void | 
																 | 
																 | 
																void | 
															
														
														
													
														
															
																 | 
																 | 
																drawmenu(void) { | 
																 | 
																 | 
																drawmenu(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																	dc.x = 0; | 
																 | 
																 | 
																	dc.x = 0; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -290,8 +295,7 @@ kpress(XKeyEvent * e) { | 
															
														
														
													
														
															
																 | 
																 | 
																			match(text); | 
																 | 
																 | 
																			match(text); | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																		case XK_x: | 
																 | 
																 | 
																		case XK_x: | 
															
														
														
													
														
															
																 | 
																 | 
																			execlp("dinput", "dinput", text, NULL); /* todo: argv */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			eprint("dmenu: cannot exec dinput:"); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			dinput(); | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -369,10 +373,9 @@ kpress(XKeyEvent * e) { | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																		break; | 
																 | 
																 | 
																		break; | 
															
														
														
													
														
															
																 | 
																 | 
																	case XK_Tab: | 
																 | 
																 | 
																	case XK_Tab: | 
															
														
														
													
														
															
																 | 
																 | 
																		if(!sel) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			return; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		strncpy(text, sel->text, sizeof text); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		match(text); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if(sel) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			strncpy(text, sel->text, sizeof text); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		dinput(); | 
															
														
														
													
														
															
																 | 
																 | 
																		break; | 
																 | 
																 | 
																		break; | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
														
															
																 | 
																 | 
																	drawmenu(); | 
																 | 
																 | 
																	drawmenu(); | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -431,11 +434,11 @@ readstdin(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																		if(buf[len-1] == '\n') | 
																 | 
																 | 
																		if(buf[len-1] == '\n') | 
															
														
														
													
														
															
																 | 
																 | 
																			buf[--len] = '\0'; | 
																 | 
																 | 
																			buf[--len] = '\0'; | 
															
														
														
													
														
															
																 | 
																 | 
																		if(!(p = strdup(buf))) | 
																 | 
																 | 
																		if(!(p = strdup(buf))) | 
															
														
														
													
														
															
																 | 
																 | 
																			eprint("dmenu: cannot strdup %u bytes\n", len); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			eprint("cannot strdup %u bytes\n", len); | 
															
														
														
													
														
															
																 | 
																 | 
																		if((max = MAX(max, len)) == len) | 
																 | 
																 | 
																		if((max = MAX(max, len)) == len) | 
															
														
														
													
														
															
																 | 
																 | 
																			maxname = p; | 
																 | 
																 | 
																			maxname = p; | 
															
														
														
													
														
															
																 | 
																 | 
																		if(!(new = malloc(sizeof *new))) | 
																 | 
																 | 
																		if(!(new = malloc(sizeof *new))) | 
															
														
														
													
														
															
																 | 
																 | 
																			eprint("dmenu: cannot malloc %u bytes\n", sizeof *new); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			eprint("cannot malloc %u bytes\n", sizeof *new); | 
															
														
														
													
														
															
																 | 
																 | 
																		new->next = new->left = new->right = NULL; | 
																 | 
																 | 
																		new->next = new->left = new->right = NULL; | 
															
														
														
													
														
															
																 | 
																 | 
																		new->text = p; | 
																 | 
																 | 
																		new->text = p; | 
															
														
														
													
														
															
																 | 
																 | 
																		if(!i) | 
																 | 
																 | 
																		if(!i) | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -544,6 +547,7 @@ main(int argc, char *argv[]) { | 
															
														
														
													
														
															
																 | 
																 | 
																	Bool topbar = True; | 
																 | 
																 | 
																	Bool topbar = True; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																	/* command line args */ | 
																 | 
																 | 
																	/* command line args */ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	progname = argv[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																	for(i = 1; i < argc; i++) | 
																 | 
																 | 
																	for(i = 1; i < argc; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																		if(!strcmp(argv[i], "-i")) { | 
																 | 
																 | 
																		if(!strcmp(argv[i], "-i")) { | 
															
														
														
													
														
															
																 | 
																 | 
																			fstrncmp = strncasecmp; | 
																 | 
																 | 
																			fstrncmp = strncasecmp; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -585,7 +589,7 @@ main(int argc, char *argv[]) { | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | 
																 | 
																 | 
																	if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | 
															
														
														
													
														
															
																 | 
																 | 
																		fprintf(stderr, "dmenu: warning: no locale support\n"); | 
																 | 
																 | 
																		fprintf(stderr, "dmenu: warning: no locale support\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!(dpy = XOpenDisplay(NULL))) | 
																 | 
																 | 
																	if(!(dpy = XOpenDisplay(NULL))) | 
															
														
														
													
														
															
																 | 
																 | 
																		eprint("dmenu: cannot open display\n"); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		eprint("cannot open display\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																	screen = DefaultScreen(dpy); | 
																 | 
																 | 
																	screen = DefaultScreen(dpy); | 
															
														
														
													
														
															
																 | 
																 | 
																	if(!parent) | 
																 | 
																 | 
																	if(!parent) | 
															
														
														
													
														
															
																 | 
																 | 
																		parent = RootWindow(dpy, screen); | 
																 | 
																 | 
																		parent = RootWindow(dpy, screen); | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
  |