awesome-slot/init.lua

132 lines
3.3 KiB
Lua
Raw Normal View History

2021-05-24 11:40:33 +02:00
-----
-- AwesomeWM - Slot
--
-- An OO/Declarative API to connect signals for the AwesomeWM.
-- It completes the native `gears.signal` module to make signal connection
-- easier to manage.
-----
local gtable = require "gears.table"
2021-05-24 11:40:33 +02:00
-- Load global awesome components from the C API
local capi = {
client = _G.client,
screen = _G.screen,
tag = _G.tag,
2021-05-24 11:40:33 +02:00
}
local awesome_slot = {
mt = {},
slots = require "awesome-slot.slots",
2021-05-24 11:40:33 +02:00
static_connect = {
client = capi.client,
screen = capi.screen,
tag = capi.tag,
ruled_client = require "ruled.client",
ruled_notification = require "ruled.notification",
},
registered_slots = {},
slot_status = {
CREATED = 1,
CONNECTED = 2,
},
2021-05-24 11:40:33 +02:00
}
2021-10-16 14:42:16 +02:00
local function generate_id(base_id)
local id = base_id
local n = 0
while awesome_slot.slots[id] ~= nil do
n = n + 1
id = base_id .. "_#" .. n
end
return id
end
local function get_slot(slot)
assert(slot)
local id = type(slot) == "string" and slot or slot.id
assert(id, "Slot not found!")
2021-05-24 11:40:33 +02:00
return awesome_slot.registered_slots[id]
2021-05-24 11:40:33 +02:00
end
function awesome_slot.create_slot(params)
2021-05-24 11:40:33 +02:00
local slot = {}
slot.id = generate_id(params.id or "UNNAMED_SLOT")
2021-05-24 11:40:33 +02:00
slot.target = params.target
slot.signal = params.signal
if params.slot_params then
slot.params = params.slot_params
slot.callback = function()
2021-05-24 11:40:33 +02:00
params.slot(slot.params)
end
else
slot.callback = params.slot
end
slot.status = awesome_slot.slot_status.CREATED
-- Insert the new slot into the slots list
awesome_slot.registered_slots[slot.id] = slot
2021-05-24 11:40:33 +02:00
return slot
end
function awesome_slot.delete_slot(params)
local slot = get_slot(params)
2021-05-24 11:40:33 +02:00
-- We shouldn't delete slot if its still connected
2021-05-24 11:40:33 +02:00
if slot.status == awesome_slot.slot_status.CONNECTED then
print "please disconnnect the slot before deleting it"
2021-05-24 11:40:33 +02:00
return false
end
awesome_slot.registered_slots[slot.id] = nil
2021-05-24 11:40:33 +02:00
return true
end
function awesome_slot.connect_slot(params)
local slot = get_slot(params)
2021-05-24 11:40:33 +02:00
-- Some modules expose a static connect_signals function
-- at the module level, while other tables/objects inheriting from
-- gears.object implement the signal connection API at the instance level.
if gtable.hasitem(awesome_slot.static_connect, slot.target) then
slot.target.connect_signal(slot.signal, slot.callback)
else
slot.target:connect_signal(slot.signal, slot.callback)
end
slot.status = awesome_slot.slot_status.CONNECTED
return slot
end
function awesome_slot.disconnect_slot(params)
local slot = get_slot(params)
2021-05-24 11:40:33 +02:00
-- Please check the `:connect_slot` method to understand why we do this.
if gtable.hasitem(awesome_slot.static_connect, slot.target) then
slot.target.disconnect_slot(slot.signal, slot.callback)
else
slot.target:disconnect_slot(slot.signal, slot.callback)
end
slot.status = awesome_slot.slot_status.CREATED
return slot
end
function awesome_slot.mt:__call(...) -- luacheck: ignore unused argument self
return awesome_slot.connect_slot(awesome_slot.create_slot(...))
2021-05-24 11:40:33 +02:00
end
return setmetatable(awesome_slot, awesome_slot.mt)
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80