169 lines
5.3 KiB
Lua
169 lines
5.3 KiB
Lua
---------------------------------------------------------------------------
|
|
-- @author Julien Danjou <julien@danjou.info>
|
|
-- @copyright 2008 Julien Danjou
|
|
-- @release @AWESOME_VERSION@
|
|
---------------------------------------------------------------------------
|
|
|
|
-- Grab environment we need
|
|
local pairs = pairs
|
|
local table = table
|
|
local unpack = unpack
|
|
local ipairs = ipairs
|
|
local type = type
|
|
local math = math
|
|
local capi =
|
|
{
|
|
hooks = hooks
|
|
}
|
|
|
|
--- Hooks module for awful
|
|
module("awful.hooks")
|
|
|
|
-- User hook functions
|
|
user = {}
|
|
|
|
--- Create a new userhook (for external libs).
|
|
-- @param name Hook name.
|
|
function user.create(name)
|
|
_M[name] = {}
|
|
_M[name].callbacks = {}
|
|
_M[name].register = function (f)
|
|
table.insert(_M[name].callbacks, f)
|
|
end
|
|
_M[name].unregister = function (f)
|
|
for k, h in ipairs(_M[name].callbacks) do
|
|
if h == f then
|
|
table.remove(_M[name].callbacks, k)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--- Call a created userhook (for external libs).
|
|
-- @param name Hook name.
|
|
function user.call(name, ...)
|
|
for name, callback in pairs(_M[name].callbacks) do
|
|
callback(...)
|
|
end
|
|
end
|
|
|
|
-- Autodeclare awful.hooks.* functions
|
|
-- mapped to awesome hooks.* functions
|
|
for name, hook in pairs(capi.hooks) do
|
|
_M[name] = {}
|
|
if name == 'timer' then
|
|
_M[name].register = function (time, f, runnow)
|
|
if type(time) ~= 'number' or type(f) ~= 'function' or time <= 0 then
|
|
return
|
|
end
|
|
|
|
if not _M[name].callbacks then
|
|
_M[name].callbacks = {}
|
|
end
|
|
|
|
for k, v in pairs(_M[name].callbacks) do
|
|
if v.callback == f then
|
|
_M[name].unregister(f)
|
|
_M[name].register(time, f, runnow)
|
|
return
|
|
end
|
|
end
|
|
|
|
local new_timer
|
|
if _M[name].timer then
|
|
-- Take the smallest between current and new
|
|
new_timer = math.min(time, _M[name].timer)
|
|
else
|
|
new_timer = time
|
|
end
|
|
|
|
if _M[name].timer ~= new_timer then
|
|
_M[name].timer = new_timer
|
|
end
|
|
|
|
hook(_M[name].timer, function (...)
|
|
for i, callback in ipairs(_M[name].callbacks) do
|
|
callback['counter'] = callback['counter'] + _M[name].timer
|
|
if callback['counter'] >= callback['timer'] then
|
|
callback['callback'](...)
|
|
callback['counter'] = 0
|
|
end
|
|
end
|
|
end)
|
|
|
|
if runnow then
|
|
table.insert(_M[name].callbacks, { callback = f, timer = time, counter = time })
|
|
else
|
|
table.insert(_M[name].callbacks, { callback = f, timer = time, counter = 0 })
|
|
end
|
|
end
|
|
_M[name].unregister = function (f)
|
|
if _M[name].callbacks then
|
|
for k, h in ipairs(_M[name].callbacks) do
|
|
if h.callback == f then
|
|
table.remove(_M[name].callbacks, k)
|
|
break
|
|
end
|
|
end
|
|
local delays = { }
|
|
for k, h in ipairs(_M[name].callbacks) do
|
|
table.insert(delays, h.timer)
|
|
end
|
|
table.sort(delays)
|
|
_M[name].timer = delays[1]
|
|
if not delays[1] then delays[1] = 0 end
|
|
hook(delays[1], function (...)
|
|
for i, callback in ipairs(_M[name].callbacks) do
|
|
callback['counter'] = callback['counter'] + _M[name].timer
|
|
if callback['counter'] >= callback['timer'] then
|
|
callback['callback'](...)
|
|
callback['counter'] = 0
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
elseif name == "dbus" then
|
|
_M[name].register = function (interface, f)
|
|
if not _M[name].callbacks then
|
|
_M[name].callbacks = {}
|
|
hook(function (msg, ...)
|
|
if _M[name].callbacks[msg.interface] then
|
|
return _M[name].callbacks[msg.interface](msg, unpack(arg))
|
|
end
|
|
end)
|
|
end
|
|
_M[name].callbacks[interface] = f
|
|
end
|
|
else
|
|
_M[name].register = function (f)
|
|
if not _M[name].callbacks then
|
|
_M[name].callbacks = {}
|
|
hook(function (...)
|
|
for i, callback in ipairs(_M[name].callbacks) do
|
|
callback(...)
|
|
end
|
|
end)
|
|
end
|
|
|
|
table.insert(_M[name].callbacks, f)
|
|
end
|
|
end
|
|
|
|
if name ~= "timer" then
|
|
_M[name].unregister = function (f)
|
|
if _M[name].callbacks then
|
|
for k, h in ipairs(_M[name].callbacks) do
|
|
if h == f then
|
|
table.remove(_M[name].callbacks, k)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|