[RFC PATCH 5/8] user32: Add support for RIDEV_INPUTSINK flag.

Rémi Bernon rbernon at codeweavers.com
Wed Sep 11 09:30:08 CDT 2019


---
 dlls/user32/rawinput.c       | 9 ++++++++-
 dlls/user32/tests/rawinput.c | 2 --
 server/queue.c               | 4 ++++
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 66dc9b55f12..db2f7c0cc90 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -267,6 +267,13 @@ BOOL WINAPI DECLSPEC_HOTPATCH RegisterRawInputDevices(RAWINPUTDEVICE *devices, U
 
     for (i = 0; i < device_count; ++i)
     {
+        if ((devices[i].dwFlags & RIDEV_INPUTSINK) &&
+            (devices[i].hwndTarget == NULL))
+        {
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return FALSE;
+        }
+
         if ((devices[i].dwFlags & RIDEV_REMOVE) &&
             (devices[i].hwndTarget != NULL))
         {
@@ -282,7 +289,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH RegisterRawInputDevices(RAWINPUTDEVICE *devices, U
         TRACE("device %u: page %#x, usage %#x, flags %#x, target %p.\n",
                 i, devices[i].usUsagePage, devices[i].usUsage,
                 devices[i].dwFlags, devices[i].hwndTarget);
-        if (devices[i].dwFlags & ~(RIDEV_REMOVE|RIDEV_NOLEGACY))
+        if (devices[i].dwFlags & ~(RIDEV_REMOVE|RIDEV_NOLEGACY|RIDEV_INPUTSINK))
             FIXME("Unhandled flags %#x for device %u.\n", devices[i].dwFlags, i);
 
         d[i].usage_page = devices[i].usUsagePage;
diff --git a/dlls/user32/tests/rawinput.c b/dlls/user32/tests/rawinput.c
index f4c8eb6738b..3e459a53940 100644
--- a/dlls/user32/tests/rawinput.c
+++ b/dlls/user32/tests/rawinput.c
@@ -80,9 +80,7 @@ static void test_RegisterRawInputDevices(void)
 
     SetLastError(0xdeadbeef);
     res = RegisterRawInputDevices(raw_devices, ARRAY_SIZE(raw_devices), sizeof(RAWINPUTDEVICE));
-    todo_wine
     ok(res == FALSE, "RegisterRawInputDevices failed\n");
-    todo_wine
     ok(GetLastError() == ERROR_INVALID_PARAMETER, "RegisterRawInputDevices returned %08x\n", GetLastError());
 
     raw_devices[0].hwndTarget = hwnd;
diff --git a/server/queue.c b/server/queue.c
index 31b643d4c96..7ee17e9e8b6 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1624,6 +1624,10 @@ static int queue_raw_input_message( struct process* process, void* user )
         return 0;
     if (!(desktop = get_desktop_obj( process, process->desktop, 0 )) || desktop != raw_msg->desktop)
         goto done;
+    if (!(device->flags & RIDEV_INPUTSINK) &&
+        (thread = get_window_thread( device->target )) &&
+        thread->queue->input != desktop->foreground_input)
+        goto done;
     if (!(msg = alloc_hardware_message( raw_msg->data.info, raw_msg->source, raw_msg->time )))
         goto done;
 
-- 
2.23.0




More information about the wine-devel mailing list