applied Connor's next nice patch, thanks a lot!
							parent
							
								
									8e3e61170b
								
							
						
					
					
						commit
						eededaa76f
					
				
							
								
								
									
										63
									
								
								dmenu.c
								
								
								
								
							
							
						
						
									
										63
									
								
								dmenu.c
								
								
								
								
							| 
						 | 
				
			
			@ -52,6 +52,7 @@ static void calcoffsetsh(void);
 | 
			
		|||
static void calcoffsetsv(void);
 | 
			
		||||
static char *cistrstr(const char *s, const char *sub);
 | 
			
		||||
static void cleanup(void);
 | 
			
		||||
static void drawcursor(void);
 | 
			
		||||
static void drawmenu(void);
 | 
			
		||||
static void drawmenuh(void);
 | 
			
		||||
static void drawmenuv(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -247,9 +248,7 @@ drawmenuh(void) {
 | 
			
		|||
	dc.x += dc.w;
 | 
			
		||||
	/* determine maximum items */
 | 
			
		||||
	for(i = curr; i != next; i=i->right) {
 | 
			
		||||
		dc.w = textw(i->text);
 | 
			
		||||
		if(dc.w > mw / 3)
 | 
			
		||||
			dc.w = mw / 3;
 | 
			
		||||
		dc.w = MIN(textw(i->text), mw / 3);
 | 
			
		||||
		drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
 | 
			
		||||
		dc.x += dc.w;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -395,7 +394,8 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		switch (ksym) {
 | 
			
		||||
		default:	/* ignore other control sequences */
 | 
			
		||||
			return;
 | 
			
		||||
		case XK_bracketleft:
 | 
			
		||||
		case XK_c:
 | 
			
		||||
		case XK_C:
 | 
			
		||||
			ksym = XK_Escape;
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_h:
 | 
			
		||||
| 
						 | 
				
			
			@ -414,18 +414,16 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		case XK_U:
 | 
			
		||||
			text[0] = 0;
 | 
			
		||||
			match(text);
 | 
			
		||||
			drawmenu();
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_w:
 | 
			
		||||
		case XK_W:
 | 
			
		||||
			if(len) {
 | 
			
		||||
				i = len - 1;
 | 
			
		||||
				while(i >= 0 && text[i] == ' ')
 | 
			
		||||
					text[i--] = 0;
 | 
			
		||||
				while(i >= 0 && text[i] != ' ')
 | 
			
		||||
					text[i--] = 0;
 | 
			
		||||
			if(cursor > 0) {
 | 
			
		||||
				i = cursor;
 | 
			
		||||
				while(i-- > 0 && text[i] == ' ');
 | 
			
		||||
				while(i-- > 0 && text[i] != ' ');
 | 
			
		||||
				memmove(text + i + 1, text + cursor, sizeof text - cursor);
 | 
			
		||||
				cursor = i + 1;
 | 
			
		||||
				match(text);
 | 
			
		||||
				drawmenu();
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -473,14 +471,14 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		num = MIN(num, sizeof text - cursor);
 | 
			
		||||
		if(num && !iscntrl((int) buf[0])) {
 | 
			
		||||
			memmove(text + cursor + num, text + cursor, sizeof text - cursor - num);
 | 
			
		||||
			memmove(text + cursor, buf, num);
 | 
			
		||||
			memcpy(text + cursor, buf, num);
 | 
			
		||||
			cursor+=num;
 | 
			
		||||
			match(text);
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case XK_BackSpace:
 | 
			
		||||
		if(cursor > 0) {
 | 
			
		||||
			memmove(text + cursor + -1, text + cursor, sizeof text - cursor);
 | 
			
		||||
			memmove(text + cursor - 1, text + cursor, sizeof text - cursor + 1);
 | 
			
		||||
			cursor--;
 | 
			
		||||
			match(text);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -490,8 +488,10 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		match(text);
 | 
			
		||||
		break;
 | 
			
		||||
	case XK_End:
 | 
			
		||||
		if(!item)
 | 
			
		||||
			return;
 | 
			
		||||
		if(cursor < len) {
 | 
			
		||||
			cursor = len;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		while(next) {
 | 
			
		||||
			sel = curr = next;
 | 
			
		||||
			calcoffsets();
 | 
			
		||||
| 
						 | 
				
			
			@ -504,8 +504,10 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		running = False;
 | 
			
		||||
		break;
 | 
			
		||||
	case XK_Home:
 | 
			
		||||
		if(!item)
 | 
			
		||||
			return;
 | 
			
		||||
		if(sel == item) {
 | 
			
		||||
			cursor = 0;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		sel = curr = item;
 | 
			
		||||
		calcoffsets();
 | 
			
		||||
		break;
 | 
			
		||||
| 
						 | 
				
			
			@ -536,12 +538,10 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		calcoffsets();
 | 
			
		||||
		break;
 | 
			
		||||
	case XK_Return:
 | 
			
		||||
		if((e->state & ShiftMask) && *text)
 | 
			
		||||
		if((e->state & ShiftMask) || !sel)
 | 
			
		||||
			fprintf(stdout, "%s", text);
 | 
			
		||||
		else if(sel)
 | 
			
		||||
		else
 | 
			
		||||
			fprintf(stdout, "%s", sel->text);
 | 
			
		||||
		else if(*text)
 | 
			
		||||
			fprintf(stdout, "%s", text);
 | 
			
		||||
		fflush(stdout);
 | 
			
		||||
		running = False;
 | 
			
		||||
		break;
 | 
			
		||||
| 
						 | 
				
			
			@ -567,9 +567,6 @@ kpress(XKeyEvent * e) {
 | 
			
		|||
		match(text);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	len = strlen(text);
 | 
			
		||||
	cursor = MIN(cursor, len);
 | 
			
		||||
	cursor = MAX(cursor, 0);
 | 
			
		||||
	drawmenu();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -620,13 +617,13 @@ readstdin(void) {
 | 
			
		|||
	unsigned int len = 0, max = 0;
 | 
			
		||||
	Item *i, *new;
 | 
			
		||||
 | 
			
		||||
	i = 0;
 | 
			
		||||
	i = NULL;
 | 
			
		||||
	while(fgets(buf, sizeof buf, stdin)) {
 | 
			
		||||
		len = strlen(buf);
 | 
			
		||||
		if(buf[len-1] == '\n')
 | 
			
		||||
			buf[len - 1] = 0;
 | 
			
		||||
			buf[--len] = '\0';
 | 
			
		||||
		if(!(p = strdup(buf)))
 | 
			
		||||
			eprint("fatal: could not strdup() %u bytes\n", strlen(buf));
 | 
			
		||||
			eprint("fatal: could not strdup() %u bytes\n", len);
 | 
			
		||||
		if(max < len) {
 | 
			
		||||
			maxname = p;
 | 
			
		||||
			max = len;
 | 
			
		||||
| 
						 | 
				
			
			@ -734,13 +731,9 @@ setup(Bool topbar) {
 | 
			
		|||
	if(!dc.font.set)
 | 
			
		||||
		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
 | 
			
		||||
	if(maxname)
 | 
			
		||||
		cmdw = textw(maxname);
 | 
			
		||||
	if(cmdw > mw / 3)
 | 
			
		||||
		cmdw = mw / 3;
 | 
			
		||||
		cmdw = MIN(textw(maxname), mw / 3);
 | 
			
		||||
	if(prompt)
 | 
			
		||||
		promptw = textw(prompt);
 | 
			
		||||
	if(promptw > mw / 5)
 | 
			
		||||
		promptw = mw / 5;
 | 
			
		||||
		promptw = MIN(textw(prompt), mw / 5);
 | 
			
		||||
	text[0] = 0;
 | 
			
		||||
	match(text);
 | 
			
		||||
	XMapRaised(dpy, win);
 | 
			
		||||
| 
						 | 
				
			
			@ -799,7 +792,7 @@ main(int argc, char *argv[]) {
 | 
			
		|||
			if(++i < argc) selfgcolor = argv[i];
 | 
			
		||||
		}
 | 
			
		||||
		else if(!strcmp(argv[i], "-v"))
 | 
			
		||||
			eprint("dmenu-"VERSION", © 2006-2009 dmenu engineers, see LICENSE for details\n");
 | 
			
		||||
			eprint("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n");
 | 
			
		||||
		else
 | 
			
		||||
			eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n"
 | 
			
		||||
			       "             [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue