implemented restack behavior (floats are on top in tiled mode)
This commit is contained in:
		
							
								
								
									
										26
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								client.c
									
									
									
									
									
								
							@@ -59,8 +59,6 @@ focus(Client *c)
 | 
			
		||||
		drawtitle(old);
 | 
			
		||||
	drawtitle(c);
 | 
			
		||||
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
			
		||||
	XSync(dpy, False);
 | 
			
		||||
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -77,8 +75,8 @@ focusnext(Arg *arg)
 | 
			
		||||
	if(!(c = getnext(sel->next)))
 | 
			
		||||
		c = getnext(clients);
 | 
			
		||||
	if(c) {
 | 
			
		||||
		higher(c);
 | 
			
		||||
		focus(c);
 | 
			
		||||
		restack();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -98,8 +96,8 @@ focusprev(Arg *arg)
 | 
			
		||||
		c = getprev(c);
 | 
			
		||||
	}
 | 
			
		||||
	if(c) {
 | 
			
		||||
		higher(c);
 | 
			
		||||
		focus(c);
 | 
			
		||||
		restack();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -180,13 +178,6 @@ gravitate(Client *c, Bool invert)
 | 
			
		||||
	c->y += dy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
higher(Client *c)
 | 
			
		||||
{
 | 
			
		||||
	XRaiseWindow(dpy, c->win);
 | 
			
		||||
	XRaiseWindow(dpy, c->title);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
killclient(Arg *arg)
 | 
			
		||||
{
 | 
			
		||||
@@ -271,13 +262,12 @@ manage(Window w, XWindowAttributes *wa)
 | 
			
		||||
			|| (c->maxw && c->minw &&
 | 
			
		||||
				c->maxw == c->minw && c->maxh == c->minh);
 | 
			
		||||
	settitle(c);
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
 | 
			
		||||
	/* mapping the window now prevents flicker */
 | 
			
		||||
	XMapRaised(dpy, c->win);
 | 
			
		||||
	XMapRaised(dpy, c->title);
 | 
			
		||||
	XMapWindow(dpy, c->win);
 | 
			
		||||
	XMapWindow(dpy, c->title);
 | 
			
		||||
	if(isvisible(c))
 | 
			
		||||
		focus(c);
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -410,7 +400,7 @@ togglemax(Arg *arg)
 | 
			
		||||
		sel->w = sw - 2;
 | 
			
		||||
		sel->h = sh - 2 - bh;
 | 
			
		||||
 | 
			
		||||
		higher(sel);
 | 
			
		||||
		restack();
 | 
			
		||||
		resize(sel, arrange == dofloat, TopLeft);
 | 
			
		||||
 | 
			
		||||
		sel->x = ox;
 | 
			
		||||
@@ -446,9 +436,9 @@ unmanage(Client *c)
 | 
			
		||||
	XSync(dpy, False);
 | 
			
		||||
	XSetErrorHandler(xerror);
 | 
			
		||||
	XUngrabServer(dpy);
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
	if(sel)
 | 
			
		||||
		focus(sel);
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -474,6 +464,6 @@ zoom(Arg *arg)
 | 
			
		||||
	clients->prev = sel;
 | 
			
		||||
	sel->next = clients;
 | 
			
		||||
	clients = sel;
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
	focus(sel);
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								dwm.1
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								dwm.1
									
									
									
									
									
								
							@@ -36,11 +36,11 @@ prints version information to standard output, then exits.
 | 
			
		||||
.B Standard input
 | 
			
		||||
is read and displayed in the status text area.
 | 
			
		||||
.TP
 | 
			
		||||
.B Button[1,3]
 | 
			
		||||
.B Button[1,2]
 | 
			
		||||
click on a tag label focuses that
 | 
			
		||||
.B tag.
 | 
			
		||||
.TP
 | 
			
		||||
.B Button2
 | 
			
		||||
.B Button3
 | 
			
		||||
click on a tag label toggles that
 | 
			
		||||
.B tag.
 | 
			
		||||
.SS Keyboard commands
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								dwm.h
									
									
									
									
									
								
							@@ -89,7 +89,6 @@ extern void focusprev(Arg *arg);
 | 
			
		||||
extern Client *getclient(Window w);
 | 
			
		||||
extern Client *getctitle(Window w);
 | 
			
		||||
extern void gravitate(Client *c, Bool invert);
 | 
			
		||||
extern void higher(Client *c);
 | 
			
		||||
extern void killclient(Arg *arg);
 | 
			
		||||
extern void manage(Window w, XWindowAttributes *wa);
 | 
			
		||||
extern void resize(Client *c, Bool sizehints, Corner sticky);
 | 
			
		||||
@@ -125,6 +124,7 @@ extern Bool isvisible(Client *c);
 | 
			
		||||
extern Client *getnext(Client *c);
 | 
			
		||||
extern Client *getprev(Client *c);
 | 
			
		||||
extern void replacetag(Arg *arg);
 | 
			
		||||
extern void restack();
 | 
			
		||||
extern void settags(Client *c);
 | 
			
		||||
extern void togglemode(Arg *arg);
 | 
			
		||||
extern void view(Arg *arg);
 | 
			
		||||
@@ -133,4 +133,5 @@ extern void toggleview(Arg *arg);
 | 
			
		||||
/* util.c */
 | 
			
		||||
extern void *emallocz(unsigned int size);
 | 
			
		||||
extern void eprint(const char *errstr, ...);
 | 
			
		||||
extern void *erealloc(void *ptr, unsigned int size);
 | 
			
		||||
extern void spawn(Arg *arg);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								event.c
									
									
									
									
									
								
							@@ -118,21 +118,24 @@ buttonpress(XEvent *e)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if((c = getclient(ev->window))) {
 | 
			
		||||
		higher(c);
 | 
			
		||||
		focus(c);
 | 
			
		||||
		switch(ev->button) {
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
		case Button1:
 | 
			
		||||
			if(!c->ismax && (arrange == dofloat || c->isfloat))
 | 
			
		||||
			if(!c->ismax && (arrange == dofloat || c->isfloat)) {
 | 
			
		||||
				restack(c);
 | 
			
		||||
				movemouse(c);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case Button2:
 | 
			
		||||
			zoom(NULL);
 | 
			
		||||
			break;
 | 
			
		||||
		case Button3:
 | 
			
		||||
			if(!c->ismax && (arrange == dofloat || c->isfloat))
 | 
			
		||||
			if(!c->ismax && (arrange == dofloat || c->isfloat)) {
 | 
			
		||||
				restack(c);
 | 
			
		||||
				resizemouse(c);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								tag.c
									
									
									
									
									
								
							@@ -58,18 +58,17 @@ dofloat(Arg *arg)
 | 
			
		||||
			ban(c);
 | 
			
		||||
	}
 | 
			
		||||
	if((sel = getnext(clients))) {
 | 
			
		||||
		higher(sel);
 | 
			
		||||
		focus(sel);
 | 
			
		||||
		restack();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
			
		||||
	drawall();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dotile(Arg *arg)
 | 
			
		||||
{
 | 
			
		||||
	int n, i, w, h;
 | 
			
		||||
	int h, i, n, w;
 | 
			
		||||
	Client *c;
 | 
			
		||||
 | 
			
		||||
	w = sw - mw;
 | 
			
		||||
@@ -86,7 +85,6 @@ dotile(Arg *arg)
 | 
			
		||||
		c->ismax = False;
 | 
			
		||||
		if(isvisible(c)) {
 | 
			
		||||
			if(c->isfloat) {
 | 
			
		||||
				higher(c);
 | 
			
		||||
				resize(c, True, TopLeft);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
@@ -123,13 +121,11 @@ dotile(Arg *arg)
 | 
			
		||||
		else
 | 
			
		||||
			ban(c);
 | 
			
		||||
	}
 | 
			
		||||
	if((sel = getnext(clients))) {
 | 
			
		||||
		higher(sel);
 | 
			
		||||
	if((sel = getnext(clients)))
 | 
			
		||||
		focus(sel);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 | 
			
		||||
	drawall();
 | 
			
		||||
	restack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Client *
 | 
			
		||||
@@ -199,6 +195,56 @@ replacetag(Arg *arg)
 | 
			
		||||
	appendtag(arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
restack()
 | 
			
		||||
{
 | 
			
		||||
	static unsigned int nwins = 0;
 | 
			
		||||
	static Window *wins = NULL;
 | 
			
		||||
	unsigned int f, fi, m, mi, n;
 | 
			
		||||
	Client *c;
 | 
			
		||||
	XEvent ev;
 | 
			
		||||
 | 
			
		||||
	for(f = 0, m = 0, c = clients; c; c = c->next)
 | 
			
		||||
		if(isvisible(c)) {
 | 
			
		||||
			if(c->isfloat || arrange == dofloat)
 | 
			
		||||
				f++;
 | 
			
		||||
			else
 | 
			
		||||
				m++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	n = 2 * (f + m);
 | 
			
		||||
	if(nwins < n) {
 | 
			
		||||
		nwins = n;
 | 
			
		||||
		wins = erealloc(wins, nwins * sizeof(Window));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fi = 0;
 | 
			
		||||
	mi = 2 * f;
 | 
			
		||||
	if(sel->isfloat || arrange == dofloat) {
 | 
			
		||||
		wins[fi++] = sel->title;
 | 
			
		||||
		wins[fi++] = sel->win;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		wins[mi++] = sel->title;
 | 
			
		||||
		wins[mi++] = sel->win;
 | 
			
		||||
	}
 | 
			
		||||
	for(c = clients; c; c = c->next)
 | 
			
		||||
		if(isvisible(c) && c != sel) {
 | 
			
		||||
			if(c->isfloat || arrange == dofloat) {
 | 
			
		||||
				wins[fi++] = c->title;
 | 
			
		||||
				wins[fi++] = c->win;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				wins[mi++] = c->title;
 | 
			
		||||
				wins[mi++] = c->win;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	XRestackWindows(dpy, wins, n);
 | 
			
		||||
	drawall();
 | 
			
		||||
	XSync(dpy, False);
 | 
			
		||||
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
settags(Client *c)
 | 
			
		||||
{
 | 
			
		||||
@@ -248,7 +294,6 @@ view(Arg *arg)
 | 
			
		||||
		seltag[i] = False;
 | 
			
		||||
	seltag[arg->i] = True;
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
	drawall();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -261,5 +306,4 @@ toggleview(Arg *arg)
 | 
			
		||||
	if(i == ntags)
 | 
			
		||||
		seltag[arg->i] = True; /* cannot toggle last view */
 | 
			
		||||
	arrange(NULL);
 | 
			
		||||
	drawall();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user