tinput focus: calculate areas of intersection - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dd29c5d48084ae0f61a43bfbd5119fb480d83fb7
 (DIR) parent 70b3418e3e44a562cec860033d2a3bbf640f3084
 (HTM) Author: Connor Lane Smith <cls@lubutu.com>
       Date:   Wed, 26 Oct 2011 12:14:50 +0100
       
       input focus: calculate areas of intersection
       Diffstat:
         dmenu.c                             |      34 ++++++++++++++++++++-----------
       
       1 file changed, 22 insertions(+), 12 deletions(-)
       ---
 (DIR) diff --git a/dmenu.c b/dmenu.c
       t@@ -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 {
       t@@ -513,19 +514,28 @@ setup(void) {
                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;