about summary refs log tree commit diff
path: root/modules/nixos/dwm.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/nixos/dwm.nix')
-rw-r--r--modules/nixos/dwm.nix159
1 files changed, 159 insertions, 0 deletions
diff --git a/modules/nixos/dwm.nix b/modules/nixos/dwm.nix
new file mode 100644
index 0000000..618d8ed
--- /dev/null
+++ b/modules/nixos/dwm.nix
@@ -0,0 +1,159 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+with lib; let
+  cfg = config.nixfiles.modules.dwm;
+in {
+  options.nixfiles.modules.dwm.enable = mkEnableOption "dwm";
+
+  config = mkIf cfg.enable {
+    nixfiles.modules.x11.enable = true;
+
+    hm.xsession = {
+      enable = true;
+
+      windowManager.command = let
+        pkg = pkgs.dwm.override {
+          conf = let
+            font = with config.fontScheme.monospaceFont; "${family}:size=${toString size}";
+            colour = config.colourScheme;
+          in ''
+            static const unsigned int borderpx = 1;
+            static const unsigned int snap = 32;
+            static const int showbar = 1;
+            static const int topbar = 1;
+
+            static const char *fonts[] = {
+              "${font}"
+            };
+
+            static const char *colors[][3] = {
+              [SchemeNorm] = {
+                "${colour.white}",
+                "${colour.black}",
+                "${colour.black}",
+              },
+              [SchemeSel] = {
+                "${colour.black}",
+                "${colour.white}",
+                "${colour.white}",
+              },
+            };
+
+            static const char *tags[] = {
+              "1",
+              "2",
+              "3",
+              "4",
+              "5",
+              "6",
+              "7",
+              "8",
+              "9"
+            };
+
+            static const Rule rules[] = {
+              { "Emacs", NULL, NULL, 1 << 0, 0, -1 },
+            };
+
+            static const float mfact = 0.666;
+            static const int nmaster = 1;
+            static const int resizehints = 0;
+            static const int lockfullscreen = 1;
+
+            static const Layout layouts[] = {
+              { "[]=", tile },
+              { "><>", NULL },
+              { "[M]", monocle },
+            };
+
+            #define MODKEY Mod4Mask
+            #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 } },
+
+            static char dmenumon[2] = "0";
+            static const char *dmenucmd[] = {
+              "${pkgs.dmenu}/bin/dmenu_run",
+              "-m", dmenumon,
+              "-fn", "${font}",
+              "-nb", "${colour.black}",
+              "-nf", "${colour.white}",
+              "-sb", "${colour.white}",
+              "-sf", "${colour.black}",
+              NULL,
+            };
+            static const char *termcmd[] = {
+              "${pkgs.alacritty}/bin/alacritty",
+              NULL,
+            };
+
+            static const Key keys[] = {
+              { MODKEY,           XK_x,      spawn,          {.v = dmenucmd } },
+              { MODKEY,           XK_Return, spawn,          {.v = termcmd } },
+              { MODKEY,           XK_b,      togglebar,      {0} },
+              { MODKEY,           XK_j,      focusstack,     {.i = +1 } },
+              { MODKEY,           XK_k,      focusstack,     {.i = -1 } },
+              { MODKEY|ShiftMask, XK_k,      incnmaster,     {.i = +1 } },
+              { MODKEY|ShiftMask, XK_j,      incnmaster,     {.i = -1 } },
+              { MODKEY,           XK_comma,  setmfact,       {.f = -0.05} },
+              { MODKEY,           XK_period, setmfact,       {.f = +0.05} },
+              { MODKEY,           XK_p,      zoom,           {0} },
+              { MODKEY,           XK_Tab,    view,           {0} },
+              { MODKEY,           XK_d,      killclient,     {0} },
+              { MODKEY,           XK_t,      setlayout,      {.v = &layouts[0]} },
+              { MODKEY,           XK_m,      setlayout,      {.v = &layouts[1]} },
+              { MODKEY,           XK_f,      setlayout,      {.v = &layouts[2]} },
+              { MODKEY,           XK_o,      togglefloating, {0} },
+              { MODKEY,           XK_0,      view,           {.ui = ~0 } },
+              { MODKEY|ShiftMask, XK_0,      tag,            {.ui = ~0 } },
+              { MODKEY,           XK_h,      focusmon,       {.i = -1 } },
+              { MODKEY,           XK_l,      focusmon,       {.i = +1 } },
+              { MODKEY|ShiftMask, XK_h,      tagmon,         {.i = -1 } },
+              { MODKEY|ShiftMask, XK_l,      tagmon,         {.i = +1 } },
+              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_q,      quit,           {0} },
+            };
+
+            static const Button buttons[] = {
+              { ClkLtSymbol,   0,      Button1, setlayout,      {0} },
+              { ClkLtSymbol,   0,      Button3, setlayout,      {.v = &layouts[2]} },
+              { ClkWinTitle,   0,      Button2, zoom,           {0} },
+              { ClkStatusText, 0,      Button2, spawn,          {.v = termcmd } },
+              { ClkClientWin,  MODKEY, Button1, movemouse,      {0} },
+              { 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} },
+            };
+          '';
+        };
+      in "${pkg}/bin/dwm";
+    };
+
+    hm.services.dwm-status = {
+      enable = true;
+      # package = pkgs.dwm-status.override {
+      #   enableAlsaUtils = false;
+      # };
+      order = ["audio" "backlight" "battery" "cpu_load" "network" "time"];
+    };
+
+    services.xserver.displayManager.startx.enable = true;
+  };
+}

Consider giving Nix/NixOS a try! <3