wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

stack.c (2527B)


      1 /* Copyright ©2009-2010 Kris Maglione <maglione.k at Gmail>
      2  * See LICENSE file for license details.
      3  */
      4 #include "dat.h"
      5 #include "fns.h"
      6 
      7 void
      8 stack_scale(Frame *first, int height) {
      9 	Frame *f;
     10 	uint dy;
     11 	int surplus;
     12 
     13 	/*
     14 	 * Will need something like this.
     15 	a = first->area;
     16 	column_fit(a, &ncol, &nuncol);
     17 	*/
     18 
     19 	dy = 0;
     20 	for(f=first; f && !f->collapsed; f=f->anext)
     21 		dy += Dy(f->colr);
     22 
     23 	/* Distribute the surplus.
     24 	 */
     25 	surplus = height - dy;
     26 	for(f=first; f && !f->collapsed; f=f->anext)
     27 		f->colr.max.y += ((float)Dy(f->r) / dy) * surplus;
     28 }
     29 
     30 void
     31 stack_info(Frame *f, Frame **firstp, Frame **lastp, int *dyp, int *nframep) {
     32 	Frame *ft, *first, *last;
     33 	int dy, nframe;
     34 
     35 	nframe = 0;
     36 	dy = 0;
     37 	first = f;
     38 	last = f;
     39 
     40 	for(ft=f; ft && ft->collapsed; ft=ft->anext)
     41 		;
     42 	if(ft && ft != f) {
     43 		f = ft;
     44 		dy += Dy(f->colr);
     45 	}
     46 	for(ft=f; ft && !ft->collapsed; ft=ft->aprev) {
     47 		first = ft;
     48 		nframe++;
     49 		dy += Dy(ft->colr);
     50 	}
     51 	for(ft=f->anext; ft && !ft->collapsed; ft=ft->anext) {
     52 		if(first == nil)
     53 			first = ft;
     54 		last = ft;
     55 		nframe++;
     56 		dy += Dy(ft->colr);
     57 	}
     58 	if(nframep) *nframep = nframe;
     59 	if(firstp) *firstp = first;
     60 	if(lastp) *lastp = last;
     61 	if(dyp) *dyp = dy;
     62 }
     63 
     64 int
     65 stack_count(Frame *f, int *mp) {
     66 	Frame *fp;
     67 	int n, m;
     68 
     69 	n = 0;
     70 	for(fp=f->aprev; fp && fp->collapsed; fp=fp->aprev)
     71 		n++;
     72 	m = ++n;
     73 	for(fp=f->anext; fp && fp->collapsed; fp=fp->anext)
     74 		n++;
     75 	if(mp) *mp = m;
     76 	return n;
     77 }
     78 
     79 Frame*
     80 stack_find(Area *a, Frame *f, int dir, bool stack) {
     81 	Frame *fp;
     82 
     83 #define predicate(f) !((f)->collapsed && stack || (f)->client->nofocus)
     84 	switch (dir) {
     85 	default:
     86 		die("not reached");
     87 	case North:
     88 		if(f)
     89 			for(f=f->aprev; f && !predicate(f); f=f->aprev)
     90 				;
     91 		else {
     92 			f = nil;
     93 			for(fp=a->frame; fp; fp=fp->anext)
     94 				if(predicate(fp))
     95 					f = fp;
     96 		}
     97 		break;
     98 	case South:
     99 		if(f)
    100 			for(f=f->anext; f && !predicate(f); f=f->anext)
    101 				;
    102 		else
    103 			for(f=a->frame; f && !predicate(f); f=f->anext)
    104 				;
    105 		break;
    106 	}
    107 #undef predicate
    108 	return f;
    109 }
    110 
    111 bool
    112 find(Area **ap, Frame **fp, int dir, bool wrap, bool stack) {
    113 	Rectangle r;
    114 	Frame *f;
    115 	Area *a;
    116 
    117 	f = *fp;
    118 	a = *ap;
    119 	r = f ? f->r : a->r;
    120 
    121 	if(dir == North || dir == South) {
    122 		*fp = stack_find(a, f, dir, stack);
    123 		if(*fp)
    124 			return true;
    125 		if(!a->floating)
    126 			*ap = area_find(a->view, r, dir, wrap);
    127 		if(!*ap)
    128 			return false;
    129 		*fp = stack_find(*ap, *fp, dir, stack);
    130 		return true;
    131 	}
    132 	if(dir != East && dir != West)
    133 		die("not reached");
    134 	*ap = area_find(a->view, r, dir, wrap);
    135 	if(!*ap)
    136 		return false;
    137 	*fp = ap[0]->sel;
    138 	return true;
    139 }
    140