comparison view.c @ 380:4bf79305d675

this algorithm seems to keep order for any scenario
author Anselm R. Garbe <arg@10kloc.org>
date Tue, 29 Aug 2006 09:57:57 +0200
parents 83576f5f0a90
children b00cc483d13b
comparison
equal deleted inserted replaced
379:fc279cd6c7be 380:4bf79305d675
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> 2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
3 * See LICENSE file for license details. 3 * See LICENSE file for license details.
4 */ 4 */
5 #include "dwm.h" 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 /* extern */ 32 /* extern */
8 33
9 void (*arrange)(Arg *) = DEFMODE; 34 void (*arrange)(Arg *) = DEFMODE;
10 35
11 void 36 void
12 attach(Client *c) 37 attach(Client *c)
13 { 38 {
14 Client *first = getnext(clients); 39 Client *p;
15 40
16 if(!first) { 41 if(!clients) {
17 if(clients) { 42 clients = c;
18 for(first = clients; first->next; first = first->next); 43 return;
19 first->next = c; 44 }
20 c->prev = first; 45 if(!(p = getnext(clients)) && !(p = getslot(c))) {
21 } 46 p = tail();
22 else 47 c->prev = p;
23 clients = c; 48 p->next = c;
24 } 49 return;
25 else if(first == clients) { 50 }
51
52 if(p == clients) {
26 c->next = clients; 53 c->next = clients;
27 clients->prev = c; 54 clients->prev = c;
28 clients = c; 55 clients = c;
29 } 56 }
30 else { 57 else {
31 first->prev->next = c; 58 p->prev->next = c;
32 c->prev = first->prev; 59 c->prev = p->prev;
33 first->prev = c; 60 p->prev = c;
34 c->next = first; 61 c->next = p;
35 } 62 }
36 } 63 }
37 64
38 void 65 void
39 detach(Client *c) 66 detach(Client *c)