emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r99394: Use Unicode for keyboard inpu


From: Jason Rumney
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r99394: Use Unicode for keyboard input on w32 console.
Date: Thu, 28 Jan 2010 07:21:16 +0800
User-agent: Bazaar (2.0.2)

------------------------------------------------------------
revno: 99394 [merge]
committer: Jason Rumney <address@hidden>
branch nick: trunk
timestamp: Thu 2010-01-28 07:21:16 +0800
message:
  Use Unicode for keyboard input on w32 console.
modified:
  src/ChangeLog
  src/w32inevt.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2010-01-27 05:28:39 +0000
+++ b/src/ChangeLog     2010-01-27 13:59:13 +0000
@@ -1,3 +1,8 @@
+2010-01-27  Jason Rumney  <address@hidden>
+
+       * w32inevt.c (w32_kbd_patch_key): Save the unicode character.
+       (key_event): Use unicode for characters 128 and higher.
+
 2010-01-27  Kenichi Handa  <address@hidden>
 
        * regex.c (analyse_first): Fix setting of fastmap for unibyte

=== modified file 'src/w32inevt.c'
--- a/src/w32inevt.c    2010-01-13 08:35:10 +0000
+++ b/src/w32inevt.c    2010-01-27 16:22:16 +0000
@@ -81,6 +81,9 @@
 static INPUT_RECORD event_queue[EVENT_QUEUE_SIZE];
 static INPUT_RECORD *queue_ptr = event_queue, *queue_end = event_queue;
 
+/* Temporarily store lead byte of DBCS input sequences.  */
+static char dbcs_lead = 0;
+
 static int
 fill_queue (BOOL block)
 {
@@ -253,13 +256,15 @@
                          keystate, buf, 128, 0);
       if (isdead > 0)
        {
-          char cp[20];
-          int cpId;
-
-          GetLocaleInfo (GetThreadLocale (),
+         char cp[20];
+         int cpId;
+
+         event->uChar.UnicodeChar = buf[isdead - 1];
+
+         GetLocaleInfo (GetThreadLocale (),
                         LOCALE_IDEFAULTANSICODEPAGE, cp, 20);
-          cpId = atoi (cp);
-          isdead = WideCharToMultiByte (cpId, 0, buf, isdead,
+         cpId = atoi (cp);
+         isdead = WideCharToMultiByte (cpId, 0, buf, isdead,
                                        ansi_code, 4, NULL, NULL);
        }
       else
@@ -425,8 +430,6 @@
 
   if (lispy_function_keys[event->wVirtualKeyCode] == 0)
     {
-      emacs_ev->kind = ASCII_KEYSTROKE_EVENT;
-
       if (!NILP (Vw32_recognize_altgr)
          && (event->dwControlKeyState & LEFT_CTRL_PRESSED)
          && (event->dwControlKeyState & RIGHT_ALT_PRESSED))
@@ -461,9 +464,65 @@
          else if (event->uChar.AsciiChar == 0)
            w32_kbd_patch_key (event);
        }
+
       if (event->uChar.AsciiChar == 0)
-       return 0;
-      emacs_ev->code = event->uChar.AsciiChar;
+       {
+         emacs_ev->kind = NO_EVENT;
+         return 0;
+       }
+      else if (event->uChar.AsciiChar > 0 && event->uChar.AsciiChar < 128)
+       {
+         emacs_ev->kind = ASCII_KEYSTROKE_EVENT;
+         emacs_ev->code = event->uChar.AsciiChar;
+       }
+      else if (event->uChar.UnicodeChar > 0)
+       {
+         emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+         emacs_ev->code = event->uChar.UnicodeChar;
+       }
+      else
+       {
+         /* Fallback for non-Unicode versions of Windows.  */
+         wchar_t code;
+         char dbcs[2];
+          char cp[20];
+          int cpId;
+
+         /* Get the codepage to interpret this key with.  */
+          GetLocaleInfo (GetThreadLocale (),
+                        LOCALE_IDEFAULTANSICODEPAGE, cp, 20);
+          cpId = atoi (cp);
+
+         dbcs[0] = dbcs_lead;
+         dbcs[1] = event->uChar.AsciiChar;
+         if (dbcs_lead)
+           {
+             dbcs_lead = 0;
+             if (!MultiByteToWideChar (cpId, 0, dbcs, 2, &code, 1))
+               {
+                 /* Garbage  */
+                 DebPrint (("Invalid DBCS sequence: %d %d\n",
+                            dbcs[0], dbcs[1]));
+                 emacs_ev->kind = NO_EVENT;
+               }
+           }
+         else if (IsDBCSLeadByteEx (cpId, dbcs[1]))
+           {
+             dbcs_lead = dbcs[1];
+             emacs_ev->kind = NO_EVENT;
+           }
+         else
+           {
+             if (!MultiByteToWideChar (cpId, 0, &dbcs[1], 1, &code, 1))
+               {
+                 /* Garbage  */
+                 DebPrint (("Invalid character: %d\n", dbcs[1]));
+                 emacs_ev->kind = NO_EVENT;
+               }
+           }
+         emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+         emacs_ev->code = code;
+       }
     }
   else
     {


reply via email to

[Prev in Thread] Current Thread [Next in Thread]