aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorKenny Levinsen <kl@kl.wtf>2021-03-20 12:30:53 +0100
committerSimon Ser <contact@emersion.fr>2021-03-21 12:27:29 +0100
commit152a559e30244e64d4d61b9c87db442dfa04ee52 (patch)
tree85acf3cb2d17c1e4eaa312813053de5b6e3bcd14 /sway
parent70842f4e147fb16caa6f37bbf9d833dcf24a15a1 (diff)
idle_inhibit: Store wlr inhibitor instead of view
When an application inhibited idle, a view pointer was stored and a destroy listener was registered to the wlr inhibitor. As the wlr inhibitor lives longer than the view, this lead to a dangling view pointer between view unmap and inhibitor destroy. Store a pointer to the wlr inhibitor instead of to the view, and look up the view when needed, which may at any point be NULL. This also allows for an inhibitor to remain functional if a surface is re-mapped.
Diffstat (limited to 'sway')
-rw-r--r--sway/desktop/idle_inhibit_v1.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sway/desktop/idle_inhibit_v1.c b/sway/desktop/idle_inhibit_v1.c
index a5cfd5b2..a6ad7166 100644
--- a/sway/desktop/idle_inhibit_v1.c
+++ b/sway/desktop/idle_inhibit_v1.c
@@ -36,7 +36,7 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) {
inhibitor->manager = manager;
inhibitor->mode = INHIBIT_IDLE_APPLICATION;
- inhibitor->view = view_from_wlr_surface(wlr_inhibitor->surface);
+ inhibitor->wlr_inhibitor = wlr_inhibitor;
wl_list_insert(&manager->inhibitors, &inhibitor->link);
inhibitor->destroy.notify = handle_destroy;
@@ -104,10 +104,10 @@ void sway_idle_inhibit_v1_user_inhibitor_destroy(
bool sway_idle_inhibit_v1_is_active(struct sway_idle_inhibitor_v1 *inhibitor) {
switch (inhibitor->mode) {
- case INHIBIT_IDLE_APPLICATION:
+ case INHIBIT_IDLE_APPLICATION:;
// If there is no view associated with the inhibitor, assume visible
- return !inhibitor->view || !inhibitor->view->container ||
- view_is_visible(inhibitor->view);
+ struct sway_view *view = view_from_wlr_surface(inhibitor->wlr_inhibitor->surface);
+ return !view || !view->container || view_is_visible(view);
case INHIBIT_IDLE_FOCUS:;
struct sway_seat *seat = NULL;
wl_list_for_each(seat, &server.input->seats, link) {