awful.widget.taglist: use attached_add_signal
[awesome.git] / lib / awful / hooks.lua.in
blob00f1ea77abc16985fdb18d55862048b1c2da2017
1 ---------------------------------------------------------------------------
2 -- @author Julien Danjou <julien@danjou.info>
3 -- @copyright 2008 Julien Danjou
4 -- @release @AWESOME_VERSION@
5 ---------------------------------------------------------------------------
7 -- Grab environment we need
8 local pairs = pairs
9 local table = table
10 local ipairs = ipairs
11 local type = type
12 local math = math
13 local capi =
15 hooks = hooks
17 local util = require("awful.util")
19 --- Hooks module for awful
20 module("awful.hooks")
22 -- User hook functions
23 user = {}
25 --- Create a new userhook (for external libs).
26 -- @param name Hook name.
27 function user.create(name)
28 _M[name] = {}
29 _M[name].callbacks = {}
30 _M[name].register = function (f)
31 table.insert(_M[name].callbacks, f)
32 end
33 _M[name].unregister = function (f)
34 for k, h in ipairs(_M[name].callbacks) do
35 if h == f then
36 table.remove(_M[name].callbacks, k)
37 break
38 end
39 end
40 end
41 end
43 --- Call a created userhook (for external libs).
44 -- @param name Hook name.
45 function user.call(name, ...)
46 for name, callback in pairs(_M[name].callbacks) do
47 callback(...)
48 end
49 end
51 -- Autodeclare awful.hooks.* functions
52 -- mapped to awesome hooks.* functions
53 for name, hook in pairs(capi.hooks) do
54 _M[name] = {}
55 if name == 'timer' then
56 _M[name].register = function (time, f, runnow)
57 util.deprecate("timer object")
58 if type(time) ~= 'number' or type(f) ~= 'function' or time <= 0 then
59 return
60 end
62 if not _M[name].callbacks then
63 _M[name].callbacks = {}
64 end
66 for k, v in pairs(_M[name].callbacks) do
67 if v.callback == f then
68 _M[name].unregister(f)
69 _M[name].register(time, f, runnow)
70 return
71 end
72 end
74 local new_timer
75 if _M[name].timer then
76 -- Take the smallest between current and new
77 new_timer = math.min(time, _M[name].timer)
78 else
79 new_timer = time
80 end
82 if _M[name].timer ~= new_timer then
83 _M[name].timer = new_timer
84 end
86 hook(_M[name].timer, function (...)
87 for i, callback in ipairs(_M[name].callbacks) do
88 callback['counter'] = callback['counter'] + _M[name].timer
89 if callback['counter'] >= callback['timer'] then
90 callback['callback'](...)
91 callback['counter'] = 0
92 end
93 end
94 end)
96 if runnow then
97 table.insert(_M[name].callbacks, { callback = f, timer = time, counter = time })
98 else
99 table.insert(_M[name].callbacks, { callback = f, timer = time, counter = 0 })
102 _M[name].unregister = function (f)
103 if _M[name].callbacks then
104 for k, h in ipairs(_M[name].callbacks) do
105 if h.callback == f then
106 table.remove(_M[name].callbacks, k)
107 break
110 local delays = { }
111 for k, h in ipairs(_M[name].callbacks) do
112 table.insert(delays, h.timer)
114 table.sort(delays)
115 _M[name].timer = delays[1]
116 if not delays[1] then delays[1] = 0 end
117 hook(delays[1], function (...)
118 for i, callback in ipairs(_M[name].callbacks) do
119 callback['counter'] = callback['counter'] + _M[name].timer
120 if callback['counter'] >= callback['timer'] then
121 callback['callback'](...)
122 callback['counter'] = 0
125 end)
128 else
129 _M[name].register = function (f)
130 if not _M[name].callbacks then
131 _M[name].callbacks = {}
132 hook(function (...)
133 for i, callback in ipairs(_M[name].callbacks) do
134 callback(...)
136 end)
139 table.insert(_M[name].callbacks, f)
143 if name ~= "timer" then
144 _M[name].unregister = function (f)
145 if _M[name].callbacks then
146 for k, h in ipairs(_M[name].callbacks) do
147 if h == f then
148 table.remove(_M[name].callbacks, k)
149 break
157 -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80