On Mon, May 07, 2012 at 04:05:27PM -0400, Kristian Høgsberg wrote: > On Tue, May 01, 2012 at 08:37:10PM +0100, Daniel Stone wrote: > > Add an xkb_names member to the base compositor info which contains the > > RMLVO to use when building an XKB keymap. Add support for filling this > > from the config file or from the underlying X11 server, with the usual > > defaults. > > I think we want to do this in the other direction. The X server > shouldn't tell wayland which keymap to load (except if we're doing > rootless wayland under X). We can add an event to the xserver wayland > protocol to let the compositor push the xkb info into the X server > when running under wayland.
Oh, I'm sorry, I see what's going on, we're getting the keymap from the X server in case of weston-on-X11. All applied. Kristian > The config file keys look good, though I'd drop the keymap_ prefix > since they're already under the keyboard section. > > Kristian > > > Signed-off-by: Daniel Stone <[email protected]> > > --- > > src/compositor-x11.c | 41 +++++++++++++++++++++++++++++++++++++++++ > > src/compositor.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > > src/compositor.h | 5 +++++ > > 3 files changed, 89 insertions(+) > > > > diff --git a/src/compositor-x11.c b/src/compositor-x11.c > > index 01194a8..1ca3a4b 100644 > > --- a/src/compositor-x11.c > > +++ b/src/compositor-x11.c > > @@ -69,6 +69,7 @@ struct x11_compositor { > > xcb_atom_t string; > > xcb_atom_t utf8_string; > > xcb_atom_t cardinal; > > + xcb_atom_t xkb_names; > > } atom; > > }; > > > > @@ -713,6 +714,43 @@ x11_compositor_handle_event(int fd, uint32_t mask, > > void *data) > > return event != NULL; > > } > > > > +static void > > +x11_compositor_get_keymap(struct x11_compositor *c) > > +{ > > + xcb_get_property_cookie_t cookie; > > + xcb_get_property_reply_t *reply; > > + xcb_generic_error_t *error; > > + const char *value_all, *value_part; > > + int length_all, length_part; > > + > > + cookie = xcb_get_property(c->conn, 0, c->screen->root, > > + c->atom.xkb_names, c->atom.string, 0, 1024); > > + reply = xcb_get_property_reply(c->conn, cookie, &error); > > + if (reply == NULL) > > + return; > > + > > + value_all = xcb_get_property_value(reply); > > + length_all = xcb_get_property_value_length(reply); > > + value_part = value_all; > > + > > +#define copy_prop_value(to) \ > > + length_part = strlen(value_part); \ > > + if (value_part + length_part > (value_all + length_all) && \ > > + length_part > 0 && c->base.xkb_info.names.to == NULL) { \ > > + free(c->base.xkb_info.names.to); \ > > + c->base.xkb_info.names.to = strdup(value_part); \ > > + } \ > > + value_part += length_part + 1; > > + > > + copy_prop_value(rules); > > + copy_prop_value(model); > > + copy_prop_value(layout); > > + copy_prop_value(variant); > > + copy_prop_value(options); > > + > > +#undef copy_prop_value > > +} > > + > > #define F(field) offsetof(struct x11_compositor, field) > > > > static void > > @@ -731,6 +769,7 @@ x11_compositor_get_resources(struct x11_compositor *c) > > { "STRING", F(atom.string) }, > > { "UTF8_STRING", F(atom.utf8_string) }, > > { "CARDINAL", F(atom.cardinal) }, > > + { "_XKB_RULES_NAMES", F(atom.xkb_names) }, > > }; > > > > xcb_intern_atom_cookie_t cookies[ARRAY_LENGTH(atoms)]; > > @@ -762,6 +801,8 @@ x11_compositor_get_resources(struct x11_compositor *c) > > pixmap, pixmap, 0, 0, 0, 0, 0, 0, 1, 1); > > xcb_free_gc(c->conn, gc); > > xcb_free_pixmap(c->conn, pixmap); > > + > > + x11_compositor_get_keymap(c); > > } > > > > static void > > diff --git a/src/compositor.c b/src/compositor.c > > index 1646905..a7e62a6 100644 > > --- a/src/compositor.c > > +++ b/src/compositor.c > > @@ -2561,6 +2561,29 @@ weston_compositor_shutdown(struct weston_compositor > > *ec) > > wl_event_loop_destroy(ec->input_loop); > > } > > > > +static int weston_compositor_xkb_init(struct weston_compositor *ec, > > + struct xkb_rule_names *names) > > +{ > > + ec->xkb_info.names = *names; > > + if (!ec->xkb_info.names.rules) > > + ec->xkb_info.names.rules = strdup("evdev"); > > + if (!ec->xkb_info.names.model) > > + ec->xkb_info.names.model = strdup("pc105"); > > + if (!ec->xkb_info.names.layout) > > + ec->xkb_info.names.layout = strdup("us"); > > + > > + return 0; > > +} > > + > > +static void weston_compositor_xkb_destroy(struct weston_compositor *ec) > > +{ > > + free(ec->xkb_info.names.rules); > > + free(ec->xkb_info.names.model); > > + free(ec->xkb_info.names.layout); > > + free(ec->xkb_info.names.variant); > > + free(ec->xkb_info.names.options); > > +} > > + > > static int on_term_signal(int signal_number, void *data) > > { > > struct wl_display *display = data; > > @@ -2642,14 +2665,25 @@ int main(int argc, char *argv[]) > > int32_t xserver = 0; > > char *socket_name = NULL; > > char *config_file; > > + struct xkb_rule_names xkb_names; > > > > const struct config_key shell_config_keys[] = { > > { "type", CONFIG_KEY_STRING, &shell }, > > }; > > > > + const struct config_key keyboard_config_keys[] = { > > + { "keymap_rules", CONFIG_KEY_STRING, &xkb_names.rules }, > > + { "keymap_model", CONFIG_KEY_STRING, &xkb_names.model }, > > + { "keymap_layout", CONFIG_KEY_STRING, &xkb_names.layout }, > > + { "keymap_variant", CONFIG_KEY_STRING, &xkb_names.variant }, > > + { "keymap_options", CONFIG_KEY_STRING, &xkb_names.options }, > > + }; > > + > > const struct config_section cs[] = { > > { "shell", > > shell_config_keys, ARRAY_LENGTH(shell_config_keys) }, > > + { "keyboard", > > + keyboard_config_keys, ARRAY_LENGTH(keyboard_config_keys) > > }, > > }; > > > > const struct weston_option core_options[] = { > > @@ -2660,6 +2694,8 @@ int main(int argc, char *argv[]) > > { WESTON_OPTION_STRING, "module", 0, &module }, > > }; > > > > + memset(&xkb_names, 0, sizeof(xkb_names)); > > + > > argc = parse_options(core_options, > > ARRAY_LENGTH(core_options), argc, argv); > > > > @@ -2712,6 +2748,11 @@ int main(int argc, char *argv[]) > > if (argv[1]) > > exit(EXIT_FAILURE); > > > > + if (weston_compositor_xkb_init(ec, &xkb_names) == -1) { > > + fprintf(stderr, "failed to initialise keyboard support\n"); > > + exit(EXIT_FAILURE); > > + } > > + > > ec->option_idle_time = idle_time; > > ec->idle_time = idle_time; > > > > @@ -2757,6 +2798,8 @@ int main(int argc, char *argv[]) > > for (i = ARRAY_LENGTH(signals); i;) > > wl_event_source_remove(signals[--i]); > > > > + weston_compositor_xkb_destroy(ec); > > + > > ec->destroy(ec); > > wl_display_destroy(display); > > > > diff --git a/src/compositor.h b/src/compositor.h > > index a548f18..0b73575 100644 > > --- a/src/compositor.h > > +++ b/src/compositor.h > > @@ -25,6 +25,7 @@ > > #define _WAYLAND_SYSTEM_COMPOSITOR_H_ > > > > #include <pixman.h> > > +#include <xkbcommon/xkbcommon.h> > > #include <wayland-server.h> > > > > #include <GLES2/gl2.h> > > @@ -265,6 +266,10 @@ struct weston_compositor { > > int launcher_sock; > > > > uint32_t output_id_pool; > > + > > + struct { > > + struct xkb_rule_names names; > > + } xkb_info; > > }; > > > > #define MODIFIER_CTRL (1 << 8) > > -- > > 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
