diff options
Diffstat (limited to 'sway/desktop/idle_inhibit_v1.c')
-rw-r--r-- | sway/desktop/idle_inhibit_v1.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/sway/desktop/idle_inhibit_v1.c b/sway/desktop/idle_inhibit_v1.c index a06e00d5..a9a8cb24 100644 --- a/sway/desktop/idle_inhibit_v1.c +++ b/sway/desktop/idle_inhibit_v1.c | |||
@@ -2,6 +2,7 @@ | |||
2 | #include <wlr/types/wlr_idle.h> | 2 | #include <wlr/types/wlr_idle.h> |
3 | #include "log.h" | 3 | #include "log.h" |
4 | #include "sway/desktop/idle_inhibit_v1.h" | 4 | #include "sway/desktop/idle_inhibit_v1.h" |
5 | #include "sway/tree/view.h" | ||
5 | #include "sway/server.h" | 6 | #include "sway/server.h" |
6 | 7 | ||
7 | 8 | ||
@@ -10,6 +11,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { | |||
10 | wl_container_of(listener, inhibitor, destroy); | 11 | wl_container_of(listener, inhibitor, destroy); |
11 | wlr_log(L_DEBUG, "Sway idle inhibitor destroyed"); | 12 | wlr_log(L_DEBUG, "Sway idle inhibitor destroyed"); |
12 | wlr_idle_set_enabled(inhibitor->server->idle, NULL, true); | 13 | wlr_idle_set_enabled(inhibitor->server->idle, NULL, true); |
14 | wl_list_remove(&inhibitor->link); | ||
13 | wl_list_remove(&inhibitor->destroy.link); | 15 | wl_list_remove(&inhibitor->destroy.link); |
14 | free(inhibitor); | 16 | free(inhibitor); |
15 | } | 17 | } |
@@ -27,9 +29,29 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) { | |||
27 | } | 29 | } |
28 | 30 | ||
29 | inhibitor->server = server; | 31 | inhibitor->server = server; |
32 | inhibitor->view = view_from_wlr_surface(wlr_inhibitor->surface); | ||
33 | wl_list_insert(&server->idle_inhibitors_v1, &inhibitor->link); | ||
34 | |||
30 | 35 | ||
31 | inhibitor->destroy.notify = handle_destroy; | 36 | inhibitor->destroy.notify = handle_destroy; |
32 | wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy); | 37 | wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy); |
33 | 38 | ||
34 | wlr_idle_set_enabled(server->idle, NULL, false); | 39 | wlr_idle_set_enabled(server->idle, NULL, false); |
35 | } | 40 | } |
41 | |||
42 | void idle_inhibit_v1_check_active(struct sway_server *server) { | ||
43 | struct sway_idle_inhibitor_v1 *inhibitor; | ||
44 | bool inhibited = false; | ||
45 | wl_list_for_each(inhibitor, &server->idle_inhibitors_v1, link) { | ||
46 | if (!inhibitor->view) { | ||
47 | /* Cannot guess if view is visible so assume it is */ | ||
48 | inhibited = true; | ||
49 | break; | ||
50 | } | ||
51 | if (view_is_visible(inhibitor->view)) { | ||
52 | inhibited = true; | ||
53 | break; | ||
54 | } | ||
55 | } | ||
56 | wlr_idle_set_enabled(server->idle, NULL, !inhibited); | ||
57 | } | ||