Update dmenu to 5.2.

This commit is contained in:
Bartek Stalewski 2022-10-18 22:53:24 +02:00
parent 11bfdb58a1
commit 5e26689677
8 changed files with 1085 additions and 1086 deletions

View file

@ -30,7 +30,7 @@ extern char *argv0;
switch (argc_) switch (argc_)
#define ARGEND }\ #define ARGEND }\
} }
#define ARGC() argc_ #define ARGC() argc_

View file

@ -1,5 +1,5 @@
# dmenu version # dmenu version
VERSION = 5.1 VERSION = 5.2
# paths # paths
PREFIX = /usr/local PREFIX = /usr/local

View file

@ -58,14 +58,14 @@ static Clr *scheme[SchemeLast];
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr; static char *(*fstrstr)(const char *, const char *) = strstr;
static unsigned int static unsigned int
textw_clamp(const char *str, unsigned int n) textw_clamp(const char *str, unsigned int n)
{ {
unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad; unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad;
return MIN(w, n); return MIN(w, n);
} }
static void static void
appenditem(struct item *item, struct item **list, struct item **last) appenditem(struct item *item, struct item **list, struct item **last)
{ {
if (*last) if (*last)
@ -78,7 +78,7 @@ appenditem(struct item *item, struct item **list, struct item **last)
*last = item; *last = item;
} }
static void static void
calcoffsets(void) calcoffsets(void)
{ {
int i, n; int i, n;
@ -96,7 +96,7 @@ calcoffsets(void)
break; break;
} }
static int static int
max_textw(void) max_textw(void)
{ {
int len = 0; int len = 0;
@ -105,7 +105,7 @@ max_textw(void)
return len; return len;
} }
static void static void
cleanup(void) cleanup(void)
{ {
size_t i; size_t i;
@ -121,7 +121,7 @@ cleanup(void)
XCloseDisplay(dpy); XCloseDisplay(dpy);
} }
static char * static char *
cistrstr(const char *h, const char *n) cistrstr(const char *h, const char *n)
{ {
size_t i; size_t i;
@ -139,7 +139,7 @@ cistrstr(const char *h, const char *n)
return NULL; return NULL;
} }
static int static int
drawitem(struct item *item, int x, int y, int w) drawitem(struct item *item, int x, int y, int w)
{ {
if (item == sel) if (item == sel)
@ -152,7 +152,7 @@ drawitem(struct item *item, int x, int y, int w)
return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
} }
static void static void
drawmenu(void) drawmenu(void)
{ {
unsigned int curpos; unsigned int curpos;
@ -201,7 +201,7 @@ drawmenu(void)
drw_map(drw, win, 0, 0, mw, mh); drw_map(drw, win, 0, 0, mw, mh);
} }
static void static void
grabfocus(void) grabfocus(void)
{ {
struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 };
@ -218,7 +218,7 @@ grabfocus(void)
die("cannot grab focus"); die("cannot grab focus");
} }
static void static void
grabkeyboard(void) grabkeyboard(void)
{ {
struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 };
@ -236,7 +236,7 @@ grabkeyboard(void)
die("cannot grab keyboard"); die("cannot grab keyboard");
} }
static void static void
match(void) match(void)
{ {
static char **tokv = NULL; static char **tokv = NULL;
@ -290,7 +290,7 @@ match(void)
calcoffsets(); calcoffsets();
} }
static void static void
insert(const char *str, ssize_t n) insert(const char *str, ssize_t n)
{ {
if (strlen(text) + n > sizeof text - 1) if (strlen(text) + n > sizeof text - 1)
@ -303,7 +303,7 @@ insert(const char *str, ssize_t n)
match(); match();
} }
static size_t static size_t
nextrune(int inc) nextrune(int inc)
{ {
ssize_t n; ssize_t n;
@ -314,7 +314,7 @@ nextrune(int inc)
return n; return n;
} }
static void static void
movewordedge(int dir) movewordedge(int dir)
{ {
if (dir < 0) { /* move cursor to the start of the word*/ if (dir < 0) { /* move cursor to the start of the word*/
@ -330,7 +330,7 @@ movewordedge(int dir)
} }
} }
static void static void
keypress(XKeyEvent *ev) keypress(XKeyEvent *ev)
{ {
char buf[32]; char buf[32];
@ -526,9 +526,9 @@ insert:
case XK_Tab: case XK_Tab:
if (!sel) if (!sel)
return; return;
strncpy(text, sel->text, sizeof text - 1); cursor = strnlen(sel->text, sizeof text - 1);
text[sizeof text - 1] = '\0'; memcpy(text, sel->text, cursor);
cursor = strlen(text); text[cursor] = '\0';
match(); match();
break; break;
} }
@ -537,7 +537,7 @@ draw:
drawmenu(); drawmenu();
} }
static void static void
paste(void) paste(void)
{ {
char *p, *q; char *p, *q;
@ -555,21 +555,21 @@ paste(void)
drawmenu(); drawmenu();
} }
static void static void
readstdin(void) readstdin(void)
{ {
char buf[sizeof text], *p; char *line = NULL;
size_t i, size = 0; size_t i, junk, size = 0;
ssize_t len;
/* read each line from stdin and add it to the item list */ /* read each line from stdin and add it to the item list */
for (i = 0; fgets(buf, sizeof buf, stdin); i++) { for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
if (i + 1 >= size / sizeof *items) if (i + 1 >= size / sizeof *items)
if (!(items = realloc(items, (size += BUFSIZ)))) if (!(items = realloc(items, (size += BUFSIZ))))
die("cannot realloc %zu bytes:", size); die("cannot realloc %zu bytes:", size);
if ((p = strchr(buf, '\n'))) if (line[len - 1] == '\n')
*p = '\0'; line[len - 1] = '\0';
if (!(items[i].text = strdup(buf))) items[i].text = line;
die("cannot strdup %zu bytes:", strlen(buf) + 1);
items[i].out = 0; items[i].out = 0;
} }
if (items) if (items)
@ -577,7 +577,7 @@ readstdin(void)
lines = MIN(lines, i); lines = MIN(lines, i);
} }
static void static void
run(void) run(void)
{ {
XEvent ev; XEvent ev;
@ -615,7 +615,7 @@ run(void)
} }
} }
static void static void
setup(void) setup(void)
{ {
int x, y, i, j; int x, y, i, j;
@ -735,15 +735,14 @@ setup(void)
drawmenu(); drawmenu();
} }
static void static void
usage(void) usage(void)
{ {
fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
exit(1);
} }
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
XWindowAttributes wa; XWindowAttributes wa;

