| 1 | /* See LICENSE file for copyright and license details. */ |
| 2 | /* © 2010 joten <joten@freenet.de> */ |
| 3 | |
| 4 | struct Monitor { |
| 5 | char ltsymbol[16]; |
| 6 | float mfact; |
| 7 | double mfacts[LENGTH(tags) + 1]; |
| 8 | int ltaxis[3]; |
| 9 | int ltaxes[LENGTH(tags) + 1][3]; |
| 10 | int num; |
| 11 | int curtag; |
| 12 | int prevtag; |
| 13 | int by; /* bar geometry */ |
| 14 | int mx, my, mw, mh; /* screen size */ |
| 15 | int wx, wy, ww, wh; /* window area */ |
| 16 | unsigned int msplit; |
| 17 | unsigned int msplits[LENGTH(tags) + 1]; |
| 18 | unsigned int seltags; |
| 19 | unsigned int sellt; |
| 20 | unsigned int tagset[2]; |
| 21 | int showbar; |
| 22 | int showbars[LENGTH(tags) + 1]; |
| 23 | int topbar; |
| 24 | Client *clients; |
| 25 | Client *sel; |
| 26 | Client *stack; |
| 27 | Monitor *next; |
| 28 | Window barwin; |
| 29 | const Layout *lt[2]; |
| 30 | const Layout *lts[LENGTH(tags) + 1]; |
| 31 | }; |
| 32 | |
| 33 | /* function declarations */ |
| 34 | static void mirrorlayout(const Arg *arg); |
| 35 | static void rotatelayoutaxis(const Arg *arg); |
| 36 | static void shiftmastersplit(const Arg *arg); |
| 37 | |
| 38 | void |
| 39 | mirrorlayout(const Arg *arg) |
| 40 | { |
| 41 | if(!selmon->lt[selmon->sellt]->arrange) |
| 42 | return; |
| 43 | selmon->ltaxis[0] *= -1; |
| 44 | selmon->ltaxes[selmon->curtag][0] = selmon->ltaxis[0]; |
| 45 | arrange(selmon); |
| 46 | } |
| 47 | |
| 48 | void |
| 49 | rotatelayoutaxis(const Arg *arg) |
| 50 | { |
| 51 | if(!selmon->lt[selmon->sellt]->arrange) |
| 52 | return; |
| 53 | if(arg->i == 0) { |
| 54 | if(selmon->ltaxis[0] > 0) |
| 55 | selmon->ltaxis[0] = selmon->ltaxis[0] + 1 > 2 ? 1 : selmon->ltaxis[0] + 1; |
| 56 | else |
| 57 | selmon->ltaxis[0] = selmon->ltaxis[0] - 1 < -2 ? -1 : selmon->ltaxis[0] - 1; |
| 58 | } else |
| 59 | selmon->ltaxis[arg->i] = selmon->ltaxis[arg->i] + 1 > 3 ? 1 : selmon->ltaxis[arg->i] + 1; |
| 60 | selmon->ltaxes[selmon->curtag][arg->i] = selmon->ltaxis[arg->i]; |
| 61 | arrange(selmon); |
| 62 | } |
| 63 | |
| 64 | void |
| 65 | shiftmastersplit(const Arg *arg) |
| 66 | { |
| 67 | unsigned int n; |
| 68 | Client *c; |
| 69 | |
| 70 | for(n = 0, c = nexttiled(selmon->clients); c; c = nexttiled(c->next), n++); |
| 71 | if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->msplit + arg->i < 1 || selmon->msplit + arg->i > n) |
| 72 | return; |
| 73 | selmon->msplit += arg->i; |
| 74 | selmon->msplits[selmon->curtag] = selmon->msplit; |
| 75 | arrange(selmon); |
| 76 | } |
| 77 | |
| 78 | void |
| 79 | tile(Monitor *m) |
| 80 | { |
| 81 | char sym1 = 61, sym2 = 93, sym3 = 61, sym; |
| 82 | int x1 = m->wx, y1 = m->wy, h1 = m->wh, w1 = m->ww, X1 = x1 + w1, Y1 = y1 + h1; |
| 83 | int x2 = m->wx, y2 = m->wy, h2 = m->wh, w2 = m->ww, X2 = x2 + w2, Y2 = y2 + h2; |
| 84 | unsigned int i, n, n1, n2; |
| 85 | Client *c; |
| 86 | |
| 87 | for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); |
| 88 | if(m->msplit > n) |
| 89 | m->msplit = (n == 0) ? 1 : n; |
| 90 | /* layout symbol */ |
| 91 | if(abs(m->ltaxis[0]) == m->ltaxis[1]) /* explicitly: ((abs(m->ltaxis[0]) == 1 && m->ltaxis[1] == 1) || (abs(m->ltaxis[0]) == 2 && m->ltaxis[1] == 2)) */ |
| 92 | sym1 = 124; |
| 93 | if(abs(m->ltaxis[0]) == m->ltaxis[2]) |
| 94 | sym3 = 124; |
| 95 | if(m->ltaxis[1] == 3) |
| 96 | sym1 = (n == 0) ? 0 : m->msplit; |
| 97 | if(m->ltaxis[2] == 3) |
| 98 | sym3 = (n == 0) ? 0 : n - m->msplit; |
| 99 | if(m->ltaxis[0] < 0) { |
| 100 | sym = sym1; |
| 101 | sym1 = sym3; |
| 102 | sym2 = 91; |
| 103 | sym3 = sym; |
| 104 | } |
| 105 | if(m->msplit == 1) { |
| 106 | if(m->ltaxis[0] > 0) |
| 107 | sym1 = 91; |
| 108 | else |
| 109 | sym3 = 93; |
| 110 | } |
| 111 | if(m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[2] == 3) |
| 112 | snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%d", sym1, sym2, sym3); |
| 113 | else if((m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] > 0) || (m->ltaxis[2] == 3 && m->ltaxis[0] < 0)) |
| 114 | snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%c", sym1, sym2, sym3); |
| 115 | else if((m->ltaxis[2] == 3 && m->ltaxis[0] > 0) || (m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] < 0)) |
| 116 | snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%d", sym1, sym2, sym3); |
| 117 | else |
| 118 | snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%c", sym1, sym2, sym3); |
| 119 | if(n == 0) |
| 120 | return; |
| 121 | /* master and stack area */ |
| 122 | if(abs(m->ltaxis[0]) == 1 && n > m->msplit) { |
| 123 | w1 *= m->mfact; |
| 124 | w2 -= w1; |
| 125 | x1 += (m->ltaxis[0] < 0) ? w2 : 0; |
| 126 | x2 += (m->ltaxis[0] < 0) ? 0 : w1; |
| 127 | X1 = x1 + w1; |
| 128 | X2 = x2 + w2; |
| 129 | } else if(abs(m->ltaxis[0]) == 2 && n > m->msplit) { |
| 130 | h1 *= m->mfact; |
| 131 | h2 -= h1; |
| 132 | y1 += (m->ltaxis[0] < 0) ? h2 : 0; |
| 133 | y2 += (m->ltaxis[0] < 0) ? 0 : h1; |
| 134 | Y1 = y1 + h1; |
| 135 | Y2 = y2 + h2; |
| 136 | } |
| 137 | /* master */ |
| 138 | n1 = (m->ltaxis[1] != 1 || w1 / m->msplit < bh) ? 1 : m->msplit; |
| 139 | n2 = (m->ltaxis[1] != 2 || h1 / m->msplit < bh) ? 1 : m->msplit; |
| 140 | for(i = 0, c = nexttiled(m->clients); i < m->msplit; c = nexttiled(c->next), i++) { |
| 141 | resize(c, x1, y1, |
| 142 | (m->ltaxis[1] == 1 && i + 1 == m->msplit) ? X1 - x1 - 2 * c->bw : w1 / n1 - 2 * c->bw, |
| 143 | (m->ltaxis[1] == 2 && i + 1 == m->msplit) ? Y1 - y1 - 2 * c->bw : h1 / n2 - 2 * c->bw, False); |
| 144 | if(n1 > 1) |
| 145 | x1 = c->x + WIDTH(c); |
| 146 | if(n2 > 1) |
| 147 | y1 = c->y + HEIGHT(c); |
| 148 | } |
| 149 | /* stack */ |
| 150 | if(n > m->msplit) { |
| 151 | n1 = (m->ltaxis[2] != 1 || w2 / (n - m->msplit) < bh) ? 1 : n - m->msplit; |
| 152 | n2 = (m->ltaxis[2] != 2 || h2 / (n - m->msplit) < bh) ? 1 : n - m->msplit; |
| 153 | for(i = 0; c; c = nexttiled(c->next), i++) { |
| 154 | resize(c, x2, y2, |
| 155 | (m->ltaxis[2] == 1 && i + 1 == n - m->msplit) ? X2 - x2 - 2 * c->bw : w2 / n1 - 2 * c->bw, |
| 156 | (m->ltaxis[2] == 2 && i + 1 == n - m->msplit) ? Y2 - y2 - 2 * c->bw : h2 / n2 - 2 * c->bw, False); |
| 157 | if(n1 > 1) |
| 158 | x2 = c->x + WIDTH(c); |
| 159 | if(n2 > 1) |
| 160 | y2 = c->y + HEIGHT(c); |
| 161 | } |
| 162 | } |
| 163 | } |