sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

nmaster-ncol.c (3474B)


      1 enum {MaxMon = 8};
      2 static int nmasters[MaxMon];
      3 static int initnm = 0;
      4 
      5 static void
      6 initnmaster(void) {
      7 	int i;
      8 
      9 	if(initnm)
     10 		return;
     11 	for(i = 0; i < MaxMon; i++)
     12 		nmasters[i] = nmaster;
     13 	initnm = 1;
     14 }
     15 
     16 static void
     17 incnmaster(const Arg *arg) {
     18 	if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
     19 		return;
     20 	nmasters[selmon->num] += arg->i;
     21 	if(nmasters[selmon->num] < 0)
     22 		nmasters[selmon->num] = 0;
     23 	arrange(NULL);
     24 }
     25 
     26 static void
     27 setnmaster(const Arg *arg) {
     28 	if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
     29 		return;
     30 	nmasters[selmon->num] = arg->i > 0 ? arg->i : 0;
     31 	arrange(NULL);
     32 }
     33 
     34 static void
     35 ntile(Monitor *m) {
     36 	int x, y, h, w, mw, nm;
     37 	unsigned int i, n;
     38 	Client *c;
     39 
     40 	initnmaster();
     41 	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
     42 	c = nexttiled(m->clients);
     43 	nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
     44 	if(nm > n)
     45 		nm = n;
     46 	/* master */
     47 	if(nm > 0) {
     48 		mw = m->mfact * m->ww;
     49 		h = m->wh / nm;
     50 		if(h < bh)
     51 			h = m->wh;
     52 		y = m->wy;
     53 		for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
     54 			resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
     55 			       ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
     56 			if(h != m->wh)
     57 				y = c->y + HEIGHT(c);
     58 		}
     59 		n -= nm;
     60 	} else
     61 		mw = 0;
     62 	if(n == 0)
     63 		return;
     64 	/* tile stack */
     65 	x = m->wx + mw;
     66 	y = m->wy;
     67 	w = m->ww - mw;
     68 	h = m->wh / n;
     69 	if(h < bh)
     70 		h = m->wh;
     71 	for(i = 0; c; c = nexttiled(c->next), i++) {
     72 		resize(c, x, y, w - 2 * c->bw,
     73 		       ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
     74 		if(h != m->wh)
     75 			y = c->y + HEIGHT(c);
     76 	}
     77 }
     78 
     79 static void
     80 ncol(Monitor *m) {
     81 	int x, y, h, w, mw, nm;
     82 	unsigned int i, n;
     83 	Client *c;
     84 
     85 	initnmaster();
     86 	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
     87 	c = nexttiled(m->clients);
     88 	nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
     89 	if(nm > n)
     90 		nm = n;
     91 	/* master */
     92 	if(nm > 0) {
     93 		mw = (n == nm) ? m->ww : m->mfact * m->ww;
     94 		w = mw / nm;
     95         x = m->wx;
     96 		for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
     97 			resize(c, x, m->wy, w - 2 * c->bw, m->wh - 2 * c->bw, False);
     98             x = c->x + WIDTH(c);
     99 		}
    100 		n -= nm;
    101 	} else
    102 		mw = 0;
    103 	if(n == 0)
    104 		return;
    105 	/* tile stack */
    106 	x = m->wx + mw;
    107 	y = m->wy;
    108 	w = m->ww - mw;
    109 	h = m->wh / n;
    110 	if(h < bh)
    111 		h = m->wh;
    112 	for(i = 0; c; c = nexttiled(c->next), i++) {
    113 		resize(c, x, y, w - 2 * c->bw,
    114 		       ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
    115 		if(h != m->wh)
    116 			y = c->y + HEIGHT(c);
    117 	}
    118 }
    119 
    120 static void
    121 nbstack(Monitor *m) {
    122 	int x, y, h, w, mh, nm;
    123 	unsigned int i, n;
    124 	Client *c;
    125 
    126 	initnmaster();
    127 	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
    128 	c = nexttiled(m->clients);
    129 	nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
    130 	if(nm > n)
    131 		nm = n;
    132 	/* master */
    133 	if(nm > 0) {
    134 		mh = m->mfact * m->wh;
    135 		w = m->ww / nm;
    136 		if(w < bh)
    137 			w = m->ww;
    138 		x = m->wx;
    139 		for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
    140 			resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
    141 			       (n == nm ? m->wh : mh) - 2 * c->bw, False);
    142 			if(w != m->ww)
    143 				x = c->x + WIDTH(c);
    144 		}
    145 		n -= nm;
    146 	} else
    147 		mh = 0;
    148 	if(n == 0)
    149 		return;
    150 	/* tile stack */
    151 	x = m->wx;
    152 	y = m->wy + mh;
    153 	w = m->ww / n;
    154 	h = m->wh - mh;
    155 	if(w < bh)
    156 		w = m->ww;
    157 	for(i = 0; c; c = nexttiled(c->next), i++) {
    158 		resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
    159 		       h - 2 * c->bw, False);
    160 		if(w != m->ww)
    161 			x = c->x + WIDTH(c);
    162 	}
    163 }