hyprland: migrated from hyprlang to lua

- all hyprlandScripts were migrated to lua functions
- hyprland.nix just handles the host specific and replacing the
  placeholders from hyprland.lua
This commit is contained in:
tomasr committed 2026-08-14 09:25:17 +02:00
1 parent 6f342a6338
commit 206780c3f9
5 files changed
+1164 -578

No files matched your search

+60 -479
View File
@@ -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,39 +34,65 @@
# 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 = {
home.file.".config/hypr/host.lua" = {
text = ''
hl.monitor({
output = "",
mode = "preferred",
position = "auto",
scale = 0.75,
})
'';
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 = {pkgs-unstable, ...}: let
wallpaper = ../../assets/wallpaper1.jpg;
in {
};
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;
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;
@@ -79,449 +102,7 @@
#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"
];
};
# █▀▀ █▄░█ █░█
# ██▄ █░▀█ ▀▄▀
# 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"
];
# █ █▄░█ █▀█ █░█ ▀█▀
# █ █░▀█ █▀▀ █▄█ ░█░
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;
};
}
-99
View File
@@ -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
'';
};
};
}
+1
View File
@@ -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/).
+299
View File
@@ -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
+804
View File
@@ -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.<name>(...) — 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.<name>(...) — 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")