dwm.c
changeset 1428 2245e2b88983
parent 1427 f8ea02f86861
child 1429 a6f93a5772b2
equal deleted inserted replaced
1427:f8ea02f86861 1428:2245e2b88983
   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 		}
   870 	for(m = mons; m; m = m->next)
   872 	for(m = mons; m; m = m->next)
   871 		if(w == m->barwin)
   873 		if(w == m->barwin)
   872 			return m;
   874 			return m;
   873 	if((c = getclient(w)))
   875 	if((c = getclient(w)))
   874 		return c->mon;
   876 		return c->mon;
   875 	return NULL;
   877 	return selmon;
   876 }
   878 }
   877 
   879 
   878 Monitor *
   880 Monitor *
   879 getmonn(unsigned int n) {
   881 getmonn(unsigned int n) {
   880 	unsigned int i;
   882 	unsigned int i;
   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