applied Sanders max_and_focus.patch
This commit is contained in:
parent
6d22782e8f
commit
26157e6973
5 changed files with 49 additions and 45 deletions
40
client.c
40
client.c
|
@ -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;
|
||||
if(old) {
|
||||
grabbuttons(old, False);
|
||||
drawtitle(old);
|
||||
}
|
||||
}
|
||||
if(c) {
|
||||
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);
|
||||
|
||||
detach(c);
|
||||
if(sel == c) {
|
||||
XGetTransientForHint(dpy, c->win, &trans);
|
||||
if(trans && (tc = getclient(trans)) && isvisible(tc))
|
||||
fc = tc;
|
||||
else
|
||||
fc = getnext(clients);
|
||||
focus(fc);
|
||||
}
|
||||
|
||||
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
||||
XDestroyWindow(dpy, c->twin);
|
||||
|
||||
detach(c);
|
||||
if(sel == c) {
|
||||
if(trans && (tc = getclient(trans)) && isvisible(tc))
|
||||
sel = tc;
|
||||
else
|
||||
sel = getnext(clients);
|
||||
}
|
||||
free(c->tags);
|
||||
free(c);
|
||||
|
||||
XSync(dpy, False);
|
||||
XSetErrorHandler(xerror);
|
||||
XUngrabServer(dpy);
|
||||
if(sel)
|
||||
focus(sel);
|
||||
arrange(NULL);
|
||||
}
|
||||
|
|
3
dwm.h
3
dwm.h
|
@ -58,7 +58,6 @@ struct Client {
|
|||
long flags;
|
||||
unsigned int border, weight;
|
||||
Bool isfloat;
|
||||
Bool ismax;
|
||||
Bool *tags;
|
||||
Client *next;
|
||||
Client *prev;
|
||||
|
@ -73,7 +72,7 @@ extern unsigned int ntags, numlockmask;
|
|||
extern void (*handler[LASTEvent])(XEvent *);
|
||||
extern void (*arrange)(Arg *);
|
||||
extern Atom wmatom[WMLast], netatom[NetLast];
|
||||
extern Bool running, issel, *seltag;
|
||||
extern Bool running, issel, maximized, *seltag;
|
||||
extern Client *clients, *sel;
|
||||
extern Cursor cursor[CurLast];
|
||||
extern DC dc;
|
||||
|
|
8
event.c
8
event.c
|
@ -131,15 +131,15 @@ buttonpress(XEvent *e)
|
|||
}
|
||||
else if((c = getclient(ev->window))) {
|
||||
focus(c);
|
||||
if(c->ismax || CLEANMASK(ev->state) != MODKEY)
|
||||
if(maximized || CLEANMASK(ev->state) != MODKEY)
|
||||
return;
|
||||
if((ev->button == Button1) && ((arrange == dofloat) || c->isfloat)) {
|
||||
if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
|
||||
restack(c);
|
||||
movemouse(c);
|
||||
}
|
||||
else if(ev->button == Button2)
|
||||
zoom(NULL);
|
||||
else if(ev->button == Button3 && ((arrange == dofloat) || c->isfloat)) {
|
||||
else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
|
||||
restack(c);
|
||||
resizemouse(c);
|
||||
}
|
||||
|
@ -173,7 +173,7 @@ configurerequest(XEvent *e)
|
|||
XWindowChanges wc;
|
||||
|
||||
if((c = getclient(ev->window))) {
|
||||
if(!c->isfloat && (arrange != dofloat) && c->ismax) {
|
||||
if((c == sel) && !c->isfloat && (arrange != dofloat) && maximized) {
|
||||
synconfig(c, sx, sy + bh, sw - 2, sh - 2 - bh, ev->border_width);
|
||||
XSync(dpy, False);
|
||||
return;
|
||||
|
|
1
main.c
1
main.c
|
@ -24,6 +24,7 @@ unsigned int ntags, numlockmask;
|
|||
Atom wmatom[WMLast], netatom[NetLast];
|
||||
Bool running = True;
|
||||
Bool issel = True;
|
||||
Bool maximized = False;
|
||||
Client *clients = NULL;
|
||||
Client *sel = NULL;
|
||||
Cursor cursor[CurLast];
|
||||
|
|
30
view.c
30
view.c
|
@ -57,22 +57,20 @@ detach(Client *c)
|
|||
void
|
||||
dofloat(Arg *arg)
|
||||
{
|
||||
Client *c;
|
||||
Client *c, *fc;
|
||||
|
||||
maximized = False;
|
||||
|
||||
for(c = clients; c; c = c->next) {
|
||||
c->ismax = False;
|
||||
if(isvisible(c)) {
|
||||
resize(c, True, TopLeft);
|
||||
}
|
||||
else
|
||||
ban(c);
|
||||
}
|
||||
if(!sel || !isvisible(sel))
|
||||
sel = getnext(clients);
|
||||
if(sel)
|
||||
focus(sel);
|
||||
else
|
||||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
|
||||
if(!(fc = sel) || !isvisible(fc))
|
||||
fc = getnext(clients);
|
||||
focus(fc);
|
||||
restack();
|
||||
}
|
||||
|
||||
|
@ -80,7 +78,9 @@ void
|
|||
dotile(Arg *arg)
|
||||
{
|
||||
int h, i, n, w;
|
||||
Client *c;
|
||||
Client *c, *fc;
|
||||
|
||||
maximized = False;
|
||||
|
||||
w = sw - mw;
|
||||
for(n = 0, c = clients; c; c = c->next)
|
||||
|
@ -93,7 +93,6 @@ dotile(Arg *arg)
|
|||
h = sh - bh;
|
||||
|
||||
for(i = 0, c = clients; c; c = c->next) {
|
||||
c->ismax = False;
|
||||
if(isvisible(c)) {
|
||||
if(c->isfloat) {
|
||||
resize(c, True, TopLeft);
|
||||
|
@ -132,12 +131,9 @@ dotile(Arg *arg)
|
|||
else
|
||||
ban(c);
|
||||
}
|
||||
if(!sel || !isvisible(sel))
|
||||
sel = getnext(clients);
|
||||
if(sel)
|
||||
focus(sel);
|
||||
else
|
||||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
|
||||
if(!(fc = sel) || !isvisible(fc))
|
||||
fc = getnext(clients);
|
||||
focus(fc);
|
||||
restack();
|
||||
}
|
||||
|
||||
|
@ -289,7 +285,7 @@ zoom(Arg *arg)
|
|||
{
|
||||
Client *c = sel;
|
||||
|
||||
if(!c || (arrange != dotile) || c->isfloat || c->ismax)
|
||||
if(!c || (arrange != dotile) || c->isfloat || maximized)
|
||||
return;
|
||||
|
||||
if(c == getnext(clients))
|
||||
|
|
Loading…
Reference in a new issue