[PATCH] terminal: support entering non-ascii characters
Kristian Høgsberg
hoegsberg at gmail.com
Wed Aug 29 11:52:18 PDT 2012
On Sat, Aug 18, 2012 at 01:38:38PM +0200, Philipp Brüschweiler wrote:
> Unless the alt modifier is active and the MODE_ALT_SENDS_ESC mode is not
> set, any value over 127 is converted to a UTF8 sequence.
>
> Part of https://bugs.freedesktop.org/show_bug.cgi?id=53648 should be
> fixed with this.
>
> Part of https://bugs.freedesktop.org/show_bug.cgi?id=52419 is fixed, but
> interestingly it depends on the activated keymap (i.e. it works with
> dvorak, but not with ch).
Committed, thanks.
> ---
> clients/terminal.c | 30 +++++++++++++++++++++++-------
> 1 Datei geändert, 23 Zeilen hinzugefügt(+), 7 Zeilen entfernt(-)
>
> diff --git a/clients/terminal.c b/clients/terminal.c
> index 7e74db7..f97882d 100644
> --- a/clients/terminal.c
> +++ b/clients/terminal.c
> @@ -20,6 +20,7 @@
> * OF THIS SOFTWARE.
> */
>
> +#include <stdbool.h>
> #include <stdint.h>
> #include <stdio.h>
> #include <stdlib.h>
> @@ -2116,7 +2117,8 @@ key_handler(struct window *window, struct input *input, uint32_t time,
> struct terminal *terminal = data;
> char ch[MAX_RESPONSE];
> uint32_t modifiers, serial;
> - int len = 0;
> + int ret, len = 0;
> + bool convert_utf8 = true;
>
> modifiers = input_get_modifiers(input);
> if ((modifiers & MOD_CONTROL_MASK) &&
> @@ -2229,15 +2231,29 @@ key_handler(struct window *window, struct input *input, uint32_t time,
> else if (sym == '/') sym = 0x1F;
> else if (sym == '8' || sym == '?') sym = 0x7F;
> }
> - if ((terminal->mode & MODE_ALT_SENDS_ESC) &&
> - (modifiers & MOD_ALT_MASK)) {
> - ch[len++] = 0x1b;
> - } else if (modifiers & MOD_ALT_MASK) {
> - sym = sym | 0x80;
> + if (modifiers & MOD_ALT_MASK) {
> + if (terminal->mode & MODE_ALT_SENDS_ESC) {
> + ch[len++] = 0x1b;
> + } else {
> + sym = sym | 0x80;
> + convert_utf8 = false;
> + }
> }
>
> - if (sym < 256)
> + if ((sym < 128) ||
> + (!convert_utf8 && sym < 256)) {
> ch[len++] = sym;
> + } else {
> + ret = xkb_keysym_to_utf8(sym, ch + len,
> + MAX_RESPONSE - len);
> + if (ret < 0)
> + fprintf(stderr,
> + "Warning: buffer too small to encode "
> + "UTF8 character\n");
> + else
> + len += ret;
> + }
> +
> break;
> }
>
> --
> 1.7.11.5
>
> _______________________________________________
> 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