Commit c52ce9bc authored by Nigel Liang's avatar Nigel Liang Committed by Alexandre Julliard

winex11.drv: Implement XIMPreEditCaretCallback.

parent 937432ac
...@@ -1032,6 +1032,8 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, ...@@ -1032,6 +1032,8 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
break; break;
case WM_IME_COMPOSITION: case WM_IME_COMPOSITION:
{
int caret_pos = es->selection_end;
if (es->composition_len == 0) if (es->composition_len == 0)
{ {
if (es->selection_start != es->selection_end) if (es->selection_start != es->selection_end)
...@@ -1043,7 +1045,9 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, ...@@ -1043,7 +1045,9 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
es->composition_start = es->selection_end; es->composition_start = es->selection_end;
} }
EDIT_ImeComposition(hwnd,lParam,es); EDIT_ImeComposition(hwnd,lParam,es);
EDIT_SetCaretPos(es, caret_pos, es->flags & EF_AFTER_WRAP);
break; break;
}
case WM_IME_ENDCOMPOSITION: case WM_IME_ENDCOMPOSITION:
es->composition_len= 0; es->composition_len= 0;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "winnls.h" #include "winnls.h"
#include "x11drv.h" #include "x11drv.h"
#include "imm.h" #include "imm.h"
#include "ddk/imm.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(x11drv); WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
...@@ -39,6 +40,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv); ...@@ -39,6 +40,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
BOOL ximInComposeMode=FALSE; BOOL ximInComposeMode=FALSE;
typedef struct tagInputContextData
{
BOOL bInternalState;
BOOL bRead;
BOOL bInComposition;
HFONT textfont;
DWORD dwLock;
INPUTCONTEXT IMC;
} InputContextData;
static HIMC root_context; static HIMC root_context;
static XIMStyle ximStyle = 0; static XIMStyle ximStyle = 0;
static XIMStyle ximStyleRoot = 0; static XIMStyle ximStyleRoot = 0;
...@@ -56,6 +68,7 @@ static HIMC (WINAPI *pImmCreateContext)(void); ...@@ -56,6 +68,7 @@ static HIMC (WINAPI *pImmCreateContext)(void);
static VOID (WINAPI *pImmSetOpenStatus)(HIMC,BOOL); static VOID (WINAPI *pImmSetOpenStatus)(HIMC,BOOL);
static BOOL (WINAPI *pImmSetCompositionString)(HIMC, DWORD, LPWSTR, static BOOL (WINAPI *pImmSetCompositionString)(HIMC, DWORD, LPWSTR,
DWORD, LPWSTR, DWORD); DWORD, LPWSTR, DWORD);
static LONG (WINAPI *pImmGetCompositionString)(HIMC, DWORD, LPVOID, DWORD);
static VOID (WINAPI *pImmNotifyIME)(HIMC, DWORD, DWORD, DWORD); static VOID (WINAPI *pImmNotifyIME)(HIMC, DWORD, DWORD, DWORD);
/* WINE specific messages from the xim in x11drv level */ /* WINE specific messages from the xim in x11drv level */
...@@ -92,6 +105,11 @@ static void LoadImmDll(void) ...@@ -92,6 +105,11 @@ static void LoadImmDll(void)
if (!pImmSetCompositionString) if (!pImmSetCompositionString)
WARN("IMM: pImmSetCompositionStringW not found in DLL\n"); 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"); pImmNotifyIME = (void *)GetProcAddress( hImmDll, "ImmNotifyIME");
if (!pImmNotifyIME) if (!pImmNotifyIME)
...@@ -310,7 +328,44 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data, ...@@ -310,7 +328,44 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data,
static void XIMPreEditCaretCallback(XIC ic, XPointer client_data, static void XIMPreEditCaretCallback(XIC ic, XPointer client_data,
XIMPreeditCaretCallbackStruct *P_C) 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) void X11DRV_ForceXIMReset(HWND hwnd)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment