.RB [ \-i ]
.RB [ \-l
.IR lines ]
-.RB [ \-m
-.IR monitor ]
.RB [ \-p
.IR prompt ]
.RB [ \-fn
.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
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)
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;
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"))
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"))
else if(!strcmp(argv[i], "-sf"))
selfgcolor = argv[++i];
else
- goto usage;
+ usage();
dc = initdc();
initfont(dc, font);
}
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
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);
if(strlen(items[i].text) > max)
max = strlen(maxstr = items[i].text);
}
+ if(items)
+ items[i].text = NULL;
inputw = maxstr ? textw(dc, maxstr) : 0;
}
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);
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 */
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);
+}
#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
vfprintf(stderr, fmt, ap);
va_end(ap);
- if(fmt[strlen(fmt)-1] == ':') {
+ if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr);
perror(NULL);
}
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;
}