|  | @@ -58,6 +58,22 @@ enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 | 
	
		
			
				|  |  |  /* typedefs */
 | 
	
		
			
				|  |  |  typedef struct Client Client;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +struct Client {
 | 
	
		
			
				|  |  | +	char name[256];
 | 
	
		
			
				|  |  | +	int x, y, w, h;
 | 
	
		
			
				|  |  | +	int rx, ry, rw, rh; /* revert geometry */
 | 
	
		
			
				|  |  | +	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 | 
	
		
			
				|  |  | +	int minax, maxax, minay, maxay;
 | 
	
		
			
				|  |  | +	long flags;
 | 
	
		
			
				|  |  | +	unsigned int border, oldborder;
 | 
	
		
			
				|  |  | +	Bool isbanned, isfixed, ismax, isfloating, wasfloating;
 | 
	
		
			
				|  |  | +	Bool *tags;
 | 
	
		
			
				|  |  | +	Client *next;
 | 
	
		
			
				|  |  | +	Client *prev;
 | 
	
		
			
				|  |  | +	Client *snext;
 | 
	
		
			
				|  |  | +	Window win;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  typedef struct {
 | 
	
		
			
				|  |  |  	int x, y, w, h;
 | 
	
		
			
				|  |  |  	unsigned long norm[ColLast];
 | 
	
	
		
			
				|  | @@ -170,6 +186,7 @@ void updatebarpos(void);
 | 
	
		
			
				|  |  |  void updatesizehints(Client *c);
 | 
	
		
			
				|  |  |  void updatetitle(Client *c);
 | 
	
		
			
				|  |  |  void view(const char *arg);
 | 
	
		
			
				|  |  | +void viewprevtag(const char *arg);	/* views previous selected tags */
 | 
	
		
			
				|  |  |  int xerror(Display *dpy, XErrorEvent *ee);
 | 
	
		
			
				|  |  |  int xerrordummy(Display *dsply, XErrorEvent *ee);
 | 
	
		
			
				|  |  |  int xerrorstart(Display *dsply, XErrorEvent *ee);
 | 
	
	
		
			
				|  | @@ -219,22 +236,7 @@ Regs *regs = NULL;
 | 
	
		
			
				|  |  |  /* Statically define the number of tags. */
 | 
	
		
			
				|  |  |  unsigned int ntags = sizeof tags / sizeof tags[0];
 | 
	
		
			
				|  |  |  Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -struct Client {
 | 
	
		
			
				|  |  | -	char name[256];
 | 
	
		
			
				|  |  | -	int x, y, w, h;
 | 
	
		
			
				|  |  | -	int rx, ry, rw, rh; /* revert geometry */
 | 
	
		
			
				|  |  | -	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 | 
	
		
			
				|  |  | -	int minax, maxax, minay, maxay;
 | 
	
		
			
				|  |  | -	long flags;
 | 
	
		
			
				|  |  | -	unsigned int border, oldborder;
 | 
	
		
			
				|  |  | -	Bool isbanned, isfixed, ismax, isfloating, wasfloating;
 | 
	
		
			
				|  |  | -	Bool tags[sizeof tags / sizeof tags[0]];
 | 
	
		
			
				|  |  | -	Client *next;
 | 
	
		
			
				|  |  | -	Client *prev;
 | 
	
		
			
				|  |  | -	Client *snext;
 | 
	
		
			
				|  |  | -	Window win;
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | +Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* functions*/
 | 
	
		
			
				|  |  |  void
 | 
	
	
		
			
				|  | @@ -265,8 +267,7 @@ applyrules(Client *c) {
 | 
	
		
			
				|  |  |  	if(ch.res_name)
 | 
	
		
			
				|  |  |  		XFree(ch.res_name);
 | 
	
		
			
				|  |  |  	if(!matched)
 | 
	
		
			
				|  |  | -		for(i = 0; i < ntags; i++)
 | 
	
		
			
				|  |  | -			c->tags[i] = seltags[i];
 | 
	
		
			
				|  |  | +		memcpy(c->tags, seltags, sizeof seltags);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void
 | 
	
	
		
			
				|  | @@ -1002,13 +1003,13 @@ leavenotify(XEvent *e) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  manage(Window w, XWindowAttributes *wa) {
 | 
	
		
			
				|  |  | -	unsigned int i;
 | 
	
		
			
				|  |  |  	Client *c, *t = NULL;
 | 
	
		
			
				|  |  |  	Window trans;
 | 
	
		
			
				|  |  |  	Status rettrans;
 | 
	
		
			
				|  |  |  	XWindowChanges wc;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	c = emallocz(sizeof(Client));
 | 
	
		
			
				|  |  | +	c->tags = emallocz(sizeof seltags);
 | 
	
		
			
				|  |  |  	c->win = w;
 | 
	
		
			
				|  |  |  	c->x = wa->x;
 | 
	
		
			
				|  |  |  	c->y = wa->y;
 | 
	
	
		
			
				|  | @@ -1043,8 +1044,7 @@ manage(Window w, XWindowAttributes *wa) {
 | 
	
		
			
				|  |  |  	if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
 | 
	
		
			
				|  |  |  		for(t = clients; t && t->win != trans; t = t->next);
 | 
	
		
			
				|  |  |  	if(t)
 | 
	
		
			
				|  |  | -		for(i = 0; i < ntags; i++)
 | 
	
		
			
				|  |  | -			c->tags[i] = t->tags[i];
 | 
	
		
			
				|  |  | +		memcpy(c->tags, t->tags, sizeof seltags);
 | 
	
		
			
				|  |  |  	applyrules(c);
 | 
	
		
			
				|  |  |  	if(!c->isfloating)
 | 
	
		
			
				|  |  |  		c->isfloating = (rettrans == Success) || c->isfixed;
 | 
	
	
		
			
				|  | @@ -1702,6 +1702,7 @@ unmanage(Client *c) {
 | 
	
		
			
				|  |  |  		focus(NULL);
 | 
	
		
			
				|  |  |  	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
 | 
	
		
			
				|  |  |  	setclientstate(c, WithdrawnState);
 | 
	
		
			
				|  |  | +	free(c->tags);
 | 
	
		
			
				|  |  |  	free(c);
 | 
	
		
			
				|  |  |  	XSync(dpy, False);
 | 
	
		
			
				|  |  |  	XSetErrorHandler(xerror);
 | 
	
	
		
			
				|  | @@ -1838,6 +1839,7 @@ void
 | 
	
		
			
				|  |  |  view(const char *arg) {
 | 
	
		
			
				|  |  |  	unsigned int i;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	memcpy(prevtags, seltags, sizeof seltags);
 | 
	
		
			
				|  |  |  	for(i = 0; i < ntags; i++)
 | 
	
		
			
				|  |  |  		seltags[i] = arg == NULL;
 | 
	
		
			
				|  |  |  	i = idxoftag(arg);
 | 
	
	
		
			
				|  | @@ -1846,6 +1848,16 @@ view(const char *arg) {
 | 
	
		
			
				|  |  |  	arrange();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void
 | 
	
		
			
				|  |  | +viewprevtag(const char *arg) {
 | 
	
		
			
				|  |  | +	static Bool tmptags[sizeof tags / sizeof tags[0]];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	memcpy(tmptags, seltags, sizeof seltags);
 | 
	
		
			
				|  |  | +	memcpy(seltags, prevtags, sizeof seltags);
 | 
	
		
			
				|  |  | +	memcpy(prevtags, tmptags, sizeof seltags);
 | 
	
		
			
				|  |  | +	arrange();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  zoom(const char *arg) {
 | 
	
		
			
				|  |  |  	Client *c;
 |