winex11: Update caret position.

This commit is contained in:
Kusanagi Kouichi 2008-04-18 09:48:31 +09:00 committed by Alexandre Julliard
parent d79dff4e30
commit bb8d1ca672
3 changed files with 29 additions and 5 deletions

View File

@ -1012,6 +1012,32 @@ INT IME_GetCursorPos()
return rc; 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) void IME_UpdateAssociation(HWND focus)
{ {
ImmGetContext(focus); ImmGetContext(focus);

View File

@ -280,6 +280,7 @@ extern void IME_SetOpenStatus(BOOL fOpen);
extern void IME_XIMPresent(BOOL present); extern void IME_XIMPresent(BOOL present);
extern LRESULT IME_SendMessageToSelectedHWND(UINT msg, WPARAM wParam, LPARAM lParam); extern LRESULT IME_SendMessageToSelectedHWND(UINT msg, WPARAM wParam, LPARAM lParam);
extern INT IME_GetCursorPos(); extern INT IME_GetCursorPos();
extern void IME_SetCursorPos(DWORD pos);
extern void IME_UpdateAssociation(HWND focus); extern void IME_UpdateAssociation(HWND focus);
extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp, extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp,
DWORD dwCompLen, LPCVOID lpRead, DWORD dwCompLen, LPCVOID lpRead,

View File

@ -48,7 +48,6 @@ static LPBYTE CompositionString = NULL;
static DWORD dwCompStringSize = 0; static DWORD dwCompStringSize = 0;
static LPBYTE ResultString = NULL; static LPBYTE ResultString = NULL;
static DWORD dwResultStringSize = 0; static DWORD dwResultStringSize = 0;
static DWORD dwPreeditPos = 0;
#define STYLE_OFFTHESPOT (XIMPreeditArea | XIMStatusArea) #define STYLE_OFFTHESPOT (XIMPreeditArea | XIMStatusArea)
#define STYLE_OVERTHESPOT (XIMPreeditPosition | XIMStatusNothing) #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); TRACE("PreEditStartCallback %p\n",ic);
X11DRV_ImmSetOpenStatus(TRUE); X11DRV_ImmSetOpenStatus(TRUE);
ximInComposeMode = TRUE; ximInComposeMode = TRUE;
IME_SendMessageToSelectedHWND(EM_GETSEL, 0, (LPARAM)&dwPreeditPos);
return -1; return -1;
} }
@ -225,7 +223,6 @@ static void XIMPreEditDoneCallback(XIC ic, XPointer client_data, XPointer call_d
TRACE("PreeditDoneCallback %p\n",ic); TRACE("PreeditDoneCallback %p\n",ic);
ximInComposeMode = FALSE; ximInComposeMode = FALSE;
X11DRV_ImmSetOpenStatus(FALSE); X11DRV_ImmSetOpenStatus(FALSE);
dwPreeditPos = 0;
} }
static void XIMPreEditDrawCallback(XIM ic, XPointer client_data, static void XIMPreEditDrawCallback(XIM ic, XPointer client_data,
@ -271,6 +268,7 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data,
} }
else else
X11DRV_ImmSetInternalString (GCS_COMPSTR, sel, len, NULL, 0); X11DRV_ImmSetInternalString (GCS_COMPSTR, sel, len, NULL, 0);
IME_SetCursorPos(P_DR->caret);
} }
TRACE("Finished\n"); TRACE("Finished\n");
} }
@ -311,8 +309,7 @@ static void XIMPreEditCaretCallback(XIC ic, XPointer client_data,
FIXME("Not implemented\n"); FIXME("Not implemented\n");
break; break;
} }
IME_SendMessageToSelectedHWND( EM_SETSEL, dwPreeditPos + pos, IME_SetCursorPos(pos);
dwPreeditPos + pos);
P_C->position = pos; P_C->position = pos;
} }
TRACE("Finished\n"); TRACE("Finished\n");