summaryrefslogtreecommitdiff
path: root/dot-config/hypr
diff options
context:
space:
mode:
Diffstat (limited to 'dot-config/hypr')
-rw-r--r--dot-config/hypr/.luarc.json15
-rw-r--r--dot-config/hypr/autostart.lua122
-rw-r--r--dot-config/hypr/bg.conf2
-rw-r--r--dot-config/hypr/binds.lua234
-rw-r--r--dot-config/hypr/colors.conf40
-rw-r--r--dot-config/hypr/cursor.lua9
-rw-r--r--dot-config/hypr/decor.lua121
-rw-r--r--dot-config/hypr/decor.luabAial9.bck107
-rw-r--r--dot-config/hypr/env.lua76
-rw-r--r--dot-config/hypr/group.lua23
-rw-r--r--dot-config/hypr/hyprland.conf6
-rw-r--r--dot-config/hypr/hyprland.lua106
-rw-r--r--dot-config/hypr/hyprlandd.lua393
-rw-r--r--dot-config/hypr/hyprtoolkit.conf14
-rw-r--r--dot-config/hypr/input.lua18
-rw-r--r--dot-config/hypr/layout.lua27
-rw-r--r--dot-config/hypr/misc.lua28
-rw-r--r--dot-config/hypr/perms.lua36
-rw-r--r--dot-config/hypr/render.lua11
-rw-r--r--dot-config/hypr/rules.lua280
-rw-r--r--dot-config/hypr/vars.lua26
21 files changed, 1663 insertions, 31 deletions
diff --git a/dot-config/hypr/.luarc.json b/dot-config/hypr/.luarc.json
new file mode 100644
index 00000000..ac416b5f
--- /dev/null
+++ b/dot-config/hypr/.luarc.json
@@ -0,0 +1,15 @@
+{
+ "workspace": {
+ "library": [
+ "/usr/share/hypr/stubs"
+ ]
+ },
+ "diagnostics": {
+ "globals": [
+ "hl",
+ "vars",
+ "color",
+ "colors"
+ ]
+ }
+} \ No newline at end of file
diff --git a/dot-config/hypr/autostart.lua b/dot-config/hypr/autostart.lua
new file mode 100644
index 00000000..6777954b
--- /dev/null
+++ b/dot-config/hypr/autostart.lua
@@ -0,0 +1,122 @@
+hl.on("hyprland.start", function()
+ --
+ -- AUTOSTART --
+ --
+
+ -- Autostart necessary processes (like notifications daemons, status bars, etc.)
+ -- Or execute your favorite apps at launch like this:
+
+ -- FIX CURSOR because keep reseting(see: https://www.reddit.com/r/hyprland/comments/1fgfmqb/gtk_apps_not_respecting_cursor_theme/)
+ -- hl.exec_cmd('gsettings set org.gnome.desktop.interface cursor-theme Bibata-Modern-Classic')
+ -- hl.exec_cmd('hyprctl setcursor Bibata-Modern-Classic 24')
+
+ -- Launch hyprland plugins
+ hl.exec_cmd('hyprpm reload || hyprpm update')
+ -- Start pyprland daemon
+ -- hl.exec_cmd('pyprland')
+
+ -- Waybar
+ -- hl.exec_cmd('waybar')
+ -- Quickshell
+ hl.exec_cmd('qs -d')
+ -- Hypr-Eco
+ -- hl.exec_cmd('hyprpaper')
+ -- hl.exec_cmd($'SCRIPTSDIR/hyprpaper.sh')
+ hl.exec_cmd(vars.bgChangerBin)
+ -- hl.exec_cmd($'SCRIPTSDIR/mpvpaper.sh')
+ hl.exec_cmd('hypridle')
+
+ hl.exec_cmd('hyprsunset')
+
+ -- XWayland
+ hl.exec_cmd('xrdb -merge ~/.Xresources')
+
+ -- Auth agent
+ -- hl.exec_cmd('systemctl --user start plasma-polkit-agent -- doesnt respect themeing')
+ -- hl.exec_cmd(/'usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1')
+ hl.exec_cmd('systemctl --user start hyprpolkitagent')
+ -- keyring agent
+ hl.exec_cmd('gnome-keyring-daemon --start --components=pkcs11,secrets,ssh')
+ -- Location service
+ hl.exec_cmd('/usr/lib/geoclue-2.0/demos/agent &')
+ -- input method
+ hl.exec_cmd('fcitx5 -d')
+ -- app armor notifications
+ hl.exec_cmd('aa-notify -p -s 1 -w 60 -f /var/log/audit/audit.log')
+
+ -- Clipboard history
+ -- hl.exec_cmd('wl-paste --watch cliphist store')
+ hl.exec_cmd('wl-paste --type text --watch cliphist store')
+ hl.exec_cmd('wl-paste --type image --watch cliphist store')
+ -- hl.exec_cmd('clipsync')
+ -- hl.exec_cmd('wl-clip-persist --clipboard regular')
+
+ -- Notification agent
+ hl.exec_cmd('while true; do swaync; done')
+
+ -- window swicher daemon
+ hl.exec_cmd('hyprswitch init --size-factor 5')
+
+ -- audio auto adjust
+ -- hl.exec_cmd($'HOME/scripts/audio-autoAdjust.sh --daemon')
+ hl.exec_cmd('while true; do $HOME/.cargo/bin/audio-adjuster; done')
+
+ -- effect for audio
+ hl.exec_cmd('while true; do easyeffects --gapplication-service; done')
+
+ -- startup sound
+ hl.exec_cmd('$HOME/scripts/startupsound.sh')
+
+ -- misc
+ -- sys hud
+ -- hl.exec_cmd('syshud -M audio_in,audio_out,brightness -b /sys/bus/ddcci/devices/ddcci13/backlight/ddcci13/')
+ hl.exec_cmd('syshud')
+ -- night light
+ -- hl.exec_cmd('gammastep -l geoclue2')
+ hl.exec_cmd('$HOME/scripts/hyprsunset.sh')
+ hl.exec_cmd('systemd-inhibit --who="Hyprland" --why="Handling power key" --what=handle-power-key sleep infinity')
+
+ -- user applications
+ hl.exec_cmd('udiskie')
+ hl.exec_cmd('bitwarden-desktop')
+ -- hl.exec_cmd('kdeconnectd')
+ -- hl.exec_cmd('killall input-leap input-leaps; input-leap -- works with https://github.com/3l0w/Hyprland/tree/feat/input-capture-impl')
+ hl.exec_cmd('nextcloud --background')
+ -- hl.exec_cmd(['noinitialfocus; workspace, special] localsend --hidden')
+ -- hl.exec_cmd(['workspace 6 silent; noinitialfocus] discord --start-minimized')
+ hl.exec_cmd('beeper $waylandarg --no-sandbox --hidden --default-frame --enable-wayland-ime')
+ -- hl.exec_cmd('bash -c "echo 'ddcci 0x37' | sudo tee /sys/bus/i2c/devices/i2c-13/new_device"')
+
+ -- Notify if stuff is already started
+ hl.exec_cmd("warp-cli status | grep Connect && notify-send 'warp-vpn' 'connected'")
+ hl.exec_cmd(
+ "pactl get-source-mute @DEFAULT_SOURCE@ | grep 'Mute: yes' >/dev/null && notify-send 'microphone' 'muted'")
+ hl.exec_cmd("modprobe uvcvideo || notify-send 'uvcvideo' 'disabled'")
+ hl.exec_cmd("pgrep -f gpu-screen-recorder && notify-send 'recorder' 'recording'")
+
+ -- restore session
+ hl.exec_cmd('hyprsession')
+
+ -- restore stuff like music etc
+ hl.exec_cmd(vars.SCRIPTSDIR .. '/hypridle.sh --stopidle')
+
+ -- spam of notification at start(e.g. chromium)
+ hl.exec_cmd(
+ 'if [[ $(swaync-client --get-dnd) == "false" ]]; then swaync-client --dnd-on && sleep 3 && swaync-client --dnd-off; fi')
+ -- thunar launch faster
+ hl.exec_cmd('while true; do thunar --daemon; done')
+
+ -- alacritty
+ -- hl.exec_cmd('while true; do alacritty --daemon; done')
+
+ -- ghostty
+ -- hl.exec_cmd(['workspace, special] ghostty')
+
+ -- backlight
+ -- hl.exec_cmd('wf-recorder --muxer=v4l2 --codec=rawvideo --file=/dev/video9 -x yuv420p')
+ hl.exec_cmd('while true; do hyperhdr; done')
+ -- hl.exec_cmd('video-guard')
+
+ hl.exec_cmd('while true; do ~/scripts/flipper-ac.py "$(nc -lp 4883)"; done')
+ hl.exec_cmd('while true; do nc -lp 4884 -e "~/scripts/flipper-ac.py statusBool"; done')
+end)
diff --git a/dot-config/hypr/bg.conf b/dot-config/hypr/bg.conf
index 87e649ca..a0d24de3 100644
--- a/dot-config/hypr/bg.conf
+++ b/dot-config/hypr/bg.conf
@@ -1 +1 @@
-$bg = /home/system/Pictures/wallpapers/a_train_tracks_in_a_foggy_day.jpg
+$bg = /home/system/Pictures/wallpapers/geowaves.png
diff --git a/dot-config/hypr/binds.lua b/dot-config/hypr/binds.lua
new file mode 100644
index 00000000..2a11eed4
--- /dev/null
+++ b/dot-config/hypr/binds.lua
@@ -0,0 +1,234 @@
+hl.config({
+ binds = {
+ -- allow_workspace_cycles = yes
+ -- movefocus_cycles_fullscreen = true
+ allow_pin_fullscreen = true,
+ scroll_event_delay = 0,
+ },
+
+})
+
+-- See https://wiki.hyprland.org/Configuring/Keywords/
+local mod = "SUPER" -- Sets "SUPER" key as main modifier
+
+-- Launching...
+hl.bind(mod .. " + return", hl.dsp.exec_cmd(vars.termLaunch))
+hl.bind(mod .. " + SHIFT + return", hl.dsp.exec_cmd(vars.termfloat))
+-- bind = mod space, return, execr, $terminal start --class pseudo
+hl.bind(mod .. " + ALT + Delete", hl.dsp.exec_cmd(vars.rofiexec .. "/rofi_powermenu"))
+hl.bind("ALT + F1", hl.dsp.exec_cmd("qs ipc call launcher toggle"))
+hl.bind("ALT + F2", hl.dsp.exec_cmd(vars.rofiexec .. "/rofi_runner"))
+hl.bind("ALT + F4", hl.dsp.exec_cmd(vars.rofiexec .. "/sgpt"))
+-- bind = mod, period, execr, $rofiexec/rofi_emoji
+hl.bind(mod .. " + period", hl.dsp.exec_cmd("qs ipc call launcher standalone Emoji"))
+-- utils
+hl.bind(mod .. " + C", hl.dsp.exec_cmd(vars.rofiexec .. "/rofi_configs"))
+-- bind = mod, m, execr, $rofiexec/rofi_music
+hl.bind(mod .. " + N", hl.dsp.exec_cmd("nmd"))
+-- bind = mod, r, execr, $rofiexec/rofi_asroot
+-- bind = mod, s, execr, $rofiexec/rofi_screenshot
+-- bind = mod, v, execr, $rofiexec/rofi_clipboard
+hl.bind(mod .. " + V", hl.dsp.exec_cmd("qs ipc call launcher standalone Clip"))
+-- bind = mod, w, execr, $rofiexec/rofi_windows
+-- bind = mod, x, execr, $rofiexec/rofi_powermenu
+-- bind = mod, b, execr, $rofiexec/rofi_bluetooth
+-- GUI
+hl.bind(mod .. " + SHIFT + F", hl.dsp.exec_cmd(vars.fileManager))
+-- bind = mod shift, w, execr, $browser --restore-last-session
+hl.bind(mod .. " + SHIFT + W", hl.dsp.exec_cmd(vars.browser .. " -new-tab about:sessionrestore"))
+hl.bind(mod .. " + SHIFT + E", hl.dsp.exec_cmd("zeditor"))
+hl.bind(mod .. " + SHIFT + D", hl.dsp.exec_cmd("discord " .. vars.waylandarg))
+hl.bind(mod .. " + SHIFT + B", hl.dsp.exec_cmd("beeper " .. vars.waylandarg))
+-- CLI
+hl.bind("CTRL + ALT + A", hl.dsp.exec_cmd(vars.termfloat .. " --title=pulsemixer -e pulsemixer"))
+hl.bind("CTRL + ALT + R", hl.dsp.exec_cmd(vars.termfloat .. " --title=ranger -e ranger"))
+hl.bind("CTRL + ALT + V", hl.dsp.exec_cmd(vars.termfloat .. " -e " .. vars.editor))
+
+-- Emergency
+hl.bind("CTRL + ALT + B", hl.dsp.exec_cmd(vars.termfloat .. " --title=btop -e sudo nice -n -20 ionice -c 1 sudo btop"),
+ { transparent = true, bypass = true })
+hl.bind("CTRL + ALT + Delete", hl.dsp.exec_cmd("$HOME/scripts/hyprshutdown.sh"), { transparent = true, bypass = true })
+hl.bind("CTRL + SHIFT + Escape", hl.dsp.exec_cmd("missioncenter"), { transparent = true, bypass = true })
+
+-- Misc
+-- bind = ctrl alt, m, execr, music
+hl.bind(mod .. " + P", hl.dsp.exec_cmd("hyprpicker --autocopy"))
+hl.bind("CTRL + ALT + L", hl.dsp.exec_cmd("loginctl lock-session"), { transparent = true, bypass = true })
+-- Misc
+hl.bind(mod .. " + SHIFT + G", hl.dsp.exec_cmd("gtk-launch shortwave.desktop"))
+-- bind = mod shift, c, execr, gtk-launch google-chat.desktop
+
+-- XF86 keys & Misc
+-- hl.bind("XF86Print", hl.dsp.exec_cmd("pidof slurp || $HOME/scripts/sysutil.sh screenshot --now"))
+hl.bind(mod .. " + SHIFT + S", hl.dsp.exec_cmd("$HOME/scripts/sysutil.sh screenshot --area"))
+
+-- Volume
+hl.bind("XF86AudioRaiseVolume",
+ hl.dsp.exec_cmd(
+ "wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 & wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && pw-play /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga"),
+ { repeating = true })
+hl.bind("XF86AudioLowerVolume",
+ hl.dsp.exec_cmd(
+ "wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 & wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && pw-play /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga"),
+ { repeating = true })
+hl.bind("XF86AudioMute",
+ hl.dsp.exec_cmd(
+ "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pw-play /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga"))
+hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"))
+hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl position 5+"))
+hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl -p spotify next"), { long_press = true })
+hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl position 5-"))
+hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl -p spotify previous"), { long_press = true })
+hl.bind("XF86AudioPlay",
+ hl.dsp.exec_cmd(
+ "[workspace 7 silent; noinitialfocus] playerctl -p spotify play-pause || LD_PRELOAD=/usr/lib/spotify-adblock.so spotify"),
+ { locked = true })
+-- bindl = ,XF86AudioPlay, exec, [workspace 7 silent; noinitialfocus] playerctl -p chromium play-pause || /opt/Aonsoku/aonsoku
+hl.bind("XF86AudioPlay",
+ hl.dsp.exec_cmd(
+ "[workspace 7 silent; noinitialfocus] playerctl --all-players pause || LD_PRELOAD=/usr/lib/spotify-adblock.so spotify"),
+ { locked = true, long_press = true })
+-- bindol = ,XF86AudioPlay, exec, [workspace 7 silent; noinitialfocus] playerctl --all-players pause || /opt/Aonsoku/aonsoku
+hl.bind("XF86AudioStop", hl.dsp.exec_cmd("playerctl -p spotify stop"))
+hl.bind("XF86PowerOff", hl.dsp.exec_cmd("$HOME/scripts/hyprshutdown.sh"))
+
+-- Pause
+hl.bind(mod .. " + Pause", hl.dsp.exec_cmd("hyprfreeze -s -a"))
+
+-- Print
+hl.bind("Print", hl.dsp.exec_cmd("$HOME/scripts/hyprshot --now"))
+
+-- Brightness
+hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("$HOME/scripts/sysutil.sh brightness --inc"), { repeating = true })
+hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("$HOME/scripts/sysutil.sh brightness --dec"), { repeating = true })
+-- binde = ,XF86MonBrightnessUp, execr, hyprctl hyprsunset gamma +5
+-- binde = ,XF86MonBrightnessDown, execr, hyprctl hyprsunset gamma -5
+
+-- Window management
+hl.bind(mod .. " + D", hl.dsp.window.move({ workspace = "special:minimized", follow = false }))
+hl.bind(mod .. " + I", hl.dsp.workspace.toggle_special("minimized"))
+hl.bind(mod .. " + I", hl.dsp.window.move({ workspace = "+0" }))
+hl.bind(mod .. " + Q", hl.dsp.window.close(), { repeating = true })
+hl.bind(mod .. " + SHIFT + Q", hl.dsp.window.close({ force = true }))
+hl.bind("CTRL + ALT + Escape", hl.dsp.exec_cmd("hyprctl kill"))
+hl.bind("CTRL + " .. mod .. " + SHIFT + R", hl.dsp.exec_cmd("hyprctl reload"))
+
+-- restart bar
+hl.bind("CTRL + " .. mod .. " + Escape", hl.dsp.exec_cmd("qs ipc call qs reload false || qs &"))
+
+-- reload wall
+hl.bind(mod .. " + ALT + B",
+ hl.dsp.exec_cmd("killall wallust " .. vars.bgChangerBin .. " " .. vars.bgChanger .. "; " .. vars.bgChangerBin))
+-- hl.bind("CTRL + " .. mod .. " + ALT + up", hl.dsp.scroller("jump"))
+
+-- hyprswitch
+hl.bind("ALT + Tab",
+ hl.dsp.exec_cmd(
+ "hyprswitch gui --mod-key alt_l --key tab --close mod-key-release --reverse-key=key=grave && hyprswitch dispatch"))
+hl.bind("ALT + grave",
+ hl.dsp.exec_cmd(
+ "hyprswitch gui --mod-key alt_l --key tab --close mod-key-release --reverse-key=key=grave && hyprswitch dispatch -r"))
+
+hl.bind("CTRL + ALT + left", hl.dsp.focus({ workspace = "-1" }), { repeating = true })
+hl.bind("CTRL + ALT + right", hl.dsp.focus({ workspace = "+1" }), { repeating = true })
+hl.bind(mod .. " + SHIFT + H", hl.dsp.layout("swapcol l"), { repeating = true })
+hl.bind(mod .. " + SHIFT + L", hl.dsp.layout("swapcol r"), { repeating = true })
+hl.bind(mod .. " + SHIFT + K", hl.dsp.window.move({ direction = "u" }), { repeating = true })
+hl.bind(mod .. " + SHIFT + J", hl.dsp.window.move({ direction = "d" }), { repeating = true })
+
+hl.bind("CTRL + " .. mod .. " + ALT + space", hl.dsp.layout("fit active"), { repeating = true })
+
+hl.bind("CTRL + " .. mod .. " + SHIFT + H", hl.dsp.layout("colresize -conf"), { repeating = true })
+hl.bind("CTRL + " .. mod .. " + SHIFT + L", hl.dsp.layout("colresize +conf"), { repeating = true })
+
+-- fixme
+-- hl.bind("CTRL + " .. mod .. " + SHIFT + J", hl.dsp.window.resize({ x = "0%", y = "50%", relative = true }),
+-- { repeating = true })
+-- hl.bind("CTRL + " .. mod .. " + SHIFT + K", hl.dsp.window.resize({ x = "0%", y = "-50%", relative = true }),
+-- { repeating = true })
+
+-- hl.bind(mod .. " + CTRL + H", hl.dsp.group.move_into_or_create({ direction = "l" }), { repeating = true })
+-- hl.bind(mod .. " + CTRL + L", hl.dsp.group.move_into_or_create({ direction = "r" }), { repeating = true })
+-- hl.bind(mod .. " + ALT + H", hl.dsp.group.move_out({ direction = "r" }), { repeating = true })
+-- hl.bind(mod .. " + ALT + L", hl.dsp.group.move_out({ direction = "l" }), { repeating = true })
+
+-- zoom
+local function update_zoom(multiplier)
+ local current_zoom = hl.get_config("cursor.zoom_factor")
+ local new_zoom = current_zoom * multiplier
+ if new_zoom < 1.0 then
+ new_zoom = 1.0
+ end
+ hl.config({
+ cursor = {
+ zoom_factor = new_zoom
+ }
+ })
+end
+
+local function reset_zoom()
+ hl.config({
+ cursor = {
+ zoom_factor = 1.0
+ }
+ })
+end
+
+hl.bind("SUPER + mouse_down", function() update_zoom(1.1) end)
+hl.bind("SUPER + mouse_up", function() update_zoom(0.9) end)
+
+hl.bind("SUPER + equal", function() update_zoom(1.1) end, { repeating = true })
+hl.bind("SUPER + minus", function() update_zoom(0.9) end, { repeating = true })
+
+hl.bind("SUPER + SHIFT + minus", reset_zoom)
+hl.bind("SUPER + SHIFT + equal", reset_zoom)
+hl.bind("SUPER + SHIFT + mouse_down", reset_zoom)
+hl.bind("SUPER + SHIFT + mouse_up", reset_zoom)
+-- spotify lyrics ig
+-- bind = mod shift, u, execr, $SCRIPTSDIR/togglespot.sh
+
+-- window shortcuts
+hl.bind(mod .. " + F", hl.dsp.window.fullscreen())
+hl.bind("CTRL + ALT + F", hl.dsp.window.fullscreen({ state = 1 }))
+hl.bind(mod .. " + space", hl.dsp.window.float({ action = "toggle" }))
+hl.bind(mod .. " + SHIFT + space", hl.dsp.window.pseudo()) -- dwindle
+hl.bind(mod .. " + SHIFT + M", hl.dsp.layout("togglesplit")) -- dwindle
+hl.bind(mod .. " + S", hl.dsp.window.pin())
+
+-- Move focus with mainMod + arrow keys
+hl.bind("CTRL + " .. mod .. " + K", hl.dsp.focus({ window = "floating" }))
+hl.bind("CTRL + " .. mod .. " + J", hl.dsp.focus({ window = "tiled" }))
+-- Move focus with mainMod + arrow keys / vim binds
+local focus_dirs = { h = "l", l = "r", k = "u", j = "d" }
+for k, v in pairs(focus_dirs) do
+ hl.bind(mod .. " + " .. string.upper(k), hl.dsp.focus({ direction = v }), { repeating = true })
+end
+
+hl.bind("CTRL + " .. mod .. " + K", hl.dsp.focus({ window = "floating" }))
+hl.bind("CTRL + " .. mod .. " + J", hl.dsp.focus({ window = "tiled" }))
+
+-- Switch workspaces and move active window to a workspace with mod + [0-9]
+for i = 1, 10 do
+ local key = i % 10
+ hl.bind(mod .. " + " .. key, hl.dsp.focus({ workspace = i }))
+ hl.bind(mod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i, silent = (i == 10) and true or nil }))
+end
+
+-- Move/resize windows with mainMod + LMB/RMB and dragging
+hl.bind(mod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
+hl.bind(mod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
+
+-- Autoclicker binds
+local autoclickers = {
+ { bind = "mouse:276", name = "left", args = "" },
+ { bind = "mouse:275", name = "right", args = " right" }
+}
+
+for _, ac in ipairs(autoclickers) do
+ hl.bind(ac.bind,
+ hl.dsp.exec_cmd("exec -a autoclicker-" ..
+ ac.name .. " zsh -c 'while true; do wlrctl pointer click" .. ac.args .. "; sleep $((0.$RANDOM/10)); done'"),
+ { ignore_mods = true })
+ hl.bind(ac.bind, hl.dsp.exec_cmd("kill $(pgrep -f autoclicker-" .. ac.name .. ")"),
+ { ignore_mods = true, release = true })
+end
diff --git a/dot-config/hypr/colors.conf b/dot-config/hypr/colors.conf
index 0fa10983..989a0da4 100644
--- a/dot-config/hypr/colors.conf
+++ b/dot-config/hypr/colors.conf
@@ -1,20 +1,20 @@
-$wallpaper = /home/system/Pictures/wallpapers/a_train_tracks_in_a_foggy_day.jpg
-$background = rgb(000000)
-$foreground = rgb(D8E4F4)
-$cursor = rgb(9EABBC)
-$color0 = rgb(000000)
-$color1 = rgb(747B83)
-$color2 = rgb(6C788A)
-$color3 = rgb(6F7C8F)
-$color4 = rgb(6A798E)
-$color5 = rgb(7F9BBF)
-$color6 = rgb(90B2DE)
-$color7 = rgb(BFD0E6)
-$color8 = rgb(8692A1)
-$color9 = rgb(747B83)
-$color10 = rgb(6C788A)
-$color11 = rgb(6F7C8F)
-$color12 = rgb(6A798E)
-$color13 = rgb(7F9BBF)
-$color14 = rgb(90B2DE)
-$color15 = rgb(BFD0E6)
+$wallpaper = /usr/share/backgrounds/nature/nature-11.jpg
+$background = rgb(040000)
+$foreground = rgb(F6E5CA)
+$cursor = rgb(AD9B83)
+$color0 = rgb(0F0B05)
+$color1 = rgb(867567)
+$color2 = rgb(877968)
+$color3 = rgb(E06B4D)
+$color4 = rgb(E06B4D)
+$color5 = rgb(BA9359)
+$color6 = rgb(E5B468)
+$color7 = rgb(EAD1AB)
+$color8 = rgb(A49278)
+$color9 = rgb(867567)
+$color10 = rgb(877968)
+$color11 = rgb(E06B4D)
+$color12 = rgb(E06B4D)
+$color13 = rgb(BA9359)
+$color14 = rgb(E5B468)
+$color15 = rgb(EAD1AB)
diff --git a/dot-config/hypr/cursor.lua b/dot-config/hypr/cursor.lua
new file mode 100644
index 00000000..7eca0c19
--- /dev/null
+++ b/dot-config/hypr/cursor.lua
@@ -0,0 +1,9 @@
+hl.config({
+ cursor = {
+ use_cpu_buffer = true,
+ -- no_hardware_cursors = true,
+ no_break_fs_vrr = true,
+ zoom_rigid = true,
+ persistent_warps = true,
+ }
+})
diff --git a/dot-config/hypr/decor.lua b/dot-config/hypr/decor.lua
new file mode 100644
index 00000000..b771e3a5
--- /dev/null
+++ b/dot-config/hypr/decor.lua
@@ -0,0 +1,121 @@
+hl.config({
+ general = {
+ gaps_in = 3,
+ gaps_out = 7,
+ float_gaps = -1,
+ border_size = 3,
+
+ col = {
+ active_border = { colors = { colors.color15, colors.color13, colors.color10, colors.color8, colors.color6, colors.color4, colors.color2, colors.color0, } }, -- angle = 45
+ inactive_border = colors.background,
+ },
+ },
+
+ decoration = {
+ rounding = 7,
+ rounding_power = 10,
+ border_part_of_window = true,
+
+ -- Change transparency of focused and unfocused windows
+ -- active_opacity = 0.95
+ inactive_opacity = 0.85,
+ fullscreen_opacity = 1.0,
+
+ shadow = {
+ enabled = true,
+ range = 15,
+ render_power = 4,
+ -- sharp = true,
+ -- ignore_window = true,
+ color = colors.background,
+ -- color = rgba(1a1a1aee),
+ },
+
+ blur = {
+ enabled = true,
+ -- heavy,
+ size = 5, -- 10,
+ passes = 5, -- 4,
+ -- light,
+ -- size = 8,
+ -- passes = 3,
+ -- noise = 0,
+ -- crazy & cool options,
+ -- brightness = 1,
+ -- contrast = 2,
+ -- vibrancy = 1.5,
+ -- vibrancy_darkness = 1,
+ popups = true,
+ ignore_opacity = true, -- KEEP THIS, THIS MAKE BLUR ACTUALLY BLUR COOL
+ input_methods = true,
+ special = true,
+ },
+ },
+
+ animations = {
+ enabled = true,
+ },
+})
+
+
+-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
+
+-- hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
+
+-- -- Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+-- hl.curve("windowovershot", { type = "bezier", points = { {1, 1}, {0, 1.05} } })
+-- hl.curve("overshot", { type = "bezier", points = { {0.5, 1}, {0, 1.2} } })
+-- hl.curve("sovershot", { type = "bezier", points = { {0.5, 1}, {0, 1.1} } })
+-- -- hl.curve("outsideIn", { type = "bezier", points = { {0.5, 1.1}, {0, 0.9} } })
+-- hl.curve("slow-fast", { type = "bezier", points = { {1, 0.33}, {0.3, 1} } })
+hl.curve("fast-slow", { type = "bezier", points = { { 0.33, 0.8 }, { 0, 1 } } })
+-- hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
+-- -- hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
+-- -- hl.curve("md3_standard", { type = "bezier", points = { {0.2, 0}, {0, 1} } })
+hl.curve("md3_decel", { type = "bezier", points = { { 0.05, 0.7 }, { 0.1, 1 } } })
+-- -- hl.curve("md3_accel", { type = "bezier", points = { {0.3, 0}, {0.8, 0.15} } })
+-- -- hl.curve("overshot", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.1} } })
+-- -- hl.curve("crazyshot", { type = "bezier", points = { {0.1, 1.5}, {0.76, 0.92} } })
+-- -- hl.curve("hyprnostretch", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.0} } })
+-- -- hl.curve("menu_decel", { type = "bezier", points = { {0.1, 1}, {0, 1} } })
+-- -- hl.curve("menu_accel", { type = "bezier", points = { {0.38, 0.04}, {1, 0.07} } })
+-- -- hl.curve("easeInOutCirc", { type = "bezier", points = { {0.85, 0}, {0.15, 1} } })
+-- -- hl.curve("easeOutCirc", { type = "bezier", points = { {0, 0.55}, {0.45, 1} } })
+-- -- hl.curve("easeOutExpo", { type = "bezier", points = { {0.16, 1}, {0.3, 1} } })
+-- -- hl.curve("softAcDecel", { type = "bezier", points = { {0.26, 0.26}, {0.15, 1} } })
+-- hl.curve("md2", { type = "bezier", points = { {0.4, 0}, {0.2, 1} } }) -- use with .2s duration
+
+hl.animation({ leaf = "fade", enabled = true, speed = 4, bezier = "md3_decel" })
+
+-- hl.animation({ leaf = "windows", enabled = true, speed = 3, bezier = "overshot", style = "gnome" })
+-- -- hl.animation({ leaf = "windowsOut", enabled = true, speed = 2, bezier = "slow-fast", style = "popin 15%" })
+-- hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.5, bezier = "slow-fast", style = "popin 15%" })
+-- -- hl.animation({ leaf = "windowsMove", enabled = true, speed = 2, bezier = "md3_accel" }) -- when new window appears, it will block it for a while since its slower then windowIn animation
+-- hl.animation({ leaf = "workspaces", enabled = true, speed = 5, bezier = "fast-slow", style = "slide" })
+-- hl.animation({ leaf = "workspacesIn", enabled = true, speed = 5, bezier = "fast-slow", style = "slidefade" })
+-- hl.animation({ leaf = "borderangle", enabled = true, speed = 100, bezier = "linear", style = "loop" })
+
+-- hl.animation({ leaf = "layers", enabled = true, speed = 3, bezier = "sovershot", style = "popin 15%" })
+
+hl.animation({ leaf = "zoomFactor", enabled = true, speed = 3, bezier = "fast-slow" })
+
+hl.curve("spring", { type = "spring", mass = 3, stiffness = 200, dampening = 35 })
+
+hl.curve("open", { type = "spring", mass = 4, stiffness = 325, dampening = 46 })
+hl.curve("move", { type = "spring", mass = 4, stiffness = 375, dampening = 48 })
+
+hl.curve("workspace", { type = "spring", mass = 4, stiffness = 325, dampening = 50 })
+hl.curve("workspaceIn", { type = "spring", mass = 4, stiffness = 375, dampening = 51 })
+
+-- hl.curve("zoom", { type = "spring", mass = 3, stiffness = 225, dampening = 38 })
+
+hl.animation({ leaf = "global", enabled = true, speed = 3, spring = "spring" })
+
+hl.animation({ leaf = "windowsIn", enabled = true, speed = 3, spring = "open" })
+hl.animation({ leaf = "windowsMove", enabled = true, speed = 3, spring = "move" })
+
+hl.animation({ leaf = "workspaces", enabled = true, speed = 3, spring = "workspace" })
+hl.animation({ leaf = "workspacesIn", enabled = true, speed = 3, spring = "workspaceIn", style = "slidefade" })
+
+-- hl.animation({ leaf = "zoomFactor", enabled = true, speed = 3, spring = "zoom" })
diff --git a/dot-config/hypr/decor.luabAial9.bck b/dot-config/hypr/decor.luabAial9.bck
new file mode 100644
index 00000000..77528ca8
--- /dev/null
+++ b/dot-config/hypr/decor.luabAial9.bck
@@ -0,0 +1,107 @@
+hl.config({
+ general = {
+ gaps_in = 3,
+ gaps_out = 7,
+ float_gaps = -1,
+ border_size = 3,
+
+ col = {
+ active_border = { colors = { colors.color15, colors.color13, colors.color10, colors.color8, colors.color6, colors.color4, colors.color2, colors.color0, } }, -- angle = 45
+ inactive_border = colors.background,
+ },
+ },
+
+ decoration = {
+ rounding = 7,
+ rounding_power = 10,
+ border_part_of_window = true,
+
+ -- Change transparency of focused and unfocused windows
+ -- active_opacity = 0.95
+ inactive_opacity = 0.85,
+ fullscreen_opacity = 1.0,
+
+ shadow = {
+ enabled = true,
+ range = 15,
+ render_power = 4,
+ -- sharp = true,
+ -- ignore_window = true,
+ color = colors.background,
+ -- color = rgba(1a1a1aee),
+ },
+
+ blur = {
+ enabled = true,
+ -- heavy,
+ size = 5, -- 10,
+ passes = 5, -- 4,
+ -- light,
+ -- size = 8,
+ -- passes = 3,
+ -- noise = 0,
+ -- crazy & cool options,
+ -- brightness = 1,
+ -- contrast = 2,
+ -- vibrancy = 1.5,
+ -- vibrancy_darkness = 1,
+ popups = true,
+ ignore_opacity = true, -- KEEP THIS, THIS MAKE BLUR ACTUALLY BLUR COOL
+ input_methods = true,
+ special = true,
+ },
+ },
+
+ animations = {
+ enabled = true,
+ },
+})
+
+
+-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
+
+-- hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
+
+-- -- Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+-- hl.curve("windowovershot", { type = "bezier", points = { {1, 1}, {0, 1.05} } })
+-- hl.curve("overshot", { type = "bezier", points = { {0.5, 1}, {0, 1.2} } })
+-- hl.curve("sovershot", { type = "bezier", points = { {0.5, 1}, {0, 1.1} } })
+-- -- hl.curve("outsideIn", { type = "bezier", points = { {0.5, 1.1}, {0, 0.9} } })
+-- hl.curve("slow-fast", { type = "bezier", points = { {1, 0.33}, {0.3, 1} } })
+-- hl.curve("fast-slow", { type = "bezier", points = { {0.33, 0.8}, {0, 1} } })
+-- hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
+-- -- hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
+-- -- hl.curve("md3_standard", { type = "bezier", points = { {0.2, 0}, {0, 1} } })
+hl.curve("md3_decel", { type = "bezier", points = { { 0.05, 0.7 }, { 0.1, 1 } } })
+-- -- hl.curve("md3_accel", { type = "bezier", points = { {0.3, 0}, {0.8, 0.15} } })
+-- -- hl.curve("overshot", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.1} } })
+-- -- hl.curve("crazyshot", { type = "bezier", points = { {0.1, 1.5}, {0.76, 0.92} } })
+-- -- hl.curve("hyprnostretch", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.0} } })
+-- -- hl.curve("menu_decel", { type = "bezier", points = { {0.1, 1}, {0, 1} } })
+-- -- hl.curve("menu_accel", { type = "bezier", points = { {0.38, 0.04}, {1, 0.07} } })
+-- -- hl.curve("easeInOutCirc", { type = "bezier", points = { {0.85, 0}, {0.15, 1} } })
+-- -- hl.curve("easeOutCirc", { type = "bezier", points = { {0, 0.55}, {0.45, 1} } })
+-- -- hl.curve("easeOutExpo", { type = "bezier", points = { {0.16, 1}, {0.3, 1} } })
+-- -- hl.curve("softAcDecel", { type = "bezier", points = { {0.26, 0.26}, {0.15, 1} } })
+-- hl.curve("md2", { type = "bezier", points = { {0.4, 0}, {0.2, 1} } }) -- use with .2s duration
+
+hl.animation({ leaf = "fade", enabled = true, speed = 4, bezier = "md3_decel" })
+
+-- hl.animation({ leaf = "windows", enabled = true, speed = 3, bezier = "overshot", style = "gnome" })
+-- -- hl.animation({ leaf = "windowsOut", enabled = true, speed = 2, bezier = "slow-fast", style = "popin 15%" })
+-- hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.5, bezier = "slow-fast", style = "popin 15%" })
+-- -- hl.animation({ leaf = "windowsMove", enabled = true, speed = 2, bezier = "md3_accel" }) -- when new window appears, it will block it for a while since its slower then windowIn animation
+-- hl.animation({ leaf = "workspaces", enabled = true, speed = 5, bezier = "fast-slow", style = "slide" })
+-- hl.animation({ leaf = "workspacesIn", enabled = true, speed = 5, bezier = "fast-slow", style = "slidefade" })
+-- hl.animation({ leaf = "borderangle", enabled = true, speed = 100, bezier = "linear", style = "loop" })
+
+-- hl.animation({ leaf = "layers", enabled = true, speed = 3, bezier = "sovershot", style = "popin 15%" })
+
+-- hl.animation({ leaf = "zoomFactor", enabled = true, speed = 3, bezier = "fast-slow" })
+
+hl.curve("spring", { type = "spring", mass = 4, stiffness = 250, dampening = 32 })
+hl.curve("open", { type = "spring", mass = 4, stiffness = 350, dampening = 32 })
+
+hl.animation({ leaf = "global", enabled = true, speed = 3, spring = "spring" })
+hl.animation({ leaf = "windows", enabled = true, speed = 1, spring = "open" })
diff --git a/dot-config/hypr/env.lua b/dot-config/hypr/env.lua
new file mode 100644
index 00000000..cc4a513a
--- /dev/null
+++ b/dot-config/hypr/env.lua
@@ -0,0 +1,76 @@
+--
+-- ENVIRONMENT VARIABLES --
+--
+
+-- See https://wiki.hyprland.org/Configuring/Environment-variables/
+
+hl.env("XCURSOR_SIZE", "24")
+hl.env("XCURSOR_THEME", "Bibata-Modern-Classic")
+hl.env("HYPRCURSOR_SIZE", "24")
+hl.env("HYPRCURSOR_THEME", "Bibata-Modern-Classic")
+
+-- Nvidia
+hl.env("LIBVA_DRIVER_NAME", "nvidia")
+hl.env("GBM_BACKEND", "nvidia-drm")
+hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")
+-- hl.env("__GL_GSYNC_ALLOWED", "1")
+hl.env("VDPAU_DRIVER", "nvidia")
+hl.env("NVD_BACKEND", "direct")
+-- just in case if it tried to use igpu for hardware accel
+-- hl.env("AQ_DRM_DEVICES", "/dev/dri/card1:/dev/dri/card0")
+
+-- XDG
+hl.env("XDG_SESSION_DESKTOP", "Hyprland")
+-- set by hyprland
+-- hl.env("XDG_CURRENT_DESKTOP", "Hyprland")
+-- hl.env("XDG_SESSION_TYPE", "wayland")
+
+-- QT & scale
+hl.env("QT_AUTO_SCREEN_SCALE_FACTOR", "1")
+hl.env("QT_QPA_PLATFORM", "wayland;xcb")
+hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1")
+hl.env("QT_QPA_PLATFORMTHEME", "qt5ct:qt6ct")
+-- hl.env("SDL_VIDEODRIVER", "wayland")
+hl.env("QT_ENABLE_HIGHDPI_SCALE", "1")
+-- hl.env("QT_SCALE_FACTOR", "2")
+
+-- java fix
+hl.env("_JAVA_AWT_WM_NONREPARENTING", "1")
+-- hl.env("GDK_DPI_SCALE", "1.5")
+
+-- Electron blurry etc fix
+hl.env("ELECTRON_OZONE_PLATFORM_HINT", "wayland")
+
+-- Input method
+-- hl.env("GTK_IM_MODULE", "fcitx")
+hl.env("QT_IM_MODULE", "fcitx")
+hl.env("QT_IM_MODULES", "wayland;fcitx;ibus")
+hl.env("XMODIFIERS", "@im=fcitx")
+hl.env("SDL_IM_MODULE", "fcitx")
+hl.env("GLFW_IM_MODULE", "fcitx")
+hl.env("INPUT_METHOD", "fcitx")
+hl.env("XMODIFIERS", "fcitx")
+hl.env("IMSETTINGS_MODULE", "fcitx")
+
+-- wine
+hl.env("WINEPREFIX", "/opt/windows.wine")
+
+-- howdy avoid spam from gstreamer
+-- hl.env("OPENCV_LOG_LEVEL", "ERROR")
+
+-- temp fix for gtk apps seg fault
+-- hl.env("GSK_RENDERER", "ngl")
+
+-- Toolkit backend
+hl.env("GDK_BACKEND", "wayland, x11, *")
+hl.env("QT_QPA_PLATFORM", "wayland;xcb")
+hl.env("SDL_VIDEODRIVER", "wayland, x11") -- Remove or set to x11 if games that provide older versions of SDL cause compatibility issues"
+
+-- firefox
+hl.env("MOZ_DISABLE_RDD_SANDBOX", "1")
+hl.env("MOZ_ENABLE_WAYLAND", "1")
+
+-- defaults
+hl.env("BROWSER", "zen-browser")
+hl.env("EDITOR", "hx")
+hl.env("TERM", "kitty")
diff --git a/dot-config/hypr/group.lua b/dot-config/hypr/group.lua
new file mode 100644
index 00000000..ad71bcb8
--- /dev/null
+++ b/dot-config/hypr/group.lua
@@ -0,0 +1,23 @@
+hl.config({
+ group = {
+ auto_group = false,
+ -- disbandgrouponnone = true,
+ groupbar = {
+ -- enabled = false,
+ render_titles = false,
+ text_color = colors.foreground,
+ col = {
+ active = colors.color0,
+ inactive = colors.background,
+ locked_active = colors.color0,
+ locked_inactive = colors.background,
+ },
+ },
+ col = {
+ border_active = { colors = { colors.color0, colors.color15, colors.foreground, colors.cursor } },
+ border_inactive = colors.background,
+ border_locked_active = { colors = { colors.color0, colors.background } },
+ border_locked_inactive = colors.background,
+ },
+ }
+})
diff --git a/dot-config/hypr/hyprland.conf b/dot-config/hypr/hyprland.conf
index a79d913c..b46aa20a 100644
--- a/dot-config/hypr/hyprland.conf
+++ b/dot-config/hypr/hyprland.conf
@@ -32,8 +32,8 @@ $HYPRDIR = $HOME/.config/hypr
$WAYBARDIR = $HOME/.config/waybar
$SCRIPTSDIR = $HOME/scripts
$rofiexec = $HOME/.config/rofi/scripts
-$bgChangerBin = $SCRIPTSDIR/walls/swww.sh
-$bgChanger = swww.sh
+$bgChangerBin = $SCRIPTSDIR/walls/awww.sh
+$bgChanger = awww.sh
source = $HYPRDIR/colors.conf
@@ -207,7 +207,7 @@ misc {
disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
disable_autoreload = false
# vfr = false
- vrr = 1 # 1 = always, 2 = only in full screen
+ # vrr = 1 # 1 = always, 2 = only in full screen
# mouse_move_enables_dpms = true
key_press_enables_dpms = true
# animate_manual_resizes = true
diff --git a/dot-config/hypr/hyprland.lua b/dot-config/hypr/hyprland.lua
new file mode 100644
index 00000000..2fe1d687
--- /dev/null
+++ b/dot-config/hypr/hyprland.lua
@@ -0,0 +1,106 @@
+------------------
+---- MONITORS ----
+------------------
+
+-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
+hl.monitor({
+ output = "",
+ mode = "highres@highrr",
+ position = "auto",
+ scale = "auto",
+ bitdepth = 10
+})
+
+
+---------------------
+------ GLOBALS ------
+---------------------
+
+vars = require("vars")
+colors = require("colors")
+
+-------------------
+---- AUTOSTART ----
+-------------------
+
+require("autostart")
+
+
+-------------------------------
+---- ENVIRONMENT VARIABLES ----
+-------------------------------
+
+require("env")
+
+-----------------------
+----- PERMISSIONS -----
+-----------------------
+
+require("perms")
+
+-----------------------
+---- LOOK AND FEEL ----
+-----------------------
+
+require("decor")
+
+-----------------------
+------- LAYOUTS -------
+-----------------------
+
+-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
+require("layout")
+
+----------------
+---- MISC ----
+----------------
+
+require("misc")
+
+----------------
+---- GROUP ----
+----------------
+
+require("group")
+
+---------------
+---- RENDER ---
+---------------
+
+require("render")
+
+---------------
+---- INPUT ----
+---------------
+
+require("input")
+
+require("cursor")
+
+---------------------
+---- KEYBINDINGS ----
+---------------------
+
+require("binds")
+
+--------------------------------
+---- WINDOWS AND WORKSPACES ----
+--------------------------------
+
+require("rules")
+
+
+-- hl.config({
+-- debug = {
+-- -- disable_scale_checks = true,
+-- disable_logs = false,
+-- -- overlay = true, -- show fps
+-- suppress_errors = true,
+-- -- pass = true,
+-- error_position = 1,
+-- -- log_damage = true,
+-- -- damage_blink = true,
+-- full_cm_proto = true,
+-- }
+
+-- })
diff --git a/dot-config/hypr/hyprlandd.lua b/dot-config/hypr/hyprlandd.lua
new file mode 100644
index 00000000..df797500
--- /dev/null
+++ b/dot-config/hypr/hyprlandd.lua
@@ -0,0 +1,393 @@
+-- This is an example Hyprland Lua config file.
+-- Refer to the wiki for more information.
+-- https://wiki.hypr.land/Configuring/Start/
+
+-- Please note not all available settings / options are set here.
+-- For a full list, see the wiki
+
+-- You can (and should!!) split this configuration into multiple files
+-- Create your files separately and then require them like this:
+-- require("myColors")
+
+
+------------------
+---- MONITORS ----
+------------------
+
+-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
+hl.monitor({
+ output = "",
+ mode = "preferred",
+ position = "auto",
+ scale = "auto",
+})
+
+
+---------------------
+---- MY PROGRAMS ----
+---------------------
+
+-- Set programs that you use
+local terminal = "kitty"
+local fileManager = "dolphin"
+local menu = "hyprlauncher"
+
+
+-------------------
+---- AUTOSTART ----
+-------------------
+
+-- See https://wiki.hypr.land/Configuring/Basics/Autostart/
+
+-- Autostart necessary processes (like notifications daemons, status bars, etc.)
+-- Or execute your favorite apps at launch like this:
+--
+-- hl.on("hyprland.start", function ()
+-- hl.exec_cmd(terminal)
+-- hl.exec_cmd("nm-applet")
+-- hl.exec_cmd("waybar & hyprpaper & firefox")
+-- end)
+
+
+-------------------------------
+---- ENVIRONMENT VARIABLES ----
+-------------------------------
+
+-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/
+
+hl.env("XCURSOR_SIZE", "24")
+hl.env("HYPRCURSOR_SIZE", "24")
+
+
+-----------------------
+----- PERMISSIONS -----
+-----------------------
+
+-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/
+-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly
+-- for security reasons
+
+-- hl.config({
+-- ecosystem = {
+-- enforce_permissions = true,
+-- },
+-- })
+
+-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow")
+-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow")
+-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow")
+
+
+-----------------------
+---- LOOK AND FEEL ----
+-----------------------
+
+-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
+hl.config({
+ general = {
+ gaps_in = 5,
+ gaps_out = 20,
+
+ border_size = 2,
+
+ col = {
+ active_border = { colors = {"rgba(33ccffee)", "rgba(00ff99ee)"}, angle = 45 },
+ inactive_border = "rgba(595959aa)",
+ },
+
+ -- Set to true to enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false,
+
+ -- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
+ allow_tearing = false,
+
+ layout = "scrolling",
+ },
+
+ decoration = {
+ rounding = 10,
+ rounding_power = 2,
+
+ -- Change transparency of focused and unfocused windows
+ active_opacity = 1.0,
+ inactive_opacity = 1.0,
+
+ shadow = {
+ enabled = true,
+ range = 4,
+ render_power = 3,
+ color = 0xee1a1a1a,
+ },
+
+ blur = {
+ enabled = true,
+ size = 3,
+ passes = 1,
+ vibrancy = 0.1696,
+ },
+ },
+
+ animations = {
+ enabled = true,
+ },
+})
+
+-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
+hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} } })
+hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } })
+hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
+hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} } })
+hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } })
+
+-- Default springs
+hl.curve("easy", { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 })
+
+hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
+hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" })
+hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" })
+hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" })
+hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" })
+hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" })
+hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" })
+hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" })
+hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" })
+hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" })
+hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" })
+hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" })
+hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" })
+hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
+hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" })
+hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
+hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" })
+
+-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
+-- "Smart gaps" / "No gaps when only"
+-- uncomment all if you wish to use that.
+-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 })
+-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 })
+-- hl.window_rule({
+-- name = "no-gaps-wtv1",
+-- match = { float = false, workspace = "w[tv1]" },
+-- border_size = 0,
+-- rounding = 0,
+-- })
+-- hl.window_rule({
+-- name = "no-gaps-f1",
+-- match = { float = false, workspace = "f[1]" },
+-- border_size = 0,
+-- rounding = 0,
+-- })
+
+-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
+hl.config({
+ dwindle = {
+ preserve_split = true, -- You probably want this
+ },
+})
+
+-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
+hl.config({
+ master = {
+ new_status = "master",
+ },
+})
+
+-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
+hl.config({
+ scrolling = {
+ fullscreen_on_one_column = true,
+ },
+})
+
+----------------
+---- MISC ----
+----------------
+
+hl.config({
+ misc = {
+ force_default_wallpaper = -1, -- Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :(
+ },
+})
+
+
+---------------
+---- INPUT ----
+---------------
+
+hl.config({
+ input = {
+ kb_layout = "us",
+ kb_variant = "",
+ kb_model = "",
+ kb_options = "",
+ kb_rules = "",
+
+ follow_mouse = 1,
+
+ sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
+
+ touchpad = {
+ natural_scroll = false,
+ },
+ },
+})
+
+hl.gesture({
+ fingers = 3,
+ direction = "horizontal",
+ action = "workspace"
+})
+
+-- Example per-device config
+-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more
+hl.device({
+ name = "epic-mouse-v1",
+ sensitivity = -0.5,
+})
+
+
+---------------------
+---- KEYBINDINGS ----
+---------------------
+
+local mainMod = "SUPER" -- Sets "Windows" key as main modifier
+
+-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more
+hl.bind(mainMod .. " + Q", hl.dsp.exec_cmd(terminal))
+local closeWindowBind = hl.bind(mainMod .. " + C", hl.dsp.window.close())
+-- closeWindowBind:set_enabled(false)
+hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch 'hl.dsp.exit()'"))
+hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager))
+hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }))
+hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(menu))
+hl.bind(mainMod .. " + P", hl.dsp.window.pseudo())
+hl.bind(mainMod .. " + J", hl.dsp.layout("togglesplit")) -- dwindle only
+
+-- Move focus with mainMod + arrow keys
+hl.bind(mainMod .. " + left", hl.dsp.focus({ direction = "left" }))
+hl.bind(mainMod .. " + right", hl.dsp.focus({ direction = "right" }))
+hl.bind(mainMod .. " + up", hl.dsp.focus({ direction = "up" }))
+hl.bind(mainMod .. " + down", hl.dsp.focus({ direction = "down" }))
+
+-- Switch workspaces with mainMod + [0-9]
+-- Move active window to a workspace with mainMod + SHIFT + [0-9]
+for i = 1, 10 do
+ local key = i % 10 -- 10 maps to key 0
+ hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i}))
+ hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
+end
+
+-- Example special workspace (scratchpad)
+hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic"))
+hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" }))
+
+-- Scroll through existing workspaces with mainMod + scroll
+hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
+hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
+
+-- Move/resize windows with mainMod + LMB/RMB and dragging
+hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
+hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
+
+-- Laptop multimedia keys for volume and LCD brightness
+hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, repeating = true })
+hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, repeating = true })
+hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
+hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
+hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
+hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
+
+-- Requires playerctl
+hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
+hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
+hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
+hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
+
+
+--------------------------------
+---- WINDOWS AND WORKSPACES ----
+--------------------------------
+
+-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/
+-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
+
+-- Example window rules that are useful
+
+local suppressMaximizeRule = hl.window_rule({
+ -- Ignore maximize requests from all apps. You'll probably like this.
+ name = "suppress-maximize-events",
+ match = { class = ".*" },
+
+ suppress_event = "maximize",
+})
+-- suppressMaximizeRule:set_enabled(false)
+
+hl.window_rule({
+ -- Fix some dragging issues with XWayland
+ name = "fix-xwayland-drags",
+ match = {
+ class = "^$",
+ title = "^$",
+ xwayland = true,
+ float = true,
+ fullscreen = false,
+ pin = false,
+ },
+
+ no_focus = true,
+})
+
+-- Layer rules also return a handle.
+-- local overlayLayerRule = hl.layer_rule({
+-- name = "no-anim-overlay",
+-- match = { namespace = "^my-overlay$" },
+-- no_anim = true,
+-- })
+-- overlayLayerRule:set_enabled(false)
+
+-- Hyprland-run windowrule
+hl.window_rule({
+ name = "move-hyprland-run",
+ match = { class = "hyprland-run" },
+
+ move = "20 monitor_h-120",
+ float = true,
+})
+
+vars = require("vars")
+require("rules")
+local mod = "SUPER" -- Sets "SUPER" key as main modifier
+hl.bind(mod .. " + SHIFT + return", hl.dsp.exec_cmd(vars.termfloat))
+hl.config({
+ dwindle = {
+ preserve_split = true, -- You probably want this
+ force_split = 3,
+ precise_mouse_move = true
+ },
+
+ -- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
+ master = {
+ new_status = "inherits",
+ },
+
+ -- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
+ scrolling = {
+ follow_min_visible = 0.01,
+ fullscreen_on_one_column = true,
+ -- explicit_column_widths = 0.333,
+ -- 0.5,
+ -- 0.667,
+ -- 1.0
+ -- focus_fit_method = 1
+ },
+})
+
+
+-- Move focus with mainMod + arrow keys / vim binds
+local focus_dirs = { h = "l", l = "r", k = "u", j = "d" }
+for k, v in pairs(focus_dirs) do
+ hl.bind(mod .. " + " .. string.upper(k), hl.dsp.focus({ direction = v }), { repeating = true })
+end
+
+
diff --git a/dot-config/hypr/hyprtoolkit.conf b/dot-config/hypr/hyprtoolkit.conf
index 81acf054..57deedd1 100644
--- a/dot-config/hypr/hyprtoolkit.conf
+++ b/dot-config/hypr/hyprtoolkit.conf
@@ -1,7 +1,7 @@
-background = FF000000
-base = FF000000
-text = FFD8E4F4
-alternate_base = FF8692A1
-bright_text = FFBFD0E6
-accent = FF6C788A
-accent_secondary = FF6A798E
+background = FF151218
+base = FF413C44
+text = FFEEF9FF
+alternate_base = FF9CA7AD
+bright_text = FFDFEEF7
+accent = FF618A85
+accent_secondary = FFAEDAFC
diff --git a/dot-config/hypr/input.lua b/dot-config/hypr/input.lua
new file mode 100644
index 00000000..f760aebc
--- /dev/null
+++ b/dot-config/hypr/input.lua
@@ -0,0 +1,18 @@
+hl.config({
+ input = {
+ kb_layout = us,
+ -- kb_options = caps:swapescape -- changed in kb settings
+
+ follow_mouse = 1, -- 2
+ scroll_factor = 1.0,
+
+ sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
+ -- force_no_accel = true,
+ numlock_by_default = true,
+ repeat_delay = 300,
+ -- touchpad {
+ -- natural_scroll = false
+ -- }
+ }
+
+})
diff --git a/dot-config/hypr/layout.lua b/dot-config/hypr/layout.lua
new file mode 100644
index 00000000..57cb6872
--- /dev/null
+++ b/dot-config/hypr/layout.lua
@@ -0,0 +1,27 @@
+hl.config({
+ general = {
+ layout = "scrolling",
+ },
+
+ dwindle = {
+ preserve_split = true, -- You probably want this
+ force_split = 3,
+ precise_mouse_move = true
+ },
+
+ -- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
+ master = {
+ new_status = "inherits",
+ },
+
+ -- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
+ scrolling = {
+ follow_min_visible = 0.01,
+ fullscreen_on_one_column = true,
+ -- explicit_column_widths = 0.333,
+ -- 0.5,
+ -- 0.667,
+ -- 1.0
+ -- focus_fit_method = 1
+ },
+})
diff --git a/dot-config/hypr/misc.lua b/dot-config/hypr/misc.lua
new file mode 100644
index 00000000..3660690a
--- /dev/null
+++ b/dot-config/hypr/misc.lua
@@ -0,0 +1,28 @@
+hl.config({
+ general = {
+ -- Set to true to enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false,
+
+ snap = {
+ enabled = true,
+ respect_gaps = true
+ },
+
+ },
+ misc = {
+ force_default_wallpaper = 1, -- Set to 0 or 1 to disable the anime mascot wallpapers,
+ focus_on_activate = true,
+ disable_hyprland_logo = true, -- If true disables the random hyprland logo / anime girl background. :(,
+ disable_autoreload = false,
+ -- vfr = false,
+ -- vrr = 1 -- 1 = always, 2 = only in full screen,
+ -- mouse_move_enables_dpms = true,
+ key_press_enables_dpms = true,
+ -- animate_manual_resizes = true,
+ -- animate_mouse_windowdragging = true,
+ middle_click_paste = false,
+ enable_swallow = false,
+ -- swallow_regex = ^(Alacritty)$,
+ -- new_window_takes_over_fullscreen = 2,
+ },
+})
diff --git a/dot-config/hypr/perms.lua b/dot-config/hypr/perms.lua
new file mode 100644
index 00000000..b6a67e18
--- /dev/null
+++ b/dot-config/hypr/perms.lua
@@ -0,0 +1,36 @@
+hl.config({
+ ecosystem = {
+ enforce_permissions = true,
+ },
+})
+
+hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow")
+hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow")
+hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow")
+
+hl.permission("/usr/bin/grim", "screencopy", "allow")
+hl.permission("/usr/bin/hyprlock", "screencopy", "allow")
+hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow")
+
+hl.permission("/var/cache/hyprpm/system/dynamic-cursors/dynamic-cursors.so", "plugin", "allow")
+hl.permission("/var/cache/hyprpm/system/hyprscroller/hyprscroller.so", "plugin", "allow")
+
+-- Keyboards
+hl.permission("^yubico-yubikey-otp\\+fido\\+ccid$", "keyboard", "allow")
+hl.permission("^wooting-wooting-two-he-\\(arm\\)$", "keyboard", "allow")
+hl.permission("^wooting-wooting-two-he-\\(arm\\)-system-control$", "keyboard", "allow")
+hl.permission("^wooting-wooting-two-he-\\(arm\\)-consumer-control$", "keyboard", "allow")
+hl.permission("^company--usb-device-$", "keyboard", "allow")
+hl.permission("^company--usb-device--keyboard$", "keyboard", "allow")
+hl.permission("^logitech-brio-consumer-control$", "keyboard", "allow")
+hl.permission("^video-bus$", "keyboard", "allow")
+hl.permission("^power-button$", "keyboard", "allow")
+hl.permission("^power-button-1$", "keyboard", "allow")
+hl.permission("^sleep-button$", "keyboard", "allow")
+hl.permission("^hp-wmi-hotkeys$", "keyboard", "allow")
+hl.permission("^hl-virtual-keyboard$", "keyboard", "allow")
+hl.permission("^hl-virtual-keyboard-fcitx5$", "keyboard", "allow")
+
+hl.permission("^company--usb-device--keyboard-1$", "keyboard", "allow")
+
+hl.permission(".*", "keyboard", "ask")
diff --git a/dot-config/hypr/render.lua b/dot-config/hypr/render.lua
new file mode 100644
index 00000000..395b4880
--- /dev/null
+++ b/dot-config/hypr/render.lua
@@ -0,0 +1,11 @@
+hl.config({
+ general = { -- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
+ allow_tearing = true,
+},
+ render = {
+ direct_scanout = 1,
+ -- xp_mode = true, -- crazy drag bg
+ new_render_scheduling = true,
+ ctm_animation = 1,
+ },
+})
diff --git a/dot-config/hypr/rules.lua b/dot-config/hypr/rules.lua
new file mode 100644
index 00000000..f69d2c80
--- /dev/null
+++ b/dot-config/hypr/rules.lua
@@ -0,0 +1,280 @@
+--------------------------------------
+--- WINDOWS AND WORKSPACES ---
+--------------------------------------
+-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
+-- "Smart gaps" / "No gaps when only"
+-- uncomment all if you wish to use that.
+-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 })
+-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 })
+-- hl.window_rule({
+-- name = "no-gaps-wtv1",
+-- match = { float = false, workspace = "w[tv1]" },
+-- border_size = 0,
+-- rounding = 0,
+-- })
+-- hl.window_rule({
+-- name = "no-gaps-f1",
+-- match = { float = false, workspace = "f[1]" },
+-- border_size = 0,
+-- rounding = 0,
+-- })
+
+-- workspaces
+local tag_workspaces = {
+ terminal = 1,
+ web = 2,
+ file = 3,
+ code = 4,
+ office = 5,
+ communication = 6,
+ media = 7,
+ games = 8,
+ system = 9,
+ misc = 10
+}
+
+for tag, ws in pairs(tag_workspaces) do
+ hl.window_rule({ match = { tag = tag }, workspace = tostring(ws) })
+end
+
+-- content hints
+hl.window_rule({ match = { tag = "games" }, content = "game" })
+
+-- GUI Utils
+hl.window_rule({
+ match = { tag = "gui-utils" },
+ opacity = "0.85 0.75",
+ pin = true,
+ size = { "(monitor_w*0.53)", "(monitor_h*0.6)" },
+ move = { "(monitor_w*0.465)", "(monitor_h*0.048)" },
+ animation = "slide right top"
+})
+
+-- media contents
+hl.window_rule({
+ match = { tag = "media-contents" },
+ float = true,
+ pin = true,
+ no_initial_focus = true,
+ no_shadow = true,
+ keep_aspect_ratio = true,
+ no_dim = true,
+ suppress_event = "activatefocus"
+})
+
+-- positions
+local positions = {
+ ["top-left"] = { "0", "0" },
+ ["top-right"] = { "(monitor_w-window_w)", "0" },
+ ["bottom-left"] = { "0", "(monitor_h-window_h)" },
+ ["bottom-right"] = { "(monitor_w-window_w)", "(monitor_h-window_h)" }
+}
+
+for tag, pos in pairs(positions) do
+ hl.window_rule({ match = { tag = tag }, move = pos })
+end
+
+-- fake fullscreen
+hl.window_rule({ match = { tag = "fakefullscreen" }, fullscreen_state = "0 2" })
+
+-- Games
+hl.window_rule({ match = { tag = "games" }, fullscreen = true, immediate = true })
+
+-- fh5 & game focus suppression
+hl.window_rule({ match = { title = "^(Forza Horizon 5)$" }, suppress_event = "activatefocus" })
+hl.window_rule({ match = { class = "^(steam_app_1551360)$" }, suppress_event = "activatefocus" })
+hl.window_rule({ match = { tag = "games" }, suppress_event = "activatefocus" })
+
+-- time-sensitive app rules
+hl.window_rule({
+ match = { tag = "time-sensitive" },
+ stay_focused = true,
+ pin = true,
+ dim_around = true,
+ center = true,
+ float = true
+})
+
+-- popup
+hl.window_rule({
+ match = { tag = "popup" },
+ dim_around = true,
+ center = true,
+ float = true
+})
+
+-- cli util apps
+hl.window_rule({
+ match = { tag = "cli-utils" },
+ float = true,
+ pin = true,
+ dim_around = true
+})
+
+-- hidden
+hl.window_rule({ match = { tag = "hidden" }, workspace = "special:minimized silent" })
+
+-- Grouping tags by class/title matches
+local app_tags = {
+ { class = "^(Alacritty|Xfce4-terminal|Kitty|" .. (vars.term or "$term") .. "|com.mitchellh.ghostty)$", tag = "+terminal" },
+ { class = "^(" .. (vars.browser or "$browser") .. "|Brave-browser|chromium|firefox|thorium|zen)$", tag = "+web" },
+ { class = "^(" .. (vars.fileManager or "$fileManager") .. "|Pcmanfm|thunar|qBittorrent|Caja)$", tag = "+file" },
+ { class = "^(code|code-url-handler|cursor-url-handler|code-oss|Code - OSS|install4j-burp-StartBurp|burp-StartBurp|Unity|jetbrains-pycharm-ce|Postman|jetbrains-clion|.*\\.zed\\.Zed-.*)$", tag = "+code" },
+ { class = "^(LibreOffice.*|libreoffice.*|Typora|obsidian|figma-linux|anytype|craft-nativefier-e0958b|evince|org.gnome.Evince|ClickUp)$", tag = "+office" },
+ { class = "^(discord|vesktop|VencordDesktop|Chat-gpt|Whatsapp-for-linux|Chatbox)$", tag = "+communication" },
+ { class = "^(Audacity|Music|MPlayer|Lxmusic|Inkscape|Gimp|Blender|obs|zoom|Zoom|Pitivi|kdenlive|openshot|vlc|cider|Cider|shotwell|Shotwell|fr.handbrake.ghb|spotify|spotify)$", tag = "+media" },
+ { class = "^(Minecraft|Badlion|War|steam_proton|steam|csgo_linux64|cs2|minecraft-launcher|lutris|genshinimpact\\.exe|moe\\.launcher\\.an-anime-game-launcher|lunarclient|Lunar Client.*|zenlesszonezero\\.exe|moe\\.launcher\\.sleepy-launcher|org\\.vinegarhq\\.Sober|War Thunder.*|steam_app_.*)$", tag = "+games" },
+ { class = "^(virt-manager|blueman-adapters|blueman-manager|GParted|Xdm-app|timeshift-gtk|com\\.nextcloud\\.desktopclient\\.nextcloud|gearlever|Lxappearance|Lxtask|Lxrandr|Arandr|System-config-printer\\.py|Pavucontrol|Exo-helper-1|Protonvpn|Xfce4-power-manager-settings|Mysql-workbench-bin|Grub-customizer|Nitrogen|archlinux-tweak-tool\\.py|pamac-manager|helvum|Vmware|btrfs-assistant|Bitwarden|wootility-lekker|nwg-look|com\\.github\\.wwmm\\.easyeffects|kvantummanager)$", tag = "+system" },
+ { class = "^(os_server|Os_server)$", tag = "+misc" },
+ { title = ".*\\.exe", tag = "+games" },
+ { title = "^(War Thunder.*)$", tag = "+games" },
+ { content = "3", tag = "+games" },
+ { class = "^(thorium-app.shortwave.com__-Default|thorium-mdpkiolbdkhdjpekfbkbmhigcaggjagi-Profile_1|thorium-lnachpgegbbmnnlgpokibfjlmppeciah-Default|BeeperTexts)$", tag = "+gui-utils" },
+ { class = "^(blobdrop|dragon|dragon-drop)$", tag = "+media-contents" },
+ { class = "^(blobdrop|dragon|dragon-drop)$", tag = "+bottom-right" },
+ { title = "^(Picture-in-Picture)$", tag = "+media-contents" },
+ { title = "^(Picture-in-Picture)$", tag = "+top-right" },
+ { class = "^(thorium-mdpkiolbdkhdjpekfbkbmhigcaggjagi-Profile_1|thorium-lnachpgegbbmnnlgpokibfjlmppeciah-Default)$", tag = "+fakefullscreen" },
+ { class = "^(polkit-gnome-authentication-agent-1|hyprland-share-picker.*|gcr-prompter|io.missioncenter.MissionCenter|hyprpolkitagent|hyprland-dialog|.*pinentry.*)$", tag = "+time-sensitive" },
+ { title = "^(Open File|Open|Select a File|Choose wallpaper|Open Folder|Save As|Save File|Open Files|File Operation Progress|Library|File Upload|.*- Properties|Enter name of file to save to.*)$", tag = "+popup" },
+ { class = "^(xdg-desktop-portal.*|.*\\.portal..*)$", tag = "+popup" },
+ { class = "^thunar$", title = "^Rename.*", tag = "+popup" },
+ { class = "^zenity$", title = "^Protontricks$", tag = "+popup" },
+ { class = "^zen$", title = "^Extension:.*", tag = "+popup" },
+ { title = "^(nmd|cliphist|pulsemixer|ranger|btop)$", tag = "+cli-utils" }
+}
+
+for _, rule in ipairs(app_tags) do
+ local match_tbl = {}
+ if rule.class then match_tbl.class = rule.class end
+ if rule.title then match_tbl.title = rule.title end
+ if rule.content then match_tbl.content = rule.content end
+ hl.window_rule({ match = match_tbl, tag = rule.tag })
+end
+
+-- Floating applications
+hl.window_rule({ match = { class = "^(zoom|sxiv|Sxiv|[Vv]iewnior|feh|nm-connection-editor|install4j-burp-StartBurp|thorium-app.shortwave.com__-Default|thorium-mdpkiolbdkhdjpekfbkbmhigcaggjagi-Profile_1|thorium-lnachpgegbbmnnlgpokibfjlmppeciah-Default|BeeperTexts|electron|com.github.rafostar.Clapper|io.github.celluloid_player.Celluloid|qimgv)$" }, float = true })
+hl.window_rule({ match = { title = "^(Steam Settings|Sign in – Google accounts)$" }, float = true })
+
+-- Specific window pin/stay_focused rules
+hl.window_rule({ match = { title = "^(zoom_linux_float_video_window)$" }, pin = true })
+hl.window_rule({ match = { title = "(menu window)" }, stay_focused = true })
+hl.window_rule({ match = { title = "^(btop)$" }, stay_focused = true })
+
+hl.window_rule({ match = { tag = "gui-utils" }, animation = "slide right top" })
+
+-- bitwarden chrome extension popup
+hl.window_rule({
+ match = { class = "^(thorium-nngceckbapebfimnlniiiahkandclblb-Default)$" },
+ pin = true,
+ float = true,
+ stay_focused = true
+})
+
+-- firefox
+hl.window_rule({ match = { title = "^Extension" }, float = true })
+
+-- PIP sizing
+hl.window_rule({ match = { title = "^(Picture-in-Picture)$" }, size = { "(monitor_w*0.25)", "(monitor_h*0.25)" } })
+
+hl.window_rule({ match = { tag = "time-sensitive" }, dim_around = true })
+hl.window_rule({ match = { tag = "cli-utils" }, dim_around = true })
+
+-- No shadow for tiled window
+hl.window_rule({ match = { float = false }, no_shadow = true })
+
+-- Opacity rules
+local opacity_rules = {
+ { class = "^cursor-url-handler$", active = "0.85", inactive = "0.75" },
+ { title = "^Myass$", active = "0", inactive = "0" },
+ { class = "^TelegramDesktop$", active = "1.00", inactive = "0.90" },
+ { class = "^spotify$", active = "0.90", inactive = "0.80" },
+ { class = "^Cider$", active = "0.90", inactive = "0.80" },
+ { class = "^Brave-browser$", active = "0.90", inactive = "0.80" },
+ { class = "^thunar$", active = "0.90", inactive = "0.80" },
+ { class = "^discord$", active = "0.85", inactive = "0.75" },
+ { class = "^Caja$", active = "0.90", inactive = "0.80" },
+ { class = "^polkit-gnome-authentication-agent-1$", active = "0.80", inactive = "0.70" },
+ { title = "^Open$", active = "0.80", inactive = "0.70" },
+ { title = "^New Tab - Thorium$", active = "0.8", inactive = "0.5" }
+}
+
+for _, rule in ipairs(opacity_rules) do
+ local match_tbl = {}
+ if rule.class then match_tbl.class = rule.class end
+ if rule.title then match_tbl.title = rule.title end
+ hl.window_rule({ match = match_tbl, opacity = rule.active .. " " .. rule.inactive })
+end
+
+-- Full screen no idle
+hl.window_rule({ match = { class = ".*" }, idle_inhibit = "fullscreen" })
+
+-- no blurs
+hl.window_rule({ match = { title = "^(Annotation - Zoom)$" }, no_blur = true })
+
+-- Layer rules / blur
+local layer_rules = {
+ { namespace = ".*", blur_popups = true },
+ { namespace = "^rofi$", blur = true, ignore_alpha = 0, dim_around = true, animation = "popin 45%" },
+ { namespace = "^quickshell::launcher.*$", blur = true, ignore_alpha = 0, dim_around = true, animation = "popin 45%" },
+ { namespace = "^notifications$", blur = true, ignore_alpha = 0 },
+ { namespace = "^swaync-notification-window$", blur = true, ignore_alpha = 0, animation = "slide right" },
+ { namespace = "^swaync-control-center$", blur = true, ignore_alpha = 0, animation = "slide right" },
+ { namespace = "^logout_dialog$", blur = true },
+ { namespace = "^waybar$", blur = true, ignore_alpha = 0 },
+ { namespace = "^quickshell::bar$", blur = true, ignore_alpha = 0 },
+ { namespace = "^quickshell::CC$", blur = true, ignore_alpha = 0, dim_around = true },
+ { namespace = "^syshud$", blur = true, ignore_alpha = 0 },
+ { namespace = "^selection$", animation = "none" },
+ { namespace = "^mpvpaper$", animation = "gnome 0%" }
+}
+
+for _, rule in ipairs(layer_rules) do
+ local params = { match = { namespace = rule.namespace } }
+ for k, v in pairs(rule) do
+ if k ~= "namespace" then params[k] = v end
+ end
+ hl.layer_rule(params)
+end
+
+-- Misc
+
+-- xwaylandvideobridge
+hl.window_rule({
+ match = { class = "^(xwaylandvideobridge)$" },
+ opacity = "0.0 override",
+ no_anim = true,
+ no_initial_focus = true,
+ max_size = { "1", "1" },
+ no_blur = true
+})
+
+-- Roblox join private server
+hl.window_rule({ match = { class = "^(org.vinegarhq.Sober)$", title = "^(Join Friends)$" }, float = true })
+
+-- No transparency for fullscreen windows
+-- hl.window_rule({ match = { fullscreen = false }, ["plugin:chromakey"] = true })
+
+-- suppressevent
+hl.window_rule({ match = { class = "^spotify$" }, suppress_event = "activatefocus activate" })
+
+-- Fix some dragging issues with XWayland
+hl.window_rule({
+ match = {
+ class = "^$",
+ title = "^$",
+ xwayland = true,
+ float = true,
+ fullscreen = false,
+ pin = false
+ },
+ no_focus = true
+})
+
+-- Smart gaps overrides (commented out in original)
+-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 })
+-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 })
+-- hl.window_rule({ match = { float = false, workspace = "w[tv1]" }, border_size = 0 })
+-- hl.window_rule({ match = { float = false, workspace = "w[tv1]" }, rounding = 0 })
+-- hl.window_rule({ match = { float = false, workspace = "f[1]" }, border_size = 0 })
+-- hl.window_rule({ match = { float = false, workspace = "f[1]" }, rounding = 0 })
diff --git a/dot-config/hypr/vars.lua b/dot-config/hypr/vars.lua
new file mode 100644
index 00000000..23bbd821
--- /dev/null
+++ b/dot-config/hypr/vars.lua
@@ -0,0 +1,26 @@
+local M = {}
+
+-- Program defaults
+M.term = "kitty"
+M.termLaunch = M.term .. " -1"
+M.termfloat = "[float on; center on; size (monitor_w*0.4) (monitor_h*0.4); workspace unset] " .. M.term
+M.editor = "zeditor"
+-- $browser = thorium-browser
+M.browser = "zen-browser"
+M.fileManager = "thunar"
+M.sessionManager = "sddm"
+
+-- Dirs
+M.HYPRDIR = "$HOME/.config/hypr"
+M.SCRIPTSDIR = "$HOME/scripts"
+M.rofiexec = "$HOME/.config/rofi/scripts"
+
+-- Files
+M.bgChangerBin = M.SCRIPTSDIR .. "/walls/awww.sh"
+M.bgChanger = "awww.sh"
+
+-- misc
+M.waylandarg =
+"--enable-features=WaylandWindowDecorations,UseOzonePlatform,WebRTCPipeWireCapturer --ozone-platform-hint=wayland --enable-wayland-ime"
+
+return M