about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--client.c116
-rw-r--r--dwm.h7
-rw-r--r--event.c30
-rw-r--r--main.c1
-rw-r--r--tag.c29
5 files changed, 105 insertions, 78 deletions
diff --git a/client.c b/client.c
index fa48644..beb7e35 100644
--- a/client.c
+++ b/client.c
@@ -16,16 +16,16 @@ resizetitle(Client *c)
 {
 	int i;
 
-	c->tw = 0;
+	c->bw = 0;
 	for(i = 0; i < TLast; i++)
 		if(c->tags[i])
-			c->tw += textw(c->tags[i]);
-	c->tw += textw(c->name);
-	if(c->tw > c->w)
-		c->tw = c->w + 2;
-	c->tx = c->x + c->w - c->tw + 2;
-	c->ty = c->y;
-	XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
+			c->bw += textw(c->tags[i]);
+	c->bw += textw(c->name);
+	if(c->bw > *c->w)
+		c->bw = *c->w + 2;
+	c->bx = *c->x + *c->w - c->bw + 2;
+	c->by = *c->y;
+	XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
 }
 
 static int
@@ -39,8 +39,8 @@ xerrordummy(Display *dsply, XErrorEvent *ee)
 void
 ban(Client *c)
 {
-	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
-	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
+	XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
+	XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
 }
 
 void
@@ -124,12 +124,12 @@ gravitate(Client *c, Bool invert)
 	case EastGravity:
 	case CenterGravity:
 	case WestGravity:
-		dy = -(c->h / 2) + c->border;
+		dy = -(*c->h / 2) + c->border;
 		break;
 	case SouthEastGravity:
 	case SouthGravity:
 	case SouthWestGravity:
-		dy = -c->h;
+		dy = -(*c->h);
 		break;
 	default:
 		break;
@@ -145,12 +145,12 @@ gravitate(Client *c, Bool invert)
 	case NorthGravity:
 	case CenterGravity:
 	case SouthGravity:
-		dx = -(c->w / 2) + c->border;
+		dx = -(*c->w / 2) + c->border;
 		break;
 	case NorthEastGravity:
 	case EastGravity:
 	case SouthEastGravity:
-		dx = -(c->w + c->border);
+		dx = -(*c->w + c->border);
 		break;
 	default:
 		break;
@@ -160,8 +160,8 @@ gravitate(Client *c, Bool invert)
 		dx = -dx;
 		dy = -dy;
 	}
-	c->x += dx;
-	c->y += dy;
+	*c->x += dx;
+	*c->y += dy;
 }
 
 void
@@ -198,13 +198,13 @@ manage(Window w, XWindowAttributes *wa)
 
 	c = emallocz(sizeof(Client));
 	c->win = w;
-	c->tx = c->x = wa->x;
-	c->ty = c->y = wa->y;
-	if(c->y < bh)
-		c->ty = c->y += bh;
-	c->tw = c->w = wa->width;
-	c->h = wa->height;
-	c->th = bh;
+	c->bx = c->fx = c->tx = wa->x;
+	c->by = c->fy = c->ty = wa->y;
+	if(c->fy < bh)
+		c->by = c->fy = c->ty += bh;
+	c->bw = c->fw = c->tw = wa->width;
+	c->fh = c->th = wa->height;
+	c->bh = bh;
 	c->border = 1;
 	c->proto = getproto(c->win);
 	setsize(c);
@@ -215,12 +215,11 @@ manage(Window w, XWindowAttributes *wa)
 	twa.background_pixmap = ParentRelative;
 	twa.event_mask = ExposureMask;
 
-	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
+	c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
 			0, DefaultDepth(dpy, screen), CopyFromParent,
 			DefaultVisual(dpy, screen),
 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
 
-	settitle(c);
 	settags(c);
 
 	c->next = clients;
@@ -239,7 +238,11 @@ manage(Window w, XWindowAttributes *wa)
 		c->isfloat = trans
 			|| ((c->maxw == c->minw) && (c->maxh == c->minh));
 
+	setgeom(c);
+	settitle(c);
+
 	arrange(NULL);
