X-Git-Url: https://git.xinqibao.xyz/dmenu.git/blobdiff_plain/a45f106d3c6e253109dd47b6a193f991c7bde203..b89a9501c75744f1393ec943ca520c8b59501610:/dmenu.c diff --git a/dmenu.c b/dmenu.c index 0f728c2..33b1a89 100644 --- a/dmenu.c +++ b/dmenu.c @@ -1,4 +1,5 @@ /* See LICENSE file for copyright and license details. */ +#define _BSD_SOURCE #include #include #include @@ -21,12 +22,10 @@ enum { ColFG, ColBG, ColLast }; /* typedefs */ -typedef unsigned int uint; -typedef unsigned long ulong; typedef struct { int x, y, w, h; - ulong norm[ColLast]; - ulong sel[ColLast]; + unsigned long norm[ColLast]; + unsigned long sel[ColLast]; Drawable drawable; GC gc; struct { @@ -51,10 +50,9 @@ static void calcoffsets(void); static char *cistrstr(const char *s, const char *sub); static void cleanup(void); static void drawmenu(void); -static void drawtext(const char *text, ulong col[ColLast]); -static void *emalloc(uint size); +static void drawtext(const char *text, unsigned long col[ColLast]); static void eprint(const char *errstr, ...); -static ulong getcolor(const char *colstr); +static unsigned long getcolor(const char *colstr); static Bool grabkeyboard(void); static void initfont(const char *fontstr); static void kpress(XKeyEvent * e); @@ -62,26 +60,21 @@ static void match(char *pattern); static void readstdin(void); static void run(void); static void setup(Bool topbar); -static int textnw(const char *text, uint len); +static int textnw(const char *text, unsigned int len); static int textw(const char *text); #include "config.h" /* variables */ -static char *font = FONT; static char *maxname = NULL; -static char *normbg = NORMBGCOLOR; -static char *normfg = NORMFGCOLOR; static char *prompt = NULL; -static char *selbg = SELBGCOLOR; -static char *selfg = SELFGCOLOR; static char text[4096]; static int cmdw = 0; static int promptw = 0; static int ret = 0; static int screen; -static uint mw, mh; -static uint numlockmask = 0; +static unsigned int mw, mh; +static unsigned int numlockmask = 0; static Bool running = True; static Display *dpy; static DC dc = {0}; @@ -109,7 +102,7 @@ appenditem(Item *i, Item **list, Item **last) { void calcoffsets(void) { int tw; - uint w; + unsigned int w; if(!curr) return; @@ -136,7 +129,7 @@ calcoffsets(void) { char * cistrstr(const char *s, const char *sub) { int c, csub; - uint len; + unsigned int len; if(!sub) return (char *)s; @@ -218,10 +211,10 @@ drawmenu(void) { } void -drawtext(const char *text, ulong col[ColLast]) { +drawtext(const char *text, unsigned long col[ColLast]) { int x, y, w, h; static char buf[256]; - uint len, olen; + unsigned int len, olen; XRectangle r = { dc.x, dc.y, dc.w, dc.h }; XSetForeground(dpy, dc.gc, col[ColBG]); @@ -257,15 +250,6 @@ drawtext(const char *text, ulong col[ColLast]) { XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); } -void * -emalloc(uint size) { - void *res = malloc(size); - - if(!res) - eprint("fatal: could not malloc() %u bytes\n", size); - return res; -} - void eprint(const char *errstr, ...) { va_list ap; @@ -276,7 +260,7 @@ eprint(const char *errstr, ...) { exit(EXIT_FAILURE); } -ulong +unsigned long getcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); XColor color; @@ -288,7 +272,7 @@ getcolor(const char *colstr) { Bool grabkeyboard(void) { - uint len; + unsigned int len; for(len = 1000; len; len--) { if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) @@ -344,7 +328,7 @@ void kpress(XKeyEvent * e) { char buf[32]; int i, num; - uint len; + unsigned int len; KeySym ksym; len = strlen(text); @@ -482,11 +466,11 @@ kpress(XKeyEvent * e) { calcoffsets(); break; case XK_Return: - if((e->state & ShiftMask) && text) + if((e->state & ShiftMask) && *text) fprintf(stdout, "%s", text); else if(sel) fprintf(stdout, "%s", sel->text); - else if(text) + else if(*text) fprintf(stdout, "%s", text); fflush(stdout); running = False; @@ -512,7 +496,7 @@ kpress(XKeyEvent * e) { void match(char *pattern) { - uint plen; + unsigned int plen; Item *i, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend; if(!pattern) @@ -554,7 +538,7 @@ match(char *pattern) { void readstdin(void) { char *p, buf[1024]; - uint len = 0, max = 0; + unsigned int len = 0, max = 0; Item *i, *new; i = 0; @@ -568,7 +552,8 @@ readstdin(void) { maxname = p; max = len; } - new = emalloc(sizeof(Item)); + if((new = (Item *)malloc(sizeof(Item))) == NULL) + eprint("fatal: could not malloc() %u bytes\n", sizeof(Item)); new->next = new->left = new->right = NULL; new->text = p; if(!i) @@ -618,10 +603,10 @@ setup(Bool topbar) { XFreeModifiermap(modmap); /* style */ - dc.norm[ColBG] = getcolor(normbg); - dc.norm[ColFG] = getcolor(normfg); - dc.sel[ColBG] = getcolor(selbg); - dc.sel[ColFG] = getcolor(selfg); + dc.norm[ColBG] = getcolor(normbgcolor); + dc.norm[ColFG] = getcolor(normfgcolor); + dc.sel[ColBG] = getcolor(selbgcolor); + dc.sel[ColFG] = getcolor(selfgcolor); initfont(font); /* menu window */ @@ -634,9 +619,9 @@ setup(Bool topbar) { #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; + x = info[xidx].x_org; + y = topbar ? info[xidx].y_org : info[xidx].y_org + info[xidx].height - mh; + mw = info[xidx].width; XFree(info); } else @@ -672,7 +657,7 @@ setup(Bool topbar) { } int -textnw(const char *text, uint len) { +textnw(const char *text, unsigned int len) { XRectangle r; if(dc.font.set) { @@ -689,7 +674,7 @@ textw(const char *text) { int main(int argc, char *argv[]) { - uint i; + unsigned int i; Bool topbar = True; /* command line args */ @@ -704,26 +689,27 @@ main(int argc, char *argv[]) { if(++i < argc) font = argv[i]; } else if(!strcmp(argv[i], "-nb")) { - if(++i < argc) normbg = argv[i]; + if(++i < argc) normbgcolor = argv[i]; } else if(!strcmp(argv[i], "-nf")) { - if(++i < argc) normfg = argv[i]; + if(++i < argc) normfgcolor = argv[i]; } else if(!strcmp(argv[i], "-p")) { if(++i < argc) prompt = argv[i]; } else if(!strcmp(argv[i], "-sb")) { - if(++i < argc) selbg = argv[i]; + if(++i < argc) selbgcolor = argv[i]; } else if(!strcmp(argv[i], "-sf")) { - if(++i < argc) selfg = argv[i]; + if(++i < argc) selfgcolor = 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] [-b] [-fn ] [-nb ] [-nf ]\n" " [-p ] [-sb ] [-sf ] [-v]\n"); - setlocale(LC_CTYPE, ""); + if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fprintf(stderr, "warning: no locale support\n"); if(!(dpy = XOpenDisplay(0))) eprint("dmenu: cannot open display\n"); screen = DefaultScreen(dpy);