emacs-devel
[Top][All Lists]
Advanced

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

UNICODE WITH MS-IME


From: 姚春林
Subject: UNICODE WITH MS-IME
Date: Tue, 13 Mar 2007 23:32:59 +0900

I must work on windows and with multi language.
I use windows IME to input multi language.
so emacs must accept unicode MS-IME.

I modified emacs23 to accept unicode MS-IME string.
I only known a little C and don't know emacs construction.
so this patch may have many bugs.
I post it here.hope somebody add unicode ime support in emacs23

===========================================

? cscope.out
Index: w32fns.c
===================================================================
RCS file: /sources/emacs/emacs/src/w32fns.c,v
retrieving revision 1.219.2.39
diff -u -r1.219.2.39 w32fns.c
--- w32fns.c    26 Feb 2007 23:03:29 -0000    1.219.2.39
+++ w32fns.c    13 Mar 2007 14:12:21 -0000
@@ -55,6 +55,8 @@
 #include <winspool.h>
 
 #include <dlgs.h>
+#include <imm.h>
+
 #define FILE_NAME_TEXT_FIELD edt1
 
 void syms_of_w32fns ();
@@ -2735,6 +2737,64 @@
     }
 }
 
+static void ime_input (hwnd, msg, wParam, lParam)
+    HWND hwnd;
+    UINT msg;
+    WPARAM wParam;
+    LPARAM lParam;
+{
+    HIMC hIMC;
+    DWORD dwSize;
+    HGLOBAL hstr;
+    LPWSTR lpstr;
+    W32Msg wmsg;
+    DWORD i=0;
+
+    wmsg.dwModifiers = w32_get_key_modifiers (wParam, lParam);
+    hIMC = ImmGetContext(hwnd);
+
+    if (!hIMC)
+        return;
+    //MyError(ERROR_NULLCONTEXT);
+
+    // Get the size of the result string.
+    dwSize = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);
+
+    // increase buffer size for terminating null character,
+    //   maybe it is in UNICODE
+    dwSize += sizeof(WCHAR);
+
+    hstr = GlobalAlloc(GHND,dwSize);
+    if (hstr == NULL)
+    {
+        ImmReleaseContext(hwnd, hIMC);
+        return;
+    }
+
+    lpstr = GlobalLock(hstr);
+    if (lpstr == NULL)
+    {
+        ImmReleaseContext(hwnd, hIMC);
+        GlobalFree(hstr);
+    }
+    //MyError(ERROR_GLOBALLOCK);
+
+    // Get the result strings that is generated by IME into lpstr.
+    ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, lpstr, dwSize);
+    //MessageBoxW(NULL, lpstr , L"inputed", 0);
+    for(i=0; i< dwSize ; i++){
+        if((WCHAR) lpstr[i] == 0x0000){
+            break;
+        }
+        my_post_msg (&wmsg, hwnd, WM_IME_CHAR, lpstr[i], lParam);
+    }
+
+    ImmReleaseContext(hwnd, hIMC);
+
+    // add this string into text buffer of application
+    GlobalUnlock(hstr);
+    GlobalFree(hstr);
+}
 
 static void
 post_character_message (hwnd, msg, wParam, lParam, modifiers)
@@ -3171,6 +3231,15 @@
 
       /* Simulate middle mouse button events when left and right buttons
      are used together, but only if user has two button mouse. */
+
+    /*Modified By ChunlinYao 2007-03-12*/
+    case WM_IME_COMPOSITION:
+      if (lParam & GCS_RESULTSTR)
+      {
+          ime_input(hwnd, msg, wParam, lParam);
+          return 0;
+      }
+      goto dflt;
     case WM_LBUTTONDOWN:
     case WM_RBUTTONDOWN:
       if (w32_num_mouse_buttons > 2)
Index: w32term.c
===================================================================
RCS file: /sources/emacs/emacs/src/w32term.c,v
retrieving revision 1.193.4.40
diff -u -r1.193.4.40 w32term.c
--- w32term.c    26 Feb 2007 23:03:29 -0000    1.193.4.40
+++ w32term.c    13 Mar 2007 12:55:24 -0000
@@ -4447,6 +4447,29 @@
         }
       break;
 
+    case WM_IME_CHAR:
+      f = x_window_to_frame (dpyinfo, msg.msg.hwnd);
+
+      if (f && !f->iconified)
+        {
+          if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
+          && !EQ (f->tool_bar_window, dpyinfo->mouse_face_window))
+        {
+          clear_mouse_face (dpyinfo);
+          dpyinfo->mouse_face_hidden = 1;
+        }
+
+          if (temp_index == sizeof temp_buffer / sizeof (short))
+        temp_index = 0;
+          temp_buffer[temp_index++] = msg.msg.wParam ;
+          inev.kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+          inev.code = msg.msg.wParam;
+          inev.modifiers = msg.dwModifiers;
+          XSETFRAME (inev.frame_or_window, f);
+          inev.timestamp = msg.msg.time;
+        }
+      break;
+
     case WM_MOUSEMOVE:
       /* Ignore non-movement.  */
       {


--
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
/_/      中国   ・  江蘇省  ・  南通
/_/
/_/        姚春林
/_/
/_/    E-mail: address@hidden
/_/    MSN  : address@hidden
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
reply via email to

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