96 lines
3.4 KiB
Diff
96 lines
3.4 KiB
Diff
|
diff --git a/config.h b/config.h
|
||
|
index 9504079..8a8fba2 100644
|
||
|
--- a/config.h
|
||
|
+++ b/config.h
|
||
|
@@ -8,6 +8,7 @@ static const int showbar = 1; /* 0 means no bar */
|
||
|
static const int topbar = 1; /* 0 means bottom bar */
|
||
|
static const int vertpad = 10; /* vertical padding of bar */
|
||
|
static const int sidepad = 20; /* horizontal padding of bar */
|
||
|
+static const float firstwindowoffset = 0.1; /* render first window 10% larger than mfact would for firstwindowcentered layout */
|
||
|
static const char *fonts[] = { "monospace:size=13",
|
||
|
"IPAGothic:size=13",
|
||
|
"symbola:size=13"};
|
||
|
@@ -85,13 +86,13 @@ static const int resizehints = 1; /* 1 means respect size hints in tiled resi
|
||
|
|
||
|
static const Layout layouts[] = {
|
||
|
/* symbol arrange function */
|
||
|
- { "[@]", spiral }, /* first entry is default */
|
||
|
+ { "1[\\]", centeredfirstwindow}, /* Master in middle, dwindle if more than masters*/
|
||
|
{ "[\\]", dwindle }, /* Default: Master on left, slaves on right */
|
||
|
- { "H[]", deck }, /* Master on left, slaves in monocle-like mode on right */
|
||
|
+ { "[@]", spiral }, /* first entry is default */
|
||
|
{ ">M>", centeredfloatingmaster }, /* Same but master floats */
|
||
|
+ { "H[]", deck }, /* Master on left, slaves in monocle-like mode on right */
|
||
|
{ "[]=", tile }, /* Default: Master on left, slaves on right */
|
||
|
{ "TTT", bstack }, /* Master on top, slaves on bottom */
|
||
|
- { "|M|", centeredmaster }, /* Master in middle, slaves on sides */
|
||
|
{ "[M]", monocle },
|
||
|
{ "===", bstackhoriz },
|
||
|
{ "><>", NULL }, /* no layout function means floating behavior */
|
||
|
diff --git a/dwm.c b/dwm.c
|
||
|
index 8081e23..a6774db 100644
|
||
|
--- a/dwm.c
|
||
|
+++ b/dwm.c
|
||
|
@@ -17,7 +17,6 @@
|
||
|
* client.
|
||
|
*
|
||
|
* Keys and tagging rules are organized as arrays and defined in config.h.
|
||
|
- *
|
||
|
* To understand everything else, start reading main().
|
||
|
*/
|
||
|
#include <errno.h>
|
||
|
@@ -252,6 +251,7 @@ static void bstack(Monitor *m);
|
||
|
static void bstackhoriz(Monitor *m);
|
||
|
static void centeredmaster(Monitor *m);
|
||
|
static void centeredfloatingmaster(Monitor *m);
|
||
|
+static void centeredfirstwindow(Monitor *m);
|
||
|
|
||
|
/* variables */
|
||
|
static Client *prevzoom = NULL;
|
||
|
@@ -2492,6 +2492,45 @@ centeredmaster(Monitor *m)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+
|
||
|
+void
|
||
|
+centeredfirstwindow(Monitor *m)
|
||
|
+{
|
||
|
+ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx;
|
||
|
+ Client *c;
|
||
|
+
|
||
|
+ /* print nmaster in layout */
|
||
|
+ snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d[\\]", m->nmaster);
|
||
|
+
|
||
|
+ /* count number of clients in the selected monitor */
|
||
|
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
|
||
|
+ if (n == 0)
|
||
|
+ return;
|
||
|
+
|
||
|
+ /* initialize nmaster area */
|
||
|
+ if (m->ww > m->wh) {
|
||
|
+ mw = m->nmaster ? m->ww * MIN(1.0, (m->mfact + firstwindowoffset)) : 0;
|
||
|
+ mh = m->nmaster ? m->wh : 0;
|
||
|
+ } else {
|
||
|
+ mh = m->nmaster ? m->wh * MIN(1.0, (m->mfact + firstwindowoffset)) : 0;
|
||
|
+ mw = m->nmaster ? m->ww : 0;
|
||
|
+ }
|
||
|
+ mx = mxo = (m->ww - mw) / 2;
|
||
|
+ my = myo = (m->wh - mh) / 2;
|
||
|
+
|
||
|
+ if ( n > m->nmaster){
|
||
|
+ fibonacci(m, 1);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||
|
+ if (i < m->nmaster) {
|
||
|
+ /* nmaster clients are stacked horizontally, in the center
|
||
|
+ * of the screen */
|
||
|
+ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i);
|
||
|
+ resize(c, m->wx + mx, m->wy + my, w - (2*c->bw),
|
||
|
+ mh - (2*c->bw), 0);
|
||
|
+ mx += WIDTH(c);
|
||
|
+ } }
|
||
|
void
|
||
|
centeredfloatingmaster(Monitor *m)
|
||
|
{
|