diff options
| -rw-r--r-- | dmenu.1 | 17 | ||||
| -rw-r--r-- | dmenu.c | 35 | ||||
| -rw-r--r-- | draw.c | 22 | 
3 files changed, 33 insertions, 41 deletions
| @@ -8,8 +8,6 @@ dmenu \- dynamic menu  .RB [ \-i ]  .RB [ \-l  .IR lines ] -.RB [ \-m -.IR monitor ]  .RB [ \-p  .IR prompt ]  .RB [ \-fn @@ -58,9 +56,6 @@ dmenu matches menu items case insensitively.  .BI \-l " lines"  dmenu lists items vertically, with the given number of lines.  .TP -.BI \-m " monitor" -dmenu appears on the given Xinerama screen. -.TP  .BI \-p " prompt"  defines the prompt to be displayed to the left of the input field.  .TP @@ -86,23 +81,23 @@ defines the selected foreground color.  prints version information to stdout, then exits.  .SH USAGE  dmenu is completely controlled by the keyboard.  Besides standard Unix line -editing and item selection (Up/Down/Left/Right, PageUp/PageDown, Home/End), the +editing and item selection (arrow keys, page up/down, home and end), the  following keys are recognized:  .TP -.B Tab (Control\-i) +.B Tab (Ctrl\-i)  Copy the selected item to the input field.  .TP -.B Return (Control\-j) +.B Return (Ctrl\-j)  Confirm selection.  Prints the selected item to stdout and exits, returning  success.  .TP -.B Shift\-Return (Control\-Shift\-j) +.B Shift\-Return (Ctrl\-Shift\-j)  Confirm input.  Prints the input text to stdout and exits, returning success.  .TP -.B Escape (Control\-c) +.B Escape (Ctrl\-c)  Exit without selecting an item, returning failure.  .TP -.B Control\-y +.B Ctrl\-y  Paste the current X selection into the input field.  .SH SEE ALSO  .BR dwm (1) @@ -36,13 +36,12 @@ static void paste(void);  static void readstdin(void);  static void run(void);  static void setup(void); +static void usage(void);  static char text[BUFSIZ] = "";  static int bh, mw, mh; -static int inputw; +static int inputw, promptw;  static int lines = 0; -static int monitor = -1; -static int promptw;  static size_t cursor = 0;  static const char *font = NULL;  static const char *prompt = NULL; @@ -70,7 +69,7 @@ main(int argc, char *argv[]) {  	for(i = 1; i < argc; i++)  		/* single flags */  		if(!strcmp(argv[i], "-v")) { -			fputs("dmenu-"VERSION", © 2006-2011 dmenu engineers, see LICENSE for details\n", stdout); +			puts("dmenu-"VERSION", © 2006-2011 dmenu engineers, see LICENSE for details");  			exit(EXIT_SUCCESS);  		}  		else if(!strcmp(argv[i], "-b")) @@ -80,12 +79,10 @@ main(int argc, char *argv[]) {  		else if(!strcmp(argv[i], "-i"))  			fstrncmp = strncasecmp;  		else if(i+1 == argc) -			goto usage; +			usage();  		/* double flags */  		else if(!strcmp(argv[i], "-l"))  			lines = atoi(argv[++i]); -		else if(!strcmp(argv[i], "-m")) -			monitor = atoi(argv[++i]);  		else if(!strcmp(argv[i], "-p"))  			prompt = argv[++i];  		else if(!strcmp(argv[i], "-fn")) @@ -99,7 +96,7 @@ main(int argc, char *argv[]) {  		else if(!strcmp(argv[i], "-sf"))  			selfgcolor = argv[++i];  		else -			goto usage; +			usage();  	dc = initdc();  	initfont(dc, font); @@ -114,12 +111,8 @@ main(int argc, char *argv[]) {  	}  	setup();  	run(); -	return EXIT_FAILURE; -usage: -	fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-m monitor] [-p prompt] [-fn font]\n" -	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr); -	return EXIT_FAILURE; +	return EXIT_FAILURE;  /* should not reach */  }  void @@ -452,7 +445,7 @@ readstdin(void) {  	char buf[sizeof text], *p, *maxstr = NULL;  	size_t i, max = 0, size = 0; -	for(i = 0; fgets(buf, sizeof buf, stdin); items[++i].text = NULL) { +	for(i = 0; fgets(buf, sizeof buf, stdin); i++) {  		if(i+1 >= size / sizeof *items)  			if(!(items = realloc(items, (size += BUFSIZ))))  				eprintf("cannot realloc %u bytes:", size); @@ -463,6 +456,8 @@ readstdin(void) {  		if(strlen(items[i].text) > max)  			max = strlen(maxstr = items[i].text);  	} +	if(items) +		items[i].text = NULL;  	inputw = maxstr ? textw(dc, maxstr) : 0;  } @@ -519,8 +514,7 @@ setup(void) {  		XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);  		for(i = 0; i < n-1; i++) -			if((monitor == info[i].screen_number) -			|| (monitor < 0 && INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))) +			if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))  				break;  		x = info[i].x_org;  		y = info[i].y_org + (topbar ? 0 : info[i].height - mh); @@ -534,8 +528,8 @@ setup(void) {  		y = topbar ? 0 : DisplayHeight(dc->dpy, screen) - mh;  		mw = DisplayWidth(dc->dpy, screen);  	} -	inputw = MIN(inputw, mw/3);  	promptw = prompt ? textw(dc, prompt) : 0; +	inputw = MIN(inputw, mw/3);  	match(False);  	/* menu window */ @@ -551,3 +545,10 @@ setup(void) {  	resizedc(dc, mw, mh);  	drawmenu();  } + +void +usage(void) { +	fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font]\n" +	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr); +	exit(EXIT_FAILURE); +} @@ -9,21 +9,17 @@  #define MAX(a, b)  ((a) > (b) ? (a) : (b))  #define MIN(a, b)  ((a) < (b) ? (a) : (b)) -#define DEFFONT    "fixed" +#define DEFAULTFN  "fixed"  static Bool loadfont(DC *dc, const char *fontstr);  void  drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) { -	XRectangle r; - -	r.x = dc->x + x; -	r.y = dc->y + y; -	r.width  = fill ? w : w-1; -	r.height = fill ? h : h-1; -  	XSetForeground(dc->dpy, dc->gc, color); -	(fill ? XFillRectangles : XDrawRectangles)(dc->dpy, dc->canvas, dc->gc, &r, 1); +	if(fill) +		XFillRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w, h); +	else +		XDrawRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w-1, h-1);  }  void @@ -65,7 +61,7 @@ eprintf(const char *fmt, ...) {  	vfprintf(stderr, fmt, ap);  	va_end(ap); -	if(fmt[strlen(fmt)-1] == ':') { +	if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {  		fputc(' ', stderr);  		perror(NULL);  	} @@ -113,11 +109,11 @@ initdc(void) {  void  initfont(DC *dc, const char *fontstr) { -	if(!loadfont(dc, fontstr ? fontstr : DEFFONT)) { +	if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {  		if(fontstr != NULL)  			fprintf(stderr, "cannot load font '%s'\n", fontstr); -		if(fontstr == NULL || !loadfont(dc, DEFFONT)) -			eprintf("cannot load font '%s'\n", DEFFONT); +		if(fontstr == NULL || !loadfont(dc, DEFAULTFN)) +			eprintf("cannot load font '%s'\n", DEFAULTFN);  	}  	dc->font.height = dc->font.ascent + dc->font.descent;  } | 
