mirror of
https://github.com/swaywm/sway.git
synced 2026-04-25 06:46:24 -04:00
idle_inhibit: Always listen for view_unmap
For wlr_idle_inhibit, we'd listen to inhibitor destroy, whereas for manual idle inhibition, we'd listen for view unmap. If a view associated with a wlr_idle_inhibit inhibitor was destroyed, we could possibly end up with a dangling view pointer. Always listen to view unmap to ensure we clean up properly.
This commit is contained in:
parent
adf7a6f892
commit
21e33f979b
2 changed files with 19 additions and 3 deletions
|
|
@ -27,6 +27,7 @@ struct sway_idle_inhibitor_v1 {
|
||||||
|
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
|
struct wl_listener view_unmap;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool sway_idle_inhibit_v1_is_active(
|
bool sway_idle_inhibit_v1_is_active(
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,21 @@
|
||||||
static void destroy_inhibitor(struct sway_idle_inhibitor_v1 *inhibitor) {
|
static void destroy_inhibitor(struct sway_idle_inhibitor_v1 *inhibitor) {
|
||||||
wl_list_remove(&inhibitor->link);
|
wl_list_remove(&inhibitor->link);
|
||||||
wl_list_remove(&inhibitor->destroy.link);
|
wl_list_remove(&inhibitor->destroy.link);
|
||||||
|
wl_list_remove(&inhibitor->view_unmap.link);
|
||||||
sway_idle_inhibit_v1_check_active(inhibitor->manager);
|
sway_idle_inhibit_v1_check_active(inhibitor->manager);
|
||||||
free(inhibitor);
|
free(inhibitor);
|
||||||
|
sway_log(SWAY_DEBUG, "Sway idle inhibitor destroyed");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_view_unmap(struct wl_listener *listener, void *data) {
|
||||||
|
struct sway_idle_inhibitor_v1 *inhibitor =
|
||||||
|
wl_container_of(listener, inhibitor, view_unmap);
|
||||||
|
destroy_inhibitor(inhibitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_destroy(struct wl_listener *listener, void *data) {
|
static void handle_destroy(struct wl_listener *listener, void *data) {
|
||||||
struct sway_idle_inhibitor_v1 *inhibitor =
|
struct sway_idle_inhibitor_v1 *inhibitor =
|
||||||
wl_container_of(listener, inhibitor, destroy);
|
wl_container_of(listener, inhibitor, destroy);
|
||||||
sway_log(SWAY_DEBUG, "Sway idle inhibitor destroyed");
|
|
||||||
destroy_inhibitor(inhibitor);
|
destroy_inhibitor(inhibitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,6 +46,13 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) {
|
||||||
inhibitor->view = view_from_wlr_surface(wlr_inhibitor->surface);
|
inhibitor->view = view_from_wlr_surface(wlr_inhibitor->surface);
|
||||||
wl_list_insert(&manager->inhibitors, &inhibitor->link);
|
wl_list_insert(&manager->inhibitors, &inhibitor->link);
|
||||||
|
|
||||||
|
if (inhibitor->view) {
|
||||||
|
inhibitor->view_unmap.notify = handle_view_unmap;
|
||||||
|
wl_signal_add(&inhibitor->view->events.unmap, &inhibitor->view_unmap);
|
||||||
|
} else {
|
||||||
|
wl_list_init(&inhibitor->view_unmap.link);
|
||||||
|
}
|
||||||
|
|
||||||
inhibitor->destroy.notify = handle_destroy;
|
inhibitor->destroy.notify = handle_destroy;
|
||||||
wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy);
|
wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy);
|
||||||
|
|
||||||
|
|
@ -58,8 +72,9 @@ void sway_idle_inhibit_v1_user_inhibitor_register(struct sway_view *view,
|
||||||
inhibitor->view = view;
|
inhibitor->view = view;
|
||||||
wl_list_insert(&inhibitor->manager->inhibitors, &inhibitor->link);
|
wl_list_insert(&inhibitor->manager->inhibitors, &inhibitor->link);
|
||||||
|
|
||||||
inhibitor->destroy.notify = handle_destroy;
|
inhibitor->view_unmap.notify = handle_view_unmap;
|
||||||
wl_signal_add(&view->events.unmap, &inhibitor->destroy);
|
wl_signal_add(&view->events.unmap, &inhibitor->view_unmap);
|
||||||
|
wl_list_init(&inhibitor->destroy.link);
|
||||||
|
|
||||||
sway_idle_inhibit_v1_check_active(inhibitor->manager);
|
sway_idle_inhibit_v1_check_active(inhibitor->manager);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue