summaryrefslogtreecommitdiff
path: root/lib/awful/widget/common.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/awful/widget/common.lua')
-rw-r--r--lib/awful/widget/common.lua119
1 files changed, 119 insertions, 0 deletions
diff --git a/lib/awful/widget/common.lua b/lib/awful/widget/common.lua
new file mode 100644
index 0000000..e9ae699
--- /dev/null
+++ b/lib/awful/widget/common.lua
@@ -0,0 +1,119 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @classmod awful.widget.common
+---------------------------------------------------------------------------
+
+-- Grab environment we need
+local type = type
+local ipairs = ipairs
+local capi = { button = button }
+local wibox = require("wibox")
+local dpi = require("beautiful").xresources.apply_dpi
+
+--- Common utilities for awful widgets
+local common = {}
+
+--- Common method to create buttons.
+-- @tab buttons
+-- @param object
+-- @treturn table
+function common.create_buttons(buttons, object)
+ if buttons then
+ local btns = {}
+ for _, b in ipairs(buttons) do
+ -- Create a proxy button object: it will receive the real
+ -- press and release events, and will propagate them to the
+ -- button object the user provided, but with the object as
+ -- argument.
+ local btn = capi.button { modifiers = b.modifiers, button = b.button }
+ btn:connect_signal("press", function () b:emit_signal("press", object) end)
+ btn:connect_signal("release", function () b:emit_signal("release", object) end)
+ btns[#btns + 1] = btn
+ end
+
+ return btns
+ end
+end
+
+--- Common update method.
+-- @param w The widget.
+-- @tab buttons
+-- @func label Function to generate label parameters from an object.
+-- The function gets passed an object from `objects`, and
+-- has to return `text`, `bg`, `bg_image`, `icon`.
+-- @tab data Current data/cache, indexed by objects.
+-- @tab objects Objects to be displayed / updated.
+function common.list_update(w, buttons, label, data, objects)
+ -- update the widgets, creating them if needed
+ w:reset()
+ for i, o in ipairs(objects) do
+ local cache = data[o]
+ local ib, tb, bgb, tbm, ibm, l
+ if cache then
+ ib = cache.ib
+ tb = cache.tb
+ bgb = cache.bgb
+ tbm = cache.tbm
+ ibm = cache.ibm
+ else
+ ib = wibox.widget.imagebox()
+ tb = wibox.widget.textbox()
+ bgb = wibox.container.background()
+ tbm = wibox.container.margin(tb, dpi(4), dpi(4))
+ ibm = wibox.container.margin(ib, dpi(4))
+ l = wibox.layout.fixed.horizontal()
+
+ -- All of this is added in a fixed widget
+ l:fill_space(true)
+ l:add(ibm)
+ l:add(tbm)
+
+ -- And all of this gets a background
+ bgb:set_widget(l)
+
+ bgb:buttons(common.create_buttons(buttons, o))
+
+ data[o] = {
+ ib = ib,
+ tb = tb,
+ bgb = bgb,
+ tbm = tbm,
+ ibm = ibm,
+ }
+ end
+
+ local text, bg, bg_image, icon, args = label(o, tb)
+ args = args or {}
+
+ -- The text might be invalid, so use pcall.
+ if text == nil or text == "" then
+ tbm:set_margins(0)
+ else
+ if not tb:set_markup_silently(text) then
+ tb:set_markup("<i>&lt;Invalid text&gt;</i>")
+ end
+ end
+ bgb:set_bg(bg)
+ if type(bg_image) == "function" then
+ -- TODO: Why does this pass nil as an argument?
+ bg_image = bg_image(tb,o,nil,objects,i)
+ end
+ bgb:set_bgimage(bg_image)
+ if icon then
+ ib:set_image(icon)
+ else
+ ibm:set_margins(0)
+ end
+
+ bgb.shape = args.shape
+ bgb.shape_border_width = args.shape_border_width
+ bgb.shape_border_color = args.shape_border_color
+
+ w:add(bgb)
+ end
+end
+
+return common
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80