dmenu

my fork of dmenu
Index Commits Files Refs README LICENSE
commit 4d8a646958fa2e0c8fe9d8da3dd26357e8bb4317
parent b89a9501c75744f1393ec943ca520c8b59501610
Author: Anselm R Garbe <garbeam@gmail.com>
Date:   Wed, 16 Jul 2008 18:38:53 +0100

got rid of compile time xidx, grabbing the mouse pointer instead, falling back to screen 0 if no pointer available
Diffstat:
Mconfig.h | 5-----
Mdmenu.c | 23+++++++++++++++++------
2 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/config.h b/config.h
@@ -6,9 +6,4 @@ static const char *normbgcolor = "#cccccc";
 static const char *normfgcolor = "#000000";
 static const char *selbgcolor  = "#0066ff";
 static const char *selfgcolor  = "#ffffff";
-
 static unsigned int spaceitem  = 30; /* px between menu items */
-
-#ifdef XINERAMA
-static unsigned int xidx       = 0;  /* Xinerama screen index to use */
-#endif
diff --git a/dmenu.c b/dmenu.c
@@ -16,7 +16,8 @@
 #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 };
@@ -585,7 +586,7 @@ run(void) {
 
 void
 setup(Bool topbar) {
-    int i, j, x, y;
+    int i, j, n, x, y;
     XModifierKeymap *modmap;
     XSetWindowAttributes wa;
 #if XINERAMA
@@ -618,10 +619,20 @@ 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;
+        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