]> git.eshelyaron.com Git - emacs.git/commitdiff
(decode_keyboard_code): New function.
authorKenichi Handa <handa@m17n.org>
Wed, 1 Jul 2009 11:37:45 +0000 (11:37 +0000)
committerKenichi Handa <handa@m17n.org>
Wed, 1 Jul 2009 11:37:45 +0000 (11:37 +0000)
(tty_read_avail_input): Decode the input bytes if necessary.

src/ChangeLog
src/keyboard.c

index 5ca300dd8334f300b589a7faa6f740cb711cc81e..61d2d1b7eba574bb1b9dcf4453c5334bd4bd965e 100644 (file)
@@ -1,3 +1,13 @@
+2009-07-01  Kenichi Handa  <handa@m17n.org>
+
+       * keyboard.c (decode_keyboard_code): New function.
+       (tty_read_avail_input): Decode the input bytes if necessary.
+
+       * coding.c (setup_coding_system): Initialize
+       coding->carryover_bytes to 0.
+       (Fset_keyboard_coding_system_internal): If CODING-SYSTEM is nil,
+       use Qno_conversion.
+
 2009-07-01  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * Makefile.in (SOME_MACHINE_LISP): Add ../lisp/term/common-win.elc.
index 8ed335a12bbd6c6b11d381a24b12bff47559802b..55862e1da33344324fd879a1e9260143978d55e8 100644 (file)
@@ -7137,6 +7137,47 @@ read_avail_input (expected)
   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 @@ tty_read_avail_input (struct terminal *terminal,
 #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;