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. -- @tfield boolean visible True if tooltip is visible.
local tooltip = { mt = {} } local tooltip = { mt = {} }
local function get_wibox(self) local instance_mt = {}
if not self.wibox then
self.wibox = wibox(self.wibox_properties) function instance_mt:__index(key)
self.wibox:set_widget(self.marginbox) 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 -- 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. -- 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 end
return self.wibox
end end
-- Place the tooltip under the mouse. -- Place the tooltip under the mouse.
-- --
-- @tparam tooltip self A tooltip object. -- @tparam tooltip self A tooltip object.
local function set_geometry(self) local function set_geometry(self)
local wb = get_wibox(self)
-- calculate width / height -- calculate width / height
local n_w, n_h = self.textbox:get_preferred_size(mouse.screen) local n_w, n_h = self.textbox:get_preferred_size(mouse.screen)
n_w = n_w + self.marginbox.left + self.marginbox.right n_w = n_w + self.marginbox.left + self.marginbox.right
n_h = n_h + self.marginbox.top + self.marginbox.bottom n_h = n_h + self.marginbox.top + self.marginbox.bottom
wb:geometry({ width = n_w, height = n_h }) self.wibox:geometry({ width = n_w, height = n_h })
a_placement.next_to_mouse(wb) a_placement.next_to_mouse(self.wibox)
a_placement.no_offscreen(wb, mouse.screen) a_placement.no_offscreen(self.wibox, mouse.screen)
end end
-- Show a tooltip. -- Show a tooltip.
@ -97,7 +99,7 @@ local function show(self)
end end
end end
set_geometry(self) set_geometry(self)
get_wibox(self).visible = true self.wibox.visible = true
self.visible = true self.visible = true
end end
@ -112,7 +114,7 @@ local function hide(self)
self.timer:stop() self.timer:stop()
end end
end end
get_wibox(self).visible = false self.wibox.visible = false
self.visible = false self.visible = false
end end
@ -189,9 +191,9 @@ end
-- @see set_text -- @see set_text
-- @see set_markup -- @see set_markup
tooltip.new = function(args) tooltip.new = function(args)
local self = { local self = setmetatable({
visible = false, visible = false,
} }, instance_mt)
-- private data -- private data
if args.delay_show then if args.delay_show then