+
 	/* mapping the window now prevents flicker */
 	if(c->tags[tsel]) {
 		XMapRaised(dpy, c->win);
@@ -259,10 +262,10 @@ maximize(Arg *arg)
 {
 	if(!sel)
 		return;
-	sel->x = sx;
-	sel->y = sy + bh;
-	sel->w = sw - 2 * sel->border;
-	sel->h = sh - 2 * sel->border - bh;
+	*sel->x = sx;
+	*sel->y = sy + bh;
+	*sel->w = sw - 2 * sel->border;
+	*sel->h = sh - 2 * sel->border - bh;
 	higher(sel);
 	resize(sel, False);
 }
@@ -286,32 +289,32 @@ resize(Client *c, Bool inc)
 
 	if(inc) {
 		if(c->incw)
-			c->w -= (c->w - c->basew) % c->incw;
+			*c->w -= (*c->w - c->basew) % c->incw;
 		if(c->inch)
-			c->h -= (c->h - c->baseh) % c->inch;
+			*c->h -= (*c->h - c->baseh) % c->inch;
 	}
-	if(c->x > sw) /* might happen on restart */
-		c->x = sw - c->w;
-	if(c->y > sh)
-		c->ty = c->y = sh - c->h;
-	if(c->minw && c->w < c->minw)
-		c->w = c->minw;
-	if(c->minh && c->h < c->minh)
-		c->h = c->minh;
-	if(c->maxw && c->w > c->maxw)
-		c->w = c->maxw;
-	if(c->maxh && c->h > c->maxh)
-		c->h = c->maxh;
+	if(*c->x > sw) /* might happen on restart */
+		*c->x = sw - *c->w;
+	if(*c->y > sh)
+		*c->y = sh - *c->h;
+	if(c->minw && *c->w < c->minw)
+		*c->w = c->minw;
+	if(c->minh && *c->h < c->minh)
+		*c->h = c->minh;
+	if(c->maxw && *c->w > c->maxw)
+		*c->w = c->maxw;
+	if(c->maxh && *c->h > c->maxh)
+		*c->h = c->maxh;
 	resizetitle(c);
 	XSetWindowBorderWidth(dpy, c->win, 1);
-	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
+	XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h);
 	e.type = ConfigureNotify;
 	e.event = c->win;
 	e.window = c->win;
-	e.x = c->x;
-	e.y = c->y;
-	e.width = c->w;
-	e.height = c->h;
+	e.x = *c->x;
+	e.y = *c->y;
+	e.width = *c->w;
+	e.height = *c->h;
 	e.border_width = c->border;
 	e.above = None;
 	e.override_redirect = False;
@@ -320,6 +323,23 @@ resize(Client *c, Bool inc)
 }
 
 void
+setgeom(Client *c)
+{
+	if((arrange == dotile) && !c->isfloat) {
+		c->x = &c->tx;
+		c->y = &c->ty;
+		c->w = &c->tw;
+		c->h = &c->th;
+	}
+	else {
+		c->x = &c->fx;
+		c->y = &c->fy;
+		c->w = &c->fw;
+		c->h = &c->fh;
+	}
+}
+
+void
 setsize(Client *c)
 {
 	XSizeHints size;
diff --git a/dwm.h b/dwm.h
index f2356a3..6b907a9 100644
--- a/dwm.h
+++ b/dwm.h
@@ -65,8 +65,10 @@ struct Client {
 	char name[256];
 	char *tags[TLast];
 	int proto;
-	int x, y, w, h;
-	int tx, ty, tw, th;
+	int *x, *y, *w, *h; /* current geom */
+	int bx, by, bw, bh; /* title bar */
+	int fx, fy, fw, fh; /* floating geom */
+	int tx, ty, tw, th; /* tiled geom */
 	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 	int grav;
 	unsigned int border;
@@ -120,6 +122,7 @@ extern void manage(Window w, XWindowAttributes *wa);
 extern void maximize(Arg *arg);
 extern void pop(Client *c);
 extern void resize(Client *c, Bool inc);
+extern void setgeom(Client *c);
 extern void setsize(Client *c);
 extern void settitle(Client *c);
 extern void unmanage(Client *c);
diff --git a/event.c b/event.c
index 4b8c07b..db95dfd 100644
--- a/event.c
+++ b/event.c
@@ -62,8 +62,8 @@ movemouse(Client *c)
 	unsigned int dui;
 	Window dummy;
 
-	ocx = c->x;
-	ocy = c->y;
+	ocx = *c->x;
+	ocy = *c->y;
 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
 				None, cursor[CurMove], CurrentTime) != GrabSuccess)
 		return;
@@ -77,8 +77,8 @@ movemouse(Client *c)
 			break;
 		case MotionNotify:
 			XSync(dpy, False);
