Module: wine Branch: master Commit: c52ce9bccc2b6735b73e790f060e31e7544af88b URL: http://source.winehq.org/git/wine.git/?a=commit;h=c52ce9bccc2b6735b73e790f06...
Author: Nigel Liang ncliang@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)