dotfiles

[void/arch] linux dotfiles
git clone git://git.mdnr.space/dotfiles
Log | Files | Refs

config.h (21679B)


      1 /* See LICENSE file for copyright and license details. */
      2 
      3 /* Constants */
      4 #define TERMINAL "st"
      5 #define TERMCLASS "St"
      6 #define BROWSER "chromium"
      7 
      8 /* appearance */
      9 static unsigned int borderpx  = 2;        /* border pixel of windows */
     10 static unsigned int snap      = 32;       /* snap pixel */
     11 static unsigned int gappih    = 10;       /* horiz inner gap between windows */
     12 static unsigned int gappiv    = 5;       /* vert inner gap between windows */
     13 static unsigned int gappoh    = 5;       /* horiz outer gap between windows and screen edge */
     14 static unsigned int gappov    = 15;       /* vert outer gap between windows and screen edge */
     15 static int swallowfloating    = 0;        /* 1 means swallow floating windows by default */
     16 static int smartgaps          = 0;        /* 1 means no outer gap when there is only one window */
     17 static int showbar            = 1;        /* 0 means no bar */
     18 static int topbar             = 0;        /* 0 means bottom bar */
     19 static char *fonts[]          = { "monospace:pixelsize=10", "NotoColorEmoji:pixelsize=10:antialias=true:autohint=true"  };
     20 static char normbgcolor[]           = "#222e2e";
     21 static char normbordercolor[]       = "#444444";
     22 static char normfgcolor[]           = "#eeeeee";
     23 static char selfgcolor[]            = "#eeeeee";
     24 static char selbordercolor[]        = "#c0c0c0";
     25 static char selbgcolor[]            = "#222e2e";
     26 static char activefgcolor[]            = "#ffffff";
     27 static char activebordercolor[]        = "#ffffff";
     28 static char activebgcolor[]            = "#222e2e";
     29 static char *colors[][4] = {
     30        /*               fg           bg           border   */
     31        [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor },
     32        [SchemeSel]  = { selfgcolor,  selbgcolor,  selbordercolor  },
     33        [SchemeAct]  = { activefgcolor,  activebgcolor,  activebordercolor  },
     34 };
     35 
     36 typedef struct {
     37 	const char *name;
     38 	const void *cmd;
     39 } Sp;
     40 const char *spcmd1[] = {TERMINAL, "-n", "spterm", "-g", "120x34", NULL };
     41 const char *spcmd2[] = {TERMINAL, "-n", "spcalc", "-f", "monospace:size=16", "-g", "50x20", "-e", "bc", "-lq", NULL };
     42 const char *spcmd3[] = {TERMINAL, "-n", "spnote", "-g", "120x34", "-e", "nvim", "-c VimwikiMakeDiaryNote", NULL };
     43 const char *spcmd4[] = {TERMINAL, "-n", "sptodo", "-g", "120x34", "-e", "nvim", "/home/mehdi/todo.md", NULL };
     44 const char *spcmd5[] = {TERMINAL, "-n", "spdic", "-g", "80x34", "-e", "dic", NULL };
     45 
     46 static Sp scratchpads[] = {
     47 	/* name          cmd  */
     48 	{"spterm",      spcmd1},
     49 	{"spcalc",      spcmd2},
     50     {"spnote",      spcmd3},
     51     {"sptodo",      spcmd4},
     52     {"spdic",       spcmd5},
     53 };
     54 
     55 /* tagging */
     56 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
     57 
     58 static const Rule rules[] = {
     59 	/* xprop(1):
     60 	 *	WM_CLASS(STRING) = instance, class
     61 	 *	WM_NAME(STRING) = title
     62 	*/
     63 	/* class    instance      title       	 tags mask    isfloating   isterminal  noswallow  monitor */
     64 	{ "Gimp",     NULL,       NULL,       	    1 << 8,       0,           0,         0,        -1 },
     65 	{ "zenity",     NULL,       NULL,       	0,            1,           0,         0,        -1 },
     66 	{ TERMCLASS,  NULL,       NULL,       	    0,            0,           1,         0,        -1 },
     67 	{ NULL,       NULL,       "Event Tester",   0,            0,           0,         1,        -1 },
     68 	{ TERMCLASS,      "floatterm", NULL,       	    0,       1,           1,         0,        -1 },
     69 	{ TERMCLASS,      "bg",        NULL,       	    1 << 7,       0,           1,         0,        -1 },
     70 	{ TERMCLASS,      "spterm",    NULL,       	    SPTAG(0),     1,           1,         0,        -1 },
     71 	{ TERMCLASS,      "spcalc",    NULL,       	    SPTAG(1),     1,           1,         0,        -1 },
     72 	{ TERMCLASS,      "spnote",    NULL,       	    SPTAG(2),     1,           1,         0,        -1 },
     73 	{ TERMCLASS,      "sptodo",    NULL,       	    SPTAG(3),     1,           1,         0,        -1 },
     74 	{ TERMCLASS,      "spdic",    NULL,       	    SPTAG(4),     1,           1,         0,        -1 },
     75 };
     76 
     77 /* layout(s) */
     78 static float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
     79 static int nmaster     = 1;    /* number of clients in master area */
     80 static int resizehints = 0;    /* 1 means respect size hints in tiled resizals */
     81 static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
     82 #define FORCE_VSPLIT 1  /* nrowgrid layout: force two clients to always split vertically */
     83 #include "vanitygaps.c"
     84 static const Layout layouts[] = {
     85 	/* symbol     arrange function */
     86 	{ "[]=",	tile },			/* Default: Master on left, slaves on right */
     87 	{ "TTT",	bstack },		/* Master on top, slaves on bottom */
     88 
     89 	{ "[@]",	spiral },		/* Fibonacci spiral */
     90 	{ "[\\]",	dwindle },		/* Decreasing in size right and leftward */
     91 
     92 	{ "[D]",	deck },			/* Master on left, slaves in monocle-like mode on right */
     93 	{ "[M]",	monocle },		/* All windows on top of eachother */
     94 
     95 	{ "|M|",	centeredmaster },		/* Master in middle, slaves on sides */
     96 	{ ">M>",	centeredfloatingmaster },	/* Same but master floats */
     97 
     98 	{ "><>",	NULL },			/* no layout function means floating behavior */
     99 	{ NULL,		NULL },
    100 };
    101 
    102 /* key definitions */
    103 #define MODKEY Mod4Mask
    104 #define TAGKEYS(KEY,TAG) \
    105 	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
    106 	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
    107 	{ MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
    108 	{ MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
    109 #define STACKKEYS(MOD,ACTION) \
    110 	{ MOD,	XK_j,	ACTION##stack,	{.i = INC(+1) } }, \
    111 	{ MOD,	XK_k,	ACTION##stack,	{.i = INC(-1) } }, \
    112 	{ MOD,  XK_v,   ACTION##stack,  {.i = 0 } }, \
    113 	/* { MOD, XK_grave, ACTION##stack, {.i = PREVSEL } }, \ */
    114 	/* { MOD, XK_a,     ACTION##stack, {.i = 1 } }, \ */
    115 	/* { MOD, XK_z,     ACTION##stack, {.i = 2 } }, \ */
    116 	/* { MOD, XK_x,     ACTION##stack, {.i = -1 } }, */
    117 
    118 /* helper for spawning shell commands in the pre dwm-5.0 fashion */
    119 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
    120 
    121 /* commands */
    122 static const char *termcmd[]  = { TERMINAL, NULL };
    123 
    124 /*
    125  * Xresources preferences to load at startup
    126  */
    127 ResourcePref resources[] = {
    128 		{ "color0",		STRING,	&normbordercolor },
    129 		{ "color8",		STRING,	&selbordercolor },
    130 		{ "color4",		STRING,	&normbgcolor },
    131 		{ "color0",		STRING,	&normfgcolor },
    132 		{ "color0",		STRING,	&selfgcolor },
    133 		{ "color4",		STRING,	&selbgcolor },
    134 		{ "borderpx",		INTEGER, &borderpx },
    135 		{ "snap",		INTEGER, &snap },
    136 		{ "showbar",		INTEGER, &showbar },
    137 		{ "topbar",		INTEGER, &topbar },
    138 		{ "nmaster",		INTEGER, &nmaster },
    139 		{ "resizehints",	INTEGER, &resizehints },
    140 		{ "mfact",		FLOAT,	&mfact },
    141 		{ "gappih",		INTEGER, &gappih },
    142 		{ "gappiv",		INTEGER, &gappiv },
    143 		{ "gappoh",		INTEGER, &gappoh },
    144 		{ "gappov",		INTEGER, &gappov },
    145 		{ "swallowfloating",	INTEGER, &swallowfloating },
    146 		{ "smartgaps",		INTEGER, &smartgaps },
    147 };
    148 
    149 #include <X11/XF86keysym.h>
    150 #include "shiftview.c"
    151 
    152 static const Key keys[] = {
    153 	/* modifier                     key        function        argument */
    154 	STACKKEYS(MODKEY,                          focus)
    155 	STACKKEYS(MODKEY|ShiftMask,                push)
    156 	/* { MODKEY|ShiftMask,		XK_Escape,	spawn,	SHCMD("") }, */
    157 	{ MODKEY,			XK_grave,	spawn,	{.v = (const char*[]){ "dmenuunicode", NULL } } },
    158 	/* { MODKEY|ShiftMask,		XK_grave,	togglescratch,	SHCMD("") }, */
    159 	TAGKEYS(			XK_1,		0)
    160 	TAGKEYS(			XK_2,		1)
    161 	TAGKEYS(			XK_3,		2)
    162 	TAGKEYS(			XK_4,		3)
    163 	TAGKEYS(			XK_5,		4)
    164 	TAGKEYS(			XK_6,		5)
    165 	TAGKEYS(			XK_7,		6)
    166 	TAGKEYS(			XK_8,		7)
    167 	TAGKEYS(			XK_9,		8)
    168 	{ MODKEY,			XK_0,		view,		{.ui = ~0 } },
    169 	{ MODKEY|ShiftMask,		XK_0,		tag,		{.ui = ~0 } },
    170     
    171 	// { MODKEY,			XK_minus,	spawn,		SHCMD("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-; kill -44 $(pidof dwmblocks)") },
    172 	// { MODKEY|ShiftMask,		XK_minus,	spawn,		SHCMD("wpctl set-volume @DEFAULT_AUDIO_SINK@ 15%-; kill -44 $(pidof dwmblocks)") },
    173 	// { MODKEY,			XK_equal,	spawn,		SHCMD("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+; kill -44 $(pidof dwmblocks)") },
    174 	// { MODKEY|ShiftMask,		XK_equal,	spawn,		SHCMD("wpctl set-volume @DEFAULT_AUDIO_SINK@ 15%+; kill -44 $(pidof dwmblocks)") },
    175 
    176 	{ MODKEY,			XK_minus,	spawn,		SHCMD("pamixer --allow-boost -d 5; kill -44 $(pidof dwmblocks)") },
    177 	{ MODKEY|ShiftMask,		XK_minus,	spawn,		SHCMD("pamixer --allow-boost -d 15; kill -44 $(pidof dwmblocks)") },
    178 	{ MODKEY,			XK_equal,	spawn,		SHCMD("pamixer --allow-boost -i 5; kill -44 $(pidof dwmblocks)") },
    179 	{ MODKEY|ShiftMask,		XK_equal,	spawn,		SHCMD("pamixer --allow-boost -i 15; kill -44 $(pidof dwmblocks)") },
    180 
    181 	{ MODKEY,			XK_BackSpace,	spawn,		{.v = (const char*[]){ "sysact", NULL } } },
    182 	{ MODKEY|ShiftMask,		XK_BackSpace,	spawn,		{.v = (const char*[]){ "sysact", NULL } } },
    183 
    184 	{ MODKEY,			XK_Tab,		view,		{0} },
    185 	/* { MODKEY|ShiftMask,		XK_Tab,		spawn,		SHCMD("") }, */
    186 	{ MODKEY,			XK_q,		killclient,	{0} },
    187 	{ MODKEY|ShiftMask,		XK_q,		spawn,		{.v = (const char*[]){ "sysact", NULL } } },
    188 	{ MODKEY,			XK_w,		spawn,		{.v = (const char*[]){ BROWSER, NULL } } },
    189 	{ MODKEY|ShiftMask,		XK_w,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "sudo", "nmtui", NULL } } },
    190 	{ MODKEY,			XK_e,		spawn,		SHCMD(TERMINAL " -e neomutt ; pkill -RTMIN+12 dwmblocks; rmdir ~/.abook") },
    191 	{ MODKEY|ShiftMask,		XK_e,		spawn,		SHCMD(TERMINAL " -e abook -C ~/.config/abook/abookrc --datafile ~/.config/abook/addressbook") },
    192 	{ MODKEY,			XK_r,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "lfub", NULL } } },
    193 	{ MODKEY|ShiftMask,		XK_r,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "btop", NULL } } },
    194 	{ MODKEY,			XK_t,		setlayout,	{.v = &layouts[0]} }, /* tile */
    195 	{ MODKEY|ShiftMask,		XK_t,		setlayout,	{.v = &layouts[1]} }, /* bstack */
    196 	{ MODKEY,			XK_y,		setlayout,	{.v = &layouts[2]} }, /* spiral */
    197 	{ MODKEY|ShiftMask,		XK_y,		setlayout,	{.v = &layouts[3]} }, /* dwindle */
    198 	{ MODKEY,			XK_u,		setlayout,	{.v = &layouts[4]} }, /* deck */
    199 	{ MODKEY|ShiftMask,		XK_u,		setlayout,	{.v = &layouts[5]} }, /* monocle */
    200 	{ MODKEY,			XK_i,		setlayout,	{.v = &layouts[6]} }, /* centeredmaster */
    201 	{ MODKEY|ShiftMask,		XK_i,		setlayout,	{.v = &layouts[7]} }, /* centeredfloatingmaster */
    202 	{ MODKEY,			XK_o,		incnmaster,     {.i = +1 } },
    203 	{ MODKEY|ShiftMask,		XK_o,		incnmaster,     {.i = -1 } },
    204 	/*{ MODKEY,			XK_p,			spawn,		{.v = (const char*[]){ "mpc", "toggle", NULL } } },*/
    205 	{ MODKEY,			XK_p,			spawn,		{.v = (const char*[]){ "passmenu", NULL } } },
    206 	{ MODKEY|ShiftMask,		XK_p,			spawn,		{.v = (const char*[]){ "mpc", "toggle", NULL } } },
    207 	/*{ MODKEY|ShiftMask,		XK_p,			spawn,		SHCMD("mpc pause; pauseallmpv") },*/
    208 	{ MODKEY,			XK_bracketleft,		spawn,		{.v = (const char*[]){ "mpc", "seek", "-10", NULL } } },
    209 	{ MODKEY|ShiftMask,		XK_bracketleft,		spawn,		{.v = (const char*[]){ "mpc", "seek", "-60", NULL } } },
    210 	{ MODKEY,			XK_bracketright,	spawn,		{.v = (const char*[]){ "mpc", "seek", "+10", NULL } } },
    211 	{ MODKEY|ShiftMask,		XK_bracketright,	spawn,		{.v = (const char*[]){ "mpc", "seek", "+60", NULL } } },
    212 	{ MODKEY,			XK_backslash,		view,		{0} },
    213     { MODKEY|ShiftMask,		XK_backslash,		spawn,		{.v = (const char*[]){ "passotpmenu", NULL } } },
    214 
    215 	{ MODKEY,			XK_a,		togglegaps,	{0} },
    216 	{ MODKEY|ShiftMask,		XK_a,		defaultgaps,	{0} },
    217 	{ MODKEY,			XK_s,		togglesticky,	{0} },
    218 	{ MODKEY|ShiftMask,		XK_s,		spawn,		SHCMD("soxy-ref > /dev/null") },
    219 	// { MODKEY,			XK_d,		spawn,          {.v = (const char*[]){ "dmenu_run", NULL } } },
    220 	{ MODKEY,			XK_d,		spawn,          SHCMD("dmenu_run -i") },
    221 	/*{ MODKEY|ShiftMask,		XK_d,		spawn,		{.v = (const char*[]){ "passmenu", NULL } } },*/
    222 	{ MODKEY,			XK_f,		togglefullscr,	{0} },
    223 	{ MODKEY|ShiftMask,		XK_f,		setlayout,	{.v = &layouts[8]} },
    224 	{ MODKEY,			XK_g,		shiftview,	{ .i = -1 } },
    225 	{ MODKEY|ShiftMask,		XK_g,		shifttag,	{ .i = -1 } },
    226 	{ MODKEY,			XK_h,		setmfact,	{.f = -0.01} },
    227 	/* J and K are automatically bound above in STACKEYS */
    228 	{ MODKEY,			XK_l,		setmfact,      	{.f = +0.01} },
    229 	{ MODKEY,			XK_semicolon,	shiftview,	{ .i = 1 } },
    230 	{ MODKEY|ShiftMask,		XK_semicolon,	shifttag,	{ .i = 1 } },
    231 	{ MODKEY,			XK_apostrophe,	togglescratch,	{.ui = 1} },
    232 	/* { MODKEY|ShiftMask,		XK_apostrophe,	spawn,		SHCMD("") }, */
    233 	{ MODKEY|ShiftMask,		XK_apostrophe,	togglesmartgaps,	{0} },
    234 	{ MODKEY,			XK_Return,	spawn,		{.v = termcmd } },
    235 	{ MODKEY|ShiftMask,		XK_Return,	togglescratch,	{.ui = 0} },
    236 
    237 	{ MODKEY,			XK_z,		incrgaps,	{.i = +3 } },
    238 	/* { MODKEY|ShiftMask,		XK_z,		spawn,		SHCMD("") }, */
    239 	{ MODKEY,			XK_x,		incrgaps,	{.i = -3 } },
    240 	/* { MODKEY|ShiftMask,		XK_x,		spawn,		SHCMD("") }, */
    241 	// { MODKEY,			XK_c,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "profanity", NULL } } },
    242 	/* { MODKEY|ShiftMask,		XK_c,		spawn,		SHCMD("") }, */
    243 	/* V is automatically bound above in STACKKEYS */
    244 	{ MODKEY,			XK_b,		togglebar,	{0} },
    245 	/* { MODKEY|ShiftMask,		XK_b,		spawn,		SHCMD("") }, */
    246 /* 	{ MODKEY,			XK_n,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "nvim", "-c", "VimwikiIndex", NULL } } }, */
    247 	{ MODKEY,			XK_n,		togglescratch,  {.ui = 2} },
    248 
    249 	{ MODKEY|ShiftMask,		XK_n,		spawn,		SHCMD(TERMINAL " -e newsraft ; pkill -RTMIN+6 dwmblocks") },
    250 	{ MODKEY,			XK_m,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "ncmpcpp", NULL } } },
    251 	// { MODKEY|ShiftMask,		XK_m,		spawn,		SHCMD("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle; kill -44 $(pidof dwmblocks)") },
    252 	{ MODKEY|ShiftMask,		XK_m,		spawn,		SHCMD("pamixer -t; kill -44 $(pidof dwmblocks)") },
    253 	{ MODKEY,			XK_comma,	spawn,		{.v = (const char*[]){ "mpc", "prev", NULL } } },
    254 	{ MODKEY|ShiftMask,		XK_comma,	spawn,		{.v = (const char*[]){ "mpc", "seek", "0%", NULL } } },
    255 	{ MODKEY,			XK_period,	spawn,		{.v = (const char*[]){ "mpc", "next", NULL } } },
    256 	{ MODKEY|ShiftMask,		XK_period,	spawn,		{.v = (const char*[]){ "mpc", "repeat", NULL } } },
    257 
    258 	{ MODKEY,			XK_Left,	focusmon,	{.i = -1 } },
    259 	{ MODKEY|ShiftMask,		XK_Left,	tagmon,		{.i = -1 } },
    260 	{ MODKEY,			XK_Right,	focusmon,	{.i = +1 } },
    261 	{ MODKEY|ShiftMask,		XK_Right,	tagmon,		{.i = +1 } },
    262 
    263 	{ MODKEY,			XK_Page_Up,	shiftview,	{ .i = -1 } },
    264 	{ MODKEY|ShiftMask,		XK_Page_Up,	shifttag,	{ .i = -1 } },
    265 	{ MODKEY,			XK_Page_Down,	shiftview,	{ .i = +1 } },
    266 	{ MODKEY|ShiftMask,		XK_Page_Down,	shifttag,	{ .i = +1 } },
    267 	{ MODKEY,			XK_Insert,	spawn,		SHCMD("xdotool type $(grep -v '^#' ~/.local/share/larbs/snippets | dmenu -i -l 50 | cut -d' ' -f1)") },
    268 
    269 	{ MODKEY,			XK_F1,		spawn,		SHCMD("groff -mom /usr/local/share/dwm/larbs.mom -Tpdf | zathura -") },
    270 	{ MODKEY,			XK_F2,		spawn,		{.v = (const char*[]){ "tutorialvids", NULL } } },
    271 	{ MODKEY,			XK_F3,		spawn,		{.v = (const char*[]){ "displayselect", NULL } } },
    272 	{ MODKEY,			XK_F4,		spawn,		SHCMD(TERMINAL " -e pulsemixer; kill -44 $(pidof dwmblocks)") },
    273 	{ MODKEY,			XK_F5,		xrdb,		{.v = NULL } },
    274 	{ MODKEY,			XK_F6,		spawn,		{.v = (const char*[]){ "torwrap", NULL } } },
    275 	{ MODKEY,			XK_F7,		spawn,		{.v = (const char*[]){ "td-toggle", NULL } } },
    276 	{ MODKEY,			XK_F8,		spawn,		{.v = (const char*[]){ "mailsync", NULL } } },
    277 	{ MODKEY,			XK_F9,		spawn,		{.v = (const char*[]){ "mounter", NULL } } },
    278 	{ MODKEY,			XK_F10,		spawn,		{.v = (const char*[]){ "unmounter", NULL } } },
    279 	{ MODKEY,			XK_F11,		spawn,		SHCMD("mpv --untimed --no-cache --no-osc --no-input-default-bindings --profile=low-latency --input-conf=/dev/null --title=webcam $(ls /dev/video[0,2,4,6,8] | tail -n 1)") },
    280 	{ MODKEY,			XK_F12,		spawn,		SHCMD("remaps") },
    281 	{ MODKEY,			XK_space,	zoom,		{0} },
    282 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	{0} },
    283 
    284 	{ 0,				XK_Print,	spawn,		SHCMD("maim pic-full-$(date '+%y%m%d-%H%M-%S').png") },
    285 	{ ShiftMask,			XK_Print,	spawn,		{.v = (const char*[]){ "maimpick", NULL } } },
    286 	{ MODKEY,			XK_Print,	spawn,		{.v = (const char*[]){ "dmenurecord", NULL } } },
    287 	{ MODKEY|ShiftMask,		XK_Print,	spawn,		{.v = (const char*[]){ "dmenurecord", "kill", NULL } } },
    288 	{ MODKEY,			XK_Delete,	spawn,		{.v = (const char*[]){ "dmenurecord", "kill", NULL } } },
    289 	{ MODKEY,			XK_Scroll_Lock,	spawn,		SHCMD("killall screenkey || screenkey &") },
    290 
    291 	{ 0, XF86XK_AudioMute,		spawn,		SHCMD("pamixer --toggle-mute  toggle; kill -44 $(pidof dwmblocks)") },
    292 	{ 0, XF86XK_AudioRaiseVolume,	spawn,		SHCMD("pamixer --allow-boost -i 3; kill -44 $(pidof dwmblocks)") },
    293 	{ 0, XF86XK_AudioLowerVolume,	spawn,		SHCMD("pamixer --allow-boost -d 3; kill -44 $(pidof dwmblocks)") },
    294 	{ 0, XF86XK_AudioPrev,		spawn,		{.v = (const char*[]){ "mpc", "prev", NULL } } },
    295 	{ 0, XF86XK_AudioNext,		spawn,		{.v = (const char*[]){ "mpc",  "next", NULL } } },
    296 	{ 0, XF86XK_AudioPause,		spawn,		{.v = (const char*[]){ "mpc", "pause", NULL } } },
    297 	{ 0, XF86XK_AudioPlay,		spawn,		{.v = (const char*[]){ "mpc", "play", NULL } } },
    298 	{ 0, XF86XK_AudioStop,		spawn,		{.v = (const char*[]){ "mpc", "stop", NULL } } },
    299 	{ 0, XF86XK_AudioRewind,	spawn,		{.v = (const char*[]){ "mpc", "seek", "-10", NULL } } },
    300 	{ 0, XF86XK_AudioForward,	spawn,		{.v = (const char*[]){ "mpc", "seek", "+10", NULL } } },
    301 	{ 0, XF86XK_AudioMedia,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "ncmpcpp", NULL } } },
    302 	{ 0, XF86XK_AudioMicMute,	spawn,		SHCMD("pactl set-source-mute @DEFAULT_SOURCE@ toggle") },
    303 	/* { 0, XF86XK_PowerOff,		spawn,		{.v = (const char*[]){ "sysact", NULL } } }, */
    304 	{ 0, XF86XK_Calculator,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "bc", "-l", NULL } } },
    305 	{ 0, XF86XK_Sleep,		spawn,		{.v = (const char*[]){ "sudo", "-A", "zzz", NULL } } },
    306 	{ 0, XF86XK_WWW,		spawn,		{.v = (const char*[]){ BROWSER, NULL } } },
    307 	{ 0, XF86XK_DOS,		spawn,		{.v = termcmd } },
    308 	{ 0, XF86XK_ScreenSaver,	spawn,		SHCMD("slock & xset dpms force off; mpc pause; pauseallmpv") },
    309 	{ 0, XF86XK_TaskPane,		spawn,		{.v = (const char*[]){ TERMINAL, "-e", "htop", NULL } } },
    310 	{ 0, XF86XK_Mail,		spawn,		SHCMD(TERMINAL " -e neomutt ; pkill -RTMIN+12 dwmblocks") },
    311 	{ 0, XF86XK_MyComputer,		spawn,		{.v = (const char*[]){ TERMINAL, "-e",  "lfub",  "/", NULL } } },
    312 	/* { 0, XF86XK_Battery,		spawn,		SHCMD("") }, */
    313 	{ 0, XF86XK_Launch1,		spawn,		{.v = (const char*[]){ "xset", "dpms", "force", "off", NULL } } },
    314 	{ 0, XF86XK_TouchpadToggle,	spawn,		SHCMD("(synclient | grep 'TouchpadOff.*1' && synclient TouchpadOff=0) || synclient TouchpadOff=1") },
    315 	{ 0, XF86XK_TouchpadOff,	spawn,		{.v = (const char*[]){ "synclient", "TouchpadOff=1", NULL } } },
    316 	{ 0, XF86XK_TouchpadOn,		spawn,		{.v = (const char*[]){ "synclient", "TouchpadOff=0", NULL } } },
    317 	{ 0, XF86XK_MonBrightnessUp,	spawn,		{.v = (const char*[]){ "light", "-A", "15", NULL } } },
    318 	{ 0, XF86XK_MonBrightnessDown,	spawn,		{.v = (const char*[]){ "light", "-U", "15", NULL } } },
    319 
    320 	/* { MODKEY|Mod4Mask,              XK_h,      incrgaps,       {.i = +1 } }, */
    321 	/* { MODKEY|Mod4Mask,              XK_l,      incrgaps,       {.i = -1 } }, */
    322 	/* { MODKEY|Mod4Mask|ShiftMask,    XK_h,      incrogaps,      {.i = +1 } }, */
    323 	/* { MODKEY|Mod4Mask|ShiftMask,    XK_l,      incrogaps,      {.i = -1 } }, */
    324 	/* { MODKEY|Mod4Mask|ControlMask,  XK_h,      incrigaps,      {.i = +1 } }, */
    325 	/* { MODKEY|Mod4Mask|ControlMask,  XK_l,      incrigaps,      {.i = -1 } }, */
    326 	/* { MODKEY|Mod4Mask|ShiftMask,    XK_0,      defaultgaps,    {0} }, */
    327 	/* { MODKEY,                       XK_y,      incrihgaps,     {.i = +1 } }, */
    328 	/* { MODKEY,                       XK_o,      incrihgaps,     {.i = -1 } }, */
    329 	/* { MODKEY|ControlMask,           XK_y,      incrivgaps,     {.i = +1 } }, */
    330 	/* { MODKEY|ControlMask,           XK_o,      incrivgaps,     {.i = -1 } }, */
    331 	/* { MODKEY|Mod4Mask,              XK_y,      incrohgaps,     {.i = +1 } }, */
    332 	/* { MODKEY|Mod4Mask,              XK_o,      incrohgaps,     {.i = -1 } }, */
    333 	/* { MODKEY|ShiftMask,             XK_y,      incrovgaps,     {.i = +1 } }, */
    334 	/* { MODKEY|ShiftMask,             XK_o,      incrovgaps,     {.i = -1 } }, */
    335 
    336 
    337    	{ MODKEY,		XK_c,		togglescratch,		{.ui = 3} },
    338    	{ MODKEY|ShiftMask,		XK_d,		togglescratch,		{.ui = 4} },
    339 
    340 
    341 };
    342 
    343 /* button definitions */
    344 /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
    345 static const Button buttons[] = {
    346 	/* click                event mask      button          function        argument */
    347 #ifndef __OpenBSD__
    348 	{ ClkWinTitle,          0,              Button2,        zoom,           {0} },
    349 	{ ClkStatusText,        0,              Button1,        sigdwmblocks,   {.i = 1} },
    350 	{ ClkStatusText,        0,              Button2,        sigdwmblocks,   {.i = 2} },
    351 	{ ClkStatusText,        0,              Button3,        sigdwmblocks,   {.i = 3} },
    352 	{ ClkStatusText,        0,              Button4,        sigdwmblocks,   {.i = 4} },
    353 	{ ClkStatusText,        0,              Button5,        sigdwmblocks,   {.i = 5} },
    354 	{ ClkStatusText,        ShiftMask,      Button1,        sigdwmblocks,   {.i = 6} },
    355 #endif
    356 	{ ClkStatusText,        ShiftMask,      Button3,        spawn,          SHCMD(TERMINAL " -e nvim ~/.local/src/dwmblocks/config.h") },
    357 	{ ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
    358 	{ ClkClientWin,         MODKEY,         Button2,        defaultgaps,	{0} },
    359 	{ ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
    360 	{ ClkClientWin,		MODKEY,		Button4,	incrgaps,	{.i = +1} },
    361 	{ ClkClientWin,		MODKEY,		Button5,	incrgaps,	{.i = -1} },
    362 	{ ClkTagBar,            0,              Button1,        view,           {0} },
    363 	{ ClkTagBar,            0,              Button3,        toggleview,     {0} },
    364 	{ ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
    365 	{ ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
    366 	{ ClkTagBar,		0,		Button4,	shiftview,	{.i = -1} },
    367 	{ ClkTagBar,		0,		Button5,	shiftview,	{.i = 1} },
    368 	{ ClkRootWin,		0,		Button2,	togglebar,	{0} },
    369 };
    370