|  | @@ -11,9 +11,9 @@
 | 
	
		
			
				|  |  |   * in O(1) time.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * Each child of the root window is called a client, except windows which have
 | 
	
		
			
				|  |  | - * set the override_redirect flag.  Clients are organized in a global
 | 
	
		
			
				|  |  | - * linked client list, the focus history is remembered through a global
 | 
	
		
			
				|  |  | - * stack list. Each client contains a bit array to indicate the tags of a
 | 
	
		
			
				|  |  | + * set the override_redirect flag.  Clients are organized in a linked client
 | 
	
		
			
				|  |  | + * list on each monitor, the focus history is remembered through a stack list
 | 
	
		
			
				|  |  | + * on each monitor. Each client contains a bit array to indicate the tags of a
 | 
	
		
			
				|  |  |   * client.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * Keys and tagging rules are organized as arrays and defined in config.h.
 | 
	
	
		
			
				|  | @@ -164,6 +164,7 @@ static void destroynotify(XEvent *e);
 | 
	
		
			
				|  |  |  static void detach(Client *c);
 | 
	
		
			
				|  |  |  static void detachstack(Client *c);
 | 
	
		
			
				|  |  |  static void die(const char *errstr, ...);
 | 
	
		
			
				|  |  | +static Monitor *dirtomon(int dir);
 | 
	
		
			
				|  |  |  static void drawbar(Monitor *m);
 | 
	
		
			
				|  |  |  static void drawbars(void);
 | 
	
		
			
				|  |  |  static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
 | 
	
	
		
			
				|  | @@ -180,7 +181,6 @@ static long getstate(Window w);
 | 
	
		
			
				|  |  |  static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 | 
	
		
			
				|  |  |  static void grabbuttons(Client *c, Bool focused);
 | 
	
		
			
				|  |  |  static void grabkeys(void);
 | 
	
		
			
				|  |  | -static Monitor *idxtomon(unsigned int n);
 | 
	
		
			
				|  |  |  static void initfont(const char *fontstr);
 | 
	
		
			
				|  |  |  static Bool isprotodel(Client *c);
 | 
	
		
			
				|  |  |  static void keypress(XEvent *e);
 | 
	
	
		
			
				|  | @@ -621,6 +621,22 @@ die(const char *errstr, ...) {
 | 
	
		
			
				|  |  |  	exit(EXIT_FAILURE);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Monitor *
 | 
	
		
			
				|  |  | +dirtomon(int dir) {
 | 
	
		
			
				|  |  | +	Monitor *m = NULL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(dir > 0)
 | 
	
		
			
				|  |  | +		if(!(m = selmon->next))
 | 
	
		
			
				|  |  | +			m = mons;
 | 
	
		
			
				|  |  | +	else {
 | 
	
		
			
				|  |  | +		if(selmon == mons)
 | 
	
		
			
				|  |  | +			for(m = mons; m->next; m = m->next);
 | 
	
		
			
				|  |  | +		else
 | 
	
		
			
				|  |  | +			for(m = mons; m->next != selmon; m = m->next);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return m;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  drawbar(Monitor *m) {
 | 
	
		
			
				|  |  |  	int x;
 | 
	
	
		
			
				|  | @@ -797,10 +813,11 @@ focusin(XEvent *e) { /* there are some broken focus acquiring clients */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  focusmon(const Arg *arg) {
 | 
	
		
			
				|  |  | -	Monitor *m;
 | 
	
		
			
				|  |  | +	Monitor *m = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if(!(m = idxtomon(arg->ui)) || m == selmon)
 | 
	
		
			
				|  |  | +	if(!mons->next)
 | 
	
		
			
				|  |  |  		return;
 | 
	
		
			
				|  |  | +	m = dirtomon(arg->i);
 | 
	
		
			
				|  |  |  	unfocus(selmon->sel);
 | 
	
		
			
				|  |  |  	selmon = m;
 | 
	
		
			
				|  |  |  	focus(NULL);
 | 
	
	
		
			
				|  | @@ -934,15 +951,6 @@ grabkeys(void) {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Monitor *
 | 
	
		
			
				|  |  | -idxtomon(unsigned int n) {
 | 
	
		
			
				|  |  | -	unsigned int i;
 | 
	
		
			
				|  |  | -	Monitor *m;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for(m = mons, i = 0; m && i != n; m = m->next, i++);
 | 
	
		
			
				|  |  | -	return m;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  initfont(const char *fontstr) {
 | 
	
		
			
				|  |  |  	char *def, **missing;
 | 
	
	
		
			
				|  | @@ -1512,11 +1520,9 @@ tag(const Arg *arg) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  tagmon(const Arg *arg) {
 | 
	
		
			
				|  |  | -	Monitor *m;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if(!selmon->sel || !(m = idxtomon(arg->ui)))
 | 
	
		
			
				|  |  | -		return;
 | 
	
		
			
				|  |  | -	sendmon(selmon->sel, m);
 | 
	
		
			
				|  |  | +	if(!selmon->sel || !mons->next)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	sendmon(selmon->sel, dirtomon(arg->i));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int
 |