dwm.c
changeset 1078 5cfd3c602ede
parent 1077 51b8e0c21bcb
child 1079 ba7486659f1d
equal deleted inserted replaced
1077:51b8e0c21bcb 1078:5cfd3c602ede
   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);
  1334 	}
  1334 	}
  1335 }
  1335 }
  1336 
  1336 
  1337 void
  1337 void
  1338 restack(void) {
  1338 restack(void) {
       
  1339 	unsigned int i;
  1339 	Client *c;
  1340 	Client *c;
  1340 	XEvent ev;
  1341 	XEvent ev;
  1341 	XWindowChanges wc;
  1342 	XWindowChanges wc;
  1342 	int s;
       
  1343 
  1343 
  1344 	drawbar();
  1344 	drawbar();
  1345 	if(!sel)
  1345 	if(!sel)
  1346 		return;
  1346 		return;
  1347 	if(sel->isfloating || (monitors[selmonitor].layout->arrange == floating))
  1347 	if(sel->isfloating || (monitors[selmonitor].layout->arrange == floating))
  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 }