-			c->x = ocx + (ev.xmotion.x - x1);
-			c->y = ocy + (ev.xmotion.y - y1);
+			*c->x = ocx + (ev.xmotion.x - x1);
+			*c->y = ocy + (ev.xmotion.y - y1);
 			resize(c, False);
 			break;
 		case ButtonRelease:
@@ -94,12 +94,12 @@ resizemouse(Client *c)
 	XEvent ev;
 	int ocx, ocy;
 
-	ocx = c->x;
-	ocy = c->y;
+	ocx = *c->x;
+	ocy = *c->y;
 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
 		return;
-	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
+	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, *c->w, *c->h);
 	for(;;) {
 		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
 		switch(ev.type) {
@@ -109,10 +109,10 @@ resizemouse(Client *c)
 			break;
 		case MotionNotify:
 			XSync(dpy, False);
-			c->w = abs(ocx - ev.xmotion.x);
-			c->h = abs(ocy - ev.xmotion.y);
-			c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
-			c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
+			*c->w = abs(ocx - ev.xmotion.x);
+			*c->h = abs(ocy - ev.xmotion.y);
+			*c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - *c->w;
+			*c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - *c->h;
 			resize(c, True);
 			break;
 		case ButtonRelease:
@@ -187,13 +187,13 @@ configurerequest(XEvent *e)
 	if((c = getclient(ev->window))) {
 		gravitate(c, True);
 		if(ev->value_mask & CWX)
-			c->x = ev->x;
+			*c->x = ev->x;
 		if(ev->value_mask & CWY)
-			c->y = ev->y;
+			*c->y = ev->y;
 		if(ev->value_mask & CWWidth)
-			c->w = ev->width;
+			*c->w = ev->width;
 		if(ev->value_mask & CWHeight)
-			c->h = ev->height;
+			*c->h = ev->height;
 		if(ev->value_mask & CWBorderWidth)
 			c->border = 1;
 		gravitate(c, False);
diff --git a/main.c b/main.c
index 6035fb6..e8577fe 100644
--- a/main.c
+++ b/main.c
@@ -261,6 +261,7 @@ main(int argc, char *argv[])
 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
 
 	strcpy(stext, "dwm-"VERSION);
+
 	scan();
 
 	/* main event loop, reads status text from stdin as well */
diff --git a/tag.c b/tag.c
index fce3c6e..d29a179 100644
--- a/tag.c
+++ b/tag.c
@@ -43,8 +43,10 @@ dofloat(Arg *arg)
 
 	arrange = dofloat;
 	for(c = clients; c; c = c->next) {
-		if(c->tags[tsel])
+		setgeom(c);
+		if(c->tags[tsel]) {
 			resize(c, True);
+		}
 		else
 			ban(c);
 	}
@@ -75,6 +77,7 @@ dotile(Arg *arg)
 		h = sh - bh;
 
 	for(i = 0, c = clients; c; c = c->next) {
+		setgeom(c);
 		if(c->tags[tsel]) {
 			if(c->isfloat) {
 				higher(c);
@@ -82,22 +85,22 @@ dotile(Arg *arg)
 				continue;
 			}
 			if(n == 1) {
-				c->x = sx;
-				c->y = sy + bh;
-				c->w = sw - 2 * c->border;
-				c->h = sh - 2 * c->border - bh;
+				*c->x = sx;
+				*c->y = sy + bh;
+				*c->w = sw - 2 * c->border;
+				*c->h = sh - 2 * c->border - bh;
 			}
 			else if(i == 0) {
-				c->x = sx;
-				c->y = sy + bh;
-				c->w = mw - 2 * c->border;
-				c->h = sh - 2 * c->border - bh;
+				*c->x = sx;
+				*c->y = sy + bh;
+				*c->w = mw - 2 * c->border;
+				*c->h = sh - 2 * c->border - bh;
 			}
 			else {
-				c->x = sx + mw;
-				c->y = sy + (i - 1) * h + bh;
-				c->w = w - 2 * c->border;
-				c->h = h - 2 * c->border;
+				*c->x = sx + mw;
+				*c->y = sy + (i - 1) * h + bh;
+				*c->w = w - 2 * c->border;
+				*c->h = h - 2 * c->border;
 			}
 			resize(c, False);
 			i++;
alt'>
65361948 ^
672e3e50 ^











1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160