calculate window/monitor intersection
80a9da55
1 file(s) · +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; |
|