Files
hammerspoon/AppBorders.lua
T
2026-05-14 18:59:23 -04:00

83 lines
2.5 KiB
Lua

--- AppBorders.lua
local logger = hs.logger.new("AppBorders")
logger.i("Init")
-- 1. Variables must be global (no 'local') so they don't get garbage collected
global_border = nil
isBorderEnabled = false -- This tracks if the mode is ON or OFF
function initBorder()
local win = hs.window.focusedWindow()
local frame
if win ~= nil then
frame = win:frame()
else
frame = hs.geometry.new(0, 0, 0, 0)
end
global_border = hs.drawing.rectangle(frame)
global_border:setStrokeColor({ ["red"] = 1, ["blue"] = 0, ["green"] = 0, ["alpha"] = 0.8 })
global_border:setFill(false)
global_border:setStrokeWidth(8)
-- Only show if enabled
if isBorderEnabled then
global_border:show()
end
end
function redrawBorder(window, name, event)
-- If the toggle is OFF, make sure border is hidden and stop
if not isBorderEnabled then
if global_border then global_border:hide() end
return
end
-- Skip specific apps
if name == 'Kontrollzentrum' then return end
local win = hs.window.focusedWindow()
if win ~= nil then
-- Create the border object if it doesn't exist yet
if not global_border then initBorder() end
local newFrame = win:frame()
local currentFrame = global_border:frame()
if not newFrame:equals(currentFrame) then
global_border:setFrame(newFrame)
end
global_border:show()
else
if global_border then global_border:hide() end
end
end
-- 2. Setup the window filter (but it won't do anything until isBorderEnabled is true)
allwindows = hs.window.filter.new(nil)
allwindows:subscribe(hs.window.filter.windowCreated, redrawBorder)
allwindows:subscribe(hs.window.filter.windowDestroyed, redrawBorder)
allwindows:subscribe(hs.window.filter.windowFocused, redrawBorder)
allwindows:subscribe(hs.window.filter.windowMoved, redrawBorder)
allwindows:subscribe(hs.window.filter.windowUnfocused, redrawBorder)
-- 3. THE TOGGLE FUNCTION
function toggleAppBorders()
isBorderEnabled = not isBorderEnabled
if isBorderEnabled then
hs.alert.show("Window Borders: ON")
if not global_border then initBorder() end
redrawBorder() -- Trigger immediate draw
else
hs.alert.show("Window Borders: OFF")
if global_border then global_border:hide() end
end
end
-- 4. THE HOTKEY (Change "B" or the modifiers to your liking)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "B", function()
toggleAppBorders()
end)