X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=dmenu.c;h=849746ca9dbbd84e0fa687c24e3d6b7c9b806ee8;hb=596033b7818f5ff126ec6c62c375afc4c1e32dda;hp=b07671c04dbc2d4c1604669088db3cccc5216ee7;hpb=015f51ac46adac6befd81754a8f01676eaf1f6a4;p=dmenu.git diff --git a/dmenu.c b/dmenu.c index b07671c..849746c 100644 --- a/dmenu.c +++ b/dmenu.c @@ -9,6 +9,9 @@ #include #include #include +#ifdef XINERAMA +#include +#endif /* macros */ #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) @@ -17,10 +20,12 @@ enum { ColFG, ColBG, ColLast }; /* typedefs */ +typedef unsigned int uint; +typedef unsigned long ulong; typedef struct { int x, y, w, h; - unsigned long norm[ColLast]; - unsigned long sel[ColLast]; + ulong norm[ColLast]; + ulong sel[ColLast]; Drawable drawable; GC gc; struct { @@ -45,20 +50,20 @@ void calcoffsets(void); char *cistrstr(const char *s, const char *sub); void cleanup(void); void drawmenu(void); -void drawtext(const char *text, unsigned long col[ColLast]); -void *emalloc(unsigned int size); +void drawtext(const char *text, ulong col[ColLast]); +void *emalloc(uint size); void eprint(const char *errstr, ...); char *estrdup(const char *str); -unsigned long getcolor(const char *colstr); +ulong getcolor(const char *colstr); Bool grabkeyboard(void); void initfont(const char *fontstr); void kpress(XKeyEvent * e); void match(char *pattern); void readstdin(void); void run(void); -void setup(int x, int y, int w); -unsigned int textnw(const char *text, unsigned int len); -unsigned int textw(const char *text); +void setup(Bool topbar); +uint textnw(const char *text, uint len); +uint textw(const char *text); #include "config.h" @@ -73,10 +78,10 @@ char *selfg = SELFGCOLOR; char text[4096]; int screen; int ret = 0; -unsigned int cmdw = 0; -unsigned int mw, mh; -unsigned int promptw = 0; -unsigned int numlockmask = 0; +uint cmdw = 0; +uint mw, mh; +uint promptw = 0; +uint numlockmask = 0; Bool running = True; Display *dpy; DC dc = {0}; @@ -103,7 +108,7 @@ appenditem(Item *i, Item **list, Item **last) { void calcoffsets(void) { - unsigned int tw, w; + uint tw, w; if(!curr) return; @@ -130,7 +135,7 @@ calcoffsets(void) { char * cistrstr(const char *s, const char *sub) { int c, csub; - unsigned int len; + uint len; if(!sub) return (char *)s; @@ -212,10 +217,10 @@ drawmenu(void) { } void -drawtext(const char *text, unsigned long col[ColLast]) { +drawtext(const char *text, ulong col[ColLast]) { int x, y, w, h; static char buf[256]; - unsigned int len, olen; + uint len, olen; XRectangle r = { dc.x, dc.y, dc.w, dc.h }; XSetForeground(dpy, dc.gc, col[ColBG]); @@ -252,7 +257,7 @@ drawtext(const char *text, unsigned long col[ColLast]) { } void * -emalloc(unsigned int size) { +emalloc(uint size) { void *res = malloc(size); if(!res) @@ -279,7 +284,7 @@ estrdup(const char *str) { return res; } -unsigned long +ulong getcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); XColor color; @@ -291,11 +296,11 @@ getcolor(const char *colstr) { Bool grabkeyboard(void) { - unsigned int len; + uint len; for(len = 1000; len; len--) { if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) - == GrabSuccess) + == GrabSuccess) break; usleep(1000); } @@ -347,22 +352,20 @@ void kpress(XKeyEvent * e) { char buf[32]; int i, num; - unsigned int len; + uint len; KeySym ksym; len = strlen(text); buf[0] = 0; num = XLookupString(e, buf, sizeof buf, &ksym, 0); - if(IsKeypadKey(ksym)) { - if(ksym == XK_KP_Enter) { + if(IsKeypadKey(ksym)) + if(ksym == XK_KP_Enter) ksym = XK_Return; - } else if(ksym >= XK_KP_0 && ksym <= XK_KP_9) { + else if(ksym >= XK_KP_0 && ksym <= XK_KP_9) ksym = (ksym - XK_KP_0) + XK_0; - } - } if(IsFunctionKey(ksym) || IsKeypadKey(ksym) - || IsMiscFunctionKey(ksym) || IsPFKey(ksym) - || IsPrivateKeypadKey(ksym)) + || IsMiscFunctionKey(ksym) || IsPFKey(ksym) + || IsPrivateKeypadKey(ksym)) return; /* first check if a control mask is omitted */ if(e->state & ControlMask) { @@ -516,7 +519,7 @@ kpress(XKeyEvent * e) { void match(char *pattern) { - unsigned int plen; + uint plen; Item *i, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend; if(!pattern) @@ -536,7 +539,7 @@ match(char *pattern) { } if(lprefix) { if(itemend) { - itemend->right - lprefix; + itemend->right = lprefix; lprefix->left = itemend; } else @@ -558,7 +561,7 @@ match(char *pattern) { void readstdin(void) { char *p, buf[1024]; - unsigned int len = 0, max = 0; + uint len = 0, max = 0; Item *i, *new; i = 0; @@ -602,10 +605,13 @@ run(void) { } void -setup(int x, int y, int w) { - unsigned int i, j; +setup(Bool topbar) { + int i, j, x, y; XModifierKeymap *modmap; XSetWindowAttributes wa; +#if XINERAMA + XineramaScreenInfo *info = NULL; +#endif /* init modifier map */ modmap = XGetModifierMapping(dpy); @@ -628,14 +634,25 @@ setup(int x, int y, int w) { wa.override_redirect = 1; wa.background_pixmap = ParentRelative; wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; - mw = w ? w : DisplayWidth(dpy, screen); + + /* menu window geometry */ mh = dc.font.height + 2; - if(y < 0) { - if(y == (int)(unsigned int)-1) - y = DisplayHeight(dpy, screen) - mh; - else - y = (-1 * y) - mh; +#if XINERAMA + if(XineramaIsActive(dpy)) { + info = XineramaQueryScreens(dpy, &i); + x = info[0].x_org; + y = topbar ? info[0].y_org : info[0].y_org + info[0].height - mh; + mw = info[0].width; + XFree(info); + } + else +#endif + { + x = 0; + y = topbar ? 0 : DisplayHeight(dpy, screen) - mh; + mw = DisplayWidth(dpy, screen); } + win = XCreateWindow(dpy, root, x, y, mw, mh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), @@ -660,8 +677,8 @@ setup(int x, int y, int w) { XMapRaised(dpy, win); } -unsigned int -textnw(const char *text, unsigned int len) { +uint +textnw(const char *text, uint len) { XRectangle r; if(dc.font.set) { @@ -671,15 +688,15 @@ textnw(const char *text, unsigned int len) { return XTextWidth(dc.font.xfont, text, len); } -unsigned int +uint textw(const char *text) { return textnw(text, strlen(text)) + dc.font.height; } int main(int argc, char *argv[]) { - int x = 0, y = 0, w = 0; - unsigned int i; + uint i; + Bool topbar = True; /* command line args */ for(i = 1; i < argc; i++) @@ -687,6 +704,8 @@ main(int argc, char *argv[]) { fstrncmp = strncasecmp; fstrstr = cistrstr; } + else if(!strcmp(argv[i], "-b")) + topbar = False; else if(!strcmp(argv[i], "-fn")) { if(++i < argc) font = argv[i]; } @@ -705,29 +724,13 @@ main(int argc, char *argv[]) { else if(!strcmp(argv[i], "-sf")) { if(++i < argc) selfg = argv[i]; } - else if(!strcmp(argv[i], "-x")) { - if(++i < argc) x = atoi(argv[i]); - } - else if(!strcmp(argv[i], "-y")) { - if(++i < argc) { - if(!strcmp(argv[i], "-0")) - y = (int)(unsigned int)-1; - else - y = atoi(argv[i]); - } - } - else if(!strcmp(argv[i], "-w")) { - if(++i < argc) w = atoi(argv[i]); - } else if(!strcmp(argv[i], "-v")) eprint("dmenu-"VERSION", © 2006-2008 dmenu engineers, see LICENSE for details\n"); else - eprint("usage: dmenu [-i] [-fn ] [-nb ] [-nf ]\n" - " [-p ] [-sb ] [-sf ]\n" - " [-x ] [-y ] [-w ] [-v]\n"); + eprint("usage: dmenu [-i] [-b] [-fn ] [-nb ] [-nf ]\n" + " [-p ] [-sb ] [-sf ] [-v]\n"); setlocale(LC_CTYPE, ""); - dpy = XOpenDisplay(0); - if(!dpy) + if(!(dpy = XOpenDisplay(0))) eprint("dmenu: cannot open display\n"); screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); @@ -741,7 +744,7 @@ main(int argc, char *argv[]) { readstdin(); } - setup(x, y, w); + setup(topbar); drawmenu(); XSync(dpy, False); run();