[kmscon-devel] [PATCH 1/2] uxkb: allow the user to use a predefined keymap file
David Herrmann
dh.herrmann at gmail.com
Tue Mar 12 10:03:09 PDT 2013
Hi Ran
On Sun, Mar 10, 2013 at 11:02 AM, Ran Benita <ran234 at gmail.com> wrote:
> This adds an --xkb-keymap <FILE> option to kmscon. When given, kmscon
> will try to compile the keymap from the file before trying the other
> options (like the XkbKeymap option in xorg.conf).
>
> This is useful for users who have a customized XKB keymap, which is
> usually kept in a single file. Example, in X:
> xkbcomp $DISPLAY my_keymap.xkb
> Customize my_keymap.xkb to your liking, and then in .xinitrc, or
> xorg.conf:
> xkbcomp my_keymap.xkb $DISPLAY
> Now you can also do this in kmscon.conf.
>
> Additionally, lacking such an option, kmscon is quite difficult to use
> without an installed xkeyboard-config package, which provides the
> infrastructure for the "rules" configuration mechanism. We might even
> want to distribute some plain xkb file as a last ditch, for
> robustness, if even the default RMLVO fails... without a keyboard a
> terminal is not very useful.
>
> Signed-off-by: Ran Benita <ran234 at gmail.com>
I changed it to use *_from_string() so we don't do file-handling magic
inside of libuterm. The caller should handle file paths so they can
support --rootdir options or similar.
Other than that I didn't change anything and pushed it upstream. Thanks!
(I just noticed I lost your signed-off-by somewhere, whoops, but I
don't require them, anyway)
I tested it with basic.xkb from libxkbcommon and it works for me. If
you can point me to a very basic us-keyboard layout, I would write up
a patch that includes it as fallback in uterm.
Thanks a lot!
David
> ---
> docs/man/kmscon.xml | 8 ++++++++
> src/kmscon_conf.c | 3 +++
> src/kmscon_conf.h | 2 ++
> src/kmscon_seat.c | 1 +
> src/uterm_input.c | 3 ++-
> src/uterm_input.h | 4 ++--
> src/uterm_input_internal.h | 3 ++-
> src/uterm_input_uxkb.c | 30 +++++++++++++++++++++++++++++-
> tests/test_input.c | 7 ++++++-
> tests/test_vt.c | 2 +-
> 10 files changed, 56 insertions(+), 7 deletions(-)
>
> diff --git a/docs/man/kmscon.xml b/docs/man/kmscon.xml
> index 7777ede..4b3efea 100644
> --- a/docs/man/kmscon.xml
> +++ b/docs/man/kmscon.xml
> @@ -300,6 +300,14 @@
> </varlistentry>
>
> <varlistentry>
> + <term><option>--xkb-keymap {file}</option></term>
> + <listitem>
> + <para>Path to a single predefined keymap file. This takes precedence
> + over the above options (default: not used)</para>
> + </listitem>
> + </varlistentry>
> +
> + <varlistentry>
> <term><option>--xkb-repeat-delay {delay}</option></term>
> <listitem>
> <para>Delay after key was pressed until key-repeat starts (in
> diff --git a/src/kmscon_conf.c b/src/kmscon_conf.c
> index d960c42..42db227 100644
> --- a/src/kmscon_conf.c
> +++ b/src/kmscon_conf.c
> @@ -105,6 +105,8 @@ static void print_help()
> "\t --xkb-layout <layout> [-] Set XkbLayout for input devices\n"
> "\t --xkb-variant <variant> [-] Set XkbVariant for input devices\n"
> "\t --xkb-options <options> [-] Set XkbOptions for input devices\n"
> + "\t --xkb-keymap <FILE> [-]\n"
> + "\t Use a predefined keymap for input devices\n"
> "\t --xkb-repeat-delay <msecs> [250]\n"
> "\t Initial delay for key-repeat in ms\n"
> "\t --xkb-repeat-rate <msecs> [50]\n"
> @@ -581,6 +583,7 @@ int kmscon_conf_new(struct conf_ctx **out)
> CONF_OPTION_STRING(0, "xkb-layout", &conf->xkb_layout, ""),
> CONF_OPTION_STRING(0, "xkb-variant", &conf->xkb_variant, ""),
> CONF_OPTION_STRING(0, "xkb-options", &conf->xkb_options, ""),
> + CONF_OPTION_STRING(0, "xkb-keymap", &conf->xkb_keymap, ""),
> CONF_OPTION_UINT(0, "xkb-repeat-delay", &conf->xkb_repeat_delay, 250),
> CONF_OPTION_UINT(0, "xkb-repeat-rate", &conf->xkb_repeat_rate, 50),
>
> diff --git a/src/kmscon_conf.h b/src/kmscon_conf.h
> index 4cb4789..113ea1a 100644
> --- a/src/kmscon_conf.h
> +++ b/src/kmscon_conf.h
> @@ -104,6 +104,8 @@ struct kmscon_conf_t {
> char *xkb_variant;
> /* input KBD options */
> char *xkb_options;
> + /* input predefined KBD keymap */
> + char *xkb_keymap;
> /* keyboard key-repeat delay */
> unsigned int xkb_repeat_delay;
> /* keyboard key-repeat rate */
> diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c
> index be8a5ab..a763b6a 100644
> --- a/src/kmscon_seat.c
> +++ b/src/kmscon_seat.c
> @@ -680,6 +680,7 @@ int kmscon_seat_new(struct kmscon_seat **out,
> seat->conf->xkb_layout,
> seat->conf->xkb_variant,
> seat->conf->xkb_options,
> + seat->conf->xkb_keymap,
> seat->conf->xkb_repeat_delay,
> seat->conf->xkb_repeat_rate);
> if (ret)
> diff --git a/src/uterm_input.c b/src/uterm_input.c
> index 1ba8812..c248ee8 100644
> --- a/src/uterm_input.c
> +++ b/src/uterm_input.c
> @@ -223,6 +223,7 @@ int uterm_input_new(struct uterm_input **out,
> const char *layout,
> const char *variant,
> const char *options,
> + const char *keymap,
> unsigned int repeat_delay,
> unsigned int repeat_rate)
> {
> @@ -255,7 +256,7 @@ int uterm_input_new(struct uterm_input **out,
> if (ret)
> goto err_free;
>
> - ret = uxkb_desc_init(input, model, layout, variant, options);
> + ret = uxkb_desc_init(input, model, layout, variant, options, keymap);
> if (ret)
> goto err_hook;
>
> diff --git a/src/uterm_input.h b/src/uterm_input.h
> index 36f5de2..43faccc 100644
> --- a/src/uterm_input.h
> +++ b/src/uterm_input.h
> @@ -71,8 +71,8 @@ typedef void (*uterm_input_cb) (struct uterm_input *input,
>
> int uterm_input_new(struct uterm_input **out, struct ev_eloop *eloop,
> const char *model, const char *layout, const char *variant,
> - const char *options, unsigned int repeat_delay,
> - unsigned int repeat_rate);
> + const char *options, const char *keymap,
> + unsigned int repeat_delay, unsigned int repeat_rate);
> void uterm_input_ref(struct uterm_input *input);
> void uterm_input_unref(struct uterm_input *input);
>
> diff --git a/src/uterm_input_internal.h b/src/uterm_input_internal.h
> index 727af97..6491d33 100644
> --- a/src/uterm_input_internal.h
> +++ b/src/uterm_input_internal.h
> @@ -86,7 +86,8 @@ int uxkb_desc_init(struct uterm_input *input,
> const char *model,
> const char *layout,
> const char *variant,
> - const char *options);
> + const char *options,
> + const char *keymap);
> void uxkb_desc_destroy(struct uterm_input *input);
>
> int uxkb_dev_init(struct uterm_input_dev *dev);
> diff --git a/src/uterm_input_uxkb.c b/src/uterm_input_uxkb.c
> index 3053dfc..e2de3b5 100644
> --- a/src/uterm_input_uxkb.c
> +++ b/src/uterm_input_uxkb.c
> @@ -44,7 +44,8 @@ int uxkb_desc_init(struct uterm_input *input,
> const char *model,
> const char *layout,
> const char *variant,
> - const char *options)
> + const char *options,
> + const char *keymap)
> {
> int ret;
> struct xkb_rule_names rmlvo = {
> @@ -54,6 +55,7 @@ int uxkb_desc_init(struct uterm_input *input,
> .variant = variant,
> .options = options,
> };
> + FILE *keymap_file;
>
> input->ctx = xkb_context_new(0);
> if (!input->ctx) {
> @@ -61,6 +63,32 @@ int uxkb_desc_init(struct uterm_input *input,
> return -ENOMEM;
> }
>
> + /* If a complete keymap file was given, first try that. */
> + if (keymap && *keymap) {
> + keymap_file = fopen(keymap, "re");
> + if (!keymap_file) {
> + log_warn("failed to open keymap file %s (%m), "
> + "reverting to given xkb options",
> + keymap);
> + goto keymap_from_names;
> + }
> +
> + input->keymap = xkb_keymap_new_from_file(input->ctx,
> + keymap_file, XKB_KEYMAP_FORMAT_TEXT_V1, 0);
> + fclose(keymap_file);
> +
> + if (!input->keymap) {
> + log_warn("failed to create keymap from file %s, "
> + "reverting to given xkb options",
> + keymap);
> + goto keymap_from_names;
> + }
> +
> + log_debug("new keyboard description from file (%s)", keymap);
> + return 0;
> + }
> +
> +keymap_from_names:
> input->keymap = xkb_keymap_new_from_names(input->ctx, &rmlvo, 0);
> if (!input->keymap) {
> log_warn("failed to create keymap (%s, %s, %s, %s), "
> diff --git a/tests/test_input.c b/tests/test_input.c
> index 832c3b2..a8f51b1 100644
> --- a/tests/test_input.c
> +++ b/tests/test_input.c
> @@ -52,6 +52,7 @@ struct {
> char *xkb_layout;
> char *xkb_variant;
> char *xkb_options;
> + char *xkb_keymap;
> } input_conf;
>
> /* Pressing Ctrl-\ should toggle the capturing. */
> @@ -119,6 +120,7 @@ static void monitor_event(struct uterm_monitor *mon,
> input_conf.xkb_layout,
> input_conf.xkb_variant,
> input_conf.xkb_options,
> + input_conf.xkb_keymap,
> 0, 0);
> if (ret)
> return;
> @@ -166,7 +168,9 @@ static void print_help()
> "\t --xkb-model <model> [-] Set XkbModel for input devices\n"
> "\t --xkb-layout <layout> [-] Set XkbLayout for input devices\n"
> "\t --xkb-variant <variant> [-] Set XkbVariant for input devices\n"
> - "\t --xkb-options <options> [-] Set XkbOptions for input devices\n",
> + "\t --xkb-options <options> [-] Set XkbOptions for input devices\n"
> + "\t --xkb-keymap <FILE> [-]\n"
> + "\t Use a predefined keymap for input devices\n",
> "test_input");
> /*
> * 80 char line:
> @@ -184,6 +188,7 @@ struct conf_option options[] = {
> CONF_OPTION_STRING(0, "xkb-layout", &input_conf.xkb_layout, ""),
> CONF_OPTION_STRING(0, "xkb-variant", &input_conf.xkb_variant, ""),
> CONF_OPTION_STRING(0, "xkb-options", &input_conf.xkb_options, ""),
> + CONF_OPTION_STRING(0, "xkb-keymap", &input_conf.xkb_keymap, ""),
> };
>
> int main(int argc, char **argv)
> diff --git a/tests/test_vt.c b/tests/test_vt.c
> index 8423f0c..26c5ed6 100644
> --- a/tests/test_vt.c
> +++ b/tests/test_vt.c
> @@ -113,7 +113,7 @@ int main(int argc, char **argv)
> if (ret)
> goto err_exit;
>
> - ret = uterm_input_new(&input, eloop, "", "", "", "", 0, 0);
> + ret = uterm_input_new(&input, eloop, "", "", "", "", "", 0, 0);
> if (ret)
> goto err_vtm;
>
> --
> 1.8.1.5
>
> _______________________________________________
> kmscon-devel mailing list
> kmscon-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/kmscon-devel
More information about the kmscon-devel
mailing list