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:
committed by
Kristian Høgsberg
parent
1bad5db9d6
commit
fdb4b02501
+23
-7
@@ -20,6 +20,7 @@
|
|||||||
* OF THIS SOFTWARE.
|
* OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -2116,7 +2117,8 @@ key_handler(struct window *window, struct input *input, uint32_t time,
|
|||||||
struct terminal *terminal = data;
|
struct terminal *terminal = data;
|
||||||
char ch[MAX_RESPONSE];
|
char ch[MAX_RESPONSE];
|
||||||
uint32_t modifiers, serial;
|
uint32_t modifiers, serial;
|
||||||
int len = 0;
|
int ret, len = 0;
|
||||||
|
bool convert_utf8 = true;
|
||||||
|
|
||||||
modifiers = input_get_modifiers(input);
|
modifiers = input_get_modifiers(input);
|
||||||
if ((modifiers & MOD_CONTROL_MASK) &&
|
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 == '/') sym = 0x1F;
|
||||||
else if (sym == '8' || sym == '?') sym = 0x7F;
|
else if (sym == '8' || sym == '?') sym = 0x7F;
|
||||||
}
|
}
|
||||||
if ((terminal->mode & MODE_ALT_SENDS_ESC) &&
|
if (modifiers & MOD_ALT_MASK) {
|
||||||
(modifiers & MOD_ALT_MASK)) {
|
if (terminal->mode & MODE_ALT_SENDS_ESC) {
|
||||||
ch[len++] = 0x1b;
|
ch[len++] = 0x1b;
|
||||||
} else if (modifiers & MOD_ALT_MASK) {
|
} else {
|
||||||
sym = sym | 0x80;
|
sym = sym | 0x80;
|
||||||
|
convert_utf8 = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sym < 256)
|
if ((sym < 128) ||
|
||||||
|
(!convert_utf8 && sym < 256)) {
|
||||||
ch[len++] = sym;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user