| nmaster.c - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| nmaster.c (7346B) | |
| --- | |
| 1 #if 0 | |
| 2 | |
| 3 TITLE | |
| 4 | |
| 5 subject: ntile/nmaster/tilecols layouts with cpt patch included for dwm… | |
| 6 author: pancake <youterm.com> * | |
| 7 | |
| 8 | |
| 9 NOTES | |
| 10 | |
| 11 Remember to append a ISTILE line like that one in your config.h: | |
| 12 | |
| 13 #define ISTILE isarrange(tile) || isarrange(ntile) || isarrange(dntile)… | |
| 14 | |
| 15 | |
| 16 INSTALLATION | |
| 17 | |
| 18 Copy this file into the dwm root directory (the one) and follow the ins… | |
| 19 related into the configuration section. | |
| 20 | |
| 21 | |
| 22 CONFIGURATION | |
| 23 | |
| 24 You should modify your config.h to include "nmaster.c" from it after | |
| 25 setting the NMASTER, NCOLS and NROWS macro definitions. | |
| 26 | |
| 27 | |
| 28 *** NMASTER *** | |
| 29 | |
| 30 #define NMASTER 1 | |
| 31 #include "nmaster.c" | |
| 32 | |
| 33 Layout layouts[] = { | |
| 34 { "-|=", ntile }, /* first entry is default */ | |
| 35 .. | |
| 36 { MODKEY|ShiftMask, XK_j, setnmaster, … | |
| 37 { MODKEY|ShiftMask, XK_k, setnmaster, … | |
| 38 | |
| 39 | |
| 40 | |
| 41 *** TILECOLS *** | |
| 42 | |
| 43 #define NCOLS 2 | |
| 44 #define NROWS 1 | |
| 45 #include "nmaster.c" | |
| 46 | |
| 47 Layout layouts[] = { | |
| 48 { "E|]", tilecols }, /* first entry is default */ | |
| 49 .. | |
| 50 { MODKEY|ShiftMask, XK_j, setnrows… | |
| 51 { MODKEY|ShiftMask, XK_k, setnrows… | |
| 52 { MODKEY|ShiftMask, XK_l, setncols… | |
| 53 { MODKEY|ShiftMask, XK_h, setncols… | |
| 54 | |
| 55 | |
| 56 *** CLIENTS PER TAG *** | |
| 57 | |
| 58 Valid values are: | |
| 59 -1 - show all clients | |
| 60 0 - show no clients | |
| 61 >0 - show N clients | |
| 62 | |
| 63 Example configuration: | |
| 64 { MODKEY|ShiftMask, XK_q, clientspertag, … | |
| 65 { MODKEY, XK_q, clientspertag, … | |
| 66 { MODKEY, XK_w, clientspertag, … | |
| 67 { MODKEY, XK_e, clientspertag, … | |
| 68 | |
| 69 #endif | |
| 70 | |
| 71 int cpt = -1; | |
| 72 void clientspertag(const char *arg) { | |
| 73 if (arg[0]=='^') { | |
| 74 if (cpt==-1) cpt = atoi(arg+1); | |
| 75 else cpt = -1; | |
| 76 } else cpt = atoi(arg); | |
| 77 arrange(); | |
| 78 } | |
| 79 | |
| 80 #ifdef NMASTER | |
| 81 int nmaster = NMASTER; | |
| 82 void | |
| 83 ntile(void) { | |
| 84 unsigned int i, n, nx, ny, nw, nh, mw, mh, th; | |
| 85 Client *c; | |
| 86 | |
| 87 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) | |
| 88 n++; | |
| 89 | |
| 90 if (cpt!=-1 && n>cpt) n = cpt; | |
| 91 | |
| 92 /* window geoms */ | |
| 93 mh = (n <= nmaster) ? wah / (n > 0 ? n : 1) : wah / nmaster; | |
| 94 mw = (n <= nmaster) ? waw : mwfact * waw; | |
| 95 th = (n > nmaster) ? wah / (n - nmaster) : 0; | |
| 96 if(n > nmaster && th < bh) | |
| 97 th = wah; | |
| 98 | |
| 99 nx = wax; | |
| 100 ny = way; | |
| 101 for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i+… | |
| 102 if (cpt!=-1 && i>=cpt) { | |
| 103 ban(c); | |
| 104 continue; | |
| 105 } | |
| 106 c->ismax = False; | |
| 107 if(i < nmaster) { /* master */ | |
| 108 ny = way + i * mh; | |
| 109 nw = mw - 2 * c->border; | |
| 110 nh = mh; | |
| 111 if(i + 1 == (n < nmaster ? n : nmaster)) /* rema… | |
| 112 nh = wah - mh * i; | |
| 113 nh -= 2 * c->border; | |
| 114 } | |
| 115 else { /* tile window */ | |
| 116 if(i == nmaster) { | |
| 117 ny = way; | |
| 118 nx += mw; | |
| 119 } | |
| 120 nw = waw - mw - 2 * c->border; | |
| 121 if(i + 1 == n) /* remainder */ | |
| 122 nh = (way + wah) - ny - 2 * c->border; | |
| 123 else | |
| 124 nh = th - 2 * c->border; | |
| 125 } | |
| 126 resize(c, nx, ny, nw, nh, False); | |
| 127 if(n > nmaster && th != wah) | |
| 128 ny += nh + 2 * c->border; | |
| 129 } | |
| 130 } | |
| 131 | |
| 132 void | |
| 133 dntile(void) { | |
| 134 unsigned int i, n, nx, ny, nw, nh, mw, mh, th, inc; | |
| 135 Client *c; | |
| 136 | |
| 137 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) | |
| 138 n++; | |
| 139 if (cpt!=-1 && n>cpt) n = cpt; | |
| 140 | |
| 141 /* dynamic nmaster */ | |
| 142 if (n<5) inc = 0; | |
| 143 else if (n<7) inc = 1; | |
| 144 else inc = 2; | |
| 145 nmaster+=inc; | |
| 146 | |
| 147 /* window geoms */ | |
| 148 mh = (n <= nmaster) ? wah / (n > 0 ? n : 1) : wah / nmaster; | |
| 149 mw = (n <= nmaster) ? waw : mwfact * waw; | |
| 150 th = (n > nmaster) ? wah / (n - nmaster) : 0; | |
| 151 if(n > nmaster && th < bh) | |
| 152 th = wah; | |
| 153 | |
| 154 nx = wax; | |
| 155 ny = way; | |
| 156 for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i+… | |
| 157 if (cpt!=-1 && i>=cpt) { | |
| 158 ban(c); | |
| 159 continue; | |
| 160 } | |
| 161 c->ismax = False; | |
| 162 if(i < nmaster) { /* master */ | |
| 163 ny = way + i * mh; | |
| 164 nw = mw - 2 * c->border; | |
| 165 nh = mh; | |
| 166 if(i + 1 == (n < nmaster ? n : nmaster)) /* rema… | |
| 167 nh = wah - mh * i; | |
| 168 nh -= 2 * c->border; | |
| 169 } | |
| 170 else { /* tile window */ | |
| 171 if(i == nmaster) { | |
| 172 ny = way; | |
| 173 nx += mw; | |
| 174 } | |
| 175 nw = waw - mw - 2 * c->border; | |
| 176 if(i + 1 == n) /* remainder */ | |
| 177 nh = (way + wah) - ny - 2 * c->border; | |
| 178 else | |
| 179 nh = th - 2 * c->border; | |
| 180 } | |
| 181 resize(c, nx, ny, nw, nh, False); | |
| 182 if(n > nmaster && th != wah) | |
| 183 ny += nh + 2 * c->border; | |
| 184 } | |
| 185 nmaster-=inc; | |
| 186 } | |
| 187 | |
| 188 void | |
| 189 setnmaster(const char *arg) { | |
| 190 int i; | |
| 191 | |
| 192 if(!isarrange(ntile)&&!isarrange(dntile)) | |
| 193 return; | |
| 194 if(!arg) | |
| 195 nmaster = NMASTER; | |
| 196 else { | |
| 197 i = atoi(arg); | |
| 198 if((nmaster + i) < 1 || wah / (nmaster + i) <= 2 * BORDE… | |
| 199 return; | |
| 200 nmaster += i; | |
| 201 } | |
| 202 if(sel) | |
| 203 arrange(); | |
| 204 } | |
| 205 #endif | |
| 206 | |
| 207 #ifdef NCOLS | |
| 208 #ifdef NROWS | |
| 209 unsigned int ncols = NCOLS; | |
| 210 unsigned int nrows = NROWS; | |
| 211 | |
| 212 void | |
| 213 setncols(const char *arg) { | |
| 214 int i; | |
| 215 | |
| 216 if(!isarrange(tile)) | |
| 217 return; | |
| 218 if(!arg) | |
| 219 i = NCOLS; | |
| 220 else if(arg[0] != '+' && arg[0] != '-') | |
| 221 i = atoi(arg); | |
| 222 else | |
| 223 i = ncols + atoi(arg); | |
| 224 | |
| 225 if((i < 1) || (i >= 1 && waw / i <= 2 * BORDERPX)) | |
| 226 return; | |
| 227 ncols = i; | |
| 228 | |
| 229 if(sel) | |
| 230 arrange(); | |
| 231 } | |
| 232 | |
| 233 void | |
| 234 setnrows(const char *arg) { | |
| 235 int i; | |
| 236 | |
| 237 if(!isarrange(tile)) | |
| 238 return; | |
| 239 if(!arg) | |
| 240 i = NROWS; | |
| 241 else if(arg[0] != '+' && arg[0] != '-') | |
| 242 i = atoi(arg); | |
| 243 else | |
| 244 i = nrows + atoi(arg); | |
| 245 | |
| 246 if(i < 1 || wah <= 2 * BORDERPX * i) | |
| 247 return; | |
| 248 nrows = i; | |
| 249 | |
| 250 if(sel) | |
| 251 arrange(); | |
| 252 } | |
| 253 | |
| 254 void | |
| 255 tilecols(void) { | |
| 256 unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th, tw1, cols, ro… | |
| 257 Client *c; | |
| 258 | |
| 259 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) | |
| 260 n++; | |
| 261 /* calculate correct number of rows */ | |
| 262 if(ncols > 0 && n - nmaster > nrows * ncols) | |
| 263 rows = (n - nmaster) / ncols + ((n - nmaster) % ncols ?… | |
| 264 else | |
| 265 rows = nrows; | |
| 266 | |
| 267 if (cpt!=-1 && n>cpt) n = cpt; | |
| 268 | |
| 269 /* window geoms */ | |
| 270 mh = (n <= nmaster) ? wah / (n > 0 ? n : 1) : wah / nmaster; | |
| 271 | |
| 272 if (nmaster == 0) { | |
| 273 mh = mw = 0; | |
| 274 } | |
| 275 else if (n <= nmaster) { | |
| 276 mh = wah / (n > 0 ? n : 1); | |
| 277 mw = waw; | |
| 278 } | |
| 279 else { | |
| 280 mh = wah / nmaster; | |
| 281 mw = mwfact * waw; | |
| 282 } | |
| 283 | |
| 284 if(rows == 0 || n <= nmaster + rows) { | |
| 285 rows1 = n > nmaster ? n - nmaster : 1; | |
| 286 tw = tw1 = waw - mw; | |
| 287 th = wah / rows1; | |
| 288 } | |
| 289 else { | |
| 290 rows1 = 1 + (n - nmaster - 1) % rows; | |
| 291 cols = (n - nmaster) / rows + ((n - nmaster) % rows ? 1 … | |
| 292 tw = (waw - mw) / cols; | |
| 293 tw1 = waw - mw - (cols - 1) * tw; | |
| 294 th = wah / rows; | |
| 295 } | |
| 296 | |
| 297 nx = wax; | |
| 298 ny = way; | |
| 299 | |
| 300 for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i+… | |
| 301 if (cpt!=-1 && i>=cpt) { | |
| 302 ban(c); | |
| 303 continue; | |
| 304 } | |
| 305 c->ismax = False; | |
| 306 if(i < nmaster) { /* master column */ | |
| 307 ny = way + i * mh; | |
| 308 nw = mw - 2 * c->border; | |
| 309 nh = mh - 2 * c->border; | |
| 310 if(i == 0) | |
| 311 nh += wah - mh * (n < nmaster ? n : nma… | |
| 312 //nh = mh; | |
| 313 if(i + 1 == (n < nmaster ? n : nmaster)) /* rema… | |
| 314 nh = wah - mh * i; | |
| 315 nh -= 2 * c->border; | |
| 316 } | |
| 317 else if(i < nmaster + rows1) { /* first stack column */ | |
| 318 if(i == nmaster) { /* initialise */ | |
| 319 ny = way; | |
| 320 nx += mw; | |
| 321 nh = wah - 2*c->border - (rows1 - 1) * … | |
| 322 } else | |
| 323 nh = th - 2 * c->border; | |
| 324 nw = tw1 - 2 * c->border; | |
| 325 } | |
| 326 else { /* successive stack columns - rows > 0 if we rea… | |
| 327 if((i - nmaster - rows1) % rows == 0) { /* rein… | |
| 328 ny = way; | |
| 329 nx += nw + 2 * c-> border; | |
| 330 nh = wah - 2*c->border - (rows - 1) * t… | |
| 331 } | |
| 332 else { | |
| 333 nh = th - 2 * c->border; | |
| 334 } | |
| 335 nw = tw - 2 * c->border; | |
| 336 } | |
| 337 resize(c, nx, ny, nw, nh, False); | |
| 338 ny += nh + 2 * c->border; | |
| 339 } | |
| 340 } | |
| 341 #endif | |
| 342 #endif | |
| 343 |