From f7cbe710a266448122d89a02b8ba8c70423fc750 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Sat, 18 Jun 2011 22:11:19 +0100 Subject: [PATCH 01/20] update draw.c --- draw.c | 27 +++++++++++++-------------- draw.h | 1 + 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/draw.c b/draw.c index f952b53..2028fd9 100644 --- a/draw.c +++ b/draw.c @@ -120,24 +120,23 @@ initfont(DC *dc, const char *fontstr) { Bool loadfont(DC *dc, const char *fontstr) { - char *def, **missing; - int i, n; + char *def, **missing, **names; + int i, n = 1; + XFontStruct **xfonts; if(!*fontstr) return False; - if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) { - char **names; - XFontStruct **xfonts; - + if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) n = XFontsOfFontSet(dc->font.set, &xfonts, &names); - for(i = dc->font.ascent = dc->font.descent = 0; i < n; i++) { - dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent); - dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); - } - } - else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { - dc->font.ascent = dc->font.xfont->ascent; - dc->font.descent = dc->font.xfont->descent; + else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) + xfonts = &dc->font.xfont; + else + n = 0; + + for(i = 0; i < n; i++) { + dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent); + dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); + dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width); } if(missing) XFreeStringList(missing); diff --git a/draw.h b/draw.h index 247c0b3..43a57bf 100644 --- a/draw.h +++ b/draw.h @@ -15,6 +15,7 @@ typedef struct { int ascent; int descent; int height; + int width; XFontSet set; XFontStruct *xfont; } font; From 59dafc4ad67d0d4318d03b5f40da94af2bdf41fb Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Thu, 23 Jun 2011 22:39:20 +0100 Subject: [PATCH 02/20] make clean lsx --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f3f6b3d..15a341e 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ lsx: lsx.o clean: @echo cleaning - @rm -f dmenu ${OBJ} dmenu-${VERSION}.tar.gz + @rm -f dmenu lsx ${OBJ} dmenu-${VERSION}.tar.gz dist: clean @echo creating dist tarball From 0288b576cabc42c649250dbbfe8bd93f7f3b5e8c Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Sat, 25 Jun 2011 17:02:14 +0100 Subject: [PATCH 03/20] include limits.h --- lsx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lsx.c b/lsx.c index e5b5c0b..bbe57d4 100644 --- a/lsx.c +++ b/lsx.c @@ -1,5 +1,6 @@ /* See LICENSE file for copyright and license details. */ #include +#include #include #include #include From 34a816f87d382de2891ba2ed734e2de48ed0b357 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Mon, 4 Jul 2011 16:55:09 +0100 Subject: [PATCH 04/20] rebind ^N ^P --- config.mk | 2 +- dmenu.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config.mk b/config.mk index 70c9e36..eb55470 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # dmenu version -VERSION = 4.3.1 +VERSION = 4.4 # paths PREFIX = /usr/local diff --git a/dmenu.c b/dmenu.c index d03087f..9b57565 100644 --- a/dmenu.c +++ b/dmenu.c @@ -268,10 +268,10 @@ keypress(XKeyEvent *ev) { match(False); break; case XK_n: - ksym = XK_Down; + ksym = XK_Next; break; case XK_p: - ksym = XK_Up; + ksym = XK_Prior; break; case XK_u: /* delete left */ insert(NULL, 0 - cursor); From 5867c533909b8b6fd8318f307460e894ca8fee3b Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Wed, 6 Jul 2011 13:40:36 +0100 Subject: [PATCH 05/20] simpler vline --- dmenu.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dmenu.c b/dmenu.c index 9b57565..aa9254f 100644 --- a/dmenu.c +++ b/dmenu.c @@ -330,8 +330,7 @@ keypress(XKeyEvent *ev) { cursor = nextrune(-1); break; } - else if(lines > 0) - return; + /* fallthrough */ case XK_Up: if(sel && sel->left && (sel = sel->left)->right == curr) { curr = prev; @@ -359,8 +358,7 @@ keypress(XKeyEvent *ev) { cursor = nextrune(+1); break; } - else if(lines > 0) - return; + /* fallthrough */ case XK_Down: if(sel && sel->right && (sel = sel->right) == next) { curr = next; From 16a0c0d52aa947b3fe8c9285986567189537d339 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Thu, 14 Jul 2011 20:03:00 +0100 Subject: [PATCH 06/20] fix extra warning --- lsx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lsx.c b/lsx.c index bbe57d4..79b506b 100644 --- a/lsx.c +++ b/lsx.c @@ -32,7 +32,7 @@ lsx(const char *dir) { return; } while((d = readdir(dp))) - if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < sizeof buf + if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (ssize_t)sizeof buf && !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0) puts(d->d_name); closedir(dp); From 2b92c95230fbbdcf47f701d9cc4fd133a7972fae Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Thu, 14 Jul 2011 20:03:08 +0100 Subject: [PATCH 07/20] efficiency tweaks --- dmenu.c | 98 ++++++++++++++++++++++++--------------------------------- draw.c | 6 ++-- 2 files changed, 44 insertions(+), 60 deletions(-) diff --git a/dmenu.c b/dmenu.c index aa9254f..cff3e65 100644 --- a/dmenu.c +++ b/dmenu.c @@ -25,8 +25,8 @@ struct Item { static void appenditem(Item *item, Item **list, Item **last); static void calcoffsets(void); +static char *cistrstr(const char *s, const char *sub); static void drawmenu(void); -static char *fstrstr(const char *s, const char *sub); static void grabkeyboard(void); static void insert(const char *str, ssize_t n); static void keypress(XKeyEvent *ev); @@ -60,6 +60,7 @@ static Item *prev, *curr, *next, *sel; static Window win; static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; +static char *(*fstrstr)(const char *, const char *) = strstr; int main(int argc, char *argv[]) { @@ -76,8 +77,10 @@ main(int argc, char *argv[]) { topbar = False; else if(!strcmp(argv[i], "-f")) fast = True; - else if(!strcmp(argv[i], "-i")) + else if(!strcmp(argv[i], "-i")) { fstrncmp = strncasecmp; + fstrstr = cistrstr; + } else if(i+1 == argc) usage(); /* double flags */ @@ -112,7 +115,7 @@ main(int argc, char *argv[]) { setup(); run(); - return EXIT_FAILURE; /* should not reach */ + return EXIT_FAILURE; /* unreachable */ } void @@ -121,6 +124,7 @@ appenditem(Item *item, Item **list, Item **last) { *list = item; else (*last)->right = item; + item->left = *last; item->right = NULL; *last = item; @@ -143,6 +147,16 @@ calcoffsets(void) { break; } +char * +cistrstr(const char *s, const char *sub) { + size_t len; + + for(len = strlen(sub); *s; s++) + if(!strncasecmp(s, sub, len)) + return (char *)s; + return NULL; +} + void drawmenu(void) { int curpos; @@ -188,16 +202,6 @@ drawmenu(void) { mapdc(dc, win, mw, mh); } -char * -fstrstr(const char *s, const char *sub) { - size_t len; - - for(len = strlen(sub); *s; s++) - if(!fstrncmp(s, sub, len)) - return (char *)s; - return NULL; -} - void grabkeyboard(void) { int i; @@ -233,58 +237,37 @@ keypress(XKeyEvent *ev) { XConvertCase(ksym, &lower, &upper); switch(lower) { - default: - return; - case XK_a: - ksym = XK_Home; - break; - case XK_b: - ksym = XK_Left; - break; - case XK_c: - ksym = XK_Escape; - break; - case XK_d: - ksym = XK_Delete; - break; - case XK_e: - ksym = XK_End; - break; - case XK_f: - ksym = XK_Right; - break; - case XK_h: - ksym = XK_BackSpace; - break; - case XK_i: - ksym = XK_Tab; - break; - case XK_j: - case XK_m: - ksym = XK_Return; - break; - case XK_k: /* delete right */ + case XK_a: ksym = XK_Home; break; + case XK_b: ksym = XK_Left; break; + case XK_c: ksym = XK_Escape; break; + case XK_d: ksym = XK_Delete; break; + case XK_e: ksym = XK_End; break; + case XK_f: ksym = XK_Right; break; + case XK_h: ksym = XK_BackSpace; break; + case XK_i: ksym = XK_Tab; break; + case XK_j: ksym = XK_Return; break; + case XK_m: ksym = XK_Return; break; + case XK_n: ksym = XK_Up; break; + case XK_p: ksym = XK_Down; break; + + case XK_k: /* delete right */ text[cursor] = '\0'; match(False); break; - case XK_n: - ksym = XK_Next; - break; - case XK_p: - ksym = XK_Prior; - break; - case XK_u: /* delete left */ + case XK_u: /* delete left */ insert(NULL, 0 - cursor); break; - case XK_w: /* delete word */ + case XK_w: /* delete word */ while(cursor > 0 && text[nextrune(-1)] == ' ') insert(NULL, nextrune(-1) - cursor); while(cursor > 0 && text[nextrune(-1)] != ' ') insert(NULL, nextrune(-1) - cursor); break; - case XK_y: /* paste selection */ + case XK_y: /* paste selection */ XConvertSelection(dc->dpy, XA_PRIMARY, utf8, utf8, win, CurrentTime); return; + default: + return; } } switch(ksym) { @@ -297,8 +280,9 @@ keypress(XKeyEvent *ev) { return; cursor = nextrune(+1); case XK_BackSpace: - if(cursor > 0) - insert(NULL, nextrune(-1) - cursor); + if(cursor == 0) + return; + insert(NULL, nextrune(-1) - cursor); break; case XK_End: if(text[cursor] != '\0') { @@ -351,7 +335,7 @@ keypress(XKeyEvent *ev) { break; case XK_Return: case XK_KP_Enter: - fputs((sel && !(ev->state & ShiftMask)) ? sel->text : text, stdout); + puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); exit(EXIT_SUCCESS); case XK_Right: if(text[cursor] != '\0') { @@ -468,7 +452,7 @@ run(void) { switch(ev.type) { case Expose: if(ev.xexpose.count == 0) - drawmenu(); + mapdc(dc, win, mw, mh); break; case KeyPress: keypress(&ev.xkey); diff --git a/draw.c b/draw.c index 2028fd9..d0beee8 100644 --- a/draw.c +++ b/draw.c @@ -96,7 +96,7 @@ initdc(void) { DC *dc; if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fprintf(stderr, "no locale support\n"); + fputs("no locale support\n", stderr); if(!(dc = calloc(1, sizeof *dc))) eprintf("cannot malloc %u bytes:", sizeof *dc); if(!(dc->dpy = XOpenDisplay(NULL))) @@ -153,10 +153,10 @@ resizedc(DC *dc, unsigned int w, unsigned int h) { if(dc->canvas) XFreePixmap(dc->dpy, dc->canvas); - dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h, - DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); dc->w = w; dc->h = h; + dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h, + DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); } int From 1636e122101501ddb907119c61d0961ccaa89a99 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Sun, 17 Jul 2011 14:06:53 +0100 Subject: [PATCH 08/20] tweaks --- dmenu.c | 1 + lsx.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dmenu.c b/dmenu.c index cff3e65..fd98d54 100644 --- a/dmenu.c +++ b/dmenu.c @@ -279,6 +279,7 @@ keypress(XKeyEvent *ev) { if(text[cursor] == '\0') return; cursor = nextrune(+1); + /* fallthrough */ case XK_BackSpace: if(cursor == 0) return; diff --git a/lsx.c b/lsx.c index 79b506b..f337a4a 100644 --- a/lsx.c +++ b/lsx.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -32,7 +31,7 @@ lsx(const char *dir) { return; } while((d = readdir(dp))) - if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (ssize_t)sizeof buf + if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (int)sizeof buf && !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0) puts(d->d_name); closedir(dp); From bae58f61cf03260d018796edf2bd3fd5e07450ed Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Tue, 19 Jul 2011 21:30:09 +0100 Subject: [PATCH 09/20] add lsx.1 to dist --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 15a341e..1135d65 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ clean: dist: clean @echo creating dist tarball @mkdir -p dmenu-${VERSION} - @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run ${SRC} dmenu-${VERSION} + @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run lsx.1 ${SRC} dmenu-${VERSION} @tar -cf dmenu-${VERSION}.tar dmenu-${VERSION} @gzip dmenu-${VERSION}.tar @rm -rf dmenu-${VERSION} From a6cbc6c9a7b8cfbf7382a6a81450bf4466980a21 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Tue, 19 Jul 2011 21:30:14 +0100 Subject: [PATCH 10/20] Added tag 4.4 for changeset 2b105eaae831 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index dcceb88..c92818f 100644 --- a/.hgtags +++ b/.hgtags @@ -46,3 +46,4 @@ e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2 abb6579a324fffdf6a23c2fa4c32911277da594a 4.2.1 14c79f054bdf43ff3213af8e60a783192e92a018 4.3 34a2d77049a95b02f3332a0b88f9370965ebcfad 4.3.1 +2b105eaae8315b076da93056da9ecd60de5a7ac9 4.4 From c805dcbeaff38dfcf78bdcc10c863eb7e1bbc32d Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Fri, 22 Jul 2011 18:16:57 +0100 Subject: [PATCH 11/20] fix loadfont --- draw.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/draw.c b/draw.c index d0beee8..76f0c54 100644 --- a/draw.c +++ b/draw.c @@ -121,26 +121,27 @@ initfont(DC *dc, const char *fontstr) { Bool loadfont(DC *dc, const char *fontstr) { char *def, **missing, **names; - int i, n = 1; + int i, n; XFontStruct **xfonts; if(!*fontstr) return False; - if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) + if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) { n = XFontsOfFontSet(dc->font.set, &xfonts, &names); - else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) - xfonts = &dc->font.xfont; - else - n = 0; - - for(i = 0; i < n; i++) { - dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent); - dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); - dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width); + for(i = 0; i < n; i++) { + dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent); + dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); + dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width); + } + } + else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { + dc->font.ascent = dc->font.xfont->ascent; + dc->font.descent = dc->font.xfont->descent; + dc->font.width = dc->font.xfont->max_bounds.width; } if(missing) XFreeStringList(missing); - return (dc->font.set || dc->font.xfont); + return dc->font.set || dc->font.xfont; } void From 4692f84ff01e2187e2e3c642bcc68a15a77a6d9f Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Sun, 24 Jul 2011 20:04:58 +0100 Subject: [PATCH 12/20] dmenu_run: sh -c --- dmenu_run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmenu_run b/dmenu_run index 6e96b38..2d12243 100755 --- a/dmenu_run +++ b/dmenu_run @@ -6,4 +6,4 @@ CACHE=${XDG_CACHE_HOME:-"$HOME/.cache"}/dmenu_run mkdir -p "`dirname "$CACHE"`" && lsx $PATH | sort -u > "$CACHE" fi ) -cmd=`dmenu "$@" < "$CACHE"` && exec $cmd +cmd=`dmenu "$@" < "$CACHE"` && exec sh -c "$cmd" From 3af80cd7d8ebc6dd72d4d756fc2767c17d1caa0a Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Mon, 19 Sep 2011 10:40:07 +0100 Subject: [PATCH 13/20] change version to 'hg' --- config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.mk b/config.mk index eb55470..f66389d 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # dmenu version -VERSION = 4.4 +VERSION = hg # paths PREFIX = /usr/local From b26d3f54ee853f5983425a50c93054744fb27af4 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Mon, 19 Sep 2011 10:40:56 +0100 Subject: [PATCH 14/20] add token matching --- dmenu.c | 55 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/dmenu.c b/dmenu.c index fd98d54..2bad8d6 100644 --- a/dmenu.c +++ b/dmenu.c @@ -30,7 +30,7 @@ static void drawmenu(void); static void grabkeyboard(void); static void insert(const char *str, ssize_t n); static void keypress(XKeyEvent *ev); -static void match(Bool sub); +static void match(void); static size_t nextrune(int inc); static void paste(void); static void readstdin(void); @@ -120,10 +120,10 @@ main(int argc, char *argv[]) { void appenditem(Item *item, Item **list, Item **last) { - if(!*last) - *list = item; - else + if(*last) (*last)->right = item; + else + *list = item; item->left = *last; item->right = NULL; @@ -223,7 +223,7 @@ insert(const char *str, ssize_t n) { if(n > 0) memcpy(&text[cursor], str, n); cursor += n; - match(n > 0 && text[cursor] == '\0'); + match(); } void @@ -252,7 +252,7 @@ keypress(XKeyEvent *ev) { case XK_k: /* delete right */ text[cursor] = '\0'; - match(False); + match(); break; case XK_u: /* delete left */ insert(NULL, 0 - cursor); @@ -355,31 +355,42 @@ keypress(XKeyEvent *ev) { return; strncpy(text, sel->text, sizeof text); cursor = strlen(text); - match(True); + match(); break; } drawmenu(); } void -match(Bool sub) { - size_t len = strlen(text); - Item *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend; - Item *item, *lnext; +match(void) { + static char **tokv = NULL; + static int tokn = 0; - lexact = lprefix = lsubstr = exactend = prefixend = substrend = NULL; - for(item = sub ? matches : items; item && item->text; item = lnext) { - lnext = sub ? item->right : item + 1; - if(!fstrncmp(text, item->text, len + 1)) - appenditem(item, &lexact, &exactend); - else if(!fstrncmp(text, item->text, len)) + char buf[sizeof text], *s; + int i, tokc = 0; + size_t len; + Item *item, *lprefix, *lsubstr, *prefixend, *substrend; + + strcpy(buf, text); + for(s = strtok(buf, " "); s; tokv[tokc-1] = s, s = strtok(NULL, " ")) + if(++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) + eprintf("cannot realloc %u bytes\n", tokn * sizeof *tokv); + len = tokc ? strlen(tokv[0]) : 0; + + matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; + for(item = items; item && item->text; item++) { + for(i = 0; i < tokc; i++) + if(!fstrstr(item->text, tokv[i])) + break; + if(i != tokc) + continue; + if(!tokc || !fstrncmp(tokv[0], item->text, len+1)) + appenditem(item, &matches, &matchend); + else if(!fstrncmp(tokv[0], item->text, len)) appenditem(item, &lprefix, &prefixend); - else if(fstrstr(item->text, text)) + else appenditem(item, &lsubstr, &substrend); } - matches = lexact; - matchend = exactend; - if(lprefix) { if(matchend) { matchend->right = lprefix; @@ -514,7 +525,7 @@ setup(void) { } promptw = prompt ? textw(dc, prompt) : 0; inputw = MIN(inputw, mw/3); - match(False); + match(); /* menu window */ wa.override_redirect = True; From f1848a3ef0d5e230761b6b9b5b7490d7be945154 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Mon, 19 Sep 2011 18:15:03 +0100 Subject: [PATCH 15/20] detect active monitor using input focus --- dmenu.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/dmenu.c b/dmenu.c index fd98d54..6c1407d 100644 --- a/dmenu.c +++ b/dmenu.c @@ -473,7 +473,7 @@ void setup(void) { int x, y, screen = DefaultScreen(dc->dpy); Window root = RootWindow(dc->dpy, screen); - XSetWindowAttributes wa; + XSetWindowAttributes swa; #ifdef XINERAMA int n; XineramaScreenInfo *info; @@ -494,9 +494,14 @@ setup(void) { if((info = XineramaQueryScreens(dc->dpy, &n))) { int i, di; unsigned int du; - Window dw; + Window w, dw; + XWindowAttributes wa; - XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du); + XGetInputFocus(dc->dpy, &w, &di); + if(w != root && XGetWindowAttributes(dc->dpy, w, &wa)) + XTranslateCoordinates(dc->dpy, root, root, wa.x, wa.y, &x, &y, &dw); + else + XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du); for(i = 0; i < n-1; i++) if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) break; @@ -517,13 +522,13 @@ setup(void) { match(False); /* menu window */ - wa.override_redirect = True; - wa.background_pixmap = ParentRelative; - wa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; + swa.override_redirect = True; + swa.background_pixmap = ParentRelative; + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0, DefaultDepth(dc->dpy, screen), CopyFromParent, DefaultVisual(dc->dpy, screen), - CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); + CWOverrideRedirect | CWBackPixmap | CWEventMask, &swa); XMapRaised(dc->dpy, win); resizedc(dc, mw, mh); From 0582480801d5815ef39fd624cb4ba108d0d21b35 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Tue, 20 Sep 2011 00:06:13 +0100 Subject: [PATCH 16/20] update manpage --- dmenu.1 | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/dmenu.1 b/dmenu.1 index 616a2a5..7243a36 100644 --- a/dmenu.1 +++ b/dmenu.1 @@ -25,13 +25,10 @@ dmenu \- dynamic menu .BR dmenu_run " ..." .SH DESCRIPTION .B dmenu -is a dynamic menu for X, originally designed for -.IR dwm (1). -It manages huge numbers of user\-defined menu items efficiently. -.P -dmenu reads a list of newline\-separated items from stdin and creates a menu. -When the user selects an item or enters any text and presses Return, their -choice is printed to stdout and dmenu terminates. +is a dynamic menu for X, which reads a list of newline\-separated items from +stdin. When the user selects an item and presses Return, their choice is printed +to stdout and dmenu terminates. Entering text will narrow the items to those +matching the tokens in the input. .P .B dmenu_run is a dmenu script used by dwm which lists programs in the user's $PATH and @@ -42,8 +39,8 @@ executes the selected item. dmenu appears at the bottom of the screen. .TP .B \-f -dmenu grabs the keyboard before reading stdin. This is faster, but may lock up -X if stdin is from a terminal. +dmenu grabs the keyboard before reading stdin. This is faster, but will lock up +X until stdin reaches end\-of\-file. .TP .B \-i dmenu matches menu items case insensitively. From 4c8d43ab7382910f3577d6ed03ebaf3026db8419 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Tue, 20 Sep 2011 00:09:20 +0100 Subject: [PATCH 17/20] tweak match --- dmenu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dmenu.c b/dmenu.c index 2bad8d6..1cd9f61 100644 --- a/dmenu.c +++ b/dmenu.c @@ -392,7 +392,7 @@ match(void) { appenditem(item, &lsubstr, &substrend); } if(lprefix) { - if(matchend) { + if(matches) { matchend->right = lprefix; lprefix->left = matchend; } @@ -401,7 +401,7 @@ match(void) { matchend = prefixend; } if(lsubstr) { - if(matchend) { + if(matches) { matchend->right = lsubstr; lsubstr->left = matchend; } From e30ad490b2b9048bc7e70fc81f0be2b378985f89 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Fri, 30 Sep 2011 21:08:37 +0100 Subject: [PATCH 18/20] fix monitor select when no focus --- dmenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmenu.c b/dmenu.c index 9d479f9..458f5ab 100644 --- a/dmenu.c +++ b/dmenu.c @@ -509,7 +509,7 @@ setup(void) { XWindowAttributes wa; XGetInputFocus(dc->dpy, &w, &di); - if(w != root && XGetWindowAttributes(dc->dpy, w, &wa)) + if(w != root && w != PointerRoot && w != None && XGetWindowAttributes(dc->dpy, w, &wa)) XTranslateCoordinates(dc->dpy, root, root, wa.x, wa.y, &x, &y, &dw); else XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du); From 8e302717cb2d03c79c2f372f5e0489ea54dbb440 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Tue, 4 Oct 2011 21:39:56 +0100 Subject: [PATCH 19/20] input focus: fix for reparenting wms --- dmenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmenu.c b/dmenu.c index 458f5ab..5d11932 100644 --- a/dmenu.c +++ b/dmenu.c @@ -510,7 +510,7 @@ setup(void) { XGetInputFocus(dc->dpy, &w, &di); if(w != root && w != PointerRoot && w != None && XGetWindowAttributes(dc->dpy, w, &wa)) - XTranslateCoordinates(dc->dpy, root, root, wa.x, wa.y, &x, &y, &dw); + XTranslateCoordinates(dc->dpy, w, root, wa.x, wa.y, &x, &y, &dw); else XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du); for(i = 0; i < n-1; i++) From 1cf386446458d9b12f6bdca9e34a340c10f79c26 Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Thu, 13 Oct 2011 20:43:59 +0100 Subject: [PATCH 20/20] limit lines to input --- dmenu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dmenu.c b/dmenu.c index 5d11932..f105b56 100644 --- a/dmenu.c +++ b/dmenu.c @@ -454,6 +454,7 @@ readstdin(void) { if(items) items[i].text = NULL; inputw = maxstr ? textw(dc, maxstr) : 0; + lines = MIN(lines, i); } void