Advertisement
bvn13

Untitled

Feb 19th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.37 KB | None | 0 0
  1. ---------------------------------------------------
  2. -- Vicious widgets for the awesome window manager
  3. ---------------------------------------------------
  4. -- Licensed under the GNU General Public License v2
  5. -- * (c) 2010, Adrian C. <anrxc@sysphere.org>
  6. -- * (c) 2009, Lucas de Vries <lucas@glacicle.com>
  7. ---------------------------------------------------
  8.  
  9. -- {{{ Setup environment
  10. local type = type
  11. local pairs = pairs
  12. local tonumber = tonumber
  13. local capi = { timer = timer }
  14. local os = { time = os.time }
  15. local table = {
  16. insert = table.insert,
  17. remove = table.remove
  18. }
  19.  
  20. local helpers = require("vicious.helpers")
  21.  
  22. -- Vicious: widgets for the awesome window manager
  23. local vicious = {}
  24. vicious.widgets = require("vicious.widgets")
  25. --vicious.contrib = require("vicious.contrib")
  26.  
  27. -- Initialize tables
  28. local timers = {}
  29. local registered = {}
  30. local widget_cache = {}
  31. -- }}}
  32.  
  33.  
  34. -- {{{ Local functions
  35. -- {{{ Update a widget
  36. local function update(widget, reg, disablecache)
  37. -- Check if there are any equal widgets
  38. if reg == nil then
  39. for w, i in pairs(registered) do
  40. if w == widget then
  41. for _, r in pairs(i) do
  42. update(w, r, disablecache)
  43. end
  44. end
  45. end
  46.  
  47. return
  48. end
  49.  
  50. local t = os.time()
  51. local data = {}
  52.  
  53. -- Check for chached output newer than the last update
  54. if widget_cache[reg.wtype] ~= nil then
  55. local c = widget_cache[reg.wtype]
  56.  
  57. if (c.time == nil or c.time <= t-reg.timer) or disablecache then
  58. c.time, c.data = t, reg.wtype(reg.format, reg.warg)
  59. end
  60.  
  61. data = c.data
  62. else
  63. data = reg.wtype and reg.wtype(reg.format, reg.warg)
  64. end
  65.  
  66. if type(data) == "table" then
  67. if type(reg.format) == "string" then
  68. data = helpers.format(reg.format, data)
  69. elseif type(reg.format) == "function" then
  70. data = reg.format(widget, data)
  71. end
  72. end
  73.  
  74. if widget.add_value ~= nil then
  75. widget:add_value(tonumber(data) and tonumber(data)/100)
  76. elseif widget.set_value ~= nil then
  77. widget:set_value(tonumber(data) and tonumber(data)/100)
  78. elseif widget.set_markup ~= nil then
  79. widget:set_markup(data)
  80. else
  81. widget.text = data
  82. end
  83.  
  84. return data
  85. end
  86. -- }}}
  87.  
  88. -- {{{ Register from reg object
  89. local function regregister(reg)
  90. if not reg.running then
  91. if registered[reg.widget] == nil then
  92. registered[reg.widget] = {}
  93. table.insert(registered[reg.widget], reg)
  94. else
  95. local already = false
  96.  
  97. for w, i in pairs(registered) do
  98. if w == reg.widget then
  99. for _, v in pairs(i) do
  100. if v == reg then
  101. already = true
  102. break
  103. end
  104. end
  105.  
  106. if already then
  107. break
  108. end
  109. end
  110. end
  111.  
  112. if not already then
  113. table.insert(registered[reg.widget], reg)
  114. end
  115. end
  116.  
  117. -- Start the timer
  118. if reg.timer > 0 then
  119. local tm = timers[reg.timer] and timers[reg.timer].timer
  120. tm = tm or capi.timer({ timeout = reg.timer })
  121. if tm.connect_signal then
  122. tm:connect_signal("timeout", reg.update)
  123. else
  124. tm:add_signal("timeout", reg.update)
  125. end
  126. if not timers[reg.timer] then
  127. timers[reg.timer] = { timer = tm, refs = 1 }
  128. else
  129. timers[reg.timer].refs = timers[reg.timer].refs + 1
  130. end
  131. if not tm.started then
  132. tm:start()
  133. end
  134. -- Initial update
  135. reg.update()
  136. end
  137. reg.running = true
  138. end
  139. end
  140. -- }}}
  141. -- }}}
  142.  
  143.  
  144. -- {{{ Global functions
  145. -- {{{ Register a widget
  146. function vicious.register(widget, wtype, format, timer, warg)
  147. local widget = widget
  148. local reg = {
  149. -- Set properties
  150. wtype = wtype,
  151. format = format,
  152. timer = timer,
  153. warg = warg,
  154. widget = widget,
  155. }
  156. -- Set functions
  157. reg.update = function ()
  158. update(widget, reg)
  159. end
  160.  
  161. -- Default to 2s timer
  162. if reg.timer == nil then
  163. reg.timer = 2
  164. end
  165.  
  166. -- Register a reg object
  167. regregister(reg)
  168.  
  169. -- Return a reg object for reuse
  170. return reg
  171. end
  172. -- }}}
  173.  
  174. -- {{{ Unregister a widget
  175. function vicious.unregister(widget, keep, reg)
  176. if reg == nil then
  177. for w, i in pairs(registered) do
  178. if w == widget then
  179. for _, v in pairs(i) do
  180. reg = vicious.unregister(w, keep, v)
  181. end
  182. end
  183. end
  184.  
  185. return reg
  186. end
  187.  
  188. if not keep then
  189. for w, i in pairs(registered) do
  190. if w == widget then
  191. for k, v in pairs(i) do
  192. if v == reg then
  193. table.remove(registered[w], k)
  194. end
  195. end
  196. end
  197. end
  198. end
  199.  
  200. if not reg.running then
  201. return reg
  202. end
  203.  
  204. -- Disconnect from timer
  205. local tm = timers[reg.timer]
  206. if tm.timer.disconnect_signal then
  207. tm.timer:disconnect_signal("timeout", reg.update)
  208. else
  209. tm.timer:remove_signal("timeout", reg.update)
  210. end
  211. reg.running = false
  212. -- Stop the timer
  213. tm.refs = tm.refs - 1
  214. if tm.refs == 0 and tm.timer.started then
  215. tm.timer:stop()
  216. end
  217.  
  218. return reg
  219. end
  220. -- }}}
  221.  
  222. -- {{{ Enable caching of a widget type
  223. function vicious.cache(wtype)
  224. if wtype ~= nil then
  225. if widget_cache[wtype] == nil then
  226. widget_cache[wtype] = {}
  227. end
  228. end
  229. end
  230. -- }}}
  231.  
  232. -- {{{ Force update of widgets
  233. function vicious.force(wtable)
  234. if type(wtable) == "table" then
  235. for _, w in pairs(wtable) do
  236. update(w, nil, true)
  237. end
  238. end
  239. end
  240. -- }}}
  241.  
  242. -- {{{ Suspend all widgets
  243. function vicious.suspend()
  244. for w, i in pairs(registered) do
  245. for _, v in pairs(i) do
  246. vicious.unregister(w, true, v)
  247. end
  248. end
  249. end
  250. -- }}}
  251.  
  252. -- {{{ Activate a widget
  253. function vicious.activate(widget)
  254. for w, i in pairs(registered) do
  255. if widget == nil or w == widget then
  256. for _, v in pairs(i) do
  257. regregister(v)
  258. end
  259. end
  260. end
  261. end
  262. -- }}}
  263.  
  264. return vicious
  265.  
  266. -- }}}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement