123 |
123 |
124 struct Monitor { |
124 struct Monitor { |
125 int screen_number; |
125 int screen_number; |
126 float mfact; |
126 float mfact; |
127 int by, btx; /* bar geometry */ |
127 int by, btx; /* bar geometry */ |
128 int my, mh; /* vertical screen size*/ |
128 int mx, my, mw, mh; /* screen size */ |
129 int wx, wy, ww, wh; /* window area */ |
129 int wx, wy, ww, wh; /* window area */ |
130 unsigned int seltags; |
130 unsigned int seltags; |
131 unsigned int sellt; |
131 unsigned int sellt; |
132 unsigned int tagset[2]; |
132 unsigned int tagset[2]; |
133 Bool showbar; |
133 Bool showbar; |
540 } |
540 } |
541 |
541 |
542 void |
542 void |
543 configurerequest(XEvent *e) { |
543 configurerequest(XEvent *e) { |
544 Client *c; |
544 Client *c; |
|
545 Monitor *m; |
545 XConfigureRequestEvent *ev = &e->xconfigurerequest; |
546 XConfigureRequestEvent *ev = &e->xconfigurerequest; |
546 XWindowChanges wc; |
547 XWindowChanges wc; |
547 |
548 |
548 if((c = getclient(ev->window))) { |
549 if((c = getclient(ev->window))) { |
549 if(ev->value_mask & CWBorderWidth) |
550 if(ev->value_mask & CWBorderWidth) |
550 c->bw = ev->border_width; |
551 c->bw = ev->border_width; |
551 else if(c->isfloating || !lt[selmon->sellt]->arrange) { |
552 else if(c->isfloating || !lt[selmon->sellt]->arrange) { |
|
553 m = c->mon; |
552 if(ev->value_mask & CWX) |
554 if(ev->value_mask & CWX) |
553 c->x = sx + ev->x; |
555 c->x = m->mx + ev->x; |
554 if(ev->value_mask & CWY) |
556 if(ev->value_mask & CWY) |
555 c->y = sy + ev->y; |
557 c->y = m->my + ev->y; |
556 if(ev->value_mask & CWWidth) |
558 if(ev->value_mask & CWWidth) |
557 c->w = ev->width; |
559 c->w = ev->width; |
558 if(ev->value_mask & CWHeight) |
560 if(ev->value_mask & CWHeight) |
559 c->h = ev->height; |
561 c->h = ev->height; |
560 if((c->x - sx + c->w) > sw && c->isfloating) |
562 if((c->x - m->mx + c->w) > m->mw && c->isfloating) |
561 c->x = sx + (sw / 2 - c->w / 2); /* center in x direction */ |
563 c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */ |
562 if((c->y - sy + c->h) > sh && c->isfloating) |
564 if((c->y - m->my + c->h) > m->mh && c->isfloating) |
563 c->y = sy + (sh / 2 - c->h / 2); /* center in y direction */ |
565 c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */ |
564 if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) |
566 if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) |
565 configure(c); |
567 configure(c); |
566 if(ISVISIBLE(c)) |
568 if(ISVISIBLE(c)) |
567 XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); |
569 XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); |
568 } |
570 } |
889 Monitor *m; |
891 Monitor *m; |
890 |
892 |
891 for(m = mons; m; m = m->next) |
893 for(m = mons; m; m = m->next) |
892 if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh)) |
894 if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh)) |
893 return m; |
895 return m; |
894 return NULL; |
896 return selmon; |
895 } |
897 } |
896 |
898 |
897 Bool |
899 Bool |
898 getrootpointer(int *x, int *y) { |
900 getrootpointer(int *x, int *y) { |
899 int di; |
901 int di; |
1081 *c = cz; |
1083 *c = cz; |
1082 c->win = w; |
1084 c->win = w; |
1083 c->mon = selmon; |
1085 c->mon = selmon; |
1084 |
1086 |
1085 /* geometry */ |
1087 /* geometry */ |
1086 c->x = wa->x; |
1088 c->x = wa->x + selmon->wx; |
1087 c->y = wa->y; |
1089 c->y = wa->y + selmon->wy; |
1088 c->w = wa->width; |
1090 c->w = wa->width; |
1089 c->h = wa->height; |
1091 c->h = wa->height; |
1090 c->oldbw = wa->border_width; |
1092 c->oldbw = wa->border_width; |
1091 if(c->w == sw && c->h == sh) { |
1093 if(c->w == selmon->mw && c->h == selmon->mh) { |
1092 c->x = sx; |
1094 c->x = selmon->mx; |
1093 c->y = sy; |
1095 c->y = selmon->my; |
1094 c->bw = 0; |
1096 c->bw = 0; |
1095 } |
1097 } |
1096 else { |
1098 else { |
1097 if(c->x + WIDTH(c) > sx + sw) |
1099 if(c->x + WIDTH(c) > selmon->mx + selmon->mw) |
1098 c->x = sx + sw - WIDTH(c); |
1100 c->x = selmon->mx + selmon->mw - WIDTH(c); |
1099 if(c->y + HEIGHT(c) > sy + sh) |
1101 if(c->y + HEIGHT(c) > selmon->my + selmon->mh) |
1100 c->y = sy + sh - HEIGHT(c); |
1102 c->y = selmon->my + selmon->mh - HEIGHT(c); |
1101 c->x = MAX(c->x, sx); |
1103 c->x = MAX(c->x, selmon->mx); |
1102 /* only fix client y-offset, if the client center might cover the bar */ |
1104 /* only fix client y-offset, if the client center might cover the bar */ |
1103 c->y = MAX(c->y, ((c->mon->by == 0) && (c->x + (c->w / 2) >= c->mon->wx) |
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 c->bw = borderpx; |
1107 c->bw = borderpx; |
1106 } |
1108 } |
1107 |
1109 |
1108 wc.border_width = c->bw; |
1110 wc.border_width = c->bw; |
1109 XConfigureWindow(dpy, w, CWBorderWidth, &wc); |
1111 XConfigureWindow(dpy, w, CWBorderWidth, &wc); |
1208 break; |
1210 break; |
1209 } |
1211 } |
1210 } |
1212 } |
1211 while(ev.type != ButtonRelease); |
1213 while(ev.type != ButtonRelease); |
1212 XUngrabPointer(dpy, CurrentTime); |
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 sendmon(c, m); |
1216 sendmon(c, m); |
|
1217 selmon = m; |
|
1218 focus(NULL); |
|
1219 } |
1215 } |
1220 } |
1216 |
1221 |
1217 Client * |
1222 Client * |
1218 nexttiled(Client *c) { |
1223 nexttiled(Client *c) { |
1219 for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); |
1224 for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); |
1317 } |
1322 } |
1318 while(ev.type != ButtonRelease); |
1323 while(ev.type != ButtonRelease); |
1319 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1324 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1320 XUngrabPointer(dpy, CurrentTime); |
1325 XUngrabPointer(dpy, CurrentTime); |
1321 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
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 sendmon(c, m); |
1328 sendmon(c, m); |
|
1329 selmon = m; |
|
1330 focus(NULL); |
|
1331 } |
1324 } |
1332 } |
1325 |
1333 |
1326 void |
1334 void |
1327 restack(Monitor *m) { |
1335 restack(Monitor *m) { |
1328 Client *c; |
1336 Client *c; |
1759 else |
1767 else |
1760 #elif defined(XINERAMA) |
1768 #elif defined(XINERAMA) |
1761 if(XineramaIsActive(dpy)) { |
1769 if(XineramaIsActive(dpy)) { |
1762 for(i = 0, m = newmons; m; m = m->next, i++) { |
1770 for(i = 0, m = newmons; m; m = m->next, i++) { |
1763 m->screen_number = info[i].screen_number; |
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 m->my = m->wy = info[i].y_org; |
1773 m->my = m->wy = info[i].y_org; |
1766 m->ww = info[i].width; |
1774 m->mw = m->ww = info[i].width; |
1767 m->mh = m->wh = info[i].height; |
1775 m->mh = m->wh = info[i].height; |
1768 } |
1776 } |
1769 XFree(info); |
1777 XFree(info); |
1770 } |
1778 } |
1771 else |
1779 else |