From ba12c31e3e194de5c042808660a335ffcd706031 Mon Sep 17 00:00:00 2001 From: The_miro Date: Fri, 24 Jul 2026 10:49:59 +0200 Subject: [PATCH] feat(hypr): rework Super+E/F binds, add magnifier zoom and monocle toggle Super+E now toggles cursor "glass magnifier" zoom (wiki trick); Thunar moves to Super+Shift+E and the pcmanfm-qt alt bind is dropped. Super+Alt+F drops the calculator launch in favor of a real fullscreen toggle, and Super+Ctrl+F is added to toggle the workspace's "monocle" layout via the existing layouts registry. Also inlines unified-rotate.sh cw/ccw directly in the Super+Ctrl+E/D rotation binds instead of going through the confusingly-named (and reversed) screenrotationwcw/acw.sh wrapper scripts. Co-Authored-By: Claude Sonnet 5 --- desktopenvs/hyprdrive/hypr/usr/binds.lua | 41 +++++++++++++++++++++--- desktopenvs/hyprlua/hypr/usr/binds.lua | 41 +++++++++++++++++++++--- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/desktopenvs/hyprdrive/hypr/usr/binds.lua b/desktopenvs/hyprdrive/hypr/usr/binds.lua index e703d55..8b0e3aa 100644 --- a/desktopenvs/hyprdrive/hypr/usr/binds.lua +++ b/desktopenvs/hyprdrive/hypr/usr/binds.lua @@ -37,6 +37,28 @@ hl.gesture({ fingers = 4, direction = "up", action = function() hl.dispatc hl.gesture({ fingers = 4, direction = "left", action = function() hl.dispatch(hl.dsp.window.move({ workspace = "r+1" })) end }) hl.gesture({ fingers = 4, direction = "right", action = function() hl.dispatch(hl.dsp.window.move({ workspace = "r-1" })) end }) +-------------------- +---- ZOOM ---------- +-------------------- + +-- Glass magnifier zoom: https://wiki.hypr.land/Configuring/Advanced-and-Cool/Uncommon-tips-and-tricks/#glass-magnifier-zoom +local MAX_ZOOM = 3 +local MIN_ZOOM = 1 +local ZOOM_TOGGLE_FACTOR = 1.5 +local function zoom(offset) + local current = hl.get_config("cursor.zoom_factor") + if offset ~= nil then + current = current + offset + elseif current ~= MIN_ZOOM then + current = MIN_ZOOM + else + current = ZOOM_TOGGLE_FACTOR + end + current = math.max(MIN_ZOOM, math.min(MAX_ZOOM, current)) + hl.config({ cursor = { zoom_factor = current } }) +end +hl.bind(mainMod .. " + E", function() zoom() end) + -------------------- ---- APPS ---------- -------------------- @@ -44,8 +66,7 @@ hl.gesture({ fingers = 4, direction = "right", action = function() hl.dispatc hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(terminal)) hl.bind(mainMod .. " + SHIFT + T", hl.dsp.exec_cmd("cool-retro-term -p ~/Dotfiles/desktopenvs/hyprdrive/CRT")) hl.bind(mainMod .. " + M", hl.dsp.exec_cmd(editor)) -hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager)) -hl.bind(mainMod .. " + ALT + E", hl.dsp.exec_cmd("pcmanfm-qt")) +hl.bind(mainMod .. " + SHIFT + E", hl.dsp.exec_cmd(fileManager)) hl.bind(mainMod .. " + N", hl.dsp.exec_cmd("nextcloud")) -- Wi-Fi quick-pick (iwmenu --launcher walker) needs a dmenu-protocol launcher -- backend hyprdrive doesn't install; pending a hyprdrive-native replacement, @@ -59,7 +80,6 @@ hl.bind("CTRL + SHIFT + R", hl.dsp.exec_cmd(menu)) -- File picker dialog -> clipboard (path / contents) hl.bind(mainMod .. " + F", hl.dsp.exec_cmd("[tag +filepicker] ~/.config/scripts/filepicker-clipboard.sh path")) hl.bind(mainMod .. " + SHIFT + F", hl.dsp.exec_cmd("[tag +filepicker] ~/.config/scripts/filepicker-clipboard.sh content")) -hl.bind(mainMod .. " + ALT + F", hl.dsp.exec_cmd("qalculate-gtk")) hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("[tag +mixer] pavucontrol")) hl.bind(mainMod .. " + U", hl.dsp.exec_cmd("[tag +centered-L] kitty btop")) @@ -81,8 +101,19 @@ hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" hl.bind(mainMod .. " + C", hl.dsp.window.pseudo()) hl.bind(mainMod .. " + SHIFT + V", hl.dsp.window.tag({ tag = "+centered" })) hl.bind(mainMod .. " + SHIFT + Q", hl.dsp.exec_cmd("hyprctl kill")) +hl.bind(mainMod .. " + ALT + F", hl.dsp.exec_cmd("hyprctl dispatch fullscreen")) hl.bind(mainMod .. " + CTRL + M", hl.dsp.exec_cmd("~/.config/scripts/toggle-layout.sh")) +-- Switch the focused window's workspace to the "monocle" layout (one full-size window +-- at a time), toggling back to the session default (columns) on a second press. +-- Uses the same layouts registry the astro-menu popup drives via `hyprctl eval`. +local function toggle_monocle() + local ok, aw = pcall(hl.get_active_window) + if not ok or not aw or not aw.workspace then return end + local wid = tostring(aw.workspace.id) + layouts.set(wid, layouts.current[wid] == "monocle" and "columns" or "monocle") +end +hl.bind(mainMod .. " + CTRL + F", toggle_monocle) -- lock/exit — hyprshutdown gracefully closes every app (with a UI) before it exits -- Hyprland and runs its --post-cmd, instead of yanking the session out from under them. @@ -331,5 +362,5 @@ hl.bind(mainMod .. " + SHIFT + C", hl.dsp.exec_cmd("~/.config/scripts/caffeine.s hl.bind(mainMod .. " + SHIFT + B", hl.dsp.exec_cmd("[tag +centered-S] kitty bash ~/.config/scripts/enroll-biometrics.sh")) hl.bind(mainMod .. " + SHIFT + X", hl.dsp.exec_cmd("~/.config/scripts/hyprland-toggle-touchpad.sh")) -hl.bind(mainMod .. " + CTRL + E", hl.dsp.exec_cmd("~/.config/scripts/screenrotationwcw.sh")) -hl.bind(mainMod .. " + CTRL + D", hl.dsp.exec_cmd("~/.config/scripts/screenrotationacw.sh")) +hl.bind(mainMod .. " + CTRL + E", hl.dsp.exec_cmd("~/.config/scripts/unified-rotate.sh ccw")) +hl.bind(mainMod .. " + CTRL + D", hl.dsp.exec_cmd("~/.config/scripts/unified-rotate.sh cw")) diff --git a/desktopenvs/hyprlua/hypr/usr/binds.lua b/desktopenvs/hyprlua/hypr/usr/binds.lua index f62eefa..c8ac0ff 100644 --- a/desktopenvs/hyprlua/hypr/usr/binds.lua +++ b/desktopenvs/hyprlua/hypr/usr/binds.lua @@ -37,6 +37,28 @@ hl.gesture({ fingers = 4, direction = "up", action = function() hl.dispatc hl.gesture({ fingers = 4, direction = "left", action = function() hl.dispatch(hl.dsp.window.move({ workspace = "r+1" })) end }) hl.gesture({ fingers = 4, direction = "right", action = function() hl.dispatch(hl.dsp.window.move({ workspace = "r-1" })) end }) +-------------------- +---- ZOOM ---------- +-------------------- + +-- Glass magnifier zoom: https://wiki.hypr.land/Configuring/Advanced-and-Cool/Uncommon-tips-and-tricks/#glass-magnifier-zoom +local MAX_ZOOM = 3 +local MIN_ZOOM = 1 +local ZOOM_TOGGLE_FACTOR = 1.5 +local function zoom(offset) + local current = hl.get_config("cursor.zoom_factor") + if offset ~= nil then + current = current + offset + elseif current ~= MIN_ZOOM then + current = MIN_ZOOM + else + current = ZOOM_TOGGLE_FACTOR + end + current = math.max(MIN_ZOOM, math.min(MAX_ZOOM, current)) + hl.config({ cursor = { zoom_factor = current } }) +end +hl.bind(mainMod .. " + E", function() zoom() end) + -------------------- ---- APPS ---------- -------------------- @@ -44,8 +66,7 @@ hl.gesture({ fingers = 4, direction = "right", action = function() hl.dispatc hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(terminal)) hl.bind(mainMod .. " + SHIFT + T", hl.dsp.exec_cmd("cool-retro-term -p ~/Dotfiles/desktopenvs/hyprlua/CRT")) hl.bind(mainMod .. " + M", hl.dsp.exec_cmd(editor)) -hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager)) -hl.bind(mainMod .. " + ALT + E", hl.dsp.exec_cmd("pcmanfm-qt")) +hl.bind(mainMod .. " + SHIFT + E", hl.dsp.exec_cmd(fileManager)) hl.bind(mainMod .. " + X", hl.dsp.exec_cmd("wofi --show=run")) hl.bind(mainMod .. " + N", hl.dsp.exec_cmd("nextcloud")) hl.bind(mainMod .. " + I", hl.dsp.exec_cmd("iwmenu --launcher walker")) @@ -63,7 +84,6 @@ hl.bind(mainMod .. " + SHIFT + F", hl.dsp.exec_cmd("[tag +filepicker] ~/.c -- old: -- hl.bind(mainMod .. " + F", hl.dsp.exec_cmd("~/.config/scripts/wofi-file-search.sh")) -- hl.bind(mainMod .. " + SHIFT + F", hl.dsp.exec_cmd("~/.config/scripts/foldersearch.sh")) -hl.bind(mainMod .. " + ALT + F", hl.dsp.exec_cmd("wofi-calc")) hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("[tag +mixer] pavucontrol")) hl.bind(mainMod .. " + U", hl.dsp.exec_cmd("[tag +centered-L] kitty btop")) @@ -85,8 +105,19 @@ hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" hl.bind(mainMod .. " + C", hl.dsp.window.pseudo()) hl.bind(mainMod .. " + SHIFT + V", hl.dsp.window.tag({ tag = "+centered" })) hl.bind(mainMod .. " + SHIFT + Q", hl.dsp.exec_cmd("hyprctl kill")) +hl.bind(mainMod .. " + ALT + F", hl.dsp.exec_cmd("hyprctl dispatch fullscreen")) hl.bind(mainMod .. " + CTRL + M", hl.dsp.exec_cmd("~/.config/scripts/toggle-layout.sh")) +-- Switch the focused window's workspace to the "monocle" layout (one full-size window +-- at a time), toggling back to the session default (columns) on a second press. +-- Uses the same layouts registry the astal-menu popup drives via `hyprctl eval`. +local function toggle_monocle() + local ok, aw = pcall(hl.get_active_window) + if not ok or not aw or not aw.workspace then return end + local wid = tostring(aw.workspace.id) + layouts.set(wid, layouts.current[wid] == "monocle" and "columns" or "monocle") +end +hl.bind(mainMod .. " + CTRL + F", toggle_monocle) -- lock/exit — hyprshutdown gracefully closes every app (with a UI) before it exits -- Hyprland and runs its --post-cmd, instead of yanking the session out from under them. @@ -311,5 +342,5 @@ hl.bind(mainMod .. " + SHIFT + C", hl.dsp.exec_cmd("~/.config/scripts/caffeine.s hl.bind(mainMod .. " + SHIFT + B", hl.dsp.exec_cmd("[tag +centered-S] kitty bash ~/.config/scripts/enroll-biometrics.sh")) hl.bind(mainMod .. " + SHIFT + X", hl.dsp.exec_cmd("~/.config/scripts/hyprland-toggle-touchpad.sh")) -hl.bind(mainMod .. " + CTRL + E", hl.dsp.exec_cmd("~/.config/scripts/screenrotationwcw.sh")) -hl.bind(mainMod .. " + CTRL + D", hl.dsp.exec_cmd("~/.config/scripts/screenrotationacw.sh")) +hl.bind(mainMod .. " + CTRL + E", hl.dsp.exec_cmd("~/.config/scripts/unified-rotate.sh ccw")) +hl.bind(mainMod .. " + CTRL + D", hl.dsp.exec_cmd("~/.config/scripts/unified-rotate.sh cw"))