using a global stack for focus recovery on arrange() - seems to work great
This commit is contained in:
parent
7ab8c87281
commit
15abade272
4 changed files with 26 additions and 8 deletions
16
client.c
16
client.c
|
@ -10,6 +10,14 @@
|
|||
|
||||
/* static functions */
|
||||
|
||||
static void
|
||||
detachstack(Client *c)
|
||||
{
|
||||
Client **tc;
|
||||
for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
|
||||
*tc = c->snext;
|
||||
}
|
||||
|
||||
static void
|
||||
grabbuttons(Client *c, Bool focus)
|
||||
{
|
||||
|
@ -99,6 +107,9 @@ focus(Client *c)
|
|||
}
|
||||
}
|
||||
if(c) {
|
||||
detachstack(c);
|
||||
c->snext = stack;
|
||||
stack = c;
|
||||
grabbuttons(c, True);
|
||||
drawtitle(c);
|
||||
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
|
||||
|
@ -198,7 +209,6 @@ killclient(Arg *arg)
|
|||
void
|
||||
manage(Window w, XWindowAttributes *wa)
|
||||
{
|
||||
unsigned int i;
|
||||
Client *c;
|
||||
Window trans;
|
||||
XSetWindowAttributes twa;
|
||||
|
@ -247,7 +257,8 @@ manage(Window w, XWindowAttributes *wa)
|
|||
if(clients)
|
||||
clients->prev = c;
|
||||
c->next = clients;
|
||||
clients = c;
|
||||
c->snext = stack;
|
||||
stack = clients = c;
|
||||
|
||||
settitle(c);
|
||||
ban(c);
|
||||
|
@ -421,6 +432,7 @@ unmanage(Client *c)
|
|||
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
||||
XDestroyWindow(dpy, c->twin);
|
||||
|
||||
detachstack(c);
|
||||
free(c->tags);
|
||||
free(c);
|
||||
|
||||
|
|
3
dwm.h
3
dwm.h
|
@ -61,6 +61,7 @@ struct Client {
|
|||
Bool *tags;
|
||||
Client *next;
|
||||
Client *prev;
|
||||
Client *snext;
|
||||
Window win;
|
||||
Window twin;
|
||||
};
|
||||
|
@ -73,7 +74,7 @@ extern void (*handler[LASTEvent])(XEvent *);
|
|||
extern void (*arrange)(Arg *);
|
||||
extern Atom wmatom[WMLast], netatom[NetLast];
|
||||
extern Bool running, issel, maximized, *seltag;
|
||||
extern Client *clients, *sel;
|
||||
extern Client *clients, *sel, *stack;
|
||||
extern Cursor cursor[CurLast];
|
||||
extern DC dc;
|
||||
extern Display *dpy;
|
||||
|
|
1
main.c
1
main.c
|
@ -27,6 +27,7 @@ Bool issel = True;
|
|||
Bool maximized = False;
|
||||
Client *clients = NULL;
|
||||
Client *sel = NULL;
|
||||
Client *stack = NULL;
|
||||
Cursor cursor[CurLast];
|
||||
Display *dpy;
|
||||
DC dc = {0};
|
||||
|
|
14
view.c
14
view.c
|
@ -76,8 +76,10 @@ dofloat(Arg *arg)
|
|||
else
|
||||
ban(c);
|
||||
}
|
||||
if(!sel || !isvisible(sel))
|
||||
focus(getnext(clients));
|
||||
if(!sel || !isvisible(sel)) {
|
||||
for(sel = stack; sel && !isvisible(sel); sel = sel->snext);
|
||||
focus(sel);
|
||||
}
|
||||
restack();
|
||||
}
|
||||
|
||||
|
@ -138,8 +140,10 @@ dotile(Arg *arg)
|
|||
else
|
||||
ban(c);
|
||||
}
|
||||
if(!sel || !isvisible(sel))
|
||||
focus(getnext(clients));
|
||||
if(!sel || !isvisible(sel)) {
|
||||
for(sel = stack; sel && !isvisible(sel); sel = sel->snext);
|
||||
focus(sel);
|
||||
}
|
||||
restack();
|
||||
}
|
||||
|
||||
|
@ -227,7 +231,7 @@ restack()
|
|||
XRaiseWindow(dpy, sel->win);
|
||||
XRaiseWindow(dpy, sel->twin);
|
||||
}
|
||||
if(arrange != dofloat)
|
||||
if(arrange != dofloat)
|
||||
for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
|
||||
XLowerWindow(dpy, c->twin);
|
||||
XLowerWindow(dpy, c->win);
|
||||
|
|
Loading…
Reference in a new issue