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