From: Jacek Caban jacek@codeweavers.com
Signed-off-by: Jacek Caban jacek@codeweavers.com --- dlls/winex11.drv/dllmain.c | 7 +++++ dlls/winex11.drv/ime.c | 58 ++++++++++++++++++++++---------------- dlls/winex11.drv/unixlib.h | 7 +++++ dlls/winex11.drv/x11drv.h | 19 +++++-------- dlls/winex11.drv/xim.c | 27 ++++++++---------- 5 files changed, 66 insertions(+), 52 deletions(-)
diff --git a/dlls/winex11.drv/dllmain.c b/dlls/winex11.drv/dllmain.c index 751b6ec08a4..bbfcefe05e3 100644 --- a/dlls/winex11.drv/dllmain.c +++ b/dlls/winex11.drv/dllmain.c @@ -133,6 +133,11 @@ static const callback_func callback_funcs[] = x11drv_clipboard_init, x11drv_dnd_drop_event, x11drv_dnd_leave_event, + x11drv_ime_get_cursor_pos, + x11drv_ime_set_composition_status, + x11drv_ime_set_cursor_pos, + x11drv_ime_set_open_status, + x11drv_ime_update_association, };
C_ASSERT( ARRAYSIZE(callback_funcs) == client_funcs_count ); @@ -150,6 +155,8 @@ static const kernel_callback kernel_callbacks[] = x11drv_dnd_enter_event, x11drv_dnd_position_event, x11drv_dnd_post_drop, + x11drv_ime_set_composition_string, + x11drv_ime_set_result, };
C_ASSERT( NtUserDriverCallbackFirst + ARRAYSIZE(kernel_callbacks) == client_func_last ); diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c index 1656601577d..b2b61a17604 100644 --- a/dlls/winex11.drv/ime.c +++ b/dlls/winex11.drv/ime.c @@ -916,15 +916,16 @@ DWORD WINAPI ImeGetImeMenuItems(HIMC hIMC, DWORD dwFlags, DWORD dwType,
/* Interfaces to XIM and other parts of winex11drv */
-void IME_SetOpenStatus(BOOL fOpen) +NTSTATUS x11drv_ime_set_open_status( UINT open ) { HIMC imc;
imc = RealIMC(FROM_X11); - ImmSetOpenStatus(imc, fOpen); + ImmSetOpenStatus(imc, open); + return 0; }
-void IME_SetCompositionStatus(BOOL fOpen) +NTSTATUS x11drv_ime_set_composition_status( UINT open ) { HIMC imc; LPINPUTCONTEXT lpIMC; @@ -933,28 +934,29 @@ void IME_SetCompositionStatus(BOOL fOpen) imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) - return; + return 0;
myPrivate = ImmLockIMCC(lpIMC->hPrivate);
- if (fOpen && !myPrivate->bInComposition) + if (open && !myPrivate->bInComposition) { GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0); } - else if (!fOpen && myPrivate->bInComposition) + else if (!open && myPrivate->bInComposition) { ShowWindow(myPrivate->hwndDefault, SW_HIDE); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = ImeCreateBlankCompStr(); GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); } - myPrivate->bInComposition = fOpen; + myPrivate->bInComposition = open;
ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(imc); + return 0; }
-INT IME_GetCursorPos(void) +NTSTATUS x11drv_ime_get_cursor_pos( UINT arg ) { LPINPUTCONTEXT lpIMC; INT rc = 0; @@ -974,68 +976,73 @@ INT IME_GetCursorPos(void) return rc; }
-void IME_SetCursorPos(DWORD pos) +NTSTATUS x11drv_ime_set_cursor_pos( UINT pos ) { LPINPUTCONTEXT lpIMC; LPCOMPOSITIONSTRING compstr;
if (!hSelectedFrom) - return; + return 0;
lpIMC = LockRealIMC(FROM_X11); if (!lpIMC) - return; + return 0;
compstr = ImmLockIMCC(lpIMC->hCompStr); if (!compstr) { UnlockRealIMC(FROM_X11); - return; + return 0; }
compstr->dwCursorPos = pos; ImmUnlockIMCC(lpIMC->hCompStr); UnlockRealIMC(FROM_X11); GenerateIMEMessage(FROM_X11, WM_IME_COMPOSITION, pos, GCS_CURSORPOS); - return; + return 0; }
-void IME_UpdateAssociation(HWND focus) +NTSTATUS x11drv_ime_update_association( UINT arg ) { - ImmGetContext(focus); + HWND focus = UlongToHandle( arg );
- if (!focus || !hSelectedFrom) - return; + ImmGetContext(focus);
- ImmAssociateContext(focus,RealIMC(FROM_X11)); + if (focus && hSelectedFrom) + ImmAssociateContext(focus,RealIMC(FROM_X11)); + return 0; }
-BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp, DWORD dwCompLen, - LPCVOID lpRead, DWORD dwReadLen) +NTSTATUS WINAPI x11drv_ime_set_composition_string( void *param, ULONG size ) { - return ImeSetCompositionString(FROM_X11, dwIndex, lpComp, dwCompLen, - lpRead, dwReadLen); + return ImeSetCompositionString(FROM_X11, SCS_SETSTR, param, size, NULL, 0); }
-void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen) +NTSTATUS WINAPI x11drv_ime_set_result( void *params, ULONG len ) { + WCHAR *lpResult = params; HIMC imc; LPINPUTCONTEXT lpIMC; HIMCC newCompStr; LPIMEPRIVATE myPrivate; BOOL inComp; + HWND focus; + + len /= sizeof(WCHAR); + if ((focus = GetFocus())) + x11drv_ime_update_association( HandleToUlong( focus ));
imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) - return; + return 0;
newCompStr = updateCompStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr;
- newCompStr = updateResultStr(lpIMC->hCompStr, lpResult, dwResultLen); + newCompStr = updateResultStr(lpIMC->hCompStr, lpResult, len); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr;
@@ -1057,6 +1064,7 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen) ImmSetOpenStatus(imc, FALSE);
ImmUnlockIMC(imc); + return 0; }
/***** diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h index ec5f75a1697..fe3b430dc87 100644 --- a/dlls/winex11.drv/unixlib.h +++ b/dlls/winex11.drv/unixlib.h @@ -75,6 +75,8 @@ enum x11drv_client_funcs client_func_dnd_enter_event, client_func_dnd_position_event, client_func_dnd_post_drop, + client_func_ime_set_composition_string, + client_func_ime_set_result, client_func_last };
@@ -86,6 +88,11 @@ enum client_callback client_clipboard_init, client_dnd_drop_event, client_dnd_leave_event, + client_ime_get_cursor_pos, + client_ime_set_composition_status, + client_ime_set_cursor_pos, + client_ime_set_open_status, + client_ime_update_association, client_funcs_count };
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 02eb67c9cc2..3986733782a 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -284,18 +284,6 @@ extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void) DECLSPEC_HIDDEN; extern struct opengl_funcs *get_glx_driver(UINT) DECLSPEC_HIDDEN; extern const struct vulkan_funcs *get_vulkan_driver(UINT) DECLSPEC_HIDDEN;
-/* IME support */ -extern void IME_SetOpenStatus(BOOL fOpen) DECLSPEC_HIDDEN; -extern void IME_SetCompositionStatus(BOOL fOpen) DECLSPEC_HIDDEN; -extern INT IME_GetCursorPos(void) DECLSPEC_HIDDEN; -extern void IME_SetCursorPos(DWORD pos) DECLSPEC_HIDDEN; -extern void IME_UpdateAssociation(HWND focus) DECLSPEC_HIDDEN; -extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp, - DWORD dwCompLen, LPCVOID lpRead, - DWORD dwReadLen) DECLSPEC_HIDDEN; -extern void IME_SetResultString(LPWSTR lpResult, DWORD dwResultlen) DECLSPEC_HIDDEN; - - extern struct format_entry *import_xdnd_selection( Display *display, Window win, Atom selection, Atom *targets, UINT count, size_t *size ) DECLSPEC_HIDDEN; @@ -849,9 +837,16 @@ extern NTSTATUS x11drv_xim_reset( void *arg ) DECLSPEC_HIDDEN; extern NTSTATUS WINAPI x11drv_dnd_enter_event( void *params, ULONG size ) DECLSPEC_HIDDEN; extern NTSTATUS WINAPI x11drv_dnd_position_event( void *params, ULONG size ) DECLSPEC_HIDDEN; extern NTSTATUS WINAPI x11drv_dnd_post_drop( void *data, ULONG size ) DECLSPEC_HIDDEN; +extern NTSTATUS WINAPI x11drv_ime_set_composition_string( void *params, ULONG size ) DECLSPEC_HIDDEN; +extern NTSTATUS WINAPI x11drv_ime_set_result( void *params, ULONG size ) DECLSPEC_HIDDEN;
extern NTSTATUS x11drv_dnd_drop_event( UINT arg ) DECLSPEC_HIDDEN; extern NTSTATUS x11drv_dnd_leave_event( UINT arg ) DECLSPEC_HIDDEN; +extern NTSTATUS x11drv_ime_get_cursor_pos( UINT arg ) DECLSPEC_HIDDEN; +extern NTSTATUS x11drv_ime_set_composition_status( UINT arg ) DECLSPEC_HIDDEN; +extern NTSTATUS x11drv_ime_set_cursor_pos( UINT pos ) DECLSPEC_HIDDEN; +extern NTSTATUS x11drv_ime_set_open_status( UINT open ) DECLSPEC_HIDDEN; +extern NTSTATUS x11drv_ime_update_association( UINT arg ) DECLSPEC_HIDDEN;
extern NTSTATUS x11drv_client_func( enum x11drv_client_funcs func, const void *params, diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c index 4b63a24cccf..595fb31fe0b 100644 --- a/dlls/winex11.drv/xim.c +++ b/dlls/winex11.drv/xim.c @@ -89,25 +89,21 @@ static void X11DRV_ImmSetInternalString(DWORD dwOffset, if (lpComp) memcpy(ptr_new, lpComp, byte_length); dwCompStringLength += byte_expansion;
- IME_SetCompositionString(SCS_SETSTR, CompositionString, - dwCompStringLength, NULL, 0); + x11drv_client_func( client_func_ime_set_composition_string, + CompositionString, dwCompStringLength ); }
void X11DRV_XIMLookupChars( const char *str, DWORD count ) { WCHAR *output; DWORD len; - HWND focus;
TRACE("%p %u\n", str, count);
if (!(output = malloc( count * sizeof(WCHAR) ))) return; len = ntdll_umbstowcs( str, count, output, count );
- if ((focus = GetFocus())) - IME_UpdateAssociation(focus); - - IME_SetResultString( output, len ); + x11drv_client_func( client_func_ime_set_result, output, len * sizeof(WCHAR) ); free( output ); }
@@ -120,21 +116,22 @@ static BOOL XIMPreEditStateNotifyCallback(XIC xic, XPointer p, XPointer data) switch (state) { case XIMPreeditEnable: - IME_SetOpenStatus(TRUE); + x11drv_client_call( client_ime_set_open_status, TRUE ); break; case XIMPreeditDisable: - IME_SetOpenStatus(FALSE); + x11drv_client_call( client_ime_set_open_status, FALSE ); break; default: break; } + return TRUE; }
static int XIMPreEditStartCallback(XIC ic, XPointer client_data, XPointer call_data) { TRACE("PreEditStartCallback %p\n",ic); - IME_SetCompositionStatus(TRUE); + x11drv_client_call( client_ime_set_composition_status, TRUE ); ximInComposeMode = TRUE; return -1; } @@ -148,7 +145,7 @@ static void XIMPreEditDoneCallback(XIC ic, XPointer client_data, XPointer call_d dwCompStringSize = 0; dwCompStringLength = 0; CompositionString = NULL; - IME_SetCompositionStatus(FALSE); + x11drv_client_call( client_ime_set_composition_status, FALSE ); }
static void XIMPreEditDrawCallback(XIM ic, XPointer client_data, @@ -188,7 +185,7 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data, } else X11DRV_ImmSetInternalString (sel, len, NULL, 0); - IME_SetCursorPos(P_DR->caret); + x11drv_client_call( client_ime_set_cursor_pos, P_DR->caret ); } TRACE("Finished\n"); } @@ -200,7 +197,7 @@ static void XIMPreEditCaretCallback(XIC ic, XPointer client_data,
if (P_C) { - int pos = IME_GetCursorPos(); + int pos = x11drv_client_call( client_ime_get_cursor_pos, 0 ); TRACE("pos: %d\n", pos); switch(P_C->direction) { @@ -229,7 +226,7 @@ static void XIMPreEditCaretCallback(XIC ic, XPointer client_data, FIXME("Not implemented\n"); break; } - IME_SetCursorPos(pos); + x11drv_client_call( client_ime_set_cursor_pos, pos ); P_C->position = pos; } TRACE("Finished\n"); @@ -423,7 +420,7 @@ static BOOL open_xim( Display *display ) else thread_data->font_set = NULL;
- IME_UpdateAssociation(NULL); + x11drv_client_call( client_ime_update_association, 0 ); return TRUE; }