Introduction
Introduction Statistics Contact Development Disclaimer Help
tdrastically changed updategeom() handling, see comment in updategeom() for det…
git clone git://src.adamsgaard.dk/dwm
Log
Files
Refs
README
LICENSE
---
commit 20f6917910306bcb5275d726b01b42a3b5e868b4
parent 820cbb3545e60e4d2bad120fb6e691c80058a98c
Author: [email protected] <unknown>
Date: Sat, 23 Jun 2012 10:12:46 +0200
drastically changed updategeom() handling, see comment in updategeom() for deta…
Diffstat:
M config.mk | 2 +-
M dwm.c | 123 +++++++++++++----------------…
2 files changed, 54 insertions(+), 71 deletions(-)
---
diff --git a/config.mk b/config.mk
t@@ -1,5 +1,5 @@
# dwm version
-VERSION = 6.0-tip
+VERSION = 6.1
# Customize below to fit your system
diff --git a/dwm.c b/dwm.c
t@@ -235,7 +235,7 @@ static void toggleview(const Arg *arg);
static void unfocus(Client *c, Bool setfocus);
static void unmanage(Client *c, Bool destroyed);
static void unmapnotify(XEvent *e);
-static Bool updategeom(void);
+static void updategeom(void);
static void updatebarpos(Monitor *m);
static void updatebars(void);
static void updateclientlist(void);
t@@ -573,23 +573,18 @@ void
configurenotify(XEvent *e) {
Monitor *m;
XConfigureEvent *ev = &e->xconfigure;
- Bool dirty;
- // TODO: updategeom handling sucks, needs to be simplified
if(ev->window == root) {
- dirty = (sw != ev->width || sh != ev->height);
sw = ev->width;
sh = ev->height;
- if(updategeom() || dirty) {
- if(dc.drawable != 0)
- XFreePixmap(dpy, dc.drawable);
- dc.drawable = XCreatePixmap(dpy, root, sw, bh, Default…
- updatebars();
- for(m = mons; m; m = m->next)
- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by…
- focus(NULL);
- arrange(NULL);
- }
+ if(dc.drawable != 0)
+ XFreePixmap(dpy, dc.drawable);
+ dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dp…
+ updatebars();
+ for(m = mons; m; m = m->next)
+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww,…
+ focus(NULL);
+ arrange(NULL);
}
}
t@@ -1076,8 +1071,8 @@ initfont(const char *fontstr) {
static Bool
isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
while(n--)
- if(unique[n].x_org == info->x_org && unique[n].y_org == info->…
- && unique[n].width == info->width && unique[n].height == info-…
+ /* treat origin (x, y) as fixpoint for uniqueness only, first …
+ if(unique[n].x_org == info->x_org && unique[n].y_org == info->…
return False;
return True;
}
t@@ -1887,86 +1882,74 @@ updateclientlist() {
(unsigned char *) &(c->win), 1);
}
-Bool
+void
updategeom(void) {
- Bool dirty = False;
+ /* Starting with dwm 6.1 this function uses a new (simpler) strategy:
+ * whenever screen changes are reported, we destroy all monitors
+ * and recreate all unique origin monitors and add all clients to
+ * the first monitor, only. In several circumstances this may suck,
+ * but dealing with all corner-cases sucks even more.*/
#ifdef XINERAMA
if(XineramaIsActive(dpy)) {
- int i, j, n, nn;
+ int i, j, n;
Client *c;
- Monitor *m;
- XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
+ Monitor *m, *oldmons = mons;
+ XineramaScreenInfo *info = XineramaQueryScreens(dpy, &n);
XineramaScreenInfo *unique = NULL;
- for(n = 0, m = mons; m; m = m->next, n++);
/* only consider unique geometries as separate screens */
- if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScre…
- die("fatal: could not malloc() %u bytes\n", sizeof(Xin…
- for(i = 0, j = 0; i < nn; i++)
+ if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScre…
+ die("fatal: could not malloc() %u bytes\n", sizeof(Xin…
+ for(i = 0, j = 0; i < n; i++)
if(isuniquegeom(unique, j, &info[i]))
memcpy(&unique[j++], &info[i], sizeof(Xinerama…
XFree(info);
- nn = j;
- if(n <= nn) {
- for(i = 0; i < (nn - n); i++) { /* new monitors availa…
- for(m = mons; m && m->next; m = m->next);
- if(m)
- m->next = createmon();
- else
- mons = createmon();
- }
- for(i = 0, m = mons; i < nn && m; m = m->next, i++)
- if(i >= n
- || (unique[i].x_org != m->mx || unique[i].y_or…
- || unique[i].width != m->mw || unique[i].h…
- {
- dirty = True;
- m->num = i;
- m->mx = m->wx = unique[i].x_org;
- m->my = m->wy = unique[i].y_org;
- m->mw = m->ww = unique[i].width;
- m->mh = m->wh = unique[i].height;
- updatebarpos(m);
- }
+ /* create new monitor structure */
+ n = j;
+ mons = m = createmon(); /* new first monitor */
+ for(i = 1; i < n; i++) {
+ m->next = createmon();
+ m = m->next;
}
- else { /* less monitors available nn < n */
- for(i = nn; i < n; i++) {
- for(m = mons; m && m->next; m = m->next);
- while(m->clients) {
- dirty = True;
- c = m->clients;
- m->clients = c->next;
- detachstack(c);
- c->mon = mons;
- attach(c);
- attachstack(c);
- }
- if(m == selmon)
- selmon = mons;
- cleanupmon(m);
- }
+ for(i = 0, m = mons; i < n && m; m = m->next, i++) {
+ m->num = i;
+ m->mx = m->wx = unique[i].x_org;
+ m->my = m->wy = unique[i].y_org;
+ m->mw = m->ww = unique[i].width;
+ m->mh = m->wh = unique[i].height;
+ updatebarpos(m);
}
free(unique);
+ /* re-attach old clients and cleanup old monitor structure */
+ while(oldmons) {
+ m = oldmons;
+ while(m->clients) {
+ c = m->clients;
+ m->clients = c->next;
+ detachstack(c);
+ c->mon = mons;
+ attach(c);
+ attachstack(c);
+ }
+ oldmons = m->next;
+ cleanupmon(m);
+ }
}
else
#endif /* XINERAMA */
/* default monitor setup */
{
- if(!mons)
+ if(!mons) /* only true if !XINERAMA compile flag */
mons = createmon();
if(mons->mw != sw || mons->mh != sh) {
- dirty = True;
mons->mw = mons->ww = sw;
mons->mh = mons->wh = sh;
updatebarpos(mons);
}
}
- if(dirty) {
- selmon = mons;
- selmon = wintomon(root);
- }
- return dirty;
+ selmon = mons;
+ selmon = wintomon(root);
}
void
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.