view.c
changeset 381 b00cc483d13b
parent 380 4bf79305d675
child 382 76b62c0c8c11
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 }