From 0daeac8770b4260758f7c8a33f0e7bfc57d18dcc Mon Sep 17 00:00:00 2001 From: fennek182 Date: Sun, 14 Jun 2026 01:56:03 +0200 Subject: [PATCH] added Hyprland config --- .config/hypr/hyprland.lua | 42 +++ .config/hypr/modules/autostart.lua | 29 ++ .config/hypr/modules/binds.lua | 366 +++++++++++++++++++++++ .config/hypr/modules/env.lua | 71 +++++ .config/hypr/modules/input.lua | 45 +++ .config/hypr/modules/layouts.lua | 62 ++++ .config/hypr/modules/misc.lua | 25 ++ .config/hypr/modules/monitors.lua | 102 +++++++ .config/hypr/modules/styling.lua | 170 +++++++++++ .config/hypr/modules/windowrules.lua | 84 ++++++ .config/hypr/modules/workspaces.lua | 123 ++++++++ .config/hypr/plugins/dynamic-cursors.lua | 120 ++++++++ .config/hypr/plugins/hyprbars.lua | 33 ++ .config/hypr/plugins/hyprexpo.lua | 12 + .config/hypr/xdg-portal-hyprland | 8 + 15 files changed, 1292 insertions(+) create mode 100644 .config/hypr/hyprland.lua create mode 100644 .config/hypr/modules/autostart.lua create mode 100644 .config/hypr/modules/binds.lua create mode 100644 .config/hypr/modules/env.lua create mode 100644 .config/hypr/modules/input.lua create mode 100644 .config/hypr/modules/layouts.lua create mode 100644 .config/hypr/modules/misc.lua create mode 100644 .config/hypr/modules/monitors.lua create mode 100644 .config/hypr/modules/styling.lua create mode 100644 .config/hypr/modules/windowrules.lua create mode 100644 .config/hypr/modules/workspaces.lua create mode 100644 .config/hypr/plugins/dynamic-cursors.lua create mode 100644 .config/hypr/plugins/hyprbars.lua create mode 100644 .config/hypr/plugins/hyprexpo.lua create mode 100755 .config/hypr/xdg-portal-hyprland diff --git a/.config/hypr/hyprland.lua b/.config/hypr/hyprland.lua new file mode 100644 index 0000000..120021f --- /dev/null +++ b/.config/hypr/hyprland.lua @@ -0,0 +1,42 @@ +-- version 1 +-- last change: Fri 2026-06-12 using Hyprland v0.55.3-1 + +-- See https://wiki.hypr.land/Configuring/Start/ for more + +--- Modules +require("modules.env") +require("modules.monitors") +require("modules.autostart") +require("modules.binds") +require("modules.layouts") +require("modules.misc") +require("modules.input") +require("modules.windowrules") +require("modules.workspaces") +require("modules.styling") + +--- Plugins +-- require("plugins.hyprbars") +-- require("plugins.hyprexpo") +-- TODO: check syntax: +-- require("plugins.dynamic-cursors") + + +----------------------- +----- 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 + +-- TODO: checkout permissions + +-- 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") diff --git a/.config/hypr/modules/autostart.lua b/.config/hypr/modules/autostart.lua new file mode 100644 index 0000000..2e7f46b --- /dev/null +++ b/.config/hypr/modules/autostart.lua @@ -0,0 +1,29 @@ +------------------- +---- AUTOSTART ---- +------------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +-- See https://wiki.hypr.land/Configuring/Basics/Autostart/ + +hl.on("hyprland.start", function() + hl.exec_cmd("hyprpm reload") + hl.exec_cmd("sleep 1 && waybar") + hl.exec_cmd("dinit >> ~/.local/share/dinit/dinit.log &") + hl.exec_cmd("hyprland-autoname-workspaces --dedup &") + hl.exec_cmd("~/.config/hypr/xdg-portal-hyprland") + hl.exec_cmd("/bin/kdeconnectd") + hl.exec_cmd("/bin/kdeconnect-indicator") + hl.exec_cmd("sleep 2 && /usr/bin/coolercontrol") + hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP &") + hl.exec_cmd("/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &") + hl.exec_cmd("sh ~/.local/bin/setbg --restore") + hl.exec_cmd("test $(hostname)=nightfury && sleep 0.3 && openrgb -p jo.orp") + hl.exec_cmd("dotoold &") + hl.exec_cmd("sleep 2 && /usr/bin/python3 ~/.local/bin/fennix/sound_usb_connect.py") + hl.exec_cmd("sleep 3 && sh ~/.local/bin/mount_milo") + hl.exec_cmd("/opt/svp/SVPManager") + hl.exec_cmd("~/.local/bin/signal") + hl.exec_cmd("sleep 5 && ~/.local/bin/jellyfin-mpv-shim") +end) diff --git a/.config/hypr/modules/binds.lua b/.config/hypr/modules/binds.lua new file mode 100644 index 0000000..9efc73e --- /dev/null +++ b/.config/hypr/modules/binds.lua @@ -0,0 +1,366 @@ +--------------------- +---- KEYBINDINGS ---- +--------------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +-- See https://wiki.hypr.land/Configuring/Basics/Binds/ for more + +---- App variables +local terminal = "~/.local/bin/alacritty" +local fileManager = "nautilus" +local browser = "~/.local/bin/firefox" +local editor_gui = "~/.local/bin/zed" +local editor_cli = "env -u VIMINIT nvim" +local vpn = "/opt/ivpn/ui/bin/ivpn-ui" +local mediaPlayer = "/opt/ivpn/ui/bin/ivpn-ui" + +local mainMod = "SUPER" -- Sets "Windows" key as main modifier + +-- Example bind: +-- hl.bind("SUPER + Q", hl.dsp.exec_cmd("kitty"), { description = "Open my favourite terminal" }) + +-- TODO: Global keybinds for apps +-- hl.bind("ALT" .. " + " .. 0, hl.dsp.pass("^(com\\.obsproject\\.Studio)$")) +-- hl.bind("ALT" .. " + " .. "p", hl.dsp.pass("^(com\\.obsproject\\.Studio)$")) + + +-- For ALT + TAB between workspaces +hl.config({ + binds = { + workspace_back_and_forth = true, + allow_workspace_cycles = true, + }, +}) + + +-- ========== Apps ========== +-- TODO: old - remove on next commit: +-- bind = $mainMod, D, exec, ~/.local/bin/fzf-search-fennix +-- bind = $mainMod SHIFT, D, exec, nautilus --new-window ~/dl +-- bind = $mainMod SHIFT, G, exec, flatpak run com.valvesoftware.Steam +-- bind = $mainMod SHIFT, S, exec, flatpak run io.github.dweymouth.supersonic +-- bind = $mainMod ALT, G, exec, glava +-- bind = $mainMod ALT, J, exec, flatpak run io.github.dweymouth.supersonic +-- bind = $mainMod ALT, J, exec, flatpak run com.logseq.Logseq +-- bind = $mainMod, R, exec, ~/.local/bin/hyprland_rename_ws +-- bind = $mainMod SHIFT, L, exec, mpv --no-audio --loop -fs --osc=no --osd-bar=no --config=no ~/.local/share/screensavers/bad_apple.mkv + +hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd(terminal)) +hl.bind(mainMod .. " + N", hl.dsp.exec_cmd(editor_gui)) +hl.bind(mainMod .. " + ALT + N", hl.dsp.exec_cmd(editor_gui .. " /mnt/ssd/dox/todo.txt")) +hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager .. " --new-window")) +hl.bind(mainMod .. " + F", hl.dsp.exec_cmd(browser)) +hl.bind(mainMod .. " + SHIFT + F", hl.dsp.exec_cmd(browser .. " --private-window")) +hl.bind("CTRL + ALT + N", hl.dsp.exec_cmd(mediaPlayer .. " --player-operation-mode=pseudo-gui")) + + +-- ========== Scripts ========== +hl.bind(mainMod .. " + ALT + P", hl.dsp.exec_cmd("~/.local/bin/firefox2tv &")) +hl.bind(mainMod .. " + ALT + P", hl.dsp.exec_cmd("~/.local/bin/firefox2mpv --current &")) +hl.bind(mainMod .. " + ALT + P", hl.dsp.exec_cmd("~/.local/bin/firefox2mpv --select &")) + + +-- ========== Hyprland ========== +-- TODO: old - remove on next commit: +-- bind = SUPER, Tab, hyprexpo:expo, toggle +-- bind = SUPER, dead_circumflex, hyprexpo:expo, toggle +-- bind = SUPER, Escape, hyprexpo:expo, toggle +-- bind = ALT, dead_circumflex, overview:toggle +-- bind = ALT, Escape, overview:toggle +-- bind = $mainMod SHIFT, E, exit + +hl.bind(mainMod .. " + SHIFT + R", hl.dsp.exec_cmd("hyprctl reload")) +hl.bind(mainMod .. " + ALT + R", hl.dsp.exec_cmd("pkill waybar; hyprctl dispatch exec waybar")) + +--- layouts +hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("hyprctl keyword general:layout dwindle")) +hl.bind(mainMod .. " + A", hl.dsp.exec_cmd("hyprctl keyword general:layout master")) + +--- windows +local closeWindowBind = hl.bind(mainMod .. " + Q", hl.dsp.window.close()) +-- closeWindowBind:set_enabled(false) +hl.bind(mainMod .. " + SHIFT + Q", hl.dsp.exec_cmd("hyprctl kill")) +hl.bind("ALT + TAB", hl.dsp.focus({ workspace = "previous" })) +hl.bind(mainMod .. " + ALT + I", hl.dsp.exec_cmd("dunstify $(hyprctl activewindow -j | jq -r .title)")) + +--- windows > floating +--- TODO: fix toggle_floating script with new syntax +hl.bind(mainMod .. " + Y", hl.dsp.window.float({ action = "toggle" })) +-- hl.bind(mainMod .. " + Y", hl.dsp.exec_cmd("~/.local/bin/toggle_floating")) +hl.bind(mainMod .. " + SHIFT + Y", hl.dsp.exec_cmd("hyprctl dispatch togglefloating active && hyprctl dispatch pin active")) +hl.bind(mainMod .. " + SHIFT + V", hl.dsp.exec_cmd("hyprctl dispatch workspaceopt allfloat")) + +--- windows > split (dwindle layout) +hl.bind(mainMod .. " + SHIFT + J", hl.dsp.layout("togglesplit")) -- dwindle only + +--- windows > fullscreen / maximize / fake fullscreen +hl.bind(mainMod .. " + SHIFT + P", hl.dsp.window.pseudo()) -- dwindle only +hl.bind(mainMod .. " + M", hl.dsp.window.fullscreen({ action = "toggle" })) +hl.bind(mainMod .. " + SHIFT + M", hl.dsp.window.fullscreen_state({ internal = 0, client = 2 })) +-- ^-- keeps the window non-fullscreen, but the client goes into fullscreen mode within the window + +--- 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" })) + +--- workspaces +-- 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 + +-- switch workspaces with mainMod + [0-9] +hl.bind(mainMod .. " + " .. 1, hl.dsp.focus({ workspace = 5 })) +hl.bind(mainMod .. " + " .. 2, hl.dsp.focus({ workspace = 6 })) +hl.bind(mainMod .. " + " .. 3, hl.dsp.focus({ workspace = 7 })) +hl.bind(mainMod .. " + " .. 4, hl.dsp.focus({ workspace = 8 })) +hl.bind(mainMod .. " + " .. 5, hl.dsp.focus({ workspace = 1 })) +hl.bind(mainMod .. " + " .. 6, hl.dsp.focus({ workspace = 2 })) +hl.bind(mainMod .. " + " .. 7, hl.dsp.focus({ workspace = 3 })) +hl.bind(mainMod .. " + " .. 8, hl.dsp.focus({ workspace = 4 })) +hl.bind(mainMod .. " + " .. 9, hl.dsp.focus({ workspace = 9 })) +hl.bind(mainMod .. " + " .. 0, hl.dsp.focus({ workspace = 10 })) +hl.bind(mainMod .. " + " .. "ssharp", hl.dsp.focus({ workspace = 11 })) +hl.bind(mainMod .. " + " .. "dead_acute", hl.dsp.focus({ workspace = 12 })) + +-- switch workspaces with mainMod + pageUp/pageDown +hl.bind(mainMod .. " + " .. "Next", hl.dsp.focus({ workspace = -1 })) +hl.bind(mainMod .. " + " .. "Prior", hl.dsp.focus({ workspace = "+1" })) + +-- Move active window to a workspace with mainMod + SHIFT + [0-9] +-- TODO: check syntax of dsp.widnow.move +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 1, hl.dsp.window.move(5)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 2, hl.dsp.window.move(6)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 3, hl.dsp.window.move(7)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 4, hl.dsp.window.move(8)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 5, hl.dsp.window.move(1)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 6, hl.dsp.window.move(2)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 7, hl.dsp.window.move(3)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 8, hl.dsp.window.move(4)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 9, hl.dsp.window.move(9)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 0, hl.dsp.window.move(10)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "ssharp", hl.dsp.window.move(11)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "dead_acute", hl.dsp.window.move(12)) + +-- Move active window to a workspace with mainMod + SHIFT + pageUp/pageDown +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "Next", hl.dsp.window.move(-1)) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "Prior", hl.dsp.window.move("+1")) + +-- Move workspaces between dual screen setup +hl.bind(mainMod .. " + ALT + left", hl.dsp.exec_cmd("hyprctl dispatch movecurrentworkspacetomonitor DP-1")) +hl.bind(mainMod .. " + ALT + right", hl.dsp.exec_cmd("hyprctl dispatch movecurrentworkspacetomonitor DP-4")) + +-- 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" })) + +--- TODO: add device specific binds +-- thinkpad: +-- gpd: + + +-- ========== Rofi ========== +-- TODO: formatting/string cleanup +hl.bind("CTRL + ALT" .. " + " .. "B", hl.dsp.exec_cmd("~/.local/bin/poweroptions_rofi")) +hl.bind(mainMod .. " + " .. "B", hl.dsp.exec_cmd("notify-send CPU-Profil gewechselt Performance && sudo /usr/bin/cpupower frequency-set -g performance")) +hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "B", hl.dsp.exec_cmd("notify-send CPU-Profil gewechselt Powersave && sudo /usr/bin/cpupower frequency-set -g powersave")) +hl.bind(mainMod .. " + " .. "C", hl.dsp.exec_cmd("~/.local/bin/rofi_calc")) +hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "C", hl.dsp.exec_cmd("~/.local/bin/rofi_calc --normal-window")) +hl.bind("CTRL + ALT" .. " + " .. "P", hl.dsp.exec_cmd("hyprctl dispatch exec ~/.config/rofi/bin/menu_powermenu")) +hl.bind(mainMod .. " + " .. "U", hl.dsp.exec_cmd("~/.local/bin/bemoji")) +-- bind = $mainMod, U, exec, rofi -show emoji -modi emoji:/usr/bin/rofimoji --single + +hl.bind(mainMod .. " + " .. "space", hl.dsp.exec_cmd("~/.local/bin/rofi_drun")) +hl.bind("SUPER" .. " + " .. "SUPER_L", hl.dsp.exec_cmd("~/.local/bin/rofi_drun"), { repeating = true }) +hl.bind("CTRL + ALT" .. " + " .. "minus", hl.dsp.exec_cmd("~/.local/bin/mount_rofi")) +hl.bind("ALT" .. " + " .. "space", hl.dsp.exec_cmd("zsh -c rofi -show run")) + +-- ========== System control ========== +-- TODO: formatting/string cleanup +hl.bind("CTRL + ALT" .. " + " .. "A", hl.dsp.exec_cmd("alacritty -e alsamixer")) +hl.bind("CTRL + ALT + SHIFT" .. " + " .. "B", hl.dsp.exec_cmd("sh ~/.local/bin/blue_light_filter")) +hl.bind("CTRL + ALT" .. " + " .. "S", hl.dsp.exec_cmd("pavucontrol")) +hl.bind(mainMod .. " + " .. "V", hl.dsp.exec_cmd("dunstctl history-pop")) +hl.bind("CTRL + ALT" .. " + " .. "V", hl.dsp.exec_cmd("dunstctl history-pop")) +hl.bind("CTRL + ALT + SHIFT" .. " + " .. "V", hl.dsp.exec_cmd("dunstctl set-paused toggle && pkill -RTMIN+2 waybar")) +hl.bind(mainMod .. " + " .. "CTRL + ALT" .. " + " .. "V", hl.dsp.exec_cmd("dunstctl close && pkill -RTMIN+2 waybar")) +hl.bind(mainMod .. " + " .. "ALT" .. " + " .. "V", hl.dsp.exec_cmd("dunstctl close && pkill -RTMIN+2 waybar")) +hl.bind("CTRL + ALT + SHIFT" .. " + " .. "W", hl.dsp.exec_cmd("python ~/.local/src/setbg-gui/azote/azote/v10_abhier.py")) +hl.bind("CTRL + SHIFT" .. " + " .. "W", hl.dsp.exec_cmd("python ~/.local/src/setbg-gui/azote/azote/v10_abhier.py")) +hl.bind("CTRL + ALT" .. " + " .. "W", hl.dsp.exec_cmd("sh ~/.local/bin/setbg --random")) +hl.bind("CTRL + SHIFT" .. " + " .. "Escape", hl.dsp.exec_cmd("~/.local/bin/alacritty --class floating -e btop")) +-- bind = CTRL ALT, O, exec, switch_output + + +-- ========== Volume control ========== +-- TODO: formatting/string cleanup +hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ -1%")) +hl.bind("CTRL + ALT" .. " + " .. "numbersign", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ -1%")) +hl.bind("CTRL + SHIFT" .. " + " .. "numbersign", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ -3%")) + +hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ +1%")) +hl.bind("CTRL + ALT" .. " + " .. "plus", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ +1%")) +hl.bind("CTRL + SHIFT" .. " + " .. "plus", hl.dsp.exec_cmd("pactl set-sink-volume @DEFAULT_SINK@ +3%")) + +hl.bind("XF86AudioMute", hl.dsp.exec_cmd("pactl set-sink-mute @DEFAULT_SINK@ toggle")) +hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("pactl set-source-mute @DEFAULT_SOURCE@ toggle")) +hl.bind("CTRL + ALT" .. " + " .. "M", hl.dsp.exec_cmd("pactl set-sink-mute @DEFAULT_SINK@ toggle")) +hl.bind("CTRL + ALT + SHIFT" .. " + " .. "M", hl.dsp.exec_cmd("pactl set-source-mute @DEFAULT_SOURCE@ toggle")) + + +-- ========== Media control ========== +-- TODO: formatting/string cleanup +hl.bind(mainMod .. " + " .. "ALT" .. " + " .. "comma", hl.dsp.exec_cmd("playerctl previous")) +hl.bind(mainMod .. " + " .. "ALT" .. " + " .. "left", hl.dsp.exec_cmd("playerctl previous")) +hl.bind(mainMod .. " + " .. "F7", hl.dsp.exec_cmd("playerctl previous")) + +hl.bind(mainMod .. " + " .. "ALT" .. " + " .. "minus", hl.dsp.exec_cmd("playerctl pause")) +-- bind = $mainMod ALT, up, exec, playerctl pause +-- bind = $mainMod ALT, down, exec, playerctl pause +hl.bind(mainMod .. " + " .. "F8", hl.dsp.exec_cmd("playerctl pause")) + +hl.bind(mainMod .. " + " .. "ALT" .. " + " .. "period", hl.dsp.exec_cmd("playerctl next")) +-- bind = $mainMod ALT, right, exec, playerctl next +hl.bind(mainMod .. " + " .. "F9", hl.dsp.exec_cmd("playerctl next")) + +-- ========== Brightness control ========== +-- TODO: formatting/string cleanup +hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl set 3%-")) +hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl set 3%+")) +hl.bind(mainMod .. " + " .. "XF86AudioLowerVolume", hl.dsp.exec_cmd("~/.local/bin/monitor --dimmer")) +hl.bind(mainMod .. " + " .. "XF86AudioRaiseVolume", hl.dsp.exec_cmd("~/.local/bin/monitor --brighter")) +hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "XF86AudioLowerVolume", hl.dsp.exec_cmd("~/.local/bin/monitor --one_dimmer")) +hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "XF86AudioRaiseVolume", hl.dsp.exec_cmd("~/.local/bin/monitor --one_brighter")) +hl.bind("CTRL + ALT" .. " + " .. "Prior", hl.dsp.exec_cmd("~/.local/bin/monitor --brighter")) +hl.bind("CTRL + ALT + SHIFT" .. " + " .. "Prior", hl.dsp.exec_cmd("~/.local/bin/monitor --one_brighter")) +hl.bind("CTRL + ALT" .. " + " .. "Next", hl.dsp.exec_cmd("~/.local/bin/monitor --dimmer")) +hl.bind("CTRL + ALT + SHIFT" .. " + " .. "Next", hl.dsp.exec_cmd("~/.local/bin/monitor --one_dimmer")) + +-- ========== Screenshots ========== +-- TODO: formatting/string cleanup +-- ---- full ---- +hl.bind("Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --full")) + +-- screenshot of all monitors +hl.bind("CTRL" .. " + " .. "Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --full_clipboard")) + +-- ---- Window ---- +hl.bind("ALT" .. " + " .. "Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --window")) +hl.bind("ALT" .. " + " .. "ssharp", hl.dsp.exec_cmd("~/.local/bin/screenshot --window")) +hl.bind("CTRL + ALT" .. " + " .. "Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --window_clipboard")) +hl.bind("CTRL + ALT" .. " + " .. "ssharp", hl.dsp.exec_cmd("~/.local/bin/screenshot --window_clipboard")) + +-- ---- Selection ---- +hl.bind("SHIFT" .. " + " .. "Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --selection")) +hl.bind("SHIFT" .. " + " .. "Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --selection")) +hl.bind("CTRL + SHIFT" .. " + " .. "Print", hl.dsp.exec_cmd("~/.local/bin/screenshot --selection_clipboard")) +hl.bind("CTRL + SHIFT" .. " + " .. "ssharp", hl.dsp.exec_cmd("~/.local/bin/screenshot --selection_clipboard")) + +-- ---- Monitor ---- +hl.bind(mainMod .. " + " .. "print", hl.dsp.exec_cmd("~/.local/bin/screenshot --monitor")) +hl.bind(mainMod .. " + " .. "CTRL" .. " + " .. "print", hl.dsp.exec_cmd("~/.local/bin/screenshot --monitor_clipboard")) + +-- ---- Open file / folder ---- +hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "Print", hl.dsp.exec_cmd("nautilus --new-window ~/pix/screenshots/nightfury/")) +hl.bind(mainMod .. " + " .. "CTRL + SHIFT" .. " + " .. "Print", hl.dsp.exec_cmd("imv-dir ~/pix/screenshots/nightfury/$(ls -Art ~/pix/screenshots| tail -n 1)")) + +-- TODO: +-- dunstify actions to open file in imv or nautlus +-- SUPER + SHIFT + print open image in imv (or standard image viewer) - if already image in clipboard, save to tmp and open +-- super + ALT+ print open latest file in gimp, if already in clipboard, then open that +-- dismissed idea - copy latest file to clipboard, ignore if theres already a picture in the clipboard +-- use copy montor to clipboard instead - (just copy/paste or open folder) +-- CTRL + SUPER + PRINT copy latest screenshot to clipboard + + +-- ========== window management ========== +-- TODO: formatting/string cleanup +-- Move focus with mainMod + j i k l +hl.bind(mainMod .. " + " .. "j", hl.dsp.focus({ direction = "left" })) +hl.bind(mainMod .. " + " .. "k", hl.dsp.focus({ direction = "down" })) +hl.bind(mainMod .. " + " .. "i", hl.dsp.focus({ direction = "up" })) +hl.bind(mainMod .. " + " .. "l", hl.dsp.focus({ direction = "right" })) + +-- Move focus with mainMod + vim keys +-- bind = $mainMod, h, movefocus, l +-- bind = $mainMod, j, movefocus, d +-- bind = $mainMod, k, movefocus, u +-- bind = $mainMod, l, movefocus, r + +-- 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" })) + +-- Toggle split direction +hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "minus", hl.dsp.layout("togglesplit")) +hl.bind(mainMod .. " + " .. "minus", hl.dsp.layout("togglesplit")) +hl.bind(mainMod .. " + " .. "x", hl.dsp.layout("togglesplit")) + +-- Resize windows, standard was 50 without animations +-- TODO: manual review (unknown dispatcher: resizeactive) +-- hl.bind("$mainMod + CTRL + left", hl.dsp.resizeactive("-70 0")) + +-- TODO: manual review (unknown dispatcher: resizeactive) +-- hl.bind("$mainMod + CTRL + right", hl.dsp.resizeactive("70 0")) + +-- TODO: manual review (unknown dispatcher: resizeactive) +-- hl.bind("$mainMod + CTRL + up", hl.dsp.resizeactive("0 -70")) + +-- TODO: manual review (unknown dispatcher: resizeactive) +-- hl.bind("$mainMod + CTRL + down", hl.dsp.resizeactive("0 70")) + +-- Move windows +-- TODO: check syntax of dispatcher +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "left", { direction = "l" }) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "right", { direction = "r" }) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "up", { direction = "u" }) +-- hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. "down", { direction = "d" }) + +-- 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 }) +hl.bind("SUPER" .. " + " .. "g", hl.dsp.group.toggle()) +hl.bind("SUPER" .. " + " .. "tab", hl.dsp.group.next({ forward = false })) + + +-- TODO: check example config +-- -- 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 }) + + +-- TODO (from Hyprland dev Vaxry): +-- open a (small) flatpak app on a hidden workspace at startup and then close it, +-- so the flatpak stuff is preloaded and app startup is faster +-- bind = $mainMod SHIFT, Return, exec, [workspace 2 silent;float;noanim] alacritty diff --git a/.config/hypr/modules/env.lua b/.config/hypr/modules/env.lua new file mode 100644 index 0000000..38fc684 --- /dev/null +++ b/.config/hypr/modules/env.lua @@ -0,0 +1,71 @@ +------------------------------- +---- ENVIRONMENT VARIABLES ---- +------------------------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/ + +---@module 'hl' + +-- Default hyprland env vars: +hl.env("XDG_CURRENT_DESKTOP", "Hyprland") +hl.env("XDG_SESSION_TYPE", "wayland") +hl.env("XDG_SESSION_DESKTOP", "Hyprland") + +-- Default XDG env vars: +hl.env("XDG_CONFIG_HOME", os.getenv("HOME").."/.config") +hl.env("XDG_DATA_HOME", os.getenv("HOME").."/.local/share") +hl.env("XDG_CACHE_HOME", os.getenv("HOME").."/.cache") +hl.env("XDG_STATE_HOME", os.getenv("HOME").."/.local/state") + +-- Hi-DPI: +hl.env("STEAM_FORCE_DESKTOPUI_SCALING", "2.0") + +-- GTK / GDK / electron wayland +hl.env("GDK_BACKEND", "wayland,x11") +hl.env("ELECTRON_OZONE_PLATFORM_HINT", "wayland") + +-- Default apps: +hl.env("TERMINAL", "alacritty") +hl.env("EDITOR", "zed") +hl.env("DIFFPROG", "nvim -d local_var_1") +hl.env("BROWSER", os.getenv("HOME").."/.local/bin/firefox") + +-- Themes / visual stuff: +hl.env("ADW_COLOR_SCHEME_FORCE_DARK", "1") +hl.env("XCURSOR_PATH", "/usr/share/icons:"..os.getenv("XDG_CONFIG_HOME").."/icons") +hl.env("XCURSOR_SIZE","30") +hl.env("XCURSOR_THEME", "Bibata-Modern-Ice") +hl.env("HYPRCURSOR_SIZE", "30") +-- env = QT_QPA_PLATFORMTHEME, qt5ct +hl.env("QT_STYLE_OVERRIDE", "kvantum") +hl.env("LS_COLORS", "$(vivid generate catppuccin-mocha)") + +-- App settings (home clean-up): +-- hl.env("ANDROID_SDK_HOME", "${XDG_CONFIG_HOME:-$HOME/.config}/android") +-- hl.env("ADB_VENDOR_KEY", "${XDG_CONFIG_HOME:-$HOME/.config}/android") +hl.env("ANDROID_HOME", os.getenv("XDG_DATA_HOME").."/android") +hl.env("GNUPGHOME", os.getenv("XDG_DATA_HOME").."/gnupg") +hl.env("CARGO_HOME", os.getenv("XDG_DATA_HOME").."/cargo") +hl.env("GOPATH", os.getenv("XDG_DATA_HOME").."/go") +hl.env("GOPATH", os.getenv("XDG_CACHE_HOME").."/NuGetPackages") +hl.env("_JAVA_OPTIONS", "-Djava.util.prefs.userRoot="..os.getenv("XDG_CONFIG_HOME").."/java") +hl.env("MOZ_ENABLE_WAYLAND", "1") +hl.env("NPM_CONFIG_USERCONFIG", os.getenv("XDG_CONFIG_HOME").."/npm/npmrc") +hl.env("HISTFILE", os.getenv("XDG_STATE_HOME").."/bash/history") + +-- fix for failing to set vapoursynth path ($ vapoursynth check-env) +hl.env("VSSCRIPT_PATH", "/home/tobias/.local/lib/python3.14/site-packages/vapoursynth/libvsscript.so") +-- env = VSSCRIPT_PATH, /usr/lib/python3.14/site-packages/vapoursynth/libvsscript.so + +-- env = GNUPGHOME, $XDG_DATA_HOME/gnupg + +-- fix Nautilus GTK4 (version 43 and above) slow navigation/file browsing +-- see https://gitlab.gnome.org/GNOME/gtk/-/issues/4831#note_1426699 +-- and https://gitlab.gnome.org/GNOME/nautilus/-/issues/2666 +-- Matthias Clasen (@mathiasc), Maintainer GNOME/gtk: +-- "We expect the a11y infrastructure to be present. +-- You can set GTK_A11Y=none in the environment to run without accessibility." +hl.env("GTK_A11Y", "none") diff --git a/.config/hypr/modules/input.lua b/.config/hypr/modules/input.lua new file mode 100644 index 0000000..774c408 --- /dev/null +++ b/.config/hypr/modules/input.lua @@ -0,0 +1,45 @@ +--------------- +---- INPUT ---- +--------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +hl.config({ + input = { + --- keyboard + kb_layout = "de", + kb_variant = "", + kb_model = "", + kb_options = "", + kb_rules = "", + repeat_delay = 180, -- default: 600 (ms) - was 200ms until Wed 2026-05-20 + repeat_rate = 35, -- default: 25 (repeats per second) + + --- mouse + follow_mouse = 1, + accel_profile = "flat", + sensitivity = 0, -- -1.0 - 1.0, 0 means no modification. + + --- touchpad + touchpad = { + natural_scroll = true, + middle_button_emulation = true, + }, + }, +}) + +-- ========== gestures ========== +hl.gesture({ + fingers = 3, + direction = "horizontal", + action = "workspace" +}) + +-- ========== devices ========== +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more + +hl.device({ + name = "ergo-m575-mouse", + accel_profile = "adaptive", +}) diff --git a/.config/hypr/modules/layouts.lua b/.config/hypr/modules/layouts.lua new file mode 100644 index 0000000..bfe4bcb --- /dev/null +++ b/.config/hypr/modules/layouts.lua @@ -0,0 +1,62 @@ +----------------- +---- LAYOUTS ---- +----------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +hl.config({ + general = { + -- See https://wiki.hyprland.org/Configuring/Variables/ for more + layout = "dwindle", + gaps_in = 5, -- int default: 10 - previously: 6 + gaps_out = 10, -- int default: 20 - previously: 10 + border_size = 2, + resize_on_border = true, + hover_icon_on_border = true, + -- extend_border_grab_area = 200, + + snap = { + enabled = true, -- bool default: false + window_gap = 10, -- int default: 10 + monitor_gap = 10, -- int default: 10 + }, + + col = { + active_border = { colors = { "rgba(33ccffee)", "rgba(ee11eeee)" }, angle = 45 }, + inactive_border = { colors = { "rgb(303046)", "rgb(303046)" }, angle = 90 }, + }, + }, +}) + +--- dwindle layout - see https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more +hl.config({ + dwindle = { + force_split = 0, + preserve_split = false, + preserve_split = true, -- you probably want this + smart_split = false, + smart_resizing = true, + permanent_direction_override = false, + special_scale_factor = 1, + split_width_multiplier = 1.0, + use_active_for_splits = true, + default_split_ratio = 1.0, + split_bias = 0, + precise_mouse_move = false, + }, +}) + +--- master layout - see https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more +hl.config({ + master = { + new_status = "master", + }, +}) + +--- scrolling layout - see https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more +hl.config({ + scrolling = { + fullscreen_on_one_column = true, + }, +}) diff --git a/.config/hypr/modules/misc.lua b/.config/hypr/modules/misc.lua new file mode 100644 index 0000000..074fe9c --- /dev/null +++ b/.config/hypr/modules/misc.lua @@ -0,0 +1,25 @@ +---------------- +---- MISC ---- +---------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +hl.config({ + misc = { + disable_hyprland_logo = true, + focus_on_activate = true, + disable_splash_rendering = true, + enable_swallow = true, + animate_manual_resizes = true, + animate_mouse_windowdragging = true, + + -- mouse_move_enables_dpms = true + -- no_direct_scanout = true -- for fullscreen games + -- swallow_regex = ^(kitty)$ + -- focus_on_activate = true + + -- v0.55.0: misc:vfr moved to debug: as it's a debug variable that should not be changed in prod environments + -- vfr = true + }, +}) diff --git a/.config/hypr/modules/monitors.lua b/.config/hypr/modules/monitors.lua new file mode 100644 index 0000000..0faeb1e --- /dev/null +++ b/.config/hypr/modules/monitors.lua @@ -0,0 +1,102 @@ +------------------ +---- MONITORS ---- +------------------ +-- version 1 +-- last change: Fri 2026-06-12 + +-- See https://wiki.hypr.land/Configuring/Basics/Monitors/ + +-- To list all available monitors (active and inactive): +-- $ hyprctl monitors all + +hl.config({ + render = { + cm_auto_hdr = 1, + direct_scanout = 1, + }, +}) + +hl.monitor({ + output = "desc:Acer Technologies VG270U P 0x847015E8", + mode = "preferred", + position = "0x0", + scale = "1", + vrr = 2, +}) + +hl.monitor({ + output = "desc:LG Electronics LG ULTRAGEAR+ 310NTWGDY841", + mode = "preferred", + position = "2560x0", + scale = "1.25", + bitdepth = 10, + cm = "srgb", + -- cm = "hdr", + vrr = 1, + supports_wide_color = true, + supports_hdr = true, + sdrbrightness = "1.05", + sdrsaturation = "1.15", + -- sdr_min_luminance = 1 + sdr_min_luminance = "0.8", + sdr_max_luminance = 280, + min_luminance = 0, + max_luminance = 1000, + max_avg_luminance = 200 +}) + +hl.monitor({ + output = "desc:Samsung Electric Company Odyssey G70B H1AK500000", + mode = "preferred", + position = "auto-right", + scale = "1.25", + bitdepth = 10, + cm = "srgb", + -- cm = "hdr", + vrr = 1, + supports_wide_color = true, + supports_hdr = true, + sdrbrightness = "1.1", + sdrsaturation = "1.0", + -- sdr_min_luminance = "1", + sdr_min_luminance = "0.1", + -- sdr_max_luminance = "200", + -- min_luminance = "0", + -- max_luminance = "1000", + max_avg_luminance = 200 +}) + +hl.monitor({ + output = "desc:LG Electronics LG TV 0x01010101", + mode = "3840x2160@60", + position = "auto-right", + scale = "2", + bitdepth = 10, + -- cm = "srgb", + cm = "hdr", + scale = "1", + -- vrr = "1", + supports_wide_color = true, + supports_hdr = true, + sdrbrightness = "1.1", + sdrsaturation = "1.0", + -- sdr_min_luminance = "1", + sdr_min_luminance = "0.1", + -- sdr_max_luminance = "200", + -- min_luminance = "0", + -- max_luminance = "1000", + max_avg_luminance = 200 +}) + +-- hl.monitor({ output = "desc:LG Electronics LG TV 0x01010101" disabled = true }) +-- hl.monitor({ output = "desc:Yamaha Corporation RX-S602" disabled = true }) + +-- This will make any monitor that was not specified with an explicit rule +-- automatically placed on the right of the other(s), with its preferred resolution. +-- Recommended rule for quickly plugging in random monitors: +hl.monitor({ + output = "", + mode = "preferred", + position = "auto", + scale = 1, +}) diff --git a/.config/hypr/modules/styling.lua b/.config/hypr/modules/styling.lua new file mode 100644 index 0000000..709cbf0 --- /dev/null +++ b/.config/hypr/modules/styling.lua @@ -0,0 +1,170 @@ +----------------------- +---- LOOK AND FEEL ---- +----------------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +-- See https://wiki.hypr.land/Configuring/Basics/Variables/ for more + +hl.config({ + decoration = { + rounding = 12, -- 5 until 2025-07-07. then 12 | 8px -> hyprbars + dim_inactive = false, + dim_strength = 0.1, + dim_special = 0, + shadow = { + enabled = true, -- bool default: true + range = 22, -- int default: 4 + render_power = 3, -- int default: 3 + color = "rgba(00000070)", -- color default: 0xee1a1a1a old-setting: #rgba(00000077) rgba(1a1a1aee) + offset = "0 0", + -- vec2 = "0 0", -- default: [0, 0] old-setting: 7 7 + -- sharp = false -- bool default: false + -- ignore_window = true -- bool default: true + -- color_inactive -- color default: unset + -- scale = 1.0 -- float default: 1.0 + }, + + -- multisample_edges = true + + blur = { + enabled = true, + size = 12, -- zuvor 5 + passes = 4, + new_optimizations = true, + xray = false, + popups = true, + contrast = 1.0, + brightness = 1, + -- noise = 0.1 + -- ignore_opacity = false + }, + }, +}) + +hl.config({ + animations = { + enabled = true, + -- Animation curves + -- Animation configs + -- der windows 11 dude: + -- Animation curves + -- bezier = md3_standard, 0.2, 0, 0, 1 + -- bezier = md3_decel, 0.05, 0.7, 0.1, 1 + -- bezier = md3_accel, 0.3, 0, 0.8, 0.15 + -- bezier = overshot, 0.05, 0.9, 0.1, 1.1 + -- bezier = crazyshot, 0.1, 1.5, 0.76, 0.92 + -- bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0 + -- bezier = fluent_decel, 0.1, 1, 0, 1 + -- # Animation configs + -- animation = windows, 1, 2, md3_decel, popin 80% + -- animation = border, 1, 10, default + -- animation = fade, 1, 2, default + -- animation = workspaces, 1, 3, md3_decel + -- animation = specialWorkspace, 1, 3, md3_decel, slidevert + }, +}) + + +-- 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 = "dwindle", +-- }, + +-- 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, +-- }, +-- }) +-- +-- TODO: migrate to lua + +-- 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, +-- }) + +--- Layerrules +-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/#layer-rules for more +hl.layer_rule({ match = { namespace = "waybar" }, blur = true }) +hl.layer_rule({ match = { namespace = "rofi" }, blur = true, animation = "popinfade", dim_around = true }) \ No newline at end of file diff --git a/.config/hypr/modules/windowrules.lua b/.config/hypr/modules/windowrules.lua new file mode 100644 index 0000000..89da5a7 --- /dev/null +++ b/.config/hypr/modules/windowrules.lua @@ -0,0 +1,84 @@ +--------------------- +---- WINDOWRULES ---- +--------------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ +-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ + +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, +}) + +hl.window_rule({ + -- fake fullscreen for chromium + name = "chromium-fake-fullscreen", + match = { + class = "chronmium-browser", + }, + + fullscreen_state = 1, +}) + + +-- 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) + + + + +-- TODO: check window rules +-- Hyprland-run windowrule +-- hl.window_rule({ +-- name = "move-hyprland-run", +-- match = { class = "hyprland-run" }, + +-- move = "20 monitor_h-120", +-- float = true, +-- }) + +--- No gaps on fullscreen +-- https://wiki.hyprland.org/Configuring/Workspace-Rules/#smart-gaps +-- To replicate “smart gaps” / “no gaps when only” from other WMs/Compositors, use this bad boy: +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 }) + + +-- hl.window_rule({ +-- name = "fullscreen_state_1", +-- match = { +-- match = "class chronmium-browser", +-- }, +-- -- TODO: review rule: "fullscreen_state 1" +-- }) diff --git a/.config/hypr/modules/workspaces.lua b/.config/hypr/modules/workspaces.lua new file mode 100644 index 0000000..1abb0db --- /dev/null +++ b/.config/hypr/modules/workspaces.lua @@ -0,0 +1,123 @@ +-------------------- +---- WORKSPACES ---- +-------------------- +-- Version 1 +-- Last change: Sun 2026-06-14 using Hyprland v0.55.3-1 +-- Git repo: https://git.fennek.xyz/fennek182/dotfiles + +-- See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ for more + +hl.workspace_rule({ + workspace = 1, + monitor = "desc:Acer Technologies VG270U P 0x847015E8", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 2, + monitor = "desc:Acer Technologies VG270U P 0x847015E8", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 3, + monitor = "desc:Acer Technologies VG270U P 0x847015E8", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 4, + monitor = "desc:Acer Technologies VG270U P 0x847015E8", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 5, + monitor = "desc:LG Electronics LG ULTRAGEAR+ 310NTWGDY841", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 6, + monitor = "desc:LG Electronics LG ULTRAGEAR+ 310NTWGDY841", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 7, + monitor = "desc:LG Electronics LG ULTRAGEAR+ 310NTWGDY841", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 8, + monitor = "desc:LG Electronics LG ULTRAGEAR+ 310NTWGDY841", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 9, + monitor = "desc:Samsung Electric Company Odyssey G70B H1AK500000", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 10, + monitor = "desc:Samsung Electric Company Odyssey G70B H1AK500000", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 11, + monitor = "desc:Samsung Electric Company Odyssey G70B H1AK500000", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 12, + monitor = "desc:Samsung Electric Company Odyssey G70B H1AK500000", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 13, + monitor = "desc:Yamaha Corporation RX-S602", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 14, + monitor = "desc:Yamaha Corporation RX-S602", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 15, + monitor = "desc:Yamaha Corporation RX-S602", + -- is_default = true, +}) + +hl.workspace_rule({ + workspace = 16, + monitor = "desc:Yamaha Corporation RX-S602", + -- d12efault = true, +}) + + +hl.workspace_rule({ + workspace = "w[tv1]", + gaps_out = 0, + gaps_in = 0, +}) + +hl.workspace_rule({ + workspace = "f[1]", + gaps_out = 0, + gaps_in = 0, +}) + +--- No gaps on fullscreen +-- https://wiki.hyprland.org/Configuring/Workspace-Rules/#smart-gaps +-- To replicate “smart gaps” / “no gaps when only” from other WMs/Compositors, use this bad boy: +hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 }) +hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 }) diff --git a/.config/hypr/plugins/dynamic-cursors.lua b/.config/hypr/plugins/dynamic-cursors.lua new file mode 100644 index 0000000..f6e562d --- /dev/null +++ b/.config/hypr/plugins/dynamic-cursors.lua @@ -0,0 +1,120 @@ +hl.plugin("dynamic-cursors", function() + enabled = true + + -- tilt - tilt the cursor based on x-velocity + -- rotate - rotate the cursor based on movement direction + -- stretch - stretch the cursor shape based on direction and velocity + -- none - do not change the cursors behaviour + mode = tilt + + -- minimum angle difference in degrees after which the shape is changed + -- smaller values are smoother, but more expensive for hw cursors + threshold = 1 + + rotate { + -- length in px of the simulated stick used to rotate the cursor + -- most realistic if this is your actual cursor size + length = 30 + + -- clockwise offset applied to the angle in degrees + -- this will apply to ALL shapes + offset = 0.0 + } + + tilt { + -- controls how powerful the tilt is, the lower, the more power + -- this value controls at which speed (px/s) the full tilt is reached + -- the full tilt being 60° in both directions + limit = 2000 + + -- relationship between speed and tilt, supports these values: + -- linear - a linear function is used + -- quadratic - a quadratic function is used (most realistic to actual air drag) + -- negative_quadratic - negative version of the quadratic one, feels more aggressive + -- see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done + function = negative_quadratic + + -- time window (ms) over which the speed is calculated + -- higher values will make slow motions smoother but more delayed + window = 182 + } + + stretch { + -- controls how much the cursor is stretched + -- this value controls at which speed (px/s) the full stretch is reached + -- the full stretch being twice the original length + limit = 3000 + + -- relationship between speed and stretch amount, supports these values: + -- linear - a linear function is used + -- quadratic - a quadratic function is used + -- negative_quadratic - negative version of the quadratic one, feels more aggressive + -- see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done + function = quadratic + + -- time window (ms) over which the speed is calculated + -- higher values will make slow motions smoother but more delayed + window = 100 + } + + -- configure shake to find + -- magnifies the cursor if its is being shaken + shake { + enabled = true + + -- use nearest-neighbour (pixelated) scaling when shaking + -- may look weird when effects are enabled + nearest = false + + -- controls how soon a shake is detected + -- lower values mean sooner + threshold = 2.2 + + -- magnification level immediately after shake start + base = 1.2 + -- magnification increase per second when continuing to shake + speed = 7.0 + -- how much the speed is influenced by the current shake intensitiy + influence = 6.0 + + -- maximal magnification the cursor can reach + -- values below 1 disable the limit (e.g. 0) + limit = 3.2 + + -- time in millseconds the cursor will stay magnified after a shake has ended + timeout = 1300 + + -- show cursor behaviour `tilt`, `rotate`, etc. while shaking + effects = true + + -- enable ipc events for shake + -- see the `ipc` section below + ipc = false + } + + -- use hyprcursor to get a higher resolution texture when the cursor is magnified + -- see the `hyprcursor` section below + hyprcursor { + -- use nearest-neighbour (pixelated) scaling when magnifing beyond texture size + -- this will also have effect without hyprcursor support being enabled + -- 0 / false - never use pixelated scaling + -- 1 / true - use pixelated when no highres image + -- 2 - always use pixleated scaling + nearest = true + + -- enable dedicated hyprcursor support + enabled = true + + -- resolution in pixels to load the magnified shapes at + -- be warned that loading a very high-resolution image will take a long time and might impact memory consumption + -- -1 means we use [normal cursor size] * [shake:base option] + resolution = -1 + + -- shape to use when clientside cursors are being magnified + -- see the shape-name property of shape rules for possible names + + -- specifying clientside will use the actual shape, but will be pixelated + fallback = clientside + } + +end) diff --git a/.config/hypr/plugins/hyprbars.lua b/.config/hypr/plugins/hyprbars.lua new file mode 100644 index 0000000..6de76e8 --- /dev/null +++ b/.config/hypr/plugins/hyprbars.lua @@ -0,0 +1,33 @@ +hl.plugin("hyprbars", function() + -- TODO: check syntax + -- bar_height = 32, -- old value: 36 + -- bar_padding = "12", + -- bar_button_padding = 18, + -- bar_text_size = 11, -- default: 10 + -- bar_blur = true, + -- bar_part_of_window = true, -- default: true + -- bar_precedence_over_border = true, + -- OLD: inactive_button_color = rgb(cdd6f4) + -- inactive_button_color = "rgb(808798)", + -- col.text = "rgb(cdd6f4)", + -- bar_text_font = "Segoe UI", + -- on_double_click = "hyprctl dispatch fullscreen 1", + -- bar_text_align = "left", + -- -- example buttons (R -> L) + -- -- hyprbars-button = color, size, on-click + -- hyprbars-button = { "rgb(ff8ca1)", 16, "󰖭", "hyprctl dispatch killactive" }, + -- -- old value(s): 20 + -- hyprbars-button = { "rgb(8ca2f4)", 16, "", "hyprctl dispatch fullscreen 1" }, + -- hyprbars-button = { "rgb(8ca2f4)", 16, "", "hyprctl dispatch togglefloating" }, + + -- other options: + -- icon_on_hover = true, + -- bar_color = "rgba(1e1e2e77)", + + + + -- bar_text_font = Jetbrains Mono Nerd Font Mono Bold + -- bar_text_font = Comic Sans MS + -- hyprbars-button = rgb(78dcff), 25, , hyprctl dispatch fullscreen 1 + -- hyprbars-button = rgb(78dcff), 20, , hyprctl dispatch fullscreen 1 +end) diff --git a/.config/hypr/plugins/hyprexpo.lua b/.config/hypr/plugins/hyprexpo.lua new file mode 100644 index 0000000..6946c2f --- /dev/null +++ b/.config/hypr/plugins/hyprexpo.lua @@ -0,0 +1,12 @@ + +hl.plugin("hyprexpo", function() + columns = 3, + gap_size = 2, + bg_col = "rgb(1e1e2e)", + skip_empty = true, + workspace_method = "first", + -- [center/first] [workspace] e.g. first 1 or center m+1 // center/current + -- enable_gesture = true # laptop touchpad + -- gesture_distance = 300 # how far is the "max" for the gesture + -- gesture_positive = true # positive = swipe down. Negative = swipe up. +end) diff --git a/.config/hypr/xdg-portal-hyprland b/.config/hypr/xdg-portal-hyprland new file mode 100755 index 0000000..15e178a --- /dev/null +++ b/.config/hypr/xdg-portal-hyprland @@ -0,0 +1,8 @@ +#!/bin/bash +sleep 1 +killall xdg-desktop-portal-hyprland +killall xdg-desktop-portal-wlr +killall xdg-desktop-portal +/usr/libexec/xdg-desktop-portal-hyprland & +sleep 2 +/usr/lib/xdg-desktop-portal &