nmaster-ncol.c - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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 }