aboutsummaryrefslogtreecommitdiff
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/dwm.c b/dwm.c
index 8bcf0da..f9719ac 100644
--- a/dwm.c
+++ b/dwm.c
@@ -130,6 +130,7 @@ struct Monitor {
Monitor *next;
Window barwin;
const Layout *lt[2];
+ float cFact;
};
typedef struct {
@@ -142,7 +143,7 @@ typedef struct {
} Rule;
/* function declarations */
-static void restart(Arg *arg);
+static void restart(const Arg *arg);
static void applyrules(Client *c);
static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
static void arrange(Monitor *m);
@@ -203,6 +204,7 @@ static void setfocus(Client *c);
static void setfullscreen(Client *c, int fullscreen);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
+static void setcfact(const Arg *arg);
static void setup(void);
static void seturgent(Client *c, int urg);
static void showhide(Client *c);
@@ -210,6 +212,8 @@ static void spawn(const Arg *arg);
static void tag(const Arg *arg);
static void tagmon(const Arg *arg);
static void tile(Monitor *m);
+static void layoutCenterFact(Monitor *m, double fact);
+static void layoutCenter(Monitor *m);
static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
static void toggletag(const Arg *arg);
@@ -652,6 +656,7 @@ createmon(void)
m->topbar = topbar;
m->lt[0] = &layouts[0];
m->lt[1] = &layouts[1 % LENGTH(layouts)];
+ m->cFact = cfact;
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
return m;
}
@@ -1545,6 +1550,21 @@ setmfact(const Arg *arg)
arrange(selmon);
}
+/* arg > 1.0 will set cfact absolutely */
+void
+setcfact(const Arg *arg)
+{
+ float f;
+
+ if (!arg || !selmon->lt[selmon->sellt]->arrange)
+ return;
+ f = arg->f < 1.0 ? arg->f + selmon->cFact : arg->f - 1.0;
+ if (f < 0.05 || f > 0.95)
+ return;
+ selmon->cFact = f;
+ arrange(selmon);
+}
+
void
setup(void)
{
@@ -1713,6 +1733,54 @@ tile(Monitor *m)
}
}
+/* Like "tile", but only take up a factor of the screen */
+void
+layoutCenterFact(Monitor *m, double fact)
+{
+ unsigned int i, n, h, mw, my, ty;
+ Client *c;
+
+
+ // double fact = 0.9;
+ unsigned int lx, ly, lw, lh;
+
+ lx = (m->ww - (m->ww * fact))/2;
+ ly = (m->wh - (m->wh * fact))/2;
+ lw = m->ww * fact;
+ lh = m->wh * fact;
+
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ if (n == 0)
+ return;
+
+ printf("Number of clients: %d\n", n);
+
+ if (n > m->nmaster)
+ mw = m->nmaster ? lw * m->mfact : 0;
+ else
+ mw = lw;
+ for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < m->nmaster) {
+ h = (lh - my) / (MIN(n, m->nmaster) - i);
+ resize(c, lx, ly + my, mw - (2*c->bw), h - (2*c->bw), 0);
+ if (my + HEIGHT(c) < lh)
+ my += HEIGHT(c);
+ } else {
+ h = (lh - ty) / (n - i);
+ resize(c, lx + mw, ly + ty, lw - mw - (2*c->bw), h - (2*c->bw), 0);
+ if (ty + HEIGHT(c) < lh)
+ ty += HEIGHT(c);
+ }
+}
+
+/* Simply utilize the factor attached to the monitor */
+void
+layoutCenter(Monitor *m)
+{
+ layoutCenterFact(m, m->cFact);
+}
+
+
void
togglebar(const Arg *arg)
{