[PATCH weston v4 2/3] compositor: Implement idle inhibition
Bryce Harrington
bryce at osg.samsung.com
Tue Aug 16 02:15:54 UTC 2016
On Mon, Aug 15, 2016 at 07:01:24PM -0500, Derek Foreman wrote:
> 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?
Yeah it now requires 1.7 so no need for this 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?
Yep, that's right.
> > +}
> > +
> > +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?
No, in that case the user would need to re-wake the screen and let it
re-idle; the inhibition would take effect at that point.
Bryce
> 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