From 48c59068976a19e7f9d7d6b7c8a1e3545a1f609e Mon Sep 17 00:00:00 2001 From: Robin Steinberg Date: Wed, 19 Aug 2026 16:44:54 +0200 Subject: [PATCH] fix(hypr): use native Lua dispatchers for exit, fullscreen, cycle, resize, and setprop --- HYPRLAND_LUA_MIGRATION.md | 72 +++++++++++++++++++++++------- config/hypr/bindings.lua | 2 +- config/hypr/bindings/tiling.lua | 22 ++++----- config/hypr/bindings/utilities.lua | 2 +- 4 files changed, 69 insertions(+), 29 deletions(-) diff --git a/HYPRLAND_LUA_MIGRATION.md b/HYPRLAND_LUA_MIGRATION.md index 85e654e..cbf66b4 100644 --- a/HYPRLAND_LUA_MIGRATION.md +++ b/HYPRLAND_LUA_MIGRATION.md @@ -93,41 +93,81 @@ hl.config({ **Legacy:** ```hyprlang bind = SUPER, Q, killactive, +bind = SUPER SHIFT ALT, Q, exit, bindd = SUPER, B, Launch Browser, exec, firefox bind = SUPER, left, movefocus, l bind = SUPER, 1, workspace, 1 +bind = SUPER SHIFT, 1, movetoworkspace, 1 +bind = SUPER SHIFT, left, swapwindow, l +bind = SUPER, mouse_down, workspace, e+1 bindm = SUPER, mouse:272, movewindow +bindm = SUPER, mouse:273, resizewindow bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ bind = SUPER, code:10, workspace, 1 -bind = SUPER SHIFT, S, swapwindow, l +bind = SUPER, code:20, resizeactive, -100 0 +bind = SUPER, BACKSPACE, setprop, opaque toggle ``` **Lua:** -Flags from the legacy format (`e` for repeat, `l` for locked, `m` for mouse) become booleans in the options table. Dispatchers must use the `hl.dsp.*` API. **If a dispatcher isn't listed below, fall back to `hl.dsp.exec_cmd("hyprctl dispatch ")`**. +Flags from the legacy format (`e` for repeat, `l` for locked, `m` for mouse) become booleans in the options table. Dispatchers must use the native `hl.dsp.*` API functions. ```lua -hl.bind("SUPER + Q", hl.dsp.window.close()) +-- Session & Window Lifecycle +hl.bind("SUPER + Q", hl.dsp.window.close(), { description = "Close active window" }) +hl.bind("SUPER + SHIFT + ALT + Q", hl.dsp.exit(), { description = "Exit Hyprland" }) + +-- Applications / Commands hl.bind("SUPER + B", hl.dsp.exec_cmd("firefox"), { description = "Launch Browser" }) + +-- Focus & Workspaces hl.bind("SUPER + left", hl.dsp.focus({ direction = "left" })) hl.bind("SUPER + 1", hl.dsp.focus({ workspace = 1 })) +hl.bind("SUPER + TAB", hl.dsp.focus({ workspace = "e+1" })) +hl.bind("SUPER + mouse_down", hl.dsp.focus({ workspace = "e+1" })) +-- Moving Windows +hl.bind("SUPER + SHIFT + 1", hl.dsp.window.move({ workspace = 1 })) +hl.bind("SUPER + SHIFT + left", hl.dsp.window.swap({ direction = "left" })) + +-- Window States +hl.bind("SUPER + V", hl.dsp.window.float({ action = "toggle" })) +hl.bind("SUPER + P", hl.dsp.window.pseudo()) +hl.bind("SHIFT + F11", hl.dsp.window.fullscreen({ mode = "fullscreen" })) +hl.bind("ALT + F11", hl.dsp.window.fullscreen({ mode = "maximized" })) +hl.bind("SUPER + BACKSPACE", hl.dsp.window.set_prop({ prop = "opaque", value = "toggle" })) + +-- Window Cycling & Stacking +hl.bind("ALT + TAB", hl.dsp.window.cycle_next()) +hl.bind("ALT + SHIFT + TAB", hl.dsp.window.cycle_next({ next = false })) +hl.bind("ALT + TAB", hl.dsp.window.bring_to_top()) + +-- Resizing & Dragging +hl.bind("SUPER + code:20", hl.dsp.window.resize({ x = -100, y = 0, relative = true })) hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { mouse = true }) +hl.bind("SUPER + mouse:273", hl.dsp.window.resize(), { mouse = true }) + +-- Repeating & Locked (e.g. Media Keys) hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"), { repeating = true, locked = true }) - --- Keycodes use the `code:` prefix directly in the string -hl.bind("SUPER + code:10", hl.dsp.focus({ workspace = 1 })) - --- Fallback for undocumented or complex dispatchers -hl.bind("SUPER + SHIFT + S", hl.dsp.exec_cmd("hyprctl dispatch swapwindow l")) ``` *Note: Key combinations are joined by ` + `.* -*Common Dispatchers translation:* + +#### Complete Dispatcher Reference: +- `exit` -> `hl.dsp.exit()` - `killactive` -> `hl.dsp.window.close()` - `togglefloating` -> `hl.dsp.window.float({ action = "toggle" })` -- `fullscreen, 0` -> `hl.dsp.window.fullscreen(0)` -- `togglesplit` -> `hl.dsp.layout("togglesplit")` -- `movefocus, l` -> `hl.dsp.focus({ direction = "left" })` -- `workspace, 1` -> `hl.dsp.focus({ workspace = 1 })` -- `movetoworkspace, 1` -> `hl.dsp.window.move({ workspace = 1 })` -- `cyclenext` -> `hl.dsp.exec_cmd("hyprctl dispatch cyclenext")` +- `pseudo` -> `hl.dsp.window.pseudo()` +- `fullscreen, 0` -> `hl.dsp.window.fullscreen({ mode = "fullscreen" })` +- `fullscreen, 1` -> `hl.dsp.window.fullscreen({ mode = "maximized" })` +- `togglesplit` / `layoutmsg, ` -> `hl.dsp.layout("")` +- `movefocus, ` -> `hl.dsp.focus({ direction = "left" | "right" | "up" | "down" })` +- `workspace, ` -> `hl.dsp.focus({ workspace = })` +- `movetoworkspace, ` -> `hl.dsp.window.move({ workspace = })` +- `swapwindow, ` -> `hl.dsp.window.swap({ direction = "left" | "right" | "up" | "down" })` +- `cyclenext` -> `hl.dsp.window.cycle_next()` +- `cyclenext, prev` -> `hl.dsp.window.cycle_next({ next = false })` +- `bringactivetotop` -> `hl.dsp.window.bring_to_top()` +- `resizeactive, ` -> `hl.dsp.window.resize({ x = , y = , relative = true })` +- `setprop, ` -> `hl.dsp.window.set_prop({ prop = "", value = "" })` +- `togglespecialworkspace, ` -> `hl.dsp.workspace.toggle_special("")` +- `exec, ` -> `hl.dsp.exec_cmd("")` ### 6. Window and Layer Rules **Legacy:** diff --git a/config/hypr/bindings.lua b/config/hypr/bindings.lua index e0e331f..ef0b687 100644 --- a/config/hypr/bindings.lua +++ b/config/hypr/bindings.lua @@ -23,7 +23,7 @@ hl.bind("SUPER + S", hl.dsp.exec_cmd(terminal .. " wiremix --tab configuration") hl.bind("SUPER + return", hl.dsp.exec_cmd(terminal)) hl.bind("SUPER + Q", hl.dsp.window.close()) -hl.bind("SUPER + SHIFT + ALT + Q", hl.dsp.exec_cmd("hyprctl dispatch exit")) +hl.bind("SUPER + SHIFT + ALT + Q", hl.dsp.exit(), { description = "Exit Hyprland" }) hl.bind("SUPER + E", hl.dsp.exec_cmd(fileManager)) hl.bind("SUPER + R", hl.dsp.exec_cmd(menu)) hl.bind("SUPER + P", hl.dsp.window.pseudo()) diff --git a/config/hypr/bindings/tiling.lua b/config/hypr/bindings/tiling.lua index 8896cfd..a42eead 100644 --- a/config/hypr/bindings/tiling.lua +++ b/config/hypr/bindings/tiling.lua @@ -3,9 +3,9 @@ hl.bind("SUPER + Q", hl.dsp.window.close(), { description = "Close active window hl.bind("SUPER + J", hl.dsp.layout("togglesplit"), { description = "Toggle split" }) hl.bind("SUPER + P", hl.dsp.window.pseudo(), { description = "Pseudo window" }) hl.bind("SUPER + V", hl.dsp.window.float({ action = "toggle" }), { description = "Toggle floating" }) -hl.bind("SHIFT + F11", hl.dsp.window.fullscreen(0), { description = "Force full screen" }) -hl.bind("ALT + F11", hl.dsp.window.fullscreen(1), { description = "Full width" }) -hl.bind("SUPER + SHIFT + RETURN", hl.dsp.window.fullscreen(1), { description = "Full width" }) +hl.bind("SHIFT + F11", hl.dsp.window.fullscreen({ mode = "fullscreen" }), { description = "Force full screen" }) +hl.bind("ALT + F11", hl.dsp.window.fullscreen({ mode = "maximized" }), { description = "Full width" }) +hl.bind("SUPER SHIFT + RETURN", hl.dsp.window.fullscreen({ mode = "maximized" }), { description = "Full width" }) hl.bind("SUPER + numbersign", hl.dsp.layout("splitratio -2"), { description = "1:1 split" }) hl.bind("SUPER + numbersign", hl.dsp.layout("splitratio 0.9"), { description = "1:1 split" }) @@ -29,15 +29,15 @@ hl.bind("SUPER + SHIFT + right", hl.dsp.window.swap({ direction = "right" }), { hl.bind("SUPER + SHIFT + up", hl.dsp.window.swap({ direction = "up" }), { description = "Swap window up" }) hl.bind("SUPER + SHIFT + down", hl.dsp.window.swap({ direction = "down" }), { description = "Swap window down" }) -hl.bind("ALT + TAB", hl.dsp.exec_cmd("hyprctl dispatch cyclenext"), { description = "Cycle to next window" }) -hl.bind("ALT + SHIFT + TAB", hl.dsp.exec_cmd("hyprctl dispatch cyclenext prev"), { description = "Cycle to prev window" }) -hl.bind("ALT + TAB", hl.dsp.exec_cmd("hyprctl dispatch bringactivetotop"), { description = "Reveal active window on top" }) -hl.bind("ALT + SHIFT + TAB", hl.dsp.exec_cmd("hyprctl dispatch bringactivetotop"), { description = "Reveal active window on top" }) +hl.bind("ALT + TAB", hl.dsp.window.cycle_next(), { description = "Cycle to next window" }) +hl.bind("ALT + SHIFT + TAB", hl.dsp.window.cycle_next({ next = false }), { description = "Cycle to prev window" }) +hl.bind("ALT + TAB", hl.dsp.window.bring_to_top(), { description = "Reveal active window on top" }) +hl.bind("ALT + SHIFT + TAB", hl.dsp.window.bring_to_top(), { description = "Reveal active window on top" }) -hl.bind("SUPER + code:20", hl.dsp.window.resize({ x = -100, y = 0 }), { description = "Expand window left" }) -hl.bind("SUPER + code:21", hl.dsp.window.resize({ x = 100, y = 0 }), { description = "Shrink window left" }) -hl.bind("SUPER + SHIFT + code:20", hl.dsp.window.resize({ x = 0, y = -100 }), { description = "Shrink window up" }) -hl.bind("SUPER + SHIFT + code:21", hl.dsp.window.resize({ x = 0, y = 100 }), { description = "Expand window down" }) +hl.bind("SUPER + code:20", hl.dsp.window.resize({ x = -100, y = 0, relative = true }), { description = "Expand window left" }) +hl.bind("SUPER + code:21", hl.dsp.window.resize({ x = 100, y = 0, relative = true }), { description = "Shrink window left" }) +hl.bind("SUPER + SHIFT + code:20", hl.dsp.window.resize({ x = 0, y = -100, relative = true }), { description = "Shrink window up" }) +hl.bind("SUPER + SHIFT + code:21", hl.dsp.window.resize({ x = 0, y = 100, relative = true }), { description = "Expand window down" }) hl.bind("SUPER + mouse_down", hl.dsp.focus({ workspace = "e+1" }), { description = "Scroll active workspace forward" }) hl.bind("SUPER + mouse_up", hl.dsp.focus({ workspace = "e-1" }), { description = "Scroll active workspace backward" }) diff --git a/config/hypr/bindings/utilities.lua b/config/hypr/bindings/utilities.lua index 8541c7e..3a48568 100644 --- a/config/hypr/bindings/utilities.lua +++ b/config/hypr/bindings/utilities.lua @@ -11,7 +11,7 @@ hl.bind("SUPER + N", hl.dsp.exec_cmd("swaync-client -op"), { description = "Noti hl.bind("SUPER + SHIFT + SPACE", hl.dsp.exec_cmd("omarchy-toggle-waybar"), { description = "Toggle top bar" }) hl.bind("SUPER + CTRL + SPACE", hl.dsp.exec_cmd("omarchy-theme-bg-next"), { description = "Next background in theme" }) hl.bind("SUPER + SHIFT + CTRL + SPACE", hl.dsp.exec_cmd("omarchy-menu theme"), { description = "Pick new theme" }) -hl.bind("SUPER + BACKSPACE", hl.dsp.exec_cmd("hyprctl dispatch setprop \"address:$(hyprctl activewindow -j | jq -r '.address')\" opaque toggle"), { description = "Toggle window transparency" }) +hl.bind("SUPER + BACKSPACE", hl.dsp.window.set_prop({ prop = "opaque", value = "toggle" }), { description = "Toggle window transparency" }) hl.bind("SUPER + COMMA", hl.dsp.exec_cmd("makoctl dismiss"), { description = "Dismiss last notification" }) hl.bind("SUPER + SHIFT + COMMA", hl.dsp.exec_cmd("makoctl dismiss --all"), { description = "Dismiss all notifications" })