View file

@ -16,7 +16,7 @@ static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}
static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
static long static long
utf8decodebyte(const char c, size_t *i) utf8decodebyte(const char c, size_t *i)
{ {
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
@ -25,7 +25,7 @@ utf8decodebyte(const char c, size_t *i)
return 0; return 0;
} }
static size_t static size_t
utf8validate(long *u, size_t i) utf8validate(long *u, size_t i)
{ {
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
@ -35,7 +35,7 @@ utf8validate(long *u, size_t i)
return i; return i;
} }
static size_t static size_t
utf8decode(const char *c, long *u, size_t clen) utf8decode(const char *c, long *u, size_t clen)
{ {
size_t i, j, len, type; size_t i, j, len, type;
@ -60,7 +60,7 @@ utf8decode(const char *c, long *u, size_t clen)
return len; return len;
} }
Drw * Drw *
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
{ {
Drw *drw = ecalloc(1, sizeof(Drw)); Drw *drw = ecalloc(1, sizeof(Drw));
@ -77,7 +77,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
return drw; return drw;
} }
void void
drw_resize(Drw *drw, unsigned int w, unsigned int h) drw_resize(Drw *drw, unsigned int w, unsigned int h)
{ {
if (!drw) if (!drw)
@ -90,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
} }
void void
drw_free(Drw *drw) drw_free(Drw *drw)
{ {
XFreePixmap(drw->dpy, drw->drawable); XFreePixmap(drw->dpy, drw->drawable);
@ -102,7 +102,7 @@ drw_free(Drw *drw)
/* This function is an implementation detail. Library users should use /* This function is an implementation detail. Library users should use
* drw_fontset_create instead. * drw_fontset_create instead.
*/ */
static Fnt * static Fnt *
xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
{ {
Fnt *font; Fnt *font;
@ -142,7 +142,7 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
return font; return font;
} }
static void static void
xfont_free(Fnt *font) xfont_free(Fnt *font)
{ {
if (!font) if (!font)
@ -153,7 +153,7 @@ xfont_free(Fnt *font)
free(font); free(font);
} }
Fnt* Fnt*
drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
{ {
Fnt *cur, *ret = NULL; Fnt *cur, *ret = NULL;
@ -171,7 +171,7 @@ drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
return (drw->fonts = ret); return (drw->fonts = ret);
} }
void void
drw_fontset_free(Fnt *font) drw_fontset_free(Fnt *font)
{ {
if (font) { if (font) {
@ -180,7 +180,7 @@ drw_fontset_free(Fnt *font)
} }
} }
void void
drw_clr_create(Drw *drw, Clr *dest, const char *clrname) drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
{ {
if (!drw || !dest || !clrname) if (!drw || !dest || !clrname)
@ -194,7 +194,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
/* Wrapper to create color schemes. The caller has to call free(3) on the /* Wrapper to create color schemes. The caller has to call free(3) on the
* returned color scheme when done using it. */ * returned color scheme when done using it. */
Clr * Clr *
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
{ {
size_t i; size_t i;
@ -209,21 +209,21 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
return ret; return ret;
} }
void void
drw_setfontset(Drw *drw, Fnt *set) drw_setfontset(Drw *drw, Fnt *set)
{ {
if (drw) if (drw)
drw->fonts = set; drw->fonts = set;
} }
void void
drw_setscheme(Drw *drw, Clr *scm) drw_setscheme(Drw *drw, Clr *scm)
{ {
if (drw) if (drw)
drw->scheme = scm; drw->scheme = scm;
} }
void void
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
{ {
if (!drw || !drw->scheme) if (!drw || !drw->scheme)
@ -235,7 +235,7 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
} }
int int
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
{ {
int i, ty, ellipsis_x = 0; int i, ty, ellipsis_x = 0;
@ -355,7 +355,6 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
fcpattern = FcPatternDuplicate(drw->fonts->pattern); fcpattern = FcPatternDuplicate(drw->fonts->pattern);
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
FcDefaultSubstitute(fcpattern); FcDefaultSubstitute(fcpattern);
@ -385,7 +384,7 @@ no_match:
return x + (render ? w : 0); return x + (render ? w : 0);
} }
void void
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
{ {
if (!drw) if (!drw)
@ -395,7 +394,7 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
XSync(drw->dpy, False); XSync(drw->dpy, False);
} }
unsigned int unsigned int
drw_fontset_getwidth(Drw *drw, const char *text) drw_fontset_getwidth(Drw *drw, const char *text)
{ {
if (!drw || !drw->fonts || !text) if (!drw || !drw->fonts || !text)
@ -403,7 +402,7 @@ drw_fontset_getwidth(Drw *drw, const char *text)
return drw_text(drw, 0, 0, 0, 0, 0, text, 0); return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
} }
unsigned int unsigned int
drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
{ {
unsigned int tmp = 0; unsigned int tmp = 0;
@ -412,7 +411,7 @@ drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
return MIN(n, tmp); return MIN(n, tmp);
} }
void void
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
{ {
XGlyphInfo ext; XGlyphInfo ext;
@ -427,7 +426,7 @@ drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w,
*h = font->h; *h = font->h;
} }
Cur * Cur *
drw_cur_create(Drw *drw, int shape) drw_cur_create(Drw *drw, int shape)
{ {
Cur *cur; Cur *cur;
@ -440,7 +439,7 @@ drw_cur_create(Drw *drw, int shape)
return cur; return cur;
} }
void void
drw_cur_free(Drw *drw, Cur *cursor) drw_cur_free(Drw *drw, Cur *cursor)
{ {
if (!cursor) if (!cursor)

View file

@ -20,7 +20,7 @@ static int match = 0;
static int flag[26]; static int flag[26];
static struct stat old, new; static struct stat old, new;
static void static void
test(const char *path, const char *name) test(const char *path, const char *name)
{ {
struct stat st, ln; struct stat st, ln;
@ -48,7 +48,7 @@ test(const char *path, const char *name)
} }
} }
static void static void
usage(void) usage(void)
{ {
fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] "
@ -56,7 +56,7 @@ usage(void)
exit(2); /* like test(1) return > 1 on error */ exit(2); /* like test(1) return > 1 on error */
} }
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
struct dirent *d; struct dirent *d;

View file

@ -6,18 +6,9 @@
#include "util.h" #include "util.h"
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("calloc:");
return p;
}
void void
die(const char *fmt, ...) { die(const char *fmt, ...)
{
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
@ -33,3 +24,13 @@ die(const char *fmt, ...) {
exit(1); exit(1);
} }
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("calloc:");
return p;
}