[gtk: 1/3] gdk/wayland: Add an API to inhibit and uninhibit idle



commit 74a4432688bd33a203849c696a37d40bf0fd9aaf
Author: Emmanuel Gil Peyrot <linkmauve linkmauve fr>
Date:   Tue Jul 14 21:18:03 2020 +0200

    gdk/wayland: Add an API to inhibit and uninhibit idle
    
    This uses the idle-inhibit protocol from wayland-protocols, to attach an
    inhibitor to the GdkSurface.  The inhibit function can be called as many
    times as the user wants, but the uninhibit function MUST be called as
    many times to unset the idle inhibition.
    
    This has been tested on Sway.

 gdk/wayland/gdkdisplay-wayland.c |  6 ++++++
 gdk/wayland/gdkdisplay-wayland.h |  2 ++
 gdk/wayland/gdksurface-wayland.c | 36 ++++++++++++++++++++++++++++++++++++
 gdk/wayland/gdkwaylandsurface.h  |  3 +++
 gdk/wayland/meson.build          |  1 +
 5 files changed, 48 insertions(+)
---
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index af30f9cfc2..45f937dfab 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -544,6 +544,12 @@ gdk_registry_handle_global (void               *data,
       gdk_wayland_display_init_xdg_output (display_wayland);
       _gdk_wayland_display_async_roundtrip (display_wayland);
     }
+  else if (strcmp(interface, "zwp_idle_inhibit_manager_v1") == 0)
+    {
+      display_wayland->idle_inhibit_manager =
+        wl_registry_bind (display_wayland->wl_registry, id,
+                          &zwp_idle_inhibit_manager_v1_interface, 1);
+    }
 
   g_hash_table_insert (display_wayland->known_globals,
                        GUINT_TO_POINTER (id), g_strdup (interface));
diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h
index 5ace0f2744..db5e6a4fb3 100644
--- a/gdk/wayland/gdkdisplay-wayland.h
+++ b/gdk/wayland/gdkdisplay-wayland.h
@@ -35,6 +35,7 @@
 #include <gdk/wayland/keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h>
 #include <gdk/wayland/server-decoration-client-protocol.h>
 #include <gdk/wayland/xdg-output-unstable-v1-client-protocol.h>
+#include <gdk/wayland/idle-inhibit-unstable-v1-client-protocol.h>
 
 #include <glib.h>
 #include <gdk/gdkkeys.h>
@@ -109,6 +110,7 @@ struct _GdkWaylandDisplay
   struct zwp_keyboard_shortcuts_inhibit_manager_v1 *keyboard_shortcuts_inhibit;
   struct org_kde_kwin_server_decoration_manager *server_decoration_manager;
   struct zxdg_output_manager_v1 *xdg_output_manager;
+  struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager;
 
   GList *async_roundtrips;
 
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index ef3f277664..46fec90c8e 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -191,6 +191,9 @@ struct _GdkWaylandSurface
 
   struct zxdg_imported_v1 *imported_transient_for;
   GHashTable *shortcuts_inhibitors;
+
+  struct zwp_idle_inhibitor_v1 *idle_inhibitor;
+  size_t idle_inhibitor_refcount;
 };
 
 struct _GdkWaylandSurfaceClass
@@ -1984,6 +1987,39 @@ gdk_wayland_surface_announce_csd (GdkSurface *surface)
                                                 ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_CLIENT);
 }
 
+gboolean
+gdk_wayland_surface_inhibit_idle (GdkSurface *surface)
+{
+  GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_surface_get_display (surface));
+  GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
+
+  if (!display_wayland->idle_inhibit_manager)
+    return false;
+  if (!impl->idle_inhibitor)
+    {
+      g_assert (impl->idle_inhibitor_refcount == 0);
+      impl->idle_inhibitor =
+        zwp_idle_inhibit_manager_v1_create_inhibitor (display_wayland->idle_inhibit_manager,
+                                                     impl->display_server.wl_surface);
+    }
+  ++impl->idle_inhibitor_refcount;
+  return true;
+}
+
+void
+gdk_wayland_surface_uninhibit_idle (GdkSurface *surface)
+{
+  GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
+
+  g_assert (impl->idle_inhibitor && impl->idle_inhibitor_refcount > 0);
+
+  if (--impl->idle_inhibitor_refcount == 0)
+    {
+      zwp_idle_inhibitor_v1_destroy (impl->idle_inhibitor);
+      impl->idle_inhibitor = NULL;
+    }
+}
+
 static void
 calculate_popup_rect (GdkSurface     *surface,
                       GdkPopupLayout *layout,
diff --git a/gdk/wayland/gdkwaylandsurface.h b/gdk/wayland/gdkwaylandsurface.h
index 4af358c33e..54e0c6ff49 100644
--- a/gdk/wayland/gdkwaylandsurface.h
+++ b/gdk/wayland/gdkwaylandsurface.h
@@ -80,6 +80,9 @@ void                     gdk_wayland_surface_set_application_id (GdkSurface *sur
 
 void gdk_wayland_surface_announce_csd                        (GdkSurface *surface);
 
+gboolean gdk_wayland_surface_inhibit_idle                    (GdkSurface *surface);
+void gdk_wayland_surface_uninhibit_idle                      (GdkSurface *surface);
+
 G_END_DECLS
 
 #endif /* __GDK_WAYLAND_SURFACE_H__ */
diff --git a/gdk/wayland/meson.build b/gdk/wayland/meson.build
index 14267f4ccc..67ebb63da5 100644
--- a/gdk/wayland/meson.build
+++ b/gdk/wayland/meson.build
@@ -54,6 +54,7 @@ proto_sources = [
   ['keyboard-shortcuts-inhibit', 'unstable', 'v1', ],
   ['server-decoration', 'private' ],
   ['xdg-output', 'unstable', 'v1', ],
+  ['idle-inhibit', 'unstable', 'v1', ],
 ]
 
 gdk_wayland_gen_headers = []


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]