calculate window/monitor intersection 80a9da55
Connor Lane Smith · 2011-11-06 20:31 1 file(s) · +19 −15
dwm.c +19 −15
43 43
/* macros */
44 44
#define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
45 45
#define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
46 -
#define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))
46 +
#define INTERSECT(x,y,w,h,m)    (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
47 +
                               * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
47 48
#define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
48 49
#define LENGTH(X)               (sizeof X / sizeof X[0])
49 50
#define MAX(A, B)               ((A) > (B) ? (A) : (B))
203 204
static Client *nexttiled(Client *c);
204 205
static void pop(Client *);
205 206
static void propertynotify(XEvent *e);
206 -
static Monitor *ptrtomon(int x, int y);
207 207
static void quit(const Arg *arg);
208 +
static Monitor *recttomon(int x, int y, int w, int h);
208 209
static void resize(Client *c, int x, int y, int w, int h, Bool interact);
209 210
static void resizeclient(Client *c, int x, int y, int w, int h);
210 211
static void resizemouse(const Arg *arg);
1248 1249
		}
1249 1250
	} while(ev.type != ButtonRelease);
1250 1251
	XUngrabPointer(dpy, CurrentTime);
1251 -
	if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) {
1252 +
	if((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
1252 1253
		sendmon(c, m);
1253 1254
		selmon = m;
1254 1255
		focus(NULL);
1305 1306
	}
1306 1307
}
1307 1308
1309 +
void
1310 +
quit(const Arg *arg) {
1311 +
	running = False;
1312 +
}
1313 +
1308 1314
Monitor *
1309 -
ptrtomon(int x, int y) {
1310 -
	Monitor *m;
1315 +
recttomon(int x, int y, int w, int h) {
1316 +
	Monitor *m, *r = selmon;
1317 +
	int a, area = 0;
1311 1318
1312 1319
	for(m = mons; m; m = m->next)
1313 -
		if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh))
1314 -
			return m;
1315 -
	return selmon;
1316 -
}
1317 -
1318 -
void
1319 -
quit(const Arg *arg) {
1320 -
	running = False;
1320 +
		if((a = INTERSECT(x, y, w, h, m)) > area) {
1321 +
			area = a;
1322 +
			r = m;
1323 +
		}
1324 +
	return r;
1321 1325
}
1322 1326
1323 1327
void
1383 1387
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
1384 1388
	XUngrabPointer(dpy, CurrentTime);
1385 1389
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
1386 -
	if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) {
1390 +
	if((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
1387 1391
		sendmon(c, m);
1388 1392
		selmon = m;
1389 1393
		focus(NULL);
2051 2055
	Monitor *m;
2052 2056
2053 2057
	if(w == root && getrootptr(&x, &y))
2054 -
		return ptrtomon(x, y);
2058 +
		return recttomon(x, y, 1, 1);
2055 2059
	for(m = mons; m; m = m->next)
2056 2060
		if(w == m->barwin)
2057 2061
			return m;