[PATCH 4/4] winemac: Use unixlib interface for IME calls.

Jacek Caban wine at gitlab.winehq.org
Wed Jun 1 08:16:02 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/winemac.drv/ime.c         | 11 +++++++++--
 dlls/winemac.drv/keyboard.c    | 17 +++++++++++------
 dlls/winemac.drv/macdrv.h      |  3 +--
 dlls/winemac.drv/macdrv_main.c |  8 ++++++++
 dlls/winemac.drv/unixlib.h     | 13 +++++++++++++
 5 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/dlls/winemac.drv/ime.c b/dlls/winemac.drv/ime.c
index 8b89c0089fc..d1d2002fc47 100644
--- a/dlls/winemac.drv/ime.c
+++ b/dlls/winemac.drv/ime.c
@@ -577,7 +577,7 @@ BOOL WINAPI ImeProcessKey(HIMC hIMC, UINT vKey, LPARAM lKeyData, const LPBYTE lp
         return FALSE;
     }
 
-    inIME = macdrv_using_input_method();
+    inIME = MACDRV_CALL(ime_using_input_method, NULL);
     lpIMC = LockRealIMC(hIMC);
     if (lpIMC)
     {
@@ -658,6 +658,7 @@ BOOL WINAPI ImeSetActiveContext(HIMC hIMC, BOOL fFlag)
 UINT WINAPI ImeToAsciiEx(UINT uVKey, UINT uScanCode, const LPBYTE lpbKeyState,
                          LPDWORD lpdwTransKey, UINT fuState, HIMC hIMC)
 {
+    struct process_text_input_params params;
     UINT vkey;
     LPINPUTCONTEXT lpIMC;
     LPIMEPRIVATE myPrivate;
@@ -690,7 +691,13 @@ UINT WINAPI ImeToAsciiEx(UINT uVKey, UINT uScanCode, const LPBYTE lpbKeyState,
     UnlockRealIMC(hIMC);
 
     TRACE("Processing Mac 0x%04x\n", vkey);
-    macdrv_process_text_input(uVKey, uScanCode, repeat, lpbKeyState, hIMC, &done);
+    params.vkey = uVKey;
+    params.scan = uScanCode;
+    params.repeat = repeat;
+    params.key_state = lpbKeyState;
+    params.himc = hIMC;
+    params.done = &done;
+    MACDRV_CALL(ime_process_text_input, &params);
 
     while (!done)
         MsgWaitForMultipleObjectsEx(0, NULL, INFINITE, QS_POSTMESSAGE | QS_SENDMESSAGE, 0);
diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
index 9574b2797b5..181e86afd4a 100644
--- a/dlls/winemac.drv/keyboard.c
+++ b/dlls/winemac.drv/keyboard.c
@@ -1187,13 +1187,16 @@ void macdrv_hotkey_press(const macdrv_event *event)
 /***********************************************************************
  *              macdrv_process_text_input
  */
-void macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *key_state, void *himc, int* done)
+NTSTATUS macdrv_ime_process_text_input(void *arg)
 {
+    struct process_text_input_params *params = arg;
     struct macdrv_thread_data *thread_data = macdrv_thread_data();
+    const BYTE *key_state = params->key_state;
     unsigned int flags;
     int keyc;
 
-    TRACE("vkey 0x%04x scan 0x%04x repeat %u himc %p\n", vkey, scan, repeat, himc);
+    TRACE("vkey 0x%04x scan 0x%04x repeat %u himc %p\n", params->vkey, params->scan,
+          params->repeat, params->himc);
 
     flags = thread_data->last_modifiers;
     if (key_state[VK_SHIFT] & 0x80)
@@ -1215,17 +1218,19 @@ void macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *ke
 
     /* Find the Mac keycode corresponding to the scan code */
     for (keyc = 0; keyc < ARRAY_SIZE(thread_data->keyc2vkey); keyc++)
-        if (thread_data->keyc2vkey[keyc] == vkey) break;
+        if (thread_data->keyc2vkey[keyc] == params->vkey) break;
 
     if (keyc >= ARRAY_SIZE(thread_data->keyc2vkey))
     {
-        *done = -1;
-        return;
+        *params->done = -1;
+        return 0;
     }
 
     TRACE("flags 0x%08x keyc 0x%04x\n", flags, keyc);
 
-    macdrv_send_text_input_event(((scan & 0x8000) == 0), flags, repeat, keyc, himc, done);
+    macdrv_send_text_input_event(((params->scan & 0x8000) == 0), flags, params->repeat, keyc,
+                                 params->himc, params->done);
+    return 0;
 }
 
 
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index a4736b2d315..2ea6cd638c3 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -287,8 +287,7 @@ extern NTSTATUS macdrv_init(void *arg) DECLSPEC_HIDDEN;
  * Mac IME driver
  */
 
-extern void macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *key_state,
-                                      void *himc, int* done) DECLSPEC_HIDDEN;
+extern NTSTATUS macdrv_ime_process_text_input(void *arg) DECLSPEC_HIDDEN;
 
 extern void macdrv_im_set_text(const macdrv_event *event) DECLSPEC_HIDDEN;
 extern void macdrv_sent_text_input(const macdrv_event *event) DECLSPEC_HIDDEN;
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index 6ab7b108909..4a183747796 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -607,8 +607,16 @@ BOOL macdrv_SystemParametersInfo( UINT action, UINT int_param, void *ptr_param,
 }
 
 
+static NTSTATUS macdrv_ime_using_input_method(void *arg)
+{
+    return macdrv_using_input_method();
+}
+
+
 const unixlib_entry_t __wine_unix_call_funcs[] =
 {
+    macdrv_ime_process_text_input,
+    macdrv_ime_using_input_method,
     macdrv_init,
     macdrv_notify_icon,
 };
diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h
index c24f8192142..dc1b314c8cb 100644
--- a/dlls/winemac.drv/unixlib.h
+++ b/dlls/winemac.drv/unixlib.h
@@ -21,6 +21,8 @@
 
 enum macdrv_funcs
 {
+    unix_ime_process_text_input,
+    unix_ime_using_input_method,
     unix_init,
     unix_notify_icon,
     unix_funcs_count
@@ -30,6 +32,17 @@ enum macdrv_funcs
 extern NTSTATUS unix_call(enum macdrv_funcs code, void *params) DECLSPEC_HIDDEN;
 #define MACDRV_CALL(func, params) unix_call( unix_ ## func, params )
 
+/* macdrv_ime_process_text_input params */
+struct process_text_input_params
+{
+    UINT vkey;
+    UINT scan;
+    UINT repeat;
+    const BYTE *key_state;
+    void *himc;
+    int *done;
+};
+
 /* macdrv_init params */
 struct localized_string
 {
-- 
GitLab

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



More information about the wine-devel mailing list