diff options
| author | brustybee <beebeeb5k@gmail.com> | 2026-04-13 03:04:59 +0530 |
|---|---|---|
| committer | brustybee <beebeeb5k@gmail.com> | 2026-04-13 03:04:59 +0530 |
| commit | 1bb49481dbec223e68df4f60fa1d425525e16cff (patch) | |
| tree | 66e87c01c39054b7abb51d04bfc50f63b201aaf4 /common/modules/dwm | |
| parent | f5b78ff561eff75c803ed1ef6e736a6c991cd135 (diff) | |
This is like that one dream you don't know how to describe
Diffstat (limited to 'common/modules/dwm')
| -rw-r--r-- | common/modules/dwm/default.nix | 245 | ||||
| -rw-r--r-- | common/modules/dwm/picom.nix | 63 | ||||
| -rw-r--r-- | common/modules/dwm/scripts.nix | 78 |
3 files changed, 386 insertions, 0 deletions
diff --git a/common/modules/dwm/default.nix b/common/modules/dwm/default.nix new file mode 100644 index 0000000..07ddef6 --- /dev/null +++ b/common/modules/dwm/default.nix @@ -0,0 +1,245 @@ +{ + homeManager, + inputs, + moduleNameSpace, + ... +}: +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.${moduleNameSpace}.dwm; + snipx11 = pkgs.writeShellScript "snipx11" '' + case $1 in + full) + ${pkgs.maim}/bin/maim | xclip -selection clipboard -t image/png + ;; + selection) + ${pkgs.maim}/bin/maim -s | xclip -selection clipboard -t image/png + ;; + window) + ${pkgs.maim}/bin/maim -i $(xdotool getactivewindow) | xclip -selection clipboard -t image/png + ;; + esac + ''; + st-patched = + (pkgs.st.override { + extraLibs = [ pkgs.libXcursor ]; + }).overrideAttrs + (oldAttrs: rec { + patches = map pkgs.fetchpatch [ + { + url = "https://st.suckless.org/patches/scrollback/st-scrollback-0.9.2.diff"; + sha256 = "sha256-ZypvRONAHS//wnZjivmqpWIqZlKTqAQ0Q8DhQpZVaqU="; + } + { + url = "https://st.suckless.org/patches/scrollback/st-scrollback-mouse-0.9.2.diff"; + sha256 = "sha256-CuNJ5FdKmAtEjwbgKeBKPJTdEfJvIdmeSAphbz0u3Uk="; + } + { + url = "https://st.suckless.org/patches/scrollback/st-scrollback-mouse-altscreen-20220127-2c5edf2.diff"; + sha256 = "sha256-8oVLgbsYCfMhNEOGadb5DFajdDKPxwgf3P/4vOXfUFo="; + } + { + url = "https://st.suckless.org/patches/xresources/st-xresources-20230320-45a15676.diff"; + sha256 = "sha256-WcL9IeyanXFiOFDGGRU0QNT8DU7wSo2o+3n+TaqASUY="; + } + { + url = "https://st.suckless.org/patches/vertcenter/st-vertcenter-20231003-eb3b894.diff"; + sha256 = "sha256-RbFNdGNi5HLAp1s8QOX3qsfxpkLcp1p/vksyZORN/uc="; + } + { + url = "https://st.suckless.org/patches/anysize/st-anysize-20220718-baa9357.diff"; + hash = "sha256-yx9VSwmPACx3EN3CAdQkxeoJKJxQ6ziC9tpBcoWuWHc="; + } + { + url = "https://st.suckless.org/patches/csi_22_23/st-csi_22_23-0.8.5.diff"; + hash = "sha256-+izEkGVkLCbhZNBD2WN4uX5j+YMmou7JaMVmPG0mrYk="; + } + { + url = "https://st.suckless.org/patches/sync/st-appsync-20200618-b27a383.diff"; + sha256 = "sha256-lys7/nup7a+GcmW+CutX0kjmbbOis2stkuhw02beuPs="; + } + { + url = "https://st.suckless.org/patches/fix_keyboard_input/st-fix-keyboard-input-20180605-dc3b5ba.diff"; + sha256 = "sha256-h5ZrCj4IrkMQanLSMmgXaRd7qZYqvbzqUnuFt/axsMI="; + } + { + url = "https://st.suckless.org/patches/boxdraw/st-boxdraw_v2-0.8.5.diff"; + sha256 = "sha256-WN/R6dPuw1eviHOvVVBw2VBSMDtfi1LCkXyX36EJKi4="; + } + # { + # url = "https://st.suckless.org/patches/themed_cursor/st-themed_cursor-0.8.1.diff"; + # sha256 = "sha256-Q/6VN9oCrdJiZPPjKMpw3UB09tIs4eJ1Hi5c8k7O7uo="; + # } + ]; + + postPatch = oldAttrs.postPatch or "" + '' + sed -i 's/Button4, *kscrollup, *{.i = 1}/Button4, kscrollup, {.i = 10}/g' config.def.h + sed -i 's/Button5, *kscrolldown, *{.i = 1}/Button5, kscrolldown, {.i = 10}/g' config.def.h + + sed -i 's/const int boxdraw = 0;/const int boxdraw = 1;/g' config.def.h + sed -i 's/const int boxdraw_bold = 0;/const int boxdraw_bold = 1;/g' config.def.h + + grep -q Xcursor x.c || sed -i '/#include <X11\/XKBlib.h>/a #include <X11/Xcursor/Xcursor.h>' x.c + + sed -i 's/XCreateFontCursor/XcursorLibraryLoadCursor/g' x.c + + sed -i 's/static unsigned int mouseshape/static char *mouseshape/' config.def.h + sed -i 's/XC_xterm/"ibeam"/' config.def.h + + sed -i 's/-lXft/-lXft -lXcursor/g' config.mk + ''; + }); +in +{ + imports = [ + (import ./picom.nix homeManager) + (import ./scripts.nix homeManager) + ]; + + options.${moduleNameSpace}.dwm = { + enable = lib.mkEnableOption "dwm setup"; + picom = { + enable = lib.mkEnableOption "enable picom compositor"; + animations = lib.mkEnableOption "enable animations"; + shadow = lib.mkEnableOption "enable shadows"; + window = { + opacity = { + active = lib.mkOption { + type = lib.types.float; + default = 1.0; + }; + inactive = lib.mkOption { + type = lib.types.float; + default = 1.0; + }; + }; + blur = { + enable = lib.mkEnableOption "Enable window blur"; + strength = lib.mkOption { + type = lib.types.int; + default = 1; + }; + size = lib.mkOption { + type = lib.types.int; + default = 10; + }; + }; + }; + }; + }; + + config = lib.mkIf cfg.enable ( + if !homeManager then + { + services.xserver = { + enable = true; + windowManager.dwm = { + enable = true; + package = inputs.mydwm.packages.${pkgs.stdenv.hostPlatform.system}.default; + }; + autoRepeatDelay = 300; + autoRepeatInterval = 20; + excludePackages = with pkgs; [ xterm ]; + displayManager.sessionCommands = '' + ${pkgs.systemd}/bin/systemctl --user import-environment DISPLAY XAUTHORITY XDG_SESSION_TYPE + ${pkgs.dbus}/bin/dbus-update-activation-environment --systemd DISPLAY XAUTHORITY XDG_SESSION_TYPE + ''; + }; + + programs.ssh.askPassword = ""; + } + else + { + xdg.dataFile."dwm/autostart.sh" = { + executable = true; + text = '' + #!${pkgs.bash}/bin/bash + + gnome-keyring-daemon --start --components=secrets,ssh,pkcs11 & + ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1 & + + [ -f ~/.Xresources ] && xrdb -merge ~/.Xresources + + dunst & + clipcatd & + slstatus & + sync_dms + ${lib.optionalString (!cfg.picom.enable) '' + xrandr --output eDP --set TearFree on + ''} + ${lib.optionalString (cfg.picom.enable) '' + systemctl --user restart picom.service + ''} + + systemctl --user restart xidlehook.service xautolock-session.service xss-lock.service clipcat.service + ''; + }; + + home.packages = with pkgs; [ + st-patched + xdotool + xclip + (pkgs.dmenu.overrideAttrs (oldAttrs: { + patches = (oldAttrs.patches or [ ]) ++ [ + (pkgs.fetchpatch { + url = "https://tools.suckless.org/dmenu/patches/xresources/dmenu-xresources-4.9.diff"; + sha256 = "sha256-Np9I8hhnwmGA3W5v4tSrBN9Or8Q2Ag9x8H3yf8L9jDI="; + }) + ]; + })) + ]; + + services.clipcat = { + enable = false; + daemonSettings = { + daemonize = false; + max_history = 50; + desktop_notification = { + enable = false; + }; + }; + menuSettings = { + server_endpoint = "/run/user/1000/clipcat/grpc.sock"; + finder = "rofi"; + + rofi = { + menu_length = 10; + line_length = 100; + menu_prompt = "Clipboard"; + extra_arguments = [ ]; + }; + }; + }; + + systemd.user.services.clipcat = { + Unit = { + ConditionEnvironment = [ "XDG_SESSION_TYPE=x11" ]; + }; + }; + + xresources.extraConfig = lib.mkIf config.beeMods.matugen.enable '' + #include "${config.xdg.configHome}/x11/matugen.Xresources" + ''; + + xresources.properties = { + "Xft.dpi" = 96; + "Xft.autohint" = 0; + "Xft.antialias" = true; + "Xft.hinting" = true; + "Xft.lcdfilter" = "lcddefault"; + "Xft.hintstyle" = "hintfull"; + "Xft.rgba" = "rgb"; + "st.font" = + "${config.beeMods.terminal.font.family}:size=${toString config.beeMods.terminal.font.size}:antialias=true:autohint=true"; + "dmenu.font" = + "${config.beeMods.terminal.font.family}:size=${toString config.beeMods.terminal.font.size}"; + "st.borderpx" = 5; + }; + } + ); +} diff --git a/common/modules/dwm/picom.nix b/common/modules/dwm/picom.nix new file mode 100644 index 0000000..93d4b9b --- /dev/null +++ b/common/modules/dwm/picom.nix @@ -0,0 +1,63 @@ +homeManager: +{ config, lib, ... }: +let + cfg = config.beeMods.dwm.picom; +in +{ + config = lib.mkIf cfg.enable ( + lib.optionalAttrs homeManager { + services.picom = { + enable = true; + backend = "glx"; + vSync = true; + + activeOpacity = if cfg.window.blur.enable then 0.82 else cfg.window.opacity.active; + inactiveOpacity = if cfg.window.blur.enable then 0.82 else cfg.window.opacity.inactive; + + opacityRules = [ + "100:fullscreen" + "100:_NET_WM_STATE@:32a *= '_NET_WM_STATE_FULLSCREEN'" + ]; + settings = { + blur = { + method = "dual_kawase"; + strength = cfg.window.blur.strength; + size = cfg.window.blur.size; + }; + blur-background = cfg.window.blur.enable; + blur-background-exclude = [ + "window_type = 'dock'" + "window_type = 'desktop'" + "class_g = 'slop'" + "class_g = 'dwm'" + "_GTK_FRAME_EXTENTS@" + "fullscreen" + "_NET_WM_STATE@:32a *= '_NET_WM_STATE_FULLSCREEN'" + ]; + + # xrender-sync-fence = true; + use-damage = true; + + unredir-if-possible = true; + + detect-transient = true; + detect-client-opacity = true; + mark-wmwin-focused = true; + mark-ovredir-focused = true; + detect-rounded-corners = true; + + shadow = cfg.shadow; + fading = false; + animations = cfg.animations; + }; + }; + + # systemd.user.services.picom.Install.wantedBy = lib.mkForce [ ]; + systemd.user.services.picom = { + Unit = { + ConditionEnvironment = "XDG_SESSION_TYPE=x11"; + }; + }; + } + ); +} diff --git a/common/modules/dwm/scripts.nix b/common/modules/dwm/scripts.nix new file mode 100644 index 0000000..5b52686 --- /dev/null +++ b/common/modules/dwm/scripts.nix @@ -0,0 +1,78 @@ +homeManager: +{ pkgs, lib, ... }: +let + sync_dms = pkgs.writeShellScriptBin "sync_dms" '' + jq=${pkgs.jq}/bin/jq + CONFIG_FILE=$HOME/.local/state/DankMaterialShell/session.json + + get_val() { $jq -r ".$1" "$CONFIG_FILE"; } + set_val() { + local tmp=$(mktemp) + $jq --arg val "$2" ".$1 = \$val" "$CONFIG_FILE" > "$tmp" && mv "$tmp" "$CONFIG_FILE" + } + + + function sync_all { + ISNIGHTMODE=$(get_val "nightModeEnabled") + NIGHTMODETEMP=$(get_val "nightModeTemperature") + WALL=$(get_val "wallpaperPath") + ${pkgs.xwallpaper}/bin/xwallpaper --zoom "$WALL" + + if [[ "$ISNIGHTMODE" == "true" ]]; then + echo "bitch $ISNIGHTMODE" + ${pkgs.redshift}/bin/redshift -o "$NIGHTMODETEMP" + else + ${pkgs.redshift}/bin/redshift -x + fi + } + + function dmenu_settings { + ISNIGHTMODE=$(get_val "nightModeEnabled") + options="NightMode (Currently $ISNIGHTMODE)\nSync Now" + + choice=$(echo -e "$options" | dmenu -p "Settings:") + + case "$choice" in + *"NightMode"*) + if [[ "$ISNIGHTMODE" == "true" ]]; then + set_val "nightModeEnabled" "false" + else + set_val "nightModeEnabled" "true" + fi + sync_all + ;; + "Sync Now") + sync_all + ;; + esac + } + + case "$1" in + settings) dmenu_settings ;; + *) sync_all ;; + esac + ''; + logout_dmenu = pkgs.writeShellScriptBin "logout_dmenu" '' + options="Lock\nLogout\nReboot\nShutdown" + + choice=$(echo -e "$options" | dmenu -p "System:") + + case "$choice" in + Lock) slock ;; + Logout) pkill dwm ;; + Reboot) reboot ;; + Shutdown) poweroff ;; + *) exit 1 ;; + esac + ''; +in +{ + config = lib.mkIf homeManager ( + lib.optionalAttrs homeManager { + home.packages = with pkgs; [ + sync_dms + logout_dmenu + ]; + } + ); +} |
