X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/cd96232f7e97726413baeb0d411cc5f537575f0e..a72dc2fec277bb517adcb98edfb18f469333d980:/dwm.c

diff --git a/dwm.c b/dwm.c
index 36304c0..c0a15cc 100644
--- a/dwm.c
+++ b/dwm.c
@@ -136,6 +136,7 @@ struct Monitor {
 	Client *stack;
 	Monitor *next;
 	Window barwin;
+	Layout *lt[2];
 };
 
 typedef struct {
@@ -237,7 +238,7 @@ static void zoom(const Arg *arg);
 /* variables */
 static char stext[256];
 static int screen;
-static int sw, sh;   /* X display screen geometry x, y, width, height */
+static int sw, sh;           /* X display screen geometry x, y, width, height */
 static int bh, blw = 0;      /* bar geometry */
 static int (*xerrorxlib)(Display *, XErrorEvent *);
 static unsigned int numlockmask = 0;
@@ -261,9 +262,9 @@ static Bool running = True;
 static Cursor cursor[CurLast];
 static Display *dpy;
 static DC dc;
-static Layout *lt[] = { NULL, NULL };
 static Monitor *mons = NULL, *selmon = NULL;
 static Window root;
+
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
@@ -284,7 +285,8 @@ applyrules(Client *c) {
 			r = &rules[i];
 			if((!r->title || strstr(c->name, r->title))
 			&& (!r->class || (ch.res_class && strstr(ch.res_class, r->class)))
-			&& (!r->instance || (ch.res_name && strstr(ch.res_name, r->instance)))) {
+			&& (!r->instance || (ch.res_name && strstr(ch.res_name, r->instance))))
+			{
 				c->isfloating = r->isfloating;
 				c->tags |= r->tags;
 			}
@@ -305,7 +307,6 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
 	/* set minimum possible */
 	*w = MAX(1, *w);
 	*h = MAX(1, *h);
-
 	if(interact) {
 		if(*x > sw)
 			*x = sw - WIDTH(c);
@@ -375,8 +376,8 @@ arrange(void) {
 		showhide(m->stack);
 	focus(NULL);
 	for(m = mons; m; m = m->next) {
-		if(lt[m->sellt]->arrange)
-			lt[m->sellt]->arrange(m);
+		if(m->lt[m->sellt]->arrange)
+			m->lt[m->sellt]->arrange(m);
 		restack(m);
 	}
 }
@@ -455,7 +456,7 @@ cleanup(void) {
 	Monitor *m;
 
 	view(&a);
-	lt[selmon->sellt] = &foo;
+	selmon->lt[selmon->sellt] = &foo;
 	for(m = mons; m; m = m->next)
 		while(m->stack)
 			unmanage(m->stack);
@@ -546,7 +547,7 @@ configurerequest(XEvent *e) {
 	if((c = wintoclient(ev->window))) {
 		if(ev->value_mask & CWBorderWidth)
 			c->bw = ev->border_width;
-		else if(c->isfloating || !lt[selmon->sellt]->arrange) {
+		else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) {
 			m = c->mon;
 			if(ev->value_mask & CWX)
 				c->x = m->mx + ev->x;
@@ -667,7 +668,7 @@ drawbar(Monitor *m) {
 	}
 	if(blw > 0) {
 		dc.w = blw;
-		drawtext(lt[m->sellt]->symbol, dc.norm, False);
+		drawtext(m->lt[m->sellt]->symbol, dc.norm, False);
 		x = dc.x + dc.w;
 	}
 	else
@@ -903,7 +904,8 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
 		strncpy(text, (char *)name.value, size - 1);
 	else {
 		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
-		&& n > 0 && *list) {
+		&& n > 0 && *list)
+		{
 			strncpy(text, *list, size - 1);
 			XFreeStringList(list);
 		}
@@ -928,7 +930,8 @@ grabbuttons(Client *c, Bool focused) {
 						            buttons[i].mask | modifiers[j],
 						            c->win, False, BUTTONMASK,
 						            GrabModeAsync, GrabModeSync, None, None);
-		} else
+		}
+		else
 			XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
 			            BUTTONMASK, GrabModeAsync, GrabModeSync, None, None);
 	}
@@ -1167,11 +1170,11 @@ movemouse(const Arg *arg) {
 					ny = selmon->wy;
 				else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
 					ny = selmon->wy + selmon->wh - HEIGHT(c);
-				if(!c->isfloating && lt[selmon->sellt]->arrange
+				if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
 				                  && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
 					togglefloating(NULL);
 			}
-			if(!lt[selmon->sellt]->arrange || c->isfloating)
+			if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
 				resize(c, nx, ny, c->w, c->h, True);
 			break;
 		}
@@ -1286,11 +1289,11 @@ resizemouse(const Arg *arg) {
 			nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
 			if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww
 			        && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) {
-				if(!c->isfloating && lt[selmon->sellt]->arrange
+				if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
 				   && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
 					togglefloating(NULL);
 			}
-			if(!lt[selmon->sellt]->arrange || c->isfloating)
+			if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
 				resize(c, c->x, c->y, nw, nh, True);
 			break;
 		}
@@ -1315,9 +1318,9 @@ restack(Monitor *m) {
 	drawbars();
 	if(!m->sel)
 		return;
-	if(m->sel->isfloating || !lt[m->sellt]->arrange)
+	if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
 		XRaiseWindow(dpy, m->sel->win);
-	if(lt[m->sellt]->arrange) {
+	if(m->lt[m->sellt]->arrange) {
 		wc.stack_mode = Below;
 		wc.sibling = m->barwin;
 		for(c = m->stack; c; c = c->snext)
@@ -1385,7 +1388,7 @@ sendmon(Client *c, Monitor *m) {
 
 void
 setclientstate(Client *c, long state) {
-	long data[] = {state, None};
+	long data[] = { state, None };
 
 	XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
 			PropModeReplace, (unsigned char *)data, 2);
@@ -1393,10 +1396,10 @@ setclientstate(Client *c, long state) {
 
 void
 setlayout(const Arg *arg) {
-	if(!arg || !arg->v || arg->v != lt[selmon->sellt])
+	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
 		selmon->sellt ^= 1;
 	if(arg && arg->v)
-		lt[selmon->sellt] = (Layout *)arg->v;
+		selmon->lt[selmon->sellt] = (Layout *)arg->v;
 	if(selmon->sel)
 		arrange();
 	else
@@ -1408,7 +1411,7 @@ void
 setmfact(const Arg *arg) {
 	float f;
 
-	if(!arg || !lt[selmon->sellt]->arrange)
+	if(!arg || !selmon->lt[selmon->sellt]->arrange)
 		return;
 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
 	if(f < 0.1 || f > 0.9)
@@ -1430,8 +1433,6 @@ setup(void) {
 	sw = DisplayWidth(dpy, screen);
 	sh = DisplayHeight(dpy, screen);
 	bh = dc.h = dc.font.height + 2;
-	lt[0] = &layouts[0];
-	lt[1] = &layouts[1 % LENGTH(layouts)];
 	updategeom();
 	/* init atoms */
 	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
@@ -1481,7 +1482,7 @@ showhide(Client *c) {
 		return;
 	if(ISVISIBLE(c)) { /* show clients top down */
 		XMoveWindow(dpy, c->win, c->x, c->y);
-		if(!lt[c->mon->sellt]->arrange || c->isfloating)
+		if(!c->mon->lt[c->mon->sellt]->arrange || c->isfloating)
 			resize(c, c->x, c->y, c->w, c->h, False);
 		showhide(c->snext);
 	}
@@ -1727,6 +1728,8 @@ updategeom(void) {
 		m->mfact = mfact;
 		m->showbar = SHOWBAR;
 		m->topbar = TOPBAR;
+		m->lt[0] = &layouts[0];
+		m->lt[1] = &layouts[1 % LENGTH(layouts)];
 		updatebarpos(m);
 	}
 	/* reassign left over clients of disappeared monitors */
@@ -1913,8 +1916,8 @@ void
 zoom(const Arg *arg) {
 	Client *c = selmon->sel;
 
-	if(!lt[selmon->sellt]->arrange
-	|| lt[selmon->sellt]->arrange == monocle
+	if(!selmon->lt[selmon->sellt]->arrange
+	|| selmon->lt[selmon->sellt]->arrange == monocle
 	|| (selmon->sel && selmon->sel->isfloating))
 		return;
 	if(c == nexttiled(selmon->clients))