bug-gnu-emacs
[Top][All Lists]
Advanced

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

Emacs-CVS Win32 MS-IME will lost some input


From: Yao
Subject: Emacs-CVS Win32 MS-IME will lost some input
Date: Thu, 13 Nov 2008 22:02:43 -0800 (PST)
User-agent: G2/1.0

Hi

I am using japanese input method .If I input continuously I will lost
some word.
Because Emacs handles  WM_IME_CHAR.When first WM_IME_CHAR arrived  It
read whole string and ignore the other WM_IME_CHAR messages.So it use
a ignore_ime_char flag.

The flag is reseted after a WM_IME_ENDCOMPOSITION message.I think when
I input continuously the IME haven't send some WM_IME_ENDCOMPOSITION
message, Because it has not ENDed.

And the composition window is not followed the cursor.

This is my patch.
------BEGIN-----
Index: src/w32fns.c
===================================================================
RCS file: /sources/emacs/emacs/src/w32fns.c,v
retrieving revision 1.349
diff -U 3 -r1.349 w32fns.c
--- src/w32fns.c        30 Oct 2008 01:27:07 -0000      1.349
+++ src/w32fns.c        14 Nov 2008 05:49:34 -0000
@@ -255,6 +255,9 @@
 typedef HMONITOR (WINAPI * MonitorFromPoint_Proc) (IN POINT pt, IN
DWORD flags);
 typedef BOOL (WINAPI * GetMonitorInfo_Proc)
   (IN HMONITOR monitor, OUT struct MONITOR_INFO* info);
+typedef HWND (WINAPI * ImmReleaseContext_Proc) (IN HWND hWnd, IN HIMC
himc);
+typedef HWND (WINAPI * ImmSetCompositionWindow_Proc)
+  (IN HIMC himc, IN LPCOMPOSITIONFORM compform);

 TrackMouseEvent_Proc track_mouse_event_fn = NULL;
 ClipboardSequence_Proc clipboard_sequence_fn = NULL;
@@ -262,11 +265,11 @@
 ImmGetContext_Proc get_ime_context_fn = NULL;
 MonitorFromPoint_Proc monitor_from_point_fn = NULL;
 GetMonitorInfo_Proc get_monitor_info_fn = NULL;
+ImmReleaseContext_Proc release_ime_context_fn = NULL;
+ImmSetCompositionWindow_Proc set_ime_composition_window_fn = NULL;

 extern AppendMenuW_Proc unicode_append_menu;

-/* Flag to selectively ignore WM_IME_CHAR messages.  */
-static int ignore_ime_char = 0;

 /* W95 mousewheel handler */
 unsigned int msh_mousewheel = 0;
@@ -3134,15 +3137,14 @@
       }
       break;

-    case WM_IME_CHAR:
+    case WM_IME_COMPOSITION:
       /* If we can't get the IME result as unicode, use default
processing,
          which will at least allow characters decodable in the system
locale
          get through.  */
       if (!get_composition_string_fn)
         goto dflt;
-
-      else if (!ignore_ime_char)
-        {
+         if (lParam & GCS_RESULTSTR)
+               {
           wchar_t * buffer;
           int size, i;
           W32Msg wmsg;
@@ -3159,14 +3161,47 @@
               my_post_msg (&wmsg, hwnd, WM_UNICHAR, (WPARAM) buffer
[i],
                            lParam);
             }
-          /* We output the whole string above, so ignore following
ones
-             until we are notified of the end of composition.  */
-          ignore_ime_char = 1;
+                 release_ime_context_fn (hwnd, context);
         }
+         else
+               {
+                 goto dflt;
+               }
       break;
-
+       case WM_IME_STARTCOMPOSITION:
+      if (!set_ime_composition_window_fn)
+        goto dflt;
+         HIMC context = get_ime_context_fn (hwnd);
+         if (!context)
+               {
+                 break;
+               }
+         f = x_window_to_frame (dpyinfo, hwnd);
+         COMPOSITIONFORM compform;
+         struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
+         compform.dwStyle = CFS_RECT;
+         compform.ptCurrentPos.x =     WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w-
>phys_cursor.x);
+
+         compform.ptCurrentPos.y = WINDOW_TO_FRAME_PIXEL_Y (w, w-
>phys_cursor.y);
+
+         compform.rcArea.left = (WINDOW_BOX_LEFT_EDGE_X (w)
+                                                         + 
WINDOW_LEFT_MARGIN_WIDTH (w)
+                                                         + 
WINDOW_LEFT_FRINGE_WIDTH (w));
+
+         compform.rcArea.top = (WINDOW_TOP_EDGE_Y (w)
+                                                        + 
WINDOW_HEADER_LINE_HEIGHT (w));
+
+         compform.rcArea.right = (WINDOW_BOX_RIGHT_EDGE_X (w)
+                                                          - 
WINDOW_RIGHT_MARGIN_WIDTH (w)
+                                                          - 
WINDOW_RIGHT_FRINGE_WIDTH (w));
+
+         compform.rcArea.bottom = (WINDOW_BOTTOM_EDGE_Y (w)
+                                                               - 
WINDOW_MODE_LINE_HEIGHT (w));
+         set_ime_composition_window_fn(context, &compform);
+         release_ime_context_fn (hwnd, context);
+
+         break;
     case WM_IME_ENDCOMPOSITION:
-      ignore_ime_char = 0;
       goto dflt;

       /* Simulate middle mouse button events when left and right
buttons
@@ -7258,6 +7293,10 @@
       GetProcAddress (imm32_lib, "ImmGetCompositionStringW");
     get_ime_context_fn = (ImmGetContext_Proc)
       GetProcAddress (imm32_lib, "ImmGetContext");
+       release_ime_context_fn = (ImmReleaseContext_Proc)
+         GetProcAddress (imm32_lib, "ImmReleaseContext");
+       set_ime_composition_window_fn = (ImmSetCompositionWindow_Proc)
+         GetProcAddress (imm32_lib, "ImmSetCompositionWindow");
   }
   DEFVAR_INT ("w32-ansi-code-page",
              &w32_ansi_code_page,
Index: src/w32term.c
===================================================================
RCS file: /sources/emacs/emacs/src/w32term.c,v
retrieving revision 1.309
diff -U 3 -r1.309 w32term.c
--- src/w32term.c       12 Nov 2008 15:51:11 -0000      1.309
+++ src/w32term.c       14 Nov 2008 05:53:00 -0000
@@ -33,6 +33,7 @@
 #include <errno.h>
 #include <setjmp.h>
 #include <sys/stat.h>
+#include <imm.h>

 #include "charset.h"
 #include "character.h"
@@ -5061,7 +5062,11 @@
        {
          struct frame *f = XFRAME (WINDOW_FRAME (w));
          HWND hwnd = FRAME_W32_WINDOW (f);
-
+         if (f == FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame)
+               {
+                 PostMessage (hwnd,
+                                          WM_IME_STARTCOMPOSITION, 0, 0);
+               }
          w32_system_caret_x
            = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
          w32_system_caret_y
------END--------


reply via email to

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