removed Monitor->root, since we do not support classical multihead
191cb9ce
1 file(s) · +49 −54
| 118 | 118 | ||
| 119 | 119 | typedef struct { |
|
| 120 | 120 | int screen; |
|
| 121 | - | Window root; |
|
| 122 | 121 | Window barwin; |
|
| 123 | 122 | int sx, sy, sw, sh, wax, way, wah, waw; |
|
| 124 | 123 | DC dc; |
|
| 216 | 215 | /* variables */ |
|
| 217 | 216 | char stext[256]; |
|
| 218 | 217 | int mcount = 1; |
|
| 218 | + | int selmonitor = 0; |
|
| 219 | 219 | int (*xerrorxlib)(Display *, XErrorEvent *); |
|
| 220 | 220 | unsigned int bh, bpos; |
|
| 221 | 221 | unsigned int blw = 0; |
|
| 248 | 248 | DC dc = {0}; |
|
| 249 | 249 | Regs *regs = NULL; |
|
| 250 | 250 | Monitor *monitors; |
|
| 251 | - | int selmonitor = 0; |
|
| 251 | + | Window root; |
|
| 252 | 252 | ||
| 253 | 253 | /* configuration, allows nested code to access above variables */ |
|
| 254 | 254 | #include "config.h" |
|
| 414 | 414 | XFreeFontSet(dpy, m->dc.font.set); |
|
| 415 | 415 | else |
|
| 416 | 416 | XFreeFont(dpy, m->dc.font.xfont); |
|
| 417 | - | XUngrabKey(dpy, AnyKey, AnyModifier, m->root); |
|
| 417 | + | XUngrabKey(dpy, AnyKey, AnyModifier, root); |
|
| 418 | 418 | XFreePixmap(dpy, m->dc.drawable); |
|
| 419 | 419 | XFreeGC(dpy, m->dc.gc); |
|
| 420 | 420 | XDestroyWindow(dpy, m->barwin); |
|
| 475 | 475 | XConfigureEvent *ev = &e->xconfigure; |
|
| 476 | 476 | Monitor *m = &monitors[selmonitor]; |
|
| 477 | 477 | ||
| 478 | - | if(ev->window == m->root && (ev->width != m->sw || ev->height != m->sh)) { |
|
| 478 | + | if(ev->window == root && (ev->width != m->sw || ev->height != m->sh)) { |
|
| 479 | 479 | m->sw = ev->width; |
|
| 480 | 480 | m->sh = ev->height; |
|
| 481 | 481 | XFreePixmap(dpy, dc.drawable); |
|
| 482 | - | dc.drawable = XCreatePixmap(dpy, m->root, m->sw, bh, DefaultDepth(dpy, m->screen)); |
|
| 482 | + | dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, m->screen)); |
|
| 483 | 483 | XResizeWindow(dpy, m->barwin, m->sw, bh); |
|
| 484 | 484 | updatebarpos(m); |
|
| 485 | 485 | arrange(); |
|
| 687 | 687 | XCrossingEvent *ev = &e->xcrossing; |
|
| 688 | 688 | ||
| 689 | 689 | if(ev->mode != NotifyNormal || ev->detail == NotifyInferior) { |
|
| 690 | - | if(!isxinerama || ev->window != monitors[selmonitor].root) |
|
| 690 | + | if(!isxinerama || ev->window != root) |
|
| 691 | 691 | return; |
|
| 692 | 692 | } |
|
| 693 | 693 | if((c = getclient(ev->window))) |
|
| 755 | 755 | selmonitor = c->monitor; |
|
| 756 | 756 | } |
|
| 757 | 757 | else { |
|
| 758 | - | XSetInputFocus(dpy, m->root, RevertToPointerRoot, CurrentTime); |
|
| 758 | + | XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); |
|
| 759 | 759 | drawbar(); |
|
| 760 | 760 | } |
|
| 761 | 761 | } |
|
| 914 | 914 | } |
|
| 915 | 915 | XFreeModifiermap(modmap); |
|
| 916 | 916 | ||
| 917 | - | for(i = 0; i < mcount; i++) { |
|
| 918 | - | Monitor *m = &monitors[i]; |
|
| 919 | - | XUngrabKey(dpy, AnyKey, AnyModifier, m->root); |
|
| 920 | - | for(j = 0; j < LENGTH(keys); j++) { |
|
| 921 | - | code = XKeysymToKeycode(dpy, keys[j].keysym); |
|
| 922 | - | XGrabKey(dpy, code, keys[j].mod, m->root, True, |
|
| 923 | - | GrabModeAsync, GrabModeAsync); |
|
| 924 | - | XGrabKey(dpy, code, keys[j].mod | LockMask, m->root, True, |
|
| 925 | - | GrabModeAsync, GrabModeAsync); |
|
| 926 | - | XGrabKey(dpy, code, keys[j].mod | numlockmask, m->root, True, |
|
| 927 | - | GrabModeAsync, GrabModeAsync); |
|
| 928 | - | XGrabKey(dpy, code, keys[j].mod | numlockmask | LockMask, m->root, True, |
|
| 929 | - | GrabModeAsync, GrabModeAsync); |
|
| 930 | - | } |
|
| 917 | + | XUngrabKey(dpy, AnyKey, AnyModifier, root); |
|
| 918 | + | for(i = 0; i < LENGTH(keys); i++) { |
|
| 919 | + | code = XKeysymToKeycode(dpy, keys[i].keysym); |
|
| 920 | + | XGrabKey(dpy, code, keys[i].mod, root, True, |
|
| 921 | + | GrabModeAsync, GrabModeAsync); |
|
| 922 | + | XGrabKey(dpy, code, keys[i].mod | LockMask, root, True, |
|
| 923 | + | GrabModeAsync, GrabModeAsync); |
|
| 924 | + | XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True, |
|
| 925 | + | GrabModeAsync, GrabModeAsync); |
|
| 926 | + | XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True, |
|
| 927 | + | GrabModeAsync, GrabModeAsync); |
|
| 931 | 928 | } |
|
| 932 | 929 | } |
|
| 933 | 930 | ||
| 1153 | 1150 | Window win; |
|
| 1154 | 1151 | unsigned int mask; |
|
| 1155 | 1152 | ||
| 1156 | - | XQueryPointer(dpy, monitors[selmonitor].root, &win, &win, &x, &y, &i, &i, &mask); |
|
| 1153 | + | XQueryPointer(dpy, root, &win, &win, &x, &y, &i, &i, &mask); |
|
| 1157 | 1154 | for(i = 0; i < mcount; i++) { |
|
| 1158 | 1155 | if((x >= monitors[i].sx && x < monitors[i].sx + monitors[i].sw) |
|
| 1159 | 1156 | && (y >= monitors[i].sy && y < monitors[i].sy + monitors[i].sh)) { |
|
| 1172 | 1169 | ||
| 1173 | 1170 | ocx = nx = c->x; |
|
| 1174 | 1171 | ocy = ny = c->y; |
|
| 1175 | - | if(XGrabPointer(dpy, monitors[selmonitor].root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
| 1172 | + | if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
| 1176 | 1173 | None, cursor[CurMove], CurrentTime) != GrabSuccess) |
|
| 1177 | 1174 | return; |
|
| 1178 | - | XQueryPointer(dpy, monitors[selmonitor].root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
|
| 1175 | + | XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
|
| 1179 | 1176 | for(;;) { |
|
| 1180 | 1177 | XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev); |
|
| 1181 | 1178 | switch (ev.type) { |
|
| 1342 | 1339 | ||
| 1343 | 1340 | ocx = c->x; |
|
| 1344 | 1341 | ocy = c->y; |
|
| 1345 | - | if(XGrabPointer(dpy, monitors[selmonitor].root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
| 1342 | + | if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
| 1346 | 1343 | None, cursor[CurResize], CurrentTime) != GrabSuccess) |
|
| 1347 | 1344 | return; |
|
| 1348 | 1345 | XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1); |
|
| 1469 | 1466 | ||
| 1470 | 1467 | void |
|
| 1471 | 1468 | scan(void) { |
|
| 1472 | - | unsigned int i, j, num; |
|
| 1469 | + | unsigned int i, num; |
|
| 1473 | 1470 | Window *wins, d1, d2; |
|
| 1474 | 1471 | XWindowAttributes wa; |
|
| 1475 | 1472 | ||
| 1476 | - | for(i = 0; i < mcount; i++) { |
|
| 1477 | - | Monitor *m = &monitors[i]; |
|
| 1478 | - | wins = NULL; |
|
| 1479 | - | if(XQueryTree(dpy, m->root, &d1, &d2, &wins, &num)) { |
|
| 1480 | - | for(j = 0; j < num; j++) { |
|
| 1481 | - | if(!XGetWindowAttributes(dpy, wins[j], &wa) |
|
| 1482 | - | || wa.override_redirect || XGetTransientForHint(dpy, wins[j], &d1)) |
|
| 1483 | - | continue; |
|
| 1484 | - | if(wa.map_state == IsViewable || getstate(wins[j]) == IconicState) |
|
| 1485 | - | manage(wins[j], &wa); |
|
| 1486 | - | } |
|
| 1487 | - | for(j = 0; j < num; j++) { /* now the transients */ |
|
| 1488 | - | if(!XGetWindowAttributes(dpy, wins[j], &wa)) |
|
| 1489 | - | continue; |
|
| 1490 | - | if(XGetTransientForHint(dpy, wins[j], &d1) |
|
| 1491 | - | && (wa.map_state == IsViewable || getstate(wins[j]) == IconicState)) |
|
| 1492 | - | manage(wins[j], &wa); |
|
| 1493 | - | } |
|
| 1473 | + | wins = NULL; |
|
| 1474 | + | if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { |
|
| 1475 | + | for(i = 0; i < num; i++) { |
|
| 1476 | + | if(!XGetWindowAttributes(dpy, wins[i], &wa) |
|
| 1477 | + | || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) |
|
| 1478 | + | continue; |
|
| 1479 | + | if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState) |
|
| 1480 | + | manage(wins[i], &wa); |
|
| 1481 | + | } |
|
| 1482 | + | for(i = 0; i < num; i++) { /* now the transients */ |
|
| 1483 | + | if(!XGetWindowAttributes(dpy, wins[i], &wa)) |
|
| 1484 | + | continue; |
|
| 1485 | + | if(XGetTransientForHint(dpy, wins[i], &d1) |
|
| 1486 | + | && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) |
|
| 1487 | + | manage(wins[i], &wa); |
|
| 1494 | 1488 | } |
|
| 1495 | - | if(wins) |
|
| 1496 | - | XFree(wins); |
|
| 1497 | 1489 | } |
|
| 1490 | + | if(wins) |
|
| 1491 | + | XFree(wins); |
|
| 1498 | 1492 | } |
|
| 1499 | 1493 | ||
| 1500 | 1494 | void |
|
| 1579 | 1573 | info = XineramaQueryScreens(dpy, &mcount); |
|
| 1580 | 1574 | monitors = emallocz(mcount * sizeof(Monitor)); |
|
| 1581 | 1575 | ||
| 1576 | + | root = DefaultRootWindow(dpy); |
|
| 1577 | + | ||
| 1582 | 1578 | for(i = 0; i < mcount; i++) { |
|
| 1583 | 1579 | /* init geometry */ |
|
| 1584 | 1580 | m = &monitors[i]; |
|
| 1585 | 1581 | ||
| 1586 | 1582 | m->screen = isxinerama ? 0 : i; |
|
| 1587 | - | m->root = RootWindow(dpy, m->screen); |
|
| 1588 | 1583 | ||
| 1589 | 1584 | if (mcount != 1 && isxinerama) { |
|
| 1590 | 1585 | m->sx = info[i].x_org; |
|
| 1632 | 1627 | wa.event_mask = ButtonPressMask | ExposureMask; |
|
| 1633 | 1628 | ||
| 1634 | 1629 | /* init bars */ |
|
| 1635 | - | m->barwin = XCreateWindow(dpy, m->root, m->sx, m->sy, m->sw, bh, 0, |
|
| 1630 | + | m->barwin = XCreateWindow(dpy, root, m->sx, m->sy, m->sw, bh, 0, |
|
| 1636 | 1631 | DefaultDepth(dpy, m->screen), CopyFromParent, DefaultVisual(dpy, m->screen), |
|
| 1637 | 1632 | CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); |
|
| 1638 | 1633 | XDefineCursor(dpy, m->barwin, cursor[CurNormal]); |
|
| 1639 | 1634 | updatebarpos(m); |
|
| 1640 | 1635 | XMapRaised(dpy, m->barwin); |
|
| 1641 | 1636 | strcpy(stext, "dwm-"VERSION); |
|
| 1642 | - | m->dc.drawable = XCreatePixmap(dpy, m->root, m->sw, bh, DefaultDepth(dpy, m->screen)); |
|
| 1643 | - | m->dc.gc = XCreateGC(dpy, m->root, 0, 0); |
|
| 1637 | + | m->dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, m->screen)); |
|
| 1638 | + | m->dc.gc = XCreateGC(dpy, root, 0, 0); |
|
| 1644 | 1639 | XSetLineAttributes(dpy, m->dc.gc, 1, LineSolid, CapButt, JoinMiter); |
|
| 1645 | 1640 | if(!m->dc.font.set) |
|
| 1646 | 1641 | XSetFont(dpy, m->dc.gc, m->dc.font.xfont->fid); |
|
| 1647 | 1642 | ||
| 1648 | 1643 | /* EWMH support per monitor */ |
|
| 1649 | - | XChangeProperty(dpy, m->root, netatom[NetSupported], XA_ATOM, 32, |
|
| 1644 | + | XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, |
|
| 1650 | 1645 | PropModeReplace, (unsigned char *) netatom, NetLast); |
|
| 1651 | 1646 | ||
| 1652 | 1647 | /* select for events */ |
|
| 1653 | 1648 | wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask |
|
| 1654 | 1649 | | EnterWindowMask | LeaveWindowMask | StructureNotifyMask; |
|
| 1655 | - | XChangeWindowAttributes(dpy, m->root, CWEventMask | CWCursor, &wa); |
|
| 1656 | - | XSelectInput(dpy, m->root, wa.event_mask); |
|
| 1650 | + | XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); |
|
| 1651 | + | XSelectInput(dpy, root, wa.event_mask); |
|
| 1657 | 1652 | } |
|
| 1658 | 1653 | if(info) |
|
| 1659 | 1654 | XFree(info); |
|
| 2044 | 2039 | selectmonitor(const char *arg) { |
|
| 2045 | 2040 | Monitor *m = &monitors[arg ? atoi(arg) : (monitorat()+1) % mcount]; |
|
| 2046 | 2041 | ||
| 2047 | - | XWarpPointer(dpy, None, m->root, 0, 0, 0, 0, m->wax+m->waw/2, m->way+m->wah/2); |
|
| 2042 | + | XWarpPointer(dpy, None, root, 0, 0, 0, 0, m->wax+m->waw/2, m->way+m->wah/2); |
|
| 2048 | 2043 | focus(NULL); |
|
| 2049 | 2044 | } |
|
| 2050 | 2045 | ||