diff -r 93012e947eae client.c --- a/client.c Tue Aug 01 16:44:23 2006 +0200 +++ b/client.c Tue Aug 01 20:32:52 2006 +0200 @@ -448,26 +448,37 @@ void void zoom(Arg *arg) { - Client *c; - - if(!sel) - return; - - if(sel == getnext(clients) && sel->next) { + Client *c, *master, *mp, *mn; + + if(!sel) + return; + + if(sel == (master = getnext(clients)) && sel->next) { if((c = getnext(sel->next))) sel = c; } - /* pop */ - if(sel->prev) - sel->prev->next = sel->next; - if(sel->next) - sel->next->prev = sel->prev; - sel->prev = NULL; - if(clients) - clients->prev = sel; - sel->next = clients; - clients = sel; + mp = master->prev; + mn = master->next; + + if (sel->prev) + sel->prev->next = master; + if (sel->next) + sel->next->prev = master; + + if (master->prev) + master->prev->next = sel; + if (master->next) + master->next->prev = sel; + + master->prev = (sel->prev != master) ? sel->prev : sel; + master->next = sel->next; + + sel->prev = mp; + sel->next = (mn != sel) ? mn : master; + + if (clients == master) + clients = sel; arrange(NULL); focus(sel); }