Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/user32/input.c | 16 ++++++++++------ include/winuser.h | 10 ++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c index dfb6bf7f646..e510b2669fc 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -179,11 +179,13 @@ static void update_mouse_coords( INPUT *input ) */ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size ) { + WINEINPUT tmp; NTSTATUS status = STATUS_SUCCESS; - INPUT tmp; + BOOL internal; UINT i;
- if (size != sizeof(INPUT)) + internal = count && inputs && inputs[0].type & INPUT_WINE; + if (size != (internal ? sizeof(WINEINPUT) : sizeof(INPUT))) { SetLastError( ERROR_INVALID_PARAMETER ); return 0; @@ -203,16 +205,18 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
for (i = 0; i < count; i++) { - tmp = inputs[i]; + memcpy( &tmp, (char *)inputs + i * size, size ); + if (!(tmp.input.type & INPUT_WINE)) tmp.hwnd = 0; + tmp.input.type &= ~INPUT_WINE;
- switch (tmp.type) + switch (tmp.input.type) { case INPUT_MOUSE: /* we need to update the coordinates to what the server expects */ - update_mouse_coords( &tmp ); + update_mouse_coords( &tmp.input ); /* fallthrough */ case INPUT_KEYBOARD: - status = send_hardware_message( 0, &tmp, SEND_HWMSG_INJECTED ); + status = send_hardware_message( tmp.hwnd, &tmp.input, internal ? 0 : SEND_HWMSG_INJECTED ); break; case INPUT_HARDWARE: SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); diff --git a/include/winuser.h b/include/winuser.h index 53661f6c788..2072f047165 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -477,6 +477,16 @@ typedef struct tagINPUT } DUMMYUNIONNAME; } INPUT, *PINPUT, *LPINPUT;
+#ifdef __WINESRC__ +/* extension to send hardware input from drivers */ +#define INPUT_WINE 0x80000000 +typedef struct +{ + INPUT input; + HWND hwnd; +} WINEINPUT; +#endif /* __WINESRC__ */ + DECLARE_HANDLE(HRAWINPUT);
typedef struct tagRAWINPUTDEVICELIST