[PATCH weston 4/9] compositor-wayland: Delay seat creation
Kristian Høgsberg
hoegsberg at gmail.com
Fri Jun 1 07:40:35 PDT 2012
On Fri, Jun 01, 2012 at 12:14:01PM +0100, Daniel Stone wrote:
> We'll get a rash of seats added when we run our first wl_display_iterate
> across the parent display, but won't actually be ready to create them.
> Create a new pending_seats array which holds the IDs of any seats we get
> during display initialisation, and then add them when we're ready.
Just handle the wl_seat globals in a separate global handler that you
add later.
Kristian
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> ---
> src/compositor-wayland.c | 60 ++++++++++++++++++++++++++++++----------------
> 1 file changed, 40 insertions(+), 20 deletions(-)
>
> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
> index 51163f7..61868af 100644
> --- a/src/compositor-wayland.c
> +++ b/src/compositor-wayland.c
> @@ -69,6 +69,8 @@ struct wayland_compositor {
> } border;
>
> struct wl_list input_list;
> + struct wl_array pending_seats;
> + int no_new_input;
> };
>
> struct wayland_output {
> @@ -245,23 +247,6 @@ create_border(struct wayland_compositor *c)
> }
>
> static int
> -wayland_input_create(struct wayland_compositor *c)
> -{
> - struct weston_seat *seat;
> -
> - seat = malloc(sizeof *seat);
> - if (seat == NULL)
> - return -1;
> -
> - memset(seat, 0, sizeof *seat);
> - weston_seat_init(seat, &c->base);
> -
> - c->base.seat = seat;
> -
> - return 0;
> -}
> -
> -static int
> wayland_compositor_init_egl(struct wayland_compositor *c)
> {
> EGLint major, minor;
> @@ -665,6 +650,13 @@ static void
> display_add_seat(struct wayland_compositor *c, uint32_t id)
> {
> struct wayland_input *input;
> + uint32_t *ptr;
> +
> + if (c->no_new_input) {
> + ptr = wl_array_add(&c->pending_seats, sizeof *ptr);
> + *ptr = id;
> + return;
> + }
>
> input = malloc(sizeof *input);
> if (input == NULL)
> @@ -727,9 +719,35 @@ wayland_compositor_handle_event(int fd, uint32_t mask, void *data)
> return 1;
> }
>
> +static int
> +wayland_input_create(struct wayland_compositor *c)
> +{
> + struct weston_seat *seat;
> + uint32_t *id;
> +
> + seat = malloc(sizeof *seat);
> + if (seat == NULL)
> + return -1;
> +
> + memset(seat, 0, sizeof *seat);
> + weston_seat_init(seat, &c->base);
> +
> + c->base.seat = seat;
> +
> + c->no_new_input = 0;
> +
> + wl_array_for_each(id, &c->pending_seats)
> + display_add_seat(c, *id);
> +
> + return 0;
> +}
> +
> static void
> wayland_destroy(struct weston_compositor *ec)
> {
> + struct wayland_compositor *c = (struct wayland_compositor *) ec;
> +
> + wl_array_release(&c->pending_seats);
> weston_compositor_shutdown(ec);
>
> free(ec);
> @@ -756,7 +774,9 @@ wayland_compositor_create(struct wl_display *display,
> return NULL;
> }
>
> + c->no_new_input = 1;
> wl_list_init(&c->input_list);
> + wl_array_init(&c->pending_seats);
> wl_display_add_global_listener(c->parent.display,
> display_handle_global, c);
>
> @@ -772,11 +792,11 @@ wayland_compositor_create(struct wl_display *display,
> if (weston_compositor_init(&c->base, display) < 0)
> return NULL;
>
> - create_border(c);
> - if (wayland_compositor_create_output(c, width, height) < 0)
> + if (wayland_input_create(c) < 0)
> return NULL;
>
> - if (wayland_input_create(c) < 0)
> + create_border(c);
> + if (wayland_compositor_create_output(c, width, height) < 0)
> return NULL;
>
> loop = wl_display_get_event_loop(c->base.wl_display);
> --
> 1.7.10
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list