commit - 3a60b19514705f7f61908fd727d2e69565ee1947
commit + bb3e33def3e5156594ac59b75dc52798accbebcd
blob - e5aa8cd653048c188423e6f09f0685be1ed5e09d
blob + 8295d17a28be76753a3f2e0f43daf493e1600432
--- dmenu.1
+++ dmenu.1
.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)
blob - c4b79081a835b09572ad10597358ce57dfca8a7c
blob + da6270583fa31765817228279ad7aea3e65ae71e
--- dmenu.c
+++ dmenu.c
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);
+}
blob - 351a43da6cf49d0cdddd947740ac157986a284d1
blob + f952b534f89d6bea5303e560cc139e86ea0b8f63
--- draw.c
+++ draw.c
#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;
}