summaryrefslogtreecommitdiff
path: root/common/modules/window_managers
diff options
context:
space:
mode:
authorbee <beebeeb5k@gmail.com>2026-05-01 23:45:21 +0530
committerbee <beebeeb5k@gmail.com>2026-05-01 23:45:21 +0530
commitcd08309515bce3796777f4b20efffd379b9fabcc (patch)
tree9bc843dc067983511b31139b5c71afdd12a8e20e /common/modules/window_managers
parent1bb49481dbec223e68df4f60fa1d425525e16cff (diff)
Homecoming
Diffstat (limited to 'common/modules/window_managers')
-rw-r--r--common/modules/window_managers/default.nix72
-rw-r--r--common/modules/window_managers/dwm/default.nix206
-rw-r--r--common/modules/window_managers/dwm/picom.nix63
-rw-r--r--common/modules/window_managers/dwm/scripts.nix78
-rw-r--r--common/modules/window_managers/hyprland/default.nix343
-rw-r--r--common/modules/window_managers/mango/default.nix377
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;
+ }
+ );
+}