196 void toggletag(const char *arg); |
196 void toggletag(const char *arg); |
197 void toggleview(const char *arg); |
197 void toggleview(const char *arg); |
198 void unban(Client *c); |
198 void unban(Client *c); |
199 void unmanage(Client *c); |
199 void unmanage(Client *c); |
200 void unmapnotify(XEvent *e); |
200 void unmapnotify(XEvent *e); |
201 void updatebarpos(Monitor *s); |
201 void updatebarpos(Monitor *m); |
202 void updatesizehints(Client *c); |
202 void updatesizehints(Client *c); |
203 void updatetitle(Client *c); |
203 void updatetitle(Client *c); |
204 void view(const char *arg); |
204 void view(const char *arg); |
205 void viewprevtag(const char *arg); /* views previous selected tags */ |
205 void viewprevtag(const char *arg); /* views previous selected tags */ |
206 int xerror(Display *dpy, XErrorEvent *ee); |
206 int xerror(Display *dpy, XErrorEvent *ee); |
334 buttonpress(XEvent *e) { |
334 buttonpress(XEvent *e) { |
335 unsigned int i, x; |
335 unsigned int i, x; |
336 Client *c; |
336 Client *c; |
337 XButtonPressedEvent *ev = &e->xbutton; |
337 XButtonPressedEvent *ev = &e->xbutton; |
338 |
338 |
339 Monitor s = monitors[monitorat(-1, -1)]; |
339 Monitor *m = &monitors[monitorat(-1, -1)]; |
340 |
340 |
341 if(ev->window == s.barwin) { |
341 if(ev->window == m->barwin) { |
342 x = 0; |
342 x = 0; |
343 for(i = 0; i < LENGTH(tags); i++) { |
343 for(i = 0; i < LENGTH(tags); i++) { |
344 x += textw(&s, tags[i]); |
344 x += textw(m, tags[i]); |
345 if(ev->x < x) { |
345 if(ev->x < x) { |
346 if(ev->button == Button1) { |
346 if(ev->button == Button1) { |
347 if(ev->state & MODKEY) |
347 if(ev->state & MODKEY) |
348 tag(tags[i]); |
348 tag(tags[i]); |
349 else |
349 else |
364 else if((c = getclient(ev->window))) { |
364 else if((c = getclient(ev->window))) { |
365 focus(c); |
365 focus(c); |
366 if(CLEANMASK(ev->state) != MODKEY) |
366 if(CLEANMASK(ev->state) != MODKEY) |
367 return; |
367 return; |
368 if(ev->button == Button1) { |
368 if(ev->button == Button1) { |
369 if((s.layout->arrange == floating) || c->isfloating) |
369 if((m->layout->arrange == floating) || c->isfloating) |
370 restack(); |
370 restack(); |
371 else |
371 else |
372 togglefloating(NULL); |
372 togglefloating(NULL); |
373 movemouse(c); |
373 movemouse(c); |
374 } |
374 } |
375 else if(ev->button == Button2) { |
375 else if(ev->button == Button2) { |
376 if((floating != s.layout->arrange) && c->isfloating) |
376 if((floating != m->layout->arrange) && c->isfloating) |
377 togglefloating(NULL); |
377 togglefloating(NULL); |
378 else |
378 else |
379 zoom(NULL); |
379 zoom(NULL); |
380 } |
380 } |
381 else if(ev->button == Button3 && !c->isfixed) { |
381 else if(ev->button == Button3 && !c->isfixed) { |
382 if((floating == s.layout->arrange) || c->isfloating) |
382 if((floating == m->layout->arrange) || c->isfloating) |
383 restack(); |
383 restack(); |
384 else |
384 else |
385 togglefloating(NULL); |
385 togglefloating(NULL); |
386 resizemouse(c); |
386 resizemouse(c); |
387 } |
387 } |
563 *tc = c->snext; |
563 *tc = c->snext; |
564 } |
564 } |
565 |
565 |
566 void |
566 void |
567 drawbar(void) { |
567 drawbar(void) { |
568 int i, x, s; |
568 int i, j, x; |
569 |
569 |
570 for(s = 0; s < mcount; ++s) { |
570 for(i = 0; i < mcount; i++) { |
571 Monitor *m = &monitors[s]; |
571 Monitor *m = &monitors[i]; |
572 m->dc.x = 0; |
572 m->dc.x = 0; |
573 for(i = 0; i < LENGTH(tags); i++) { |
573 for(j = 0; j < LENGTH(tags); j++) { |
574 m->dc.w = textw(m, tags[i]); |
574 m->dc.w = textw(m, tags[j]); |
575 if(m->seltags[i]) { |
575 if(m->seltags[j]) { |
576 drawtext(m, tags[i], m->dc.sel); |
576 drawtext(m, tags[j], m->dc.sel); |
577 drawsquare(m, sel && sel->tags[i] && sel->monitor == selmonitor, isoccupied(m, i), m->dc.sel); |
577 drawsquare(m, sel && sel->tags[j] && sel->monitor == selmonitor, isoccupied(m, j), m->dc.sel); |
578 } |
578 } |
579 else { |
579 else { |
580 drawtext(m, tags[i], m->dc.norm); |
580 drawtext(m, tags[j], m->dc.norm); |
581 drawsquare(m, sel && sel->tags[i] && sel->monitor == selmonitor, isoccupied(m, i), m->dc.norm); |
581 drawsquare(m, sel && sel->tags[j] && sel->monitor == selmonitor, isoccupied(m, j), m->dc.norm); |
582 } |
582 } |
583 m->dc.x += m->dc.w; |
583 m->dc.x += m->dc.w; |
584 } |
584 } |
585 m->dc.w = blw; |
585 m->dc.w = blw; |
586 drawtext(m, m->layout->symbol, m->dc.norm); |
586 drawtext(m, m->layout->symbol, m->dc.norm); |
1351 wc.sibling = monitors[selmonitor].barwin; |
1351 wc.sibling = monitors[selmonitor].barwin; |
1352 if(!sel->isfloating) { |
1352 if(!sel->isfloating) { |
1353 XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc); |
1353 XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc); |
1354 wc.sibling = sel->win; |
1354 wc.sibling = sel->win; |
1355 } |
1355 } |
1356 for(s = 0; s < mcount; s++) { |
1356 for(i = 0; i < mcount; i++) { |
1357 for(c = nexttiled(clients, &monitors[s]); c; c = nexttiled(c->next, &monitors[s])) { |
1357 for(c = nexttiled(clients, &monitors[i]); c; c = nexttiled(c->next, &monitors[i])) { |
1358 if(c == sel) |
1358 if(c == sel) |
1359 continue; |
1359 continue; |
1360 XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc); |
1360 XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc); |
1361 wc.sibling = c->win; |
1361 wc.sibling = c->win; |
1362 } |
1362 } |
1674 return textnw(m, text, strlen(text)) + m->dc.font.height; |
1674 return textnw(m, text, strlen(text)) + m->dc.font.height; |
1675 } |
1675 } |
1676 |
1676 |
1677 void |
1677 void |
1678 tile(void) { |
1678 tile(void) { |
1679 unsigned int i, n, nx, ny, nw, nh, mw, th; |
1679 unsigned int i, j, n, nx, ny, nw, nh, mw, th; |
1680 int s; |
|
1681 Client *c, *mc; |
1680 Client *c, *mc; |
1682 |
1681 |
1683 domwfact = dozoom = True; |
1682 domwfact = dozoom = True; |
1684 |
1683 |
1685 nw = 0; /* gcc stupidity requires this */ |
1684 nw = 0; /* gcc stupidity requires this */ |
1686 |
1685 |
1687 for (s = 0; s < mcount; s++) { |
1686 for (i = 0; i < mcount; i++) { |
1688 Monitor *m = &monitors[s]; |
1687 Monitor *m = &monitors[i]; |
1689 |
1688 |
1690 for(n = 0, c = nexttiled(clients, m); c; c = nexttiled(c->next, m)) |
1689 for(n = 0, c = nexttiled(clients, m); c; c = nexttiled(c->next, m)) |
1691 n++; |
1690 n++; |
1692 |
1691 |
1693 for(i = 0, c = mc = nexttiled(clients, m); c; c = nexttiled(c->next, m)) { |
1692 for(j = 0, c = mc = nexttiled(clients, m); c; c = nexttiled(c->next, m)) { |
1694 /* window geoms */ |
1693 /* window geoms */ |
1695 mw = (n == 1) ? m->waw : m->mwfact * m->waw; |
1694 mw = (n == 1) ? m->waw : m->mwfact * m->waw; |
1696 th = (n > 1) ? m->wah / (n - 1) : 0; |
1695 th = (n > 1) ? m->wah / (n - 1) : 0; |
1697 if(n > 1 && th < bh) |
1696 if(n > 1 && th < bh) |
1698 th = m->wah; |
1697 th = m->wah; |
1699 if(i == 0) { /* master */ |
1698 if(j == 0) { /* master */ |
1700 nx = m->wax; |
1699 nx = m->wax; |
1701 ny = m->way; |
1700 ny = m->way; |
1702 nw = mw - 2 * c->border; |
1701 nw = mw - 2 * c->border; |
1703 nh = m->wah - 2 * c->border; |
1702 nh = m->wah - 2 * c->border; |
1704 } |
1703 } |
1705 else { /* tile window */ |
1704 else { /* tile window */ |
1706 if(i == 1) { |
1705 if(j == 1) { |
1707 ny = m->way; |
1706 ny = m->way; |
1708 nx += mc->w + 2 * mc->border; |
1707 nx += mc->w + 2 * mc->border; |
1709 nw = m->waw - mw - 2 * c->border; |
1708 nw = m->waw - mw - 2 * c->border; |
1710 } |
1709 } |
1711 if(i + 1 == n) /* remainder */ |
1710 if(j + 1 == n) /* remainder */ |
1712 nh = (m->way + m->wah) - ny - 2 * c->border; |
1711 nh = (m->way + m->wah) - ny - 2 * c->border; |
1713 else |
1712 else |
1714 nh = th - 2 * c->border; |
1713 nh = th - 2 * c->border; |
1715 } |
1714 } |
1716 resize(c, nx, ny, nw, nh, RESIZEHINTS); |
1715 resize(c, nx, ny, nw, nh, RESIZEHINTS); |
1718 /* client doesn't accept size constraints */ |
1717 /* client doesn't accept size constraints */ |
1719 resize(c, nx, ny, nw, nh, False); |
1718 resize(c, nx, ny, nw, nh, False); |
1720 if(n > 1 && th != m->wah) |
1719 if(n > 1 && th != m->wah) |
1721 ny = c->y + c->h + 2 * c->border; |
1720 ny = c->y + c->h + 2 * c->border; |
1722 |
1721 |
1723 i++; |
1722 j++; |
1724 } |
1723 } |
1725 } |
1724 } |
1726 } |
1725 } |
1727 void |
1726 void |
1728 togglebar(const char *arg) { |
1727 togglebar(const char *arg) { |
1811 if((c = getclient(ev->window))) |
1810 if((c = getclient(ev->window))) |
1812 unmanage(c); |
1811 unmanage(c); |
1813 } |
1812 } |
1814 |
1813 |
1815 void |
1814 void |
1816 updatebarpos(Monitor *s) { |
1815 updatebarpos(Monitor *m) { |
1817 XEvent ev; |
1816 XEvent ev; |
1818 |
1817 |
1819 s->wax = s->sx; |
1818 m->wax = m->sx; |
1820 s->way = s->sy; |
1819 m->way = m->sy; |
1821 s->wah = s->sh; |
1820 m->wah = m->sh; |
1822 s->waw = s->sw; |
1821 m->waw = m->sw; |
1823 switch(bpos) { |
1822 switch(bpos) { |
1824 default: |
1823 default: |
1825 s->wah -= bh; |
1824 m->wah -= bh; |
1826 s->way += bh; |
1825 m->way += bh; |
1827 XMoveWindow(dpy, s->barwin, s->sx, s->sy); |
1826 XMoveWindow(dpy, m->barwin, m->sx, m->sy); |
1828 break; |
1827 break; |
1829 case BarBot: |
1828 case BarBot: |
1830 s->wah -= bh; |
1829 m->wah -= bh; |
1831 XMoveWindow(dpy, s->barwin, s->sx, s->sy + s->wah); |
1830 XMoveWindow(dpy, m->barwin, m->sx, m->sy + m->wah); |
1832 break; |
1831 break; |
1833 case BarOff: |
1832 case BarOff: |
1834 XMoveWindow(dpy, s->barwin, s->sx, s->sy - bh); |
1833 XMoveWindow(dpy, m->barwin, m->sx, m->sy - bh); |
1835 break; |
1834 break; |
1836 } |
1835 } |
1837 XSync(dpy, False); |
1836 XSync(dpy, False); |
1838 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
1837 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
1839 } |
1838 } |