diff options
| -rw-r--r-- | dmenu.c | 41 |
1 files changed, 20 insertions, 21 deletions
| @@ -91,11 +91,10 @@ static Item *sel = NULL; | |||
| 91 | static Item *next = NULL; | 91 | static Item *next = NULL; |
| 92 | static Item *prev = NULL; | 92 | static Item *prev = NULL; |
| 93 | static Item *curr = NULL; | 93 | static Item *curr = NULL; |
| 94 | static Window root, win; | 94 | static Window parent, win; |
| 95 | static int (*fstrncmp)(const char *, const char *, size_t n) = strncmp; | 95 | static int (*fstrncmp)(const char *, const char *, size_t n) = strncmp; |
| 96 | static char *(*fstrstr)(const char *, const char *) = strstr; | 96 | static char *(*fstrstr)(const char *, const char *) = strstr; |
| 97 | static Bool vlist = False; | 97 | static unsigned int lines = 0; |
| 98 | static unsigned int lines = 5; | ||
| 99 | static void (*calcoffsets)(void) = calcoffsetsh; | 98 | static void (*calcoffsets)(void) = calcoffsetsh; |
| 100 | 99 | ||
| 101 | void | 100 | void |
| @@ -220,13 +219,12 @@ drawmenu(void) { | |||
| 220 | dc.x += promptw; | 219 | dc.x += promptw; |
| 221 | dc.w = mw - promptw; | 220 | dc.w = mw - promptw; |
| 222 | /* print command */ | 221 | /* print command */ |
| 223 | if(cmdw && item && !vlist) | 222 | if(cmdw && item && lines == 0) |
| 224 | dc.w = cmdw; | 223 | dc.w = cmdw; |
| 225 | drawtext(text[0] ? text : NULL, dc.norm); | 224 | drawtext(text[0] ? text : NULL, dc.norm); |
| 226 | drawcursor(); | 225 | drawcursor(); |
| 227 | dc.x += cmdw; | ||
| 228 | if(curr) { | 226 | if(curr) { |
| 229 | if(vlist) | 227 | if(lines > 0) |
| 230 | drawmenuv(); | 228 | drawmenuv(); |
| 231 | else | 229 | else |
| 232 | drawmenuh(); | 230 | drawmenuh(); |
| @@ -239,8 +237,9 @@ void | |||
| 239 | drawmenuh(void) { | 237 | drawmenuh(void) { |
| 240 | Item *i; | 238 | Item *i; |
| 241 | 239 | ||
| 240 | dc.x += cmdw; | ||
| 242 | dc.w = spaceitem; | 241 | dc.w = spaceitem; |
| 243 | drawtext((curr && curr->left) ? "<" : NULL, dc.norm); | 242 | drawtext(curr->left ? "<" : NULL, dc.norm); |
| 244 | dc.x += dc.w; | 243 | dc.x += dc.w; |
| 245 | /* determine maximum items */ | 244 | /* determine maximum items */ |
| 246 | for(i = curr; i != next; i=i->right) { | 245 | for(i = curr; i != next; i=i->right) { |
| @@ -321,7 +320,7 @@ grabkeyboard(void) { | |||
| 321 | unsigned int len; | 320 | unsigned int len; |
| 322 | 321 | ||
| 323 | for(len = 1000; len; len--) { | 322 | for(len = 1000; len; len--) { |
| 324 | if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) | 323 | if(XGrabKeyboard(dpy, parent, True, GrabModeAsync, GrabModeAsync, CurrentTime) |
| 325 | == GrabSuccess) | 324 | == GrabSuccess) |
| 326 | break; | 325 | break; |
| 327 | usleep(1000); | 326 | usleep(1000); |
| @@ -675,6 +674,7 @@ setup(Bool topbar) { | |||
| 675 | #endif | 674 | #endif |
| 676 | XModifierKeymap *modmap; | 675 | XModifierKeymap *modmap; |
| 677 | XSetWindowAttributes wa; | 676 | XSetWindowAttributes wa; |
| 677 | XWindowAttributes pwa; | ||
| 678 | 678 | ||
| 679 | /* init modifier map */ | 679 | /* init modifier map */ |
| 680 | modmap = XGetModifierMapping(dpy); | 680 | modmap = XGetModifierMapping(dpy); |
| @@ -699,16 +699,15 @@ setup(Bool topbar) { | |||
| 699 | wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask | VisibilityChangeMask; | 699 | wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask | VisibilityChangeMask; |
| 700 | 700 | ||
| 701 | /* menu window geometry */ | 701 | /* menu window geometry */ |
| 702 | mh = dc.font.height + 2; | 702 | mh = (dc.font.height + 2) * (lines + 1); |
| 703 | mh = vlist ? mh * (lines+1) : mh; | ||
| 704 | #if XINERAMA | 703 | #if XINERAMA |
| 705 | if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { | 704 | if(parent == RootWindow(dpy, screen) && XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { |
| 706 | i = 0; | 705 | i = 0; |
| 707 | if(n > 1) { | 706 | if(n > 1) { |
| 708 | int di; | 707 | int di; |
| 709 | unsigned int dui; | 708 | unsigned int dui; |
| 710 | Window dummy; | 709 | Window dummy; |
| 711 | if(XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui)) | 710 | if(XQueryPointer(dpy, parent, &dummy, &dummy, &x, &y, &di, &di, &dui)) |
| 712 | for(i = 0; i < n; i++) | 711 | for(i = 0; i < n; i++) |
| 713 | if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) | 712 | if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) |
| 714 | break; | 713 | break; |
| @@ -721,19 +720,20 @@ setup(Bool topbar) { | |||
| 721 | else | 720 | else |
| 722 | #endif | 721 | #endif |
| 723 | { | 722 | { |
| 723 | XGetWindowAttributes(dpy, parent, &pwa); | ||
| 724 | x = 0; | 724 | x = 0; |
| 725 | y = topbar ? 0 : DisplayHeight(dpy, screen) - mh; | 725 | y = topbar ? 0 : pwa.height - mh; |
| 726 | mw = DisplayWidth(dpy, screen); | 726 | mw = pwa.width; |
| 727 | } | 727 | } |
| 728 | 728 | ||
| 729 | win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | 729 | win = XCreateWindow(dpy, parent, x, y, mw, mh, 0, |
| 730 | DefaultDepth(dpy, screen), CopyFromParent, | 730 | DefaultDepth(dpy, screen), CopyFromParent, |
| 731 | DefaultVisual(dpy, screen), | 731 | DefaultVisual(dpy, screen), |
| 732 | CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | 732 | CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); |
| 733 | 733 | ||
| 734 | /* pixmap */ | 734 | /* pixmap */ |
| 735 | dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen)); | 735 | dc.drawable = XCreatePixmap(dpy, parent, mw, mh, DefaultDepth(dpy, screen)); |
| 736 | dc.gc = XCreateGC(dpy, root, 0, NULL); | 736 | dc.gc = XCreateGC(dpy, parent, 0, NULL); |
| 737 | XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | 737 | XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); |
| 738 | if(!dc.font.set) | 738 | if(!dc.font.set) |
| 739 | XSetFont(dpy, dc.gc, dc.font.xfont->fid); | 739 | XSetFont(dpy, dc.gc, dc.font.xfont->fid); |
| @@ -776,10 +776,9 @@ main(int argc, char *argv[]) { | |||
| 776 | else if(!strcmp(argv[i], "-b")) | 776 | else if(!strcmp(argv[i], "-b")) |
| 777 | topbar = False; | 777 | topbar = False; |
| 778 | else if(!strcmp(argv[i], "-e")) { | 778 | else if(!strcmp(argv[i], "-e")) { |
| 779 | if(++i < argc) root = atoi(argv[i]); | 779 | if(++i < argc) parent = atoi(argv[i]); |
| 780 | } | 780 | } |
| 781 | else if(!strcmp(argv[i], "-l")) { | 781 | else if(!strcmp(argv[i], "-l")) { |
| 782 | vlist = True; | ||
| 783 | calcoffsets = calcoffsetsv; | 782 | calcoffsets = calcoffsetsv; |
| 784 | if(++i < argc) lines = atoi(argv[i]); | 783 | if(++i < argc) lines = atoi(argv[i]); |
| 785 | } | 784 | } |
| @@ -811,8 +810,8 @@ main(int argc, char *argv[]) { | |||
| 811 | if(!(dpy = XOpenDisplay(NULL))) | 810 | if(!(dpy = XOpenDisplay(NULL))) |
| 812 | eprint("dmenu: cannot open display\n"); | 811 | eprint("dmenu: cannot open display\n"); |
| 813 | screen = DefaultScreen(dpy); | 812 | screen = DefaultScreen(dpy); |
| 814 | if(!root) | 813 | if(!parent) |
| 815 | root = RootWindow(dpy, screen); | 814 | parent = RootWindow(dpy, screen); |
| 816 | 815 | ||
| 817 | readstdin(); | 816 | readstdin(); |
| 818 | running = grabkeyboard(); | 817 | running = grabkeyboard(); |
