[PATCH v2 2/9] winex11: Use unixlib interface for IME calls.

Jacek Caban wine at gitlab.winehq.org
Thu May 5 08:42:37 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at 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;
 }
 
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/39



More information about the wine-devel mailing list