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