this algorithm seems to keep order for any scenario 016c5419
Anselm R. Garbe · 2006-08-29 09:57 1 file(s) · +41 −14
view.c +41 −14
4 4
 */
5 5
#include "dwm.h"
6 6
7 +
/* static */
8 +
9 +
static Client *
10 +
getslot(Client *c)
11 +
{
12 +
	unsigned int i, tic;
13 +
	Client *p;
14 +
15 +
	for(tic = 0; tic < ntags && !c->tags[tic]; tic++);
16 +
	for(p = clients; p; p = p->next) {
17 +
		for(i = 0; i < ntags && !p->tags[i]; i++);
18 +
		if(tic < i)
19 +
			return p;
20 +
	}
21 +
	return p;
22 +
}
23 +
24 +
static Client *
25 +
tail()
26 +
{
27 +
	Client *c;
28 +
	for(c = clients; c && c->next; c = c->next);
29 +
	return c;
30 +
}
31 +
7 32
/* extern */
8 33
9 34
void (*arrange)(Arg *) = DEFMODE;
11 36
void
12 37
attach(Client *c)
13 38
{
14 -
	Client *first = getnext(clients);
39 +
	Client *p;
15 40
16 -
	if(!first) {
17 -
		if(clients) {
18 -
			for(first = clients; first->next; first = first->next);
19 -
			first->next = c;
20 -
			c->prev = first;
21 -
		}
22 -
		else
23 -
			clients = c;
41 +
	if(!clients) {
42 +
		clients = c;
43 +
		return;
44 +
	}
45 +
	if(!(p = getnext(clients)) && !(p = getslot(c))) {
46 +
		p = tail();
47 +
		c->prev = p;
48 +
		p->next = c;
49 +
		return;
24 50
	}
25 -
	else if(first == clients) {
51 +
52 +
	if(p == clients) {
26 53
		c->next = clients;
27 54
		clients->prev = c;
28 55
		clients = c;
29 56
	}
30 57
	else {
31 -
		first->prev->next = c;
32 -
		c->prev = first->prev;
33 -
		first->prev = c;
34 -
		c->next = first;
58 +
		p->prev->next = c;
59 +
		c->prev = p->prev;
60 +
		p->prev = c;
61 +
		c->next = p;
35 62
	}
36 63
}
37 64