applied a collection of Christof Musik patches, and fixed an issue reported by waistcoats on IRC
6cbe47d4
1 file(s) · +32 −24
| 125 | 125 | int screen_number; |
|
| 126 | 126 | float mfact; |
|
| 127 | 127 | int by, btx; /* bar geometry */ |
|
| 128 | - | int my, mh; /* vertical screen size*/ |
|
| 128 | + | int mx, my, mw, mh; /* screen size */ |
|
| 129 | 129 | int wx, wy, ww, wh; /* window area */ |
|
| 130 | 130 | unsigned int seltags; |
|
| 131 | 131 | unsigned int sellt; |
|
| 542 | 542 | void |
|
| 543 | 543 | configurerequest(XEvent *e) { |
|
| 544 | 544 | Client *c; |
|
| 545 | + | Monitor *m; |
|
| 545 | 546 | XConfigureRequestEvent *ev = &e->xconfigurerequest; |
|
| 546 | 547 | XWindowChanges wc; |
|
| 547 | 548 | ||
| 549 | 550 | if(ev->value_mask & CWBorderWidth) |
|
| 550 | 551 | c->bw = ev->border_width; |
|
| 551 | 552 | else if(c->isfloating || !lt[selmon->sellt]->arrange) { |
|
| 553 | + | m = c->mon; |
|
| 552 | 554 | if(ev->value_mask & CWX) |
|
| 553 | - | c->x = sx + ev->x; |
|
| 555 | + | c->x = m->mx + ev->x; |
|
| 554 | 556 | if(ev->value_mask & CWY) |
|
| 555 | - | c->y = sy + ev->y; |
|
| 557 | + | c->y = m->my + ev->y; |
|
| 556 | 558 | if(ev->value_mask & CWWidth) |
|
| 557 | 559 | c->w = ev->width; |
|
| 558 | 560 | if(ev->value_mask & CWHeight) |
|
| 559 | 561 | c->h = ev->height; |
|
| 560 | - | if((c->x - sx + c->w) > sw && c->isfloating) |
|
| 561 | - | c->x = sx + (sw / 2 - c->w / 2); /* center in x direction */ |
|
| 562 | - | if((c->y - sy + c->h) > sh && c->isfloating) |
|
| 563 | - | c->y = sy + (sh / 2 - c->h / 2); /* center in y direction */ |
|
| 562 | + | if((c->x - m->mx + c->w) > m->mw && c->isfloating) |
|
| 563 | + | c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */ |
|
| 564 | + | if((c->y - m->my + c->h) > m->mh && c->isfloating) |
|
| 565 | + | c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */ |
|
| 564 | 566 | if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) |
|
| 565 | 567 | configure(c); |
|
| 566 | 568 | if(ISVISIBLE(c)) |
|
| 872 | 874 | return m; |
|
| 873 | 875 | if((c = getclient(w))) |
|
| 874 | 876 | return c->mon; |
|
| 875 | - | return NULL; |
|
| 877 | + | return selmon; |
|
| 876 | 878 | } |
|
| 877 | 879 | ||
| 878 | 880 | Monitor * |
|
| 891 | 893 | for(m = mons; m; m = m->next) |
|
| 892 | 894 | if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh)) |
|
| 893 | 895 | return m; |
|
| 894 | - | return NULL; |
|
| 896 | + | return selmon; |
|
| 895 | 897 | } |
|
| 896 | 898 | ||
| 897 | 899 | Bool |
|
| 1083 | 1085 | c->mon = selmon; |
|
| 1084 | 1086 | ||
| 1085 | 1087 | /* geometry */ |
|
| 1086 | - | c->x = wa->x; |
|
| 1087 | - | c->y = wa->y; |
|
| 1088 | + | c->x = wa->x + selmon->wx; |
|
| 1089 | + | c->y = wa->y + selmon->wy; |
|
| 1088 | 1090 | c->w = wa->width; |
|
| 1089 | 1091 | c->h = wa->height; |
|
| 1090 | 1092 | c->oldbw = wa->border_width; |
|
| 1091 | - | if(c->w == sw && c->h == sh) { |
|
| 1092 | - | c->x = sx; |
|
| 1093 | - | c->y = sy; |
|
| 1093 | + | if(c->w == selmon->mw && c->h == selmon->mh) { |
|
| 1094 | + | c->x = selmon->mx; |
|
| 1095 | + | c->y = selmon->my; |
|
| 1094 | 1096 | c->bw = 0; |
|
| 1095 | 1097 | } |
|
| 1096 | 1098 | else { |
|
| 1097 | - | if(c->x + WIDTH(c) > sx + sw) |
|
| 1098 | - | c->x = sx + sw - WIDTH(c); |
|
| 1099 | - | if(c->y + HEIGHT(c) > sy + sh) |
|
| 1100 | - | c->y = sy + sh - HEIGHT(c); |
|
| 1101 | - | c->x = MAX(c->x, sx); |
|
| 1099 | + | if(c->x + WIDTH(c) > selmon->mx + selmon->mw) |
|
| 1100 | + | c->x = selmon->mx + selmon->mw - WIDTH(c); |
|
| 1101 | + | if(c->y + HEIGHT(c) > selmon->my + selmon->mh) |
|
| 1102 | + | c->y = selmon->my + selmon->mh - HEIGHT(c); |
|
| 1103 | + | c->x = MAX(c->x, selmon->mx); |
|
| 1102 | 1104 | /* only fix client y-offset, if the client center might cover the bar */ |
|
| 1103 | 1105 | c->y = MAX(c->y, ((c->mon->by == 0) && (c->x + (c->w / 2) >= c->mon->wx) |
|
| 1104 | - | && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : sy); |
|
| 1106 | + | && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : selmon->my); |
|
| 1105 | 1107 | c->bw = borderpx; |
|
| 1106 | 1108 | } |
|
| 1107 | 1109 | ||
| 1210 | 1212 | } |
|
| 1211 | 1213 | while(ev.type != ButtonRelease); |
|
| 1212 | 1214 | XUngrabPointer(dpy, CurrentTime); |
|
| 1213 | - | if((m = getmonxy(c->x + c->w / 2, c->y + c->h / 2)) != selmon) |
|
| 1215 | + | if((m = getmonxy(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { |
|
| 1214 | 1216 | sendmon(c, m); |
|
| 1217 | + | selmon = m; |
|
| 1218 | + | focus(NULL); |
|
| 1219 | + | } |
|
| 1215 | 1220 | } |
|
| 1216 | 1221 | ||
| 1217 | 1222 | Client * |
|
| 1319 | 1324 | XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
|
| 1320 | 1325 | XUngrabPointer(dpy, CurrentTime); |
|
| 1321 | 1326 | while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
|
| 1322 | - | if((m = getmonxy(c->x + c->w / 2, c->y + c->h / 2)) != selmon) |
|
| 1327 | + | if((m = getmonxy(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { |
|
| 1323 | 1328 | sendmon(c, m); |
|
| 1329 | + | selmon = m; |
|
| 1330 | + | focus(NULL); |
|
| 1331 | + | } |
|
| 1324 | 1332 | } |
|
| 1325 | 1333 | ||
| 1326 | 1334 | void |
|
| 1761 | 1769 | if(XineramaIsActive(dpy)) { |
|
| 1762 | 1770 | for(i = 0, m = newmons; m; m = m->next, i++) { |
|
| 1763 | 1771 | m->screen_number = info[i].screen_number; |
|
| 1764 | - | m->wx = info[i].x_org; |
|
| 1772 | + | m->mx = m->wx = info[i].x_org; |
|
| 1765 | 1773 | m->my = m->wy = info[i].y_org; |
|
| 1766 | - | m->ww = info[i].width; |
|
| 1774 | + | m->mw = m->ww = info[i].width; |
|
| 1767 | 1775 | m->mh = m->wh = info[i].height; |
|
| 1768 | 1776 | } |
|
| 1769 | 1777 | XFree(info); |
|