summaryrefslogtreecommitdiff
path: root/pager.lua
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2020-11-07 11:35:25 +0100
committerAnton Khirnov <anton@khirnov.net>2020-11-07 11:35:25 +0100
commit33b1ccebca05c499a737a0dd665177a80f20d0fe (patch)
tree18a1713f3050b58698fc78760717e5b85d4c777e /pager.lua
parent180fb7eb8790491c4476fafffe04b27998796f18 (diff)
pager: cache desktop widgets
Creating them anew all the time leads to large memory usage.
Diffstat (limited to 'pager.lua')
-rw-r--r--pager.lua83
1 files changed, 46 insertions, 37 deletions
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