terminal: support entering non-ascii characters

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).
This commit is contained in:
Philipp Brüschweiler 2012-08-18 13:38:38 +02:00 committed by Kristian Høgsberg
parent 1bad5db9d6
commit fdb4b02501

View File

@ -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;
}