awful.tooltip: Use metatable magic to create wiboxes lazily

This might make the code a bit easier to follow. Unless you want to know where
the wibox is created...

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2016-03-02 20:00:44 +01:00
parent 68bde9d584
commit e347f7191c
1 changed files with 16 additions and 14 deletions

View File

@ -58,30 +58,32 @@ local ipairs = ipairs
-- @tfield boolean visible True if tooltip is visible.
local tooltip = { mt = {} }
local function get_wibox(self)
if not self.wibox then
self.wibox = wibox(self.wibox_properties)
self.wibox:set_widget(self.marginbox)
local instance_mt = {}
function instance_mt:__index(key)
if key == "wibox" then
local wb = wibox(self.wibox_properties)
wb:set_widget(self.marginbox)
-- Close the tooltip when clicking it. This gets done on release, to not
-- emit the release event on an underlying object, e.g. the titlebar icon.
self.wibox:buttons(abutton({}, 1, nil, self.hide))
wb:buttons(abutton({}, 1, nil, self.hide))
rawset(self, "wibox", wb)
return wb
end
return self.wibox
end
-- Place the tooltip under the mouse.
--
-- @tparam tooltip self A tooltip object.
local function set_geometry(self)
local wb = get_wibox(self)
-- calculate width / height
local n_w, n_h = self.textbox:get_preferred_size(mouse.screen)
n_w = n_w + self.marginbox.left + self.marginbox.right
n_h = n_h + self.marginbox.top + self.marginbox.bottom
wb:geometry({ width = n_w, height = n_h })
a_placement.next_to_mouse(wb)
a_placement.no_offscreen(wb, mouse.screen)
self.wibox:geometry({ width = n_w, height = n_h })
a_placement.next_to_mouse(self.wibox)
a_placement.no_offscreen(self.wibox, mouse.screen)
end
-- Show a tooltip.
@ -97,7 +99,7 @@ local function show(self)
end
end
set_geometry(self)
get_wibox(self).visible = true
self.wibox.visible = true
self.visible = true
end
@ -112,7 +114,7 @@ local function hide(self)
self.timer:stop()
end
end
get_wibox(self).visible = false
self.wibox.visible = false
self.visible = false
end
@ -189,9 +191,9 @@ end
-- @see set_text
-- @see set_markup
tooltip.new = function(args)
local self = {
local self = setmetatable({
visible = false,
}
}, instance_mt)
-- private data
if args.delay_show then