applied a collection of Christof Musik patches, and fixed an issue reported by waistcoats on IRC 6cbe47d4
Anselm R Garbe · 2009-06-30 15:51 1 file(s) · +32 −24
dwm.c +32 −24
125 125
	int screen_number;
126 126
	float mfact;
127 127
	int by, btx;          /* bar geometry */
128 -
	int my, mh;           /* vertical screen size*/
128 +
	int mx, my, mw, mh;           /* screen size */
129 129
	int wx, wy, ww, wh;   /* window area  */
130 130
	unsigned int seltags;
131 131
	unsigned int sellt;
542 542
void
543 543
configurerequest(XEvent *e) {
544 544
	Client *c;
545 +
	Monitor *m;
545 546
	XConfigureRequestEvent *ev = &e->xconfigurerequest;
546 547
	XWindowChanges wc;
547 548
549 550
		if(ev->value_mask & CWBorderWidth)
550 551
			c->bw = ev->border_width;
551 552
		else if(c->isfloating || !lt[selmon->sellt]->arrange) {
553 +
			m = c->mon;
552 554
			if(ev->value_mask & CWX)
553 -
				c->x = sx + ev->x;
555 +
				c->x = m->mx + ev->x;
554 556
			if(ev->value_mask & CWY)
555 -
				c->y = sy + ev->y;
557 +
				c->y = m->my + ev->y;
556 558
			if(ev->value_mask & CWWidth)
557 559
				c->w = ev->width;
558 560
			if(ev->value_mask & CWHeight)
559 561
				c->h = ev->height;
560 -
			if((c->x - sx + c->w) > sw && c->isfloating)
561 -
				c->x = sx + (sw / 2 - c->w / 2); /* center in x direction */
562 -
			if((c->y - sy + c->h) > sh && c->isfloating)
563 -
				c->y = sy + (sh / 2 - c->h / 2); /* center in y direction */
562 +
			if((c->x - m->mx + c->w) > m->mw && c->isfloating)
563 +
				c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */
564 +
			if((c->y - m->my + c->h) > m->mh && c->isfloating)
565 +
				c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */
564 566
			if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
565 567
				configure(c);
566 568
			if(ISVISIBLE(c))
872 874
			return m;
873 875
	if((c = getclient(w)))
874 876
		return c->mon;
875 -
	return NULL;
877 +
	return selmon;
876 878
}
877 879
878 880
Monitor *
891 893
	for(m = mons; m; m = m->next)
892 894
		if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh))
893 895
			return m;
894 -
	return NULL;
896 +
	return selmon;
895 897
}
896 898
897 899
Bool
1083 1085
	c->mon = selmon;
1084 1086
1085 1087
	/* geometry */
1086 -
	c->x = wa->x;
1087 -
	c->y = wa->y;
1088 +
	c->x = wa->x + selmon->wx;
1089 +
	c->y = wa->y + selmon->wy;
1088 1090
	c->w = wa->width;
1089 1091
	c->h = wa->height;
1090 1092
	c->oldbw = wa->border_width;
1091 -
	if(c->w == sw && c->h == sh) {
1092 -
		c->x = sx;
1093 -
		c->y = sy;
1093 +
	if(c->w == selmon->mw && c->h == selmon->mh) {
1094 +
		c->x = selmon->mx;
1095 +
		c->y = selmon->my;
1094 1096
		c->bw = 0;
1095 1097
	}
1096 1098
	else {
1097 -
		if(c->x + WIDTH(c) > sx + sw)
1098 -
			c->x = sx + sw - WIDTH(c);
1099 -
		if(c->y + HEIGHT(c) > sy + sh)
1100 -
			c->y = sy + sh - HEIGHT(c);
1101 -
		c->x = MAX(c->x, sx);
1099 +
		if(c->x + WIDTH(c) > selmon->mx + selmon->mw)
1100 +
			c->x = selmon->mx + selmon->mw - WIDTH(c);
1101 +
		if(c->y + HEIGHT(c) > selmon->my + selmon->mh)
1102 +
			c->y = selmon->my + selmon->mh - HEIGHT(c);
1103 +
		c->x = MAX(c->x, selmon->mx);
1102 1104
		/* only fix client y-offset, if the client center might cover the bar */
1103 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 1107
		c->bw = borderpx;
1106 1108
	}
1107 1109
1210 1212
	}
1211 1213
	while(ev.type != ButtonRelease);
1212 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 1216
		sendmon(c, m);
1217 +
		selmon = m;
1218 +
		focus(NULL);
1219 +
	}
1215 1220
}
1216 1221
1217 1222
Client *
1319 1324
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
1320 1325
	XUngrabPointer(dpy, CurrentTime);
1321 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 1328
		sendmon(c, m);
1329 +
		selmon = m;
1330 +
		focus(NULL);
1331 +
	}
1324 1332
}
1325 1333
1326 1334
void
1761 1769
	if(XineramaIsActive(dpy)) {
1762 1770
		for(i = 0, m = newmons; m; m = m->next, i++) {
1763 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 1773
			m->my = m->wy = info[i].y_org;
1766 -
			m->ww = info[i].width;
1774 +
			m->mw = m->ww = info[i].width;
1767 1775
			m->mh = m->wh = info[i].height;
1768 1776
		}
1769 1777
		XFree(info);