Vitaliy Margolen : dinput: Let each device decide which hook event to skip.

Alexandre Julliard julliard at winehq.org
Mon Feb 23 10:00:18 CST 2009


Module: wine
Branch: master
Commit: 74f2eccc9085d5f7667497f5d0d74e8053732f31
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=74f2eccc9085d5f7667497f5d0d74e8053732f31

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Sat Feb 21 12:54:37 2009 -0700

dinput: Let each device decide which hook event to skip.

Some programs acquire mouse in exclusive and keyboard in non-exclusive mode.

---

 dlls/dinput/dinput_main.c    |    3 +--
 dlls/dinput/dinput_private.h |    2 +-
 dlls/dinput/keyboard.c       |   12 +++++++-----
 dlls/dinput/mouse.c          |   10 +++++++---
 4 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index bdcf557..f89d5f0 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -899,8 +899,7 @@ static LRESULT CALLBACK LL_hook_proc( int code, WPARAM wparam, LPARAM lparam )
             if (dev->acquired && dev->event_proc)
             {
                 TRACE("calling %p->%p (%lx %lx)\n", dev, dev->event_proc, wparam, lparam);
-                dev->event_proc( (LPDIRECTINPUTDEVICE8A)dev, wparam, lparam );
-                skip |= dev->dwCoopLevel & DISCL_EXCLUSIVE;
+                skip |= dev->event_proc( (LPDIRECTINPUTDEVICE8A)dev, wparam, lparam );
             }
         LeaveCriticalSection( &dinput->crit );
     }
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index 15783e2..24fffb8 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -60,7 +60,7 @@ extern const struct dinput_device joystick_linux_device;
 extern const struct dinput_device joystick_linuxinput_device;
 
 extern void check_dinput_hooks(LPDIRECTINPUTDEVICE8A);
-typedef void (*DI_EVENT_PROC)(LPDIRECTINPUTDEVICE8A, WPARAM, LPARAM);
+typedef int (*DI_EVENT_PROC)(LPDIRECTINPUTDEVICE8A, WPARAM, LPARAM);
 
 extern void _dump_diactionformatA(LPDIACTIONFORMATA);
 
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 47536f7..f9c689b 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -74,16 +74,16 @@ static BYTE map_dik_code(DWORD scanCode, DWORD vkCode)
     return out_code;
 }
 
-static void KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam )
+static int KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam )
 {
     SysKeyboardImpl *This = (SysKeyboardImpl *)iface;
-    int dik_code;
+    int dik_code, ret = This->base.dwCoopLevel & DISCL_EXCLUSIVE;
     KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;
     BYTE new_diks;
 
     if (wparam != WM_KEYDOWN && wparam != WM_KEYUP &&
         wparam != WM_SYSKEYDOWN && wparam != WM_SYSKEYUP)
-        return;
+        return 0;
 
     TRACE("(%p) %ld,%ld\n", iface, wparam, lparam);
 
@@ -96,15 +96,17 @@ static void KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
 
     /* returns now if key event already known */
     if (new_diks == This->DInputKeyState[dik_code])
-        return;
+        return ret;
 
     This->DInputKeyState[dik_code] = new_diks;
     TRACE(" setting %02X to %02X\n", dik_code, This->DInputKeyState[dik_code]);
-      
+
     dik_code = id_to_offset(&This->base.data_format, DIDFT_MAKEINSTANCE(dik_code) | DIDFT_PSHBUTTON);
     EnterCriticalSection(&This->base.crit);
     queue_event((LPDIRECTINPUTDEVICE8A)This, dik_code, new_diks, hook->time, This->base.dinput->evsequence++);
     LeaveCriticalSection(&This->base.crit);
+
+    return ret;
 }
 
 const GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441 */
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 178b8fb..7b95be3 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -78,7 +78,7 @@ struct SysMouseImpl
     WARP_MOUSE                      warp_override;
 };
 
-static void dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam );
+static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam );
 
 const GUID DInput_Wine_Mouse_GUID = { /* 9e573ed8-7734-11d2-8d4a-23903fb6bdf7 */
     0x9e573ed8, 0x7734, 0x11d2, {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
@@ -286,17 +286,18 @@ const struct dinput_device mouse_device = {
  */
 
 /* low-level mouse hook */
-static void dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam )
+static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam )
 {
     MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam;
     SysMouseImpl* This = (SysMouseImpl*) iface;
     DWORD dwCoop;
-    int wdata = 0, inst_id = -1;
+    int wdata = 0, inst_id = -1, ret;
 
     TRACE("msg %lx @ (%d %d)\n", wparam, hook->pt.x, hook->pt.y);
 
     EnterCriticalSection(&This->base.crit);
     dwCoop = This->base.dwCoopLevel;
+    ret = dwCoop & DISCL_EXCLUSIVE;
 
     switch(wparam) {
         case WM_MOUSEMOVE:
@@ -370,6 +371,8 @@ static void dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARA
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2 + HIWORD(hook->mouseData)) | DIDFT_PSHBUTTON;
             This->m_state.rgbButtons[2 + HIWORD(hook->mouseData)] = wdata = 0x00;
             break;
+        default:
+            ret = 0;
     }
 
 
@@ -381,6 +384,7 @@ static void dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARA
     }
 
     LeaveCriticalSection(&This->base.crit);
+    return ret;
 }
 
 static BOOL dinput_window_check(SysMouseImpl* This) {




More information about the wine-cvs mailing list