dotfiles/awesome/scratchpad.lua

63 lines
1.7 KiB
Lua

local awful = require("awful")
local scratchpad = {}
function scratchpad.toggle(cmd, geometry)
local client_found = false
-- Look for existing client with scratchpad in class name
for _, c in ipairs(client.get()) do
if c.class and c.class:lower():match("scratchpad") then
client_found = true
if c.hidden or not c:isvisible() then
c.hidden = false
c:raise()
client.focus = c
else
c.hidden = true
end
break
end
end
-- If no client found, spawn new one
if not client_found then
awful.spawn(cmd)
-- Apply geometry after spawn if provided
if geometry then
local function apply_geometry(c)
if c.class and c.class:lower():match("scratchpad") and not c.geometry_applied then
c.geometry_applied = true
local screen_geo = c.screen.workarea
c:geometry({
x = screen_geo.x + (screen_geo.width * geometry.x),
y = screen_geo.y + (screen_geo.height * geometry.y),
width = screen_geo.width * geometry.width,
height = screen_geo.height * geometry.height,
})
client.disconnect_signal("manage", apply_geometry)
end
end
client.connect_signal("manage", apply_geometry)
end
end
end
-- Helper functions
function scratchpad.terminal(geometry)
geometry = geometry or { width = 0.6, height = 0.6, x = 0.2, y = 0.2 }
scratchpad.toggle("alacritty --class=terminal-scratchpad", geometry)
end
function scratchpad.calculator(geometry)
geometry = geometry or { width = 0.3, height = 0.4, x = 0.35, y = 0.3 }
scratchpad.toggle("gnome-calculator", geometry)
end
function scratchpad.filemanager(geometry)
geometry = geometry or { width = 0.7, height = 0.7, x = 0.15, y = 0.15 }
scratchpad.toggle("thunar", geometry)
end
return scratchpad