/* See LICENSE file for copyright and license details. */

/* appearance */
static const unsigned int borderpx  = 5;        /* border pixel of windows */
static const unsigned int snap      = 32;       /* snap pixel */
static const unsigned int gappih    = 10;       /* 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    = 10;       /* 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 swallowfloating    = 1;        /* 1 means swallow floating windows by default */
static const unsigned int systraypinning = 0;   /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
static const unsigned int systrayonleft  = 0;   	/* 0: systray in the right corner, >0: systray on left of status text */
static const unsigned int systrayspacing = 2;   /* systray spacing */
static const int systraypinningfailfirst = 1;   /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/
static const int showsystray        = 1;         /* 0 means no systray */
static const int showbar            = 1;        /* 0 means no bar */
static const int topbar             = 1;        /* 0 means bottom bar */
static const char *fonts[]          = { "RobotoMono Nerd Font:style=Medium:pixelsize=13" };
static const char col_fg[]          = "#ffffff";
static const char col_bg[]          = "#272822";
static const char col_bd[]          = "#272822";
static const char col_fg_empty[]    = "#404040";
static const char col_fg_layout[]   = "#909090";
static const char col_fg_urgent[]   = "#ffffff";
static const char col_bg_urgent[]   = "#770000";
static const char col_bd_urgent[]   = "#770000";
static const char col_fg_sel[]      = "#ffffff";
static const char col_bg_sel[]      = "#005577";
static const char col_bd_sel[]      = "#ffffff";
static const char *colors[][3] = {
  /*                 fg             bg             border   */
  [SchemeNorm]   = { col_fg,        col_bg,        col_bd },
  [SchemeSel]    = { col_fg_sel,    col_bg_sel,    col_bd_sel },
  [SchemeEmpty]  = { col_fg_empty,  col_bg,        col_bd },
  [SchemeLayout] = { col_fg_layout, col_bg,        col_bd },
  [SchemeUrgent] = { col_fg_urgent, col_bg_urgent, col_bd_urgent },
};

typedef struct {
  const char *name;
  const void *cmd;
} Sp;
const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x34", NULL };
const char *spcmd2[] = {"st", "-n", "spwork", "-g", "120x34", NULL };
static Sp scratchpads[] = {
  /* name    cmd  */
  {"spterm", spcmd1},
  {"spwork", spcmd2},
};

/* tagging */
static const char *tags[] = {"\uf292", "\uf738", "\uf70d", "\uf7aa", "\uf120", "\uf120", "\ufc58", "\uf9b0", "\uf296", "\uf2bb"};

static const Rule rules[] = {
  /* xprop(1):
   *	WM_CLASS(STRING) = instance, class
   *	WM_NAME(STRING) = title
   */
  /* class                          instance      title               tags mask  isfloating  isterminal   noswallow  monitor */
  { NULL,                           NULL,         "st",               0,         0,          1,           0,        -1 },
  { "firefox",                      NULL,         NULL,               2,         0,          0,           1,        -1 },
  { "Ferdi",                        NULL,         NULL,               1 << 2,    0,          0,           0,        -1 },
  { "Slack",                        NULL,         NULL,               1 << 7,    0,          0,           0,        -1 },
  { "workfx",                       NULL,         NULL,               1 << 9,    0,          0,           1,        -1 },
  { NULL,                           NULL,         "Event Tester",     0,         0,          0,           1,        -1 }, /* xev */
  { NULL,                           "mutt",       NULL,               1 << 3,    0,          1,           1,        -1 },
  { NULL,                           "spterm",     NULL,               SPTAG(0),  1,          1,           0,        -1 },
  { NULL,                           "spwork",     NULL,               SPTAG(1),  1,          1,           0,        -1 },
};

/* 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 attachbelow = 1;    /* 1 means attach after the currently active window */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */

#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 */
  { "><>",      NULL },    /* no layout function means floating behavior */
  { "[M]",      monocle },
  { "TTT",      bstack },
  { "===",      bstackhoriz },
  { "[@]",      spiral },
  { "[\\]",     dwindle },
  { "H[]",      deck },
  { "HHH",      grid },
  { "###",      nrowgrid },
  { "---",      horizgrid },
  { ":::",      gaplessgrid },
  { "|M|",      centeredmaster },
  { ">M>",      centeredfloatingmaster },
  { NULL,       NULL },
};

/* key definitions */
#define MODKEY Mod4Mask
#define SHTKEY (Mod4Mask|ShiftMask)
#define CTRKEY (Mod4Mask|ControlMask)
#define ALLKEY (Mod4Mask|ShiftMask|ControlMask)
#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} },

/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }

#include <X11/XF86keysym.h>

