These set of changes introduce:
   a) a flag to ignore warp from happening while dragmfact or
      dragcfact is being used and
   b) a flag to force warp when killclient or showhideclient
      is used, to make for a more intuitive experience
ref. https://github.com/bakkeby/patches/issues/11
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
void
 | 
						|
hide(Client *c) {
 | 
						|
 | 
						|
	Client *n;
 | 
						|
	if (!c || HIDDEN(c))
 | 
						|
		return;
 | 
						|
 | 
						|
	Window w = c->win;
 | 
						|
	static XWindowAttributes ra, ca;
 | 
						|
 | 
						|
	// more or less taken directly from blackbox's hide() function
 | 
						|
	XGrabServer(dpy);
 | 
						|
	XGetWindowAttributes(dpy, root, &ra);
 | 
						|
	XGetWindowAttributes(dpy, w, &ca);
 | 
						|
	// prevent UnmapNotify events
 | 
						|
	XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask);
 | 
						|
	XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask);
 | 
						|
	XUnmapWindow(dpy, w);
 | 
						|
	setclientstate(c, IconicState);
 | 
						|
	XSelectInput(dpy, root, ra.your_event_mask);
 | 
						|
	XSelectInput(dpy, w, ca.your_event_mask);
 | 
						|
	XUngrabServer(dpy);
 | 
						|
 | 
						|
	if (c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) {
 | 
						|
		for (n = c->snext; n && (!ISVISIBLE(n) || HIDDEN(n)); n = n->snext);
 | 
						|
		if (!n)
 | 
						|
			for (n = c->mon->stack; n && (!ISVISIBLE(n) || HIDDEN(n)); n = n->snext);
 | 
						|
	} else {
 | 
						|
		n = nexttiled(c);
 | 
						|
		if (!n)
 | 
						|
			n = prevtiled(c);
 | 
						|
	}
 | 
						|
	focus(n);
 | 
						|
	arrange(c->mon);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
show(Client *c)
 | 
						|
{
 | 
						|
	if (!c || !HIDDEN(c))
 | 
						|
		return;
 | 
						|
 | 
						|
	XMapWindow(dpy, c->win);
 | 
						|
	setclientstate(c, NormalState);
 | 
						|
	arrange(c->mon);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
togglewin(const Arg *arg)
 | 
						|
{
 | 
						|
	Client *c = (Client*)arg->v;
 | 
						|
	if (!c)
 | 
						|
		return;
 | 
						|
	if (c == selmon->sel)
 | 
						|
		hide(c);
 | 
						|
	else {
 | 
						|
		if (HIDDEN(c))
 | 
						|
			show(c);
 | 
						|
		focus(c);
 | 
						|
		restack(c->mon);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
Client *
 | 
						|
prevtiled(Client *c)
 | 
						|
{
 | 
						|
	Client *p, *i;
 | 
						|
	for (p = NULL, i = c->mon->clients; c && i != c; i = i->next)
 | 
						|
		if (ISVISIBLE(i) && !HIDDEN(i))
 | 
						|
			p = i;
 | 
						|
	return p;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
showhideclient(const Arg *arg)
 | 
						|
{
 | 
						|
	Client *c = (Client*)arg->v;
 | 
						|
	if (!c)
 | 
						|
		c = selmon->sel;
 | 
						|
	if (!c)
 | 
						|
		return;
 | 
						|
 | 
						|
	#if WARP_PATCH
 | 
						|
	force_warp = 1;
 | 
						|
	#endif // WARP_PATCH
 | 
						|
	if (HIDDEN(c)) {
 | 
						|
		show(c);
 | 
						|
		focus(c);
 | 
						|
		restack(c->mon);
 | 
						|
	} else {
 | 
						|
		hide(c);
 | 
						|
	}
 | 
						|
} |