63 lines
1.7 KiB
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
|