From 7016dd6d65ebc7357fc34ccbf6288dd1869104eb Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 8 Mar 2018 13:33:13 +0100 Subject: [PATCH] [DINPUT] Sync with Wine Staging 3.3. CORE-14434 --- dll/directx/wine/dinput/CMakeLists.txt | 4 +- dll/directx/wine/dinput/config.c | 9 +-- dll/directx/wine/dinput/data_formats.c | 11 ++-- dll/directx/wine/dinput/device.c | 22 +++++-- dll/directx/wine/dinput/device_private.h | 8 +++ dll/directx/wine/dinput/dinput.rc | 5 +- dll/directx/wine/dinput/dinput_main.c | 58 +++++++++++++------ dll/directx/wine/dinput/dinput_private.h | 30 ++-------- dll/directx/wine/dinput/joystick.c | 6 +- dll/directx/wine/dinput/joystick_linux.c | 22 ++++++- dll/directx/wine/dinput/joystick_linuxinput.c | 21 ++++++- dll/directx/wine/dinput/joystick_osx.c | 22 +++---- dll/directx/wine/dinput/joystick_private.h | 10 ++++ dll/directx/wine/dinput/keyboard.c | 16 +++++ dll/directx/wine/dinput/mouse.c | 19 ++++++ dll/directx/wine/dinput/precomp.h | 24 ++++++++ dll/directx/wine/dinput/resource.h | 2 + media/doc/README.WINE | 2 +- 18 files changed, 214 insertions(+), 77 deletions(-) create mode 100644 dll/directx/wine/dinput/precomp.h diff --git a/dll/directx/wine/dinput/CMakeLists.txt b/dll/directx/wine/dinput/CMakeLists.txt index 7292e15d256..fc215eae908 100644 --- a/dll/directx/wine/dinput/CMakeLists.txt +++ b/dll/directx/wine/dinput/CMakeLists.txt @@ -14,7 +14,7 @@ list(APPEND SOURCE joystick_osx.c keyboard.c mouse.c - dinput_private.h) + precomp.h) add_library(dinput SHARED ${SOURCE} @@ -27,5 +27,5 @@ add_dependencies(dinput_data_formats psdk) set_module_type(dinput win32dll) target_link_libraries(dinput dxguid uuid wine) add_importlibs(dinput comctl32 ole32 user32 advapi32 msvcrt kernel32 ntdll) -add_pch(dinput dinput_private.h SOURCE) +add_pch(dinput precomp.h SOURCE) add_cd_file(TARGET dinput DESTINATION reactos/system32 FOR all) diff --git a/dll/directx/wine/dinput/config.c b/dll/directx/wine/dinput/config.c index 52a950a943d..708f406375d 100644 --- a/dll/directx/wine/dinput/config.c +++ b/dll/directx/wine/dinput/config.c @@ -16,11 +16,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define NONAMELESSUNION + +#include "wine/unicode.h" +#include "objbase.h" #include "dinput_private.h" - -#include -#include - +#include "device_private.h" #include "resource.h" typedef struct { diff --git a/dll/directx/wine/dinput/data_formats.c b/dll/directx/wine/dinput/data_formats.c index e1582c0e535..5fac7b7a089 100644 --- a/dll/directx/wine/dinput/data_formats.c +++ b/dll/directx/wine/dinput/data_formats.c @@ -16,15 +16,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WIN32_NO_STATUS -#define _INC_WINDOWS -#define COM_NO_WINDOWS_H +#if 0 +#pragma makedep implib +#endif #include -#include -#include -#include +#include "windef.h" +#include "dinput.h" #define numObjects(x) (sizeof(x) / sizeof(x[0])) diff --git a/dll/directx/wine/dinput/device.c b/dll/directx/wine/dinput/device.c index d9f95b913b9..bb2a6417191 100644 --- a/dll/directx/wine/dinput/device.c +++ b/dll/directx/wine/dinput/device.c @@ -24,9 +24,23 @@ It also contains all the helper functions. */ +#include "config.h" +#include +#include +#include "wine/debug.h" +#include "wine/unicode.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "winerror.h" +#include "dinput.h" +#include "device_private.h" #include "dinput_private.h" +WINE_DEFAULT_DEBUG_CHANNEL(dinput); + static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) { return CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface); @@ -976,9 +990,9 @@ HRESULT WINAPI IDirectInputDevice2WImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) EnterCriticalSection(&This->crit); res = This->acquired ? S_FALSE : DI_OK; This->acquired = 1; - if (res == DI_OK) - check_dinput_hooks(iface); LeaveCriticalSection(&This->crit); + if (res == DI_OK) + check_dinput_hooks(iface, TRUE); return res; } @@ -1004,9 +1018,9 @@ HRESULT WINAPI IDirectInputDevice2WImpl_Unacquire(LPDIRECTINPUTDEVICE8W iface) EnterCriticalSection(&This->crit); res = !This->acquired ? DI_NOEFFECT : DI_OK; This->acquired = 0; - if (res == DI_OK) - check_dinput_hooks(iface); LeaveCriticalSection(&This->crit); + if (res == DI_OK) + check_dinput_hooks(iface, FALSE); return res; } diff --git a/dll/directx/wine/dinput/device_private.h b/dll/directx/wine/dinput/device_private.h index bf227fd7f26..52bbec4490a 100644 --- a/dll/directx/wine/dinput/device_private.h +++ b/dll/directx/wine/dinput/device_private.h @@ -20,6 +20,14 @@ #ifndef __WINE_DLLS_DINPUT_DINPUTDEVICE_PRIVATE_H #define __WINE_DLLS_DINPUT_DINPUTDEVICE_PRIVATE_H +#include + +#include "windef.h" +#include "winbase.h" +#include "dinput.h" +#include "wine/list.h" +#include "dinput_private.h" + typedef struct { int size; diff --git a/dll/directx/wine/dinput/dinput.rc b/dll/directx/wine/dinput/dinput.rc index 0c5dae01104..d2641f31eab 100644 --- a/dll/directx/wine/dinput/dinput.rc +++ b/dll/directx/wine/dinput/dinput.rc @@ -16,9 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include - #include "resource.h" 1 WINE_REGISTRY dinput_classes.rgs @@ -30,7 +27,7 @@ #define WINE_PRODUCTVERSION 5,1,2600,881 #define WINE_PRODUCTVERSION_STR "5.1" -#include +#include "wine/wine_common_ver.rc" #pragma makedep po diff --git a/dll/directx/wine/dinput/dinput_main.c b/dll/directx/wine/dinput/dinput_main.c index 8b106808c53..69b9ff0a440 100644 --- a/dll/directx/wine/dinput/dinput_main.c +++ b/dll/directx/wine/dinput/dinput_main.c @@ -30,9 +30,28 @@ * - Fallout : works great in X and DGA mode */ -#include "dinput_private.h" +#include "config.h" +#include +#include +#include -#include +#define COBJMACROS +#define NONAMELESSUNION + +#include "wine/debug.h" +#include "wine/unicode.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winerror.h" +#include "objbase.h" +#include "rpcproxy.h" +#include "initguid.h" +#include "dinput_private.h" +#include "device_private.h" +#include "dinputd.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dinput); static const IDirectInput7AVtbl ddi7avt; static const IDirectInput7WVtbl ddi7wvt; @@ -1637,7 +1656,7 @@ static DWORD WINAPI hook_thread_proc(void *param) /* Force creation of the message queue */ PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE ); - SetEvent(*(LPHANDLE)param); + SetEvent(param); while (GetMessageW( &msg, 0, 0, 0 )) { @@ -1705,6 +1724,7 @@ static DWORD WINAPI hook_thread_proc(void *param) } static DWORD hook_thread_id; +static HANDLE hook_thread_event; static CRITICAL_SECTION_DEBUG dinput_critsect_debug = { @@ -1723,24 +1743,21 @@ static BOOL check_hook_thread(void) TRACE("IDirectInputs left: %d\n", list_count(&direct_input_list)); if (!list_empty(&direct_input_list) && !hook_thread) { - HANDLE event; - - event = CreateEventW(NULL, FALSE, FALSE, NULL); - hook_thread = CreateThread(NULL, 0, hook_thread_proc, &event, 0, &hook_thread_id); - if (event && hook_thread) - { - HANDLE handles[2]; - handles[0] = event; - handles[1] = hook_thread; - WaitForMultipleObjects(2, handles, FALSE, INFINITE); - } + hook_thread_event = CreateEventW(NULL, FALSE, FALSE, NULL); + hook_thread = CreateThread(NULL, 0, hook_thread_proc, hook_thread_event, 0, &hook_thread_id); LeaveCriticalSection(&dinput_hook_crit); - CloseHandle(event); } else if (list_empty(&direct_input_list) && hook_thread) { DWORD tid = hook_thread_id; + if (hook_thread_event) /* if thread is not started yet */ + { + WaitForSingleObject(hook_thread_event, INFINITE); + CloseHandle(hook_thread_event); + hook_thread_event = NULL; + } + hook_thread_id = 0; PostThreadMessageW(tid, WM_USER+0x10, 0, 0); LeaveCriticalSection(&dinput_hook_crit); @@ -1756,7 +1773,7 @@ static BOOL check_hook_thread(void) return hook_thread_id != 0; } -void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface) +void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface, BOOL acquired) { static HHOOK callwndproc_hook; static ULONG foreground_cnt; @@ -1766,7 +1783,7 @@ void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface) if (dev->dwCoopLevel & DISCL_FOREGROUND) { - if (dev->acquired) + if (acquired) foreground_cnt++; else foreground_cnt--; @@ -1781,6 +1798,13 @@ void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface) callwndproc_hook = NULL; } + if (hook_thread_event) /* if thread is not started yet */ + { + WaitForSingleObject(hook_thread_event, INFINITE); + CloseHandle(hook_thread_event); + hook_thread_event = NULL; + } + PostThreadMessageW( hook_thread_id, WM_USER+0x10, 1, 0 ); LeaveCriticalSection(&dinput_hook_crit); diff --git a/dll/directx/wine/dinput/dinput_private.h b/dll/directx/wine/dinput/dinput_private.h index fb8c32ef17e..3ed68f2264a 100644 --- a/dll/directx/wine/dinput/dinput_private.h +++ b/dll/directx/wine/dinput/dinput_private.h @@ -19,29 +19,13 @@ #ifndef __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H #define __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H -#include - #include -#define WIN32_NO_STATUS -#define _INC_WINDOWS -#define COM_NO_WINDOWS_H - -#define COBJMACROS -#define NONAMELESSUNION - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -WINE_DEFAULT_DEBUG_CHANNEL(dinput); +#include "windef.h" +#include "winbase.h" +#include "dinput.h" +#include "dinputd.h" +#include "wine/list.h" /* Implementation specification */ typedef struct IDirectInputImpl IDirectInputImpl; @@ -85,7 +69,7 @@ extern const struct dinput_device joystick_linux_device DECLSPEC_HIDDEN; extern const struct dinput_device joystick_linuxinput_device DECLSPEC_HIDDEN; extern const struct dinput_device joystick_osx_device DECLSPEC_HIDDEN; -extern void check_dinput_hooks(LPDIRECTINPUTDEVICE8W) DECLSPEC_HIDDEN; +extern void check_dinput_hooks(LPDIRECTINPUTDEVICE8W, BOOL) DECLSPEC_HIDDEN; extern void check_dinput_events(void) DECLSPEC_HIDDEN; typedef int (*DI_EVENT_PROC)(LPDIRECTINPUTDEVICE8A, WPARAM, LPARAM); @@ -102,6 +86,4 @@ extern WCHAR* get_mapping_path(const WCHAR *device, const WCHAR *username) DECLS #define DIMOUSE_MASK 0x82000000 #define DIGENRE_ANY 0xFF000000 -#include "device_private.h" - #endif /* __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H */ diff --git a/dll/directx/wine/dinput/joystick.c b/dll/directx/wine/dinput/joystick.c index ef21faf8094..45c361809e6 100644 --- a/dll/directx/wine/dinput/joystick.c +++ b/dll/directx/wine/dinput/joystick.c @@ -26,11 +26,13 @@ * force feedback */ -#include "dinput_private.h" - #include #include "joystick_private.h" +#include "wine/debug.h" +#include "winreg.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dinput); static inline JoystickGenericImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface) { diff --git a/dll/directx/wine/dinput/joystick_linux.c b/dll/directx/wine/dinput/joystick_linux.c index 673fb1b19ed..963e62f017c 100644 --- a/dll/directx/wine/dinput/joystick_linux.c +++ b/dll/directx/wine/dinput/joystick_linux.c @@ -25,17 +25,24 @@ * force feedback */ -#include "dinput_private.h" +#include "config.h" +#include "wine/port.h" +#include +#include +#include +#include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TIME_H # include #endif +#include #ifdef HAVE_SYS_IOCTL_H # include #endif +#include #ifdef HAVE_LINUX_IOCTL_H # include #endif @@ -47,8 +54,21 @@ # include #endif +#include "wine/debug.h" +#include "wine/unicode.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "dinput.h" + +#include "dinput_private.h" +#include "device_private.h" +#include "joystick_private.h" + #ifdef HAVE_LINUX_22_JOYSTICK_API +WINE_DEFAULT_DEBUG_CHANNEL(dinput); + #define JOYDEV_NEW "/dev/input/js" #define JOYDEV_OLD "/dev/js" #define JOYDEVDRIVER " (js)" diff --git a/dll/directx/wine/dinput/joystick_linuxinput.c b/dll/directx/wine/dinput/joystick_linuxinput.c index 2cd01e831a1..910e755d3ed 100644 --- a/dll/directx/wine/dinput/joystick_linuxinput.c +++ b/dll/directx/wine/dinput/joystick_linuxinput.c @@ -20,8 +20,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "dinput_private.h" +#include "config.h" +#include "wine/port.h" +#include +#include +#include +#include +#include #ifdef HAVE_UNISTD_H # include #endif @@ -44,10 +50,23 @@ # include #endif +#include "wine/debug.h" +#include "wine/unicode.h" +#include "wine/list.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "dinput.h" + +#include "dinput_private.h" #include "device_private.h" +#include "joystick_private.h" #ifdef HAS_PROPER_HEADER +WINE_DEFAULT_DEBUG_CHANNEL(dinput); + #define EVDEVPREFIX "/dev/input/event" #define EVDEVDRIVER " (event)" diff --git a/dll/directx/wine/dinput/joystick_osx.c b/dll/directx/wine/dinput/joystick_osx.c index 67b1d633205..b0dcdd99d53 100644 --- a/dll/directx/wine/dinput/joystick_osx.c +++ b/dll/directx/wine/dinput/joystick_osx.c @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -//#include "wine/port.h" +#include "config.h" +#include "wine/port.h" #if defined(HAVE_IOKIT_HID_IOHIDLIB_H) #define DWORD UInt32 @@ -79,17 +79,17 @@ #undef E_PENDING #endif /* HAVE_IOKIT_HID_IOHIDLIB_H */ -//#include "wine/debug.h" -//#include "wine/unicode.h" -//#include "windef.h" -//#include "winbase.h" -//#include "winerror.h" -//#include "winreg.h" -//#include "dinput.h" +#include "wine/debug.h" +#include "wine/unicode.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "dinput.h" #include "dinput_private.h" -//#include "device_private.h" -//#include "joystick_private.h" +#include "device_private.h" +#include "joystick_private.h" #ifdef HAVE_IOHIDMANAGERCREATE diff --git a/dll/directx/wine/dinput/joystick_private.h b/dll/directx/wine/dinput/joystick_private.h index 3e24dee5dee..e758cacf6df 100644 --- a/dll/directx/wine/dinput/joystick_private.h +++ b/dll/directx/wine/dinput/joystick_private.h @@ -19,6 +19,16 @@ #ifndef __WINE_DLLS_DINPUT_JOYSTICK_PRIVATE_H #define __WINE_DLLS_DINPUT_JOYSTICK_PRIVATE_H +#include + +#include "windef.h" +#include "winbase.h" +#include "dinput.h" +#include "wine/list.h" +#include "wine/unicode.h" +#include "dinput_private.h" +#include "device_private.h" + /* Number of objects in the default data format */ #define MAX_PROPS 164 struct JoystickGenericImpl; diff --git a/dll/directx/wine/dinput/keyboard.c b/dll/directx/wine/dinput/keyboard.c index ec7a58ade7a..4c3c38e7fc2 100644 --- a/dll/directx/wine/dinput/keyboard.c +++ b/dll/directx/wine/dinput/keyboard.c @@ -20,7 +20,23 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" +#include "wine/port.h" + +#include +#include +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winerror.h" +#include "dinput.h" + #include "dinput_private.h" +#include "device_private.h" +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dinput); #define WINE_DINPUT_KEYBOARD_MAX_KEYS 256 diff --git a/dll/directx/wine/dinput/mouse.c b/dll/directx/wine/dinput/mouse.c index bcf9e13be56..eaec6b17dc3 100644 --- a/dll/directx/wine/dinput/mouse.c +++ b/dll/directx/wine/dinput/mouse.c @@ -19,7 +19,26 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" +#include "wine/port.h" + +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winerror.h" +#include "winreg.h" +#include "dinput.h" + #include "dinput_private.h" +#include "device_private.h" +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dinput); /* Wine mouse driver object instances */ #define WINE_MOUSE_X_AXIS_INSTANCE 0 diff --git a/dll/directx/wine/dinput/precomp.h b/dll/directx/wine/dinput/precomp.h new file mode 100644 index 00000000000..9504beb6961 --- /dev/null +++ b/dll/directx/wine/dinput/precomp.h @@ -0,0 +1,24 @@ + +#ifndef __WINE_DINPUT_PRECOMP_H +#define __WINE_DINPUT_PRECOMP_H + +#include + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#define NONAMELESSUNION + +#include "dinput_private.h" + +#include +#include + +#include +#include + +#include "device_private.h" + +#endif /* !__WINE_DINPUT_PRECOMP_H */ diff --git a/dll/directx/wine/dinput/resource.h b/dll/directx/wine/dinput/resource.h index fa0376fa7e8..1f28fc51efb 100644 --- a/dll/directx/wine/dinput/resource.h +++ b/dll/directx/wine/dinput/resource.h @@ -18,6 +18,8 @@ #pragma once +#include "shlobj.h" + #define IDD_CONFIGUREDEVICES 1 #define IDC_DEVICETEXT 20 diff --git a/media/doc/README.WINE b/media/doc/README.WINE index f41e4884d8f..ef1c4aca212 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -30,7 +30,7 @@ reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to WineStaging-3.3 reactos/dll/directx/wine/d3dxof # Synced to WineStaging-3.3 reactos/dll/directx/wine/ddraw # Synced to WineStaging-3.3 reactos/dll/directx/wine/devenum # Synced to WineStaging-3.3 -reactos/dll/directx/wine/dinput # Synced to Wine-3.0 +reactos/dll/directx/wine/dinput # Synced to WineStaging-3.3 reactos/dll/directx/wine/dinput8 # Synced to WineStaging-2.9 reactos/dll/directx/wine/dmusic # Synced to WineStaging-2.9 reactos/dll/directx/wine/dplay # Synced to WineStaging-2.9