]> git.armaanb.net Git - dmenu.git/blobdiff - dmenu.c
Added tag 3.8 for changeset 644b0798fccc
[dmenu.git] / dmenu.c
diff --git a/dmenu.c b/dmenu.c
index fa7bbe801424e0bf5e94e5203de5b69bb9298174..1206e95d2bcdcef5e45ad72923e1c84ff811e31d 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,9 +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 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);
@@ -61,7 +61,7 @@ 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"
@@ -74,8 +74,8 @@ 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};
@@ -103,7 +103,7 @@ appenditem(Item *i, Item **list, Item **last) {
 void
 calcoffsets(void) {
        int tw;
-       uint w;
+       unsigned int w;
 
        if(!curr)
                return;
@@ -130,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;
@@ -212,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]);
@@ -261,7 +261,7 @@ eprint(const char *errstr, ...) {
        exit(EXIT_FAILURE);
 }
 
-ulong
+unsigned long
 getcolor(const char *colstr) {
        Colormap cmap = DefaultColormap(dpy, screen);
        XColor color;
@@ -273,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)
@@ -329,7 +329,7 @@ void
 kpress(XKeyEvent * e) {
        char buf[32];
        int i, num;
-       uint len;
+       unsigned int len;
        KeySym ksym;
 
        len = strlen(text);
@@ -497,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)
@@ -539,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;
@@ -587,11 +587,12 @@ run(void) {
 void
 setup(Bool topbar) {
        int i, j, x, y;
-       XModifierKeymap *modmap;
-       XSetWindowAttributes wa;
 #if XINERAMA
+       int n;
        XineramaScreenInfo *info = NULL;
 #endif
+       XModifierKeymap *modmap;
+       XSetWindowAttributes wa;
 
        /* init modifier map */
        modmap = XGetModifierMapping(dpy);
@@ -618,11 +619,20 @@ setup(Bool topbar) {
        /* menu window geometry */
        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;
+       if(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))
+                               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
@@ -658,7 +668,7 @@ setup(Bool topbar) {
 }
 
 int
-textnw(const char *text, uint len) {
+textnw(const char *text, unsigned int len) {
        XRectangle r;
 
        if(dc.font.set) {
@@ -675,7 +685,7 @@ textw(const char *text) {
 
 int
 main(int argc, char *argv[]) {
-       uint i;
+       unsigned int i;
        Bool topbar = True;
 
        /* command line args */
@@ -709,7 +719,8 @@ main(int argc, char *argv[]) {
                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);