From 0e164609bf1386e5c5288ec811b53a1846fadaf6 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 4 Dec 2022 18:15:44 +0100 Subject: urgent_wgt: refactor client signal handlers Shorter and simpler. Also fixes a bug where a client would show up as urgrent after being moved between pages. --- urgent_wgt.lua | 73 +++++++++++++++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 41 deletions(-) (limited to 'urgent_wgt.lua') diff --git a/urgent_wgt.lua b/urgent_wgt.lua index a50bd47..cce4675 100644 --- a/urgent_wgt.lua +++ b/urgent_wgt.lua @@ -68,52 +68,43 @@ function UrgentWidget:_desk_client_remove(desk_idx, c) end end -function UrgentWidget:_client_remove(c) - if self._clients[c] then - self:_desk_client_remove(self._clients[c], c) - end - self._clients[c] = nil -end - function UrgentWidget:_client_add(c) - local desk_idx = client_get_desk_idx(c) - self._clients[c] = desk_idx + function handler_client_show(c) + if not c.urgent then + return + end - if desk_idx then - self:_desk_client_add(desk_idx, c) + local desk_idx = client_get_desk_idx(c) + self._clients[c] = desk_idx + if desk_idx then + self:_desk_client_add(desk_idx, c) + end + end + function handler_client_hide(c) + if self._clients[c] then + self:_desk_client_remove(self._clients[c], c) + end + end + function handler_client_remove(c) + c:disconnect_signal('untagged', handler_client_hide) + c:disconnect_signal('tagged', handler_client_show) + c:disconnect_signal('unmanage', handler_client_remove) + c:disconnect_signal('property::urgent', handler_client_remove) + + handler_client_hide(c) + self._clients[c] = nil end -- handle client state changes: - -- lose the urgency flag - c:connect_signal('property::urgent', - function (c) - if not c.urgent then - self:_client_remove(c) - end - end) - -- client destroyed - c:connect_signal('unmanage', - function (c) - self:_client_remove(c) - end) - -- client moved - c:connect_signal('untagged', - function(c, t) - local desk_idx = self._clients[c] - if desk_idx then - self:_desk_client_remove(desk_idx, c) - end - self._clients[c] = false - end) - c:connect_signal('tagged', - function(c, t) - local desk_idx = client_get_desk_idx(c) - self._clients[c] = desk_idx - - if desk_idx then - self:_desk_client_add(desk_idx, c) - end - end) + -- client moved: hide it on its previous desktop, show on the new one + c:connect_signal('untagged', handler_client_hide) + c:connect_signal('tagged', handler_client_show) + -- unurgent or destroyed: forget about client + c:connect_signal('property::urgent', handler_client_remove) + c:connect_signal('unmanage', handler_client_remove) + + -- show the client on its desk right now + handler_client_show(c) end function UrgentWidget:new() -- cgit v1.2.3