Commit Diff


commit - 55bd6842b38cbb9c1046e9b551dae9a8f5ff3180
commit + 7ca8829beeb2ec15877e2be545af7a3d91dec62a
blob - c12b7c81b07b17b7b58857debef424305c523d34
blob + da930cad496fdd9648f6d447475d981e62bbf6c7
--- mymenu.c
+++ mymenu.c
@@ -45,17 +45,14 @@
 #define resname "MyMenu"
 #define resclass "mymenu"
 
-#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
 #define MAX(a, b) ((a) > (b) ? (a) : (b))
-#define OVERLAP(a,b,c,d) (((a)==(c) && (b)==(d)) || MIN((a)+(b), (c)+(d)) - MAX((a), (c)) > 0)
-#define INTERSECT(x,y,w,h,x1,y1,w1,h1) (OVERLAP((x),(w),(x1),(w1)) && OVERLAP((y),(h),(y1),(h1)))
 
 #define update_completions(cs, text, lines) {   \
     compl_delete(cs);                           \
     cs = filter(text, lines);                   \
   }
 
-// TODO: dynamic?
 #define INITIAL_ITEMS 64
 
 #define TODO(s) {                               \
@@ -174,7 +171,7 @@ struct completions *compl_select_prev(struct completio
       }
       cc = cc->next;
     }
-  
+
   return nil;
 }
 
@@ -665,29 +662,45 @@ int main() {
   int d_height = xwa.height;
 
 #ifdef USE_XINERAMA
-  // TODO: this bit still needs to be improved
   if (XineramaIsActive(d)) {
+    // find the mice
+    int number_of_screens = XScreenCount(d);
+    bool result;
+    Window r;
+    Window root;
+    int root_x, root_y, win_x, win_y;
+    unsigned int mask;
+    bool res;
+    for (int i = 0; i < number_of_screens; ++i) {
+      root = XRootWindow(d, i);
+      res = XQueryPointer(d, root, &r, &r, &root_x, &root_y, &win_x, &win_y, &mask);
+      if (res) break;
+    }
+    if (!res) {
+      fprintf(stderr, "No mouse found.\n");
+      root_x = 0;
+      root_y = 0;
+    }
+
+    // now find in which monitor the mice is on
     int monitors;
     XineramaScreenInfo *info = XineramaQueryScreens(d, &monitors);
-    if (info)
+    if (info) {
       for (int i = 0; i < monitors; ++i) {
-        if (INTERSECT(x, y, 1, 1, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) {
-          offset_x = info[x].x_org;
-          offset_y = info[y].y_org;
+        if (info[i].x_org <= root_x && root_x <= (info[i].x_org + info[i].width)
+            && info[i].y_org <= root_y && root_y <= (info[i].y_org + info[i].height)) {
+          offset_x = info[i].x_org;
+          offset_y = info[i].y_org;
           d_width = info[i].width;
           d_height = info[i].height;
+          break;
         }
       }
+    }
     XFree(info);
   }
 #endif
 
-  /* fprintf(stderr, "offset_x:\t%d\n" */
-  /*                 "offset_y:\t%d\n" */
-  /*                 "d_width:\t%d\n" */
-  /*                 "d_height:\t%d\n" */
-  /*         , offset_x, offset_y, d_width, d_height); */
-
   Colormap cmap = DefaultColormap(d, DefaultScreen(d));
   XColor p_fg, p_bg,
     compl_fg, compl_bg,
@@ -871,33 +884,33 @@ int main() {
     .ps1                        = ps1,
     .ps1len                     = strlen(ps1)
   };
-    
-#ifdef USE_XFT
-    r.xftdraw = XftDrawCreate(d, w, DefaultVisual(d, 0), DefaultColormap(d, 0));
 
-    // prompt
-    XRenderColor xrcolor;
-    xrcolor.red          = p_fg.red;
-    xrcolor.green        = p_fg.red;
-    xrcolor.blue         = p_fg.red;
-    xrcolor.alpha        = 65535;
-    XftColorAllocValue(d, DefaultVisual(d, 0), DefaultColormap(d, 0), &xrcolor, &r.xft_prompt);
+#ifdef USE_XFT
+  r.xftdraw = XftDrawCreate(d, w, DefaultVisual(d, 0), DefaultColormap(d, 0));
 
-    // completion
-    xrcolor.red          = compl_fg.red;
-    xrcolor.green        = compl_fg.green;
-    xrcolor.blue         = compl_fg.blue;
-    xrcolor.alpha        = 65535;
-    XftColorAllocValue(d, DefaultVisual(d, 0), DefaultColormap(d, 0), &xrcolor, &r.xft_completion);
+  // prompt
+  XRenderColor xrcolor;
+  xrcolor.red          = p_fg.red;
+  xrcolor.green        = p_fg.red;
+  xrcolor.blue         = p_fg.red;
+  xrcolor.alpha        = 65535;
+  XftColorAllocValue(d, DefaultVisual(d, 0), DefaultColormap(d, 0), &xrcolor, &r.xft_prompt);
 
-    // completion highlighted
-    xrcolor.red          = compl_highlighted_fg.red;
-    xrcolor.green        = compl_highlighted_fg.green;
-    xrcolor.blue         = compl_highlighted_fg.blue;
-    xrcolor.alpha        = 65535;
-    XftColorAllocValue(d, DefaultVisual(d, 0), DefaultColormap(d, 0), &xrcolor, &r.xft_completion_highlighted);
+  // completion
+  xrcolor.red          = compl_fg.red;
+  xrcolor.green        = compl_fg.green;
+  xrcolor.blue         = compl_fg.blue;
+  xrcolor.alpha        = 65535;
+  XftColorAllocValue(d, DefaultVisual(d, 0), DefaultColormap(d, 0), &xrcolor, &r.xft_completion);
+
+  // completion highlighted
+  xrcolor.red          = compl_highlighted_fg.red;
+  xrcolor.green        = compl_highlighted_fg.green;
+  xrcolor.blue         = compl_highlighted_fg.blue;
+  xrcolor.alpha        = 65535;
+  XftColorAllocValue(d, DefaultVisual(d, 0), DefaultColormap(d, 0), &xrcolor, &r.xft_completion_highlighted);
 #endif
-    
+
   // load the colors in our GCs
   XSetForeground(d, r.prompt, p_fg.pixel);
   XSetForeground(d, r.prompt_bg, p_bg.pixel);