diff --git a/modules/applications/hyprland.nix b/modules/applications/hyprland.nix index a2c7d86..f604b42 100644 --- a/modules/applications/hyprland.nix +++ b/modules/applications/hyprland.nix @@ -1,4 +1,4 @@ -{self, ...}: { +{...}: { flake.nixosModules.hyprland = { pkgs, pkgs-unstable, @@ -11,9 +11,6 @@ capitaine-cursors-themed # cursor theme papirus-icon-theme papirus-folders - self.packages.${pkgs.system}.custom-wallpaper - self.packages.${pkgs.system}.custom-dontkillsteam # kill app (if not steam or tomato-c - self.packages.${pkgs.system}.custom-killall # kill all windows except focused window xdg-utils ]; # enable hyprland WM @@ -37,491 +34,75 @@ # Enable the X11 windowing system. services.xserver.enable = true; }; - flake.homeModules.hyprland-laptop = _: { - wayland.windowManager.hyprland.settings = { - exec-once = [ - "qtbatticon" # custom battery tray - "source /run/agenix/ntfy && nixpkgs-notifier listen" # tracks PR merge in nixos-unstable - ]; - monitor = [ - "eDP-1, highres@highrr, 0x0, 1" - ]; - }; + flake.homeModules.hyprland-laptop = { + home.file.".config/hypr/host.lua" = { + text = '' + hl.on("hyprland.start", function() + hl.exec_cmd("qtbatticon") + hl.exec_cmd("source /run/agenix/ntfy && nixpkgs-notifier listen") + end) + + hl.monitor({ + output = "eDP-1", + mode = "highres@highrr", + position = "0x0", + scale = 1, + }) + ''; + enable = true; + force = true; }; - flake.homeModules.hyprland-desktop = _: { - wayland.windowManager.hyprland.settings = { - monitor = [ - ", highres@highrr, auto, 0.75" - ]; - exec-once = [ - "if [ -e \"/home/tomasr/icloudSync.sh\" ]; then /home/tomasr/icloudSync.sh; else notify-send \"icloudSync.sh doesn't exist\" \"See ~/nixos/modules/applications/hyprland.nix for more information\"; fi" - # my icloud account uses an email that I don't want to make public. So the script isnt pushed to github. The script looks like: - /* - #!/etc/profiles/per-user/tomasr/bin/zsh - if ! icloudpd --auth-only --username tomas.rivera_2009@icloud.com --dry-run; then - notify-send "icloudpd is not logged in" "Please run icloudpd icloudpd --username my@email.address --password my_password --auth-only" - exit 1 - fi - icloudpd --directory ~/hdd/kdrive/Photo/IPhone/icloudpd-backup --username tomas.rivera_2009@icloud.com --watch-with-interval 3600 --no-progress-bar - */ - ]; - }; +}; +flake.homeModules.hyprland-desktop = { + home.file.".config/hypr/host.lua" = { + text = '' + hl.monitor({ + output = "", + mode = "preferred", + position = "auto", + scale = 0.75, + }) + ''; + enable = true; + force = true; }; - flake.homeModules.hyprland = {pkgs-unstable, ...}: let - wallpaper = ../../assets/wallpaper1.jpg; - in { - #refer to https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/ - wayland.windowManager.hyprland.enable = true; - wayland.windowManager.hyprland.package = pkgs-unstable.hyprland; - #hint Electron apps to use on wayland; - home.sessionVariables.NIXOS_OZONE_WL = "1"; - wayland.windowManager.hyprland.plugins = [ - #pkgs-unstable.hyprlandPlugins.hyprspace # currently broken - #pkgs-unstable.hyprlandPlugins.hypr-dynamic-cursors - ]; - wayland.windowManager.hyprland.configType = "hyprlang"; - wayland.windowManager.hyprland.settings = { - "$mod" = "SUPER"; - "$term" = "kitty"; - "$editor" = "nvim"; - "$notes" = "kitty --class \"custom-obsidianvaults\" --name \"Select Obsidian vault\" --hold custom-obsidianvaults"; - "$file" = "dolphin"; - "$browser" = "kitty --class \"custom-browserprofiles\" --name \"Select browser profile\" --hold custom-browserprofiles"; - # ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ - # █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ - animations = { - enabled = true; - bezier = [ - "wind, 0.05, 0.9, 0.1, 1.05" - "winIn, 0.1, 1.1, 0.1, 1.1" - "winOut, 0.3, -0.3, 0, 1" - "liner, 1, 1, 1, 1" - ]; - animation = [ - "windows, 1, 6, wind, slide" - "windowsIn, 1, 6, winIn, slide" - "windowsOut, 1, 5, winOut, slide" - "windowsMove, 1, 5, wind, slide" - "border, 1, 1, liner" - "borderangle, 1, 30, liner, loop" - "fade, 1, 10, default" - "workspaces, 1, 5, wind" - ]; - }; +}; +flake.homeModules.hyprland = {pkgs-unstable, ... }: +let + wallpaper1 = ../../assets/wallpaper1.jpg; + wallpaper2 = ../../assets/wallpaper2.jpg; + wallpaper3 = ../../assets/wallpaper3.jpg; + wallpaper4 = ../../assets/wallpaper4.jpg; + wallpaper5 = ../../assets/wallpaper5.jpg; - # █▀▀ █▄░█ █░█ - # ██▄ █░▀█ ▀▄▀ - - # See https://wiki.hyprland.org/Configuring/Environment-variables/ - env = [ - "PATH, $PATH:$scrPath" - "XDG_CURRENT_DESKTOP,Hyprland" - "XDG_SESSION_TYPE,wayland" - "XDG_SESSION_DESKTOP,Hyprland" - "QT_QPA_PLATFORM,wayland;xcb" - "QT_QPAPLATFORMTHEME,qt6ct" - "QT_WAYLAND_DISABLE_WINDOWDECORATION,1" - "MOZ_ENABLE_WAYLAND,1" - "GDK_SCALE,1" + hyprlandLua = builtins.replaceStrings + [ + "WALLPAPER1/PATH/PLACEHOLDER" + "WALLPAPER2/PATH/PLACEHOLDER" + "WALLPAPER3/PATH/PLACEHOLDER" + "WALLPAPER4/PATH/PLACEHOLDER" + "WALLPAPER5/PATH/PLACEHOLDER" + ] + [ + (toString wallpaper1) + (toString wallpaper2) + (toString wallpaper3) + (toString wallpaper4) + (toString wallpaper5) + ] + (builtins.readFile ../../other/hyprland/hyprland.lua); +in + { + #refer to https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/ + wayland.windowManager.hyprland.enable = true; + wayland.windowManager.hyprland.package = pkgs-unstable.hyprland; + #hint Electron apps to use on wayland; + home.sessionVariables.NIXOS_OZONE_WL = "1"; + wayland.windowManager.hyprland.plugins = [ + #pkgs-unstable.hyprlandPlugins.hyprspace # currently broken + #pkgs-unstable.hyprlandPlugins.hypr-dynamic-cursors ]; - - # █ █▄░█ █▀█ █░█ ▀█▀ - # █ █░▀█ █▀▀ █▄█ ░█░ - - input = { - kb_layout = ["ch"]; - follow_mouse = 1; - sensitivity = 0; - force_no_accel = 1; - }; - - # █▄▀ █▀▀ █▄█ █▄▄ █ █▄░█ █▀▄ █ █▄░█ █▀▀ █▀ - # █░█ ██▄ ░█░ █▄█ █ █░▀█ █▄▀ █ █░▀█ █▄█ ▄█ - # caelestia shell drawers toggle dashboard - # caelestia shell drawers toggle utilities - - bind = [ - #hyprland/utility keybindings - "$mod, W, togglefloating" - "$mod, G, togglegroup" - "Alt, Return, fullscreen" - "$mod, Left, movefocus, l" - "$mod, Right, movefocus, r" - "$mod, Up, movefocus, u" - "$mod, Down, movefocus, d" - "Alt, Tab, movefocus, d" - "$mod, 1, workspace, 1" - "$mod, 2, workspace, 2" - "$mod, 3, workspace, 3" - "$mod, 4, workspace, 4" - "$mod, 5, workspace, 5" - "$mod, 6, workspace, 6" - "$mod, 7, workspace, 7" - "$mod, 8, workspace, 8" - "$mod, 9, workspace, 9" - "$mod, 0, workspace, 10" - "$mod+Ctrl, Right, workspace, r+1" - "$mod+Ctrl, Left, workspace, r-1" - "$mod+Ctrl, Doown, workspace, empty" - "$mod+Shift, 1, movetoworkspace, 1" - "$mod+Shift, 2, movetoworkspace, 2" - "$mod+Shift, 3, movetoworkspace, 3" - "$mod+Shift, 4, movetoworkspace, 4" - "$mod+Shift, 5, movetoworkspace, 5" - "$mod+Shift, 6, movetoworkspace, 6" - "$mod+Shift, 7, movetoworkspace, 7" - "$mod+Shift, 8, movetoworkspace, 8" - "$mod+Shift, 9, movetoworkspace, 9" - "$mod+Shift, 0, movetoworkspace, 10" - "$mod+Ctrl+Alt, Right, movetoworkspace, r+1" - "$mod+Ctrl+Alt, Left, movetoworkspace, r-1" - #"$mod, Backspace, exec, wlogout -b 4 -T 600 -B 600" - "$mod, Backspace, exec, caelestia shell drawers toggle session" - "$mod+Shift+Ctrl, Left, movewindow, l" - "$mod+Shift+Ctrl, Right, movewindow, r" - "$mod+Shift+Ctrl, Up, movewindow, u" - "$mod+Shift+Ctrl, Down, movewindow, d" - "$mod, mouse_down, workspace, e+1" - "$mod, mouse_up, workspace, e-1" - "$mod, V, exec, cliphist list | rofi -dmenu| cliphist decode | wl-copy" # copy paste - "$mod, B, exec, hyprkeys -bkr | rofi -dmenu" - #"$mod, A, tagwindow, noborder" # used to not apply image border - "$mod, S, togglespecialworkspace," - "Alt+$mod, S, movetoworkspace, special" - # for the scrolling layout - "$mod, A, layoutmsg, move -col" - "$mod, D, layoutmsg, move +col" - #apps keybindings - "$mod, T, exec, $term" - "$mod, E, exec, $file" - "$mod, F, exec, $browser" - "$mod, N, exec, $notes" - #"$mod+Shift, A, exec, rofi -show drun" - "$mod+Shift, A, exec, caelestia shell drawers toggle launcher" - "$mod, Q, exec, custom-dontkillsteam" - #"Ctrl+Alt, W, exec, pkill waybar || waybar" - "Ctrl+Alt, W, exec, caelestia shell drawers toggle sidebar" - #"$mod, L, exec, swaylock -eFLK -i ${wallpaper}" - "$mod, L, exec, caelestia shell lock lock" - #"$mod, F11, exec, hyprshot -m window" - ", F11, exec, caelestia screenshot" - #"$mod_SHIFT, S, exec, hyprshot -m region --clipboard only" - # "$mod_SHIFT, S, exec, qs ipc call screenshot toggle" - "$mod_SHIFT, S, exec, caelestia shell picker open" - # framework 16 rgb macropad - "Ctrl+$mod, 6, exec, custom-killall" # pos 1 1 killall apps except focused one - "Ctrl+Alt, 7, exec, custom-performance" # pos 2 1 start performance mode - #"Ctrl+Alt, 7, exec, caelestia shell gameMode toggle" - # reloads the autostart programs # pos 3 1 - # we passed to caelestia-shell and stoped using that - /* - "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'" - "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=11 -e sh -c 'custom-cowsay'" - "Ctrl+$mod, 4, exec, kitty -e 'custom-launch'" - "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T " - "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'" - #"Ctrl+Alt, 1, exec, swaync-client -t" # pos 4 1 notification center - "Ctrl+Alt, 1, exec, qs ipc call notifications toggle" - */ - # pos 4 1 notification center. - "Ctrl+Alt, 1, exec, caelestia shell drawers toggle sidebar" - #"Ctrl+Alt, 1, exec, [[ -f ~/.cache/hypr-battery-saver ]] || swaync-client -t" - "Ctrl+$mod, 4, exec, caelestia shell notifs toggleDnd" - "Ctrl+$mod, 3, exec, pavucontrol" # pos 1 2 audiocontrol - "Ctrl+Shift+Alt, 0, exec, kitty --hold --class \"custom-changeAudioOutput\" --name \"Select audio output\" zsh -c \"custom-changeAudioOutput\"" # pos 2 2 change audio output fzf - "Ctrl+$mod, 5, exec, gnome-characters" # pos 3 2 special chars - "Ctrl+Alt, 8, exec, hyprpicker | tee >(wl-copy) | cliphist store" # pos 4 2 colorpicker - "Ctrl+Alt, 0, exec, custom-tomato" # pos 1 3 pomodoro app - "Ctrl+Alt, 2, exec, custom-bottom" # pos 2 3 btm (like htop but cleaner) - "Ctrl+Alt, 9, exec, anki" - # if hyprexpo plugin enabled bind = $mainMod, Space, hyprexpo:expo, toggle - # maybe exec sudo framework-tools-tui - - #plugins keybindings - #"$mod, SPACE, overview:toggle, " - ]; - binde = [ - "$mod+Shift, Right, resizeactive, 30 0" - "$mod+Shift, Left, resizeactive, -30, 0" - "$mod+Shift, Up, resizeactive, 0 -30" - "$mod+Shift, Down, resizeactive,m 0 30" - ]; - bindl = [ - ", F1, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle" #toggle audio mute - ", F5, exec, playerctl play-pause" # media F4-F6 - ", F4, exec, playerctl previous" - ", F6, exec, playerctl next" - ]; - bindel = [ - ", F2, exec, pactl set-sink-volume @DEFAULT_SINK@ -10%" # decrease volume - ", F3, exec, pactl set-sink-volume @DEFAULT_SINK@ +10%" # increase volume - ", F7, exec, brightnessctl s 10%-" # decrease brightness - ", F8, exec, brightnessctl s +10%" # increase brightness - ]; - bindm = [ - "$mod, mouse:272, movewindow" - "$mod, mouse:273, resizewindow" - "$mod, Z, movewindow" - "$mod, X, resizewindow" - ]; - # █░░ ▄▀█ █░█ █▄░█ █▀▀ █░█ - # █▄▄ █▀█ █▄█ █░▀█ █▄▄ █▀█ - exec-once = [ - "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" # for XDPH - "dbus-update-activation-environment --systemd --all" # for XDPH - "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" # for XDPH - "systemctl --user start xdg-desktop-portal-wlr.service" - "blueman-applet" # systray app for Bluetooth - "udiskie --no-automount --smart-tray" # front-end that allows to manage removable media - "nm-applet --indicator" # systray app for Network/wifi - #setups clipboard - "rm -rf ~/.cache/cliphist/ && wl-paste --type text --watch cliphist store & wl-paste --type image --watch cliphist store" - #"wl-paste --type text --watch cliphist store" # clipboard store text data - #"wl-paste --type image --watch cliphist store" # clipboard store image data - "custom-batterynotify" - "custom-batterywarning" - #"birdtray" # thunderbird tray app # curently broken - #wallpapers/b - "awww img ${wallpaper}" - "awww-daemon" - "sleep 1 && custom-wallpaper" - "custom-checkKdrive && custom-mountkdrive" # checks if the remote works and mount it - #"waybar" - "custom-gitnotify" - #"custom-obsidianbackup" # backups the obsidian notes to kdrive and to a timed hidden dir (~/.Notes.backup/) - #"QS-notifycache" # builds the cache that will be used for the notification history - "sleep 4 & caelestia-shell" #works better if it sleeps a bit before - "sleep 20 && ngcp pull --automatic" # see github.com/tomasriveral/nix-git-cherry-picker - #"rm ~/.cache/hypr-battery-saver" - #"rm ~/.cache/hypr-battery-saver.brightness" - /* - We stopped using that ######################### maybe we should desactivate those scripts - # login autostart - ####################### - "[workspace 1 silent] sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'" - "[workspace 1 silent] sleep 1 && kitty -o font_size=11 -e sh -c 'custom-cowsay'" - "[workspace 1 silent] kitty -e 'custom-launch'" - "[workspace 1 silent] sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T " - "[workspace 1 silent] sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'" - ###################### - ###################### - */ - ]; - splash = true; # remove default background on startup - # gestures (also keybindings) - gesture = [ - "3, right, move, +col" - "3, left, move, -col" - ]; - - # █░░ ▄▀█ █▄█ █▀█ █░█ ▀█▀ █▀ - # █▄▄ █▀█ ░█░ █▄█ █▄█ ░█░ ▄█ - - dwindle = { - preserve_split = true; - }; - scrolling = { - column_width = 0.45; - }; - - # █▀▄▀█ █ █▀ █▀▀ - # █░▀░█ █ ▄█ █▄▄ - - misc = { - vrr = 0; - force_default_wallpaper = 0; - }; - xwayland = { - force_zero_scaling = true; - }; - - # █▀▄▀█ █▀█ █▄░█ █ ▀█▀ █▀█ █▀█ - # █░▀░█ █▄█ █#░▀█ █ ░█░ █▄█ █▀▄ - monitor = [ - #",preferred, auto, auto" - "HDMI-A-1, highres2highrr, auto-left, 1" - ]; - # _______ ___ __ __ _______ ___ __ _ _______ - #| || | | | | || || | | | | || | - #| _ || | | | | || ___|| | | |_| || _____| - #| |_| || | | |_| || | __ | | | || |_____ - #| ___|| |___ | || || || | | _ ||_____ | - #| | | || || |_| || | | | | | _____| | - #|___| |_______||_______||_______||___| |_| |__||_______| - # - "plugin:dynamic-cursors" = { - enabled = true; - threshold = 2; - mode = "rotate"; - rotate = { - # length in px of the simulated stick used to rotate the cursor - # most realistic if this is your actual cursor size - length = 20; - offset = 0; - }; - shake = { - enabled = true; - # use nearest-neighbour (pixelated) scaling when shaking - # may look weird when effects are enabled - nearest = true; - threshold = 4; - # magnification level immediately after shake start - base = 4.0; - # magnification increase per second when continuing to shake - speed = 4.0; - # how much the speed is influenced by the current shake intensitiy - influence = 0.0; - - # maximal magnification the cursor can reach - # values below 1 disable the limit (e.g. 0) - limit = 0.0; - - # time in millseconds the cursor will stay magnified after a shake has ended - timeout = 2000; - - # show cursor behaviour `tilt`, `rotate`, etc. while shaking - effects = true; - - # enable ipc events for shake - ipc = false; - }; - }; - "plugin:overview" = { - disableGestures = true; - showEmptyWorkspace = true; - workspaceActiveBorder = "rgb(ab7746)"; - disableBlur = true; - }; - - ##################################################### - ##################################################### - # theme - decoration = { - dim_special = 0.3; - rounding = 18; - blur = { - special = true; - enabled = true; - size = 4; - passes = 2; - new_optimizations = true; - ignore_opacity = true; - }; - }; - general = { - gaps_in = 5; - gaps_out = 15; - border_size = 4; - "col.active_border" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg"; - "col.inactive_border" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg"; - layout = "dwindle"; - resize_on_border = true; - }; - group = { - "col.border_active" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg"; - "col.border_inactive" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg"; - "col.border_locked_active" = "rgba(ca6702ff) rgba(ecd3a0ff) 45deg"; - "col.border_locked_inactive" = "rgba(f1dca7d9) rgba(ffe1a8d9) 45deg"; - }; - #################################################### - ################################################## - - # /$$ /$$ /$$ - #| $$ /$ | $$ | $$ - #| $$ /$$$| $$ /$$$$$$ /$$$$$$ | $$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ - #| $$/$$ $$ $$ /$$__ $$ /$$__ $$| $$ /$$/ /$$_____/ /$$__ $$ |____ $$ /$$_____/ /$$__ $$ - #| $$$$_ $$$$| $$ \ $$| $$ \__/| $$$$$$/ | $$$$$$ | $$ \ $$ /$$$$$$$| $$ | $$$$$$$$ - #| $$$/ \ $$$| $$ | $$| $$ | $$_ $$ \____ $$| $$ | $$ /$$__ $$| $$ | $$_____/ - #| $$/ \ $$| $$$$$$/| $$ | $$ \ $$ /$$$$$$$/| $$$$$$$/| $$$$$$$| $$$$$$$| $$$$$$$ - #|__/ \__/ \______/ |__/ |__/ \__/|_______/ | $$____/ \_______/ \_______/ \_______/ - # | $$ - # | $$ - # |__/ - # see https://wiki.hypr.land/Configuring/Workspace-Rules/ - workspace = [ - "1, layout:master" - "2, layout:scrolling, layoutopt:direction:right" - "name:special, layout:scrolling" - # used for smart gaps along some windowrules - #"w[tv1], gapsout:1, gapsin:1" - #"f[1], gapsout:1, gapsin:1" - ]; - - # █░█░█ █ █▄░█ █▀▄ █▀█ █░█░█   █▀█ █░█ █░░ █▀▀ █▀ - # ▀▄▀▄▀ █ █░▀█ █▄▀ █▄█ ▀▄▀▄▀   █▀▄ █▄█ █▄▄ ██▄ ▄█ - windowrule = [ - "opacity 0.90 0.90, match:class ^(firefox)$" - "opacity 0.90 0.90, match:class ^(Brave-browser)$" - "opacity 0.80 0.80, match:class ^(code-oss)$" - "opacity 0.80 0.80, match:class ^(Code)$" - "opacity 0.80 0.80, match:class ^(code-url-handler)$" - "opacity 0.80 0.80, match:class ^(code-insiders-url-handler)$" - "opacity 0.75 0.75, match:class ^(kitty)$" - "opacity 0.80 0.80, match:class ^(org.kde.dolphin)$" - "opacity 0.80 0.80, float on, match:class ^(org.kde.ark)$" - "opacity 0.80 0.80, float on, match:class ^(nwg-look)$" - "opacity 0.80 0.80, float on, match:class ^(qt5ct)$" - "opacity 0.80 0.80, float on, match:class ^(qt6ct)$" - "opacity 0.80 0.80, float on, match:class ^(kvantummanager)$" - "opacity 0.80 0.70, float on, match:class ^(org.pulseaudio.pavucontrol)$" - "opacity 0.80 0.70, float on, match:class ^(blueman-manager)$" - "opacity 0.80 0.70, float on, match:class ^(nm-applet)$" - "opacity 0.80 0.70, float on, match:class ^(nm-connection-editor)$" - "opacity 0.80 0.70, float on, match:class ^(org.kde.polkit-kde-authentication-agent-1)$" - "opacity 0.80 0.70, match:class ^(polkit-gnome-authentication-agent-1)$" - "opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.gtk)$" - "opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.hyprland)$" - "opacity 0.70 0.70, match:class ^([Ss]team)$" - "opacity 0.70 0.70, match:class ^(steamwebhelper)$" - "opacity 0.70 0.70, match:class ^(Spotify)$" - "opacity 0.70 0.70, match:initial_title ^(Spotify Free)$" - "opacity 0.90 0.90, float on, match:class ^(com.github.rafostar.Clapper)$" - "opacity 0.80 0.80, match:class ^(com.github.tchx84.Flatseal)$" - "opacity 0.80 0.80, match:class ^(hu.kramo.Cartridges)$" - "opacity 0.80 0.80, match:class ^(com.obsproject.Studio)$" - "opacity 0.80 0.80, match:class ^(gnome-boxes)$" - "opacity 0.80 0.80, match:class ^(discord)$" - "opacity 0.80 0.80, match:class ^(WebCord)$" - "opacity 0.80 0.80, match:class ^(ArmCord)$" - "opacity 0.80 0.80, float on, match:class ^(app.drey.Warp)$" - "opacity 0.80 0.80, float on, match:class ^(net.davidotek.pupgui2)$" - "opacity 0.80 0.80, float on, match:class ^(yad)$" - "opacity 0.80 0.80, float on, match:class ^(Signal)$" - "opacity 0.80 0.80, float on, match:class ^(io.github.alainm23.planify)$" - "opacity 0.80 0.80, float on, match:class ^(io.gitlab.theevilskeleton.Upscaler)$" - "opacity 0.80 0.80, float on, match:class ^(com.github.unrud.VideoDownloader)$" - "opacity 0.80 0.80, float on, match:class ^(io.gitlab.adhami3310.Impression)$" - "opacity 0.80 0.80, float on, match:class ^(io.missioncenter.MissionCenter)$" - "opacity 0.80 0.80, match:class ^(io.github.flattool.Warehouse)$" - "float on, match:class ^(org.kde.dolphin)$, match:title ^(Progress Dialog — Dolphin)$" - "float on, match:class ^(org.kde.dolphin)$, match:title ^(Copying — Dolphin)$" - "float on, match:class ^(firefox)$, match:title ^(Picture-in-Picture)$" - "float on, match:class ^(firefox)$, match:title ^(Library)$" - "float on, match:class ^(kitty)$, match:title ^(top)$" - "float on, match:class ^(kitty)$, match:title ^(btop)$" - "float on, match:class ^(kitty)$, match:title ^(htop)$" - "float on, match:class ^(vlc)$" - "float on, match:class ^(eog)$" - "float on, size 400 225, match:class ^(custom-browserprofiles)$" - "float on, size 1050 200, match:class ^(custom-changeAudioOutput)$" - "float on, size 400 175, match:class ^(custom-obsidianvaults)$" - "float on, size 600 600, match:initial_class ^(custom-pomodoro)$" - "float on, size 1500 800, match:initial_class ^(custom-bottom)$" - # smart gaps/border is ugly with caelestia-shell - #"border_size 2, match:float 0, match:workspace w[tv1]" - #"rounding 1, match:float 0, match:workspace w[tv1]" - #"border_size 2, match:float 0, match:workspace f[1]" - #"rounding 1, match:float 0, match:workspace f[1]" - ]; - # add a float for tomato when in kitty - #"plugin:imgborders:noimgborders, tag:noborder" - layerrule = [ - "blur on, ignore_alpha 0, match:namespace rofi" - "blur on, ignore_alpha 0, match:namespace notifications" - "blur on, ignore_alpha 0, match:namespace swaync-notification-window" - "blur on, ignore_alpha 0, match:namespace swaync-control-center" - "blur on, match:namespace logout_dialog" - ]; - }; + wayland.windowManager.hyprland.configType = "lua"; + wayland.windowManager.hyprland.extraConfig = hyprlandLua; }; } diff --git a/modules/applications/hyprlandScripts.nix b/modules/applications/hyprlandScripts.nix deleted file mode 100644 index 957ba89..0000000 --- a/modules/applications/hyprlandScripts.nix +++ /dev/null @@ -1,99 +0,0 @@ -_: { - # for some reason perSystem can't expose pkgs-unstable so we need to expose it here - # ----------------------------------------------------- - # Here are a bunch of scripts that interact with hyprland - # Some are still used. Some are broken. Some are deprecated. But I do still keep them in case I want to go back to old tools - # ----------------------------------------------------- - perSystem = {pkgs, ...}: let - wallpaper1 = ../../assets/wallpaper1.jpg; - wallpaper2 = ../../assets/wallpaper2.jpg; - wallpaper3 = ../../assets/wallpaper3.jpg; - wallpaper4 = ../../assets/wallpaper4.jpg; - wallpaper5 = ../../assets/wallpaper5.jpg; - in { - # kills the app, but when it's steam or custom-pomodoro - packages.custom-dontkillsteam = pkgs.writeShellApplication { - name = "custom-dontkillsteam"; - runtimeInputs = with pkgs; [ - hyprland - jq - ]; - text = '' - class=$(hyprctl activewindow -j | jq -r ".class") - if [[ "$class" == "Steam" || "$class" == "custom-pomodoro" ]]; then - hyprctl dispatch movetoworkspacesilent special - else - hyprctl dispatch killactive "" - fi - - ''; - }; - packages.custom-killall = pkgs.writeShellApplication { - name = "custom-killall"; - runtimeInputs = [ - pkgs.hyprland # for some reason pkgs-unstable doesn't work here - pkgs.jq - ]; - text = '' - active_workspace_id=$(hyprctl activeworkspace -j | jq -r '.id') - - hyprctl clients -j | - jq -r ".[] - | select(.workspace.id==''${active_workspace_id}) - | select(.focusHistoryID!=0) - | .pid" | - xargs -r kill - ''; - }; - packages.custom-wallpaper = pkgs.writeShellApplication { - name = "custom-wallpaper"; - runtimeInputs = with pkgs; [ - socat - awww - ]; - text = '' - handle() { - case $1 in - workspace*) - str=$1 - i=$((''${#str}-1)) - workspace="''${str:$i:1}" - case $workspace in - 1 | 6) - awww img -t none ${wallpaper1} - ;; - 2 | 7) - awww img -t none ${wallpaper2} - ;; - 3 | 8) - awww img -t none ${wallpaper3} - ;; - 4 | 9) - awww img -t none ${wallpaper4} - ;; - 5 | 10 | 0) - awww img -t none ${wallpaper5} - ;; - esac - ;; - esac - } - - socat -U - UNIX-CONNECT:"$XDG_RUNTIME_DIR"/hypr/"$HYPRLAND_INSTANCE_SIGNATURE"/.socket2.sock | while read -r line; do handle "$line"; done - ''; - }; - packages.custom-launch = pkgs.writeShellApplication { - # used for the terminal autostart. Needs to get cleared and recall fastfetch so that the bar from oh-my-zsh get resized - # unused - name = "custom-launch"; - runtimeInputs = with pkgs; [ - zsh - ]; - text = '' - sleep 2 - clear - zsh - ''; - }; - }; -} diff --git a/other/hyprland/README.md b/other/hyprland/README.md new file mode 100644 index 0000000..5ce6bb6 --- /dev/null +++ b/other/hyprland/README.md @@ -0,0 +1 @@ +Migrating from hyprlang to lua is really difficult with home-manager. I tried to do it, but a some point half my keybinds stopped working and the nix language made everything much more difficult to debug. So what we will do is have a hyprland.lua which will import a host.lua (for laptop/desktop specific configuration). Both of them will be copied by home-manager. For the migration from .conf to .lua we will use some publicly available [website](https://eiontusk.github.io/hyprlang2lua/). diff --git a/other/hyprland/hyprland.conf b/other/hyprland/hyprland.conf new file mode 100644 index 0000000..7dc467d --- /dev/null +++ b/other/hyprland/hyprland.conf @@ -0,0 +1,299 @@ +exec-once = /nix/store/8kih8alkk4qzgjchg5501r1c3a8a71aw-dbus-1.16.2/bin/dbus-update-activation-environment --systemd DISPLAY HYPRLAND_INSTANCE_SIGNATURE WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE && systemctl --user stop hyprland-session.target && systemctl --user start hyprland-session.target +$browser=kitty --class "custom-browserprofiles" --name "Select browser profile" --hold custom-browserprofiles +$editor=nvim +$file=dolphin +$mod=SUPER +$notes=kitty --class "custom-obsidianvaults" --name "Select Obsidian vault" --hold custom-obsidianvaults +$term=kitty +animations { + bezier=wind, 0.05, 0.9, 0.1, 1.05 + bezier=winIn, 0.1, 1.1, 0.1, 1.1 + bezier=winOut, 0.3, -0.3, 0, 1 + bezier=liner, 1, 1, 1, 1 + animation=windows, 1, 6, wind, slide + animation=windowsIn, 1, 6, winIn, slide + animation=windowsOut, 1, 5, winOut, slide + animation=windowsMove, 1, 5, wind, slide + animation=border, 1, 1, liner + animation=borderangle, 1, 30, liner, loop + animation=fade, 1, 10, default + animation=workspaces, 1, 5, wind + enabled=true +} + +bind=$mod, W, togglefloating +bind=$mod, G, togglegroup +bind=Alt, Return, fullscreen +bind=$mod, Left, movefocus, l +bind=$mod, Right, movefocus, r +bind=$mod, Up, movefocus, u +bind=$mod, Down, movefocus, d +bind=Alt, Tab, movefocus, d +bind=$mod, 1, workspace, 1 +bind=$mod, 2, workspace, 2 +bind=$mod, 3, workspace, 3 +bind=$mod, 4, workspace, 4 +bind=$mod, 5, workspace, 5 +bind=$mod, 6, workspace, 6 +bind=$mod, 7, workspace, 7 +bind=$mod, 8, workspace, 8 +bind=$mod, 9, workspace, 9 +bind=$mod, 0, workspace, 10 +bind=$mod+Ctrl, Right, workspace, r+1 +bind=$mod+Ctrl, Left, workspace, r-1 +bind=$mod+Ctrl, Doown, workspace, empty +bind=$mod+Shift, 1, movetoworkspace, 1 +bind=$mod+Shift, 2, movetoworkspace, 2 +bind=$mod+Shift, 3, movetoworkspace, 3 +bind=$mod+Shift, 4, movetoworkspace, 4 +bind=$mod+Shift, 5, movetoworkspace, 5 +bind=$mod+Shift, 6, movetoworkspace, 6 +bind=$mod+Shift, 7, movetoworkspace, 7 +bind=$mod+Shift, 8, movetoworkspace, 8 +bind=$mod+Shift, 9, movetoworkspace, 9 +bind=$mod+Shift, 0, movetoworkspace, 10 +bind=$mod+Ctrl+Alt, Right, movetoworkspace, r+1 +bind=$mod+Ctrl+Alt, Left, movetoworkspace, r-1 +bind=$mod, Backspace, exec, caelestia shell drawers toggle session +bind=$mod+Shift+Ctrl, Left, movewindow, l +bind=$mod+Shift+Ctrl, Right, movewindow, r +bind=$mod+Shift+Ctrl, Up, movewindow, u +bind=$mod+Shift+Ctrl, Down, movewindow, d +bind=$mod, mouse_down, workspace, e+1 +bind=$mod, mouse_up, workspace, e-1 +bind=$mod, V, exec, cliphist list | rofi -dmenu| cliphist decode | wl-copy +bind=$mod, B, exec, hyprkeys -bkr | rofi -dmenu +bind=$mod, S, togglespecialworkspace, +bind=Alt+$mod, S, movetoworkspace, special +bind=$mod, A, layoutmsg, move -col +bind=$mod, D, layoutmsg, move +col +bind=$mod, T, exec, $term +bind=$mod, E, exec, $file +bind=$mod, F, exec, $browser +bind=$mod, N, exec, $notes +bind=$mod+Shift, A, exec, caelestia shell drawers toggle launcher +bind=$mod, Q, exec, custom-dontkillsteam +bind=Ctrl+Alt, W, exec, caelestia shell drawers toggle sidebar +bind=$mod, L, exec, caelestia shell lock lock +bind=, F11, exec, caelestia screenshot +bind=$mod_SHIFT, S, exec, caelestia shell picker open +bind=Ctrl+$mod, 6, exec, custom-killall +bind=Ctrl+Alt, 7, exec, custom-performance +bind=Ctrl+Alt, 1, exec, caelestia shell drawers toggle sidebar +bind=Ctrl+$mod, 4, exec, caelestia shell notifs toggleDnd +bind=Ctrl+$mod, 3, exec, pavucontrol +bind=Ctrl+Shift+Alt, 0, exec, kitty --hold --class "custom-changeAudioOutput" --name "Select audio output" zsh -c "custom-changeAudioOutput" +bind=Ctrl+$mod, 5, exec, gnome-characters +bind=Ctrl+Alt, 8, exec, hyprpicker | tee >(wl-copy) | cliphist store +bind=Ctrl+Alt, 0, exec, custom-tomato +bind=Ctrl+Alt, 2, exec, custom-bottom +bind=Ctrl+Alt, 9, exec, anki + +binde=$mod+Shift, Right, resizeactive, 30 0 +binde=$mod+Shift, Left, resizeactive, -30, 0 +binde=$mod+Shift, Up, resizeactive, 0 -30 +binde=$mod+Shift, Down, resizeactive,m 0 30 + +bindel=, F2, exec, pactl set-sink-volume @DEFAULT_SINK@ -10% +bindel=, F3, exec, pactl set-sink-volume @DEFAULT_SINK@ +10% +bindel=, F7, exec, brightnessctl s 10%- +bindel=, F8, exec, brightnessctl s +10% + +bindl=, F1, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle +bindl=, F5, exec, playerctl play-pause +bindl=, F4, exec, playerctl previous +bindl=, F6, exec, playerctl next + +bindm=$mod, mouse:272, movewindow +bindm=$mod, mouse:273, resizewindow +bindm=$mod, Z, movewindow +bindm=$mod, X, resizewindow + +decoration { + blur { + enabled=true + ignore_opacity=true + new_optimizations=true + passes=2 + size=4 + special=true + } + dim_special=0.300000 + rounding=18 +} + +dwindle { + preserve_split=true +} + +env=PATH, $PATH:$scrPath +env=XDG_CURRENT_DESKTOP,Hyprland +env=XDG_SESSION_TYPE,wayland +env=XDG_SESSION_DESKTOP,Hyprland +env=QT_QPA_PLATFORM,wayland;xcb +env=QT_QPAPLATFORMTHEME,qt6ct +env=QT_WAYLAND_DISABLE_WINDOWDECORATION,1 +env=MOZ_ENABLE_WAYLAND,1 +env=GDK_SCALE,1 + +exec-once=qtbatticon +exec-once=source /run/agenix/ntfy && nixpkgs-notifier listen +exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once=dbus-update-activation-environment --systemd --all +exec-once=systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once=systemctl --user start xdg-desktop-portal-wlr.service +exec-once=blueman-applet +exec-once=udiskie --no-automount --smart-tray +exec-once=nm-applet --indicator +exec-once=rm -rf ~/.cache/cliphist/ && wl-paste --type text --watch cliphist store & wl-paste --type image --watch cliphist store +exec-once=custom-batterynotify +exec-once=custom-batterywarning +exec-once=awww img /nix/store/30py8zav0pbsbcvcll5017hwz07fxmr0-wallpaper1.jpg +exec-once=awww-daemon +exec-once=sleep 1 && custom-wallpaper +exec-once=custom-checkKdrive && custom-mountkdrive +exec-once=custom-gitnotify +exec-once=sleep 4 & caelestia-shell +exec-once=sleep 20 && ngcp pull --automatic + +general { + border_size=4 + col.active_border=rgba(ca6702ff) rgba(ecd3a0ff) 45deg + col.inactive_border=rgba(f1dca7d9) rgba(ffe1a8d9) 45deg + gaps_in=5 + gaps_out=15 + layout=dwindle + resize_on_border=true +} + +gesture=3, right, move, +col +gesture=3, left, move, -col + +group { + col.border_active=rgba(ca6702ff) rgba(ecd3a0ff) 45deg + col.border_inactive=rgba(f1dca7d9) rgba(ffe1a8d9) 45deg + col.border_locked_active=rgba(ca6702ff) rgba(ecd3a0ff) 45deg + col.border_locked_inactive=rgba(f1dca7d9) rgba(ffe1a8d9) 45deg +} + +input { + kb_layout=ch + follow_mouse=1 + force_no_accel=1 + sensitivity=0 +} + +layerrule=blur on, ignore_alpha 0, match:namespace rofi +layerrule=blur on, ignore_alpha 0, match:namespace notifications +layerrule=blur on, ignore_alpha 0, match:namespace swaync-notification-window +layerrule=blur on, ignore_alpha 0, match:namespace swaync-control-center +layerrule=blur on, match:namespace logout_dialog + +misc { + force_default_wallpaper=0 + vrr=0 +} + +monitor=eDP-1, highres@highrr, 0x0, 1 +monitor=HDMI-A-1, highres2highrr, auto-left, 1 + +plugin:dynamic-cursors { + rotate { + length=20 + offset=0 + } + + shake { + base=4.000000 + effects=true + enabled=true + influence=0.000000 + ipc=false + limit=0.000000 + nearest=true + speed=4.000000 + threshold=4 + timeout=2000 + } + enabled=true + mode=rotate + threshold=2 +} + +plugin:overview { + disableBlur=true + disableGestures=true + showEmptyWorkspace=true + workspaceActiveBorder=rgb(ab7746) +} + +scrolling { + column_width=0.450000 +} + +windowrule=opacity 0.90 0.90, match:class ^(firefox)$ +windowrule=opacity 0.90 0.90, match:class ^(Brave-browser)$ +windowrule=opacity 0.80 0.80, match:class ^(code-oss)$ +windowrule=opacity 0.80 0.80, match:class ^(Code)$ +windowrule=opacity 0.80 0.80, match:class ^(code-url-handler)$ +windowrule=opacity 0.80 0.80, match:class ^(code-insiders-url-handler)$ +windowrule=opacity 0.75 0.75, match:class ^(kitty)$ +windowrule=opacity 0.80 0.80, match:class ^(org.kde.dolphin)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(org.kde.ark)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(nwg-look)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(qt5ct)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(qt6ct)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(kvantummanager)$ +windowrule=opacity 0.80 0.70, float on, match:class ^(org.pulseaudio.pavucontrol)$ +windowrule=opacity 0.80 0.70, float on, match:class ^(blueman-manager)$ +windowrule=opacity 0.80 0.70, float on, match:class ^(nm-applet)$ +windowrule=opacity 0.80 0.70, float on, match:class ^(nm-connection-editor)$ +windowrule=opacity 0.80 0.70, float on, match:class ^(org.kde.polkit-kde-authentication-agent-1)$ +windowrule=opacity 0.80 0.70, match:class ^(polkit-gnome-authentication-agent-1)$ +windowrule=opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.gtk)$ +windowrule=opacity 0.80 0.70, match:class ^(org.freedesktop.impl.portal.desktop.hyprland)$ +windowrule=opacity 0.70 0.70, match:class ^([Ss]team)$ +windowrule=opacity 0.70 0.70, match:class ^(steamwebhelper)$ +windowrule=opacity 0.70 0.70, match:class ^(Spotify)$ +windowrule=opacity 0.70 0.70, match:initial_title ^(Spotify Free)$ +windowrule=opacity 0.90 0.90, float on, match:class ^(com.github.rafostar.Clapper)$ +windowrule=opacity 0.80 0.80, match:class ^(com.github.tchx84.Flatseal)$ +windowrule=opacity 0.80 0.80, match:class ^(hu.kramo.Cartridges)$ +windowrule=opacity 0.80 0.80, match:class ^(com.obsproject.Studio)$ +windowrule=opacity 0.80 0.80, match:class ^(gnome-boxes)$ +windowrule=opacity 0.80 0.80, match:class ^(discord)$ +windowrule=opacity 0.80 0.80, match:class ^(WebCord)$ +windowrule=opacity 0.80 0.80, match:class ^(ArmCord)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(app.drey.Warp)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(net.davidotek.pupgui2)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(yad)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(Signal)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(io.github.alainm23.planify)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(io.gitlab.theevilskeleton.Upscaler)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(com.github.unrud.VideoDownloader)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(io.gitlab.adhami3310.Impression)$ +windowrule=opacity 0.80 0.80, float on, match:class ^(io.missioncenter.MissionCenter)$ +windowrule=opacity 0.80 0.80, match:class ^(io.github.flattool.Warehouse)$ +windowrule=float on, match:class ^(org.kde.dolphin)$, match:title ^(Progress Dialog — Dolphin)$ +windowrule=float on, match:class ^(org.kde.dolphin)$, match:title ^(Copying — Dolphin)$ +windowrule=float on, match:class ^(firefox)$, match:title ^(Picture-in-Picture)$ +windowrule=float on, match:class ^(firefox)$, match:title ^(Library)$ +windowrule=float on, match:class ^(kitty)$, match:title ^(top)$ +windowrule=float on, match:class ^(kitty)$, match:title ^(btop)$ +windowrule=float on, match:class ^(kitty)$, match:title ^(htop)$ +windowrule=float on, match:class ^(vlc)$ +windowrule=float on, match:class ^(eog)$ +windowrule=float on, size 400 225, match:class ^(custom-browserprofiles)$ +windowrule=float on, size 1050 200, match:class ^(custom-changeAudioOutput)$ +windowrule=float on, size 400 175, match:class ^(custom-obsidianvaults)$ +windowrule=float on, size 600 600, match:initial_class ^(custom-pomodoro)$ +windowrule=float on, size 1500 800, match:initial_class ^(custom-bottom)$ + +workspace=1, layout:master +workspace=2, layout:scrolling, layoutopt:direction:right +workspace=name:special, layout:scrolling + +xwayland { + force_zero_scaling=true +} +splash=true diff --git a/other/hyprland/hyprland.lua b/other/hyprland/hyprland.lua new file mode 100644 index 0000000..0cb42b0 --- /dev/null +++ b/other/hyprland/hyprland.lua @@ -0,0 +1,804 @@ +local browser = "kitty --class \"custom-browserprofiles\" --name \"Select browser profile\" --hold custom-browserprofiles" +local editor = "nvim" +local file = "dolphin" +local mod = "SUPER" +local notes = "kitty --class \"custom-obsidianvaults\" --name \"Select Obsidian vault\" --hold custom-obsidianvaults" +local term = "kitty" + +local function close_or_move_special() + local window = hl.get_active_window() + + if not window then + return + end + + local class = window.class or window.initial_class + + if class == "Steam" or class == "custom-pomodoro" then + hl.dispatch(hl.dsp.window.move({ workspace = "special" })) + else + hl.dispatch(hl.dsp.window.close({ window = window })) + end +end +local function close_other_windows() + local active = hl.get_active_window() + local workspace = hl.get_active_workspace() + + if not active or not workspace then + return + end + + for _, window in pairs(hl.get_windows()) do + if window.workspace + and window.workspace.id == workspace.id + and window.address ~= active.address + then + hl.dispatch(hl.dsp.window.close({ window = window })) + end + end +end + +local wallpapers = { + [1] = "WALLPAPER1/PATH/PLACEHOLDER", + [2] = "WALLPAPER2/PATH/PLACEHOLDER", + [3] = "WALLPAPER3/PATH/PLACEHOLDER", + [4] = "WALLPAPER4/PATH/PLACEHOLDER", + [5] = "WALLPAPER5/PATH/PLACEHOLDER", + [6] = "WALLPAPER1/PATH/PLACEHOLDER", + [7] = "WALLPAPER2/PATH/PLACEHOLDER", + [8] = "WALLPAPER3/PATH/PLACEHOLDER", + [9] = "WALLPAPER4/PATH/PLACEHOLDER", + [10] = "WALLPAPER5/PATH/PLACEHOLDER", +} + +hl.on("workspace.active", function(workspace) + local wallpaper = wallpapers[workspace.id] + + if wallpaper then + hl.exec_cmd("awww img -t none " .. wallpaper) + end +end) + +hl.curve("wind", { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } }) +hl.curve("winIn", { type = "bezier", points = { { 0.1, 1.1 }, { 0.1, 1.1 } } }) +hl.curve("winOut", { type = "bezier", points = { { 0.3, -0.3 }, { 0, 1 } } }) +hl.curve("liner", { type = "bezier", points = { { 1, 1 }, { 1, 1 } } }) +hl.animation({ + leaf = "windows", + enabled = true, + speed = 6, + bezier = "wind", + style = "slide", +}) +hl.animation({ + leaf = "windowsIn", + enabled = true, + speed = 6, + bezier = "winIn", + style = "slide", +}) +hl.animation({ + leaf = "windowsOut", + enabled = true, + speed = 5, + bezier = "winOut", + style = "slide", +}) +hl.animation({ + leaf = "windowsMove", + enabled = true, + speed = 5, + bezier = "wind", + style = "slide", +}) +hl.animation({ + leaf = "border", + enabled = true, + speed = 1, + bezier = "liner", +}) +hl.animation({ + leaf = "borderangle", + enabled = true, + speed = 30, + bezier = "liner", + style = "loop", +}) +hl.animation({ + leaf = "fade", + enabled = true, + speed = 10, + bezier = "default", +}) +hl.animation({ + leaf = "workspaces", + enabled = true, + speed = 5, + bezier = "wind", +}) + +hl.bind(mod .. " + W", hl.dsp.window.float({ action = "toggle" })) +hl.bind(mod .. " + G", hl.dsp.group.toggle()) +hl.bind("ALT + Return", hl.dsp.window.fullscreen({ mode = "fullscreen", action = "toggle" })) +hl.bind(mod .. " + Left", hl.dsp.focus({ direction = "left" })) +hl.bind(mod .. " + Right", hl.dsp.focus({ direction = "right" })) +hl.bind(mod .. " + CTRL + D", hl.dsp.layout("swapcol r")) +hl.bind(mod .. " + CTRL + A", hl.dsp.layout("swapcol l")) +hl.bind(mod .. " + Up", hl.dsp.focus({ direction = "up" })) +hl.bind(mod .. " + Down", hl.dsp.focus({ direction = "down" })) +hl.bind("ALT + Tab", hl.dsp.focus({ direction = "down" })) +hl.bind(mod .. " + 1", hl.dsp.focus({ workspace = 1 })) +hl.bind(mod .. " + 2", hl.dsp.focus({ workspace = 2 })) +hl.bind(mod .. " + 3", hl.dsp.focus({ workspace = 3 })) +hl.bind(mod .. " + 4", hl.dsp.focus({ workspace = 4 })) +hl.bind(mod .. " + 5", hl.dsp.focus({ workspace = 5 })) +hl.bind(mod .. " + 6", hl.dsp.focus({ workspace = 6 })) +hl.bind(mod .. " + 7", hl.dsp.focus({ workspace = 7 })) +hl.bind(mod .. " + 8", hl.dsp.focus({ workspace = 8 })) +hl.bind(mod .. " + 9", hl.dsp.focus({ workspace = 9 })) +hl.bind(mod .. " + 0", hl.dsp.focus({ workspace = 10 })) +hl.bind(mod .. " + CTRL + Right", hl.dsp.focus({ workspace = "r+1" })) +hl.bind(mod .. " + CTRL + Left", hl.dsp.focus({ workspace = "r-1" })) +hl.bind(mod .. " + CTRL + Down", hl.dsp.focus({ workspace = "empty" })) +hl.bind(mod .. " + SHIFT + 1", hl.dsp.window.move({ workspace = 1 })) +hl.bind(mod .. " + SHIFT + 2", hl.dsp.window.move({ workspace = 2 })) +hl.bind(mod .. " + SHIFT + 3", hl.dsp.window.move({ workspace = 3 })) +hl.bind(mod .. " + SHIFT + 4", hl.dsp.window.move({ workspace = 4 })) +hl.bind(mod .. " + SHIFT + 5", hl.dsp.window.move({ workspace = 5 })) +hl.bind(mod .. " + SHIFT + 6", hl.dsp.window.move({ workspace = 6 })) +hl.bind(mod .. " + SHIFT + 7", hl.dsp.window.move({ workspace = 7 })) +hl.bind(mod .. " + SHIFT + 8", hl.dsp.window.move({ workspace = 8 })) +hl.bind(mod .. " + SHIFT + 9", hl.dsp.window.move({ workspace = 9 })) +hl.bind(mod .. " + SHIFT + 0", hl.dsp.window.move({ workspace = 10 })) +hl.bind(mod .. " + CTRL + ALT + Right", hl.dsp.window.move({ workspace = "r+1" })) +hl.bind(mod .." + CTRL + ALT + Left", hl.dsp.window.move({ workspace = "r-1" })) +hl.bind(mod .. " + Backspace", hl.dsp.exec_cmd("caelestia shell drawers toggle session")) +hl.bind(mod .. " + SHIFT + CTRL + Left", hl.dsp.window.move({ direction = "l" })) +hl.bind(mod .. " + SHIFT + CTRL + Right", hl.dsp.window.move({ direction = "r" })) +hl.bind(mod .. " + SHIFT + CTRL + Up", hl.dsp.window.move({ direction = "u" })) +hl.bind(mod .. " + SHIFT + CTRL + Down", hl.dsp.window.move({ direction = "d" })) +hl.bind(mod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" })) +hl.bind(mod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" })) +hl.bind(mod .. " + V", hl.dsp.exec_cmd("cliphist list | rofi -dmenu| cliphist decode | wl-copy")) +hl.bind(mod .. " + B", hl.dsp.exec_cmd("hyprkeys -bkr | rofi -dmenu")) +hl.bind(mod .. " + S", hl.dsp.workspace.toggle_special("")) +hl.bind(mod .. " + ALT + S", hl.dsp.window.move({ workspace = "special" })) +hl.bind(mod .. " + A", hl.dsp.layout("move -col")) +hl.bind(mod .. " + D", hl.dsp.layout("move +col")) +hl.bind(mod .. " + T", hl.dsp.exec_cmd(term)) +hl.bind(mod .. " + E", hl.dsp.exec_cmd(file)) +hl.bind(mod .. " + F", hl.dsp.exec_cmd(browser)) +hl.bind(mod .. " + N", hl.dsp.exec_cmd(notes)) +hl.bind(mod .. " + SHIFT + A", hl.dsp.exec_cmd("caelestia shell drawers toggle launcher")) +hl.bind(mod .. " + Q", close_or_move_special) +hl.bind("CTRL + ALT + W", hl.dsp.exec_cmd("caelestia shell drawers toggle sidebar")) +hl.bind(mod .. " + L", hl.dsp.exec_cmd("caelestia shell lock lock")) +hl.bind("F11", hl.dsp.exec_cmd("caelestia screenshot")) +hl.bind(mod .. " + SHIFT + S", hl.dsp.exec_cmd("caelestia shell picker open")) +hl.bind(mod .. " + CTRL + 6", close_other_windows) +hl.bind("CTRL + ALT + 7", hl.dsp.exec_cmd("custom-performance")) +hl.bind("CTRL + ALT + 1", hl.dsp.exec_cmd("caelestia shell drawers toggle sidebar")) +hl.bind(mod .. " + CTRL + 4", hl.dsp.exec_cmd("caelestia shell notifs toggleDnd")) +hl.bind(mod .. " + CTRL + 3", hl.dsp.exec_cmd("pavucontrol")) +hl.bind("CTRL + SHIFT + ALT + 0", hl.dsp.exec_cmd("kitty --hold --class \"custom-changeAudioOutput\" --name \"Select audio output\" zsh -c \"custom-changeAudioOutput\"")) +hl.bind(mod .. " + CTRL + 5", hl.dsp.exec_cmd("gnome-characters")) +hl.bind("CTRL + ALT + 8", hl.dsp.exec_cmd("hyprpicker | tee >(wl-copy) | cliphist store")) +hl.bind("CTRL + ALT + 0", hl.dsp.exec_cmd("custom-tomato")) +hl.bind("CTRL + ALT + 2", hl.dsp.exec_cmd("custom-bottom")) +hl.bind("CTRL + ALT + 9", hl.dsp.exec_cmd("anki")) + +hl.bind(mod .. " + SHIFT + Right", hl.dsp.window.resize({ x = 30, y = 0, relative = true }), { repeating = true }) +-- TODO: manual review on line 93 — resizeactive: expected 'X Y' or 'X% Y%', got "-30" +-- hl.bind("SUPER + SHIFT + Left", hl.dsp.resizeactive(-30, 0), { repeating = true }) +hl.bind(mod .. " + SHIFT + Up", hl.dsp.window.resize({ x = 0, y = -30, relative = true }), { repeating = true }) +-- TODO: manual review on line 95 — resizeactive: expected 'X Y' or 'X% Y%', got "m 0 30" +-- hl.bind("SUPER + SHIFT + Down", hl.dsp.resizeactive("m 0 30"), { repeating = true }) + +hl.bind("F2", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ -10%"), { locked = true, repeating = true }) +hl.bind("F3", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ +10%"), { locked = true, repeating = true }) +hl.bind("F7", hl.dsp.exec_cmd("brightnessctl s 10%-"), { locked = true, repeating = true }) +hl.bind("F8", hl.dsp.exec_cmd("brightnessctl s +10%"), { locked = true, repeating = true }) + +hl.bind("F1", hl.dsp.exec_cmd("pactl set-sink-mute @DEFAULT_SINK@ toggle"), { locked = true }) +hl.bind("F5", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) +hl.bind("F4", hl.dsp.exec_cmd("playerctl previous"), { locked = true }) +hl.bind("F6", hl.dsp.exec_cmd("playerctl next"), { locked = true }) + +hl.bind(mod .. " + mouse:272", hl.dsp.window.drag()) +hl.bind(mod .. " + mouse:273", hl.dsp.window.resize()) +hl.bind(mod .. " + Z", hl.dsp.window.drag()) +hl.bind(mod .. " + X", hl.dsp.window.resize()) + +hl.env("XDG_CURRENT_DESKTOP", "Hyprland") +hl.env("XDG_SESSION_TYPE", "wayland") +hl.env("XDG_SESSION_DESKTOP", "Hyprland") +hl.env("QT_QPA_PLATFORM", "wayland;xcb") +hl.env("QT_QPAPLATFORMTHEME", "qt6ct") +hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1") +hl.env("MOZ_ENABLE_WAYLAND", "1") +hl.env("GDK_SCALE", "1") + +hl.gesture({ + fingers = 3, + direction = "horizontal", + action = "scroll_move", +}) + +hl.gesture({ + fingers = 2, + direction = "pinch", + action = "cursor_zoom", + mode = "live", +}) + +--hl.layer_rule({ +-- match = { namespace = "ignore_alpha 0" }, + -- TODO: manual review — unmapped layer rule: "blur on" + -- TODO: manual review — unmapped layer rule: "blur on" + -- TODO: manual review — unmapped layer rule: "blur on" + -- TODO: manual review — unmapped layer rule: "blur on" +--}) + +--hl.layer_rule({ +-- match = { namespace = "match:namespace logout_dialog" }, + -- TODO: manual review — unmapped layer rule: "blur on" +--) + +hl.monitor({ + output = "eDP-1", + mode = "highres@highrr", + position = "0x0", + scale = "1", +}) + +hl.monitor({ + output = "HDMI-A-1", + mode = "highres2highrr", + position = "auto-left", + scale = "1", +}) + +-- TODO: manual review — plugin section 'dynamic-cursors'. The new Lua API exposes plugins via hl.plugin.(...) — wire up per the plugin's docs. +--[[ + rotate { ... } + shake { ... } + enabled = true + mode = rotate + threshold = 2 +]] + +-- TODO: manual review — plugin section 'overview'. The new Lua API exposes plugins via hl.plugin.(...) — wire up per the plugin's docs. +--[[ + disableBlur = true + disableGestures = true + showEmptyWorkspace = true + workspaceActiveBorder = rgb(ab7746) +]] + +hl.window_rule({ + match = { + class = "^(firefox)$", + }, + opacity = "0.90 0.90", +}) + +hl.window_rule({ + match = { + class = "^(Brave-browser)$", + }, + opacity = "0.90 0.90", +}) + +hl.window_rule({ + match = { + class = "^(code-oss)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(Code)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(code-url-handler)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(code-insiders-url-handler)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(kitty)$", + }, + opacity = "0.75 0.75", +}) + +hl.window_rule({ + match = { + class = "^(org.kde.dolphin)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(org.kde.ark)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(nwg-look)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(qt5ct)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(qt6ct)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(kvantummanager)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(org.pulseaudio.pavucontrol)$", + }, + opacity = "0.80 0.70", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(blueman-manager)$", + }, + opacity = "0.80 0.70", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(nm-applet)$", + }, + opacity = "0.80 0.70", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(nm-connection-editor)$", + }, + opacity = "0.80 0.70", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(org.kde.polkit-kde-authentication-agent-1)$", + }, + opacity = "0.80 0.70", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(polkit-gnome-authentication-agent-1)$", + }, + opacity = "0.80 0.70", +}) + +hl.window_rule({ + match = { + class = "^(org.freedesktop.impl.portal.desktop.gtk)$", + }, + opacity = "0.80 0.70", +}) + +hl.window_rule({ + match = { + class = "^(org.freedesktop.impl.portal.desktop.hyprland)$", + }, + opacity = "0.80 0.70", +}) + +hl.window_rule({ + match = { + class = "^([Ss]team)$", + }, + opacity = "0.70 0.70", +}) + +hl.window_rule({ + match = { + class = "^(steamwebhelper)$", + }, + opacity = "0.70 0.70", +}) + +hl.window_rule({ + match = { + class = "^(Spotify)$", + }, + opacity = "0.70 0.70", +}) + +hl.window_rule({ + match = { + initial_title = "^(Spotify Free)$", + }, + opacity = "0.70 0.70", +}) + +hl.window_rule({ + match = { + class = "^(com.github.rafostar.Clapper)$", + }, + opacity = "0.90 0.90", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(com.github.tchx84.Flatseal)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(hu.kramo.Cartridges)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(com.obsproject.Studio)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(gnome-boxes)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(discord)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(WebCord)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(ArmCord)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(app.drey.Warp)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(net.davidotek.pupgui2)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(yad)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(Signal)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(io.github.alainm23.planify)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(io.gitlab.theevilskeleton.Upscaler)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(com.github.unrud.VideoDownloader)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(io.gitlab.adhami3310.Impression)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(io.missioncenter.MissionCenter)$", + }, + opacity = "0.80 0.80", + float = true, +}) + +hl.window_rule({ + match = { + class = "^(io.github.flattool.Warehouse)$", + }, + opacity = "0.80 0.80", +}) + +hl.window_rule({ + match = { + class = "^(org.kde.dolphin)$", + title = "^(Progress Dialog — Dolphin)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(org.kde.dolphin)$", + title = "^(Copying — Dolphin)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(firefox)$", + title = "^(Picture-in-Picture)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(firefox)$", + title = "^(Library)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(kitty)$", + title = "^(top)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(kitty)$", + title = "^(btop)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(kitty)$", + title = "^(htop)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(vlc)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(eog)$", + }, + float = true, +}) + +hl.window_rule({ + match = { + class = "^(custom-browserprofiles)$", + }, + float = true, + size = "400 225", +}) + +hl.window_rule({ + match = { + class = "^(custom-changeAudioOutput)$", + }, + float = true, + size = "1050 200", +}) + +hl.window_rule({ + match = { + class = "^(custom-obsidianvaults)$", + }, + float = true, + size = "400 175", +}) + +hl.window_rule({ + match = { + initial_class = "^(custom-pomodoro)$", + }, + float = true, + size = "600 600", +}) + +hl.window_rule({ + match = { + initial_class = "^(custom-bottom)$", + }, + float = true, + size = "1500 800", +}) + +hl.workspace_rule({ + workspace = "1", + layout = "master", +}) + +hl.workspace_rule({ + workspace = "2", + layout = "scrolling", +}) + +hl.workspace_rule({ + workspace = "special", + layout = "scrolling", +}) + +-- TODO: manual review — top-level key 'splash = true' has no enclosing section +hl.config({ + animations = { + enabled = true, + }, + decoration = { + blur = { + enabled = true, + ignore_opacity = true, + new_optimizations = true, + passes = 2, + size = 4, + special = true, + }, + dim_special = 0.300000, + rounding = 18, + }, + dwindle = { + preserve_split = true, + }, + general = { + border_size = 4, + col = { + active_border = { colors = { "rgba(ca6702ff)", "rgba(ecd3a0ff)" }, angle = 45 }, + inactive_border = { colors = { "rgba(f1dca7d9)", "rgba(ffe1a8d9)" }, angle = 45 }, + }, + gaps_in = 5, + gaps_out = 15, + layout = "dwindle", + resize_on_border = true, + }, + group = { + col = { + border_active = { colors = { "rgba(ca6702ff)", "rgba(ecd3a0ff)" }, angle = 45 }, + border_inactive = { colors = { "rgba(f1dca7d9)", "rgba(ffe1a8d9)" }, angle = 45 }, + border_locked_active = { colors = { "rgba(ca6702ff)", "rgba(ecd3a0ff)" }, angle = 45 }, + border_locked_inactive = { colors = { "rgba(f1dca7d9)", "rgba(ffe1a8d9)" }, angle = 45 }, + }, + }, + input = { + kb_layout = "ch", + follow_mouse = 1, + force_no_accel = 1, + sensitivity = 0, + }, + misc = { + force_default_wallpaper = 0, + vrr = 0, + }, + scrolling = { + column_width = 0.450000, + }, + xwayland = { + force_zero_scaling = true, + }, +}) + +hl.on("hyprland.start", function() + hl.exec_cmd("/nix/store/8kih8alkk4qzgjchg5501r1c3a8a71aw-dbus-1.16.2/bin/dbus-update-activation-environment --systemd DISPLAY HYPRLAND_INSTANCE_SIGNATURE WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE && systemctl --user stop hyprland-session.target && systemctl --user start hyprland-session.target") + hl.exec_cmd("qtbatticon") + hl.exec_cmd("source /run/agenix/ntfy && nixpkgs-notifier listen") + hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP") + hl.exec_cmd("dbus-update-activation-environment --systemd --all") + hl.exec_cmd("systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP") + hl.exec_cmd("systemctl --user start xdg-desktop-portal-wlr.service") + hl.exec_cmd("blueman-applet") + hl.exec_cmd("udiskie --no-automount --smart-tray") + hl.exec_cmd("nm-applet --indicator") + hl.exec_cmd("rm -rf ~/.cache/cliphist/ && wl-paste --type text --watch cliphist store & wl-paste --type image --watch cliphist store") + hl.exec_cmd("custom-batterynotify") + hl.exec_cmd("custom-batterywarning") + hl.exec_cmd("awww img WALLPAPER/PATH/PLACEHOLDER") + hl.exec_cmd("awww-daemon") + hl.exec_cmd("sleep 1 && custom-wallpaper") + hl.exec_cmd("custom-checkKdrive && custom-mountkdrive") + hl.exec_cmd("custom-gitnotify") + hl.exec_cmd("sleep 4 & caelestia-shell") + hl.exec_cmd("sleep 20 && ngcp pull --automatic") +end) +-- host specific config +require("host")