]> git.armaanb.net Git - dmenu.git/blobdiff - dmenu.c
removed compiler warning if XINERAMA is disabled
[dmenu.git] / dmenu.c
diff --git a/dmenu.c b/dmenu.c
index a37471ac9aeb0cb20265534b76772a1271bc695e..863a262a5679f728bd7e9789fd3693212fb123fe 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -1,4 +1,5 @@
 /* See LICENSE file for copyright and license details. */
+#define _BSD_SOURCE
 #include <ctype.h>
 #include <locale.h>
 #include <stdarg.h>
 #endif
 
 /* macros */
-#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
+#define CLEANMASK(mask)         (mask & ~(numlockmask | LockMask))
+#define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))
 
 /* enums */
 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 +51,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 +61,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 +103,7 @@ appenditem(Item *i, Item **list, Item **last) {
 void
 calcoffsets(void) {
        int tw;
-       uint w;
+       unsigned int w;
 
        if(!curr)
                return;
@@ -136,7 +130,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 +212,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 +251,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 +261,7 @@ eprint(const char *errstr, ...) {
        exit(EXIT_FAILURE);
 }
 
-ulong
+unsigned long
 getcolor(const char *colstr) {
        Colormap cmap = DefaultColormap(dpy, screen);
        XColor color;
@@ -288,7 +273,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 +329,7 @@ void
 kpress(XKeyEvent * e) {
        char buf[32];
        int i, num;
-       uint len;
+       unsigned int len;
        KeySym ksym;
 
        len = strlen(text);
@@ -482,11 +467,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 +497,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 +539,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 +553,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 +604,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 */
@@ -633,10 +619,21 @@ setup(Bool topbar) {
        mh = dc.font.height + 2;
 #if XINERAMA
        if(XineramaIsActive(dpy)) {
-               info = XineramaQueryScreens(dpy, &i);
-               x = info[xidx].x_org;
-               y = topbar ? info[xidx].y_org : info[xidx].y_org + info[xidx].height - mh;
-               mw = info[xidx].width;
+               int n;
+               i = 0;
+               info = XineramaQueryScreens(dpy, &n);
+               if(n > 1) {
+                       int di;
+                       unsigned int dui;
+                       Window dummy;
+                       if(XQueryPointer(dpy, root, &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;
+               }
+               x = info[i].x_org;
+               y = topbar ? info[i].y_org : info[i].y_org + info[i].height - mh;
+               mw = info[i].width;
                XFree(info);
        }
        else
@@ -672,7 +669,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 +686,7 @@ textw(const char *text) {
 
 int
 main(int argc, char *argv[]) {
-       uint i;
+       unsigned int i;
        Bool topbar = True;
 
        /* command line args */
@@ -704,26 +701,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 <font>] [-nb <color>] [-nf <color>]\n"
                               "             [-p <prompt>] [-sb <color>] [-sf <color>] [-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);