From: Grigory Vasilyev h0tc0d3@gmail.com
--- dlls/win32u/message.c | 1 + server/protocol.def | 1 + server/queue.c | 23 ++++++++++++++++++----- 3 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index b7062414658..a892e641b21 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3495,6 +3495,7 @@ NTSTATUS send_hardware_message( HWND hwnd, UINT flags, const INPUT *input, LPARA req->input.mouse.flags = input->mi.dwFlags; req->input.mouse.time = input->mi.time; req->input.mouse.info = input->mi.dwExtraInfo; + if (flags & SEND_HWMSG_RAWINPUT) req->flags |= SEND_HWMSG_RAWINPUT; break; case INPUT_KEYBOARD: if (input->ki.dwFlags & KEYEVENTF_SCANCODE) diff --git a/server/protocol.def b/server/protocol.def index 11539654dc3..529e6a68f6d 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2197,6 +2197,7 @@ enum message_type int new_y; @END #define SEND_HWMSG_INJECTED 0x01 +#define SEND_HWMSG_RAWINPUT 0x02
/* Get a message from the current queue */ diff --git a/server/queue.c b/server/queue.c index a7814c83737..3c2de10deab 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1827,7 +1827,7 @@ static struct thread *get_foreground_thread( struct desktop *desktop, user_handl #define WINE_KEYBOARD_HANDLE 2
static void rawmouse_init( struct rawinput *header, RAWMOUSE *rawmouse, int x, int y, unsigned int flags, - unsigned int buttons, lparam_t info ) + unsigned int buttons, lparam_t info, unsigned int req_flags ) { static const unsigned int button_flags[] = { @@ -1847,6 +1847,14 @@ static void rawmouse_init( struct rawinput *header, RAWMOUSE *rawmouse, int x, i header->usage = MAKELONG(HID_USAGE_GENERIC_MOUSE, HID_USAGE_PAGE_GENERIC);
rawmouse->usFlags = MOUSE_MOVE_RELATIVE; + + if(req_flags & SEND_HWMSG_RAWINPUT) + { + rawmouse->usFlags = 0; + if (flags & MOUSEEVENTF_ABSOLUTE) rawmouse->usFlags |= MOUSE_MOVE_ABSOLUTE; + if (flags & MOUSEEVENTF_VIRTUALDESK) rawmouse->usFlags |= MOUSE_VIRTUAL_DESKTOP; + } + rawmouse->usButtonFlags = 0; rawmouse->usButtonData = 0; for (i = 1; i < ARRAY_SIZE(button_flags); ++i) @@ -2016,7 +2024,7 @@ static void dispatch_rawinput_message( struct desktop *desktop, struct rawinput_
/* queue a hardware message for a mouse event */ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input, - unsigned int origin, struct msg_queue *sender ) + unsigned int origin, struct msg_queue *sender, unsigned int req_flags ) { const desktop_shm_t *desktop_shm = desktop->shared; struct hardware_msg_data *msg_data; @@ -2085,8 +2093,13 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons raw_msg.time = time; raw_msg.message = WM_INPUT; raw_msg.flags = flags; - rawmouse_init( &raw_msg.rawinput, &raw_msg.data.mouse, x - desktop_shm->cursor.x, y - desktop_shm->cursor.y, - raw_msg.flags, input->mouse.data, input->mouse.info ); + + if(req_flags & SEND_HWMSG_RAWINPUT) + rawmouse_init( &raw_msg.rawinput, &raw_msg.data.mouse, input->mouse.x, input->mouse.y, + raw_msg.flags, input->mouse.data, input->mouse.info, req_flags ); + else + rawmouse_init( &raw_msg.rawinput, &raw_msg.data.mouse, x - desktop_shm->cursor.x, y - desktop_shm->cursor.y, + raw_msg.flags, input->mouse.data, input->mouse.info, req_flags );
dispatch_rawinput_message( desktop, &raw_msg ); release_object( foreground ); @@ -3027,7 +3040,7 @@ DECL_HANDLER(send_hardware_message) switch (req->input.type) { case INPUT_MOUSE: - wait = queue_mouse_message( desktop, req->win, &req->input, origin, sender ); + wait = queue_mouse_message( desktop, req->win, &req->input, origin, sender, req->flags ); break; case INPUT_KEYBOARD: wait = queue_keyboard_message( desktop, req->win, &req->input, origin, sender, 0 );