100 lines
3 KiB
Nix
100 lines
3 KiB
Nix
# dwm window manager configuration
|
|
#
|
|
# =============================================================================
|
|
# Patch Development Notes
|
|
# =============================================================================
|
|
#
|
|
# Base: dwm 6.6 (matches nixpkgs)
|
|
# Clone: ~/NixOS/dwm
|
|
#
|
|
# Clean & Build Commands:
|
|
# cd ~/NixOS/dwm
|
|
# git reset --hard 6.6
|
|
# rm -f config.h drw.o dwm dwm.o util.o
|
|
# nix-shell -p xorg.libX11 xorg.libXft xorg.libXinerama xorg.libXcursor pkg-config gnumake gcc
|
|
# make clean && make
|
|
#
|
|
# Generate patch after all patches applied:
|
|
# git diff 6.6 > ~/NixOS/Suckless/dwm/dwm-lebowski.patch
|
|
#
|
|
# =============================================================================
|
|
# Patches (apply in order):
|
|
# =============================================================================
|
|
#
|
|
# 1. pertag - Per-tag layouts (applied separately, then tab)
|
|
# 2. tab - Tabbed monocle bar
|
|
# 3. fullgaps - Simple gaps between windows
|
|
# 4. holdbar-modkey - Show bar while holding mod key
|
|
# 5. hide_vacant_tags - Only show occupied tags
|
|
# 6. bardwmlogo - DWM logo in bar
|
|
# 7. cursorwarp - Cursor follows focus
|
|
# 8. alwayscenter - Float windows spawn centered
|
|
# 9. swapmonitors - Swap tagsets between monitors
|
|
# 10. adjacenttag - Navigate tags with arrows (skipvacant)
|
|
# 11. accessnthmonitor - Focus/send to specific monitor by number
|
|
# 12. dwmfifo - Control dwm via named pipe
|
|
# 13. xcursor - Use system Xcursor theme (Stylix)
|
|
# 14. actualfullscreen
|
|
#
|
|
# Custom additions:
|
|
# - def_layouts array for per-tag default layouts
|
|
#
|
|
# =============================================================================
|
|
|
|
{
|
|
config,
|
|
pkgs,
|
|
lib,
|
|
...
|
|
}:
|
|
|
|
let
|
|
appearance = import ./appearance.nix { inherit config lib; };
|
|
tags = import ./tags.nix { inherit lib; };
|
|
rules = import ./rules.nix { inherit lib; };
|
|
layouts = import ./layouts.nix { inherit lib; };
|
|
keybindings = import ./keybindings.nix { inherit lib; };
|
|
api = import ./api.nix { inherit lib; };
|
|
|
|
configDefH = ''
|
|
${appearance.config}
|
|
|
|
${tags.config}
|
|
|
|
${rules.config}
|
|
|
|
${layouts.config}
|
|
|
|
${keybindings.config}
|
|
|
|
${api.config}
|
|
'';
|
|
in
|
|
{
|
|
services.xserver.windowManager.dwm = {
|
|
enable = true;
|
|
package =
|
|
(pkgs.dwm.override {
|
|
conf = configDefH;
|
|
}).overrideAttrs
|
|
(old: {
|
|
patches = [ ./dwm-lebowski.patch ];
|
|
buildInputs = old.buildInputs ++ [ pkgs.xorg.libXcursor ];
|
|
});
|
|
};
|
|
|
|
environment.systemPackages = [
|
|
(pkgs.writeShellScriptBin "vieworspawn" ''
|
|
mon=$1; tag=$2; class=$3; shift 3
|
|
# Focus monitor if multi-monitor setup (0=secondary, 1=primary)
|
|
if [[ $(${pkgs.autorandr}/bin/autorandr --detected) != "mobile" ]]; then
|
|
[[ "$mon" == "0" ]] && echo "mon-sec" > /tmp/dwm.fifo || echo "mon-prim" > /tmp/dwm.fifo
|
|
fi
|
|
echo "view $tag" > /tmp/dwm.fifo
|
|
sleep 0.02
|
|
if ! ${pkgs.xdotool}/bin/xdotool search --class "$class" >/dev/null 2>&1; then
|
|
exec "$@"
|
|
fi
|
|
'')
|
|
];
|
|
}
|