diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-07-23 20:27:56 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-07-23 20:31:11 -0400 |
commit | f4b882475eee7a81c206c7825616cc4656b2f60b (patch) | |
tree | 38e6ebf81b235424f105dcbcbb194e5e9eac70c0 /sway/desktop/idle_inhibit_v1.c | |
parent | Implement pid->workspace tracking (diff) | |
parent | Merge pull request #2342 from RyanDwyer/update-cursor (diff) | |
download | sway-f4b882475eee7a81c206c7825616cc4656b2f60b.tar.gz sway-f4b882475eee7a81c206c7825616cc4656b2f60b.tar.zst sway-f4b882475eee7a81c206c7825616cc4656b2f60b.zip |
Merge branch 'master' into pid-workspaces
Diffstat (limited to 'sway/desktop/idle_inhibit_v1.c')
-rw-r--r-- | sway/desktop/idle_inhibit_v1.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/sway/desktop/idle_inhibit_v1.c b/sway/desktop/idle_inhibit_v1.c new file mode 100644 index 00000000..da17d0f2 --- /dev/null +++ b/sway/desktop/idle_inhibit_v1.c | |||
@@ -0,0 +1,80 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include <wlr/types/wlr_idle.h> | ||
3 | #include "log.h" | ||
4 | #include "sway/desktop/idle_inhibit_v1.h" | ||
5 | #include "sway/tree/view.h" | ||
6 | #include "sway/server.h" | ||
7 | |||
8 | |||
9 | static void handle_destroy(struct wl_listener *listener, void *data) { | ||
10 | struct sway_idle_inhibitor_v1 *inhibitor = | ||
11 | wl_container_of(listener, inhibitor, destroy); | ||
12 | wlr_log(WLR_DEBUG, "Sway idle inhibitor destroyed"); | ||
13 | wl_list_remove(&inhibitor->link); | ||
14 | wl_list_remove(&inhibitor->destroy.link); | ||
15 | idle_inhibit_v1_check_active(inhibitor->manager); | ||
16 | free(inhibitor); | ||
17 | } | ||
18 | |||
19 | void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) { | ||
20 | struct wlr_idle_inhibitor_v1 *wlr_inhibitor = data; | ||
21 | struct sway_idle_inhibit_manager_v1 *manager = | ||
22 | wl_container_of(listener, manager, new_idle_inhibitor_v1); | ||
23 | wlr_log(WLR_DEBUG, "New sway idle inhibitor"); | ||
24 | |||
25 | struct sway_idle_inhibitor_v1 *inhibitor = | ||
26 | calloc(1, sizeof(struct sway_idle_inhibitor_v1)); | ||
27 | if (!inhibitor) { | ||
28 | return; | ||
29 | } | ||
30 | |||
31 | inhibitor->manager = manager; | ||
32 | inhibitor->view = view_from_wlr_surface(wlr_inhibitor->surface); | ||
33 | wl_list_insert(&manager->inhibitors, &inhibitor->link); | ||
34 | |||
35 | |||
36 | inhibitor->destroy.notify = handle_destroy; | ||
37 | wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy); | ||
38 | |||
39 | idle_inhibit_v1_check_active(manager); | ||
40 | } | ||
41 | |||
42 | void idle_inhibit_v1_check_active( | ||
43 | struct sway_idle_inhibit_manager_v1 *manager) { | ||
44 | struct sway_idle_inhibitor_v1 *inhibitor; | ||
45 | bool inhibited = false; | ||
46 | wl_list_for_each(inhibitor, &manager->inhibitors, link) { | ||
47 | if (!inhibitor->view) { | ||
48 | /* Cannot guess if view is visible so assume it is */ | ||
49 | inhibited = true; | ||
50 | break; | ||
51 | } | ||
52 | if (view_is_visible(inhibitor->view)) { | ||
53 | inhibited = true; | ||
54 | break; | ||
55 | } | ||
56 | } | ||
57 | wlr_idle_set_enabled(manager->idle, NULL, !inhibited); | ||
58 | } | ||
59 | |||
60 | struct sway_idle_inhibit_manager_v1 *sway_idle_inhibit_manager_v1_create( | ||
61 | struct wl_display *wl_display, struct wlr_idle *idle) { | ||
62 | struct sway_idle_inhibit_manager_v1 *manager = | ||
63 | calloc(1, sizeof(struct sway_idle_inhibit_manager_v1)); | ||
64 | if (!manager) { | ||
65 | return NULL; | ||
66 | } | ||
67 | |||
68 | manager->wlr_manager = wlr_idle_inhibit_v1_create(wl_display); | ||
69 | if (!manager->wlr_manager) { | ||
70 | free(manager); | ||
71 | return NULL; | ||
72 | } | ||
73 | manager->idle = idle; | ||
74 | wl_signal_add(&manager->wlr_manager->events.new_inhibitor, | ||
75 | &manager->new_idle_inhibitor_v1); | ||
76 | manager->new_idle_inhibitor_v1.notify = handle_idle_inhibitor_v1; | ||
77 | wl_list_init(&manager->inhibitors); | ||
78 | |||
79 | return manager; | ||
80 | } | ||