diff options
Diffstat (limited to 'common/modules/window_managers')
| -rw-r--r-- | common/modules/window_managers/default.nix | 72 | ||||
| -rw-r--r-- | common/modules/window_managers/dwm/default.nix | 206 | ||||
| -rw-r--r-- | common/modules/window_managers/dwm/picom.nix | 63 | ||||
| -rw-r--r-- | common/modules/window_managers/dwm/scripts.nix | 78 | ||||
| -rw-r--r-- | common/modules/window_managers/hyprland/default.nix | 343 | ||||
| -rw-r--r-- | common/modules/window_managers/mango/default.nix | 377 |
6 files changed, 1139 insertions, 0 deletions
diff --git a/common/modules/window_managers/default.nix b/common/modules/window_managers/default.nix new file mode 100644 index 0000000..7b51946 --- /dev/null +++ b/common/modules/window_managers/default.nix @@ -0,0 +1,72 @@ +{ + homeManager, + inputs, + moduleNameSpace, + ... +}: +{ + config, + lib, + pkgs, + ... +}: +let + args = { + moduleNameSpace = "beeMods"; + inherit inputs homeManager; + }; +in +{ + imports = [ + (import ./mango args) + (import ./hyprland args) + (import ./dwm args) + ]; + + options.${moduleNameSpace}.windowManagers = { + mango.enable = lib.mkEnableOption "Enable mangowm"; + dwm.enable = lib.mkEnableOption "Enable dwm"; + hyprland.enable = lib.mkEnableOption "Enable hyprland"; + eyeCandy = { + animations.enable = lib.mkEnableOption "Uiiiiiiiiiii"; + window = { + blur = { + enable = lib.mkEnableOption "Enable window blur"; + passes = lib.mkOption { + type = lib.types.int; + default = 1; + }; + radius = lib.mkOption { + type = lib.types.int; + default = 10; + }; + }; + shadows.enable = lib.mkEnableOption "Enable window drop shadows"; + borderRadius = lib.mkOption { + type = lib.types.int; + default = 0; + description = "Border radius"; + }; + opacity = lib.mkOption { + type = lib.types.number; + default = 1.0; + description = "Window opacity"; + }; + }; + }; + }; + config = ( + if homeManager then + { + home.packages = with pkgs; [ + wl-clipboard + cliphist + brightnessctl + ]; + } + else + { + } + ); + +} diff --git a/common/modules/window_managers/dwm/default.nix b/common/modules/window_managers/dwm/default.nix new file mode 100644 index 0000000..f665d06 --- /dev/null +++ b/common/modules/window_managers/dwm/default.nix @@ -0,0 +1,206 @@ +{ + homeManager, + inputs, + moduleNameSpace, + ... +}: +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.${moduleNameSpace}.windowManagers; + 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) + ]; + + config = lib.mkIf cfg.dwm.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 + 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" = 2; + }; + } + ); +} diff --git a/common/modules/window_managers/dwm/picom.nix b/common/modules/window_managers/dwm/picom.nix new file mode 100644 index 0000000..f0b8d17 --- /dev/null +++ b/common/modules/window_managers/dwm/picom.nix @@ -0,0 +1,63 @@ +homeManager: +{ config, lib, ... }: +let + cfg = config.beeMods.windowManagers; +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/window_managers/dwm/scripts.nix b/common/modules/window_managers/dwm/scripts.nix new file mode 100644 index 0000000..5b52686 --- /dev/null +++ b/common/modules/window_managers/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 + ]; + } + ); +} diff --git a/common/modules/window_managers/hyprland/default.nix b/common/modules/window_managers/hyprland/default.nix new file mode 100644 index 0000000..c338f44 --- /dev/null +++ b/common/modules/window_managers/hyprland/default.nix @@ -0,0 +1,343 @@ +{ + homeManager, + inputs, + moduleNameSpace, + ... +}: +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.${moduleNameSpace}.windowManagers; + + snip = pkgs.writeShellScript "snip" '' + case $1 in + full) + ${pkgs.grim}/bin/grim - | wl-copy + ;; + selection) + GEOM=$(${pkgs.slurp}/bin/slurp) || exit + ${pkgs.grim}/bin/grim -g "$GEOM" - | wl-copy + ;; + window) + GEOM=$(hyprctl activewindow -j | ${pkgs.jq}/bin/jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"') + ${pkgs.grim}/bin/grim -g "$GEOM" - | wl-copy + ;; + esac + ''; + + smart-alacritty = pkgs.writeShellScript "smart-alacritty" '' + alacritty msg create-window || exec alacritty + ''; + + smart-ghostty = pkgs.writeShellScript "smart-ghostty" '' + ghostty +new-window || exec ghostty + ''; + + terminal = + if config.beeMods.terminal.default == "alacritty" then + smart-alacritty + else if config.beeMods.terminal.default == "ghostty" then + smart-ghostty + else + config.beeMods.terminal.default; +in +{ + config = lib.mkIf cfg.hyprland.enable ( + if homeManager then + { + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = true; + systemd.variables = [ "--all" ]; + xwayland.enable = true; + systemd.enableXdgAutostart = false; + + settings = { + monitor = [ ",1920x1080@120,auto,1.0" ]; + + source = [ ] ++ lib.optional (config.beeMods.matugen.enable) "~/.config/hypr/dms/colors.conf"; + + "$mainMod" = "SUPER"; + + # env = [ + # "NIXOS_OZONE_WL,1" + # "QT_AUTO_SCREEN_SCALE_FACTOR,1" + # "ELECTRON_OZONE_PLATFORM_HINT,auto" + # "QT_QPA_PLATFORM,wayland;xcb" + # "XDG_SESSION_TYPE,wayland" + # "GDK_BACKEND,wayland,x11" + # "GDK_SCALE,1" + # ]; + + exec-once = [ + "dbus-update-activation-environment --all" + "sleep 1 && dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + "gnome-keyring-daemon --start --components=secrets,ssh,pkcs11" + ] + ++ lib.optionals config.beeMods.windowManagers.dwm.enable [ + "systemctl --user stop xidlehook.service" + "systemctl --user stop xautolock-session.service" + "systemctl --user stop xss-lock.service" + "systemctl --user stop clipcat.service" + ]; + + xwayland = { + force_zero_scaling = true; + }; + + input = { + follow_mouse = 1; + kb_layout = "us"; + repeat_delay = 300; + repeat_rate = 50; + sensitivity = 0; + numlock_by_default = false; + left_handed = false; + + touchpad = { + natural_scroll = true; + tap-to-click = true; + drag_lock = true; + disable_while_typing = true; + middle_button_emulation = false; + }; + }; + + general = { + layout = "master"; + gaps_in = 4; + gaps_out = 4; + border_size = 2; + + resize_on_border = true; + no_focus_fallback = true; + allow_tearing = false; + + # "col.active_border" = "$_tertiary_fixed_dim"; + # "col.inactive_border" = "$_outline"; + }; + + master = { + allow_small_split = true; + new_on_top = false; + mfact = 0.56; + }; + + scrolling = { + column_width = 0.55; + follow_focus = true; + }; + + decoration = { + rounding = cfg.eyeCandy.window.borderRadius; + + blur = { + enabled = cfg.eyeCandy.window.blur.enable; + size = cfg.eyeCandy.window.blur.radius; + passes = cfg.eyeCandy.window.blur.passes; + brightness = 0.9; + contrast = 0.9; + noise = 0.02; + vibrancy = 1.2; + popups = true; + popups_ignorealpha = 0.6; + }; + + shadow = { + enabled = cfg.eyeCandy.window.shadows.enable; + ignore_window = true; + range = 10; + render_power = 3; + offset = "0 0"; + color = "rgba(00000044)"; + }; + + # Apply opacity logic utilizing cfg.eyeCandy.options + active_opacity = + if (cfg.eyeCandy.window.blur.enable && cfg.eyeCandy.window.opacity == 1.0) then + 0.82 + else + cfg.eyeCandy.window.opacity; + inactive_opacity = + if (cfg.eyeCandy.window.blur.enable && cfg.eyeCandy.window.opacity == 1.0) then + 0.82 + else + cfg.eyeCandy.window.opacity; + fullscreen_opacity = 1.0; + + dim_inactive = false; + }; + + animations = { + enabled = cfg.eyeCandy.animations.enable; + + bezier = [ + "openCurve, 0.05, 0.7, 0.1, 1.0" + "closeCurve, 0.0, 0.0, 1.0, 1.0" + "moveCurve, 0.46, 1.0, 0.29, 1.0" + ]; + + animation = [ + "windowsIn, 1, 2.8, openCurve, slide" + "windowsOut, 1, 6.5, closeCurve, popin 80%" + "windowsMove, 1, 2.2, moveCurve" + "fadeIn, 0, 3.0, fadeCurve" + "fadeOut, 1, 2.5, moveCurve" + "workspaces, 1, 2.5, moveCurve, slide" + ]; + }; + + misc = { + vfr = true; + vrr = 0; + mouse_move_enables_dpms = true; + key_press_enables_dpms = true; + disable_splash_rendering = true; + animate_manual_resizes = true; + animate_mouse_windowdragging = false; + enable_swallow = false; + swallow_regex = "(foot|kitty|alacritty|Alacritty|com.mitchellh.ghostty|)"; + disable_hyprland_logo = true; + force_default_wallpaper = 0; + focus_on_activate = true; + }; + + binds = { + scroll_event_delay = 0; + focus_preferred_method = 1; + }; + + windowrule = [ + "workspace 1, match:class ^(foot|footclient|alacritty|com.mitchellh.ghostty)$" + "workspace 2, match:class ^(zen|firefox|obsidian)$" + "workspace 3, match:class ^(vesktop|discord|thunderbird|Element|equibop)$" + "workspace 4, match:class ^(steam)$" + "float on, match:class ^(org.gnome.Calculator|org.pulseaudio.pavucontrol)$" + "stay_focused on, match:class ^(pinentry-)(.*)$" + ]; + + layerrule = [ + "no_anim on, match:namespace ^rofi$" + "no_anim on, match:namespace ^(dms)$" + "no_anim on, match:namespace .*dms.*" + ]; + + workspace = [ "2, layout:scrolling" ]; + + bind = [ + "$mainMod, r, exec, hyprctl reload" + "$mainMod, Return, exec, ${terminal}" + "$mainMod, a, exec,dms ipc call spotlight toggle" + "$mainMod, v,exec,dms ipc call clipboard toggle" + "ALT, F4, exec, dms ipc call powermenu toggle" + "$mainMod, y, exec, dms ipc call dankdash wallpaper" + + "$mainMod, comma, exec,dms ipc call settings focusOrToggle" + + "$mainMod, F12, exec, gnome-calculator" + "$mainMod, b, exec, zen" + "$mainMod, e, exec, nautilus" + + "$mainMod, m, exit," + "$mainMod, q, killactive," + + "$mainMod, h, movefocus, l" + "$mainMod, l, movefocus, r" + "$mainMod, k, movefocus, u" + "$mainMod, j, movefocus, d" + + ", Print, exec, ${snip} full" + "$mainMod, Print, exec, ${snip} selection" + "$mainMod SHIFT, Print, exec, ${snip} window" + + "$mainMod SHIFT, k, swapwindow, u" + "$mainMod SHIFT, j, swapwindow, d" + "$mainMod SHIFT, h, swapwindow, l" + "$mainMod SHIFT, l, swapwindow, r" + + "$mainMod, g, pin," + "ALT, Tab, workspace, previous" + "$mainMod, space, togglefloating," + "ALT, a, fullscreen, 1" + "ALT, f, fullscreen, 0" + "$mainMod, i, togglespecialworkspace, minimized" + "$mainMod, i, movetoworkspacesilent, special:minimized" + "$mainMod SHIFT, i, togglespecialworkspace, minimized" + "$mainMod SHIFT, i, movetoworkspace, +0" + "ALT, z, togglespecialworkspace, scratchpad" + + "$mainMod, n, exec, beesettings layout" + + "$mainMod, 1, workspace, 1" + "$mainMod, 2, workspace, 2" + "$mainMod, 3, workspace, 3" + "$mainMod, 4, workspace, 4" + "$mainMod, 5, workspace, 5" + "$mainMod, 6, workspace, 6" + "$mainMod, 7, workspace, 7" + "$mainMod, 8, workspace, 8" + "$mainMod, 9, workspace, 9" + + "$mainMod SHIFT, 1, movetoworkspace, 1" + "$mainMod SHIFT, 2, movetoworkspace, 2" + "$mainMod SHIFT, 3, movetoworkspace, 3" + "$mainMod SHIFT, 4, movetoworkspace, 4" + "$mainMod SHIFT, 5, movetoworkspace, 5" + "$mainMod SHIFT, 6, movetoworkspace, 6" + "$mainMod SHIFT, 7, movetoworkspace, 7" + "$mainMod SHIFT, 8, movetoworkspace, 8" + "$mainMod SHIFT, 9, movetoworkspace, 9" + + "ALT SHIFT, Left, focusmonitor, l" + "ALT SHIFT, Right, focusmonitor, r" + "$mainMod ALT, Left, movecurrentworkspacetomonitor, l" + "$mainMod ALT, Right, movecurrentworkspacetomonitor, r" + ]; + + binde = [ + "$mainMod, Up, moveactive, 0 -50" + "$mainMod, Down, moveactive, 0 50" + "$mainMod, Left, moveactive, -50 0" + "$mainMod, Right, moveactive, 50 0" + + "ALT, k, resizeactive, 0 -50" + "ALT, j, resizeactive, 0 50" + "ALT, h, resizeactive, -50 0" + "ALT, l, resizeactive, 50 0" + ]; + + bindel = [ + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioMute, exec,wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", XF86AudioMicMute, exec,wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + + ", XF86AudioPlay, exec, playerctl play-pause" + ", XF86AudioNext, exec, playerctl next" + ", XF86AudioPrev, exec, playerctl previous" + ", XF86AudioStop, exec, playerctl stop" + + ", XF86MonBrightnessUp, exec,brightnessctl set +5%" + ", XF86MonBrightnessDown, exec, brightnessctl set 5%-" + ]; + + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" + ]; + }; + }; + } + else + { + programs.hyprland = { + enable = true; + withUWSM = false; + }; + } + ); +} diff --git a/common/modules/window_managers/mango/default.nix b/common/modules/window_managers/mango/default.nix new file mode 100644 index 0000000..9d24035 --- /dev/null +++ b/common/modules/window_managers/mango/default.nix @@ -0,0 +1,377 @@ +{ + homeManager, + inputs, + moduleNameSpace, + ... +}: +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.${moduleNameSpace}.windowManagers; + snip = pkgs.writeShellScript "snip" '' + case $1 in + full) + ${pkgs.grim}/bin/grim - | wl-copy + ;; + selection) + GEOM=$(${pkgs.slurp}/bin/slurp) || exit + ${pkgs.grim}/bin/grim -g "$GEOM" - | wl-copy + ;; + window) + ${pkgs.grim}/bin/grim -g "$(mmsg -x | awk ' + / x / {x=$3} + / y / {y=$3} + / width / {w=$3} + / height / {h=$3} + END {print x "," y " " w "x" h} + ')" - | wl-copy + ;; + esac + ''; + smart-alacritty = pkgs.writeShellScript "smart-alacritty" '' + alacritty msg create-window || exec alacritty + ''; + smart-ghostty = pkgs.writeShellScript "smart-ghostty" '' + ghostty +new-window || exec ghostty + ''; + terminal = + if config.beeMods.terminal.default == "alacritty" then + smart-alacritty + else if config.beeMods.terminal.default == "ghostty" then + smart-ghostty + else + config.beeMods.terminal.default; +in +{ + imports = + if homeManager then [ inputs.mango.hmModules.mango ] else [ inputs.mango.nixosModules.mango ]; + + config = lib.mkIf cfg.mango.enable ( + if homeManager then + { + wayland.windowManager.mango = { + enable = true; + systemd.enable = true; + systemd.variables = [ "--all" ]; + extraConfig = '' + ${lib.optionalString (config.beeMods.matugen.enable) '' + source=~/.config/mango/mango-colors.conf + ''} + + # Window effect + blur=${if cfg.eyeCandy.window.blur.enable then "1" else "0"} + blur_layer=0 + blur_optimized=1 + blur_params_num_passes = ${toString cfg.eyeCandy.window.blur.passes} + blur_params_radius = ${toString cfg.eyeCandy.window.blur.radius} + blur_params_noise = 0.02 + blur_params_brightness = 0.9 + blur_params_contrast = 0.9 + blur_params_saturation = 1.2 + + shadows=${if cfg.eyeCandy.window.shadows.enable then "1" else "0"} + layer_shadows = 0 + shadow_only_floating = 1 + shadows_size = 10 + shadows_blur = 15 + shadows_position_x = 0 + shadows_position_y = 0 + + border_radius=${toString cfg.eyeCandy.window.borderRadius} + no_radius_when_single=0 + + ${ + if (cfg.eyeCandy.window.blur.enable && cfg.eyeCandy.window.opacity == 1.0) then + '' + focused_opacity=0.82 + unfocused_opacity=0.82 + '' + else + '' + focused_opacity=${toString cfg.eyeCandy.window.opacity} + unfocused_opacity=${toString cfg.eyeCandy.window.opacity} + '' + } + + # Animation Configuration(support type:zoom,slide) + # tag_animation_direction: 1-horizontal,0-vertical + animations=${if cfg.eyeCandy.animations.enable then "1" else "0"} + layer_animations=0 + animation_type_open=slide + animation_type_close=zoom + animation_fade_in=0 + animation_fade_out=1 + tag_animation_direction=1 + zoom_initial_ratio=0.8 + zoom_end_ratio=0.8 + fadein_begin_opacity=0.5 + fadeout_begin_opacity=0.5 + animation_duration_move=250 + animation_duration_open=250 + animation_duration_tag=250 + animation_duration_close=100 + animation_duration_focus=0 + animation_curve_open=0.05,0.7,0.1,1.0 + animation_curve_move=0.46,1.0,0.29,1 + animation_curve_tag=0.46,1.0,0.29,1 + animation_curve_close=0.0,0.0,1.0,1.0 + animation_curve_focus=0.05,0.7,0.1,1.0 + animation_curve_opafadeout=0.5,0.5,0.5,0.5 + animation_curve_opafadein=0.46,1.0,0.29,1 + + # Scroller configuration + scroller_structs=15 + scroller_default_proportion=0.6 + scroller_focus_center=0 + scroller_prefer_center=0 + edge_scroller_pointer_focus=1 + scroller_default_proportion_single=1.0 + scroller_ignore_proportion_single=0 + scroller_proportion_preset=0.5,0.8,1.0 + + # Master-Stack Layout Setting + new_is_master=0 + default_mfact=0.56 + default_nmaster=1 + smartgaps=0 + + # Overview Setting + hotarea_size=10 + enable_hotarea=0 + ov_tab_mode=0 + overviewgappi=5 + overviewgappo=30 + + # Misc + no_border_when_single=0 + axis_bind_apply_timeout=100 + focus_on_activate=1 + idleinhibit_ignore_visible=0 + sloppyfocus=1 + warpcursor=1 + focus_cross_monitor=0 + focus_cross_tag=0 + enable_floating_snap=0 + snap_distance=30 + # cursor_size=24 + drag_tile_to_tile=1 + xwayland_persistence=0 + syncobj_enable=0 + allow_tearing=0 + + # keyboard + repeat_delay=300; + repeat_rate=50; + numlockon=0 + xkb_rules_layout=us + + # Trackpad + # need relogin to make it apply + disable_trackpad=0 + tap_to_click=1 + tap_and_drag=1 + drag_lock=1 + trackpad_natural_scrolling=1 + disable_while_typing=1 + left_handed=0 + middle_button_emulation=0 + swipe_min_threshold=1 + + # mouse + # need relogin to make it apply + mouse_natural_scrolling=0 + + windowrule=tags:1,appid:^(foot|footclient|alacritty|dev.zed.Zed)$ + windowrule=tags:2,appid:^(zen|firefox|obsidian)$ + windowrule=tags:3,appid:^(vesktop|discord|thunderbird|Element|equibop)$ + windowrule=tags:4,appid:^steam$ + + windowrule=scroller_proportion:0.3,appid:^steam$,title:^Friends List$ + windowrule=scroller_proportion:0.5,appid:^steam$,title:.*(Settings|Properties).* + windowrule=isfloating:1,appid:^steam$,title:^Steam - News$ + windowrule=isfloating:1,appid:^(org.gnome.Calculator|org.pulseaudio.pavucontrol)$ + windowrule=isoverlay:1,appid:^com.gabm.satty$ + + # Appearance + gappih=5 + gappiv=5 + gappoh=5 + gappov=5 + scratchpad_width_ratio=0.8 + scratchpad_height_ratio=0.9 + borderpx=2 + + # layout support: + # tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller + tagrule=id:1,layout_name:tgmix + tagrule=id:2,layout_name:scroller + tagrule=id:3,layout_name:scroller + tagrule=id:4,layout_name:scroller + tagrule=id:5,layout_name:grid + tagrule=id:6,layout_name:tile + tagrule=id:7,layout_name:tile + tagrule=id:8,layout_name:tile + tagrule=id:9,layout_name:tile + + # Key Bindings + # key name refer to `xev` or `wev` command output, + # mod keys name: super,ctrl,alt,shift,none + + # reload config + bind=SUPER,r,reload_config + + bind=SUPER,Return,spawn,${terminal} + + bind=SUPER,v,spawn,dms ipc call clipboard toggle + bind=SUPER,a,spawn,dms ipc call spotlight toggle + bind=ALT,F4,spawn,dms ipc call powermenu toggle + bind=SUPER,y,spawn,dms ipc call dankdash wallpaper + bind=SUPER,comma,spawn,dms ipc call settings focusOrToggle + + bind=SUPER,F12,spawn,gnome-calculator + bind=SUPER,b,spawn,zen + bind=SUPER,e,spawn,nautilus + + # exit + bind=SUPER,m,quit + bind=SUPER,q,killclient, + + # switch window focus + bind=SUPER,h,focusdir,left + bind=SUPER,l,focusdir,right + bind=SUPER,k,focusdir,up + bind=SUPER,j,focusdir,down + + bind=NONE,Print,spawn,${snip} full + bind=SUPER,Print,spawn,${snip} selection + bind=SUPER+SHIFT,Print,spawn,${snip} window + + # swap window + bind=SUPER+SHIFT,k,exchange_client,up + bind=SUPER+SHIFT,j,exchange_client,down + bind=SUPER+SHIFT,h,exchange_client,left + bind=SUPER+SHIFT,l,exchange_client,right + + # switch window status + bind=SUPER,g,toggleglobal, + bind=ALT,Tab,toggleoverview, + bind=SUPER,space,togglefloating, + bind=ALT,a,togglemaximizescreen, + bind=SUPER,f,toggle_all_floating, + bind=ALT,f,togglefullscreen, + bind=ALT+SHIFT,f,togglefakefullscreen, + bind=SUPER,i,minimized, + bind=SUPER,o,toggleoverlay, + bind=SUPER+SHIFT,I,restore_minimized + bind=ALT,z,toggle_scratchpad + + # scroller layout + bind=ALT,e,set_proportion,1.0 + bind=ALT,x,switch_proportion_preset, + + # switch layout + # bind=SUPER,n,switch_layout + bind=SUPER,n,spawn,dms ipc call notifications toggle + + # tag switch + bind=SUPER,1,view,1,0 + bind=SUPER,2,view,2,0 + bind=SUPER,3,view,3,0 + bind=SUPER,4,view,4,0 + bind=SUPER,5,view,5,0 + bind=SUPER,6,view,6,0 + bind=SUPER,7,view,7,0 + bind=SUPER,8,view,8,0 + bind=SUPER,9,view,9,0 + + # tag: move client to the tag and focus it + # tagsilent: move client to the tag and not focus it + # bind=Alt,1,tagsilent,1 + bind=SUPER+SHIFT,1,tag,1,0 + bind=SUPER+SHIFT,2,tag,2,0 + bind=SUPER+SHIFT,3,tag,3,0 + bind=SUPER+SHIFT,4,tag,4,0 + bind=SUPER+SHIFT,5,tag,5,0 + bind=SUPER+SHIFT,6,tag,6,0 + bind=SUPER+SHIFT,7,tag,7,0 + bind=SUPER+SHIFT,8,tag,8,0 + bind=SUPER+SHIFT,9,tag,9,0 + + # monitor switch + bind=alt+shift,Left,focusmon,left + bind=alt+shift,Right,focusmon,right + bind=SUPER+Alt,Left,tagmon,left + bind=SUPER+Alt,Right,tagmon,right + + # gaps + bind=ALT+SHIFT,X,incgaps,1 + bind=ALT+SHIFT,Z,incgaps,-1 + bind=ALT+SHIFT,R,togglegaps + + # movewin + bind=SUPER,Up,movewin,+0,-50 + bind=SUPER,Down,movewin,+0,+50 + bind=SUPER,Left,movewin,-50,+0 + bind=SUPER,Right,movewin,+50,+0 + + # resizewin + bind=ALT,k,resizewin,+0,-50 + bind=ALT,j,resizewin,+0,+50 + bind=ALT,h,resizewin,-50,+0 + bind=ALT,l,resizewin,+50,+0 + + # Volume Control (using wpctl/Pipewire) + bind=NONE,XF86AudioRaiseVolume,spawn,wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ + bind=NONE,XF86AudioLowerVolume,spawn,wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- + bind=NONE,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + + bind=NONE,XF86AudioPlay,spawn,playerctl play-pause + bind=NONE,XF86AudioNext,spawn,playerctl next + bind=NONE,XF86AudioPrev,spawn,playerctl previous + bind=NONE,XF86AudioStop,spawn,playerctl stop + + bind=NONE,XF86AudioMicMute,spawn,wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle + + bind=NONE,XF86MonBrightnessUp,spawn,brightnessctl set +5% + bind=NONE,XF86MonBrightnessDown,spawn,brightnessctl set 5%- + + mousebind=SUPER,btn_left,moveresize,curmove + mousebind=NONE,btn_middle,togglemaximizescreen,0 + mousebind=SUPER,btn_right,moveresize,curresize + + axisbind=SUPER,UP,viewtoleft_have_client + axisbind=SUPER,DOWN,viewtoright_have_client + + layerrule=noanim:1,layer_name:^dms + + env=NIXOS_OZONE_WL,1 + env=QT_AUTO_SCREEN_SCALE_FACTOR,1 + env=ELECTRON_OZONE_PLATFORM_HINT,auto + env=QT_QPA_PLATFORM,wayland + env=XDG_SESSION_TYPE,wayland + env=GDK_BACKEND,wayland,x11 + env=GDK_SCALE,1 + ''; + autostart_sh = '' + wl-paste --type text --watch cliphist store & + gnome-keyring-daemon --start --components=secrets,ssh,pkcs11 & + + ${lib.optionalString (config.beeMods.windowManagers.dwm.enable) '' + systemctl --user stop xidlehook.service + systemctl --user stop xautolock-session.service + systemctl --user stop xss-lock.service + systemctl --user stop clipcat.service + ''} + ''; + }; + } + else + { + programs.mango.enable = true; + } + ); +} |
