Mercurial > emacs
changeset 103656:563d704f3c48
(decode_keyboard_code): New function.
(tty_read_avail_input): Decode the input bytes if necessary.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 01 Jul 2009 11:37:19 +0000 |
parents | e2d67c929da2 |
children | e9f406501a4a |
files | src/keyboard.c |
diffstat | 1 files changed, 71 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/keyboard.c Wed Jul 01 11:35:07 2009 +0000 +++ b/src/keyboard.c Wed Jul 01 11:37:19 2009 +0000 @@ -7137,6 +7137,47 @@ return nread; } +static void +decode_keyboard_code (struct tty_display_info *tty, + struct coding_system *coding, + unsigned char *buf, int nbytes) +{ + unsigned char *src = buf; + const unsigned char *p; + int i; + + if (nbytes == 0) + return; + if (tty->meta_key != 2) + for (i = 0; i < nbytes; i++) + buf[i] &= ~0x80; + if (coding->carryover_bytes > 0) + { + src = alloca (coding->carryover_bytes + nbytes); + memcpy (src, coding->carryover, coding->carryover_bytes); + memcpy (src + coding->carryover_bytes, buf, nbytes); + nbytes += coding->carryover_bytes; + } + coding->destination = alloca (nbytes * 4); + coding->dst_bytes = nbytes * 4; + decode_coding_c_string (coding, src, nbytes, Qnil); + if (coding->produced_char == 0) + return; + for (i = 0, p = coding->destination; i < coding->produced_char; i++) + { + struct input_event buf; + + EVENT_INIT (buf); + buf.code = STRING_CHAR_ADVANCE (p); + buf.kind = (ASCII_CHAR_P (buf.code) + ? ASCII_KEYSTROKE_EVENT : MULTIBYTE_CHAR_KEYSTROKE_EVENT); + /* See the comment in tty_read_avail_input. */ + buf.frame_or_window = tty->top_frame; + buf.arg = Qnil; + kbd_buffer_store_event (&buf); + } +} + /* This is the tty way of reading available input. Note that each terminal device has its own `struct terminal' object, @@ -7288,6 +7329,36 @@ #endif /* not MSDOS */ #endif /* not WINDOWSNT */ + if (TERMINAL_KEYBOARD_CODING (terminal)->common_flags + & CODING_REQUIRE_DECODING_MASK) + { + struct coding_system *coding = TERMINAL_KEYBOARD_CODING (terminal); + int from; + + /* Decode the key sequence except for those with meta + modifiers. */ + for (i = from = 0; ; i++) + if (i == nread || (tty->meta_key == 1 && (cbuf[i] & 0x80))) + { + struct input_event buf; + + decode_keyboard_code (tty, coding, cbuf + from, i - from); + if (i == nread) + break; + + EVENT_INIT (buf); + buf.kind = ASCII_KEYSTROKE_EVENT; + buf.modifiers = meta_modifier; + buf.code = cbuf[i] & ~0x80; + /* See the comment below. */ + buf.frame_or_window = tty->top_frame; + buf.arg = Qnil; + kbd_buffer_store_event (&buf); + from = i + 1; + } + return nread; + } + for (i = 0; i < nread; i++) { struct input_event buf;