mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-02 12:33:41 +00:00
winemac: Use the ImeProcessKey driver entry to process IME input.
This commit is contained in:
parent
c7dc10b192
commit
f185dc1701
|
@ -302,6 +302,7 @@ static const struct user_driver_funcs macdrv_funcs =
|
|||
.pUpdateClipboard = macdrv_UpdateClipboard,
|
||||
.pUpdateLayeredWindow = macdrv_UpdateLayeredWindow,
|
||||
.pVkKeyScanEx = macdrv_VkKeyScanEx,
|
||||
.pImeProcessKey = macdrv_ImeProcessKey,
|
||||
.pNotifyIMEStatus = macdrv_NotifyIMEStatus,
|
||||
.pWindowMessage = macdrv_WindowMessage,
|
||||
.pWindowPosChanged = macdrv_WindowPosChanged,
|
||||
|
|
|
@ -121,18 +121,6 @@ static BOOL UnlockRealIMC(HIMC hIMC)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static HIMCC ImeCreateBlankCompStr(void)
|
||||
{
|
||||
HIMCC rc;
|
||||
LPCOMPOSITIONSTRING ptr;
|
||||
rc = ImmCreateIMCC(sizeof(COMPOSITIONSTRING));
|
||||
ptr = ImmLockIMCC(rc);
|
||||
memset(ptr, 0, sizeof(COMPOSITIONSTRING));
|
||||
ptr->dwSize = sizeof(COMPOSITIONSTRING);
|
||||
ImmUnlockIMCC(rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int updateField(DWORD origLen, DWORD origOffset, DWORD currentOffset,
|
||||
LPBYTE target, LPBYTE source, DWORD* lenParam,
|
||||
DWORD* offsetParam, BOOL wchars)
|
||||
|
@ -515,59 +503,6 @@ static void UpdateDataInDefaultIMEWindow(INPUTCONTEXT *lpIMC, HWND hwnd, BOOL sh
|
|||
ImmUnlockIMCC(lpIMC->hCompStr);
|
||||
}
|
||||
|
||||
BOOL WINAPI ImeProcessKey(HIMC hIMC, UINT vKey, LPARAM lKeyData, const LPBYTE lpbKeyState)
|
||||
{
|
||||
struct process_text_input_params params =
|
||||
{
|
||||
.himc = (UINT_PTR)hIMC, .vkey = LOWORD(vKey), .scan = HIWORD(lKeyData),
|
||||
.repeat = !!(lKeyData >> 30), .key_state = lpbKeyState,
|
||||
};
|
||||
LPINPUTCONTEXT lpIMC;
|
||||
BOOL inIME;
|
||||
UINT ret;
|
||||
|
||||
TRACE("hIMC %p vKey 0x%04x lKeyData 0x%08Ix lpbKeyState %p\n", hIMC, vKey, lKeyData, lpbKeyState);
|
||||
|
||||
switch (vKey)
|
||||
{
|
||||
case VK_SHIFT:
|
||||
case VK_CONTROL:
|
||||
case VK_CAPITAL:
|
||||
case VK_MENU:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
inIME = MACDRV_CALL(ime_using_input_method, NULL);
|
||||
lpIMC = LockRealIMC(hIMC);
|
||||
if (lpIMC)
|
||||
{
|
||||
LPIMEPRIVATE myPrivate;
|
||||
HWND hwnd = input_context_get_ui_hwnd( lpIMC );
|
||||
myPrivate = ImmLockIMCC(lpIMC->hPrivate);
|
||||
|
||||
if (inIME && !myPrivate->bInternalState)
|
||||
ImmSetOpenStatus(RealIMC(FROM_MACDRV), TRUE);
|
||||
else if (!inIME && myPrivate->bInternalState)
|
||||
{
|
||||
ShowWindow( hwnd, SW_HIDE );
|
||||
ImmDestroyIMCC(lpIMC->hCompStr);
|
||||
lpIMC->hCompStr = ImeCreateBlankCompStr();
|
||||
ImmSetOpenStatus(RealIMC(FROM_MACDRV), FALSE);
|
||||
}
|
||||
|
||||
myPrivate->bInternalState = inIME;
|
||||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||||
}
|
||||
UnlockRealIMC(hIMC);
|
||||
|
||||
if (!inIME) return FALSE;
|
||||
|
||||
TRACE( "Processing Mac 0x%04x\n", vKey );
|
||||
ret = MACDRV_CALL( ime_process_text_input, ¶ms );
|
||||
|
||||
return ret != 0;
|
||||
}
|
||||
|
||||
BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)
|
||||
{
|
||||
LPINPUTCONTEXT lpIMC;
|
||||
|
@ -612,39 +547,16 @@ BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)
|
|||
UINT WINAPI ImeToAsciiEx(UINT uVKey, UINT uScanCode, const LPBYTE lpbKeyState,
|
||||
TRANSMSGLIST *lpdwTransKey, UINT fuState, HIMC hIMC)
|
||||
{
|
||||
UINT vkey;
|
||||
LPINPUTCONTEXT lpIMC;
|
||||
LPIMEPRIVATE myPrivate;
|
||||
HWND hwnd;
|
||||
|
||||
TRACE("uVKey 0x%04x uScanCode 0x%04x fuState %u hIMC %p\n", uVKey, uScanCode, fuState, hIMC);
|
||||
|
||||
vkey = LOWORD(uVKey);
|
||||
|
||||
if (vkey == VK_KANA || vkey == VK_KANJI || vkey == VK_MENU)
|
||||
{
|
||||
TRACE("Skipping metakey\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
lpIMC = LockRealIMC(hIMC);
|
||||
hwnd = input_context_get_ui_hwnd( lpIMC );
|
||||
myPrivate = ImmLockIMCC(lpIMC->hPrivate);
|
||||
if (!myPrivate->bInternalState)
|
||||
{
|
||||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||||
UnlockRealIMC(hIMC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||||
UnlockRealIMC(hIMC);
|
||||
|
||||
/* trigger the pending client_func_ime_set_text call */
|
||||
MACDRV_CALL(ime_get_text_input, NULL);
|
||||
|
||||
if ((lpIMC = LockRealIMC(hIMC)))
|
||||
{
|
||||
HWND hwnd = input_context_get_ui_hwnd( lpIMC );
|
||||
UpdateDataInDefaultIMEWindow( lpIMC, hwnd, FALSE );
|
||||
UnlockRealIMC(hIMC);
|
||||
}
|
||||
|
|
|
@ -1188,19 +1188,29 @@ void macdrv_hotkey_press(const macdrv_event *event)
|
|||
|
||||
|
||||
/***********************************************************************
|
||||
* macdrv_process_text_input
|
||||
* ImeProcessKey (MACDRV.@)
|
||||
*/
|
||||
NTSTATUS macdrv_ime_process_text_input(void *arg)
|
||||
UINT macdrv_ImeProcessKey(HIMC himc, UINT wparam, UINT lparam, const BYTE *key_state)
|
||||
{
|
||||
struct process_text_input_params *params = arg;
|
||||
struct macdrv_thread_data *thread_data = macdrv_thread_data();
|
||||
void *himc = UlongToHandle(params->himc);
|
||||
const BYTE *key_state = params->key_state;
|
||||
WORD scan = HIWORD(lparam) & 0x1ff, vkey = LOWORD(wparam);
|
||||
BOOL repeat = !!(lparam >> 30), pressed = !(lparam >> 31);
|
||||
unsigned int flags;
|
||||
int keyc, done = 0;
|
||||
|
||||
TRACE("vkey 0x%04x scan 0x%04x repeat %u himc %p\n", params->vkey, params->scan,
|
||||
params->repeat, himc);
|
||||
TRACE("himc %p, scan %#x, vkey %#x, repeat %u, pressed %u\n",
|
||||
himc, scan, vkey, repeat, pressed);
|
||||
|
||||
if (!macdrv_using_input_method()) return 0;
|
||||
|
||||
switch (vkey)
|
||||
{
|
||||
case VK_SHIFT:
|
||||
case VK_CONTROL:
|
||||
case VK_CAPITAL:
|
||||
case VK_MENU:
|
||||
return 0;
|
||||
}
|
||||
|
||||
flags = thread_data->last_modifiers;
|
||||
if (key_state[VK_SHIFT] & 0x80)
|
||||
|
@ -1222,14 +1232,13 @@ NTSTATUS macdrv_ime_process_text_input(void *arg)
|
|||
|
||||
/* Find the Mac keycode corresponding to the scan code */
|
||||
for (keyc = 0; keyc < ARRAY_SIZE(thread_data->keyc2vkey); keyc++)
|
||||
if (thread_data->keyc2vkey[keyc] == params->vkey) break;
|
||||
if (thread_data->keyc2vkey[keyc] == vkey) break;
|
||||
|
||||
if (keyc >= ARRAY_SIZE(thread_data->keyc2vkey)) return 0;
|
||||
|
||||
TRACE("flags 0x%08x keyc 0x%04x\n", flags, keyc);
|
||||
|
||||
macdrv_send_text_input_event(((params->scan & 0x8000) == 0), flags, params->repeat, keyc,
|
||||
himc, &done);
|
||||
macdrv_send_text_input_event(pressed, flags, repeat, keyc, himc, &done);
|
||||
while (!done) NtUserMsgWaitForMultipleObjectsEx(0, NULL, INFINITE, QS_POSTMESSAGE | QS_SENDMESSAGE, 0);
|
||||
|
||||
return done > 0;
|
||||
|
|
|
@ -162,6 +162,7 @@ extern void macdrv_WindowPosChanged(HWND hwnd, HWND insert_after, UINT swp_flags
|
|||
extern BOOL macdrv_RegisterHotKey(HWND hwnd, UINT mod_flags, UINT vkey) DECLSPEC_HIDDEN;
|
||||
extern void macdrv_UnregisterHotKey(HWND hwnd, UINT modifiers, UINT vkey) DECLSPEC_HIDDEN;
|
||||
extern SHORT macdrv_VkKeyScanEx(WCHAR wChar, HKL hkl) DECLSPEC_HIDDEN;
|
||||
extern UINT macdrv_ImeProcessKey(HIMC himc, UINT wparam, UINT lparam, const BYTE *state) DECLSPEC_HIDDEN;
|
||||
extern UINT macdrv_MapVirtualKeyEx(UINT wCode, UINT wMapType, HKL hkl) DECLSPEC_HIDDEN;
|
||||
extern INT macdrv_ToUnicodeEx(UINT virtKey, UINT scanCode, const BYTE *lpKeyState,
|
||||
LPWSTR bufW, int bufW_size, UINT flags, HKL hkl) DECLSPEC_HIDDEN;
|
||||
|
@ -277,7 +278,6 @@ extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP
|
|||
extern NTSTATUS macdrv_dnd_have_format(void *arg) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS macdrv_dnd_release(void *arg) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS macdrv_dnd_retain(void *arg) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS macdrv_ime_process_text_input(void *arg) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS macdrv_ime_get_text_input(void *arg) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS macdrv_notify_icon(void *arg) DECLSPEC_HIDDEN;
|
||||
|
||||
|
|
|
@ -607,12 +607,6 @@ NTSTATUS macdrv_client_func(enum macdrv_client_funcs id, const void *params, ULO
|
|||
}
|
||||
|
||||
|
||||
static NTSTATUS macdrv_ime_using_input_method(void *arg)
|
||||
{
|
||||
return macdrv_using_input_method();
|
||||
}
|
||||
|
||||
|
||||
static NTSTATUS macdrv_quit_result(void *arg)
|
||||
{
|
||||
struct quit_result_params *params = arg;
|
||||
|
@ -628,9 +622,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
|
|||
macdrv_dnd_have_format,
|
||||
macdrv_dnd_release,
|
||||
macdrv_dnd_retain,
|
||||
macdrv_ime_process_text_input,
|
||||
macdrv_ime_get_text_input,
|
||||
macdrv_ime_using_input_method,
|
||||
macdrv_init,
|
||||
macdrv_notify_icon,
|
||||
macdrv_quit_result,
|
||||
|
@ -658,26 +650,6 @@ static NTSTATUS wow64_dnd_get_data(void *arg)
|
|||
return macdrv_dnd_get_data(¶ms);
|
||||
}
|
||||
|
||||
static NTSTATUS wow64_ime_process_text_input(void *arg)
|
||||
{
|
||||
struct
|
||||
{
|
||||
UINT himc;
|
||||
UINT vkey;
|
||||
UINT scan;
|
||||
UINT repeat;
|
||||
ULONG key_state;
|
||||
} *params32 = arg;
|
||||
struct process_text_input_params params;
|
||||
|
||||
params.himc = params32->himc;
|
||||
params.vkey = params32->vkey;
|
||||
params.scan = params32->scan;
|
||||
params.repeat = params32->repeat;
|
||||
params.key_state = UlongToPtr(params32->key_state);
|
||||
return macdrv_ime_process_text_input(¶ms);
|
||||
}
|
||||
|
||||
static NTSTATUS wow64_init(void *arg)
|
||||
{
|
||||
struct
|
||||
|
@ -752,9 +724,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
|
|||
macdrv_dnd_have_format,
|
||||
macdrv_dnd_release,
|
||||
macdrv_dnd_retain,
|
||||
wow64_ime_process_text_input,
|
||||
macdrv_ime_get_text_input,
|
||||
macdrv_ime_using_input_method,
|
||||
wow64_init,
|
||||
wow64_notify_icon,
|
||||
macdrv_quit_result,
|
||||
|
|
|
@ -26,9 +26,7 @@
|
|||
unix_dnd_have_format,
|
||||
unix_dnd_release,
|
||||
unix_dnd_retain,
|
||||
unix_ime_process_text_input,
|
||||
unix_ime_get_text_input,
|
||||
unix_ime_using_input_method,
|
||||
unix_init,
|
||||
unix_notify_icon,
|
||||
unix_quit_result,
|
||||
|
@ -60,16 +58,6 @@
|
|||
UINT format;
|
||||
};
|
||||
|
||||
/* macdrv_ime_process_text_input params */
|
||||
struct process_text_input_params
|
||||
{
|
||||
UINT himc;
|
||||
UINT vkey;
|
||||
UINT scan;
|
||||
UINT repeat;
|
||||
const BYTE *key_state;
|
||||
};
|
||||
|
||||
/* macdrv_init params */
|
||||
struct localized_string
|
||||
{
|
||||
|
|
|
@ -2,6 +2,5 @@
|
|||
@ cdecl wine_notify_icon(long ptr)
|
||||
|
||||
# IME
|
||||
@ stdcall ImeProcessKey(long long long ptr)
|
||||
@ stdcall ImeSelect(long long)
|
||||
@ stdcall ImeToAsciiEx(long long ptr ptr long long)
|
||||
|
|
Loading…
Reference in a new issue