[PATCH weston 4/9] compositor-wayland: Delay seat creation
Daniel Stone
daniel at fooishbar.org
Fri Jun 1 04:14:01 PDT 2012
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.
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
More information about the wayland-devel
mailing list