[hackers] [dmenu] input focus: calculate areas of intersection || Connor Lane Smith

From: <hg_AT_suckless.org>
Date: Wed, 26 Oct 2011 13:14:56 +0200 (CEST)

changeset: 455:08aadc67fc2b
tag: tip
user: Connor Lane Smith <cls_AT_lubutu.com>
date: Wed Oct 26 12:14:50 2011 +0100
files: dmenu.c
description:
input focus: calculate areas of intersection


diff -r 6341d6b4c23f -r 08aadc67fc2b dmenu.c
--- a/dmenu.c Mon Oct 17 10:22:23 2011 +0100
+++ b/dmenu.c Wed Oct 26 12:14:50 2011 +0100
_AT_@ -13,9 +13,10 @@
 #endif
 #include "draw.h"
 
-#define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh))
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \
+ * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
 
 typedef struct Item Item;
 struct Item {
_AT_@ -513,19 +514,28 @@
         mh = (lines + 1) * bh;
 #ifdef XINERAMA
         if((info = XineramaQueryScreens(dc->dpy, &n))) {
- int i, di;
+ int a, j, di, i = 0, area = 0;
                 unsigned int du;
- Window w, dw;
+ Window w, pw, dw, *dws;
                 XWindowAttributes wa;
 
                 XGetInputFocus(dc->dpy, &w, &di);
- if(w != root && w != PointerRoot && w != None && XGetWindowAttributes(dc->dpy, w, &wa))
- XTranslateCoordinates(dc->dpy, w, root, wa.x, wa.y, &x, &y, &dw);
- else
- XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);
- for(i = 0; i < n-1; i++)
- if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))
- break;
+ if(w != root && w != PointerRoot && w != None) {
+ do {
+ if(XQueryTree(dc->dpy, (pw = w), &dw, &w, &dws, &du) && dws)
+ XFree(dws);
+ } while(w != root && w != pw);
+ if(XGetWindowAttributes(dc->dpy, pw, &wa))
+ for(j = 0; j < n; j++)
+ if((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) {
+ area = a;
+ i = j;
+ }
+ }
+ if(!area && XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du))
+ for(i = 0; i < n; i++)
+ if(INTERSECT(x, y, 1, 1, info[i]))
+ break;
                 x = info[i].x_org;
                 y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
                 mw = info[i].width;
Received on Wed Oct 26 2011 - 13:14:56 CEST

This archive was generated by hypermail 2.3.0 : Wed Oct 26 2011 - 13:24:05 CEST