106 lines
2.3 KiB
Lua
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
|
||
|
}
|