diff options
| author | Anselm R. Garbe <arg@10kloc.org> | 2006-08-29 09:57:57 +0200 | 
|---|---|---|
| committer | Anselm R. Garbe <arg@10kloc.org> | 2006-08-29 09:57:57 +0200 | 
| commit | 016c54196e682ae8658854febb746b0437a010dc (patch) | |
| tree | 0d715594eabf1f62076b2d7f189620a041190cea | |
| parent | 5056bb952ddd9d667d2897ab09324ef7ce1596ea (diff) | |
| download | dwm-016c54196e682ae8658854febb746b0437a010dc.tar.gz | |
this algorithm seems to keep order for any scenario
| -rw-r--r-- | view.c | 55 | 
1 files changed, 41 insertions, 14 deletions
| @@ -4,6 +4,31 @@   */  #include "dwm.h" +/* static */ + +static Client * +getslot(Client *c) +{ +	unsigned int i, tic; +	Client *p; + +	for(tic = 0; tic < ntags && !c->tags[tic]; tic++); +	for(p = clients; p; p = p->next) { +		for(i = 0; i < ntags && !p->tags[i]; i++); +		if(tic < i) +			return p; +	} +	return p; +} + +static Client * +tail() +{ +	Client *c; +	for(c = clients; c && c->next; c = c->next); +	return c; +} +  /* extern */  void (*arrange)(Arg *) = DEFMODE; @@ -11,27 +36,29 @@ void (*arrange)(Arg *) = DEFMODE;  void  attach(Client *c)  { -	Client *first = getnext(clients); +	Client *p; -	if(!first) { -		if(clients) { -			for(first = clients; first->next; first = first->next); -			first->next = c; -			c->prev = first; -		} -		else -			clients = c; +	if(!clients) { +		clients = c; +		return; +	} +	if(!(p = getnext(clients)) && !(p = getslot(c))) { +		p = tail(); +		c->prev = p; +		p->next = c; +		return;  	} -	else if(first == clients) { + +	if(p == clients) {  		c->next = clients;  		clients->prev = c;  		clients = c;  	}  	else { -		first->prev->next = c; -		c->prev = first->prev; -		first->prev = c; -		c->next = first; +		p->prev->next = c; +		c->prev = p->prev; +		p->prev = c; +		c->next = p;  	}  } | 
