mirror of
https://github.com/zoriya/dwm.git
synced 2025-12-06 07:16:17 +00:00
This patch differentiates between inner and outer gaps as well as horizontal and vertical gaps. The logic of these layouts also aims to be pixel perfect by ensuring an even split of the available space and re-distributing the remainder among the available clients.
296 lines
16 KiB
C
296 lines
16 KiB
C
/* See LICENSE file for copyright and license details. */
|
|
|
|
/* appearance */
|
|
#include <X11/X.h>
|
|
static const unsigned int borderpx = 1; /* border pixel of windows */
|
|
static const unsigned int snap = 32; /* snap pixel */
|
|
static const unsigned int gappih = 20; /* horiz inner gap between windows */
|
|
static const unsigned int gappiv = 10; /* vert inner gap between windows */
|
|
static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */
|
|
static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */
|
|
static int smartgaps = 0; /* 1 means no outer gap when there is only one window */
|
|
static const int showbar = 1; /* 0 means no bar */
|
|
static const int topbar = 1; /* 0 means bottom bar */
|
|
static const char statussep = ';'; /* separator between status bars */
|
|
static const unsigned int systrayspacing = 2; /* systray spacing */
|
|
static const int showsystray = 1; /* 0 means no systray */
|
|
static int floatposgrid_x = 5; /* float grid columns */
|
|
static int floatposgrid_y = 5; /* float grid rows */
|
|
static const char *fonts[] = { "monospace:size=10" };
|
|
static const char dmenufont[] = "monospace:size=10";
|
|
static char normbgcolor[] = "#222222";
|
|
static char normbordercolor[] = "#444444";
|
|
static char normfgcolor[] = "#bbbbbb";
|
|
static char selfgcolor[] = "#eeeeee";
|
|
static char selbordercolor[] = "#005577";
|
|
static char selbgcolor[] = "#005577";
|
|
static char termcol0[] = "#000000"; /* black */
|
|
static char termcol1[] = "#ff0000"; /* red */
|
|
static char termcol2[] = "#33ff00"; /* green */
|
|
static char termcol3[] = "#ff0099"; /* yellow */
|
|
static char termcol4[] = "#0066ff"; /* blue */
|
|
static char termcol5[] = "#cc00ff"; /* magenta */
|
|
static char termcol6[] = "#00ffff"; /* cyan */
|
|
static char termcol7[] = "#d0d0d0"; /* white */
|
|
static char termcol8[] = "#808080"; /* black */
|
|
static char termcol9[] = "#ff0000"; /* red */
|
|
static char termcol10[] = "#33ff00"; /* green */
|
|
static char termcol11[] = "#ff0099"; /* yellow */
|
|
static char termcol12[] = "#0066ff"; /* blue */
|
|
static char termcol13[] = "#cc00ff"; /* magenta */
|
|
static char termcol14[] = "#00ffff"; /* cyan */
|
|
static char termcol15[] = "#ffffff"; /* white */
|
|
static char *termcolor[] = {
|
|
termcol0,
|
|
termcol1,
|
|
termcol2,
|
|
termcol3,
|
|
termcol4,
|
|
termcol5,
|
|
termcol6,
|
|
termcol7,
|
|
termcol8,
|
|
termcol9,
|
|
termcol10,
|
|
termcol11,
|
|
termcol12,
|
|
termcol13,
|
|
termcol14,
|
|
termcol15,
|
|
};
|
|
static char *colors[][3] = {
|
|
/* fg bg border */
|
|
[SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor },
|
|
[SchemeSel] = { selfgcolor, selbgcolor, selbordercolor },
|
|
};
|
|
|
|
typedef struct {
|
|
const char *name;
|
|
const void *cmd;
|
|
} Sp;
|
|
const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x34", NULL };
|
|
const char *spcmd2[] = {"st", "-n", "spfm", "-g", "144x41", "-e", "ranger", NULL };
|
|
const char *spcmd3[] = {"keepassxc", NULL };
|
|
static Sp scratchpads[] = {
|
|
/* name cmd */
|
|
{"spterm", spcmd1},
|
|
{"spranger", spcmd2},
|
|
{"keepassxc", spcmd3},
|
|
};
|
|
|
|
/* tagging */
|
|
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
|
static const Rule rules[] = {
|
|
/* xprop(1):
|
|
* WM_CLASS(STRING) = instance, class
|
|
* WM_NAME(STRING) = title
|
|
*/
|
|
};
|
|
|
|
/* Bar rules allow you to configure what is shown where on the bar, as well as
|
|
* introducing your own bar modules.
|
|
*
|
|
* monitor:
|
|
* -1 show on all monitors
|
|
* 0 show on monitor 0
|
|
* 'A' show on active monitor (i.e. focused / selected) (or just -1 for active?)
|
|
* bar - bar index, 0 is default, 1 is extrabar
|
|
* alignment - how the module is aligned compared to other modules
|
|
* widthfunc, drawfunc, clickfunc - providing bar module width, draw and click functions
|
|
* name - does nothing, intended for visual clue and for logging / debugging
|
|
*/
|
|
static const BarRule barrules[] = {
|
|
/* monitor bar alignment widthfunc drawfunc clickfunc name */
|
|
{ -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" },
|
|
{ -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" },
|
|
{ 'A', 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_statuscmd, "status2d" },
|
|
{ 'A', 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" },
|
|
{ -1, 0, BAR_ALIGN_NONE, width_wintitle, draw_wintitle, click_wintitle, "wintitle" },
|
|
}
|
|
|
|
static const MonitorRule monrules[] = {
|
|
/* monitor layout mfact nmaster showbar tagset */
|
|
{ -1, 0, -1, -1, -1, 0 }, // default
|
|
};
|
|
|
|
/* layout(s) */
|
|
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
|
|
static const int nmaster = 1; /* number of clients in master area */
|
|
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
|
|
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
|
|
static const int decorhints = 1; /* 1 means respect decoration hints */
|
|
|
|
#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */
|
|
#include "vanitygaps.c"
|
|
|
|
static const Layout layouts[] = {
|
|
/* symbol arrange function */
|
|
{ "[]=", tile }, /* first entry is default */
|
|
{ "[M]", monocle },
|
|
{ "[@]", spiral },
|
|
{ "[\\]", dwindle },
|
|
{ "H[]", deck },
|
|
{ "TTT", bstack },
|
|
{ "===", bstackhoriz },
|
|
{ "HHH", grid },
|
|
{ "###", nrowgrid },
|
|
{ "---", horizgrid },
|
|
{ ":::", gaplessgrid },
|
|
{ "|M|", centeredmaster },
|
|
{ ">M>", centeredfloatingmaster },
|
|
{ "><>", NULL }, /* no layout function means floating behavior */
|
|
{ NULL, NULL },
|
|
};
|
|
|
|
/* key definitions */
|
|
#define MODKEY Mod1Mask
|
|
#define TAGKEYS(KEY,TAG) \
|
|
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
|
|
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
|
|
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
|
|
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
|
|
#define STACKKEYS(MOD,ACTION) \
|
|
{ MOD, XK_j, ACTION##stack, {.i = INC(+1) } }, \
|
|
{ MOD, XK_k, ACTION##stack, {.i = INC(-1) } }, \
|
|
{ MOD, XK_grave, ACTION##stack, {.i = PREVSEL } }, \
|
|
{ MOD, XK_q, ACTION##stack, {.i = 0 } }, \
|
|
{ MOD, XK_a, ACTION##stack, {.i = 1 } }, \
|
|
{ MOD, XK_z, ACTION##stack, {.i = 2 } }, \
|
|
{ MOD, XK_x, ACTION##stack, {.i = -1 } },
|
|
|
|
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
|
|
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
|
|
|
|
/* commands */
|
|
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
|
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbordercolor, "-sf", selfgcolor, NULL };
|
|
static const char *termcmd[] = { "st", NULL };
|
|
|
|
static Key keys[] = {
|
|
/* modifier key function argument */
|
|
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
|
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
|
|
{ MODKEY, XK_b, togglebar, {0} },
|
|
STACKKEYS(MODKEY, focus)
|
|
STACKKEYS(MODKEY|ShiftMask, push)
|
|
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
|
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
|
{ MODKEY, XK_Return, zoom, {0} },
|
|
{ MODKEY|Mod4Mask, XK_u, incrgaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_u, incrgaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_i, incrigaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_i, incrigaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_o, incrogaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_o, incrogaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_6, incrihgaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_6, incrihgaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_7, incrivgaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_7, incrivgaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_8, incrohgaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_8, incrohgaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_9, incrovgaps, {.i = +1 } },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_9, incrovgaps, {.i = -1 } },
|
|
{ MODKEY|Mod4Mask, XK_0, togglegaps, {0} },
|
|
{ MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} },
|
|
{ MODKEY, XK_Tab, view, {0} },
|
|
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
|
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
|
|
{ MODKEY|ShiftMask, XK_f, setlayout, {.v = &layouts[1]} },
|
|
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
|
|
{ MODKEY, XK_space, setlayout, {0} },
|
|
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
|
|
{ MODKEY, XK_f, togglefullscreen, {0} },
|
|
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
|
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
|
|
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
|
|
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
|
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
|
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
|
{ MODKEY, XK_F5, xrdb, {.v = NULL } },
|
|
{ MODKEY, XK_y, togglescratch, {.ui = 0 } },
|
|
{ MODKEY, XK_u, togglescratch, {.ui = 1 } },
|
|
{ MODKEY, XK_x, togglescratch, {.ui = 2 } },
|
|
/* Client position is limited to monitor window area */
|
|
{ Mod4Mask, XK_u, floatpos, {.v = "-26x -26y" } }, // ↖
|
|
{ Mod4Mask, XK_i, floatpos, {.v = " 0x -26y" } }, // ↑
|
|
{ Mod4Mask, XK_o, floatpos, {.v = " 26x -26y" } }, // ↗
|
|
{ Mod4Mask, XK_j, floatpos, {.v = "-26x 0y" } }, // ←
|
|
{ Mod4Mask, XK_l, floatpos, {.v = " 26x 0y" } }, // →
|
|
{ Mod4Mask, XK_m, floatpos, {.v = "-26x 26y" } }, // ↙
|
|
{ Mod4Mask, XK_comma, floatpos, {.v = " 0x 26y" } }, // ↓
|
|
{ Mod4Mask, XK_period, floatpos, {.v = " 26x 26y" } }, // ↘
|
|
/* Absolute positioning (allows moving windows between monitors) */
|
|
{ Mod4Mask|ControlMask, XK_u, floatpos, {.v = "-26a -26a" } }, // ↖
|
|
{ Mod4Mask|ControlMask, XK_i, floatpos, {.v = " 0a -26a" } }, // ↑
|
|
{ Mod4Mask|ControlMask, XK_o, floatpos, {.v = " 26a -26a" } }, // ↗
|
|
{ Mod4Mask|ControlMask, XK_j, floatpos, {.v = "-26a 0a" } }, // ←
|
|
{ Mod4Mask|ControlMask, XK_l, floatpos, {.v = " 26a 0a" } }, // →
|
|
{ Mod4Mask|ControlMask, XK_m, floatpos, {.v = "-26a 26a" } }, // ↙
|
|
{ Mod4Mask|ControlMask, XK_comma, floatpos, {.v = " 0a 26a" } }, // ↓
|
|
{ Mod4Mask|ControlMask, XK_period, floatpos, {.v = " 26a 26a" } }, // ↘
|
|
/* Resize client, client center position is fixed which means that client expands in all directions */
|
|
{ Mod4Mask|ShiftMask, XK_u, floatpos, {.v = "-26w -26h" } }, // ↖
|
|
{ Mod4Mask|ShiftMask, XK_i, floatpos, {.v = " 0w -26h" } }, // ↑
|
|
{ Mod4Mask|ShiftMask, XK_o, floatpos, {.v = " 26w -26h" } }, // ↗
|
|
{ Mod4Mask|ShiftMask, XK_j, floatpos, {.v = "-26w 0h" } }, // ←
|
|
{ Mod4Mask|ShiftMask, XK_k, floatpos, {.v = "800W 800H" } }, // ·
|
|
{ Mod4Mask|ShiftMask, XK_l, floatpos, {.v = " 26w 0h" } }, // →
|
|
{ Mod4Mask|ShiftMask, XK_m, floatpos, {.v = "-26w 26h" } }, // ↙
|
|
{ Mod4Mask|ShiftMask, XK_comma, floatpos, {.v = " 0w 26h" } }, // ↓
|
|
{ Mod4Mask|ShiftMask, XK_period, floatpos, {.v = " 26w 26h" } }, // ↘
|
|
/* Client is positioned in a floating grid, movement is relative to client's current position */
|
|
{ Mod4Mask|Mod1Mask, XK_u, floatpos, {.v = "-1p -1p" } }, // ↖
|
|
{ Mod4Mask|Mod1Mask, XK_i, floatpos, {.v = " 0p -1p" } }, // ↑
|
|
{ Mod4Mask|Mod1Mask, XK_o, floatpos, {.v = " 1p -1p" } }, // ↗
|
|
{ Mod4Mask|Mod1Mask, XK_j, floatpos, {.v = "-1p 0p" } }, // ←
|
|
{ Mod4Mask|Mod1Mask, XK_k, floatpos, {.v = " 0p 0p" } }, // ·
|
|
{ Mod4Mask|Mod1Mask, XK_l, floatpos, {.v = " 1p 0p" } }, // →
|
|
{ Mod4Mask|Mod1Mask, XK_m, floatpos, {.v = "-1p 1p" } }, // ↙
|
|
{ Mod4Mask|Mod1Mask, XK_comma, floatpos, {.v = " 0p 1p" } }, // ↓
|
|
{ Mod4Mask|Mod1Mask, XK_period, floatpos, {.v = " 1p 1p" } }, // ↘
|
|
TAGKEYS( XK_1, 0)
|
|
TAGKEYS( XK_2, 1)
|
|
TAGKEYS( XK_3, 2)
|
|
TAGKEYS( XK_4, 3)
|
|
TAGKEYS( XK_5, 4)
|
|
TAGKEYS( XK_6, 5)
|
|
TAGKEYS( XK_7, 6)
|
|
TAGKEYS( XK_8, 7)
|
|
TAGKEYS( XK_9, 8)
|
|
{ MODKEY|ShiftMask, XK_BackSpace, quit, {0} },
|
|
};
|
|
|
|
/* button definitions */
|
|
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
|
|
static Button buttons[] = {
|
|
/* click event mask button function argument */
|
|
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
|
|
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
|
|
{ ClkWinTitle, 0, Button2, zoom, {0} },
|
|
{ ClkStatusText, 0, Button1, sigdwmblocks, {.i = 1 } },
|
|
{ ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2 } },
|
|
{ ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3 } },
|
|
{ ClkStatusText, 0, Button4, sigdwmblocks, {.i = 4 } },
|
|
{ ClkStatusText, 0, Button5, sigdwmblocks, {.i = 5 } },
|
|
/* placemouse options, choose which feels more natural:
|
|
* 0 - tiled position is relative to mouse cursor
|
|
* 1 - tiled postiion is relative to window center
|
|
* 2 - mouse pointer warps to window center
|
|
*
|
|
* The moveorplace uses movemouse or placemouse depending on the floating state
|
|
* of the selected client. Set up individual keybindings for the two if you want
|
|
* to control these separately (i.e. to retain the feature to move a tiled window
|
|
* into a floating position).
|
|
*/
|
|
{ ClkClientWin, MODKEY, Button1, moveorplace, {.i = 1} },
|
|
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
|
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
|
|
{ ClkTagBar, 0, Button1, view, {0} },
|
|
{ ClkTagBar, 0, Button3, toggleview, {0} },
|
|
{ ClkTagBar, MODKEY, Button1, tag, {0} },
|
|
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
|
|
};
|
|
|