[hackers] [dwm] fixed the layout symbol bug reported by Nibble (but using a different approach as he suggested) || Anselm R Garbe

From: <hg_AT_suckless.org>
Date: Sun, 27 Sep 2009 08:31:16 +0000 (UTC)

changeset: 1500:48c3f87c335d
tag: 5.7.1
user: Anselm R Garbe <anselm_AT_garbe.us>
date: Sun Sep 27 10:31:14 2009 +0100
files: config.mk dwm.c
description:
fixed the layout symbol bug reported by Nibble (but using a different approach as he suggested)
- 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

diff -r e41abf7aa633 -r 48c3f87c335d config.mk
--- a/config.mk Sat Sep 26 19:52:04 2009 +0100
+++ b/config.mk Sun Sep 27 10:31:14 2009 +0100
@@ -1,5 +1,5 @@
 # dwm version
-VERSION = 5.7
+VERSION = 5.7.1
 
 # Customize below to fit your system
 
diff -r e41abf7aa633 -r 48c3f87c335d dwm.c
--- a/dwm.c Sat Sep 26 19:52:04 2009 +0100
+++ b/dwm.c Sun Sep 27 10:31:14 2009 +0100
@@ -152,7 +152,8 @@
 /* function declarations */
 static void applyrules(Client *c);
 static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
-static void arrange(void);
+static void arrange(Monitor *m);
+static void arrangemon(Monitor *m);
 static void attach(Client *c);
 static void attachstack(Client *c);
 static void buttonpress(XEvent *e);
@@ -379,18 +380,24 @@
 }
 
 void
-arrange(void) {
- Monitor *m;
-
- for(m = mons; m; m = m->next)
+arrange(Monitor *m) {
+ if(m)
+ showhide(m->stack);
+ else for(m = mons; m; m = m->next)
                 showhide(m->stack);
         focus(NULL);
- for(m = mons; m; m = m->next) {
- strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
- if(m->lt[m->sellt]->arrange)
- m->lt[m->sellt]->arrange(m);
- restack(m);
- }
+ if(m)
+ arrangemon(m);
+ else for(m = mons; m; m = m->next)
+ arrangemon(m);
+}
+
+void
+arrangemon(Monitor *m) {
+ strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
+ if(m->lt[m->sellt]->arrange)
+ m->lt[m->sellt]->arrange(m);
+ restack(m);
 }
 
 void
@@ -546,7 +553,7 @@
                         updatebars();
                         for(m = mons; m; m = m->next)
                                 XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
- arrange();
+ arrange(NULL);
                 }
         }
 }
@@ -1139,7 +1146,7 @@
         XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
         XMapWindow(dpy, c->win);
         setclientstate(c, NormalState);
- arrange();
+ arrange(c->mon);
 }
 
 void
@@ -1265,7 +1272,7 @@
                 case XA_WM_TRANSIENT_FOR:
                         XGetTransientForHint(dpy, c->win, &trans);
                         if(!c->isfloating && (c->isfloating = (wintoclient(trans) != NULL)))
- arrange();
+ arrange(c->mon);
                         break;
                 case XA_WM_NORMAL_HINTS:
                         updatesizehints(c);
@@ -1360,7 +1367,7 @@
         XEvent ev;
         XWindowChanges wc;
 
- drawbars();
+ drawbar(m);
         if(!m->sel)
                 return;
         if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
@@ -1427,7 +1434,7 @@
         attach(c);
         attachstack(c);
         focus(NULL);
- arrange();
+ arrange(NULL);
 }
 
 void
@@ -1442,12 +1449,14 @@
 setlayout(const Arg *arg) {
         if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
                 selmon->sellt ^= 1;
- if(arg && arg->v)
+ if(arg && arg->v) {
                 selmon->lt[selmon->sellt] = (Layout *)arg->v;
+ strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
+ }
         if(selmon->sel)
- arrange();
+ arrange(selmon);
         else
- drawbars();
+ drawbar(selmon);
 }
 
 /* arg > 1.0 will set mfact absolutly */
@@ -1461,7 +1470,7 @@
         if(f < 0.1 || f > 0.9)
                 return;
         selmon->mfact = f;
- arrange();
+ arrange(selmon);
 }
 
 void
@@ -1558,7 +1567,7 @@
 tag(const Arg *arg) {
         if(selmon->sel && arg->ui & TAGMASK) {
                 selmon->sel->tags = arg->ui & TAGMASK;
- arrange();
+ arrange(selmon);
         }
 }
 
@@ -1615,7 +1624,7 @@
         selmon->showbar = !selmon->showbar;
         updatebarpos(selmon);
         XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- arrange();
+ arrange(selmon);
 }
 
 void
@@ -1626,7 +1635,7 @@
         if(selmon->sel->isfloating)
                 resize(selmon->sel, selmon->sel->x, selmon->sel->y,
                        selmon->sel->w, selmon->sel->h, False);
- arrange();
+ arrange(selmon);
 }
 
 void
@@ -1638,7 +1647,7 @@
         newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
         if(newtags) {
                 selmon->sel->tags = newtags;
- arrange();
+ arrange(selmon);
         }
 }
 
@@ -1648,7 +1657,7 @@
 
         if(newtagset) {
                 selmon->tagset[selmon->seltags] = newtagset;
- arrange();
+ arrange(selmon);
         }
 }
 
@@ -1663,6 +1672,7 @@
 
 void
 unmanage(Client *c, Bool destroyed) {
+ Monitor *m = c->mon;
         XWindowChanges wc;
 
         /* The server grab construct avoids race conditions. */
@@ -1681,7 +1691,7 @@
         }
         free(c);
         focus(NULL);
- arrange();
+ arrange(m);
 }
 
 void
@@ -1908,7 +1918,7 @@
         selmon->seltags ^= 1; /* toggle sel tagset */
         if(arg->ui & TAGMASK)
                 selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
- arrange();
+ arrange(selmon);
 }
 
 Client *
@@ -1986,7 +1996,7 @@
         detach(c);
         attach(c);
         focus(c);
- arrange();
+ arrange(c->mon);
 }
 
 int
Received on Sun Sep 27 2009 - 08:31:16 UTC

This archive was generated by hypermail 2.2.0 : Sun Sep 27 2009 - 08:36:05 UTC