[PATCH 3/8] dinput: Introduce new dinput_unacquire_window_devices helper.

Rémi Bernon rbernon at codeweavers.com
Wed Jan 5 07:58:37 CST 2022


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52263
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/dinput_main.c | 72 +++++++++++++++++++++------------------
 1 file changed, 39 insertions(+), 33 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index e2fabfc75f0..c4b41b7b945 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1204,9 +1204,46 @@ static LRESULT CALLBACK LL_hook_proc( int code, WPARAM wparam, LPARAM lparam )
     return skip ? 1 : CallNextHookEx( 0, code, wparam, lparam );
 }
 
-static LRESULT CALLBACK callwndproc_proc( int code, WPARAM wparam, LPARAM lparam )
+static void dinput_unacquire_window_devices( HWND window )
 {
     struct dinput_device *impl, *next;
+
+    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_device_list, struct dinput_device, entry )
+    {
+        if (window == impl->win)
+        {
+            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
+            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
+        }
+    }
+    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_mouse_list, struct dinput_device, entry )
+    {
+        if (window == impl->win)
+        {
+            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
+            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
+        }
+    }
+    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_rawmouse_list, struct dinput_device, entry )
+    {
+        if (window == impl->win)
+        {
+            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
+            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
+        }
+    }
+    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_keyboard_list, struct dinput_device, entry )
+    {
+        if (window == impl->win)
+        {
+            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
+            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
+        }
+    }
+}
+
+static LRESULT CALLBACK callwndproc_proc( int code, WPARAM wparam, LPARAM lparam )
+{
     CWPSTRUCT *msg = (CWPSTRUCT *)lparam;
     HWND foreground;
 
@@ -1217,38 +1254,7 @@ static LRESULT CALLBACK callwndproc_proc( int code, WPARAM wparam, LPARAM lparam
     foreground = GetForegroundWindow();
 
     EnterCriticalSection( &dinput_hook_crit );
-    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_device_list, struct dinput_device, entry )
-    {
-        if (msg->hwnd == impl->win && msg->hwnd != foreground)
-        {
-            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
-            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
-        }
-    }
-    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_mouse_list, struct dinput_device, entry )
-    {
-        if (msg->hwnd == impl->win && msg->hwnd != foreground)
-        {
-            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
-            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
-        }
-    }
-    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_rawmouse_list, struct dinput_device, entry )
-    {
-        if (msg->hwnd == impl->win && msg->hwnd != foreground)
-        {
-            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
-            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
-        }
-    }
-    LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_keyboard_list, struct dinput_device, entry )
-    {
-        if (msg->hwnd == impl->win && msg->hwnd != foreground)
-        {
-            TRACE( "%p window is not foreground - unacquiring %p\n", impl->win, impl );
-            dinput_device_internal_unacquire( &impl->IDirectInputDevice8W_iface );
-        }
-    }
+    if (msg->hwnd != foreground) dinput_unacquire_window_devices( msg->hwnd );
     LeaveCriticalSection( &dinput_hook_crit );
 
     return CallNextHookEx( 0, code, wparam, lparam );
-- 
2.34.1




More information about the wine-devel mailing list