comparison view.c @ 381:b00cc483d13b

still something wrong with reorder()
author Anselm R. Garbe <arg@10kloc.org>
date Tue, 29 Aug 2006 13:40:09 +0200
parents 4bf79305d675
children 76b62c0c8c11
comparison
equal deleted inserted replaced
380:4bf79305d675 381:b00cc483d13b
4 */ 4 */
5 #include "dwm.h" 5 #include "dwm.h"
6 6
7 /* static */ 7 /* static */
8 8
9 static Client * 9 static void
10 getslot(Client *c) 10 reorder()
11 { 11 {
12 unsigned int i, tic; 12 Client *c, *orig, *p;
13 Client *p; 13
14 14 orig = clients;
15 for(tic = 0; tic < ntags && !c->tags[tic]; tic++); 15 clients = NULL;
16 for(p = clients; p; p = p->next) { 16
17 for(i = 0; i < ntags && !p->tags[i]; i++); 17 while((c = orig)) {
18 if(tic < i) 18 orig = orig->next;
19 return p; 19 detach(c);
20 } 20
21 return p; 21 for(p = clients; p && p->next && p->weight <= c->weight; p = p->next);
22 } 22 c->prev = p;
23 23 if(p) {
24 static Client * 24 if((c->next = p->next))
25 tail() 25 c->next->prev = c;
26 { 26 p->next = c;
27 Client *c; 27 }
28 for(c = clients; c && c->next; c = c->next); 28 else
29 return c; 29 clients = c;
30 }
30 } 31 }
31 32
32 /* extern */ 33 /* extern */
33 34
34 void (*arrange)(Arg *) = DEFMODE; 35 void (*arrange)(Arg *) = DEFMODE;
35
36 void
37 attach(Client *c)
38 {
39 Client *p;
40
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;
50 }
51
52 if(p == clients) {
53 c->next = clients;
54 clients->prev = c;
55 clients = c;
56 }
57 else {
58 p->prev->next = c;
59 c->prev = p->prev;
60 p->prev = c;
61 c->next = p;
62 }
63 }
64 36
65 void 37 void
66 detach(Client *c) 38 detach(Client *c)
67 { 39 {
68 if(c->prev) 40 if(c->prev)
275 247
276 seltag[arg->i] = !seltag[arg->i]; 248 seltag[arg->i] = !seltag[arg->i];
277 for(i = 0; i < ntags && !seltag[i]; i++); 249 for(i = 0; i < ntags && !seltag[i]; i++);
278 if(i == ntags) 250 if(i == ntags)
279 seltag[arg->i] = True; /* cannot toggle last view */ 251 seltag[arg->i] = True; /* cannot toggle last view */
252 reorder();
280 arrange(NULL); 253 arrange(NULL);
281 } 254 }
282 255
283 void 256 void
284 view(Arg *arg) 257 view(Arg *arg)
285 { 258 {
286 unsigned int i; 259 unsigned int i;
260 Client *c;
287 261
288 for(i = 0; i < ntags; i++) 262 for(i = 0; i < ntags; i++)
289 seltag[i] = False; 263 seltag[i] = False;
290 seltag[arg->i] = True; 264 seltag[arg->i] = True;
265 reorder();
291 arrange(NULL); 266 arrange(NULL);
292 } 267 }
293 268
294 void 269 void
295 zoom(Arg *arg) 270 zoom(Arg *arg)
301 276
302 if(c == getnext(clients)) 277 if(c == getnext(clients))
303 if(!(c = getnext(c->next))) 278 if(!(c = getnext(c->next)))
304 return; 279 return;
305 detach(c); 280 detach(c);
306 attach(c); 281 c->next = clients;
282 clients->prev = c;
283 clients = c;
307 focus(c); 284 focus(c);
308 arrange(NULL); 285 arrange(NULL);
309 } 286 }