aboutsummaryrefslogtreecommitdiffstats
path: root/config/hypr/lua
diff options
context:
space:
mode:
Diffstat (limited to 'config/hypr/lua')
-rw-r--r--config/hypr/lua/animations.lua33
-rw-r--r--config/hypr/lua/decorations.lua64
-rw-r--r--config/hypr/lua/env.lua37
-rw-r--r--config/hypr/lua/keybind_helpers.lua355
-rw-r--r--config/hypr/lua/keybinds.lua648
-rw-r--r--config/hypr/lua/laptop-lid.lua22
-rw-r--r--config/hypr/lua/laptops.lua14
-rw-r--r--config/hypr/lua/layer_rules.lua88
-rw-r--r--config/hypr/lua/monitors.lua46
-rw-r--r--config/hypr/lua/screenshot-region.lua13
-rw-r--r--config/hypr/lua/settings.lua179
-rw-r--r--config/hypr/lua/startup.lua71
-rw-r--r--config/hypr/lua/user_decorations_helper.lua28
-rw-r--r--config/hypr/lua/user_defaults.lua33
-rw-r--r--config/hypr/lua/user_keybinds_helper.lua217
-rw-r--r--config/hypr/lua/user_layer_rules_helper.lua16
-rw-r--r--config/hypr/lua/user_overrides.lua156
-rw-r--r--config/hypr/lua/user_startup_helper.lua34
-rw-r--r--config/hypr/lua/user_window_rules_helper.lua16
-rw-r--r--config/hypr/lua/window_rules.lua1110
-rw-r--r--config/hypr/lua/workspaces.lua12
21 files changed, 3192 insertions, 0 deletions
diff --git a/config/hypr/lua/animations.lua b/config/hypr/lua/animations.lua
new file mode 100644
index 00000000..9ba7d709
--- /dev/null
+++ b/config/hypr/lua/animations.lua
@@ -0,0 +1,33 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from config/hypr/UserConfigs/UserAnimations.conf.
+
+hl.config({
+ animations = {
+ enabled = true,
+ },
+})
+
+hl.curve("wind", { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } })
+hl.curve("winIn", { type = "bezier", points = { { 0.1, 1.1 }, { 0.1, 1.1 } } })
+hl.curve("winOut", { type = "bezier", points = { { 0.3, -0.3 }, { 0, 1 } } })
+hl.curve("liner", { type = "bezier", points = { { 1, 1 }, { 1, 1 } } })
+hl.curve("overshot", { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } })
+hl.curve("smoothOut", { type = "bezier", points = { { 0.5, 0 }, { 0.99, 0.99 } } })
+hl.curve("smoothIn", { type = "bezier", points = { { 0.5, -0.5 }, { 0.68, 1.5 } } })
+
+hl.animation({ leaf = "windows", enabled = true, speed = 6, bezier = "wind", style = "slide" })
+hl.animation({ leaf = "windowsIn", enabled = true, speed = 5, bezier = "winIn", style = "slide" })
+hl.animation({ leaf = "windowsOut", enabled = true, speed = 3, bezier = "smoothOut", style = "slide" })
+hl.animation({ leaf = "windowsMove", enabled = true, speed = 5, bezier = "wind", style = "slide" })
+hl.animation({ leaf = "border", enabled = true, speed = 1, bezier = "liner" })
+hl.animation({ leaf = "borderangle", enabled = true, speed = 100, bezier = "liner", style = "loop" })
+hl.animation({ leaf = "fade", enabled = true, speed = 3, bezier = "smoothOut" })
+hl.animation({ leaf = "workspaces", enabled = true, speed = 5, bezier = "overshot" })
+hl.animation({ leaf = "workspacesIn", enabled = true, speed = 5, bezier = "winIn", style = "slide" })
+hl.animation({ leaf = "workspacesOut", enabled = true, speed = 5, bezier = "winOut", style = "slide" })
diff --git a/config/hypr/lua/decorations.lua b/config/hypr/lua/decorations.lua
new file mode 100644
index 00000000..1fe25fd7
--- /dev/null
+++ b/config/hypr/lua/decorations.lua
@@ -0,0 +1,64 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from config/hypr/UserConfigs/UserDecorations.conf.
+-- NOTE: wallust-hyprland.conf is hyprlang-sourced in the original config.
+-- Lua parity for importing that file is still evolving; using static color fallbacks here.
+
+hl.config({
+ general = {
+ border_size = 2,
+ gaps_in = 2,
+ gaps_out = 4,
+ col = {
+ active_border = "rgba(8db4ffff)",
+ inactive_border = "rgba(5f6578ff)",
+ },
+ },
+})
+
+hl.config({
+ decoration = {
+ rounding = 10,
+ active_opacity = 1.0,
+ inactive_opacity = 0.9,
+ fullscreen_opacity = 1.0,
+ dim_inactive = true,
+ dim_strength = 0.1,
+ dim_special = 0.8,
+ shadow = {
+ enabled = true,
+ range = 3,
+ render_power = 1,
+ color = "rgba(8db4ffff)",
+ color_inactive = "rgba(5f6578ff)",
+ },
+ blur = {
+ enabled = true,
+ size = 6,
+ passes = 3,
+ new_optimizations = true,
+ xray = true,
+ ignore_opacity = true,
+ special = true,
+ popups = true,
+ },
+ },
+})
+
+hl.config({
+ group = {
+ col = {
+ border_active = "rgba(ffffffff)",
+ },
+ groupbar = {
+ col = {
+ active = "rgba(0f111aff)",
+ },
+ },
+ },
+})
diff --git a/config/hypr/lua/env.lua b/config/hypr/lua/env.lua
new file mode 100644
index 00000000..f4e6c9e6
--- /dev/null
+++ b/config/hypr/lua/env.lua
@@ -0,0 +1,37 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from:
+-- - config/hypr/configs/ENVariables.conf
+-- - config/hypr/UserConfigs/ENVariables.conf (active values only)
+
+hl.env("DOTS_VERSION", "2.3.23")
+hl.env("GDK_BACKEND", "wayland,x11,*")
+hl.env("QT_QPA_PLATFORM", "wayland;xcb")
+hl.env("CLUTTER_BACKEND", "wayland")
+hl.env("XDG_CURRENT_DESKTOP", "Hyprland")
+hl.env("XDG_SESSION_DESKTOP", "Hyprland")
+hl.env("XDG_SESSION_TYPE", "wayland")
+hl.env("QT_AUTO_SCREEN_SCALE_FACTOR", "1")
+hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1")
+hl.env("QT_QPA_PLATFORMTHEME", "qt6ct")
+hl.env("QT_STYLE_OVERRIDE", "kvantum")
+hl.env("QT_QUICK_CONTROLS_STYLE", "org.hyprland.style")
+hl.env("GDK_SCALE", "1")
+hl.env("QT_SCALE_FACTOR", "1")
+hl.env("MOZ_ENABLE_WAYLAND", "1")
+hl.env("ELECTRON_OZONE_PLATFORM_HINT", "auto")
+
+-- Fix for missing mime-info database error
+local current_data_dirs = os.getenv("XDG_DATA_DIRS") or ""
+if not current_data_dirs:find("/usr/share") then
+ local new_data_dirs = "/usr/local/share:/usr/share"
+ if current_data_dirs ~= "" then
+ new_data_dirs = new_data_dirs .. ":" .. current_data_dirs
+ end
+ hl.env("XDG_DATA_DIRS", new_data_dirs)
+end
diff --git a/config/hypr/lua/keybind_helpers.lua b/config/hypr/lua/keybind_helpers.lua
new file mode 100644
index 00000000..92dc952b
--- /dev/null
+++ b/config/hypr/lua/keybind_helpers.lua
@@ -0,0 +1,355 @@
+local M = {}
+
+local function trim(value)
+ return (value or ""):gsub("^%s+", ""):gsub("%s+$", "")
+end
+local dsp = hl.dsp or hl
+local window_api = (dsp and dsp.window) or hl.window or {}
+local workspace_api = (dsp and dsp.workspace) or {}
+local group_api = (dsp and dsp.group) or {}
+
+local function exec_cmd(cmd)
+ if dsp and dsp.exec_cmd then
+ return dsp.exec_cmd(cmd)
+ end
+ return function()
+ hl.exec_cmd(cmd)
+ end
+end
+
+local function shell_quote(value)
+ return "'" .. tostring(value):gsub("'", "'\\''") .. "'"
+end
+
+local function raw_dispatch_cmd(command)
+ if dsp and dsp.exec_raw then
+ return dsp.exec_raw(tostring(command))
+ end
+ local expression = "hl.dsp.exec_raw(" .. string.format("%q", tostring(command)) .. ")"
+ return exec_cmd("hyprctl dispatch " .. shell_quote(expression))
+end
+
+local function workspace_dispatch(value)
+ if dsp and dsp.focus then
+ return function()
+ hl.dispatch(dsp.focus({ workspace = value }))
+ end
+ end
+ return raw_dispatch_cmd("workspace " .. tostring(value))
+end
+
+local known_dispatchers = {
+ bringactivetotop = true,
+ changegroupactive = true,
+ cyclenext = true,
+ fullscreen = true,
+ killactive = true,
+ layoutmsg = true,
+ movefocus = true,
+ moveintogroup = true,
+ moveoutofgroup = true,
+ movecurrentworkspacetomonitor = true,
+ movetoworkspace = true,
+ movetoworkspacesilent = true,
+ movewindow = true,
+ pseudo = true,
+ resizeactive = true,
+ setprop = true,
+ swapwindow = true,
+ togglegroup = true,
+ togglefloating = true,
+ togglespecialworkspace = true,
+ workspace = true,
+}
+
+local function direction(value)
+ local directions = {
+ l = "left",
+ r = "right",
+ u = "up",
+ d = "down",
+ left = "left",
+ right = "right",
+ up = "up",
+ down = "down",
+ }
+ return directions[trim(value)] or trim(value)
+end
+
+local function workspace_value(value)
+ value = trim(value)
+ return tonumber(value) or value
+end
+
+local function dispatch_factory_safely(factory)
+ pcall(function()
+ local dispatcher = factory()
+ if dispatcher then
+ hl.dispatch(dispatcher)
+ end
+ end)
+end
+
+local function dispatch(name, args)
+ name = trim(name)
+ args = trim(args)
+
+ if args:match("^exec%s*,") then
+ return exec_cmd(trim(args:gsub("^exec%s*,", "", 1)))
+ end
+
+ if name == "exec" then
+ return exec_cmd(args)
+ end
+
+ if known_dispatchers[args] and not known_dispatchers[name] then
+ if args == "movewindow" and window_api.drag then
+ return window_api.drag()
+ end
+ if args == "resizewindow" and window_api.resize then
+ return window_api.resize()
+ end
+ return raw_dispatch_cmd(args)
+ end
+
+ if name == "killactive" and window_api.close then
+ return window_api.close()
+ end
+ if name == "togglefloating" and window_api.float then
+ return window_api.float({ action = "toggle" })
+ end
+ if name == "fullscreen" and window_api.fullscreen then
+ if args == "1" then
+ return window_api.fullscreen({ mode = "maximized" })
+ end
+ return window_api.fullscreen({ mode = "fullscreen" })
+ end
+ if name == "pseudo" and window_api.pseudo then
+ return window_api.pseudo()
+ end
+ if name == "workspace" then
+ return workspace_dispatch(workspace_value(args))
+ end
+ if name == "movetoworkspace" then
+ if window_api.move then
+ return function()
+ hl.dispatch(window_api.move({ workspace = workspace_value(args) }))
+ end
+ end
+ return raw_dispatch_cmd("movetoworkspace " .. args)
+ end
+ if name == "movetoworkspacesilent" then
+ if window_api.move then
+ return function()
+ hl.dispatch(window_api.move({ workspace = workspace_value(args), follow = false }))
+ end
+ end
+ return raw_dispatch_cmd("movetoworkspacesilent " .. args)
+ end
+ if name == "resizeactive" then
+ return raw_dispatch_cmd("resizeactive " .. args)
+ end
+ if name == "movecurrentworkspacetomonitor" then
+ return raw_dispatch_cmd("movecurrentworkspacetomonitor " .. args)
+ end
+ if name == "movefocus" then
+ if dsp and dsp.focus then
+ return function()
+ dispatch_factory_safely(function()
+ return dsp.focus({ direction = direction(args) })
+ end)
+ end
+ end
+ return raw_dispatch_cmd("movefocus " .. args)
+ end
+ if name == "movewindow" then
+ if window_api.move then
+ return function()
+ dispatch_factory_safely(function()
+ return window_api.move({ direction = direction(args) })
+ end)
+ end
+ end
+ return raw_dispatch_cmd("movewindow " .. args)
+ end
+ if name == "swapwindow" then
+ local swap_direction = trim(args)
+ if swap_direction == "" then
+ return nil
+ end
+ return exec_cmd("$HOME/.config/hypr/scripts/LuaSwapWindow.sh " .. swap_direction)
+ end
+ if name == "togglegroup" and group_api.toggle then
+ return group_api.toggle()
+ end
+ if name == "changegroupactive" and group_api.next and group_api.prev then
+ if args == "b" or args == "prev" or args == "-1" then
+ return group_api.prev()
+ end
+ return group_api.next()
+ end
+ if name == "moveintogroup" and window_api.move then
+ return window_api.move({ into_group = direction(args) })
+ end
+ if name == "moveoutofgroup" and window_api.move then
+ return window_api.move({ out_of_group = true })
+ end
+ if name == "layoutmsg" and dsp and dsp.layout then
+ return dsp.layout(args)
+ end
+ if name == "bringactivetotop" and window_api.bring_to_top then
+ return window_api.bring_to_top()
+ end
+ if name == "setprop" and window_api.set_prop then
+ local prop, value = args:match("^(%S+)%s+(.+)$")
+ if prop and value then
+ return window_api.set_prop({ prop = prop, value = value })
+ end
+ end
+
+ if args ~= "" then
+ return raw_dispatch_cmd(name .. " " .. args)
+ end
+ return raw_dispatch_cmd(name)
+end
+
+local function chord(mods, key)
+ mods = trim(mods):gsub("%s+", " + ")
+ key = trim(key)
+ key = key:gsub("^xf86", "XF86")
+ local key_aliases = {
+ XF86AudioPlayPause = "XF86AudioPlay",
+ XF86audiolowervolume = "XF86AudioLowerVolume",
+ XF86audiomute = "XF86AudioMute",
+ XF86audioraisevolume = "XF86AudioRaiseVolume",
+ XF86audiostop = "XF86AudioStop",
+ }
+ key = key_aliases[key] or key
+ local shifted_number_keys = {
+ ["code:10"] = "exclam",
+ ["code:11"] = "at",
+ ["code:12"] = "numbersign",
+ ["code:13"] = "dollar",
+ ["code:14"] = "percent",
+ ["code:15"] = "asciicircum",
+ ["code:16"] = "ampersand",
+ ["code:17"] = "asterisk",
+ ["code:18"] = "parenleft",
+ ["code:19"] = "parenright",
+ }
+ local number_keys = {
+ ["code:10"] = "1",
+ ["code:11"] = "2",
+ ["code:12"] = "3",
+ ["code:13"] = "4",
+ ["code:14"] = "5",
+ ["code:15"] = "6",
+ ["code:16"] = "7",
+ ["code:17"] = "8",
+ ["code:18"] = "9",
+ ["code:19"] = "0",
+ }
+ if mods:match("SHIFT") and shifted_number_keys[key] then
+ key = shifted_number_keys[key]
+ else
+ key = number_keys[key] or key
+ end
+ if mods == "" then
+ return key
+ end
+ return mods .. " + " .. key
+end
+
+local function bind(mods, key, fn, opts)
+ if opts then
+ hl.bind(chord(mods, key), fn, opts)
+ else
+ hl.bind(chord(mods, key), fn)
+ end
+ if mods:match("SHIFT") then
+ local number_key = ({
+ ["code:10"] = "1",
+ ["code:11"] = "2",
+ ["code:12"] = "3",
+ ["code:13"] = "4",
+ ["code:14"] = "5",
+ ["code:15"] = "6",
+ ["code:16"] = "7",
+ ["code:17"] = "8",
+ ["code:18"] = "9",
+ ["code:19"] = "0",
+ })[key]
+ if number_key then
+ if opts then
+ hl.bind(chord(mods, number_key), fn, opts)
+ else
+ hl.bind(chord(mods, number_key), fn)
+ end
+ end
+ end
+end
+
+local function unbind_chord(key_chord)
+ if hl.unbind then
+ pcall(hl.unbind, key_chord)
+ end
+end
+
+local function bindm(mods, key, dispatcher, description)
+ local action = nil
+ if dispatcher == "movewindow" and window_api.drag then
+ action = window_api.drag()
+ elseif dispatcher == "resizewindow" then
+ if window_api.resize then
+ action = window_api.resize()
+ else
+ action = raw_dispatch_cmd("resizewindow")
+ end
+ else
+ action = raw_dispatch_cmd(dispatcher)
+ end
+ bind(mods, key, action, { description = description, mouse = true })
+end
+
+local keys_to_unbind = {
+ "SUPER + V",
+ "SUPER + W",
+ "SUPER + P",
+ "SUPER + N",
+ "SUPER + T",
+ "SUPER + X",
+ "SUPER + CTRL + S",
+ "SUPER + G",
+ "SUPER + ALT + S",
+ "SUPER + F",
+ "SUPER + ALT + F",
+ "SUPER + CTRL + F",
+ "SUPER + CTRL + A",
+ "SUPER + CTRL + B",
+ "SUPER + CTRL + W",
+ "SUPER + CTRL + T",
+ "ALT + TAB",
+ "SUPER + mouse_down",
+ "SUPER + mouse_up",
+ "SUPER + SLASH",
+ "SUPER + code:61",
+ "SUPER + ALT + code:61",
+}
+
+local function unbind_default_keys()
+ for _, key in ipairs(keys_to_unbind) do
+ unbind_chord(key)
+ end
+end
+
+M.window_api = window_api
+M.workspace_api = workspace_api
+M.group_api = group_api
+M.exec_cmd = exec_cmd
+M.raw_dispatch_cmd = raw_dispatch_cmd
+M.dispatch = dispatch
+M.bind = bind
+M.bindm = bindm
+M.unbind_default_keys = unbind_default_keys
+
+return M
diff --git a/config/hypr/lua/keybinds.lua b/config/hypr/lua/keybinds.lua
new file mode 100644
index 00000000..6bf71e47
--- /dev/null
+++ b/config/hypr/lua/keybinds.lua
@@ -0,0 +1,648 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Auto-generated from Keybinds.conf/UserKeybinds.conf for Lua testing
+-- Helper internals live in keybind_helpers.lua so this file stays focused on bindings you may edit.
+-- To add a binding, copy an existing bind(...) line and change:
+-- 1) modifiers (e.g. "SUPER SHIFT")
+-- 2) key (e.g. "Return", "code:10", "mouse_down")
+-- 3) action (exec_cmd(...) or dispatch(...))
+-- 4) description text
+local keybind_helpers = nil
+do
+ local source = (debug.getinfo(1, "S") or {}).source or ""
+ local source_path = source:match("^@(.+)$")
+ local source_dir = source_path and source_path:match("^(.*)/[^/]+$") or nil
+ local home = os.getenv("HOME") or ""
+ local candidate_paths = {
+ source_dir and (source_dir .. "/keybind_helpers.lua") or nil,
+ home ~= "" and (home .. "/.config/hypr/lua/keybind_helpers.lua") or nil,
+ home ~= "" and (home .. "/.config/hypr/keybind_helpers.lua") or nil,
+ }
+
+ local tried_paths = {}
+ for _, helper_path in ipairs(candidate_paths) do
+ if helper_path then
+ table.insert(tried_paths, helper_path)
+ local f = io.open(helper_path, "r")
+ if f then
+ f:close()
+ local loaded_ok, loaded_helpers = pcall(dofile, helper_path)
+ if loaded_ok and type(loaded_helpers) == "table" and loaded_helpers.unbind_default_keys then
+ keybind_helpers = loaded_helpers
+ break
+ end
+ end
+ end
+ end
+
+ if not keybind_helpers then
+ error("Failed to load keybind_helpers.lua from: " .. table.concat(tried_paths, ", "))
+ end
+end
+local window_api = keybind_helpers.window_api
+local exec_cmd = keybind_helpers.exec_cmd
+local raw_dispatch_cmd = keybind_helpers.raw_dispatch_cmd
+local dispatch = keybind_helpers.dispatch
+local bind = keybind_helpers.bind
+local bindm = keybind_helpers.bindm
+
+-- Mass unbind defaults before rebuilding the Lua keymap.
+keybind_helpers.unbind_default_keys()
+
+-- ==================================================
+-- User-editable bindings
+-- ==================================================
+-- Section: Application launchers and utility scripts
+local app_binds = {
+ { "SUPER", "D", "pkill rofi || true && rofi -show drun -modi drun,filebrowser,run,window", "app launcher" },
+ { "SUPER", "B", 'xdg-open "https://"', "open default browser" },
+ { "SUPER", "A", "$HOME/.config/hypr/scripts/OverviewToggle.sh", "desktop overview" },
+ { "SUPER", "Return", "kitty", "Open terminal" },
+ { "SUPER", "E", "thunar", "file manager" },
+ { "SUPER", "C", "$HOME/.config/hypr/scripts/rofi-ssh-menu.sh", "SSH session manager" },
+ { "SUPER", "T", "$HOME/.config/hypr/scripts/ThemeChanger.sh", "Global theme switcher using Wallust" },
+ { "SUPER", "H", "$HOME/.config/hypr/scripts/KeyHints.sh", "help / cheat sheet" },
+ { "SUPER ALT", "R", "$HOME/.config/hypr/scripts/Refresh.sh", "refresh bar and menus" },
+ { "SUPER ALT", "E", "$HOME/.config/hypr/scripts/RofiEmoji.sh", "emoji menu" },
+ { "SUPER", "S", "$HOME/.config/hypr/scripts/RofiSearch.sh", "web search" },
+ { "SUPER CTRL", "S", "rofi -show window", "window switcher" },
+ { "SUPER ALT", "O", "$HOME/.config/hypr/scripts/ChangeBlur.sh", "toggle blur" },
+ { "SUPER SHIFT", "G", "$HOME/.config/hypr/scripts/GameMode.sh", "toggle game mode" },
+ { "SUPER ALT", "L", "$HOME/.config/hypr/scripts/ChangeLayout.sh toggle", "toggle layouts" },
+ { "SUPER ALT", "V", "$HOME/.config/hypr/scripts/ClipManager.sh", "clipboard manager" },
+ { "SUPER CTRL", "R", "$HOME/.config/hypr/scripts/RofiThemeSelector.sh", "rofi theme selector" },
+ {
+ "SUPER CTRL SHIFT",
+ "R",
+ "pkill rofi || true && $HOME/.config/hypr/scripts/RofiThemeSelector-modified.sh",
+ "rofi theme selector (modified)",
+ },
+ { "SUPER CTRL", "K", "$HOME/.config/hypr/scripts/Kitty_themes.sh", "Kitty theme selector" },
+ { "SUPER CTRL", "G", "$HOME/.config/hypr/scripts/Ghostty_themes.sh", "Ghostty theme selector" },
+ {
+ "SUPER SHIFT",
+ "B",
+ "$HOME/.config/hypr/UserScripts/RainbowBorders-low-cpu.sh --run-once",
+ "Set static Rainbow Border",
+ },
+ {
+ "SUPER SHIFT",
+ "H",
+ "$HOME/.config/hypr/scripts/Toggle-Active-Window-Audio.sh",
+ "Toggle Mute/Unmute for Active-Window",
+ },
+ {
+ "ALT SHIFT",
+ "S",
+ "$HOME/.config/hypr/scripts/hyprshot.sh -m region -o $HOME/Pictures/Screenshots",
+ "Hyprshot Screen Capture",
+ },
+ { "SUPER ALT", "SPACE", "$HOME/.config/hypr/scripts/Float-all-Windows.sh", "Float all windows" },
+ -- NOTE: Dropterminal is currently certified only with kitty. Not all terminals behave correctly as a dropdown.
+ { "SUPER SHIFT", "Return", "$HOME/.config/hypr/scripts/Dropterminal.sh kitty", "DropDown terminal" },
+ {
+ "SUPER ALT",
+ "mouse_down",
+ "hyprctl keyword cursor:zoom_factor \"$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor * 2.0}')\"",
+ "zoom in",
+ },
+ {
+ "SUPER ALT",
+ "mouse_up",
+ "hyprctl keyword cursor:zoom_factor \"$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor / 2.0}')\"",
+ "zoom out",
+ },
+ { "SUPER CTRL ALT", "B", "pkill -SIGUSR1 waybar", "toggle waybar on/off" },
+ { "SUPER CTRL", "B", "$HOME/.config/hypr/scripts/WaybarStyles.sh", "waybar styles menu" },
+ { "SUPER ALT", "B", "$HOME/.config/hypr/scripts/WaybarLayout.sh", "waybar layout menu" },
+ { "SUPER", "N", "$HOME/.config/hypr/scripts/Hyprsunset.sh toggle", "Toggle Hyprsunset - night light" },
+ { "SUPER SHIFT", "M", "$HOME/.config/hypr/UserScripts/RofiBeats.sh", "online music" },
+ { "SUPER", "W", "$HOME/.config/hypr/UserScripts/WallpaperSelect.sh", "select wallpaper" },
+ { "SUPER SHIFT", "W", "$HOME/.config/hypr/UserScripts/WallpaperEffects.sh", "wallpaper effects" },
+ { "CTRL ALT", "W", "$HOME/.config/hypr/UserScripts/WallpaperRandom.sh", "random wallpaper" },
+ { "SUPER SHIFT", "K", "$HOME/.config/hypr/scripts/KeyBinds.sh", "search keybinds" },
+ { "SUPER SHIFT", "A", "$HOME/.config/hypr/scripts/Animations.sh", "animations menu" },
+ { "SUPER SHIFT", "O", "$HOME/.config/hypr/UserScripts/ZshChangeTheme.sh", "change oh-my-zsh theme" },
+ { "SUPER ALT", "C", "$HOME/.config/hypr/UserScripts/RofiCalc.sh", "calculator" },
+}
+for _, app in ipairs(app_binds) do
+ bind(app[1], app[2], exec_cmd(app[3]), { description = app[4] })
+end
+--
+--
+-- These are examples of how to bind to a TUI/CLI apps
+-- The specific keybinds are just examples
+-- Do not user as-is as it will break exisitng keybinds
+--
+--
+-- TUI Apps Configuration (commented options from LUA-files/hyprland-key-bindings-example.lua).
+-- local terminal = "uwsm-app -- " .. (os.getenv("TERMINAL") or "")
+-- local browser = "omarchy-launch-browser"
+-- local tui_apps = {
+-- { "CTRL + ALT + O", "opencode", "a opencode", "OpenCode" },
+-- { "CTRL + ALT + SHIFT + A", "cline", "-e cline", "OpenCode" },
+-- { "CTRL + ALT + B", "btop", "-e btop", "Task Manager" },
+-- { "CTRL + ALT + SHIFT + B", "bluetui", "-e bluetui", "BlueTUI" },
+-- { "CTRL + ALT + E", "spf", "-e spf", "SuperFile Manager" },
+-- { "CTRL + ALT + L", "lazygit", "-e lazygit", "LazyGit" },
+-- { "CTRL + ALT + N", "nvtop", "-e nvtop", "Nvtop" },
+-- { "CTRL + ALT + SHIFT + N", "ncdu", "-e ncdu", "Ncdu" },
+-- { "CTRL + ALT + W", "impala", "-e impala", "Impala Wi-Fi" },
+-- { "CTRL + ALT + P", "pacseek", "-e pacseek", "PacSeek" },
+-- { "CTRL + ALT + SHIFT + P", "pacsea", "-e pacsea", "PacSea" },
+-- { "CTRL + ALT + R", "fzf-uninstall", "-e ~/.config/hypr/fzfpurge", "Fzf Uninstaller" },
+-- { "CTRL + ALT + V", "wiremix", "-e wiremix", "WireMix Volume" },
+-- { "CTRL + ALT + SHIFT + H", "htop", "-e htop", "Htop" },
+-- }
+-- for _, app in ipairs(tui_apps) do
+-- hl.bind(app[1], hl.dsp.exec_cmd(terminal .. " --title=" .. app[2] .. " " .. app[3]), { description = app[4] })
+-- end
+
+--
+--
+-- These are examples of how to bind webpages
+-- The specific keybinds are just examples
+-- Do not user as-is as it will break exisitng keybinds
+--
+--
+-- Web Apps Configuration (commented options from LUA-files/hyprland-key-bindings-example.lua).
+-- local web_apps = {
+-- { "SUPER + A", "https://gemini.google.com", "Gemini AI" },
+-- { "SUPER + Y", "https://youtube.com", "YouTube" },
+-- { "SUPER + T", "https://tiktok.com", "TikTok" },
+-- { "SUPER + X", "https://x.com", "X.com" },
+-- { "SUPER + U", "http://10.24.1.1", "Unifi" },
+-- { "SUPER + I", "https://instagram.com", "Instagram" },
+-- { "SUPER + P", "https://mail.proton.me", "Proton Mail" },
+-- }
+-- for _, web in ipairs(web_apps) do
+-- hl.bind(web[1], hl.dsp.exec_cmd([[omarchy-launch-webapp "]] .. web[2] .. [["]]), { description = web[3] })
+-- end
+
+-- Manual example actions not currently active in this config.
+-- hl.bind("SUPER + F", hl.dsp.window.fullscreen({ mode = "fullscreen" }), { description = "Fullscreen Window" })
+-- hl.bind("ALT + SPACE", hl.dsp.window.float({ action = "toggle" }), { description = "Toggle floating" })
+-- hl.bind("CTRL + ALT + return", hl.dsp.exec_cmd("uwsm-app -- kitty"), { description = "Kitty terminal" })
+-- hl.bind(
+-- "CTRL + ALT + SHIFT + return",
+-- hl.dsp.exec_cmd([[uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" tmux new]]),
+-- { description = "Tmux" }
+-- )
+
+-- Section: Window/session controls
+bind("SUPER SHIFT", "F", dispatch("fullscreen", ""), { description = "fullscreen" })
+bind("SUPER CTRL", "F", dispatch("fullscreen", "1"), { description = "maximize window" })
+bind("SUPER", "SPACE", dispatch("togglefloating", ""), { description = "Float current window" })
+bind("SUPER CTRL", "O", dispatch("setprop", "active opaque toggle"), { description = "toggle active window opacity" })
+bind(
+ "ALT_L",
+ "SHIFT_L",
+ dispatch("switch keyboard layout globally", "exec, $HOME/.config/hypr/scripts/KeyboardLayout.sh switch"),
+ { locked = true, description = "switch keyboard layout globally" }
+)
+bind(
+ "SHIFT_L",
+ "ALT_L",
+ dispatch("switch keyboard layout per-window", "exec, $HOME/.config/hypr/scripts/Tak0-Per-Window-Switch.sh"),
+ { locked = true, description = "switch keyboard layout per-window" }
+)
+bind(
+ "SUPER CTRL",
+ "F9",
+ dispatch("movecurrentworkspacetomonitor", "l"),
+ { description = "move workspace to left monitor" }
+)
+bind(
+ "SUPER CTRL",
+ "F10",
+ dispatch("movecurrentworkspacetomonitor", "r"),
+ { description = "move workspace to right monitor" }
+)
+bind(
+ "SUPER CTRL",
+ "F11",
+ dispatch("movecurrentworkspacetomonitor", "u"),
+ { description = "move workspace to up monitor" }
+)
+bind(
+ "SUPER CTRL",
+ "F12",
+ dispatch("movecurrentworkspacetomonitor", "d"),
+ { description = "move workspace to down monitor" }
+)
+bind("CTRL ALT", "Delete", exec_cmd("$HOME/.config/hypr/scripts/Logout.sh"), { description = "exit Hyprland" })
+bind("SUPER", "Q", dispatch("killactive", ""), { description = "close active window" })
+bind(
+ "SUPER SHIFT",
+ "Q",
+ exec_cmd("$HOME/.config/hypr/scripts/KillActiveProcess.sh"),
+ { description = "Terminate active process" }
+)
+bind("CTRL ALT", "L", exec_cmd("$HOME/.config/hypr/scripts/LockScreen.sh"), { description = "lock screen" })
+bind("CTRL ALT", "P", exec_cmd("$HOME/.config/hypr/scripts/Wlogout.sh"), { description = "powermenu" })
+bind("SUPER SHIFT", "N", exec_cmd("swaync-client -t -sw"), { description = "notification panel" })
+bind(
+ "SUPER SHIFT",
+ "E",
+ exec_cmd("$HOME/.config/hypr/scripts/Kool_Quick_Settings.sh"),
+ { description = "Quick settings menu" }
+)
+
+-- Section: Layout and tiling controls
+bind("SUPER CTRL", "D", dispatch("layoutmsg", "removemaster"), { description = "remove master" })
+bind("SUPER", "I", dispatch("layoutmsg", "addmaster"), { description = "add master" })
+bind("SUPER", "j", exec_cmd("$HOME/.config/hypr/scripts/LuaCycleWindow.sh next"), { description = "cycle next" })
+bind(
+ "SUPER",
+ "k",
+ exec_cmd("$HOME/.config/hypr/scripts/LuaCycleWindow.sh previous"),
+ { description = "cycle previous" }
+)
+bind("SUPER CTRL", "Return", dispatch("layoutmsg", "swapwithmaster"), { description = "swap with master" })
+bind("SUPER SHIFT", "I", dispatch("layoutmsg", "togglesplit"), { description = "toggle split (dwindle)" })
+bind("SUPER", "P", dispatch("pseudo", ""), { description = "toggle pseudo (dwindle)" })
+bind("SUPER", "M", raw_dispatch_cmd("splitratio 0.3"), { description = "set split ratio 0.3" })
+bind(
+ "SUPER ALT",
+ "1",
+ exec_cmd("$HOME/.config/hypr/scripts/ChangeLayout.sh dwindle"),
+ { description = "layout dwindle" }
+)
+bind("SUPER ALT", "2", exec_cmd("$HOME/.config/hypr/scripts/ChangeLayout.sh master"), { description = "layout master" })
+bind(
+ "SUPER ALT",
+ "3",
+ exec_cmd("$HOME/.config/hypr/scripts/ChangeLayout.sh scrolling"),
+ { description = "layout scrolling" }
+)
+bind(
+ "SUPER ALT",
+ "4",
+ exec_cmd("$HOME/.config/hypr/scripts/ChangeLayout.sh monocle"),
+ { description = "layout monocle" }
+)
+bind("SUPER SHIFT", "period", dispatch("layoutmsg", "move +col"), { description = "move to right column" })
+bind("SUPER SHIFT", "comma", dispatch("layoutmsg", "move -col"), { description = "move to left column" })
+bind("SUPER ALT", "comma", dispatch("layoutmsg", "swapcol l"), { description = "swap columns left" })
+bind("SUPER ALT", "period", dispatch("layoutmsg", "swapcol r"), { description = "swap columns right" })
+bind(
+ "SUPER ALT",
+ "H",
+ exec_cmd("hyprctl keyword scrolling:direction right"),
+ { description = "Horizonal scroll right" }
+)
+bind("SUPER ALT", "V", exec_cmd("hyprctl keyword scrolling:direction down"), { description = "Vertical Scroll down" })
+bind(
+ "SUPER ALT",
+ "S",
+ exec_cmd(
+ 'bash -c \'[[ $(hyprctl getoption scrolling:direction -j | jq -r ".str") == "right" ]] && hyprctl keyword scrolling:direction down || hyprctl keyword scrolling:direction right\''
+ ),
+ { description = "toggle scrolling V/H" }
+)
+bind("ALT", "Tab", exec_cmd("$HOME/.config/hypr/scripts/LuaCycleWindow.sh next"), { description = "cycle next window" })
+
+-- Section: Audio, media, and hardware keys
+bind(
+ "",
+ "xf86audioraisevolume",
+ dispatch("volume up", "exec, $HOME/.config/hypr/scripts/Volume.sh --inc"),
+ { description = "volume up" }
+)
+bind(
+ "",
+ "xf86audiolowervolume",
+ dispatch("volume down", "exec, $HOME/.config/hypr/scripts/Volume.sh --dec"),
+ { description = "volume down" }
+)
+bind(
+ "ALT",
+ "xf86audioraisevolume",
+ dispatch("volume up precise", "exec, $HOME/.config/hypr/scripts/Volume.sh --inc-precise"),
+ { description = "volume up precise" }
+)
+bind(
+ "ALT",
+ "xf86audiolowervolume",
+ dispatch("volume down precise", "exec, $HOME/.config/hypr/scripts/Volume.sh --dec-precise"),
+ { description = "volume down precise" }
+)
+bind(
+ "",
+ "xf86AudioMicMute",
+ dispatch("toggle mic mute", "exec, $HOME/.config/hypr/scripts/Volume.sh --toggle-mic"),
+ { locked = true, description = "toggle mic mute" }
+)
+bind(
+ "",
+ "xf86audiomute",
+ dispatch("toggle mute", "exec, $HOME/.config/hypr/scripts/Volume.sh --toggle"),
+ { locked = true, description = "toggle mute" }
+)
+bind("", "xf86Sleep", dispatch("sleep", "exec, systemctl suspend"), { locked = true, description = "sleep" })
+bind(
+ "",
+ "xf86Rfkill",
+ dispatch("airplane mode", "exec, $HOME/.config/hypr/scripts/AirplaneMode.sh"),
+ { locked = true, description = "airplane mode" }
+)
+bind(
+ "",
+ "xf86AudioPlayPause",
+ dispatch("play/pause", "exec, $HOME/.config/hypr/scripts/MediaCtrl.sh --pause"),
+ { locked = true, description = "play/pause" }
+)
+bind(
+ "",
+ "xf86AudioPause",
+ dispatch("pause", "exec, $HOME/.config/hypr/scripts/MediaCtrl.sh --pause"),
+ { locked = true, description = "pause" }
+)
+bind(
+ "",
+ "xf86AudioPlay",
+ dispatch("play", "exec, $HOME/.config/hypr/scripts/MediaCtrl.sh --pause"),
+ { locked = true, description = "play" }
+)
+bind(
+ "",
+ "xf86AudioNext",
+ dispatch("next track", "exec, $HOME/.config/hypr/scripts/MediaCtrl.sh --nxt"),
+ { locked = true, description = "next track" }
+)
+bind(
+ "",
+ "xf86AudioPrev",
+ dispatch("previous track", "exec, $HOME/.config/hypr/scripts/MediaCtrl.sh --prv"),
+ { locked = true, description = "previous track" }
+)
+bind(
+ "",
+ "xf86audiostop",
+ dispatch("stop", "exec, $HOME/.config/hypr/scripts/MediaCtrl.sh --stop"),
+ { locked = true, description = "stop" }
+)
+
+-- Section: Screenshot bindings
+bind("SUPER", "Print", exec_cmd("$HOME/.config/hypr/scripts/ScreenShot.sh --now"), { description = "screenshot now" })
+bind(
+ "SUPER SHIFT",
+ "Print",
+ exec_cmd("$HOME/.config/hypr/scripts/ScreenShot.sh --area"),
+ { description = "screenshot (area)" }
+)
+bind(
+ "SUPER CTRL",
+ "Print",
+ exec_cmd("$HOME/.config/hypr/scripts/ScreenShot.sh --in5"),
+ { description = "screenshot in 5s" }
+)
+bind(
+ "SUPER CTRL SHIFT",
+ "Print",
+ exec_cmd("$HOME/.config/hypr/scripts/ScreenShot.sh --in10"),
+ { description = "screenshot in 10s" }
+)
+bind(
+ "ALT",
+ "Print",
+ exec_cmd("$HOME/.config/hypr/scripts/ScreenShot.sh --active"),
+ { description = "screenshot active window" }
+)
+bind(
+ "SUPER SHIFT",
+ "S",
+ exec_cmd("$HOME/.config/hypr/scripts/ScreenShot.sh --swappy"),
+ { description = "screenshot (swappy)" }
+)
+-- Keep legacy script-based resize bindings commented for quick rollback during Lua API migration.
+-- These call ResizeActive.sh and are preserved in case native hl.dsp/hl.window resize behavior regresses.
+-- bind(
+-- "SUPER SHIFT",
+-- "left",
+-- exec_cmd("bash $HOME/.config/hypr/scripts/ResizeActive.sh -50 0"),
+-- { description = "resize left (-50)" }
+-- )
+-- bind(
+-- "SUPER SHIFT",
+-- "right",
+-- exec_cmd("bash $HOME/.config/hypr/scripts/ResizeActive.sh 50 0"),
+-- { description = "resize right (+50)" }
+-- )
+-- bind(
+-- "SUPER SHIFT",
+-- "up",
+-- exec_cmd("bash $HOME/.config/hypr/scripts/ResizeActive.sh 0 -50"),
+-- { description = "resize up (-50)" }
+-- )
+-- bind(
+-- "SUPER SHIFT",
+-- "down",
+-- exec_cmd("bash $HOME/.config/hypr/scripts/ResizeActive.sh 0 50"),
+-- { description = "resize down (+50)" }
+-- )
+bind(
+ "SUPER SHIFT",
+ "left",
+ dispatch("resizeactive", "-50 0"),
+ { description = "resize left (-50)" }
+)
+bind(
+ "SUPER SHIFT",
+ "right",
+ dispatch("resizeactive", "50 0"),
+ { description = "resize right (+50)" }
+)
+bind("SUPER SHIFT", "up", dispatch("resizeactive", "0 -50"), { description = "resize up (-50)" })
+bind(
+ "SUPER SHIFT",
+ "down",
+ dispatch("resizeactive", "0 50"),
+ { description = "resize down (+50)" }
+)
+-- Keep legacy directional move script binds commented for rollback during Lua API migration.
+-- Native movewindow dispatch below replaces LuaMoveWindowDirectional.sh usage.
+-- bind(
+-- "SUPER CTRL",
+-- "left",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaMoveWindowDirectional.sh left"),
+-- { description = "move window left" }
+-- )
+-- bind(
+-- "SUPER CTRL",
+-- "right",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaMoveWindowDirectional.sh right"),
+-- { description = "move window right" }
+-- )
+
+-- Section: Window resize, move, swap, and grouping
+bind("SUPER CTRL", "left", dispatch("movewindow", "l"), { description = "move window left" })
+bind("SUPER CTRL", "right", dispatch("movewindow", "r"), { description = "move window right" })
+bind("SUPER CTRL", "up", dispatch("movewindow", "u"), { description = "move window up" })
+bind("SUPER CTRL", "down", dispatch("movewindow", "d"), { description = "move window down" })
+bind(
+ "SUPER ALT",
+ "left",
+ exec_cmd("$HOME/.config/hypr/scripts/LuaSwapWindow.sh l"),
+ { description = "swap window left" }
+)
+bind(
+ "SUPER ALT",
+ "right",
+ exec_cmd("$HOME/.config/hypr/scripts/LuaSwapWindow.sh r"),
+ { description = "swap window right" }
+)
+bind("SUPER ALT", "up", exec_cmd("$HOME/.config/hypr/scripts/LuaSwapWindow.sh u"), { description = "swap window up" })
+bind(
+ "SUPER ALT",
+ "down",
+ exec_cmd("$HOME/.config/hypr/scripts/LuaSwapWindow.sh d"),
+ { description = "swap window down" }
+)
+bind("SUPER", "G", dispatch("togglegroup", ""), { description = "toggle group" })
+bind("SUPER", "Tab", dispatch("changegroupactive", "f"), { description = "Change Group Forward" })
+bind("SUPER CTRL", "tab", dispatch("changegroupactive", ""), { description = "change active in group" })
+bind("SUPER SHIFT", "Tab", dispatch("changegroupactive", "b"), { description = "Change Group Back" })
+bind("SUPER CTRL", "K", dispatch("moveintogroup", "l"), { description = "Move left into group" })
+bind("SUPER CTRL", "L", dispatch("moveintogroup", "r"), { description = "Move Right into group" })
+bind("SUPER CTRL", "H", dispatch("moveoutofgroup", ""), { description = "Move active out of group" })
+bind("SUPER", "left", dispatch("movefocus", "l"), { description = "focus left" })
+bind("SUPER", "right", dispatch("movefocus", "r"), { description = "focus right" })
+bind("SUPER", "up", dispatch("movefocus", "u"), { description = "focus up" })
+bind("SUPER", "down", dispatch("movefocus", "d"), { description = "focus down" })
+
+-- Section: Workspace navigation and assignment
+-- Keep legacy relative workspace focus script binds commented for rollback during Lua API migration.
+-- Native workspace dispatch below replaces LuaFocusWorkspaceRelative.sh usage.
+-- bind(
+-- "SUPER",
+-- "tab",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaFocusWorkspaceRelative.sh next"),
+-- { description = "next workspace" }
+-- )
+-- bind(
+-- "SUPER SHIFT",
+-- "tab",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaFocusWorkspaceRelative.sh previous"),
+-- { description = "previous workspace" }
+-- )
+bind("SUPER", "tab", dispatch("workspace", "e+1"), { description = "next workspace" })
+bind("SUPER SHIFT", "tab", dispatch("workspace", "e-1"), { description = "previous workspace" })
+bind("SUPER SHIFT", "U", dispatch("movetoworkspace", "special"), { description = "move to special workspace" })
+bind("SUPER", "U", dispatch("togglespecialworkspace", ""), { description = "toggle special workspace" })
+bind("SUPER", "code:10", dispatch("workspace", "1"), { description = "workspace 1" })
+bind("SUPER", "code:11", dispatch("workspace", "2"), { description = "workspace 2" })
+bind("SUPER", "code:12", dispatch("workspace", "3"), { description = "workspace 3" })
+bind("SUPER", "code:13", dispatch("workspace", "4"), { description = "workspace 4" })
+bind("SUPER", "code:14", dispatch("workspace", "5"), { description = "workspace 5" })
+bind("SUPER", "code:15", dispatch("workspace", "6"), { description = "workspace 6" })
+bind("SUPER", "code:16", dispatch("workspace", "7"), { description = "workspace 7" })
+bind("SUPER", "code:17", dispatch("workspace", "8"), { description = "workspace 8" })
+bind("SUPER", "code:18", dispatch("workspace", "9"), { description = "workspace 9" })
+bind("SUPER", "code:19", dispatch("workspace", "10"), { description = "workspace 10" })
+bind("SUPER SHIFT", "code:10", dispatch("movetoworkspace", "1"), { description = "move to workspace 1" })
+bind("SUPER SHIFT", "code:11", dispatch("movetoworkspace", "2"), { description = "move to workspace 2" })
+bind("SUPER SHIFT", "code:12", dispatch("movetoworkspace", "3"), { description = "move to workspace 3" })
+bind("SUPER SHIFT", "code:13", dispatch("movetoworkspace", "4"), { description = "move to workspace 4" })
+bind("SUPER SHIFT", "code:14", dispatch("movetoworkspace", "5"), { description = "move to workspace 5" })
+bind("SUPER SHIFT", "code:15", dispatch("movetoworkspace", "6"), { description = "move to workspace 6" })
+bind("SUPER SHIFT", "code:16", dispatch("movetoworkspace", "7"), { description = "move to workspace 7" })
+bind("SUPER SHIFT", "code:17", dispatch("movetoworkspace", "8"), { description = "move to workspace 8" })
+bind("SUPER SHIFT", "code:18", dispatch("movetoworkspace", "9"), { description = "move to workspace 9" })
+bind("SUPER SHIFT", "code:19", dispatch("movetoworkspace", "10"), { description = "move to workspace 10" })
+-- Keep legacy relative move-to-workspace script binds commented for rollback during Lua API migration.
+-- Native movetoworkspace dispatch below replaces LuaMoveWindowWorkspaceRelative.sh usage.
+-- bind(
+-- "SUPER SHIFT",
+-- "bracketleft",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaMoveWindowWorkspaceRelative.sh previous"),
+-- { description = "move to previous workspace" }
+-- )
+-- bind(
+-- "SUPER SHIFT",
+-- "bracketright",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaMoveWindowWorkspaceRelative.sh next"),
+-- { description = "move to next workspace" }
+-- )
+bind("SUPER SHIFT", "bracketleft", dispatch("movetoworkspace", "-1"), { description = "move to previous workspace" })
+bind("SUPER SHIFT", "bracketright", dispatch("movetoworkspace", "+1"), { description = "move to next workspace" })
+bind("SUPER CTRL", "code:10", dispatch("movetoworkspacesilent", "1"), { description = "move silently to workspace 1" })
+bind("SUPER CTRL", "code:11", dispatch("movetoworkspacesilent", "2"), { description = "move silently to workspace 2" })
+bind("SUPER CTRL", "code:12", dispatch("movetoworkspacesilent", "3"), { description = "move silently to workspace 3" })
+bind("SUPER CTRL", "code:13", dispatch("movetoworkspacesilent", "4"), { description = "move silently to workspace 4" })
+bind("SUPER CTRL", "code:14", dispatch("movetoworkspacesilent", "5"), { description = "move silently to workspace 5" })
+bind("SUPER CTRL", "code:15", dispatch("movetoworkspacesilent", "6"), { description = "move silently to workspace 6" })
+bind("SUPER CTRL", "code:16", dispatch("movetoworkspacesilent", "7"), { description = "move silently to workspace 7" })
+bind("SUPER CTRL", "code:17", dispatch("movetoworkspacesilent", "8"), { description = "move silently to workspace 8" })
+bind("SUPER CTRL", "code:18", dispatch("movetoworkspacesilent", "9"), { description = "move silently to workspace 9" })
+bind(
+ "SUPER CTRL",
+ "code:19",
+ dispatch("movetoworkspacesilent", "10"),
+ { description = "move silently to workspace 10" }
+)
+-- Keep legacy silent relative move-to-workspace script binds commented for rollback during Lua API migration.
+-- Native movetoworkspacesilent dispatch below replaces LuaMoveWindowWorkspaceRelative.sh usage.
+-- bind(
+-- "SUPER CTRL",
+-- "bracketleft",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaMoveWindowWorkspaceRelative.sh previous"),
+-- { description = "move silently to previous workspace" }
+-- )
+-- bind(
+-- "SUPER CTRL",
+-- "bracketright",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaMoveWindowWorkspaceRelative.sh next"),
+-- { description = "move silently to next workspace" }
+-- )
+bind(
+ "SUPER CTRL",
+ "bracketleft",
+ dispatch("movetoworkspacesilent", "-1"),
+ { description = "move silently to previous workspace" }
+)
+bind(
+ "SUPER CTRL",
+ "bracketright",
+ dispatch("movetoworkspacesilent", "+1"),
+ { description = "move silently to next workspace" }
+)
+-- Keep legacy scroll/period/comma workspace focus script binds commented for rollback during Lua API migration.
+-- Native workspace dispatch below replaces LuaFocusWorkspaceRelative.sh usage.
+-- bind(
+-- "SUPER",
+-- "mouse_down",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaFocusWorkspaceRelative.sh next"),
+-- { description = "next workspace" }
+-- )
+-- bind(
+-- "SUPER",
+-- "mouse_up",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaFocusWorkspaceRelative.sh previous"),
+-- { description = "previous workspace" }
+-- )
+-- bind(
+-- "SUPER",
+-- "period",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaFocusWorkspaceRelative.sh next"),
+-- { description = "next workspace" }
+-- )
+-- bind(
+-- "SUPER",
+-- "comma",
+-- exec_cmd("$HOME/.config/hypr/scripts/LuaFocusWorkspaceRelative.sh previous"),
+-- { description = "previous workspace" }
+-- )
+bind("SUPER", "mouse_down", dispatch("workspace", "e+1"), { description = "next workspace" })
+bind("SUPER", "mouse_up", dispatch("workspace", "e-1"), { description = "previous workspace" })
+bind("SUPER", "period", dispatch("workspace", "e+1"), { description = "next workspace" })
+bind("SUPER", "comma", dispatch("workspace", "e-1"), { description = "previous workspace" })
+
+-- Section: Mouse drag/resize bindings
+bindm("SUPER", "mouse:272", "movewindow", "move window")
+bindm("SUPER", "mouse:273", "resizewindow", "resize window")
diff --git a/config/hypr/lua/laptop-lid.lua b/config/hypr/lua/laptop-lid.lua
new file mode 100644
index 00000000..5792791f
--- /dev/null
+++ b/config/hypr/lua/laptop-lid.lua
@@ -0,0 +1,22 @@
+-- # ==================================================
+-- # KoolDots (2026)
+-- # Project URL: https://github.com/LinuxBeginnings
+-- # License: GNU GPLv3
+-- # SPDX-License-Identifier: GPL-3.0-or-later
+-- # ==================================================
+--
+-- Sample code to handle disbling eDP-1 when lid closed
+-- Code written by @star on TheBlacDon's discord server
+-- Thank you
+--
+-- Lid close: remove laptop panel from layout
+hl.bind("switch:on:Lid Switch", function()
+ -- hl.dispatch(hl.dsp.dpms({ action = "disable", monitor = "eDP-1" }))
+ hl.monitor({ output = "eDP-1", disabled = true })
+end)
+
+-- Lid open: restore laptop panel
+hl.bind("switch:off:Lid Switch", function()
+ -- hl.dispatch(hl.dsp.dpms({ action = "enable", monitor = "eDP-1" }))
+ hl.monitor({ output = "eDP-1", disabled = false })
+end)
diff --git a/config/hypr/lua/laptops.lua b/config/hypr/lua/laptops.lua
new file mode 100644
index 00000000..7da9bdc2
--- /dev/null
+++ b/config/hypr/lua/laptops.lua
@@ -0,0 +1,14 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from:
+-- - config/hypr/configs/Laptops.conf
+-- - config/hypr/UserConfigs/Laptops.conf
+-- - config/hypr/UserConfigs/LaptopDisplay.conf
+--
+-- No active laptop rules are currently enabled in the source files.
+-- Add hl.bind(...) and/or hl.monitor(...) entries here when enabling laptop-lid logic.
diff --git a/config/hypr/lua/layer_rules.lua b/config/hypr/lua/layer_rules.lua
new file mode 100644
index 00000000..c40c3256
--- /dev/null
+++ b/config/hypr/lua/layer_rules.lua
@@ -0,0 +1,88 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+-- Auto-generated from config/hypr/configs/LayerRules.conf for Lua testing.
+-- Edit the source LayerRules.conf and regenerate this file when vendor rules change.
+
+local function apply_layer_rule(rule)
+ if hl.layer_rule then
+ hl.layer_rule(rule)
+ end
+end
+
+apply_layer_rule({
+ name = "layerrule-001",
+ match = {
+ namespace = "rofi",
+ },
+ blur = true,
+ ignore_alpha = 0,
+ animation = "slide",
+})
+
+apply_layer_rule({
+ name = "layerrule-002",
+ match = {
+ namespace = "notifications",
+ },
+ blur = true,
+ ignore_alpha = 0,
+ animation = "slide",
+})
+
+apply_layer_rule({
+ name = "layerrule-003",
+ match = {
+ namespace = "quickshell:overview",
+ },
+ blur = true,
+ ignore_alpha = 0.5,
+})
+
+apply_layer_rule({
+ name = "layerrule-004",
+ match = {
+ namespace = "wallpaper",
+ },
+ blur = true,
+ ignore_alpha = 0,
+})
+
+apply_layer_rule({
+ name = "layerrule-005",
+ match = {
+ namespace = "swaync-control-center",
+ },
+ blur = true,
+ ignore_alpha = 0,
+})
+
+apply_layer_rule({
+ name = "layerrule-006",
+ match = {
+ namespace = "swaync-notification-window",
+ },
+ blur = true,
+ ignore_alpha = 0,
+})
+
+apply_layer_rule({
+ name = "layerrule-007",
+ match = {
+ namespace = "com.aurora.keybinds_help",
+ },
+ blur = true,
+ ignore_alpha = 0,
+})
+
+apply_layer_rule({
+ name = "layerrule-008",
+ match = {
+ namespace = "logout_dialog",
+ },
+ blur = true,
+ ignore_alpha = 0,
+})
diff --git a/config/hypr/lua/monitors.lua b/config/hypr/lua/monitors.lua
new file mode 100644
index 00000000..c04735d7
--- /dev/null
+++ b/config/hypr/lua/monitors.lua
@@ -0,0 +1,46 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from config/hypr/monitors.conf (active monitor entries only).
+
+hl.monitor({
+ output = "",
+ mode = "preferred",
+ position = "auto",
+ scale = "1",
+})
+
+hl.monitor({
+ output = "",
+ mode = "highrr",
+ position = "auto",
+ scale = "1",
+})
+
+hl.monitor({
+ output = "",
+ mode = "highres",
+ position = "auto",
+ scale = "1",
+})
+
+hl.monitor({
+ output = "Virtual-1",
+ mode = "1920x1080@60",
+ position = "auto",
+ scale = "1",
+})
+
+-- Load user monitor overrides from UserConfigs when present.
+do
+ local configHome = os.getenv("XDG_CONFIG_HOME") or ((os.getenv("HOME") or "") .. "/.config")
+ local userMonitors = configHome .. "/hypr/UserConfigs/monitors.lua"
+ local ok, err = pcall(dofile, userMonitors)
+ if not ok and err and tostring(err):find("No such file or directory", 1, true) == nil then
+ print("[WARN] Unable to load user monitor overrides from " .. userMonitors .. ": " .. tostring(err))
+ end
+end
diff --git a/config/hypr/lua/screenshot-region.lua b/config/hypr/lua/screenshot-region.lua
new file mode 100644
index 00000000..6ba83bff
--- /dev/null
+++ b/config/hypr/lua/screenshot-region.lua
@@ -0,0 +1,13 @@
+-- Found on Hyprland discord
+-- Possible replacement for screenshot.sh
+
+function screenshot(file_prefix, region)
+ local file = "$HOME/Pictures/Screenshots/"
+ .. file_prefix
+ .. os.date("-%Y-%m-%d_%Hh-%Mm-%Ss_" .. math.random(100000) .. ".png")
+ local grim = 'grim -g "' .. region .. '" ' .. file
+ local message = " && notify-send Screenshot saved"
+ local copy = " && wl-copy < " .. file
+
+ hl.dispatch(hl.dsp.exec_cmd(grim .. message .. copy))
+end
diff --git a/config/hypr/lua/settings.lua b/config/hypr/lua/settings.lua
new file mode 100644
index 00000000..78ae61e2
--- /dev/null
+++ b/config/hypr/lua/settings.lua
@@ -0,0 +1,179 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from:
+-- - config/hypr/configs/SystemSettings.conf
+-- - config/hypr/UserConfigs/UserSettings.conf (currently empty)
+
+local scriptsDir = "$HOME/.config/hypr/scripts"
+
+hl.config({
+ dwindle = {
+ preserve_split = true,
+ smart_resizing = true,
+ use_active_for_splits = true,
+ smart_split = false,
+ default_split_ratio = 1.0,
+ split_bias = 0,
+ precise_mouse_move = false,
+ special_scale_factor = 0.8,
+ },
+})
+
+hl.config({
+ master = {
+ new_status = "slave",
+ new_on_top = false,
+ new_on_active = "none",
+ orientation = "left",
+ mfact = 0.55,
+ slave_count_for_center_master = 2,
+ center_master_fallback = "left",
+ smart_resizing = true,
+ drop_at_cursor = true,
+ always_keep_position = false,
+ },
+})
+
+hl.config({
+ scrolling = {
+ column_width = 0.80,
+ fullscreen_on_one_column = true,
+ direction = "right",
+ follow_focus = true,
+ },
+})
+
+hl.config({
+ general = {
+ resize_on_border = true,
+ layout = "dwindle",
+ },
+})
+
+hl.config({
+ input = {
+ kb_layout = "us",
+ kb_variant = "",
+ kb_model = "",
+ kb_options = "",
+ kb_rules = "",
+ repeat_rate = 50,
+ repeat_delay = 300,
+ sensitivity = 0,
+ numlock_by_default = true,
+ left_handed = false,
+ follow_mouse = 1,
+ float_switch_override_focus = false,
+ touchpad = {
+ disable_while_typing = true,
+ natural_scroll = true,
+ clickfinger_behavior = false,
+ middle_button_emulation = false,
+ tap_to_click = true,
+ drag_lock = false,
+ },
+ touchdevice = {
+ enabled = true,
+ },
+ tablet = {
+ transform = 0,
+ left_handed = 0,
+ },
+ },
+})
+
+hl.config({
+ gestures = {
+ workspace_swipe_distance = 300,
+ workspace_swipe_touch = false,
+ workspace_swipe_invert = true,
+ workspace_swipe_min_speed_to_force = 30,
+ workspace_swipe_cancel_ratio = 0.5,
+ workspace_swipe_create_new = true,
+ workspace_swipe_direction_lock = true,
+ workspace_swipe_forever = false,
+ workspace_swipe_use_r = false,
+ close_max_timeout = 100,
+ },
+})
+
+hl.gesture({
+ fingers = 3,
+ direction = "horizontal",
+ action = "workspace",
+})
+
+-- Complex dispatcher gestures from SystemSettings.conf are pending explicit Lua API parity:
+-- gesture = 3, up, dispatcher, exec, hyprctl keyword cursor:zoom_factor ...
+-- gesture = 3, down, dispatcher, exec, hyprctl keyword cursor:zoom_factor ...
+-- gesture = 4, up, dispatcher, exec, $scriptsDir/OverviewToggle.sh
+-- gesture = 4, down, float
+
+hl.config({
+ misc = {
+ force_default_wallpaper = 0,
+ disable_hyprland_logo = true,
+ disable_splash_rendering = true,
+ -- Setting vrr 0, issues with MPV/VLC at fullscreen
+ -- vrr 0, disable, vrr 1, always on, vrr 2, on at full screen
+ vrr = 0,
+ mouse_move_enables_dpms = true,
+ enable_swallow = false,
+ swallow_regex = "^(kitty)$",
+ focus_on_activate = false,
+ initial_workspace_tracking = 0,
+ middle_click_paste = false,
+ enable_anr_dialog = true,
+ anr_missed_pings = 15,
+ allow_session_lock_restore = true,
+ on_focus_under_fullscreen = 1,
+ },
+})
+
+hl.config({
+ binds = {
+ workspace_back_and_forth = true,
+ allow_workspace_cycles = true,
+ pass_mouse_when_bound = false,
+ },
+})
+
+hl.config({
+ xwayland = {
+ enabled = true,
+ force_zero_scaling = true,
+ },
+})
+
+hl.config({
+ render = {
+ direct_scanout = 0,
+ },
+})
+
+hl.config({
+ cursor = {
+ sync_gsettings_theme = true,
+ no_hardware_cursors = 2,
+ enable_hyprcursor = true,
+ warp_on_change_workspace = 2,
+ no_warps = true,
+ no_break_fs_vrr = false,
+ min_refresh_rate = 24,
+ hotspot_padding = 1,
+ inactive_timeout = 0,
+ default_monitor = "",
+ zoom_factor = 1.0,
+ zoom_rigid = false,
+ zoom_detached_camera = true,
+ hide_on_key_press = true,
+ hide_on_touch = false,
+ hide_on_tablet = false,
+ use_cpu_buffer = false,
+ },
+})
diff --git a/config/hypr/lua/startup.lua b/config/hypr/lua/startup.lua
new file mode 100644
index 00000000..6c189113
--- /dev/null
+++ b/config/hypr/lua/startup.lua
@@ -0,0 +1,71 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from:
+-- - config/hypr/configs/Startup_Apps.conf
+-- - config/hypr/UserConfigs/Startup_Apps.conf
+
+local scriptsDir = "$HOME/.config/hypr/scripts"
+local userScripts = "$HOME/.config/hypr/UserScripts"
+local wallDir = "$HOME/Pictures/wallpapers"
+local session = os.getenv("HYPRLAND_INSTANCE_SIGNATURE") or "default"
+local function shell_quote(value)
+ return "'" .. tostring(value):gsub("'", "'\\''") .. "'"
+end
+local function exec_once(cmd)
+ -- Why this wrapper exists:
+ -- 1) Enforce once-per-Hypr-session startup behavior using marker files.
+ -- 2) Avoid startup race conditions by waiting for Wayland/Hypr sockets.
+ -- 3) Capture per-command logs to simplify troubleshooting in user setups.
+
+ local key = cmd:gsub("[^%w_.-]", "_"):sub(1, 80)
+ local marker = "/tmp/hypr-lua-exec-once-" .. session .. "-" .. key
+ local log = "/tmp/hypr-lua-startup-" .. key .. ".log"
+ local readiness = "runtime=${XDG_RUNTIME_DIR:-/run/user/$(id -u)}; export XDG_RUNTIME_DIR=\"$runtime\"; for _ in $(seq 1 200); do if [ -n \"$WAYLAND_DISPLAY\" ] && [ -S \"$runtime/$WAYLAND_DISPLAY\" ]; then break; fi; for sock in \"$runtime\"/wayland-[0-9]*; do [ -S \"$sock\" ] || continue; case \"$(basename \"$sock\")\" in *awww*) continue ;; esac; export WAYLAND_DISPLAY=\"$(basename \"$sock\")\"; break 2; done; sleep 0.1; done; if [ -n \"$HYPRLAND_INSTANCE_SIGNATURE\" ]; then hypr_sock=\"$runtime/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket.sock\"; for _ in $(seq 1 200); do [ -S \"$hypr_sock\" ] && break; sleep 0.1; done; fi"
+ local inner = readiness .. "; " .. cmd
+ local script = "[ -e " .. shell_quote(marker) .. " ] || { touch " .. shell_quote(marker) .. " && sh -lc " .. shell_quote(inner) .. " >>" .. shell_quote(log) .. " 2>&1 & }"
+ os.execute("sh -lc " .. shell_quote(script))
+end
+-- Prefer lifecycle-hook orchestration for clarity while keeping exec_once
+-- reliability semantics for real-world startup behavior.
+local startup_commands = {
+ scriptsDir .. "/WallpaperDaemon.sh",
+ "$HOME/.config/hypr/initial-boot.sh",
+ "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP",
+ "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP",
+ scriptsDir .. "/Polkit.sh",
+ "nm-applet",
+ "nm-tray",
+ "swaync",
+ scriptsDir .. "/PortalHyprland.sh",
+ "sh " .. scriptsDir .. "/WaybarStartup.sh",
+ "qs -c overview",
+ "hypridle",
+ scriptsDir .. "/Hyprsunset.sh init",
+ -- NOTE: Dropterminal is currently certified only with kitty. Not all terminals behave correctly as a dropdown.
+ scriptsDir .. "/Dropterminal.sh --startup kitty",
+ "wl-paste --type text --watch cliphist store",
+ "wl-paste --type image --watch cliphist store",
+}
+
+local function run_startup_commands()
+ for _, cmd in ipairs(startup_commands) do
+ exec_once(cmd)
+ end
+end
+
+if hl and hl.on then
+ hl.on("hyprland.start", run_startup_commands)
+else
+ -- Compatibility fallback for older/limited runtimes without hl.on.
+ run_startup_commands()
+end
+
+-- Optional startup examples retained from the original config:
+-- exec_once("mpvpaper '*' -o \"load-scripts=no no-audio --loop\" \"\"")
+-- exec_once(userScripts .. "/WallpaperAutoChange.sh " .. wallDir)
+-- exec_once(userScripts .. "/RainbowBorders.sh")
diff --git a/config/hypr/lua/user_decorations_helper.lua b/config/hypr/lua/user_decorations_helper.lua
new file mode 100644
index 00000000..f5e39ea8
--- /dev/null
+++ b/config/hypr/lua/user_decorations_helper.lua
@@ -0,0 +1,28 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+local function load_wallust_colors(path)
+ local colors = {}
+ local handle = io.open(path, "r")
+ if not handle then
+ return colors
+ end
+
+ for line in handle:lines() do
+ local name, hex = line:match("^%s*%$([%w_]+)%s*=%s*rgb%(([0-9A-Fa-f]+)%)")
+ if name and hex and hex ~= "" then
+ colors[string.lower(name)] = "rgb(" .. string.upper(hex) .. ")"
+ end
+ end
+
+ handle:close()
+ return colors
+end
+
+return {
+ load_wallust_colors = load_wallust_colors,
+}
diff --git a/config/hypr/lua/user_defaults.lua b/config/hypr/lua/user_defaults.lua
new file mode 100644
index 00000000..fb7bb0df
--- /dev/null
+++ b/config/hypr/lua/user_defaults.lua
@@ -0,0 +1,33 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from config/hypr/UserConfigs/01-UserDefaults.conf (active values only).
+
+KOOLDOTS_DEFAULTS = KOOLDOTS_DEFAULTS or {}
+local editor = os.getenv("EDITOR")
+if editor == nil or editor == "" then
+ editor = "nano"
+end
+local visual = os.getenv("VISUAL")
+if visual == nil then
+ visual = ""
+end
+KOOLDOTS_DEFAULTS.edit = editor
+KOOLDOTS_DEFAULTS.visual = visual
+KOOLDOTS_DEFAULTS.term = "kitty"
+KOOLDOTS_DEFAULTS.files = "thunar"
+KOOLDOTS_DEFAULTS.search_engine = "https://www.google.com/search?q={}"
+
+-- Optional user overrides live outside the pristine lua/ source tree.
+do
+ local configHome = os.getenv("XDG_CONFIG_HOME") or ((os.getenv("HOME") or "") .. "/.config")
+ local userDefaults = configHome .. "/hypr/UserConfigs/user_defaults.lua"
+ local ok, err = pcall(dofile, userDefaults)
+ if not ok and err and tostring(err):find("No such file or directory", 1, true) == nil then
+ print("[WARN] Unable to load user defaults file " .. userDefaults .. ": " .. tostring(err))
+ end
+end
diff --git a/config/hypr/lua/user_keybinds_helper.lua b/config/hypr/lua/user_keybinds_helper.lua
new file mode 100644
index 00000000..f9d4aa0c
--- /dev/null
+++ b/config/hypr/lua/user_keybinds_helper.lua
@@ -0,0 +1,217 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+local dsp = hl.dsp or hl
+
+local function exec_cmd(cmd)
+ if dsp and dsp.exec_cmd then
+ return dsp.exec_cmd(cmd)
+ end
+ return function() hl.exec_cmd(cmd) end
+end
+
+local function shell_quote(value)
+ return "'" .. tostring(value):gsub("'", "'\\''") .. "'"
+end
+
+local function raw_dispatch_cmd(command)
+ if dsp and dsp.exec_raw then
+ return dsp.exec_raw(tostring(command))
+ end
+ local expression = "hl.dsp.exec_raw(" .. string.format("%q", tostring(command)) .. ")"
+ return exec_cmd("hyprctl dispatch " .. shell_quote(expression))
+end
+
+local function trim(value)
+ return (value or ""):gsub("^%s+", ""):gsub("%s+$", "")
+end
+
+local function chord(mods, key)
+ mods = trim(mods):gsub("%s+", " + ")
+ key = trim(key)
+ if mods == "" then
+ return key
+ end
+ return mods .. " + " .. key
+end
+
+local function key_variants(key, mods)
+ key = trim(key):gsub("^xf86", "XF86")
+ local key_aliases = {
+ XF86AudioPlayPause = "XF86AudioPlay",
+ XF86audiolowervolume = "XF86AudioLowerVolume",
+ XF86audiomute = "XF86AudioMute",
+ XF86audioraisevolume = "XF86AudioRaiseVolume",
+ XF86audiostop = "XF86AudioStop",
+ }
+ key = key_aliases[key] or key
+ local shifted_number_keys = {
+ ["code:10"] = "exclam",
+ ["code:11"] = "at",
+ ["code:12"] = "numbersign",
+ ["code:13"] = "dollar",
+ ["code:14"] = "percent",
+ ["code:15"] = "asciicircum",
+ ["code:16"] = "ampersand",
+ ["code:17"] = "asterisk",
+ ["code:18"] = "parenleft",
+ ["code:19"] = "parenright",
+ }
+ local number_keys = {
+ ["code:10"] = "1",
+ ["code:11"] = "2",
+ ["code:12"] = "3",
+ ["code:13"] = "4",
+ ["code:14"] = "5",
+ ["code:15"] = "6",
+ ["code:16"] = "7",
+ ["code:17"] = "8",
+ ["code:18"] = "9",
+ ["code:19"] = "0",
+ }
+ if mods and mods:match("SHIFT") and shifted_number_keys[key] then
+ local number_key = number_keys[key]
+ if number_key then
+ return { shifted_number_keys[key], number_key }
+ end
+ return { shifted_number_keys[key] }
+ end
+ if number_keys[key] then
+ return { number_keys[key] }
+ end
+ return { key }
+end
+
+local function workspace_value(value)
+ value = trim(value)
+ return tonumber(value) or value
+end
+
+local function direction(value)
+ local directions = {
+ l = "left",
+ r = "right",
+ u = "up",
+ d = "down",
+ left = "left",
+ right = "right",
+ up = "up",
+ down = "down",
+ }
+ return directions[trim(value)] or trim(value)
+end
+
+local function dispatch_factory_safely(factory)
+ pcall(function()
+ local dispatcher = factory()
+ if dispatcher then
+ hl.dispatch(dispatcher)
+ end
+ end)
+end
+
+local function dispatch(name, args)
+ local window_api = (dsp and dsp.window) or hl.window or {}
+ name = trim(name)
+ args = trim(args)
+
+ if args:match("^exec%s*,") then
+ return exec_cmd(trim(args:gsub("^exec%s*,", "", 1)))
+ end
+ if name == "exec" then
+ return exec_cmd(args)
+ end
+ if name == "killactive" and window_api.close then
+ return window_api.close()
+ end
+ if name == "fullscreen" and window_api.fullscreen then
+ if args == "1" then
+ return window_api.fullscreen({ mode = "maximized" })
+ end
+ return window_api.fullscreen({ mode = "fullscreen" })
+ end
+ if name == "movefocus" and dsp and dsp.focus then
+ return function()
+ dispatch_factory_safely(function()
+ return dsp.focus({ direction = direction(args) })
+ end)
+ end
+ end
+ if name == "movewindow" and window_api.move then
+ return function()
+ dispatch_factory_safely(function()
+ return window_api.move({ direction = direction(args) })
+ end)
+ end
+ end
+ if name == "workspace" and dsp and dsp.focus then
+ return function() hl.dispatch(dsp.focus({ workspace = workspace_value(args) })) end
+ end
+ if name == "movetoworkspace" and window_api.move then
+ return function() hl.dispatch(window_api.move({ workspace = workspace_value(args) })) end
+ end
+ if name == "movetoworkspacesilent" and window_api.move then
+ return function() hl.dispatch(window_api.move({ workspace = workspace_value(args), follow = false })) end
+ end
+ if name == "togglefloating" and window_api.float then
+ return function() hl.dispatch(window_api.float({ action = "toggle" })) end
+ end
+ if name == "resizewindow" and window_api.resize then
+ return window_api.resize()
+ end
+ if name == "resizeactive" then
+ return raw_dispatch_cmd("resizeactive " .. args)
+ end
+ if args ~= "" then
+ return raw_dispatch_cmd(name .. " " .. args)
+ end
+ return raw_dispatch_cmd(name)
+end
+
+local function bind(mods, key, fn, opts)
+ local seen = {}
+ for _, key_variant in ipairs(key_variants(key, mods)) do
+ local key_chord = chord(mods, key_variant)
+ if not seen[key_chord] then
+ seen[key_chord] = true
+ if opts then
+ hl.bind(key_chord, fn, opts)
+ else
+ hl.bind(key_chord, fn)
+ end
+ end
+ end
+end
+
+local function unbind(mods, key)
+ if hl.unbind then
+ local seen = {}
+ for _, key_variant in ipairs(key_variants(key, mods)) do
+ local key_chord = chord(mods, key_variant)
+ if not seen[key_chord] then
+ seen[key_chord] = true
+ -- Hyprland Lua APIs vary by build: some accept unbind("MOD + KEY"),
+ -- others unbind("MOD", "KEY"), and some no-op one form silently.
+ -- Call both forms to make unbind behavior deterministic.
+ pcall(hl.unbind, key_chord)
+ pcall(hl.unbind, mods, key_variant)
+ end
+ end
+ end
+end
+
+return {
+ exec_cmd = exec_cmd,
+ trim = trim,
+ chord = chord,
+ key_variants = key_variants,
+ workspace_value = workspace_value,
+ raw_dispatch_cmd = raw_dispatch_cmd,
+ dispatch = dispatch,
+ bind = bind,
+ unbind = unbind,
+}
diff --git a/config/hypr/lua/user_layer_rules_helper.lua b/config/hypr/lua/user_layer_rules_helper.lua
new file mode 100644
index 00000000..d54b97c6
--- /dev/null
+++ b/config/hypr/lua/user_layer_rules_helper.lua
@@ -0,0 +1,16 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+local function apply_layer_rule(rule)
+ if hl.layer_rule then
+ hl.layer_rule(rule)
+ end
+end
+
+return {
+ apply_layer_rule = apply_layer_rule,
+}
diff --git a/config/hypr/lua/user_overrides.lua b/config/hypr/lua/user_overrides.lua
new file mode 100644
index 00000000..42502315
--- /dev/null
+++ b/config/hypr/lua/user_overrides.lua
@@ -0,0 +1,156 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Loads split system/user-editable Lua override files.
+-- System files are loaded from ~/.config/hypr/configs (with UserConfigs fallback for legacy setups).
+local configHome = os.getenv("XDG_CONFIG_HOME") or ((os.getenv("HOME") or "") .. "/.config")
+local hyprDir = configHome .. "/hypr"
+local systemDir = hyprDir .. "/configs"
+local userDir = configHome .. "/hypr/UserConfigs"
+
+local function load_optional(path)
+ local ok, err = pcall(dofile, path)
+ if ok then
+ return true
+ end
+ if err and tostring(err):find("No such file or directory", 1, true) == nil then
+ print("[WARN] Unable to load user override file " .. path .. ": " .. tostring(err))
+ end
+ return false
+end
+local loaded_user_split = false
+
+local system_files = {
+ "system_env.lua",
+ "system_startup.lua",
+ "system_window_rules.lua",
+ "system_layer_rules.lua",
+ "system_keybinds.lua",
+ "system_settings.lua",
+ "system_laptops.lua",
+}
+for _, file in ipairs(system_files) do
+ local primary = systemDir .. "/" .. file
+ local legacy = userDir .. "/" .. file
+ if not load_optional(primary) then
+ load_optional(legacy)
+ end
+end
+
+local user_files = {
+ "user_env.lua",
+ "user_startup.lua",
+ "user_window_rules.lua",
+ "user_layer_rules.lua",
+ "user_keybinds.lua",
+ "user_settings.lua",
+ "user_decorations.lua",
+ "user_animations.lua",
+ "user_laptops.lua",
+}
+for _, file in ipairs(user_files) do
+ local path = userDir .. "/" .. file
+ if load_optional(path) then
+ loaded_user_split = true
+ end
+end
+if not loaded_user_split then
+ load_optional(userDir .. "/user_overrides.lua") -- legacy single-file support
+end
+
+-- Legacy compatibility: import UserKeybinds.conf when user_keybinds.lua is missing.
+do
+ local userKeybindsLua = userDir .. "/user_keybinds.lua"
+ local legacyUserKeybinds = userDir .. "/UserKeybinds.conf"
+
+ local hasUserLua = io.open(userKeybindsLua, "r")
+ if hasUserLua then
+ hasUserLua:close()
+ else
+ local legacy = io.open(legacyUserKeybinds, "r")
+ if legacy then
+ local function trim(value)
+ return (value or ""):gsub("^%s+", ""):gsub("%s+$", "")
+ end
+ local function strip_inline_comment(value)
+ return trim((value or ""):gsub("%s+#.*$", ""))
+ end
+ local function load_vars_from_file(path, vars)
+ local handle = io.open(path, "r")
+ if not handle then
+ return
+ end
+ for raw in handle:lines() do
+ local line = trim(raw)
+ if line ~= "" and not line:match("^#") then
+ local name, val = line:match("^%$([%w_]+)%s*=%s*(.+)$")
+ if name and val then
+ vars[name] = strip_inline_comment(val)
+ end
+ end
+ end
+ handle:close()
+ end
+ local vars = {}
+ local raw_lines = {}
+ local configDir = configHome .. "/hypr/configs"
+ local defaultsFile = userDir .. "/01-UserDefaults.conf"
+ local keybindsFile = configDir .. "/Keybinds.conf"
+ local systemSettingsFile = configDir .. "/SystemSettings.conf"
+
+ load_vars_from_file(systemSettingsFile, vars)
+ load_vars_from_file(keybindsFile, vars)
+ load_vars_from_file(defaultsFile, vars)
+
+ for line in legacy:lines() do
+ table.insert(raw_lines, line)
+ local trimmed = trim(line)
+ if trimmed ~= "" and not trimmed:match("^#") then
+ local var_name, var_value = trimmed:match("^%$([%w_]+)%s*=%s*(.+)$")
+ if var_name and var_value then
+ vars[var_name] = strip_inline_comment(var_value)
+ end
+ end
+ end
+ legacy:close()
+
+ local function expand_vars(value)
+ value = tostring(value or "")
+ for _ = 1, 8 do
+ local changed = false
+ value = value:gsub("%$([%w_]+)", function(name)
+ local replacement = vars[name]
+ if replacement ~= nil then
+ changed = true
+ return replacement
+ end
+ return "$" .. name
+ end)
+ if not changed then
+ break
+ end
+ end
+ return value
+ end
+
+ for _, line in ipairs(raw_lines) do
+ local trimmed = trim(line)
+ if trimmed ~= "" and not trimmed:match("^#") then
+ local keyword, value = trimmed:match("^([%w_]+)%s*=%s*(.+)$")
+ if keyword and value and (keyword:match("^bind") or keyword == "unbind") then
+ local expanded = expand_vars(value)
+ local cmd = "hyprctl keyword " .. keyword .. " " .. string.format("%q", expanded)
+ local ok = os.execute(cmd)
+ if not ok then
+ print("[WARN] Failed to apply legacy keybind via: " .. cmd)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/config/hypr/lua/user_startup_helper.lua b/config/hypr/lua/user_startup_helper.lua
new file mode 100644
index 00000000..2cc050b9
--- /dev/null
+++ b/config/hypr/lua/user_startup_helper.lua
@@ -0,0 +1,34 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+local function shell_quote(value)
+ return "'" .. tostring(value):gsub("'", "'\\''") .. "'"
+end
+
+local function exec_once(cmd, opts)
+ -- Why this wrapper exists:
+ -- 1) Enforce once-per-Hypr-session startup behavior using marker files.
+ -- 2) Avoid startup race conditions by waiting for Wayland/Hypr sockets.
+ -- 3) Capture per-command logs to simplify troubleshooting in user setups.
+
+ opts = opts or {}
+ local session = opts.session or os.getenv("HYPRLAND_INSTANCE_SIGNATURE") or "default"
+ local marker_prefix = opts.marker_prefix or "/tmp/hypr-lua-user-exec-once-"
+ local log_prefix = opts.log_prefix or "/tmp/hypr-lua-user-startup-"
+
+ local key = cmd:gsub("[^%w_.-]", "_"):sub(1, 80)
+ local marker = marker_prefix .. session .. "-" .. key
+ local log = log_prefix .. key .. ".log"
+ local readiness = [[runtime=${XDG_RUNTIME_DIR:-/run/user/$(id -u)}; export XDG_RUNTIME_DIR="$runtime"; for _ in $(seq 1 200); do if [ -n "$WAYLAND_DISPLAY" ] && [ -S "$runtime/$WAYLAND_DISPLAY" ]; then break; fi; for sock in "$runtime"/wayland-[0-9]*; do [ -S "$sock" ] || continue; case "$(basename "$sock")" in *awww*) continue ;; esac; export WAYLAND_DISPLAY="$(basename "$sock")"; break 2; done; sleep 0.1; done; if [ -n "$HYPRLAND_INSTANCE_SIGNATURE" ]; then hypr_sock="$runtime/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket.sock"; for _ in $(seq 1 200); do [ -S "$hypr_sock" ] && break; sleep 0.1; done; fi]]
+ local inner = readiness .. "; " .. cmd
+ local script = "[ -e " .. shell_quote(marker) .. " ] || { touch " .. shell_quote(marker) .. " && sh -lc " .. shell_quote(inner) .. " >>" .. shell_quote(log) .. " 2>&1 & }"
+ os.execute("sh -lc " .. shell_quote(script))
+end
+
+return {
+ exec_once = exec_once,
+}
diff --git a/config/hypr/lua/user_window_rules_helper.lua b/config/hypr/lua/user_window_rules_helper.lua
new file mode 100644
index 00000000..5ef17ef6
--- /dev/null
+++ b/config/hypr/lua/user_window_rules_helper.lua
@@ -0,0 +1,16 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+local function apply_window_rule(rule)
+ if hl.window_rule then
+ hl.window_rule(rule)
+ end
+end
+
+return {
+ apply_window_rule = apply_window_rule,
+}
diff --git a/config/hypr/lua/window_rules.lua b/config/hypr/lua/window_rules.lua
new file mode 100644
index 00000000..1a43acd3
--- /dev/null
+++ b/config/hypr/lua/window_rules.lua
@@ -0,0 +1,1110 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Auto-generated from config/hypr/configs/WindowRules.conf for Lua testing.
+-- Edit the source WindowRules.conf and regenerate this file when vendor rules change.
+
+local function apply_window_rule(rule)
+ if hl.window_rule then
+ hl.window_rule(rule)
+ end
+end
+
+
+apply_window_rule({
+ name = "tag-browser-firefox",
+ match = {
+ class = "^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-google-chrome",
+ match = {
+ class = "^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-chrome-default-profile",
+ match = {
+ class = "^(chrome-.+-Default)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-chromium",
+ match = {
+ class = "^([Cc]hromium)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-microsoft-edge",
+ match = {
+ class = "^([Mm]icrosoft-edge(-stable|-beta|-dev|-unstable))$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-brave",
+ match = {
+ class = "^([Bb]rave-browser(-beta|-dev|-unstable)?)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-thorium-cachy",
+ match = {
+ class = "^([Tt]horium-browser|[Cc]achy-browser)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-browser-zen",
+ match = {
+ class = "^(zen-alpha|zen)$",
+ },
+ tag = "+browser",
+})
+
+apply_window_rule({
+ name = "tag-notifications-swaync",
+ match = {
+ class = "^(swaync-control-center|swaync-notification-window|swaync-client|class)$",
+ },
+ tag = "+notif",
+})
+
+apply_window_rule({
+ name = "tag-kool-cheat-sheet",
+ match = {
+ title = "^(KooL Quick Cheat Sheet)$",
+ },
+ tag = "+KooL_Cheat",
+})
+
+apply_window_rule({
+ name = "tag-kool-hyprland-settings",
+ match = {
+ title = "^(KooL Hyprland Settings)$",
+ },
+ tag = "+KooL_Settings",
+})
+
+apply_window_rule({
+ name = "tag-kool-settings-nwg-tools",
+ match = {
+ class = "^(nwg-displays|nwg-look)$",
+ },
+ tag = "+KooL-Settings",
+})
+
+apply_window_rule({
+ name = "tag-terminal-emulators",
+ match = {
+ class = "^(ghostty|wezterm|Alacritty|kitty|kitty-dropterm)$",
+ },
+ tag = "+terminal",
+})
+
+apply_window_rule({
+ name = "tag-email-thunderbird",
+ match = {
+ class = "^([Tt]hunderbird|org.mozilla.Thunderbird)$",
+ },
+ tag = "+email",
+})
+
+apply_window_rule({
+ name = "tag-email-betterbird",
+ match = {
+ class = "^(eu.betterbird.Betterbird)$",
+ },
+ tag = "+email",
+})
+
+apply_window_rule({
+ name = "tag-email-evolution",
+ match = {
+ class = "^(org.gnome.Evolution)$",
+ },
+ tag = "+email",
+})
+
+apply_window_rule({
+ name = "tag-projects-vscodium",
+ match = {
+ class = "^(codium|codium-url-handler|VSCodium)$",
+ },
+ tag = "+projects",
+})
+
+apply_window_rule({
+ name = "tag-projects-vscode",
+ match = {
+ class = "^(VSCode|code|code-url-handler)$",
+ },
+ tag = "+projects",
+})
+
+apply_window_rule({
+ name = "tag-projects-jetbrains",
+ match = {
+ class = "^(jetbrains-.+)$",
+ },
+ tag = "+projects",
+})
+
+apply_window_rule({
+ name = "tag-projects-zed",
+ match = {
+ class = "^(dev.zed.Zed|antigravity)$",
+ },
+ tag = "+projects",
+})
+
+apply_window_rule({
+ name = "tag-screenshare-obs",
+ match = {
+ class = "^(com.obsproject.Studio)$",
+ },
+ tag = "+screenshare",
+})
+
+apply_window_rule({
+ name = "tag-im-discord-family",
+ match = {
+ class = "^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$",
+ },
+ tag = "+im",
+})
+
+apply_window_rule({
+ name = "tag-im-ferdium",
+ match = {
+ class = "^([Ff]erdium)$",
+ },
+ tag = "+im",
+})
+
+apply_window_rule({
+ name = "tag-im-whatsapp",
+ match = {
+ class = "^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$",
+ },
+ tag = "+im",
+})
+
+apply_window_rule({
+ name = "tag-im-telegram",
+ match = {
+ class = "^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$",
+ },
+ tag = "+im",
+})
+
+apply_window_rule({
+ name = "tag-im-teams",
+ match = {
+ class = "^(teams-for-linux)$",
+ },
+ tag = "+im",
+})
+
+apply_window_rule({
+ name = "tag-im-element",
+ match = {
+ class = "^(im.riot.Riot|Element)$",
+ },
+ tag = "+im",
+})
+
+apply_window_rule({
+ name = "tag-games-gamescope",
+ match = {
+ class = "^(gamescope)$",
+ },
+ tag = "+games",
+})
+
+apply_window_rule({
+ name = "tag-games-steam-app",
+ match = {
+ class = "^(steam_app_\\\\d+)$",
+ },
+ tag = "+games",
+})
+
+apply_window_rule({
+ name = "tag-games-proton",
+ match = {
+ xdg_tag = "^(proton-game)$",
+ },
+ tag = "+games",
+})
+
+apply_window_rule({
+ name = "tag-gamestore-steam",
+ match = {
+ class = "^([Ss]team)$",
+ },
+ tag = "+gamestore",
+})
+
+apply_window_rule({
+ name = "tag-gamestore-lutris",
+ match = {
+ title = "^([Ll]utris)$",
+ },
+ tag = "+gamestore",
+})
+
+apply_window_rule({
+ name = "tag-gamestore-heroic",
+ match = {
+ class = "^(com.heroicgameslauncher.hgl)$",
+ },
+ tag = "+gamestore",
+})
+
+apply_window_rule({
+ name = "tag-file-manager-common",
+ match = {
+ class = "^([Tt]hunar|org.gnome.Nautilus|[Pp]cmanfm-qt)$",
+ },
+ tag = "+file-manager",
+})
+
+apply_window_rule({
+ name = "tag-file-manager-warp",
+ match = {
+ class = "^(app.drey.Warp)$",
+ },
+ tag = "+file-manager",
+})
+
+apply_window_rule({
+ name = "tag-wallpaper-waytrogen",
+ match = {
+ class = "^([Ww]aytrogen)$",
+ },
+ tag = "+wallpaper",
+})
+
+apply_window_rule({
+ name = "tag-multimedia-audacious",
+ match = {
+ class = "^([Aa]udacious)$",
+ },
+ tag = "+multimedia",
+})
+
+apply_window_rule({
+ name = "tag-multimedia-video-players",
+ match = {
+ class = "^([Mm]pv|vlc)$",
+ },
+ tag = "+multimedia_video",
+})
+
+apply_window_rule({
+ name = "tag-settings-rog-control",
+ match = {
+ title = "^(ROG Control)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-wihotspot",
+ match = {
+ class = "^(wihotspot(-gui)?)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-baobab",
+ match = {
+ class = "^([Bb]aobab|org.gnome.[Bb]aobab)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-disks-and-hotspot",
+ match = {
+ class = "^(gnome-disks|wihotspot(-gui)?)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-kvantum",
+ match = {
+ title = "(Kvantum Manager)",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-file-roller",
+ match = {
+ class = "^(file-roller|org.gnome.FileRoller)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-network-blueman",
+ match = {
+ class = "^(nm-applet|nm-connection-editor|blueman-manager)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-pavucontrol",
+ match = {
+ class = "^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-qtct",
+ match = {
+ class = "^(qt5ct|qt6ct)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-xdg-portal-gtk",
+ match = {
+ class = "(xdg-desktop-portal-gtk)",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-polkit-kde",
+ match = {
+ class = "^(org.kde.polkit-kde-authentication-agent-1)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-rofi",
+ match = {
+ class = "^([Rr]ofi)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-btrfs-assistant",
+ match = {
+ class = "^(btrfs-assistant)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-settings-timeshift",
+ match = {
+ class = "^(timeshift-gtk)$",
+ },
+ tag = "+settings",
+})
+
+apply_window_rule({
+ name = "tag-viewer-system-monitor",
+ match = {
+ class = "^(gnome-system-monitor|org.gnome.SystemMonitor|io.missioncenter.MissionCenter)$",
+ },
+ tag = "+viewer",
+})
+
+apply_window_rule({
+ name = "tag-viewer-evince",
+ match = {
+ class = "^(evince)$",
+ },
+ tag = "+viewer",
+})
+
+apply_window_rule({
+ name = "tag-viewer-image-viewers",
+ match = {
+ class = "^(eog|org.gnome.Loupe)$",
+ },
+ tag = "+viewer",
+})
+
+apply_window_rule({
+ name = "multimedia-disable-blur",
+ match = {
+ tag = "multimedia",
+ },
+ no_blur = true,
+})
+
+apply_window_rule({
+ name = "multimedia-force-opacity",
+ match = {
+ tag = "multimedia",
+ },
+ opacity = 1.0,
+})
+
+apply_window_rule({
+ name = "float-zoom-onedriver",
+ match = {
+ class = "([Zz]oom|onedriver|onedriver-launcher)",
+ },
+ float = true,
+})
+
+apply_window_rule({
+ name = "float-video-players",
+ match = {
+ class = "^(mpv|com.github.rafostar.Clapper)$",
+ },
+ float = true,
+})
+
+apply_window_rule({
+ name = "float-qalculate",
+ match = {
+ class = "^([Qq]alculate-gtk)$",
+ },
+ float = true,
+})
+
+apply_window_rule({
+ name = "float-center-auth-required-title",
+ match = {
+ title = "^(Authentication Required)$",
+ },
+ float = true,
+ center = true,
+})
+
+apply_window_rule({
+ name = "float-center-polkit-auth-dialog",
+ match = {
+ class = "^(xfce-polkit|mate-polkit|polkit-mate-authentication-agent-1)$",
+ title = "^(Authentication required|Authentication Required)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.35) (monitor_h*0.35)",
+})
+
+apply_window_rule({
+ name = "float-vscodium-secondary-window",
+ match = {
+ class = "(codium|codium-url-handler|VSCodium)",
+ title = "negative:(.*codium.*|.*VSCodium.*)",
+ },
+ float = true,
+})
+
+apply_window_rule({
+ name = "float-heroic-secondary-window",
+ match = {
+ class = "^(com.heroicgameslauncher.hgl)$",
+ title = "negative:(Heroic Games Launcher)",
+ },
+ float = true,
+})
+
+apply_window_rule({
+ name = "float-steam-secondary-window",
+ match = {
+ class = "^([Ss]team)$",
+ title = "negative:^([Ss]team)$",
+ },
+ float = true,
+})
+
+apply_window_rule({
+ name = "float-center-add-folder-dialog",
+ match = {
+ title = "^(Add Folder to Workspace)$",
+ },
+ float = true,
+ size = "(monitor_w*0.7) (monitor_h*0.6)",
+ center = true,
+})
+
+apply_window_rule({
+ name = "float-center-save-as-dialog",
+ match = {
+ title = "^(Save As)$",
+ },
+ float = true,
+ size = "(monitor_w*0.7) (monitor_h*0.6)",
+ center = true,
+})
+
+apply_window_rule({
+ name = "float-open-files-dialog",
+ match = {
+ initial_title = "(Open Files)",
+ },
+ float = true,
+ size = "(monitor_w*0.7) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "float-center-sddm-background",
+ match = {
+ title = "^(SDDM Background)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.16) (monitor_h*0.12)",
+})
+
+apply_window_rule({
+ name = "float-center-yad-dialog",
+ match = {
+ class = "^(yad)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.2) (monitor_h*0.2)",
+})
+
+apply_window_rule({
+ name = "float-center-hyprland-donate",
+ match = {
+ class = "^(hyprland-donate-screen)$",
+ },
+ float = true,
+ center = true,
+})
+
+apply_window_rule({
+ name = "center-rog-control",
+ match = {
+ title = "^(ROG Control)$",
+ },
+ center = true,
+})
+
+apply_window_rule({
+ name = "center-keybindings",
+ match = {
+ title = "^(Keybindings)$",
+ },
+ center = true,
+})
+
+apply_window_rule({
+ name = "center-pavucontrol",
+ match = {
+ class = "^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$",
+ },
+ center = true,
+})
+
+apply_window_rule({
+ name = "center-whatsapp",
+ match = {
+ class = "^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$",
+ },
+ center = true,
+})
+
+apply_window_rule({
+ name = "center-network-editor",
+ match = {
+ class = "^(nm-connection-editor)$",
+ },
+ center = true,
+})
+
+apply_window_rule({
+ name = "center-nm-auth-dialog",
+ match = {
+ class = "^(nm-applet)$",
+ title = "^(Wi-Fi Network Authentication Required)$",
+ },
+ center = true,
+})
+
+apply_window_rule({
+ name = "idle-inhibit-fullscreen-bool",
+ match = {
+ fullscreen = true,
+ },
+ idle_inhibit = "fullscreen",
+})
+
+apply_window_rule({
+ name = "idle-inhibit-fullscreen-int",
+ match = {
+ fullscreen = 1,
+ },
+ idle_inhibit = "fullscreen",
+})
+
+apply_window_rule({
+ name = "idle-inhibit-any-class",
+ match = {
+ class = ".*",
+ },
+ idle_inhibit = "fullscreen",
+})
+
+apply_window_rule({
+ name = "idle-inhibit-any-title",
+ match = {
+ title = ".*",
+ },
+ idle_inhibit = "fullscreen",
+})
+
+apply_window_rule({
+ name = "opacity-browser-tag",
+ match = {
+ tag = "browser",
+ },
+ opacity = "0.99 0.8",
+})
+
+apply_window_rule({
+ name = "opacity-projects-tag",
+ match = {
+ tag = "projects",
+ },
+ opacity = "0.9 0.8",
+})
+
+apply_window_rule({
+ name = "opacity-im-tag",
+ match = {
+ tag = "im",
+ },
+ opacity = "0.94 0.86",
+})
+
+apply_window_rule({
+ name = "opacity-multimedia-tag",
+ match = {
+ tag = "multimedia",
+ },
+ opacity = "0.94 0.86",
+})
+
+apply_window_rule({
+ name = "opacity-file-manager-tag",
+ match = {
+ tag = "file-manager",
+ },
+ opacity = "0.9 0.8",
+})
+
+apply_window_rule({
+ name = "opacity-terminal-tag",
+ match = {
+ tag = "terminal",
+ },
+ opacity = "0.9 0.7",
+})
+
+apply_window_rule({
+ name = "opacity-text-editors",
+ match = {
+ class = "^(gedit|org.gnome.TextEditor|mousepad)$",
+ },
+ opacity = "0.8 0.7",
+})
+
+apply_window_rule({
+ name = "opacity-deluge",
+ match = {
+ class = "^(deluge)$",
+ },
+ opacity = "0.9 0.8",
+})
+
+apply_window_rule({
+ name = "opacity-seahorse",
+ match = {
+ class = "^(seahorse)$",
+ },
+ opacity = "0.9 0.8",
+})
+
+apply_window_rule({
+ name = "no-initial-focus-jetbrains",
+ match = {
+ class = "^(jetbrains-.*)$",
+ },
+ no_initial_focus = true,
+})
+
+apply_window_rule({
+ name = "no-initial-focus-wind-title",
+ match = {
+ title = "^(wind.*)$",
+ },
+ no_initial_focus = true,
+})
+
+
+apply_window_rule({
+ name = "Picture-in-Picture",
+ match = {
+ title = "^[Pp]icture-in-[Pp]icture$",
+ },
+ float = true,
+ move = "72% 7%",
+ opacity = "0.95 0.75",
+ pin = true,
+ keep_aspect_ratio = true,
+ size = "(monitor_w*0.3) (monitor_h*0.3)",
+})
+
+apply_window_rule({
+ name = "CachyOS Kernel Manager",
+ match = {
+ class = "^(org.cachyos.KernelManager)$",
+ title = "^(CachyOS Kernel Manager)$",
+ initial_class = "^(org.cachyos.KernelManager)$",
+ initial_title = "^(CachyOS Kernel Manager)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "Mainline Kernels",
+ match = {
+ class = "^(mainline-gtk)$",
+ title = "^(Mainline Kernels)$",
+ initial_class = "^(mainline-gtk)$",
+ initial_title = "^(Mainline Kernels)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.45) (monitor_h*0.55)",
+})
+
+apply_window_rule({
+ name = "Kwallet",
+ match = {
+ class = "^(org.kde.kwalletmanager)$",
+ title = "^(Wallet Manager)$",
+ initial_class = "^(org.kde.kwalletmanager)$",
+ initial_title = "^(Wallet Manager)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "NVIDIA Settings",
+ match = {
+ class = "^(nvidia-settings)$",
+ title = "^(NVIDIA Settings)$",
+ initial_class = "^(nvidia-settings)$",
+ initial_title = "^(NVIDIA Settings)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "CachyOS Package Installer",
+ match = {
+ class = "^(org.cachyos.cachyos-pi)$",
+ title = "^(CachyOS Package Installer)$",
+ initial_class = "^(org.cachyos.cachyos-pi)$",
+ initial_title = "^(CachyOS Package Installer)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "Shelly",
+ match = {
+ class = "^(com.shellyorg.shelly)$",
+ title = "^(Shelly)$",
+ initial_class = "^(com.shellyorg.shelly)$",
+ initial_title = "^(Shelly)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "CachyOS Hello",
+ match = {
+ class = "^(CachyOSHello)$",
+ title = "^(CachyOS Hello)$",
+ initial_class = "^(CachyOSHello)$",
+ initial_title = "^(CachyOS Hello)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "Cache Cleaner - Octopi",
+ match = {
+ class = "^(octopi-cachecleaner)$",
+ title = "^(Cache Cleaner - Octopi)$",
+ initial_class = "^(octopi-cachecleaner)$",
+ initial_title = "^(Cache Cleaner - Octopi)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "Octopi Package Manager",
+ match = {
+ class = "^(octopi)$",
+ title = "^(Octopi)$",
+ initial_class = "^(octopi)$",
+ initial_title = "^(Octopi)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "Repository Editor - Octopi",
+ match = {
+ class = "^(octopi-repoeditor)$",
+ title = "^(Repository Editor - Octopi)$",
+ initial_class = "^(octopi-repoeditor)$",
+ initial_title = "^(Repository Editor - Octop)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "KooL Cheat (tag)",
+ match = {
+ tag = "KooL_Cheat",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.65) (monitor_h*0.9)",
+})
+
+apply_window_rule({
+ name = "Wallpaper (tag)",
+ match = {
+ tag = "wallpaper",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.7) (monitor_h*0.7)",
+ opacity = "0.9 0.7",
+})
+
+apply_window_rule({
+ name = "Settings (tag)",
+ match = {
+ tag = "settings",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.7) (monitor_h*0.7)",
+ opacity = "0.8 0.7",
+})
+
+apply_window_rule({
+ name = "Viewer (tag)",
+ match = {
+ tag = "viewer",
+ },
+ float = true,
+ center = true,
+ opacity = "0.82 0.75",
+})
+
+apply_window_rule({
+ name = "KooL Settings (tag)",
+ match = {
+ tag = "KooL-Settings",
+ },
+ float = true,
+ center = true,
+})
+
+apply_window_rule({
+ name = "Multimedia Video (tag)",
+ match = {
+ tag = "multimedia_video",
+ },
+ no_blur = true,
+ opacity = 1.0,
+})
+
+apply_window_rule({
+ name = "Games (tag)",
+ match = {
+ tag = "games",
+ },
+ no_blur = true,
+ fullscreen = 0,
+})
+
+apply_window_rule({
+ name = "Ferdium",
+ match = {
+ class = "^([Ff]erdium)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.7)",
+})
+
+apply_window_rule({
+ name = "Calculators",
+ match = {
+ class = "(org.gnome.Calculator|qalculate-gtk)",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.55) (monitor_h*0.45)",
+})
+
+apply_window_rule({
+ name = "Thunar Dialogs",
+ match = {
+ class = "([Tt]hunar)",
+ title = "negative:(.*[Tt]hunar.*)",
+ },
+ float = true,
+ center = true,
+})
+
+apply_window_rule({
+ name = "Bitwarden",
+ match = {
+ class = "^(Bitwarden)$",
+ title = "^(Bitwarden)$",
+ initial_class = "^(Bitwarden)$",
+ initial_title = "^(Bitwarden)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "hyprland audio panel",
+ match = {
+ class = "^(hyprpwcenter)$",
+ title = "^(Pipewire Control Center)$",
+ initial_class = "^(hyprpwcenter)$",
+ initial_title = "^(Pipewire Control Center)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "Garuda Assistant",
+ match = {
+ class = "^(garuda-assistant)$",
+ title = "^(Garuda Assistant)$",
+ initial_class = "^(garuda-assistant)$",
+ initial_title = "^(Garuda Assistant)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.6)",
+})
+
+apply_window_rule({
+ name = "HyprMod GUI",
+ match = {
+ class = "^(com.github.hyprmod)$",
+ title = "^(HyprMod)$",
+ initial_class = "^(com.github.hyprmod)$",
+ initial_title = "^(HyprMod)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.7) (monitor_h*0.75)",
+})
+
+apply_window_rule({
+ name = "EasyEffects",
+ match = {
+ class = "^(com.github.wwmm.easyeffects)$",
+ title = "^(Easy Effects)$",
+ initial_class = "^(com.github.wwmm.easyeffects)$",
+ initial_title = "^(Easy Effects)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.6) (monitor_h*0.65)",
+})
+apply_window_rule({
+ name = "Megasync",
+ match = {
+ class = "^(nz\\.co\\.mega\\.megasync)$",
+ initial_class = "^(nz\\.co\\.mega\\.megasync)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.1) (monitor_h*0.2)",
+})
+
+apply_window_rule({
+ name = "Mousam Weather",
+ match = {
+ class = "^(io.github.amit9838.mousam)$",
+ title = "^(Mousam)$",
+ initial_class = "^(io.github.amit9838.mousam)$",
+ initial_title = "^(Mousam)$",
+ },
+ float = true,
+ center = true,
+ size = "(monitor_w*0.7) (monitor_h*0.75)",
+})
+
+-- Lua-only rule: keep the dropterminal positioned when toggled by keybind.
+apply_window_rule({
+ name = "dropterminal",
+ match = {
+ class = "kitty-dropterm",
+ },
+ float = true,
+})
diff --git a/config/hypr/lua/workspaces.lua b/config/hypr/lua/workspaces.lua
new file mode 100644
index 00000000..287326ca
--- /dev/null
+++ b/config/hypr/lua/workspaces.lua
@@ -0,0 +1,12 @@
+-- ==================================================
+-- KoolDots (2026)
+-- Project URL: https://github.com/LinuxBeginnings
+-- License: GNU GPLv3
+-- SPDX-License-Identifier: GPL-3.0-or-later
+-- ==================================================
+
+-- Converted from config/hypr/workspaces.conf.
+-- No active workspace rules are currently enabled in the source file.
+
+-- Example:
+-- hl.workspace_rule({ workspace = "1", monitor = "eDP-1" })
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage