this algorithm seems to keep order for any scenario
016c5419
1 file(s) · +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 | ||