tstill something wrong with reorder() - dwm - [fork] customized build of dwm, t… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 9d739090750ffb3b3a64e86e2331215b8901c360 | |
parent 016c54196e682ae8658854febb746b0437a010dc | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Tue, 29 Aug 2006 13:40:09 +0200 | |
still something wrong with reorder() | |
Diffstat: | |
M client.c | 5 ++++- | |
M dwm.h | 3 +-- | |
M tag.c | 6 ++---- | |
M view.c | 75 +++++++++++------------------… | |
4 files changed, 33 insertions(+), 56 deletions(-) | |
--- | |
diff --git a/client.c b/client.c | |
t@@ -241,7 +241,10 @@ manage(Window w, XWindowAttributes *wa) | |
|| (c->maxw && c->minw && | |
c->maxw == c->minw && c->maxh == c->minh); | |
- attach(c); | |
+ if(clients) | |
+ clients->prev = c; | |
+ c->next = clients; | |
+ clients = c; | |
settitle(c); | |
if(isvisible(c)) | |
diff --git a/dwm.h b/dwm.h | |
t@@ -56,7 +56,7 @@ struct Client { | |
int basew, baseh, incw, inch, maxw, maxh, minw, minh; | |
int grav; | |
long flags; | |
- unsigned int border; | |
+ unsigned int border, weight; | |
Bool isfloat; | |
Bool ismax; | |
Bool *tags; | |
t@@ -127,7 +127,6 @@ extern void *erealloc(void *ptr, unsigned int size); | |
extern void spawn(Arg *arg); | |
/* view.c */ | |
-extern void attach(Client *c); | |
extern void detach(Client *c); | |
extern void dofloat(Arg *arg); | |
extern void dotile(Arg *arg); | |
diff --git a/tag.c b/tag.c | |
t@@ -106,6 +106,8 @@ settags(Client *c) | |
if(!matched) | |
for(i = 0; i < ntags; i++) | |
c->tags[i] = seltag[i]; | |
+ for(i = 0; i < ntags && !c->tags[i]; i++); | |
+ c->weight = i; | |
} | |
void | |
t@@ -120,8 +122,6 @@ tag(Arg *arg) | |
sel->tags[i] = False; | |
sel->tags[arg->i] = True; | |
settitle(sel); | |
- detach(sel); | |
- attach(sel); | |
if(!isvisible(sel)) | |
arrange(NULL); | |
else | |
t@@ -141,8 +141,6 @@ toggletag(Arg *arg) | |
if(i == ntags) | |
sel->tags[arg->i] = True; | |
settitle(sel); | |
- detach(sel); | |
- attach(sel); | |
if(!isvisible(sel)) | |
arrange(NULL); | |
else | |
diff --git a/view.c b/view.c | |
t@@ -6,62 +6,34 @@ | |
/* static */ | |
-static Client * | |
-getslot(Client *c) | |
+static void | |
+reorder() | |
{ | |
- unsigned int i, tic; | |
- Client *p; | |
- | |
- for(tic = 0; tic < ntags && !c->tags[tic]; tic++); | |
- for(p = clients; p; p = p->next) { | |
- for(i = 0; i < ntags && !p->tags[i]; i++); | |
- if(tic < i) | |
- return p; | |
- } | |
- return p; | |
-} | |
+ Client *c, *orig, *p; | |
-static Client * | |
-tail() | |
-{ | |
- Client *c; | |
- for(c = clients; c && c->next; c = c->next); | |
- return c; | |
-} | |
+ orig = clients; | |
+ clients = NULL; | |
-/* extern */ | |
+ while((c = orig)) { | |
+ orig = orig->next; | |
+ detach(c); | |
-void (*arrange)(Arg *) = DEFMODE; | |
- | |
-void | |
-attach(Client *c) | |
-{ | |
- Client *p; | |
- | |
- if(!clients) { | |
- clients = c; | |
- return; | |
- } | |
- if(!(p = getnext(clients)) && !(p = getslot(c))) { | |
- p = tail(); | |
+ for(p = clients; p && p->next && p->weight <= c->weight; p = p… | |
c->prev = p; | |
- p->next = c; | |
- return; | |
- } | |
- | |
- if(p == clients) { | |
- c->next = clients; | |
- clients->prev = c; | |
- clients = c; | |
- } | |
- else { | |
- p->prev->next = c; | |
- c->prev = p->prev; | |
- p->prev = c; | |
- c->next = p; | |
+ if(p) { | |
+ if((c->next = p->next)) | |
+ c->next->prev = c; | |
+ p->next = c; | |
+ } | |
+ else | |
+ clients = c; | |
} | |
} | |
+/* extern */ | |
+ | |
+void (*arrange)(Arg *) = DEFMODE; | |
+ | |
void | |
detach(Client *c) | |
{ | |
t@@ -277,6 +249,7 @@ toggleview(Arg *arg) | |
for(i = 0; i < ntags && !seltag[i]; i++); | |
if(i == ntags) | |
seltag[arg->i] = True; /* cannot toggle last view */ | |
+ reorder(); | |
arrange(NULL); | |
} | |
t@@ -284,10 +257,12 @@ void | |
view(Arg *arg) | |
{ | |
unsigned int i; | |
+ Client *c; | |
for(i = 0; i < ntags; i++) | |
seltag[i] = False; | |
seltag[arg->i] = True; | |
+ reorder(); | |
arrange(NULL); | |
} | |
t@@ -303,7 +278,9 @@ zoom(Arg *arg) | |
if(!(c = getnext(c->next))) | |
return; | |
detach(c); | |
- attach(c); | |
+ c->next = clients; | |
+ clients->prev = c; | |
+ clients = c; | |
focus(c); | |
arrange(NULL); | |
} |