Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
f185dc17
Commit
f185dc17
authored
May 02, 2023
by
Rémi Bernon
Committed by
Alexandre Julliard
May 12, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winemac: Use the ImeProcessKey driver entry to process IME input.
parent
c7dc10b1
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
22 additions
and
143 deletions
+22
-143
gdi.c
dlls/winemac.drv/gdi.c
+1
-0
ime.c
dlls/winemac.drv/ime.c
+1
-89
keyboard.c
dlls/winemac.drv/keyboard.c
+19
-10
macdrv.h
dlls/winemac.drv/macdrv.h
+1
-1
macdrv_main.c
dlls/winemac.drv/macdrv_main.c
+0
-30
unixlib.h
dlls/winemac.drv/unixlib.h
+0
-12
winemac.drv.spec
dlls/winemac.drv/winemac.drv.spec
+0
-1
No files found.
dlls/winemac.drv/gdi.c
View file @
f185dc17
...
...
@@ -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
,
...
...
dlls/winemac.drv/ime.c
View file @
f185dc17
...
...
@@ -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
,
&
params
);
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
);
}
...
...
dlls/winemac.drv/keyboard.c
View file @
f185dc17
...
...
@@ -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
;
...
...
dlls/winemac.drv/macdrv.h
View file @
f185dc17
...
...
@@ -162,6 +162,7 @@ extern BOOL macdrv_SetCursorPos(INT x, INT y) DECLSPEC_HIDDEN;
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 NTSTATUS macdrv_dnd_get_formats(void *arg) DECLSPEC_HIDDEN;
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
;
...
...
dlls/winemac.drv/macdrv_main.c
View file @
f185dc17
...
...
@@ -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
(
&
params
);
}
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
(
&
params
);
}
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
,
...
...
dlls/winemac.drv/unixlib.h
View file @
f185dc17
...
...
@@ -26,9 +26,7 @@ enum macdrv_funcs
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 @@ struct dnd_have_format_params
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
{
...
...
dlls/winemac.drv/winemac.drv.spec
View file @
f185dc17
...
...
@@ -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)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment