1
0

no -m, cleanup

This commit is contained in:
Connor Lane Smith 2011-05-18 16:20:03 +01:00
parent 3a60b19514
commit bb3e33def3
3 changed files with 33 additions and 41 deletions

17
dmenu.1
View File

@ -8,8 +8,6 @@ dmenu \- dynamic menu
.RB [ \-i ] .RB [ \-i ]
.RB [ \-l .RB [ \-l
.IR lines ] .IR lines ]
.RB [ \-m
.IR monitor ]
.RB [ \-p .RB [ \-p
.IR prompt ] .IR prompt ]
.RB [ \-fn .RB [ \-fn
@ -58,9 +56,6 @@ dmenu matches menu items case insensitively.
.BI \-l " lines" .BI \-l " lines"
dmenu lists items vertically, with the given number of lines. dmenu lists items vertically, with the given number of lines.
.TP .TP
.BI \-m " monitor"
dmenu appears on the given Xinerama screen.
.TP
.BI \-p " prompt" .BI \-p " prompt"
defines the prompt to be displayed to the left of the input field. defines the prompt to be displayed to the left of the input field.
.TP .TP
@ -86,23 +81,23 @@ defines the selected foreground color.
prints version information to stdout, then exits. prints version information to stdout, then exits.
.SH USAGE .SH USAGE
dmenu is completely controlled by the keyboard. Besides standard Unix line 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: following keys are recognized:
.TP .TP
.B Tab (Control\-i) .B Tab (Ctrl\-i)
Copy the selected item to the input field. Copy the selected item to the input field.
.TP .TP
.B Return (Control\-j) .B Return (Ctrl\-j)
Confirm selection. Prints the selected item to stdout and exits, returning Confirm selection. Prints the selected item to stdout and exits, returning
success. success.
.TP .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. Confirm input. Prints the input text to stdout and exits, returning success.
.TP .TP
.B Escape (Control\-c) .B Escape (Ctrl\-c)
Exit without selecting an item, returning failure. Exit without selecting an item, returning failure.
.TP .TP
.B Control\-y .B Ctrl\-y
Paste the current X selection into the input field. Paste the current X selection into the input field.
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1) .BR dwm (1)

35
dmenu.c
View File

@ -36,13 +36,12 @@ static void paste(void);
static void readstdin(void); static void readstdin(void);
static void run(void); static void run(void);
static void setup(void); static void setup(void);
static void usage(void);
static char text[BUFSIZ] = ""; static char text[BUFSIZ] = "";
static int bh, mw, mh; static int bh, mw, mh;
static int inputw; static int inputw, promptw;
static int lines = 0; static int lines = 0;
static int monitor = -1;
static int promptw;
static size_t cursor = 0; static size_t cursor = 0;
static const char *font = NULL; static const char *font = NULL;
static const char *prompt = NULL; static const char *prompt = NULL;
@ -70,7 +69,7 @@ main(int argc, char *argv[]) {
for(i = 1; i < argc; i++) for(i = 1; i < argc; i++)
/* single flags */ /* single flags */
if(!strcmp(argv[i], "-v")) { 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); exit(EXIT_SUCCESS);
} }
else if(!strcmp(argv[i], "-b")) else if(!strcmp(argv[i], "-b"))
@ -80,12 +79,10 @@ main(int argc, char *argv[]) {
else if(!strcmp(argv[i], "-i")) else if(!strcmp(argv[i], "-i"))
fstrncmp = strncasecmp; fstrncmp = strncasecmp;
else if(i+1 == argc) else if(i+1 == argc)
goto usage; usage();
/* double flags */ /* double flags */
else if(!strcmp(argv[i], "-l")) else if(!strcmp(argv[i], "-l"))
lines = atoi(argv[++i]); lines = atoi(argv[++i]);
else if(!strcmp(argv[i], "-m"))
monitor = atoi(argv[++i]);
else if(!strcmp(argv[i], "-p")) else if(!strcmp(argv[i], "-p"))
prompt = argv[++i]; prompt = argv[++i];
else if(!strcmp(argv[i], "-fn")) else if(!strcmp(argv[i], "-fn"))
@ -99,7 +96,7 @@ main(int argc, char *argv[]) {
else if(!strcmp(argv[i], "-sf")) else if(!strcmp(argv[i], "-sf"))
selfgcolor = argv[++i]; selfgcolor = argv[++i];
else else
goto usage; usage();
dc = initdc(); dc = initdc();
initfont(dc, font); initfont(dc, font);
@ -114,12 +111,8 @@ main(int argc, char *argv[]) {
} }
setup(); setup();
run(); run();
return EXIT_FAILURE;
usage: return EXIT_FAILURE; /* should not reach */
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;
} }
void void
@ -452,7 +445,7 @@ readstdin(void) {
char buf[sizeof text], *p, *maxstr = NULL; char buf[sizeof text], *p, *maxstr = NULL;
size_t i, max = 0, size = 0; 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(i+1 >= size / sizeof *items)
if(!(items = realloc(items, (size += BUFSIZ)))) if(!(items = realloc(items, (size += BUFSIZ))))
eprintf("cannot realloc %u bytes:", size); eprintf("cannot realloc %u bytes:", size);
@ -463,6 +456,8 @@ readstdin(void) {
if(strlen(items[i].text) > max) if(strlen(items[i].text) > max)
max = strlen(maxstr = items[i].text); max = strlen(maxstr = items[i].text);
} }
if(items)
items[i].text = NULL;
inputw = maxstr ? textw(dc, maxstr) : 0; inputw = maxstr ? textw(dc, maxstr) : 0;
} }
@ -519,8 +514,7 @@ setup(void) {
XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du); XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);
for(i = 0; i < n-1; i++) for(i = 0; i < n-1; i++)
if((monitor == info[i].screen_number) if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))
|| (monitor < 0 && INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)))
break; break;
x = info[i].x_org; x = info[i].x_org;
y = info[i].y_org + (topbar ? 0 : info[i].height - mh); 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; y = topbar ? 0 : DisplayHeight(dc->dpy, screen) - mh;
mw = DisplayWidth(dc->dpy, screen); mw = DisplayWidth(dc->dpy, screen);
} }
inputw = MIN(inputw, mw/3);
promptw = prompt ? textw(dc, prompt) : 0; promptw = prompt ? textw(dc, prompt) : 0;
inputw = MIN(inputw, mw/3);
match(False); match(False);
/* menu window */ /* menu window */
@ -551,3 +545,10 @@ setup(void) {
resizedc(dc, mw, mh); resizedc(dc, mw, mh);
drawmenu(); 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);
}

