tadded attach/detach functions which don't attach at the begin of list, but at … | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 8a6679b3b4999559059df3ae9e08951099511036 | |
parent 7b6d5ff29863e4bc7ba787357133ffb9bc5157e6 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Tue, 29 Aug 2006 09:23:44 +0200 | |
added attach/detach functions which don't attach at the begin of list, but at t… | |
Diffstat: | |
M client.c | 16 ++++------------ | |
M dwm.h | 2 ++ | |
M view.c | 63 ++++++++++++++++++++++-------… | |
3 files changed, 52 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/client.c b/client.c | |
t@@ -230,13 +230,7 @@ manage(Window w, XWindowAttributes *wa) | |
DefaultVisual(dpy, screen), | |
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); | |
- if(clients) | |
- clients->prev = c; | |
- c->next = clients; | |
- clients = c; | |
- | |
grabbuttons(c, False); | |
- | |
if((tc = getclient(trans))) /* inherit tags */ | |
for(i = 0; i < ntags; i++) | |
c->tags[i] = tc->tags[i]; | |
t@@ -246,6 +240,9 @@ manage(Window w, XWindowAttributes *wa) | |
c->isfloat = trans | |
|| (c->maxw && c->minw && | |
c->maxw == c->minw && c->maxh == c->minh); | |
+ | |
+ attach(c); | |
+ | |
settitle(c); | |
if(isvisible(c)) | |
sel = c; | |
t@@ -407,12 +404,7 @@ unmanage(Client *c) | |
XUngrabButton(dpy, AnyButton, AnyModifier, c->win); | |
XDestroyWindow(dpy, c->twin); | |
- if(c->prev) | |
- c->prev->next = c->next; | |
- if(c->next) | |
- c->next->prev = c->prev; | |
- if(c == clients) | |
- clients = c->next; | |
+ detach(c); | |
if(sel == c) { | |
if(trans && (tc = getclient(trans)) && isvisible(tc)) | |
sel = tc; | |
diff --git a/dwm.h b/dwm.h | |
t@@ -127,6 +127,8 @@ 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); | |
extern void focusnext(Arg *arg); | |
diff --git a/view.c b/view.c | |
t@@ -9,6 +9,45 @@ | |
void (*arrange)(Arg *) = DEFMODE; | |
void | |
+attach(Client *c) | |
+{ | |
+ Client *first = getnext(clients); | |
+ | |
+ if(!first) { | |
+ if(clients) { | |
+ for(first = clients; first->next; first = first->next); | |
+ first->next = c; | |
+ c->prev = first; | |
+ } | |
+ else | |
+ clients = c; | |
+ } | |
+ else if(first == clients) { | |
+ c->next = clients; | |
+ clients->prev = c; | |
+ clients = c; | |
+ } | |
+ else { | |
+ first->prev->next = c; | |
+ c->prev = first->prev; | |
+ first->prev = c; | |
+ c->next = first; | |
+ } | |
+} | |
+ | |
+void | |
+detach(Client *c) | |
+{ | |
+ if(c->prev) | |
+ c->prev->next = c->next; | |
+ if(c->next) | |
+ c->next->prev = c->prev; | |
+ if(c == clients) | |
+ clients = c->next; | |
+ c->next = c->prev = NULL; | |
+} | |
+ | |
+void | |
dofloat(Arg *arg) | |
{ | |
Client *c; | |
t@@ -228,26 +267,16 @@ view(Arg *arg) | |
void | |
zoom(Arg *arg) | |
{ | |
- Client *c; | |
+ Client *c = sel; | |
- if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax) | |
+ if(!c || (arrange != dotile) || c->isfloat || c->ismax) | |
return; | |
- if(sel == getnext(clients)) { | |
- if((c = getnext(sel->next))) | |
- sel = c; | |
- else | |
+ if(c == getnext(clients)) | |
+ if(!(c = getnext(c->next))) | |
return; | |
- } | |
- | |
- /* pop */ | |
- sel->prev->next = sel->next; | |
- if(sel->next) | |
- sel->next->prev = sel->prev; | |
- sel->prev = NULL; | |
- clients->prev = sel; | |
- sel->next = clients; | |
- clients = sel; | |
- focus(sel); | |
+ detach(c); | |
+ attach(c); | |
+ focus(c); | |
arrange(NULL); | |
} |