From bb8d1ca672b545900d6916a3716e71a39fcf3565 Mon Sep 17 00:00:00 2001 From: Kusanagi Kouichi Date: Fri, 18 Apr 2008 09:48:31 +0900 Subject: [PATCH] winex11: Update caret position. --- dlls/winex11.drv/ime.c | 26 ++++++++++++++++++++++++++ dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/xim.c | 7 ++----- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c index a1c229ef46e..e4a2dd764cc 100644 --- a/dlls/winex11.drv/ime.c +++ b/dlls/winex11.drv/ime.c @@ -1012,6 +1012,32 @@ INT IME_GetCursorPos() return rc; } +void IME_SetCursorPos(DWORD pos) +{ + LPINPUTCONTEXT lpIMC; + LPCOMPOSITIONSTRING compstr; + + if (!hSelectedFrom) + return; + + lpIMC = LockRealIMC(FROM_X11); + if (!lpIMC) + return; + + compstr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); + if (!compstr) + { + UnlockRealIMC(FROM_X11); + return; + } + + compstr->dwCursorPos = pos; + ImmUnlockIMCC(lpIMC->hCompStr); + UnlockRealIMC(FROM_X11); + GenerateIMEMessage(FROM_X11, WM_IME_COMPOSITION, pos, GCS_CURSORPOS); + return; +} + void IME_UpdateAssociation(HWND focus) { ImmGetContext(focus); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 30b339e0e0e..90a2abd9643 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -280,6 +280,7 @@ extern void IME_SetOpenStatus(BOOL fOpen); extern void IME_XIMPresent(BOOL present); extern LRESULT IME_SendMessageToSelectedHWND(UINT msg, WPARAM wParam, LPARAM lParam); extern INT IME_GetCursorPos(); +extern void IME_SetCursorPos(DWORD pos); extern void IME_UpdateAssociation(HWND focus); extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp, DWORD dwCompLen, LPCVOID lpRead, diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c index e8bf3bbdc43..265f9c80608 100644 --- a/dlls/winex11.drv/xim.c +++ b/dlls/winex11.drv/xim.c @@ -48,7 +48,6 @@ static LPBYTE CompositionString = NULL; static DWORD dwCompStringSize = 0; static LPBYTE ResultString = NULL; static DWORD dwResultStringSize = 0; -static DWORD dwPreeditPos = 0; #define STYLE_OFFTHESPOT (XIMPreeditArea | XIMStatusArea) #define STYLE_OVERTHESPOT (XIMPreeditPosition | XIMStatusNothing) @@ -216,7 +215,6 @@ static int XIMPreEditStartCallback(XIC ic, XPointer client_data, XPointer call_d TRACE("PreEditStartCallback %p\n",ic); X11DRV_ImmSetOpenStatus(TRUE); ximInComposeMode = TRUE; - IME_SendMessageToSelectedHWND(EM_GETSEL, 0, (LPARAM)&dwPreeditPos); return -1; } @@ -225,7 +223,6 @@ static void XIMPreEditDoneCallback(XIC ic, XPointer client_data, XPointer call_d TRACE("PreeditDoneCallback %p\n",ic); ximInComposeMode = FALSE; X11DRV_ImmSetOpenStatus(FALSE); - dwPreeditPos = 0; } static void XIMPreEditDrawCallback(XIM ic, XPointer client_data, @@ -271,6 +268,7 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data, } else X11DRV_ImmSetInternalString (GCS_COMPSTR, sel, len, NULL, 0); + IME_SetCursorPos(P_DR->caret); } TRACE("Finished\n"); } @@ -311,8 +309,7 @@ static void XIMPreEditCaretCallback(XIC ic, XPointer client_data, FIXME("Not implemented\n"); break; } - IME_SendMessageToSelectedHWND( EM_SETSEL, dwPreeditPos + pos, - dwPreeditPos + pos); + IME_SetCursorPos(pos); P_C->position = pos; } TRACE("Finished\n");