compositor: Add public interface support for client-requested idle inhibition
authorBryce Harrington <bryce@osg.samsung.com>
Thu, 11 Aug 2016 00:25:23 +0000 (17:25 -0700)
committerBryce Harrington <bryce@osg.samsung.com>
Tue, 30 Aug 2016 01:36:13 +0000 (18:36 -0700)
Signed-off-by: Bryce Harrington <bryce@osg.samsung.com>
v5: Improve comments

Makefile.am
libweston/compositor.c
libweston/compositor.h

index 1e63a58..6241fa0 100644 (file)
@@ -176,7 +176,9 @@ nodist_libweston_@LIBWESTON_MAJOR@_la_SOURCES =                             \
        protocol/relative-pointer-unstable-v1-protocol.c                \
        protocol/relative-pointer-unstable-v1-server-protocol.h         \
        protocol/pointer-constraints-unstable-v1-protocol.c             \
-       protocol/pointer-constraints-unstable-v1-server-protocol.h
+       protocol/pointer-constraints-unstable-v1-server-protocol.h      \
+       protocol/idle-inhibit-unstable-v1-protocol.c    \
+       protocol/idle-inhibit-unstable-v1-server-protocol.h
 
 BUILT_SOURCES += $(nodist_libweston_@LIBWESTON_MAJOR@_la_SOURCES)
 
index 7f92288..92f74aa 100644 (file)
@@ -51,6 +51,8 @@
 #include <time.h>
 #include <errno.h>
 
+#include <idle-inhibit-unstable-v1-server-protocol.h>
+
 #include "timeline.h"
 
 #include "compositor.h"
@@ -4723,6 +4725,88 @@ compositor_bind(struct wl_client *client,
                                       compositor, NULL);
 }
 
+struct weston_idle_inhibitor {
+       struct weston_surface *surface;
+};
+
+static void
+destroy_idle_inhibitor(struct wl_resource *resource)
+{
+       struct weston_idle_inhibitor *inhibitor = wl_resource_get_user_data(resource);
+
+       inhibitor->surface = NULL;
+       free(inhibitor);
+}
+
+static void
+idle_inhibitor_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+       struct weston_idle_inhibitor *inhibitor = wl_resource_get_user_data(resource);
+
+       assert(inhibitor);
+
+       inhibitor->surface->inhibit_idling = false;
+}
+
+static const struct zwp_idle_inhibitor_v1_interface idle_inhibitor_interface = {
+       idle_inhibitor_destroy
+};
+
+static void
+idle_inhibit_manager_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+}
+
+static void
+idle_inhibit_manager_create_inhibitor(struct wl_client *client, struct wl_resource *resource,
+                                     uint32_t id, struct wl_resource *surface_resource)
+{
+       struct weston_surface *surface = wl_resource_get_user_data(surface_resource);
+       struct weston_idle_inhibitor *inhibitor;
+       struct wl_resource *cr;
+
+       cr = wl_resource_create(client, &zwp_idle_inhibitor_v1_interface,
+                               wl_resource_get_version(resource), id);
+       if (cr == NULL) {
+               wl_client_post_no_memory(client);
+               return;
+       }
+
+       inhibitor = zalloc(sizeof *inhibitor);
+       if (inhibitor == NULL) {
+               wl_client_post_no_memory(client);
+               return;
+       }
+
+       inhibitor->surface = surface;
+       inhibitor->surface->inhibit_idling = true;
+
+       wl_resource_set_implementation(cr, &idle_inhibitor_interface,
+                                      inhibitor, destroy_idle_inhibitor);
+}
+
+static const struct zwp_idle_inhibit_manager_v1_interface idle_inhibit_manager_interface = {
+       idle_inhibit_manager_destroy,
+       idle_inhibit_manager_create_inhibitor
+};
+
+static void
+bind_idle_inhibit_manager(struct wl_client *client,
+                         void *data, uint32_t version, uint32_t id)
+{
+       struct wl_resource *resource;
+
+       resource = wl_resource_create(client, &zwp_idle_inhibit_manager_v1_interface,
+                                     version, id);
+       if (resource == NULL) {
+               wl_client_post_no_memory(client);
+               return;
+       }
+
+       wl_resource_set_implementation(resource, &idle_inhibit_manager_interface,
+                                      NULL, NULL);
+}
+
 WL_EXPORT int
 weston_environment_get_fd(const char *env)
 {
@@ -4818,6 +4902,10 @@ weston_compositor_create(struct wl_display *display, void *user_data)
        if (weston_input_init(ec) != 0)
                goto fail;
 
+       if (!wl_global_create(ec->wl_display, &zwp_idle_inhibit_manager_v1_interface, 1,
+                             ec, bind_idle_inhibit_manager))
+               goto fail;
+
        wl_list_init(&ec->view_list);
        wl_list_init(&ec->plane_list);
        wl_list_init(&ec->layer_list);
index 7a53127..673a4e8 100644 (file)
@@ -618,8 +618,9 @@ enum {
        WESTON_COMPOSITOR_ACTIVE,       /* normal rendering and events */
        WESTON_COMPOSITOR_IDLE,         /* shell->unlock called on activity */
        WESTON_COMPOSITOR_OFFSCREEN,    /* no rendering, no frame events */
-       WESTON_COMPOSITOR_SLEEPING      /* same as offscreen, but also set dpms
-                                         * to off */
+       WESTON_COMPOSITOR_SLEEPING      /* same as offscreen, but also
+                                        * attempt to set dpms to off where
+                                        * applicable */
 };
 
 struct weston_layer_entry {
@@ -1158,8 +1159,7 @@ struct weston_surface {
 
        /*
         * Indicates the surface prefers no screenblanking, screensaving,
-        * or other automatic obscurement to kick in while the surface is
-        * considered "active" by the shell.
+        * or other automatic obscurement to kick in.
         */
        bool inhibit_idling;