X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=dmenu.c;h=1762dba03ff953e2795dab10ca81f1b169b0a8d8;hb=a6835349dfeafb994f250fcf98acc6dd74f010c2;hp=15a615262fb8c77bcdfdfc0082d2ca1d516d0af4;hpb=e3623cd7f24af660ef2b8cce89a232495d654237;p=dmenu.git diff --git a/dmenu.c b/dmenu.c index 15a6152..1762dba 100644 --- a/dmenu.c +++ b/dmenu.c @@ -91,11 +91,10 @@ static Item *sel = NULL; static Item *next = NULL; static Item *prev = NULL; static Item *curr = NULL; -static Window root, win; +static Window parent, win; static int (*fstrncmp)(const char *, const char *, size_t n) = strncmp; static char *(*fstrstr)(const char *, const char *) = strstr; -static Bool vlist = False; -static unsigned int lines = 5; +static unsigned int lines = 0; static void (*calcoffsets)(void) = calcoffsetsh; void @@ -213,20 +212,19 @@ drawmenu(void) { dc.h = mh; drawtext(NULL, dc.norm); /* print prompt? */ - if(promptw) { + if(prompt) { dc.w = promptw; drawtext(prompt, dc.sel); + dc.x += dc.w; } - dc.x += promptw; - dc.w = mw - promptw; + dc.w = mw - dc.x; /* print command */ - if(cmdw && item && !vlist) + if(cmdw && item && lines == 0) dc.w = cmdw; drawtext(text[0] ? text : NULL, dc.norm); drawcursor(); - dc.x += cmdw; if(curr) { - if(vlist) + if(lines > 0) drawmenuv(); else drawmenuh(); @@ -239,17 +237,17 @@ void drawmenuh(void) { Item *i; + dc.x += cmdw; dc.w = spaceitem; - drawtext((curr && curr->left) ? "<" : NULL, dc.norm); + drawtext(curr->left ? "<" : NULL, dc.norm); dc.x += dc.w; - /* determine maximum items */ for(i = curr; i != next; i=i->right) { dc.w = MIN(textw(i->text), mw / 3); drawtext(i->text, (sel == i) ? dc.sel : dc.norm); dc.x += dc.w; } - dc.x = mw - spaceitem; dc.w = spaceitem; + dc.x = mw - dc.w; drawtext(next ? ">" : NULL, dc.norm); } @@ -260,7 +258,6 @@ drawmenuv(void) { dc.x = 0; dc.w = mw; dc.y += dc.font.height + 2; - /* determine maximum items */ for(i = curr; i != next; i=i->right) { drawtext(i->text, (sel == i) ? dc.sel : dc.norm); dc.y += dc.font.height + 2; @@ -321,7 +318,7 @@ grabkeyboard(void) { unsigned int len; for(len = 1000; len; len--) { - if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) + if(XGrabKeyboard(dpy, parent, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) break; usleep(1000); @@ -341,13 +338,11 @@ initfont(const char *fontstr) { if(missing) XFreeStringList(missing); if(dc.font.set) { - XFontSetExtents *font_extents; XFontStruct **xfonts; char **font_names; dc.font.ascent = dc.font.descent = 0; - font_extents = XExtentsOfFontSet(dc.font.set); n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); - for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { + for(i = 0; i < n; i++) { dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); dc.font.descent = MAX(dc.font.descent, (*xfonts)->descent); xfonts++; @@ -414,8 +409,8 @@ kpress(XKeyEvent * e) { break; case XK_u: case XK_U: + memmove(text, text + cursor, sizeof text - cursor + 1); cursor = 0; - text[0] = '\0'; match(text); break; case XK_w: @@ -675,6 +670,7 @@ setup(Bool topbar) { #endif XModifierKeymap *modmap; XSetWindowAttributes wa; + XWindowAttributes pwa; /* init modifier map */ modmap = XGetModifierMapping(dpy); @@ -699,16 +695,15 @@ setup(Bool topbar) { wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask | VisibilityChangeMask; /* menu window geometry */ - mh = dc.font.height + 2; - mh = vlist ? mh * (lines+1) : mh; + mh = (dc.font.height + 2) * (lines + 1); #if XINERAMA - if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { + if(parent == RootWindow(dpy, screen) && XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { i = 0; if(n > 1) { int di; unsigned int dui; Window dummy; - if(XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui)) + if(XQueryPointer(dpy, parent, &dummy, &dummy, &x, &y, &di, &di, &dui)) for(i = 0; i < n; i++) if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) break; @@ -721,19 +716,20 @@ setup(Bool topbar) { else #endif { + XGetWindowAttributes(dpy, parent, &pwa); x = 0; - y = topbar ? 0 : DisplayHeight(dpy, screen) - mh; - mw = DisplayWidth(dpy, screen); + y = topbar ? 0 : pwa.height - mh; + mw = pwa.width; } - win = XCreateWindow(dpy, root, x, y, mw, mh, 0, + win = XCreateWindow(dpy, parent, x, y, mw, mh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); /* pixmap */ - dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen)); - dc.gc = XCreateGC(dpy, root, 0, NULL); + dc.drawable = XCreatePixmap(dpy, parent, mw, mh, DefaultDepth(dpy, screen)); + dc.gc = XCreateGC(dpy, parent, 0, NULL); XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); if(!dc.font.set) XSetFont(dpy, dc.gc, dc.font.xfont->fid); @@ -776,10 +772,9 @@ main(int argc, char *argv[]) { else if(!strcmp(argv[i], "-b")) topbar = False; else if(!strcmp(argv[i], "-e")) { - if(++i < argc) root = atoi(argv[i]); + if(++i < argc) parent = atoi(argv[i]); } else if(!strcmp(argv[i], "-l")) { - vlist = True; calcoffsets = calcoffsetsv; if(++i < argc) lines = atoi(argv[i]); } @@ -811,8 +806,8 @@ main(int argc, char *argv[]) { if(!(dpy = XOpenDisplay(NULL))) eprint("dmenu: cannot open display\n"); screen = DefaultScreen(dpy); - if(!root) - root = RootWindow(dpy, screen); + if(!parent) + parent = RootWindow(dpy, screen); readstdin(); running = grabkeyboard();