|
|
|
@ -82,22 +82,29 @@ ban(Client *c)
|
|
|
|
|
void
|
|
|
|
|
focus(Client *c)
|
|
|
|
|
{
|
|
|
|
|
Client *old = sel;
|
|
|
|
|
Client *old;
|
|
|
|
|
|
|
|
|
|
if(!issel)
|
|
|
|
|
return;
|
|
|
|
|
if(!sel)
|
|
|
|
|
sel = c;
|
|
|
|
|
else if(sel != c) {
|
|
|
|
|
if(sel->ismax)
|
|
|
|
|
if(maximized)
|
|
|
|
|
togglemax(NULL);
|
|
|
|
|
old = sel;
|
|
|
|
|
sel = c;
|
|
|
|
|
grabbuttons(old, False);
|
|
|
|
|
drawtitle(old);
|
|
|
|
|
if(old) {
|
|
|
|
|
grabbuttons(old, False);
|
|
|
|
|
drawtitle(old);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(c) {
|
|
|
|
|
grabbuttons(c, True);
|
|
|
|
|
drawtitle(c);
|
|
|
|
|
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
|
|
|
|
|
}
|
|
|
|
|
grabbuttons(c, True);
|
|
|
|
|
drawtitle(c);
|
|
|
|
|
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
|
|
|
|
|
else
|
|
|
|
|
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Client *
|
|
|
|
@ -247,8 +254,6 @@ manage(Window w, XWindowAttributes *wa)
|
|
|
|
|
clients = c;
|
|
|
|
|
|
|
|
|
|
settitle(c);
|
|
|
|
|
if(isvisible(c))
|
|
|
|
|
sel = c;
|
|
|
|
|
arrange(NULL);
|
|
|
|
|
XMapWindow(dpy, c->win);
|
|
|
|
|
XMapWindow(dpy, c->twin);
|
|
|
|
@ -366,12 +371,13 @@ void
|
|
|
|
|
togglemax(Arg *arg)
|
|
|
|
|
{
|
|
|
|
|
int ox, oy, ow, oh;
|
|
|
|
|
Client *c;
|
|
|
|
|
XEvent ev;
|
|
|
|
|
|
|
|
|
|
if(!sel)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if((sel->ismax = !sel->ismax)) {
|
|
|
|
|
if((maximized = !maximized)) {
|
|
|
|
|
ox = sel->x;
|
|
|
|
|
oy = sel->y;
|
|
|
|
|
ow = sel->w;
|
|
|
|
@ -382,6 +388,9 @@ togglemax(Arg *arg)
|
|
|
|
|
sel->h = sh - 2 - bh;
|
|
|
|
|
|
|
|
|
|
restack();
|
|
|
|
|
for(c = getnext(clients); c; c = getnext(c->next))
|
|
|
|
|
if(c != sel)
|
|
|
|
|
ban(c);
|
|
|
|
|
resize(sel, arrange == dofloat, TopLeft);
|
|
|
|
|
|
|
|
|
|
sel->x = ox;
|
|
|
|
@ -390,37 +399,36 @@ togglemax(Arg *arg)
|
|
|
|
|
sel->h = oh;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
resize(sel, False, TopLeft);
|
|
|
|
|
arrange(NULL);
|
|
|
|
|
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
unmanage(Client *c)
|
|
|
|
|
{
|
|
|
|
|
Client *tc;
|
|
|
|
|
Client *tc, *fc;
|
|
|
|
|
Window trans;
|
|
|
|
|
XGrabServer(dpy);
|
|
|
|
|
XSetErrorHandler(xerrordummy);
|
|
|
|
|
|
|
|
|
|
XGetTransientForHint(dpy, c->win, &trans);
|
|
|
|
|
|
|
|
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
|
|
|
XDestroyWindow(dpy, c->twin);
|
|
|
|
|
|
|
|
|
|
detach(c);
|
|
|
|
|
if(sel == c) {
|
|
|
|
|
XGetTransientForHint(dpy, c->win, &trans);
|
|
|
|
|
if(trans && (tc = getclient(trans)) && isvisible(tc))
|
|
|
|
|
sel = tc;
|
|
|
|
|
fc = tc;
|
|
|
|
|
else
|
|
|
|
|
sel = getnext(clients);
|
|
|
|
|
fc = getnext(clients);
|
|
|
|
|
focus(fc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
|
|
|
XDestroyWindow(dpy, c->twin);
|
|
|
|
|
|
|
|
|
|
free(c->tags);
|
|
|
|
|
free(c);
|
|
|
|
|
|
|
|
|
|
XSync(dpy, False);
|
|
|
|
|
XSetErrorHandler(xerror);
|
|
|
|
|
XUngrabServer(dpy);
|
|
|
|
|
if(sel)
|
|
|
|
|
focus(sel);
|
|
|
|
|
arrange(NULL);
|
|
|
|
|
}
|
|
|
|
|