diff --git a/Makefile.am b/Makefile.am index 1e63a58c..6241fa04 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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) diff --git a/libweston/compositor.c b/libweston/compositor.c index 7f922884..92f74aaf 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -51,6 +51,8 @@ #include #include +#include + #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); diff --git a/libweston/compositor.h b/libweston/compositor.h index 7a531279..673a4e85 100644 --- a/libweston/compositor.h +++ b/libweston/compositor.h @@ -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;