dvtm

Fork of dvtm, a minimal terminal multiplexer
git clone git://git.laack.co/dvtm.git
Log | Files | Refs | README | LICENSE

fibonacci.c (1993B)


      1 static void fibonacci(int s)
      2 {
      3 	unsigned int nx, ny, nw, nnw, nh, nnh, i, n, mod;
      4 	Client *c;
      5 
      6 	for (n = 0, c = nextvisible(clients); c; c = nextvisible(c->next))
      7 		if (!c->minimized)
      8 			n++;
      9 
     10 	/* initial position and dimensions */
     11 	nx = wax;
     12 	ny = way;
     13 	nw = (n == 1) ? waw : screen.mfact * waw;
     14 	/* don't waste space dviding by 2 doesn't work for odd numbers
     15 	 * plus we need space for the border too. therefore set up these
     16 	 * variables for the next new width/height
     17 	 */
     18 	nnw = waw - nw - 1;
     19 	nnh = nh = wah;
     20 
     21 	/* set the mod factor, 2 for dwindle, 4 for spiral */
     22 	mod = s ? 4 : 2;
     23 
     24 	for (i = 0, c = nextvisible(clients); c; c = nextvisible(c->next)) {
     25 		if (c->minimized)
     26 			continue;
     27 		/* dwindle: even case, spiral: case 0 */
     28 		if (i % mod == 0) {
     29 			if (i) {
     30 				if (s) {
     31 					nh = nnh;
     32 					ny -= nh;
     33 				} else {
     34 					ny += nh;
     35 					nh = nnh;
     36 				}
     37 				/* don't adjust the width for the last client */
     38 				if (i < n - 1) {
     39 					nw /= 2;
     40 					nnw -= nw + 1;
     41 				}
     42 				mvaddch(ny, nx - 1, ACS_LTEE);
     43 			}
     44 		} else if (i % mod == 1) {	/* dwindle: odd case, spiral: case 1 */
     45 			nx += nw;
     46 			mvvline(ny, nx, ACS_VLINE, nh);
     47 			mvaddch(ny, nx, ACS_TTEE);
     48 			++nx;
     49 			nw = nnw;
     50 			/* don't adjust the height for the last client */
     51 			if (i < n - 1) {
     52 				nh /= 2;
     53 				nnh -= nh;
     54 			}
     55 		} else if (i % mod == 2 && s) {	/* spiral: case 2 */
     56 			ny += nh;
     57 			nh = nnh;
     58 			/* don't adjust the width for the last client */
     59 			if (i < n - 1) {
     60 				nw /= 2;
     61 				nnw -= nw + 1;
     62 				nx += nnw;
     63 				mvvline(ny, nx, ACS_VLINE, nh);
     64 				mvaddch(ny, nx, ACS_TTEE);
     65 				++nx;
     66 			} else {
     67 				mvaddch(ny, nx - 1, ACS_LTEE);
     68 			}
     69 		} else if (s) {	/* spiral: case 3 */
     70 			nw = nnw;
     71 			nx -= nw + 1;	/* border */
     72 			/* don't adjust the height for the last client */
     73 			if (i < n - 1) {
     74 				nh /= 2;
     75 				nnh -= nh;
     76 				ny += nnh;
     77 			}
     78 			mvaddch(ny, nx - 1, ACS_LTEE);
     79 		}
     80 
     81 		resize(c, nx, ny, nw, nh);
     82 		i++;
     83 	}
     84 }
     85 
     86 static void spiral(void)
     87 {
     88 	fibonacci(1);
     89 }
     90 
     91 static void dwindle(void)
     92 {
     93 	fibonacci(0);
     94 }