On Wed, May 30, 2012 at 04:32:08PM +0100, Daniel Stone wrote: > This function gets called after backend_init, so compositors can add > their input devices slightly later on in the process. This gives us a > chance to set the default XKB rulesets, in particular.
I don't like input_init. The startup sequence is already getting quirky and I don't want another callback in there. We can set up the default XKB map in weston_compositor_init() and avoid this. Or maybe the xkb rules in weston.ini should be a compositor-drm only thing. Other backends get it from their host, and compositor-drm can read it from weston.ini. Kristian > Signed-off-by: Daniel Stone <[email protected]> > --- > src/compositor-drm.c | 18 ++++++++++++++++-- > src/compositor-wayland.c | 10 ++++------ > src/compositor-x11.c | 9 ++++----- > src/compositor.c | 16 ++++++++-------- > src/compositor.h | 1 + > 5 files changed, 33 insertions(+), 21 deletions(-) > > diff --git a/src/compositor-drm.c b/src/compositor-drm.c > index 98e8b07..b0376d7 100644 > --- a/src/compositor-drm.c > +++ b/src/compositor-drm.c > @@ -62,6 +62,8 @@ struct drm_compositor { > uint32_t connector_allocator; > struct tty *tty; > > + char *seat; > + > struct gbm_surface *dummy_surface; > EGLSurface dummy_egl_surface; > > @@ -1638,6 +1640,8 @@ drm_destroy(struct weston_compositor *ec) > fprintf(stderr, "failed to drop master: %m\n"); > tty_destroy(d->tty); > > + free(ec->seat); > + > free(d); > } > > @@ -1734,6 +1738,16 @@ switch_vt_binding(struct wl_seat *seat, uint32_t time, > uint32_t key, void *data) > tty_activate_vt(ec->tty, key - KEY_F1 + 1); > } > > +static int > +drm_input_init(struct weston_compositor *compositor) > +{ > + struct drm_compositor *ec = (struct drm_compositor *) compositor; > + > + evdev_input_create(&ec->base, ec->udev, ec->seat); > + > + return 0; > +} > + > static const char default_seat[] = "seat0"; > > static struct weston_compositor * > @@ -1786,6 +1800,7 @@ drm_compositor_create(struct wl_display *display, > } > udev_device_unref(device); > } > + ec->seat = strdup(seat); > > if (drm_device == NULL) { > fprintf(stderr, "no drm device found\n"); > @@ -1797,6 +1812,7 @@ drm_compositor_create(struct wl_display *display, > return NULL; > } > > + ec->base.input_init = drm_input_init; > ec->base.destroy = drm_destroy; > > ec->base.focus = 1; > @@ -1824,8 +1840,6 @@ drm_compositor_create(struct wl_display *display, > udev_enumerate_unref(e); > path = NULL; > > - evdev_input_create(&ec->base, ec->udev, seat); > - > loop = wl_display_get_event_loop(ec->base.wl_display); > ec->drm_source = > wl_event_loop_add_fd(loop, ec->drm.fd, > diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c > index 60fb9d9..4b4f1eb 100644 > --- a/src/compositor-wayland.c > +++ b/src/compositor-wayland.c > @@ -245,7 +245,7 @@ create_border(struct wayland_compositor *c) > } > > static int > -wayland_input_create(struct wayland_compositor *c) > +wayland_input_init(struct weston_compositor *ec) > { > struct weston_seat *seat; > > @@ -254,9 +254,9 @@ wayland_input_create(struct wayland_compositor *c) > return -1; > > memset(seat, 0, sizeof *seat); > - weston_seat_init(seat, &c->base); > + weston_seat_init(seat, ec); > > - c->base.seat = seat; > + ec->seat = seat; > > return 0; > } > @@ -766,6 +766,7 @@ wayland_compositor_create(struct wl_display *display, > if (wayland_compositor_init_egl(c) < 0) > return NULL; > > + c->base.input_init = wayland_input_init; > c->base.destroy = wayland_destroy; > > /* Can't init base class until we have a current egl context */ > @@ -776,9 +777,6 @@ wayland_compositor_create(struct wl_display *display, > if (wayland_compositor_create_output(c, width, height) < 0) > return NULL; > > - if (wayland_input_create(c) < 0) > - return NULL; > - > loop = wl_display_get_event_loop(c->base.wl_display); > > fd = wl_display_get_fd(c->parent.display, update_event_mask, c); > diff --git a/src/compositor-x11.c b/src/compositor-x11.c > index b314a1d..b137ac8 100644 > --- a/src/compositor-x11.c > +++ b/src/compositor-x11.c > @@ -129,8 +129,9 @@ x11_compositor_get_keymap(struct x11_compositor *c) > } > > static int > -x11_input_create(struct x11_compositor *c) > +x11_input_init(struct weston_compositor *ec) > { > + struct x11_compositor *c = (struct x11_compositor *) ec; > struct x11_input *input; > struct xkb_keymap *keymap; > > @@ -139,7 +140,7 @@ x11_input_create(struct x11_compositor *c) > return -1; > > memset(input, 0, sizeof *input); > - weston_seat_init(&input->base, &c->base); > + weston_seat_init(&input->base, ec); > weston_seat_init_pointer(&input->base); > > keymap = x11_compositor_get_keymap(c); > @@ -875,6 +876,7 @@ x11_compositor_create(struct wl_display *display, > if (x11_compositor_init_egl(c) < 0) > return NULL; > > + c->base.input_init = x11_input_init; > c->base.destroy = x11_destroy; > > /* Can't init base class until we have a current egl context */ > @@ -888,9 +890,6 @@ x11_compositor_create(struct wl_display *display, > x += width; > } > > - if (x11_input_create(c) < 0) > - return NULL; > - > c->xcb_source = > wl_event_loop_add_fd(c->base.input_loop, > xcb_get_file_descriptor(c->conn), > diff --git a/src/compositor.c b/src/compositor.c > index e65ea5a..70db411 100644 > --- a/src/compositor.c > +++ b/src/compositor.c > @@ -2229,12 +2229,10 @@ device_handle_new_drag_icon(struct wl_listener > *listener, void *data) > static void weston_compositor_xkb_init(struct weston_compositor *ec, > struct xkb_rule_names *names) > { > + ec->xkb_context = xkb_context_new(0); > if (ec->xkb_context == NULL) { > - ec->xkb_context = xkb_context_new(0); > - if (ec->xkb_context == NULL) { > - fprintf(stderr, "failed to create XKB context\n"); > - exit(1); > - } > + fprintf(stderr, "failed to create XKB context\n"); > + exit(1); > } > > if (names) > @@ -2289,9 +2287,6 @@ weston_compositor_build_global_keymap(struct > weston_compositor *ec) > if (ec->xkb_info.keymap != NULL) > return; > > - if (ec->xkb_names.rules == NULL) > - weston_compositor_xkb_init(ec, NULL); > - > ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_context, > &ec->xkb_names, > 0); > @@ -3089,6 +3084,11 @@ int main(int argc, char *argv[]) > > weston_compositor_xkb_init(ec, &xkb_names); > > + if (ec->input_init(ec) != 0) { > + fprintf(stderr, "failed to create input devices\n"); > + exit(EXIT_FAILURE); > + } > + > ec->option_idle_time = idle_time; > ec->idle_time = idle_time; > > diff --git a/src/compositor.h b/src/compositor.h > index 2df753f..8809f9d 100644 > --- a/src/compositor.h > +++ b/src/compositor.h > @@ -313,6 +313,7 @@ struct weston_compositor { > PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display; > int has_bind_display; > > + int (*input_init)(struct weston_compositor *ec); > void (*destroy)(struct weston_compositor *ec); > int (*authenticate)(struct weston_compositor *c, uint32_t id); > > -- > 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