static Key keys[] = {
  /* modifier    key          function        argument */
  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)
    TAGKEYS(       XK_0,                        9)
    /* apps n'shit */
    { MODKEY,      XK_Return,   spawn,          SHCMD("BROWSER=firefox st") },
    { SHTKEY,      XK_Return,   spawn,          SHCMD("BROWSER=workfx st -n work") },
    { MODKEY,      XK_space,    spawn,          SHCMD("dmenu_run -c -i -l 20") },
    { MODKEY,      XK_i,        spawn,          SHCMD("scrot -f -s 'scrot_%Y-%m-%d_%H-%M-%S_%s.png'") },
    { SHTKEY,      XK_i,        spawn,          SHCMD("scrot 'scrot_%Y-%m-%d_%H-%M-%S_%s.png'") },
    { MODKEY,      XK_m,        spawn,          SHCMD("pgrep -x neomutt > /dev/null || BROWSER=firefox st -n mutt -e neomutt") },
    //{ MODKEY,      XK_m,        spawn,          SHCMD("mbsync -c /f/.config/mutt/mbsyncrc -a") },
    { MODKEY,      XK_q,        killclient,     {0} },
    { MODKEY,      XK_e,        togglescratch,  {.ui = 0 } },
    { SHTKEY,      XK_e,        togglescratch,  {.ui = 1 } },
    /* service controls */
    { CTRKEY,      XK_a,        spawn,          SHCMD("dmenu-audio") },
    { CTRKEY,      XK_b,        spawn,          SHCMD("dmenu-bluetooth") },
    { CTRKEY,      XK_d,        spawn,          SHCMD("dmenu-display") },
    { CTRKEY,      XK_e,        spawn,          SHCMD("dmenu-emoji") },
    /* window controls */
    { SHTKEY,      XK_m,        zoom,           {0} },
    { SHTKEY,      XK_h,        setmfact,       {.f = -0.05} },
    { SHTKEY,      XK_l,        setmfact,       {.f = +0.05} },
    { SHTKEY,      XK_j,        focusstack,     {.i = -1 } },
    { SHTKEY,      XK_k,        focusstack,     {.i = 11 } },
    { SHTKEY,      XK_f,        togglefloating, {0} },
    { SHTKEY,      XK_equal,    incnmaster,     {.i = +1 } },
    { SHTKEY,      XK_minus,    incnmaster,     {.i = -1 } },
    /* main dwm controls */
    { ALLKEY,      XK_B,        togglebar,      {0} },
    { ALLKEY,      XK_t,        setlayout,      {.v = &layouts[0]} },
    { ALLKEY,      XK_f,        setlayout,      {.v = &layouts[1]} },
    { ALLKEY,      XK_m,        setlayout,      {.v = &layouts[2]} },
    { ALLKEY,      XK_b,        setlayout,      {.v = &layouts[3]} },
    { ALLKEY,      XK_h,        setlayout,      {.v = &layouts[4]} },
    { ALLKEY,      XK_l,        spawn,          SHCMD("slock") },
    { ALLKEY,      XK_r,        quit,           {1} },
    { ALLKEY,      XK_q,        quit,           {0} },
    /* multimedia keys */
    { 0, XF86XK_AudioMute,          spawn,  SHCMD("pactl set-sink-mute @DEFAULT_SINK@ toggle; kill -46 $(pidof dwmblocks)") },
    { 0, XF86XK_AudioMicMute,       spawn,  SHCMD("sb-vol-in micmute") },
    { 0, XF86XK_AudioRaiseVolume,   spawn,  SHCMD("pactl set-sink-volume @DEFAULT_SINK@ +5%; kill -46 $(pidof dwmblocks)") },
    { 0, XF86XK_AudioLowerVolume,   spawn,  SHCMD("pactl set-sink-volume @DEFAULT_SINK@ -5%; kill -46 $(pidof dwmblocks)") },
    { 0, XF86XK_MonBrightnessDown,  spawn,  SHCMD("xbacklight -dec 10") },
    { 0, XF86XK_MonBrightnessUp,    spawn,  SHCMD("xbacklight -inc 10") },
    /* only to avoid warnings */
    { MODKEY|Mod1Mask,              XK_comma,    focusmon,       {.i = -1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_comma,    tagmon,         {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_period,   focusmon,       {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_period,   tagmon,         {.i = +1 } },
    { MODKEY|Mod1Mask,              XK_u,        incrgaps,       {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_u,        incrgaps,       {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_i,        incrigaps,      {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_i,        incrigaps,      {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_o,        incrogaps,      {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_o,        incrogaps,      {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_6,        incrihgaps,     {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_6,        incrihgaps,     {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_7,        incrivgaps,     {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_7,        incrivgaps,     {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_8,        incrohgaps,     {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_8,        incrohgaps,     {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_9,        incrovgaps,     {.i = +1 } },
    { MODKEY|Mod1Mask|ShiftMask,    XK_9,        incrovgaps,     {.i = -1 } },
    { MODKEY|Mod1Mask,              XK_0,        togglegaps,     {0} },
    { MODKEY|Mod1Mask|ShiftMask,    XK_0,        defaultgaps,    {0} },
};

/* button definitions */
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
  /* click                event mask      button          function        argument */
  { ClkTagBar,            0,              Button1,        view,           {0} },
  { ClkTagBar,            0,              Button3,        toggleview,     {0} },
  { ClkLtSymbol,          0,              Button1,        setlayout,      {0} },
  { ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
  { ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
  { ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
};

