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 <[email protected]>
> ---
>  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
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to