[PATCH 2/4] Add xkb_names member plus config + X11 support

Kristian Høgsberg hoegsberg at gmail.com
Mon May 7 13:10:27 PDT 2012


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 <daniel at fooishbar.org>
> > ---
> >  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
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list