Mostly split from https://gitlab.winehq.org/wine/wine/-/merge_requests/4946.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/message.c | 3 +-- dlls/win32u/rawinput.c | 3 +-- server/protocol.def | 6 ++---- server/queue.c | 11 ++++++----- server/trace.c | 10 +++++----- 5 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 0cd20684b4e..068f258e103 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3555,8 +3555,7 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r case RIM_TYPEHID: req->input.hw.rawinput.hid.device = HandleToUlong( rawinput->header.hDevice ); req->input.hw.rawinput.hid.param = rawinput->header.wParam; - req->input.hw.rawinput.hid.usage_page = hid_usage_page; - req->input.hw.rawinput.hid.usage = hid_usage; + req->input.hw.rawinput.hid.usage = MAKELONG(hid_usage, hid_usage_page); req->input.hw.rawinput.hid.count = rawinput->data.hid.dwCount; req->input.hw.rawinput.hid.length = rawinput->data.hid.dwSizeHid; wine_server_add_data( req, rawinput->data.hid.bRawData, diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c index e6c442c6ba6..3ea29f2da77 100644 --- a/dlls/win32u/rawinput.c +++ b/dlls/win32u/rawinput.c @@ -899,8 +899,7 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
for (i = 0; i < device_count; ++i) { - server_devices[i].usage_page = registered_devices[i].usUsagePage; - server_devices[i].usage = registered_devices[i].usUsage; + server_devices[i].usage = MAKELONG(registered_devices[i].usUsage, registered_devices[i].usUsagePage); server_devices[i].flags = registered_devices[i].dwFlags; server_devices[i].target = wine_server_user_handle( registered_devices[i].hwndTarget ); } diff --git a/server/protocol.def b/server/protocol.def index 5d60e7fcda3..788e2aecd4d 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -301,8 +301,7 @@ union rawinput int type; /* RIM_TYPEHID */ unsigned int device; /* rawinput device index */ unsigned int param; /* rawinput message param */ - unsigned short usage_page;/* HID usage page */ - unsigned short usage; /* HID usage */ + unsigned int usage; /* HID device usage */ unsigned int count; /* HID report count */ unsigned int length; /* HID report length */ } hid; @@ -878,8 +877,7 @@ typedef struct
struct rawinput_device { - unsigned short usage_page; - unsigned short usage; + unsigned int usage; unsigned int flags; user_handle_t target; }; diff --git a/server/queue.c b/server/queue.c index cd913ae03e5..349ad51e0f6 100644 --- a/server/queue.c +++ b/server/queue.c @@ -35,6 +35,7 @@ #include "winuser.h" #include "winternl.h" #include "ntuser.h" +#include "hidusage.h"
#include "handle.h" #include "file.h" @@ -1637,13 +1638,13 @@ static user_handle_t find_hardware_message_window( struct desktop *desktop, stru return win; }
-static struct rawinput_device *find_rawinput_device( struct process *process, unsigned short usage_page, unsigned short usage ) +static struct rawinput_device *find_rawinput_device( struct process *process, unsigned int usage ) { struct rawinput_device *device, *end;
for (device = process->rawinput_devices, end = device + process->rawinput_device_count; device != end; device++) { - if (device->usage_page != usage_page || device->usage != usage) continue; + if (device->usage != usage) continue; return device; }
@@ -1808,7 +1809,7 @@ static int queue_rawinput_message( struct process* process, void *arg ) else if (raw_msg->data.rawinput.type == RIM_TYPEKEYBOARD) device = process->rawinput_kbd; else - device = find_rawinput_device( process, raw_msg->data.rawinput.hid.usage_page, raw_msg->data.rawinput.hid.usage ); + device = find_rawinput_device( process, raw_msg->data.rawinput.hid.usage ); if (!device) return 0;
if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && !(device->flags & RIDEV_DEVNOTIFY)) return 0; @@ -3505,6 +3506,6 @@ DECL_HANDLER(update_rawinput_devices) process->rawinput_device_count = device_count; memcpy( process->rawinput_devices, devices, size );
- process->rawinput_mouse = find_rawinput_device( process, 1, 2 ); - process->rawinput_kbd = find_rawinput_device( process, 1, 6 ); + process->rawinput_mouse = find_rawinput_device( process, MAKELONG(HID_USAGE_GENERIC_MOUSE, HID_USAGE_PAGE_GENERIC) ); + process->rawinput_kbd = find_rawinput_device( process, MAKELONG(HID_USAGE_GENERIC_KEYBOARD, HID_USAGE_PAGE_GENERIC) ); } diff --git a/server/trace.c b/server/trace.c index 1b65d2b977e..d30ecd8a5a8 100644 --- a/server/trace.c +++ b/server/trace.c @@ -434,9 +434,9 @@ static void dump_rawinput( const char *prefix, const union rawinput *rawinput ) rawinput->kbd.message, rawinput->kbd.vkey, rawinput->kbd.scan ); break; case RIM_TYPEHID: - fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,page=%04hx,usage=%04hx,count=%u,length=%u}", - prefix, rawinput->hid.device, rawinput->hid.param, rawinput->hid.usage_page, - rawinput->hid.usage, rawinput->hid.count, rawinput->hid.length ); + fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,usage=%04x:%04x,count=%u,length=%u}", + prefix, rawinput->hid.device, rawinput->hid.param, HIWORD(rawinput->hid.usage), + LOWORD(rawinput->hid.usage), rawinput->hid.count, rawinput->hid.length ); break; default: fprintf( stderr, "%s{type=%04x}", prefix, rawinput->type ); @@ -1357,8 +1357,8 @@ static void dump_varargs_rawinput_devices(const char *prefix, data_size_t size ) while (size >= sizeof(*device)) { device = cur_data; - fprintf( stderr, "{usage_page=%04x,usage=%04x,flags=%08x,target=%08x}", - device->usage_page, device->usage, device->flags, device->target ); + fprintf( stderr, "{usage=%04x,flags=%08x,target=%08x}", + device->usage, device->flags, device->target ); size -= sizeof(*device); remove_data( sizeof(*device) ); if (size) fputc( ',', stderr );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/message.c | 11 +++++------ server/protocol.def | 11 +++++++++-- server/queue.c | 18 +++++++++--------- server/trace.c | 32 ++++++++------------------------ 4 files changed, 31 insertions(+), 41 deletions(-)
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 068f258e103..08222fd460f 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3549,15 +3549,14 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r { case WM_INPUT: case WM_INPUT_DEVICE_CHANGE: - req->input.hw.rawinput.type = rawinput->header.dwType; switch (rawinput->header.dwType) { case RIM_TYPEHID: - req->input.hw.rawinput.hid.device = HandleToUlong( rawinput->header.hDevice ); - req->input.hw.rawinput.hid.param = rawinput->header.wParam; - req->input.hw.rawinput.hid.usage = MAKELONG(hid_usage, hid_usage_page); - req->input.hw.rawinput.hid.count = rawinput->data.hid.dwCount; - req->input.hw.rawinput.hid.length = rawinput->data.hid.dwSizeHid; + req->input.hw.wparam = rawinput->header.wParam; + req->input.hw.hid.device = HandleToUlong( rawinput->header.hDevice ); + req->input.hw.hid.usage = MAKELONG(hid_usage, hid_usage_page); + req->input.hw.hid.count = rawinput->data.hid.dwCount; + req->input.hw.hid.length = rawinput->data.hid.dwSizeHid; wine_server_add_data( req, rawinput->data.hid.bRawData, rawinput->data.hid.dwCount * rawinput->data.hid.dwSizeHid ); break; diff --git a/server/protocol.def b/server/protocol.def index 788e2aecd4d..97713e0ac91 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -359,8 +359,15 @@ typedef union { int type; /* INPUT_HARDWARE */ unsigned int msg; /* message code */ - lparam_t lparam; /* message param */ - union rawinput rawinput;/* rawinput message data */ + lparam_t wparam; /* parameters */ + lparam_t lparam; /* parameters */ + struct + { + unsigned int device; /* rawinput device index */ + unsigned int usage; /* HID device usage */ + unsigned int count; /* HID report count */ + unsigned int length; /* HID report length */ + } hid; } hw; } hw_input_t;
diff --git a/server/queue.c b/server/queue.c index 349ad51e0f6..dad51e06ceb 100644 --- a/server/queue.c +++ b/server/queue.c @@ -2130,13 +2130,8 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ raw_msg.source = source; raw_msg.time = get_tick_count(); raw_msg.message = input->hw.msg; - - if (input->hw.rawinput.type == RIM_TYPEHID) - { - raw_msg.hid_report = get_req_data(); - report_size = input->hw.rawinput.hid.length * input->hw.rawinput.hid.count; - } - + raw_msg.hid_report = get_req_data(); + report_size = input->hw.hid.length * input->hw.hid.count; if (report_size != get_req_data_size()) { set_error( STATUS_INVALID_PARAMETER ); @@ -2144,8 +2139,13 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ }
msg_data = &raw_msg.data; - msg_data->size = sizeof(*msg_data) + report_size; - msg_data->rawinput = input->hw.rawinput; + msg_data->size = sizeof(*msg_data) + report_size; + msg_data->rawinput.hid.type = RIM_TYPEHID; + msg_data->rawinput.hid.device = input->hw.hid.device; + msg_data->rawinput.hid.param = input->hw.wparam; + msg_data->rawinput.hid.usage = input->hw.hid.usage; + msg_data->rawinput.hid.count = input->hw.hid.count; + msg_data->rawinput.hid.length = input->hw.hid.length;
enum_processes( queue_rawinput_message, &raw_msg ); return; diff --git a/server/trace.c b/server/trace.c index d30ecd8a5a8..c951dc8f9a2 100644 --- a/server/trace.c +++ b/server/trace.c @@ -421,29 +421,6 @@ static void dump_irp_params( const char *prefix, const irp_params_t *data ) } }
-static void dump_rawinput( const char *prefix, const union rawinput *rawinput ) -{ - switch (rawinput->type) - { - case RIM_TYPEMOUSE: - fprintf( stderr, "%s{type=MOUSE,x=%d,y=%d,data=%08x}", prefix, rawinput->mouse.x, - rawinput->mouse.y, rawinput->mouse.data ); - break; - case RIM_TYPEKEYBOARD: - fprintf( stderr, "%s{type=KEYBOARD,message=%04x,vkey=%04hx,scan=%04hx}", prefix, - rawinput->kbd.message, rawinput->kbd.vkey, rawinput->kbd.scan ); - break; - case RIM_TYPEHID: - fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,usage=%04x:%04x,count=%u,length=%u}", - prefix, rawinput->hid.device, rawinput->hid.param, HIWORD(rawinput->hid.usage), - LOWORD(rawinput->hid.usage), rawinput->hid.count, rawinput->hid.length ); - break; - default: - fprintf( stderr, "%s{type=%04x}", prefix, rawinput->type ); - break; - } -} - static void dump_hw_input( const char *prefix, const hw_input_t *input ) { switch (input->type) @@ -463,12 +440,19 @@ static void dump_hw_input( const char *prefix, const hw_input_t *input ) break; case INPUT_HARDWARE: fprintf( stderr, "%s{type=HARDWARE,msg=%04x", prefix, input->hw.msg ); + dump_uint64( ",wparam=", &input->hw.wparam ); dump_uint64( ",lparam=", &input->hw.lparam ); switch (input->hw.msg) { case WM_INPUT: + fprintf( stderr, "%s{type=HID,device=%04x,usage=%04x:%04x,count=%u,length=%u}", + prefix, input->hw.hid.device, HIWORD(input->hw.hid.usage), LOWORD(input->hw.hid.usage), + input->hw.hid.count, input->hw.hid.length ); + break; case WM_INPUT_DEVICE_CHANGE: - dump_rawinput( ",rawinput=", &input->hw.rawinput ); + fprintf( stderr, "%s{type=HID,device=%04x,usage=%04x:%04x}", + prefix, input->hw.hid.device, HIWORD(input->hw.hid.usage), LOWORD(input->hw.hid.usage) ); + break; } fputc( '}', stderr ); break;
From: Rémi Bernon rbernon@codeweavers.com
--- server/protocol.def | 2 +- server/queue.c | 79 +++++++++++++++++++++------------------------ 2 files changed, 38 insertions(+), 43 deletions(-)
diff --git a/server/protocol.def b/server/protocol.def index 97713e0ac91..419cf763063 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -300,7 +300,7 @@ union rawinput { int type; /* RIM_TYPEHID */ unsigned int device; /* rawinput device index */ - unsigned int param; /* rawinput message param */ + unsigned int wparam; /* rawinput message wparam */ unsigned int usage; /* HID device usage */ unsigned int count; /* HID report count */ unsigned int length; /* HID report length */ diff --git a/server/queue.c b/server/queue.c index dad51e06ceb..07870f98711 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1789,7 +1789,9 @@ struct rawinput_message struct hw_msg_source source; unsigned int time; unsigned int message; - struct hardware_msg_data data; + lparam_t info; + unsigned int flags; + union rawinput rawinput; const void *hid_report; };
@@ -1800,16 +1802,17 @@ static int queue_rawinput_message( struct process* process, void *arg ) const struct rawinput_device *device = NULL; struct desktop *target_desktop = NULL, *desktop = NULL; struct thread *target_thread = NULL, *foreground = NULL; + struct hardware_msg_data *msg_data; struct message *msg; data_size_t report_size; int wparam = RIM_INPUT;
- if (raw_msg->data.rawinput.type == RIM_TYPEMOUSE) + if (raw_msg->rawinput.type == RIM_TYPEMOUSE) device = process->rawinput_mouse; - else if (raw_msg->data.rawinput.type == RIM_TYPEKEYBOARD) + else if (raw_msg->rawinput.type == RIM_TYPEKEYBOARD) device = process->rawinput_kbd; else - device = find_rawinput_device( process, raw_msg->data.rawinput.hid.usage ); + device = find_rawinput_device( process, raw_msg->rawinput.hid.usage ); if (!device) return 0;
if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && !(device->flags & RIDEV_DEVNOTIFY)) return 0; @@ -1829,23 +1832,24 @@ static int queue_rawinput_message( struct process* process, void *arg ) wparam = RIM_INPUTSINK; }
- if (raw_msg->data.rawinput.type != RIM_TYPEHID || !raw_msg->hid_report) report_size = 0; - else report_size = raw_msg->data.size - sizeof(raw_msg->data); - - if (!(msg = alloc_hardware_message( raw_msg->data.info, raw_msg->source, raw_msg->time, report_size ))) - goto done; + if (raw_msg->rawinput.type != RIM_TYPEHID || !raw_msg->hid_report) report_size = 0; + else report_size = raw_msg->rawinput.hid.count * raw_msg->rawinput.hid.length;
+ if (!(msg = alloc_hardware_message( raw_msg->info, raw_msg->source, raw_msg->time, report_size ))) goto done; msg->win = device->target; msg->msg = raw_msg->message; msg->wparam = wparam; msg->lparam = 0; - memcpy( msg->data, &raw_msg->data, sizeof(raw_msg->data) ); - if (report_size) memcpy( (struct hardware_msg_data *)msg->data + 1, raw_msg->hid_report, report_size );
- if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && raw_msg->data.rawinput.type == RIM_TYPEHID) + msg_data = msg->data; + msg_data->flags = raw_msg->flags; + msg_data->rawinput = raw_msg->rawinput; + if (report_size) memcpy( msg_data + 1, raw_msg->hid_report, report_size ); + + if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && raw_msg->rawinput.type == RIM_TYPEHID) { - msg->wparam = raw_msg->data.rawinput.hid.param; - msg->lparam = raw_msg->data.rawinput.hid.device; + msg->wparam = raw_msg->rawinput.hid.wparam; + msg->lparam = raw_msg->rawinput.hid.device; }
queue_hardware_message( desktop, msg, 1 ); @@ -1924,14 +1928,12 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons raw_msg.time = time; raw_msg.message = WM_INPUT;
- msg_data = &raw_msg.data; - msg_data->info = input->mouse.info; - msg_data->size = sizeof(*msg_data); - msg_data->flags = flags; - msg_data->rawinput.type = RIM_TYPEMOUSE; - msg_data->rawinput.mouse.x = x - desktop->cursor.x; - msg_data->rawinput.mouse.y = y - desktop->cursor.y; - msg_data->rawinput.mouse.data = input->mouse.data; + raw_msg.info = input->mouse.info; + raw_msg.flags = flags; + raw_msg.rawinput.type = RIM_TYPEMOUSE; + raw_msg.rawinput.mouse.x = x - desktop->cursor.x; + raw_msg.rawinput.mouse.y = y - desktop->cursor.y; + raw_msg.rawinput.mouse.data = input->mouse.data;
enum_processes( queue_rawinput_message, &raw_msg ); release_object( foreground ); @@ -2062,14 +2064,12 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c raw_msg.time = time; raw_msg.message = WM_INPUT;
- msg_data = &raw_msg.data; - msg_data->info = input->kbd.info; - msg_data->size = sizeof(*msg_data); - msg_data->flags = input->kbd.flags; - msg_data->rawinput.type = RIM_TYPEKEYBOARD; - msg_data->rawinput.kbd.message = message_code; - msg_data->rawinput.kbd.vkey = vkey; - msg_data->rawinput.kbd.scan = input->kbd.scan; + raw_msg.info = input->kbd.info; + raw_msg.flags = input->kbd.flags; + raw_msg.rawinput.type = RIM_TYPEKEYBOARD; + raw_msg.rawinput.kbd.message = message_code; + raw_msg.rawinput.kbd.vkey = vkey; + raw_msg.rawinput.kbd.scan = input->kbd.scan;
enum_processes( queue_rawinput_message, &raw_msg ); release_object( foreground ); @@ -2117,10 +2117,8 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ unsigned int origin, const hw_input_t *input ) { struct hw_msg_source source = { IMDT_UNAVAILABLE, origin }; - struct hardware_msg_data *msg_data; struct rawinput_message raw_msg; struct message *msg; - data_size_t report_size = 0;
switch (input->hw.msg) { @@ -2131,21 +2129,18 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ raw_msg.time = get_tick_count(); raw_msg.message = input->hw.msg; raw_msg.hid_report = get_req_data(); - report_size = input->hw.hid.length * input->hw.hid.count; - if (report_size != get_req_data_size()) + if (input->hw.hid.length * input->hw.hid.count != get_req_data_size()) { set_error( STATUS_INVALID_PARAMETER ); return; }
- msg_data = &raw_msg.data; - msg_data->size = sizeof(*msg_data) + report_size; - msg_data->rawinput.hid.type = RIM_TYPEHID; - msg_data->rawinput.hid.device = input->hw.hid.device; - msg_data->rawinput.hid.param = input->hw.wparam; - msg_data->rawinput.hid.usage = input->hw.hid.usage; - msg_data->rawinput.hid.count = input->hw.hid.count; - msg_data->rawinput.hid.length = input->hw.hid.length; + raw_msg.rawinput.hid.type = RIM_TYPEHID; + raw_msg.rawinput.hid.device = input->hw.hid.device; + raw_msg.rawinput.hid.wparam = input->hw.wparam; + raw_msg.rawinput.hid.usage = input->hw.hid.usage; + raw_msg.rawinput.hid.count = input->hw.hid.count; + raw_msg.rawinput.hid.length = input->hw.hid.length;
enum_processes( queue_rawinput_message, &raw_msg ); return;