dotfiles/awesome/constrain.lua
2023-01-20 16:22:46 +01:00

106 lines
2.3 KiB
Lua

-- init -- {{{1
-- luacheck: globals mouse
local mouse = mouse
local root = client
local naughty = require('naughty')
local state = {
client = nil,
signals = {}
}
local function notify(msg, keep) -- {{{1
local timeout = 3
if keep then timeout = 0 end
naughty.notify({ text = msg, timeout = timeout })
end
local function set_bounds() -- {{{1
local c = state.client
state.x_min = c.x + 5
state.x_max = c.x + c.width - 5
state.y_min = c.y + 5
state.y_max = c.y + c.height - 5
end
local function reposition() -- {{{1
local pos = mouse.coords()
local new_pos = {}
if pos.x > state.x_max then
new_pos.x = state.x_max
elseif pos.x < state.x_min then
new_pos.x = state.x_min
else
new_pos.x = pos.x
end
if pos.y > state.y_max then
new_pos.y = state.y_max
elseif pos.y < state.y_min then
new_pos.y = state.y_min
else
new_pos.y = pos.y
end
--new_pos.x = state.x_min + (state.x_max - state.x_min) / 2
--new_pos.y = state.y_min + (state.y_max - state.y_min) / 2
mouse.coords(new_pos, false)
end
local function connect(signal, func) -- {{{1
state.client:connect_signal(signal, func)
state.signals[signal] = func
end
local function disconnect() -- {{{1
for signal, func in pairs(state.signals) do
state.client:disconnect_signal(signal, func)
state.signals[signal] = nil
end
end
local function release() -- {{{1
disconnect()
root.disconnect_signal("mouse::move", reposition)
root.disconnect_signal("mouse::leave", reposition)
notify("Mouse released")
state.client = nil
end
local function constrain(c) -- {{{1
state.client = c or mouse.current_client
if state.client == nil then return end
set_bounds()
notify("Constrainging mouse to " .. state.client.name)
root.connect_signal("mouse::move", reposition)
root.connect_signal("mouse::leave", reposition)
connect("mouse::move", reposition)
connect("mouse::leave", reposition)
connect("property::size", set_bounds)
connect("property::position", set_bounds)
connect("unmanage", release)
end
-- public interface -- {{{1
return {
constrain = constrain,
release = release,
toggle = function(c)
if state.client then
release()
else
constrain(c)
end
end
}