fixed the layout symbol bug reported by Nibble (but using a different approach as he suggested) 9e8dd347
- optimised drawbar() and arrange() handling for multiple monitors, arrange only arranges the relevant monitors when applicable, same with drawbar
- need to release 5.7.1
Anselm R Garbe · 2009-09-27 10:31 2 file(s) · +39 −29
config.mk +1 −1
1 1
# dwm version
2 -
VERSION = 5.7
2 +
VERSION = 5.7.1
3 3
4 4
# Customize below to fit your system
5 5
dwm.c +38 −28
152 152
/* function declarations */
153 153
static void applyrules(Client *c);
154 154
static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
155 -
static void arrange(void);
155 +
static void arrange(Monitor *m);
156 +
static void arrangemon(Monitor *m);
156 157
static void attach(Client *c);
157 158
static void attachstack(Client *c);
158 159
static void buttonpress(XEvent *e);
379 380
}
380 381
381 382
void
382 -
arrange(void) {
383 -
	Monitor *m;
384 -
385 -
	for(m = mons; m; m = m->next)
383 +
arrange(Monitor *m) {
384 +
	if(m)
385 +
		showhide(m->stack);
386 +
	else for(m = mons; m; m = m->next)
386 387
		showhide(m->stack);
387 388
	focus(NULL);
388 -
	for(m = mons; m; m = m->next) {
389 -
		strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
390 -
		if(m->lt[m->sellt]->arrange)
391 -
			m->lt[m->sellt]->arrange(m);
392 -
		restack(m);
393 -
	}
389 +
	if(m)
390 +
		arrangemon(m);
391 +
	else for(m = mons; m; m = m->next)
392 +
		arrangemon(m);
393 +
}
394 +
395 +
void
396 +
arrangemon(Monitor *m) {
397 +
	strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
398 +
	if(m->lt[m->sellt]->arrange)
399 +
		m->lt[m->sellt]->arrange(m);
400 +
	restack(m);
394 401
}
395 402
396 403
void
546 553
			updatebars();
547 554
			for(m = mons; m; m = m->next)
548 555
				XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
549 -
			arrange();
556 +
			arrange(NULL);
550 557
		}
551 558
	}
552 559
}
1139 1146
	XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
1140 1147
	XMapWindow(dpy, c->win);
1141 1148
	setclientstate(c, NormalState);
1142 -
	arrange();
1149 +
	arrange(c->mon);
1143 1150
}
1144 1151
1145 1152
void
1265 1272
		case XA_WM_TRANSIENT_FOR:
1266 1273
			XGetTransientForHint(dpy, c->win, &trans);
1267 1274
			if(!c->isfloating && (c->isfloating = (wintoclient(trans) != NULL)))
1268 -
				arrange();
1275 +
				arrange(c->mon);
1269 1276
			break;
1270 1277
		case XA_WM_NORMAL_HINTS:
1271 1278
			updatesizehints(c);
1360 1367
	XEvent ev;
1361 1368
	XWindowChanges wc;
1362 1369
1363 -
	drawbars();
1370 +
	drawbar(m);
1364 1371
	if(!m->sel)
1365 1372
		return;
1366 1373
	if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
1427 1434
	attach(c);
1428 1435
	attachstack(c);
1429 1436
	focus(NULL);
1430 -
	arrange();
1437 +
	arrange(NULL);
1431 1438
}
1432 1439
1433 1440
void
1442 1449
setlayout(const Arg *arg) {
1443 1450
	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
1444 1451
		selmon->sellt ^= 1;
1445 -
	if(arg && arg->v)
1452 +
	if(arg && arg->v) {
1446 1453
		selmon->lt[selmon->sellt] = (Layout *)arg->v;
1454 +
		strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
1455 +
	}
1447 1456
	if(selmon->sel)
1448 -
		arrange();
1457 +
		arrange(selmon);
1449 1458
	else
1450 -
		drawbars();
1459 +
		drawbar(selmon);
1451 1460
}
1452 1461
1453 1462
/* arg > 1.0 will set mfact absolutly */
1461 1470
	if(f < 0.1 || f > 0.9)
1462 1471
		return;
1463 1472
	selmon->mfact = f;
1464 -
	arrange();
1473 +
	arrange(selmon);
1465 1474
}
1466 1475
1467 1476
void
1558 1567
tag(const Arg *arg) {
1559 1568
	if(selmon->sel && arg->ui & TAGMASK) {
1560 1569
		selmon->sel->tags = arg->ui & TAGMASK;
1561 -
		arrange();
1570 +
		arrange(selmon);
1562 1571
	}
1563 1572
}
1564 1573
1615 1624
	selmon->showbar = !selmon->showbar;
1616 1625
	updatebarpos(selmon);
1617 1626
	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
1618 -
	arrange();
1627 +
	arrange(selmon);
1619 1628
}
1620 1629
1621 1630
void
1626 1635
	if(selmon->sel->isfloating)
1627 1636
		resize(selmon->sel, selmon->sel->x, selmon->sel->y,
1628 1637
		       selmon->sel->w, selmon->sel->h, False);
1629 -
	arrange();
1638 +
	arrange(selmon);
1630 1639
}
1631 1640
1632 1641
void
1638 1647
	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
1639 1648
	if(newtags) {
1640 1649
		selmon->sel->tags = newtags;
1641 -
		arrange();
1650 +
		arrange(selmon);
1642 1651
	}
1643 1652
}
1644 1653
1648 1657
1649 1658
	if(newtagset) {
1650 1659
		selmon->tagset[selmon->seltags] = newtagset;
1651 -
		arrange();
1660 +
		arrange(selmon);
1652 1661
	}
1653 1662
}
1654 1663
1663 1672
1664 1673
void
1665 1674
unmanage(Client *c, Bool destroyed) {
1675 +
	Monitor *m = c->mon;
1666 1676
	XWindowChanges wc;
1667 1677
1668 1678
	/* The server grab construct avoids race conditions. */
1681 1691
	}
1682 1692
	free(c);
1683 1693
	focus(NULL);
1684 -
	arrange();
1694 +
	arrange(m);
1685 1695
}
1686 1696
1687 1697
void
1908 1918
	selmon->seltags ^= 1; /* toggle sel tagset */
1909 1919
	if(arg->ui & TAGMASK)
1910 1920
		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
1911 -
	arrange();
1921 +
	arrange(selmon);
1912 1922
}
1913 1923
1914 1924
Client *
1986 1996
	detach(c);
1987 1997
	attach(c);
1988 1998
	focus(c);
1989 -
	arrange();
1999 +
	arrange(c->mon);
1990 2000
}
1991 2001
1992 2002
int