applied Sanders max_and_focus.patch
This commit is contained in:
		
							parent
							
								
									6d22782e8f
								
							
						
					
					
						commit
						26157e6973
					
				
							
								
								
									
										52
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								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;
 | 
			
		||||
		grabbuttons(old, False);
 | 
			
		||||
		drawtitle(old);
 | 
			
		||||
		if(old) {
 | 
			
		||||
			grabbuttons(old, False);
 | 
			
		||||
			drawtitle(old);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	grabbuttons(c, True);
 | 
			
		||||
	drawtitle(c);
 | 
			
		||||
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	XGetTransientForHint(dpy, c->win, &trans);
 | 
			
		||||
	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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user