22
draw.c
View File

@ -9,21 +9,17 @@
#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(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); static Bool loadfont(DC *dc, const char *fontstr);
void void
drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) { 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); 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 void
@ -65,7 +61,7 @@ eprintf(const char *fmt, ...) {
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
va_end(ap); va_end(ap);
if(fmt[strlen(fmt)-1] == ':') { if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr); fputc(' ', stderr);
perror(NULL); perror(NULL);
} }
@ -113,11 +109,11 @@ initdc(void) {
void void
initfont(DC *dc, const char *fontstr) { initfont(DC *dc, const char *fontstr) {
if(!loadfont(dc, fontstr ? fontstr : DEFFONT)) { if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {
if(fontstr != NULL) if(fontstr != NULL)
fprintf(stderr, "cannot load font '%s'\n", fontstr); fprintf(stderr, "cannot load font '%s'\n", fontstr);
if(fontstr == NULL || !loadfont(dc, DEFFONT)) if(fontstr == NULL || !loadfont(dc, DEFAULTFN))
eprintf("cannot load font '%s'\n", DEFFONT); eprintf("cannot load font '%s'\n", DEFAULTFN);
} }
dc->font.height = dc->font.ascent + dc->font.descent; dc->font.height = dc->font.ascent + dc->font.descent;
} }