Nigel Liang : winex11.drv: Implement XIMPreEditCaretCallback.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 20 06:02:37 CDT 2007


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

Author: Nigel Liang <ncliang at gmail.com>
Date:   Thu Jul 19 10:52:30 2007 -0700

winex11.drv: Implement XIMPreEditCaretCallback.

---

 dlls/user32/edit.c     |    4 +++
 dlls/winex11.drv/xim.c |   57 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index fbc5a00..77ecf32 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -1032,6 +1032,8 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
 		break;
 
 	case WM_IME_COMPOSITION:
+	{
+		int caret_pos = es->selection_end;
 		if (es->composition_len == 0)
 		{
 			if (es->selection_start != es->selection_end)
@@ -1043,7 +1045,9 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
 			es->composition_start = es->selection_end;
 		}
 		EDIT_ImeComposition(hwnd,lParam,es);
+		EDIT_SetCaretPos(es, caret_pos, es->flags & EF_AFTER_WRAP);
 		break;
+	}
 
 	case WM_IME_ENDCOMPOSITION:
 		es->composition_len= 0;
diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c
index 7b31986..9e2d232 100644
--- a/dlls/winex11.drv/xim.c
+++ b/dlls/winex11.drv/xim.c
@@ -30,6 +30,7 @@
 #include "winnls.h"
 #include "x11drv.h"
 #include "imm.h"
+#include "ddk/imm.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
@@ -39,6 +40,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
 
 BOOL ximInComposeMode=FALSE;
 
+typedef struct tagInputContextData
+{
+    BOOL            bInternalState;
+    BOOL            bRead;
+    BOOL            bInComposition;
+    HFONT           textfont;
+
+    DWORD           dwLock;
+    INPUTCONTEXT    IMC;
+} InputContextData;
+
 static HIMC root_context;
 static XIMStyle ximStyle = 0;
 static XIMStyle ximStyleRoot = 0;
@@ -56,6 +68,7 @@ static HIMC (WINAPI *pImmCreateContext)(void);
 static VOID (WINAPI *pImmSetOpenStatus)(HIMC,BOOL);
 static BOOL (WINAPI *pImmSetCompositionString)(HIMC, DWORD, LPWSTR,
                                                DWORD, LPWSTR, DWORD);
+static LONG (WINAPI *pImmGetCompositionString)(HIMC, DWORD, LPVOID, DWORD);
 static VOID (WINAPI *pImmNotifyIME)(HIMC, DWORD, DWORD, DWORD);
 
 /* WINE specific messages from the xim in x11drv level */
@@ -92,6 +105,11 @@ static void LoadImmDll(void)
     if (!pImmSetCompositionString)
         WARN("IMM: pImmSetCompositionStringW not found in DLL\n");
 
+    pImmGetCompositionString =(void *)GetProcAddress(hImmDll, "ImmGetCompositionStringW");
+
+    if (!pImmGetCompositionString)
+        WARN("IMM: pImmGetCompositionStringW not found in DLL\n");
+
     pImmNotifyIME = (void *)GetProcAddress( hImmDll, "ImmNotifyIME");
 
     if (!pImmNotifyIME)
@@ -310,7 +328,44 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data,
 static void XIMPreEditCaretCallback(XIC ic, XPointer client_data,
                                     XIMPreeditCaretCallbackStruct *P_C)
 {
-    FIXME("PreeditCaretCalback %p\n",ic);
+    TRACE("PreeditCaretCallback %p\n",ic);
+
+    if (P_C)
+    {
+        int pos = pImmGetCompositionString(root_context, GCS_CURSORPOS, NULL, 0);
+        TRACE("pos: %d\n", pos);
+        switch(P_C->direction)
+        {
+            case XIMForwardChar:
+            case XIMForwardWord:
+                pos++;
+                break;
+            case XIMBackwardChar:
+            case XIMBackwardWord:
+                pos--;
+                break;
+            case XIMLineStart:
+                pos = 0;
+                break;
+            case XIMAbsolutePosition:
+                pos = P_C->position;
+                break;
+            case XIMDontChange:
+                P_C->position = pos;
+                return;
+            case XIMCaretUp:
+            case XIMCaretDown:
+            case XIMPreviousLine:
+            case XIMNextLine:
+            case XIMLineEnd:
+                FIXME("Not implemented\n");
+                break;
+        }
+        SendMessageW(((InputContextData*)root_context)->IMC.hWnd,
+                     EM_SETSEL, pos, pos);
+        P_C->position = pos;
+    }
+    TRACE("Finished\n");
 }
 
 void X11DRV_ForceXIMReset(HWND hwnd)




More information about the wine-cvs mailing list