From 33b1ccebca05c499a737a0dd665177a80f20d0fe Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 7 Nov 2020 11:35:25 +0100 Subject: pager: cache desktop widgets Creating them anew all the time leads to large memory usage. --- pager.lua | 83 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 46 insertions(+), 37 deletions(-) (limited to 'pager.lua') diff --git a/pager.lua b/pager.lua index 9bfd611..d3b672a 100644 --- a/pager.lua +++ b/pager.lua @@ -36,14 +36,14 @@ function Page:update() client:connect_signal("property::name", function() tb:set_text(client.name or "") end) client:connect_signal("focus", function(c) - if c.screen == self.pager.screen then + if c.screen == self.screen then bg:set_bg(bg_focus) bg:set_fg(fg_focus) end end) client:connect_signal("unfocus", function(c) - if c.screen == self.pager.screen then + if c.screen == self.screen then bg:set_bg(bg_normal) bg:set_fg(fg_normal) end @@ -53,7 +53,7 @@ function Page:update() end end -function Page:new(tag, index, width, height, pager) +function Page:new(tag, index, width, height, screen) local ret = setmetatable({}, self) self.__index = self @@ -69,7 +69,7 @@ function Page:new(tag, index, width, height, pager) ret.client_container = client_container ret.border = margin ret.tag = tag - ret.pager = pager + ret.screen = screen tag:connect_signal('tagged', function (c) ret:update() end) tag:connect_signal('untagged', function (c) ret:update() end) @@ -80,35 +80,16 @@ function Page:new(tag, index, width, height, pager) return ret end -local Pager = {} - -function Pager:_set_active(screen, page_idx) - if self.screen == screen then - if self.active_page then - self.active_page:set_active(false) - end - self.pages[page_idx]:set_active(true) - self.active_page = self.pages[page_idx] - end -end - -function Pager:set_desktop(desktop) - if self._desktop == desktop then - print('same desktop') - return - end - - print("pager " .. self.screen.index .. " set desktop") +local PagerDesk = {} - self.widget:reset() - - self.active_page = nil - self.pages = {} +function PagerDesk:new(desktop, screen, width, height) + local ret = setmetatable({}, self) + self.__index = self - local nb_pages = #desktop.pages - local page_height = self.height / nb_pages + local nb_pages = #desktop.pages + local page_height = height / nb_pages - local title = wibox.widget.textbox(desktop.name, false) + local title = wibox.widget.textbox() title:set_align("center") local title_bg = beautiful.bg_focus or "#ffffff" local title_fg = beautiful.fg_focus or "#000000" @@ -119,27 +100,55 @@ function Pager:set_desktop(desktop) function(desktop, name) title:set_text(name) end) + title:set_text(desktop.name) - self.widget:add(title_container) + ret.widget = wibox.layout.fixed.vertical(title_container) + ret.pages = {} for i = 1, nb_pages do local page = desktop.pages[i] - self.pages[i] = Page:new(page, i, self.width, page_height, self) - self.widget:add(self.pages[i].widget) + ret.pages[i] = Page:new(page, i, width, page_height, screen) + ret.widget:add(ret.pages[i].widget) end desktop:connect_signal("page:view", - function(desktop, s, page_idx) - self:_set_active(s, page_idx) end) + function(desktop, s, page_idx) ret:_set_active(s, page_idx) end) + + ret.desktop = desktop + ret.screen = screen + ret.active_page = nil - self._desktop = desktop + return ret +end + +function PagerDesk:_set_active(screen, page_idx) + if self.screen == screen then + if self.active_page then + self.active_page:set_active(false) + end + self.pages[page_idx]:set_active(true) + self.active_page = self.pages[page_idx] + end +end + +local Pager = {} + +function Pager:set_desktop(desktop) + if self._desktops[desktop] == nil then + self._desktops[desktop] = PagerDesk:new(desktop, self.screen, + self.width, self.height) + end + + self.widget:set_widget(self._desktops[desktop].widget) end function Pager:new(screen, width, height) local ret = setmetatable({}, self) self.__index = self - ret.widget = wibox.layout.fixed.vertical() + ret.widget = wibox.container.constraint() + + ret._desktops = {} ret.screen = screen ret.width = width -- cgit v1.2.3