implemented restack behavior (floats are on top in tiled mode)
Anselm R.Garbe arg@10ksloc.org
Mon, 14 Aug 2006 10:18:24 +0200
M
client.c
→
client.c
@@ -59,8 +59,6 @@ if(old && old != c)
drawtitle(old); drawtitle(c); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XSync(dpy, False); - while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } void@@ -77,8 +75,8 @@
if(!(c = getnext(sel->next))) c = getnext(clients); if(c) { - higher(c); focus(c); + restack(); } }@@ -98,8 +96,8 @@ for(c = clients; c && c->next; c = c->next);
c = getprev(c); } if(c) { - higher(c); focus(c); + restack(); } }@@ -178,13 +176,6 @@ dy = -dy;
} c->x += dx; c->y += dy; -} - -void -higher(Client *c) -{ - XRaiseWindow(dpy, c->win); - XRaiseWindow(dpy, c->title); } void@@ -271,13 +262,12 @@ c->isfloat = trans
|| (c->maxw && c->minw && c->maxw == c->minw && c->maxh == c->minh); settitle(c); - arrange(NULL); - /* mapping the window now prevents flicker */ - XMapRaised(dpy, c->win); - XMapRaised(dpy, c->title); + XMapWindow(dpy, c->win); + XMapWindow(dpy, c->title); if(isvisible(c)) focus(c); + arrange(NULL); } void@@ -410,7 +400,7 @@ sel->y = sy + bh;
sel->w = sw - 2; sel->h = sh - 2 - bh; - higher(sel); + restack(); resize(sel, arrange == dofloat, TopLeft); sel->x = ox;@@ -446,9 +436,9 @@
XSync(dpy, False); XSetErrorHandler(xerror); XUngrabServer(dpy); - arrange(NULL); if(sel) focus(sel); + arrange(NULL); } void@@ -474,6 +464,6 @@ sel->prev = NULL;
clients->prev = sel; sel->next = clients; clients = sel; - arrange(NULL); focus(sel); + arrange(NULL); }
M
dwm.h
→
dwm.h
@@ -89,7 +89,6 @@ extern void focusprev(Arg *arg);
extern Client *getclient(Window w); extern Client *getctitle(Window w); extern void gravitate(Client *c, Bool invert); -extern void higher(Client *c); extern void killclient(Arg *arg); extern void manage(Window w, XWindowAttributes *wa); extern void resize(Client *c, Bool sizehints, Corner sticky);@@ -125,6 +124,7 @@ extern Bool isvisible(Client *c);
extern Client *getnext(Client *c); extern Client *getprev(Client *c); extern void replacetag(Arg *arg); +extern void restack(); extern void settags(Client *c); extern void togglemode(Arg *arg); extern void view(Arg *arg);@@ -133,4 +133,5 @@
/* util.c */ extern void *emallocz(unsigned int size); extern void eprint(const char *errstr, ...); +extern void *erealloc(void *ptr, unsigned int size); extern void spawn(Arg *arg);
M
event.c
→
event.c
@@ -118,21 +118,24 @@ }
} } else if((c = getclient(ev->window))) { - higher(c); focus(c); switch(ev->button) { default: break; case Button1: - if(!c->ismax && (arrange == dofloat || c->isfloat)) + if(!c->ismax && (arrange == dofloat || c->isfloat)) { + restack(c); movemouse(c); + } break; case Button2: zoom(NULL); break; case Button3: - if(!c->ismax && (arrange == dofloat || c->isfloat)) + if(!c->ismax && (arrange == dofloat || c->isfloat)) { + restack(c); resizemouse(c); + } break; } }
M
tag.c
→
tag.c
@@ -58,18 +58,17 @@ else
ban(c); } if((sel = getnext(clients))) { - higher(sel); focus(sel); + restack(); } else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - drawall(); } void dotile(Arg *arg) { - int n, i, w, h; + int h, i, n, w; Client *c; w = sw - mw;@@ -86,7 +85,6 @@ for(i = 0, c = clients; c; c = c->next) {
c->ismax = False; if(isvisible(c)) { if(c->isfloat) { - higher(c); resize(c, True, TopLeft); continue; }@@ -123,13 +121,11 @@ }
else ban(c); } - if((sel = getnext(clients))) { - higher(sel); + if((sel = getnext(clients))) focus(sel); - } else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - drawall(); + restack(); } Client *@@ -200,6 +196,56 @@ appendtag(arg);
} void +restack() +{ + static unsigned int nwins = 0; + static Window *wins = NULL; + unsigned int f, fi, m, mi, n; + Client *c; + XEvent ev; + + for(f = 0, m = 0, c = clients; c; c = c->next) + if(isvisible(c)) { + if(c->isfloat || arrange == dofloat) + f++; + else + m++; + } + + n = 2 * (f + m); + if(nwins < n) { + nwins = n; + wins = erealloc(wins, nwins * sizeof(Window)); + } + + fi = 0; + mi = 2 * f; + if(sel->isfloat || arrange == dofloat) { + wins[fi++] = sel->title; + wins[fi++] = sel->win; + } + else { + wins[mi++] = sel->title; + wins[mi++] = sel->win; + } + for(c = clients; c; c = c->next) + if(isvisible(c) && c != sel) { + if(c->isfloat || arrange == dofloat) { + wins[fi++] = c->title; + wins[fi++] = c->win; + } + else { + wins[mi++] = c->title; + wins[mi++] = c->win; + } + } + XRestackWindows(dpy, wins, n); + drawall(); + XSync(dpy, False); + while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void settags(Client *c) { char classinst[256];@@ -248,7 +294,6 @@ for(i = 0; i < ntags; i++)
seltag[i] = False; seltag[arg->i] = True; arrange(NULL); - drawall(); } void@@ -261,5 +306,4 @@ for(i = 0; !seltag[i] && i < ntags; i++);
if(i == ntags) seltag[arg->i] = True; /* cannot toggle last view */ arrange(NULL); - drawall(); }