dmenu

Dmenu fork with patches: numbers, nonblocking_stdin, height, input_text
git clone http://milesalan.com/git/dmenu
Log | Files | Refs | Mirror | README | LICENSE

commit 6c1d0e4d60b239e9533def6feaf8eb2138858c3e
parent 6efe1932be9425896c34f54501a6194286dd0503
Author: Connor Lane Smith <cls@lubutu.com>
Date:   Thu, 24 Jun 2010 14:22:34 +0100

fixed offsets, updated eprint, cleaned up
Diffstat:
Mdinput.c | 5+++--
Mdmenu.c | 56++++++++++++++++++++++++++++++--------------------------
Mdraw.c | 12++++++++----
Mdraw.h | 2+-
4 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/dinput.c b/dinput.c @@ -164,7 +164,7 @@ kpress(XKeyEvent * e) { FILE *fp; char *s; if(!(fp = popen("sselp", "r"))) - eprint("dinput: cannot popen sselp\n"); + eprint("cannot popen sselp\n"); s = fgets(buf, sizeof buf, fp); pclose(fp); if(s == NULL) @@ -322,6 +322,7 @@ main(int argc, char *argv[]) { Bool topbar = True; /* command line args */ + progname = argv[0]; for(i = 1; i < argc; i++) if(!strcmp(argv[i], "-b")) topbar = False; @@ -356,7 +357,7 @@ main(int argc, char *argv[]) { if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "dinput: warning: no locale support\n"); if(!(dpy = XOpenDisplay(NULL))) - eprint("dinput: cannot open display\n"); + eprint("cannot open display\n"); screen = DefaultScreen(dpy); if(!parent) parent = RootWindow(dpy, screen); diff --git a/dmenu.c b/dmenu.c @@ -34,6 +34,7 @@ static void calcoffsetsh(void); static void calcoffsetsv(void); static char *cistrstr(const char *s, const char *sub); static void cleanup(void); +static void dinput(void); static void drawmenu(void); static void drawmenuh(void); static void drawmenuv(void); @@ -89,28 +90,25 @@ void calcoffsetsh(void) { unsigned int w; - if(!curr) - return; - w = promptw + cmdw + 2 * spaceitem; - for(next = curr; next && w < mw; next=next->right) - w += MIN(textw(next->text), mw / 3); - w = promptw + cmdw + 2 * spaceitem; - for(prev = curr; prev && prev->left && w < mw; prev=prev->left) - w += MIN(textw(prev->left->text), mw / 3); + w = promptw + cmdw + (2 * spaceitem); + for(next = curr; next; next = next->right) + if((w += MIN(textw(next->text), mw / 3)) > mw) + break; + w = promptw + cmdw + (2 * spaceitem); + for(prev = curr; prev && prev->left; prev = prev->left) + if((w += MIN(textw(prev->left->text), mw / 3)) > mw) + break; } void calcoffsetsv(void) { - unsigned int h; + unsigned int i; - if(!curr) - return; - h = (dc.font.height + 2) * lines; - for(next = curr; next && h > 0; next = next->right) - h -= dc.font.height + 2; - h = (dc.font.height + 2) * lines; - for(prev = curr; prev && prev->left && h > 0; prev = prev->left) - h -= dc.font.height + 2; + next = prev = curr; + for(i = 0; i < lines && next; i++) + next = next->right; + for(i = 0; i < lines && prev && prev->left; i++) + prev = prev->left; } char * @@ -151,6 +149,13 @@ cleanup(void) { } void +dinput(void) { + cleanup(); + execlp("dinput", "dinput", text, NULL); /* todo: argv */ + eprint("cannot exec dinput\n"); +} + +void drawmenu(void) { dc.x = 0; dc.y = 0; @@ -290,8 +295,7 @@ kpress(XKeyEvent * e) { match(text); break; case XK_x: - execlp("dinput", "dinput", text, NULL); /* todo: argv */ - eprint("dmenu: cannot exec dinput:"); + dinput(); break; } } @@ -369,10 +373,9 @@ kpress(XKeyEvent * e) { } break; case XK_Tab: - if(!sel) - return; - strncpy(text, sel->text, sizeof text); - match(text); + if(sel) + strncpy(text, sel->text, sizeof text); + dinput(); break; } drawmenu(); @@ -431,11 +434,11 @@ readstdin(void) { if(buf[len-1] == '\n') buf[--len] = '\0'; if(!(p = strdup(buf))) - eprint("dmenu: cannot strdup %u bytes\n", len); + eprint("cannot strdup %u bytes\n", len); if((max = MAX(max, len)) == len) maxname = p; if(!(new = malloc(sizeof *new))) - eprint("dmenu: cannot malloc %u bytes\n", sizeof *new); + eprint("cannot malloc %u bytes\n", sizeof *new); new->next = new->left = new->right = NULL; new->text = p; if(!i) @@ -544,6 +547,7 @@ main(int argc, char *argv[]) { Bool topbar = True; /* command line args */ + progname = argv[0]; for(i = 1; i < argc; i++) if(!strcmp(argv[i], "-i")) { fstrncmp = strncasecmp; @@ -585,7 +589,7 @@ main(int argc, char *argv[]) { if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "dmenu: warning: no locale support\n"); if(!(dpy = XOpenDisplay(NULL))) - eprint("dmenu: cannot open display\n"); + eprint("cannot open display\n"); screen = DefaultScreen(dpy); if(!parent) parent = RootWindow(dpy, screen); diff --git a/draw.c b/draw.c @@ -13,6 +13,9 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) +/* variables */ +char *progname; + void drawcleanup(void) { if(dc.font.set) @@ -71,6 +74,7 @@ void eprint(const char *errstr, ...) { va_list ap; + fprintf(stderr, "%s: ", progname); va_start(ap, errstr); vfprintf(stderr, errstr, ap); va_end(ap); @@ -83,7 +87,7 @@ getcolor(const char *colstr) { XColor color; if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) - eprint("drawtext: cannot allocate color '%s'\n", colstr); + eprint("cannot allocate color '%s'\n", colstr); return color.pixel; } @@ -92,8 +96,8 @@ initfont(const char *fontstr) { char *def, **missing = NULL; int i, n; - if(!fontstr || fontstr[0] == '\0') - eprint("drawtext: cannot load font: '%s'\n", fontstr); + if(!fontstr || !*fontstr) + eprint("cannot load null font\n"); dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); if(missing) XFreeStringList(missing); @@ -111,7 +115,7 @@ initfont(const char *fontstr) { else { if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) - eprint("drawtext: cannot load font: '%s'\n", fontstr); + eprint("cannot load font '%s'\n", fontstr); dc.font.ascent = dc.font.xfont->ascent; dc.font.descent = dc.font.xfont->descent; } diff --git a/draw.h b/draw.h @@ -30,13 +30,13 @@ int textnw(const char *text, unsigned int len); int textw(const char *text); /* variables */ +extern char *progname; extern Display *dpy; extern DC dc; extern int screen; extern unsigned int mw, mh; extern Window parent; -/* style */ extern const char *font; extern const char *normbgcolor; extern const char *normfgcolor;