diff options
| -rw-r--r-- | dmenu.c | 65 | 
1 files changed, 29 insertions, 36 deletions
| @@ -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; +		if(buf[len-1] == '\n') +			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"); | 
