Add layout "horizontile"
This commit is contained in:
parent
709a30d70b
commit
cce017e348
10
config.def.h
10
config.def.h
|
@ -41,6 +41,7 @@ static const Layout layouts[] = {
|
|||
{ layouts_symbol_monocle, monocle }, /* first entry is default */
|
||||
{ layouts_symbol_floating, NULL }, /* no layout function means floating behavior */
|
||||
{ layouts_symbol_tile, tile },
|
||||
{ layouts_symbol_horizontile, horizontile },
|
||||
{ layouts_symbol_centeredmaster, centeredmaster },
|
||||
};
|
||||
|
||||
|
@ -74,10 +75,11 @@ static Key keys[] = {
|
|||
{ MODKEY, XK_Return, zoom, {0} },
|
||||
{ MODKEY, XK_Tab, view, {0} },
|
||||
{ MODKEY|ShiftMask, XK_x, killclient, {0} },
|
||||
{ MODKEY, XK_m, setlayout, {.v = &layouts[0]} },
|
||||
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
|
||||
{ MODKEY, XK_t, setlayout, {.v = &layouts[2]} },
|
||||
{ MODKEY, XK_u, setlayout, {.v = &layouts[3]} },
|
||||
{ MODKEY, XK_m, setlayout, {.v = &layouts[0]} }, // Monocle
|
||||
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, // Floating
|
||||
{ MODKEY, XK_t, setlayout, {.v = &layouts[2]} }, // Tile
|
||||
{ MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[3]} }, // Horizontile
|
||||
{ MODKEY, XK_u, setlayout, {.v = &layouts[4]} }, // Centeredmaster
|
||||
{ MODKEY, XK_space, setlayout, {0} },
|
||||
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
|
||||
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
||||
|
|
1
dwm.c
1
dwm.c
|
@ -212,6 +212,7 @@ static unsigned int getsystraywidth();
|
|||
static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
|
||||
static void grabbuttons(Client *c, int focused);
|
||||
static void grabkeys(void);
|
||||
static void horizontile(Monitor *);
|
||||
static void incnmaster(const Arg *arg);
|
||||
static void keypress(XEvent *e);
|
||||
static void killclient(const Arg *arg);
|
||||
|
|
|
@ -98,6 +98,74 @@ centeredmaster(Monitor *m)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
horizontile(Monitor *m)
|
||||
{
|
||||
unsigned int n = 0;
|
||||
for (Client *c = nexttiled(m->clients); c; c = nexttiled(c->next), ++n);
|
||||
if (n == 0) return;
|
||||
|
||||
const bool is_fullscreen = m->sel == NULL ? false : m->sel->isfullscreen;
|
||||
|
||||
const int gap_size = helpers_gap_size(n, is_fullscreen, is_fullscreen);
|
||||
const int border_width = helpers_border_width(n, is_fullscreen, is_fullscreen);
|
||||
|
||||
const int top_left_half_gap = gap_size / 2;
|
||||
const int bottom_right_half_gap = gap_size - top_left_half_gap;
|
||||
|
||||
const unsigned int mh = n > m->nmaster ? (m->nmaster ? m->wh * m->mfact : 0) : m->wh;
|
||||
|
||||
Client *c = nexttiled(m->clients);
|
||||
|
||||
for (unsigned int i = 0, mx = 0, tx = 0; c; c = nexttiled(c->next), ++i) {
|
||||
if (i < m->nmaster) {
|
||||
const unsigned int w = (m->ww - mx) / (MIN(n, m->nmaster) - i);
|
||||
|
||||
const unsigned int left_gap = i == 0 ? gap_size : top_left_half_gap;
|
||||
const unsigned int top_gap = gap_size;
|
||||
const unsigned int right_gap = (i == m->nmaster - 1 || i == n - 1) ? gap_size : bottom_right_half_gap;
|
||||
const unsigned int bottom_gap = n <= m->nmaster ? gap_size : bottom_right_half_gap;
|
||||
|
||||
resize(
|
||||
c,
|
||||
m->wx + mx + left_gap,
|
||||
m->wy + top_gap,
|
||||
w - 2 * border_width - left_gap - right_gap,
|
||||
mh - 2 * border_width - top_gap - bottom_gap,
|
||||
border_width,
|
||||
0
|
||||
);
|
||||
|
||||
// FIXME: maybe need + left_gap + right_gap
|
||||
if (mx + WIDTH(c) < m->ww) {
|
||||
mx += WIDTH(c) + left_gap + right_gap;
|
||||
}
|
||||
} else {
|
||||
const unsigned int w = (m->ww - tx) / (n - i);
|
||||
|
||||
const unsigned int left_gap = i == m->nmaster ? gap_size : top_left_half_gap;
|
||||
const unsigned int top_gap = m->nmaster == 0 ? gap_size : top_left_half_gap;
|
||||
const unsigned int right_gap = (i == n - 1) ? gap_size : bottom_right_half_gap;
|
||||
const unsigned int bottom_gap = gap_size;
|
||||
|
||||
resize(
|
||||
c,
|
||||
m->wx + tx + left_gap,
|
||||
m->wy + mh + top_gap,
|
||||
w - 2 * border_width - left_gap - right_gap,
|
||||
m->wh - mh - 2 * border_width - top_gap - bottom_gap,
|
||||
border_width,
|
||||
0
|
||||
);
|
||||
|
||||
// FIXME: maybe need + left_gap + right_gap
|
||||
if (tx + WIDTH(c) < m->ww) {
|
||||
tx += WIDTH(c) + left_gap + right_gap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
monocle(Monitor *m)
|
||||
{
|
||||
|
@ -162,6 +230,7 @@ tile(Monitor *m)
|
|||
0
|
||||
);
|
||||
|
||||
// FIXME: maybe need + top_gap + bottom_gap
|
||||
if (my + HEIGHT(c) < m->wh) {
|
||||
my += HEIGHT(c) + top_gap + bottom_gap;
|
||||
}
|
||||
|
@ -183,6 +252,7 @@ tile(Monitor *m)
|
|||
0
|
||||
);
|
||||
|
||||
// FIXME: maybe need + top_gap + bottom_gap
|
||||
if (ty + HEIGHT(c) < m->wh) {
|
||||
ty += HEIGHT(c) + top_gap + bottom_gap;
|
||||
}
|
||||
|
|
15
layouts.c
15
layouts.c
|
@ -84,6 +84,21 @@ void layouts_symbol_tile(
|
|||
strncpy(buffer, tmp, buffer_size);
|
||||
}
|
||||
|
||||
void layouts_symbol_horizontile(
|
||||
char *const buffer,
|
||||
const size_t buffer_size,
|
||||
const unsigned int clients_in_master,
|
||||
const unsigned int visible_clients
|
||||
) {
|
||||
// TODO: maybe we should assert
|
||||
if (buffer == NULL) return;
|
||||
|
||||
char tmp[TMP_BUFFER_SIZE];
|
||||
sprintf(tmp, "v{%u/%u}v", clients_in_master, visible_clients);
|
||||
tmp[(buffer_size > TMP_BUFFER_SIZE ? TMP_BUFFER_SIZE : buffer_size) - 1] = '\0';
|
||||
strncpy(buffer, tmp, buffer_size);
|
||||
}
|
||||
|
||||
void layouts_symbol_centeredmaster(
|
||||
char *const buffer,
|
||||
const size_t buffer_size,
|
||||
|
|
Loading…
Reference in New Issue