From 6ccfa7a80b284b93509e131acdbc7edc23bdf257 Mon Sep 17 00:00:00 2001
From: Kenny Levinsen <kl@kl.wtf>
Date: Thu, 23 May 2024 15:01:46 +0200
Subject: [PATCH] idle_inhibit: Explicitly handle layer surfaces

Layer surfaces do not have a view, and while they can be occluded they
are always visible on their associated output - assuming it is enabled.
---
 sway/desktop/idle_inhibit_v1.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/sway/desktop/idle_inhibit_v1.c b/sway/desktop/idle_inhibit_v1.c
index d241cdaf4..0fc79989a 100644
--- a/sway/desktop/idle_inhibit_v1.c
+++ b/sway/desktop/idle_inhibit_v1.c
@@ -119,8 +119,15 @@ bool sway_idle_inhibit_v1_is_active(struct sway_idle_inhibitor_v1 *inhibitor) {
 
 	switch (inhibitor->mode) {
 	case INHIBIT_IDLE_APPLICATION:;
+		struct wlr_surface *wlr_surface = inhibitor->wlr_inhibitor->surface;
+		if (wlr_layer_surface_v1_try_from_wlr_surface(wlr_surface)) {
+			// Layer surfaces can be occluded but are always on screen after
+			// they have been mapped.
+			return wlr_surface->mapped;
+		}
+
 		// If there is no view associated with the inhibitor, assume visible
-		struct sway_view *view = view_from_wlr_surface(inhibitor->wlr_inhibitor->surface);
+		struct sway_view *view = view_from_wlr_surface(wlr_surface);
 		return !view || !view->container || view_is_visible(view);
 	case INHIBIT_IDLE_FOCUS:;
 		struct sway_seat *seat = NULL;