From e347f7191c958935ffca1e649d0b8a6f51f516d6 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Wed, 2 Mar 2016 20:00:44 +0100 Subject: [PATCH] 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 --- lib/awful/tooltip.lua | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/awful/tooltip.lua b/lib/awful/tooltip.lua index ab520f12..f38cd365 100644 --- a/lib/awful/tooltip.lua +++ b/lib/awful/tooltip.lua @@ -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