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
 | 
					void
 | 
				
			||||||
focus(Client *c)
 | 
					focus(Client *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Client *old = sel;
 | 
						Client *old;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!issel)
 | 
						if(!issel)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	if(!sel)
 | 
						if(!sel)
 | 
				
			||||||
		sel = c;
 | 
							sel = c;
 | 
				
			||||||
	else if(sel != c) {
 | 
						else if(sel != c) {
 | 
				
			||||||
		if(sel->ismax)
 | 
							if(maximized)
 | 
				
			||||||
			togglemax(NULL);
 | 
								togglemax(NULL);
 | 
				
			||||||
 | 
							old = sel;
 | 
				
			||||||
		sel = c;
 | 
							sel = c;
 | 
				
			||||||
		grabbuttons(old, False);
 | 
							if(old) {
 | 
				
			||||||
		drawtitle(old);
 | 
								grabbuttons(old, False);
 | 
				
			||||||
 | 
								drawtitle(old);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	grabbuttons(c, True);
 | 
						if(c) {
 | 
				
			||||||
	drawtitle(c);
 | 
							grabbuttons(c, True);
 | 
				
			||||||
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
							drawtitle(c);
 | 
				
			||||||
 | 
							XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Client *
 | 
					Client *
 | 
				
			||||||
| 
						 | 
					@ -247,8 +254,6 @@ manage(Window w, XWindowAttributes *wa)
 | 
				
			||||||
	clients = c;
 | 
						clients = c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	settitle(c);
 | 
						settitle(c);
 | 
				
			||||||
	if(isvisible(c))
 | 
					 | 
				
			||||||
		sel = c;
 | 
					 | 
				
			||||||
	arrange(NULL);
 | 
						arrange(NULL);
 | 
				
			||||||
	XMapWindow(dpy, c->win);
 | 
						XMapWindow(dpy, c->win);
 | 
				
			||||||
	XMapWindow(dpy, c->twin);
 | 
						XMapWindow(dpy, c->twin);
 | 
				
			||||||
| 
						 | 
					@ -366,12 +371,13 @@ void
 | 
				
			||||||
togglemax(Arg *arg)
 | 
					togglemax(Arg *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ox, oy, ow, oh;
 | 
						int ox, oy, ow, oh;
 | 
				
			||||||
 | 
						Client *c;
 | 
				
			||||||
	XEvent ev;
 | 
						XEvent ev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!sel)
 | 
						if(!sel)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if((sel->ismax = !sel->ismax)) {
 | 
						if((maximized = !maximized)) {
 | 
				
			||||||
		ox = sel->x;
 | 
							ox = sel->x;
 | 
				
			||||||
		oy = sel->y;
 | 
							oy = sel->y;
 | 
				
			||||||
		ow = sel->w;
 | 
							ow = sel->w;
 | 
				
			||||||
| 
						 | 
					@ -382,6 +388,9 @@ togglemax(Arg *arg)
 | 
				
			||||||
		sel->h = sh - 2 - bh;
 | 
							sel->h = sh - 2 - bh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		restack();
 | 
							restack();
 | 
				
			||||||
 | 
							for(c = getnext(clients); c; c = getnext(c->next))
 | 
				
			||||||
 | 
								if(c != sel)
 | 
				
			||||||
 | 
									ban(c);
 | 
				
			||||||
		resize(sel, arrange == dofloat, TopLeft);
 | 
							resize(sel, arrange == dofloat, TopLeft);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sel->x = ox;
 | 
							sel->x = ox;
 | 
				
			||||||
| 
						 | 
					@ -390,37 +399,36 @@ togglemax(Arg *arg)
 | 
				
			||||||
		sel->h = oh;
 | 
							sel->h = oh;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		resize(sel, False, TopLeft);
 | 
							arrange(NULL);
 | 
				
			||||||
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
						while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
unmanage(Client *c)
 | 
					unmanage(Client *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Client *tc;
 | 
						Client *tc, *fc;
 | 
				
			||||||
	Window trans;
 | 
						Window trans;
 | 
				
			||||||
	XGrabServer(dpy);
 | 
						XGrabServer(dpy);
 | 
				
			||||||
	XSetErrorHandler(xerrordummy);
 | 
						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);
 | 
						XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
 | 
				
			||||||
	XDestroyWindow(dpy, c->twin);
 | 
						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->tags);
 | 
				
			||||||
	free(c);
 | 
						free(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XSync(dpy, False);
 | 
						XSync(dpy, False);
 | 
				
			||||||
	XSetErrorHandler(xerror);
 | 
						XSetErrorHandler(xerror);
 | 
				
			||||||
	XUngrabServer(dpy);
 | 
						XUngrabServer(dpy);
 | 
				
			||||||
	if(sel)
 | 
					 | 
				
			||||||
		focus(sel);
 | 
					 | 
				
			||||||
	arrange(NULL);
 | 
						arrange(NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								dwm.h
								
								
								
								
							
							
						
						
									
										3
									
								
								dwm.h
								
								
								
								
							| 
						 | 
					@ -58,7 +58,6 @@ struct Client {
 | 
				
			||||||
	long flags; 
 | 
						long flags; 
 | 
				
			||||||
	unsigned int border, weight;
 | 
						unsigned int border, weight;
 | 
				
			||||||
	Bool isfloat;
 | 
						Bool isfloat;
 | 
				
			||||||
	Bool ismax;
 | 
					 | 
				
			||||||
	Bool *tags;
 | 
						Bool *tags;
 | 
				
			||||||
	Client *next;
 | 
						Client *next;
 | 
				
			||||||
	Client *prev;
 | 
						Client *prev;
 | 
				
			||||||
| 
						 | 
					@ -73,7 +72,7 @@ extern unsigned int ntags, numlockmask;
 | 
				
			||||||
extern void (*handler[LASTEvent])(XEvent *);
 | 
					extern void (*handler[LASTEvent])(XEvent *);
 | 
				
			||||||
extern void (*arrange)(Arg *);
 | 
					extern void (*arrange)(Arg *);
 | 
				
			||||||
extern Atom wmatom[WMLast], netatom[NetLast];
 | 
					extern Atom wmatom[WMLast], netatom[NetLast];
 | 
				
			||||||
extern Bool running, issel, *seltag;
 | 
					extern Bool running, issel, maximized, *seltag;
 | 
				
			||||||
extern Client *clients, *sel;
 | 
					extern Client *clients, *sel;
 | 
				
			||||||
extern Cursor cursor[CurLast];
 | 
					extern Cursor cursor[CurLast];
 | 
				
			||||||
extern DC dc;
 | 
					extern DC dc;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								event.c
								
								
								
								
							
							
						
						
									
										8
									
								
								event.c
								
								
								
								
							| 
						 | 
					@ -131,15 +131,15 @@ buttonpress(XEvent *e)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if((c = getclient(ev->window))) {
 | 
						else if((c = getclient(ev->window))) {
 | 
				
			||||||
		focus(c);
 | 
							focus(c);
 | 
				
			||||||
		if(c->ismax || CLEANMASK(ev->state) != MODKEY)
 | 
							if(maximized || CLEANMASK(ev->state) != MODKEY)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		if((ev->button == Button1) && ((arrange == dofloat) || c->isfloat)) {
 | 
							if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
 | 
				
			||||||
			restack(c);
 | 
								restack(c);
 | 
				
			||||||
			movemouse(c);
 | 
								movemouse(c);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if(ev->button == Button2)
 | 
							else if(ev->button == Button2)
 | 
				
			||||||
			zoom(NULL);
 | 
								zoom(NULL);
 | 
				
			||||||
		else if(ev->button == Button3 && ((arrange == dofloat) || c->isfloat)) {
 | 
							else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
 | 
				
			||||||
			restack(c);
 | 
								restack(c);
 | 
				
			||||||
			resizemouse(c);
 | 
								resizemouse(c);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -173,7 +173,7 @@ configurerequest(XEvent *e)
 | 
				
			||||||
	XWindowChanges wc;
 | 
						XWindowChanges wc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if((c = getclient(ev->window))) {
 | 
						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);
 | 
								synconfig(c, sx, sy + bh, sw - 2, sh - 2 - bh, ev->border_width);
 | 
				
			||||||
			XSync(dpy, False);
 | 
								XSync(dpy, False);
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								main.c
								
								
								
								
							
							
						
						
									
										1
									
								
								main.c
								
								
								
								
							| 
						 | 
					@ -24,6 +24,7 @@ unsigned int ntags, numlockmask;
 | 
				
			||||||
Atom wmatom[WMLast], netatom[NetLast];
 | 
					Atom wmatom[WMLast], netatom[NetLast];
 | 
				
			||||||
Bool running = True;
 | 
					Bool running = True;
 | 
				
			||||||
Bool issel = True;
 | 
					Bool issel = True;
 | 
				
			||||||
 | 
					Bool maximized = False;
 | 
				
			||||||
Client *clients = NULL;
 | 
					Client *clients = NULL;
 | 
				
			||||||
Client *sel = NULL;
 | 
					Client *sel = NULL;
 | 
				
			||||||
Cursor cursor[CurLast];
 | 
					Cursor cursor[CurLast];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										30
									
								
								view.c
								
								
								
								
							
							
						
						
									
										30
									
								
								view.c
								
								
								
								
							| 
						 | 
					@ -57,22 +57,20 @@ detach(Client *c)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
dofloat(Arg *arg)
 | 
					dofloat(Arg *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Client *c;
 | 
						Client *c, *fc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						maximized = False;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(c = clients; c; c = c->next) {
 | 
						for(c = clients; c; c = c->next) {
 | 
				
			||||||
		c->ismax = False;
 | 
					 | 
				
			||||||
		if(isvisible(c)) {
 | 
							if(isvisible(c)) {
 | 
				
			||||||
			resize(c, True, TopLeft);
 | 
								resize(c, True, TopLeft);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			ban(c);
 | 
								ban(c);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if(!sel || !isvisible(sel))
 | 
						if(!(fc = sel) || !isvisible(fc))
 | 
				
			||||||
		sel = getnext(clients);
 | 
							fc = getnext(clients);
 | 
				
			||||||
	if(sel)
 | 
						focus(fc);
 | 
				
			||||||
		focus(sel);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
					 | 
				
			||||||
	restack();
 | 
						restack();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,7 +78,9 @@ void
 | 
				
			||||||
dotile(Arg *arg)
 | 
					dotile(Arg *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int h, i, n, w;
 | 
						int h, i, n, w;
 | 
				
			||||||
	Client *c;
 | 
						Client *c, *fc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						maximized = False;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w = sw - mw;
 | 
						w = sw - mw;
 | 
				
			||||||
	for(n = 0, c = clients; c; c = c->next)
 | 
						for(n = 0, c = clients; c; c = c->next)
 | 
				
			||||||
| 
						 | 
					@ -93,7 +93,6 @@ dotile(Arg *arg)
 | 
				
			||||||
		h = sh - bh;
 | 
							h = sh - bh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(i = 0, c = clients; c; c = c->next) {
 | 
						for(i = 0, c = clients; c; c = c->next) {
 | 
				
			||||||
		c->ismax = False;
 | 
					 | 
				
			||||||
		if(isvisible(c)) {
 | 
							if(isvisible(c)) {
 | 
				
			||||||
			if(c->isfloat) {
 | 
								if(c->isfloat) {
 | 
				
			||||||
				resize(c, True, TopLeft);
 | 
									resize(c, True, TopLeft);
 | 
				
			||||||
| 
						 | 
					@ -132,12 +131,9 @@ dotile(Arg *arg)
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			ban(c);
 | 
								ban(c);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if(!sel || !isvisible(sel))
 | 
						if(!(fc = sel) || !isvisible(fc))
 | 
				
			||||||
		sel = getnext(clients);
 | 
							fc = getnext(clients);
 | 
				
			||||||
	if(sel)
 | 
						focus(fc);
 | 
				
			||||||
		focus(sel);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
					 | 
				
			||||||
	restack();
 | 
						restack();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -289,7 +285,7 @@ zoom(Arg *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Client *c = sel;
 | 
						Client *c = sel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!c || (arrange != dotile) || c->isfloat || c->ismax)
 | 
						if(!c || (arrange != dotile) || c->isfloat || maximized)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(c == getnext(clients))
 | 
						if(c == getnext(clients))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue