[PATCH weston v4 2/3] compositor: Implement idle inhibition

Derek Foreman derekf at osg.samsung.com
Tue Aug 16 00:01:24 UTC 2016


On 10/08/16 07:25 PM, Bryce Harrington wrote:
> Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
> ---
>  Makefile.am            |  4 ++-
>  configure.ac           |  2 ++
>  libweston/compositor.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 93 insertions(+), 1 deletion(-)
> 
> diff --git a/Makefile.am b/Makefile.am
> index 32627f5..951f9ed 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -139,7 +139,9 @@ nodist_libweston_ at 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_ at LIBWESTON_MAJOR@_la_SOURCES)
>  
> diff --git a/configure.ac b/configure.ac
> index 74f931d..de26599 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -7,6 +7,8 @@ m4_define([libweston_major_version], [0])
>  m4_define([libweston_minor_version], [0])
>  m4_define([libweston_patch_version], [0])
>  
> +# Note: Inhibition patchset requires inhibition protocol in wayland-protocol
> +

That's landed in wayland-protocol now - can we just make sure we require
the right version of it instead of having a comment?

>  AC_PREREQ([2.64])
>  AC_INIT([weston],
>          [weston_version],
> diff --git a/libweston/compositor.c b/libweston/compositor.c
> index aa14504..e4ce273 100644
> --- a/libweston/compositor.c
> +++ b/libweston/compositor.c
> @@ -51,6 +51,8 @@
>  #include <time.h>
>  #include <errno.h>
>  
> +#include <idle-inhibit-unstable-v1-server-protocol.h>
> +
>  #include "timeline.h"
>  
>  #include "compositor.h"
> @@ -4665,6 +4667,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;

Is there some mechanism in place that causes a re-assessment of screen
blanker state when this happens?

ie) if I destroy my inhibition will the monitor the video player was on
immediately join the other monitors in sleep?

> +}
> +
> +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;

Will there be an immediate wake up of the monitor if it was already off now?

Thanks,
Derek

> +
> +	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)
>  {
> @@ -4760,6 +4844,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);
> 



More information about the wayland-devel mailing list