[PATCH weston] compositor-x11: Move the x11 event handler to the display loop
ppaalanen at gmail.com
Fri Dec 19 04:40:47 PST 2014
On Fri, 12 Dec 2014 14:29:42 -0600
Derek Foreman <derekf at osg.samsung.com> wrote:
> I just noticed that the follow patch *exactly* undoes commit 22ba60e
> Is there any other reason that commit was necessary, or was it intended
> to be cosmetic?
No, I don't think it was meant to be cosmetic.
There is some fancy input scheduling going on with the repaint loop, so
that input events would be sent as a burst to the clients when the
compositor is spinning in the repaint loop. The idea is that because
clients repaint only once per cycle, they don't need to be woken up due
to input any more often than that. Or that's how I understood it.
The problem here, I assume, is that the X11 fd is not only input, but
also output events, unlike DRM backend where the DRM fd is separate.
I would be inclined to just take this patch, because it fixes a bug and
the x11 backend is of lesser quality anyway.
But, I also wonder, if reading the evdev fds in DRM backend only once
per cycle could cause the kernel input buffers to overflow in some cases
(gaming mice?), leading to lost input events?
> On 12/12/14 02:12 PM, Derek Foreman wrote:
> > While it conceptually makes sense to put the x11 event handler
> > in the compositor "input" loop, the input loop is actually
> > dispatched in the middle of the frame repaint. When the
> > X11 event results in closing the compositor, this can cause
> > the current output to be destroyed just prior to trying to
> > process animations on it.
> > Closes bug: https://bugs.freedesktop.org/show_bug.cgi?id=81314
> > Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> > ---
> > src/compositor-x11.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> > diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> > index a760f33..cf39ad7 100644
> > --- a/src/compositor-x11.c
> > +++ b/src/compositor-x11.c
> > @@ -1455,6 +1455,7 @@ x11_compositor_create(struct wl_display *display,
> > struct x11_compositor *c;
> > struct x11_output *output;
> > struct weston_config_section *section;
> > + struct wl_event_loop *loop;
> > xcb_screen_iterator_t s;
> > int i, x = 0, output_count = 0;
> > int width, height, scale, count;
> > @@ -1580,8 +1581,9 @@ x11_compositor_create(struct wl_display *display,
> > x = pixman_region32_extents(&output->base.region)->x2;
> > }
> > + loop = wl_display_get_event_loop(c->base.wl_display);
> > c->xcb_source =
> > - wl_event_loop_add_fd(c->base.input_loop,
> > + wl_event_loop_add_fd(loop,
> > xcb_get_file_descriptor(c->conn),
> > WL_EVENT_READABLE,
> > x11_compositor_handle_event, c);
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
More information about the wayland-devel