Kusanagi Kouichi : user32: Handle IME messages more gracefully.

Alexandre Julliard julliard at winehq.org
Fri Apr 18 07:27:23 CDT 2008


Module: wine
Branch: master
Commit: d79dff4e307d3ce6b2630d84db5ba31e261a2ede
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d79dff4e307d3ce6b2630d84db5ba31e261a2ede

Author: Kusanagi Kouichi <slash at ma.neweb.ne.jp>
Date:   Fri Apr 18 08:39:31 2008 +0900

user32: Handle IME messages more gracefully.

---

 dlls/user32/edit.c |   72 +++++++++++++++++++++-------------------------------
 1 files changed, 29 insertions(+), 43 deletions(-)

diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index 0866533..dba946b 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -1030,38 +1030,22 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
 		break;
 
 	case WM_IME_STARTCOMPOSITION:
-	/* 
-	 * FIXME in IME: This message is not always sent like it should be
-	 */
-		if (es->selection_start != es->selection_end)
-		{
-			static const WCHAR empty_stringW[] = {0};
-			EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
-		}
 		es->composition_start = es->selection_end;
 		es->composition_len = 0;
 		break;
 
 	case WM_IME_COMPOSITION:
-	{
-		int caret_pos = es->selection_end;
-		if (es->composition_len == 0)
-		{
-			if (es->selection_start != es->selection_end)
-			{    
-				static const WCHAR empty_stringW[] = {0};
-				EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
-			}
-
-			es->composition_start = es->selection_end;
-		}
-		EDIT_ImeComposition(hwnd,lParam,es);
-		EDIT_SetCaretPos(es, caret_pos, es->flags & EF_AFTER_WRAP);
+                EDIT_ImeComposition(hwnd, lParam, es);
 		break;
-	}
 
 	case WM_IME_ENDCOMPOSITION:
-		es->composition_len= 0;
+                if (es->composition_len > 0)
+                {
+                        static const WCHAR empty_stringW[] = {0};
+                        EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
+                        es->selection_end = es->selection_start;
+                        es->composition_len= 0;
+                }
 		break;
 
 	case WM_IME_COMPOSITIONFULL:
@@ -5402,22 +5386,17 @@ static void EDIT_UpdateText(EDITSTATE *es, const RECT *rc, BOOL bErase)
  * The Following code is to handle inline editing from IMEs
  */
 
-static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
+static void EDIT_GetCompositionStr(HIMC hIMC, LPARAM CompFlag, EDITSTATE *es)
 {
     LONG buflen;
     LPWSTR lpCompStr = NULL;
-    HIMC hIMC;
     LPSTR lpCompStrAttr = NULL;
     DWORD dwBufLenAttr;
 
-    if (!(hIMC = ImmGetContext(hwnd)))
-        return;
-
     buflen = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
 
     if (buflen < 0)
     {
-        ImmReleaseContext(hwnd, hIMC);
         return;
     }
 
@@ -5425,7 +5404,6 @@ static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
     if (!lpCompStr)
     {
         ERR("Unable to allocate IME CompositionString\n");
-        ImmReleaseContext(hwnd,hIMC);
         return;
     }
 
@@ -5448,7 +5426,6 @@ static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
             {
                 ERR("Unable to allocate IME Attribute String\n");
                 HeapFree(GetProcessHeap(),0,lpCompStr);
-                ImmReleaseContext(hwnd,hIMC);
                 return;
             }
             ImmGetCompositionStringW(hIMC,GCS_COMPATTR, lpCompStrAttr, 
@@ -5479,22 +5456,16 @@ static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
 
     HeapFree(GetProcessHeap(),0,lpCompStrAttr);
     HeapFree(GetProcessHeap(),0,lpCompStr);
-    ImmReleaseContext(hwnd,hIMC);
 }
 
-static void EDIT_GetResultStr(HWND hwnd, EDITSTATE *es)
+static void EDIT_GetResultStr(HIMC hIMC, EDITSTATE *es)
 {
     LONG buflen;
     LPWSTR lpResultStr;
-    HIMC    hIMC;
-
-    if ( !(hIMC = ImmGetContext(hwnd)))
-        return;
 
     buflen = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);
     if (buflen <= 0)
     {
-        ImmReleaseContext(hwnd, hIMC);
         return;
     }
 
@@ -5502,7 +5473,6 @@ static void EDIT_GetResultStr(HWND hwnd, EDITSTATE *es)
     if (!lpResultStr)
     {
         ERR("Unable to alloc buffer for IME string\n");
-        ImmReleaseContext(hwnd, hIMC);
         return;
     }
 
@@ -5520,13 +5490,29 @@ static void EDIT_GetResultStr(HWND hwnd, EDITSTATE *es)
     es->composition_len = 0;
 
     HeapFree(GetProcessHeap(),0,lpResultStr);
-    ImmReleaseContext(hwnd, hIMC);
 }
 
 static void EDIT_ImeComposition(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
 {
+    HIMC hIMC;
+    int cursor;
+
+    if (es->composition_len == 0 && es->selection_start != es->selection_end)
+    {
+        static const WCHAR empty_stringW[] = {0};
+        EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
+        es->composition_start = es->selection_end;
+    }
+
+    hIMC = ImmGetContext(hwnd);
+    if (!hIMC)
+        return;
+
     if (CompFlag & GCS_RESULTSTR)
-        EDIT_GetResultStr(hwnd,es);
+        EDIT_GetResultStr(hIMC, es);
     if (CompFlag & GCS_COMPSTR)
-        EDIT_GetCompositionStr(hwnd, CompFlag, es);
+        EDIT_GetCompositionStr(hIMC, CompFlag, es);
+    cursor = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, 0, 0);
+    ImmReleaseContext(hwnd, hIMC);
+    EDIT_SetCaretPos(es, es->selection_start + cursor, es->flags & EF_AFTER_WRAP);
 }




More information about the wine-cvs mailing list