input focus: calculate areas of intersection
This commit is contained in:
parent
70b3418e3e
commit
dd29c5d480
34
dmenu.c
34
dmenu.c
|
@ -13,9 +13,10 @@
|
||||||
#endif
|
#endif
|
||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
|
|
||||||
#define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh))
|
#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
* MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
|
||||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
typedef struct Item Item;
|
typedef struct Item Item;
|
||||||
struct Item {
|
struct Item {
|
||||||
|
@ -513,19 +514,28 @@ setup(void) {
|
||||||
mh = (lines + 1) * bh;
|
mh = (lines + 1) * bh;
|
||||||
#ifdef XINERAMA
|
#ifdef XINERAMA
|
||||||
if((info = XineramaQueryScreens(dc->dpy, &n))) {
|
if((info = XineramaQueryScreens(dc->dpy, &n))) {
|
||||||
int i, di;
|
int a, j, di, i = 0, area = 0;
|
||||||
unsigned int du;
|
unsigned int du;
|
||||||
Window w, dw;
|
Window w, pw, dw, *dws;
|
||||||
XWindowAttributes wa;
|
XWindowAttributes wa;
|
||||||
|
|
||||||
XGetInputFocus(dc->dpy, &w, &di);
|
XGetInputFocus(dc->dpy, &w, &di);
|
||||||
if(w != root && w != PointerRoot && w != None && XGetWindowAttributes(dc->dpy, w, &wa))
|
if(w != root && w != PointerRoot && w != None) {
|
||||||
XTranslateCoordinates(dc->dpy, w, root, wa.x, wa.y, &x, &y, &dw);
|
do {
|
||||||
else
|
if(XQueryTree(dc->dpy, (pw = w), &dw, &w, &dws, &du) && dws)
|
||||||
XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);
|
XFree(dws);
|
||||||
for(i = 0; i < n-1; i++)
|
} while(w != root && w != pw);
|
||||||
if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))
|
if(XGetWindowAttributes(dc->dpy, pw, &wa))
|
||||||
break;
|
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;
|
x = info[i].x_org;
|
||||||
y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
|
y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
|
||||||
mw = info[i].width;
|
mw = info[i].width;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user