[PATCH 2/5] dinput: Don't disable HID joysticks by default.
Rémi Bernon
rbernon at codeweavers.com
Wed Sep 15 02:29:50 CDT 2021
Although not completely correct it should be usable already, and running
the tests would require setting the registry key before and cleaning it
up after otherwise.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput/device.c | 9 +++----
dlls/dinput/device_private.h | 2 +-
dlls/dinput/joystick.c | 44 ++++++++++++++++++++++++----------
dlls/dinput/joystick_hid.c | 3 +--
dlls/dinput/joystick_private.h | 1 +
dlls/dinput/mouse.c | 11 +++++----
6 files changed, 44 insertions(+), 26 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 25084f82a9c..e04d40e5a7c 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -305,14 +305,11 @@ BOOL get_app_key(HKEY *defkey, HKEY *appkey)
/******************************************************************************
* Get a config key from either the app-specific or the default config
*/
-DWORD get_config_key( HKEY defkey, HKEY appkey, const char *name,
- char *buffer, DWORD size )
+DWORD get_config_key( HKEY defkey, HKEY appkey, const WCHAR *name, WCHAR *buffer, DWORD size )
{
- if (appkey && !RegQueryValueExA( appkey, name, 0, NULL, (LPBYTE)buffer, &size ))
- return 0;
+ if (appkey && !RegQueryValueExW( appkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
- if (defkey && !RegQueryValueExA( defkey, name, 0, NULL, (LPBYTE)buffer, &size ))
- return 0;
+ if (defkey && !RegQueryValueExW( defkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
return ERROR_FILE_NOT_FOUND;
}
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 0e72ee77bf1..90eab627c26 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -97,7 +97,7 @@ extern HRESULT direct_input_device_alloc( SIZE_T size, const IDirectInputDevice8
extern const IDirectInputDevice8AVtbl dinput_device_a_vtbl DECLSPEC_HIDDEN;
extern BOOL get_app_key(HKEY*, HKEY*) DECLSPEC_HIDDEN;
-extern DWORD get_config_key(HKEY, HKEY, const char*, char*, DWORD) DECLSPEC_HIDDEN;
+extern DWORD get_config_key( HKEY, HKEY, const WCHAR *, WCHAR *, DWORD ) DECLSPEC_HIDDEN;
/* Routines to do DataFormat / WineFormat conversions */
extern void fill_DataFormat(void *out, DWORD size, const void *in, const DataFormat *df) DECLSPEC_HIDDEN;
diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c
index 60153d0d0f3..d4f5b819471 100644
--- a/dlls/dinput/joystick.c
+++ b/dlls/dinput/joystick.c
@@ -273,10 +273,18 @@ void dump_DIEFFECT(LPCDIEFFECT eff, REFGUID guid, DWORD dwFlags)
BOOL device_disabled_registry(const char* name, BOOL disable)
{
- static const char disabled_str[] = "disabled";
- static const char enabled_str[] = "enabled";
- static const char joystick_key[] = "Joysticks";
- char buffer[MAX_PATH];
+ DIDEVICEINSTANCEW instance;
+
+ MultiByteToWideChar( CP_ACP, 0, name, -1, instance.tszInstanceName, MAX_PATH );
+ return device_instance_is_disabled( &instance, disable );
+}
+
+BOOL device_instance_is_disabled( DIDEVICEINSTANCEW *instance, BOOL disable )
+{
+ static const WCHAR disabled_str[] = {'d', 'i', 's', 'a', 'b', 'l', 'e', 'd', 0};
+ static const WCHAR enabled_str[] = {'e', 'n', 'a', 'b', 'l', 'e', 'd', 0};
+ static const WCHAR joystick_key[] = {'J', 'o', 'y', 's', 't', 'i', 'c', 'k', 's', 0};
+ WCHAR buffer[MAX_PATH];
HKEY hkey, appkey, temp;
get_app_key(&hkey, &appkey);
@@ -284,28 +292,29 @@ BOOL device_disabled_registry(const char* name, BOOL disable)
/* Joystick settings are in the 'joysticks' subkey */
if (appkey)
{
- if (RegOpenKeyA(appkey, joystick_key, &temp)) temp = 0;
+ if (RegOpenKeyW( appkey, joystick_key, &temp )) temp = 0;
RegCloseKey(appkey);
appkey = temp;
}
+
if (hkey)
{
- if (RegOpenKeyA(hkey, joystick_key, &temp)) temp = 0;
+ if (RegOpenKeyW( hkey, joystick_key, &temp )) temp = 0;
RegCloseKey(hkey);
hkey = temp;
}
/* Look for the "controllername"="disabled" key */
- if (!get_config_key(hkey, appkey, name, buffer, sizeof(buffer)))
+ if (!get_config_key( hkey, appkey, instance->tszInstanceName, buffer, sizeof(buffer) ))
{
- if (!disable && !strcmp(disabled_str, buffer))
+ if (!disable && !strcmpW( disabled_str, buffer ))
{
- TRACE("Disabling joystick '%s' based on registry key.\n", name);
+ TRACE( "Disabling joystick '%s' based on registry key.\n", debugstr_w(instance->tszInstanceName) );
disable = TRUE;
}
- else if (disable && !strcmp(enabled_str, buffer))
+ else if (disable && !strcmpW( enabled_str, buffer ))
{
- TRACE("Enabling joystick '%s' based on registry key.\n", name);
+ TRACE( "Enabling joystick '%s' based on registry key.\n", debugstr_w(instance->tszInstanceName) );
disable = FALSE;
}
}
@@ -854,6 +863,15 @@ DWORD joystick_map_pov(const POINTL *p)
return p->y < 0 ? 0 : !p->y ? -1 : 18000;
}
+static DWORD get_config_key_a( HKEY defkey, HKEY appkey, const char *name, char *buffer, DWORD size )
+{
+ if (appkey && !RegQueryValueExA( appkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
+
+ if (defkey && !RegQueryValueExA( defkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
+
+ return ERROR_FILE_NOT_FOUND;
+}
+
/*
* Setup the dinput options.
*/
@@ -870,7 +888,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_
/* get options */
- if (!get_config_key(hkey, appkey, "DefaultDeadZone", buffer, sizeof(buffer)))
+ if (!get_config_key_a( hkey, appkey, "DefaultDeadZone", buffer, sizeof(buffer) ))
{
This->deadzone = atoi(buffer);
TRACE("setting default deadzone to: \"%s\" %d\n", buffer, This->deadzone);
@@ -879,7 +897,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_
This->axis_map = HeapAlloc(GetProcessHeap(), 0, This->device_axis_count * sizeof(int));
if (!This->axis_map) return DIERR_OUTOFMEMORY;
- if (!get_config_key(hkey, appkey, This->name, buffer, sizeof(buffer)))
+ if (!get_config_key_a( hkey, appkey, This->name, buffer, sizeof(buffer) ))
{
static const char *axis_names[] = {"X", "Y", "Z", "Rx", "Ry", "Rz",
"Slider1", "Slider2",
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 3c69c74b4fc..3ef6f0db9cc 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -1043,8 +1043,7 @@ static HRESULT hid_joystick_enum_device( DWORD type, DWORD flags, DIDEVICEINSTAN
if (version >= 0x0800 && type != DI8DEVCLASS_ALL && type != DI8DEVCLASS_GAMECTRL)
return S_FALSE;
- if (device_disabled_registry( "HID", TRUE ))
- return DIERR_DEVICENOTREG;
+ if (device_instance_is_disabled( instance, FALSE )) return DIERR_DEVICENOTREG;
TRACE( "found device %s, usage %04x:%04x, product %s, instance %s, name %s\n", debugstr_w(device_path),
instance->wUsagePage, instance->wUsage, debugstr_guid( &instance->guidProduct ),
diff --git a/dlls/dinput/joystick_private.h b/dlls/dinput/joystick_private.h
index 9cc30605234..4fe51d17067 100644
--- a/dlls/dinput/joystick_private.h
+++ b/dlls/dinput/joystick_private.h
@@ -58,6 +58,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_
DWORD joystick_map_pov(const POINTL *p) DECLSPEC_HIDDEN;
BOOL device_disabled_registry(const char* name, BOOL disable) DECLSPEC_HIDDEN;
+BOOL device_instance_is_disabled( DIDEVICEINSTANCEW *instance, BOOL disable ) DECLSPEC_HIDDEN;
ULONG WINAPI JoystickWGenericImpl_Release(LPDIRECTINPUTDEVICE8W iface);
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 145a792f396..9f696cb414a 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -140,10 +140,13 @@ static HRESULT mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEIN
static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseImpl **out )
{
+ static const WCHAR mouse_wrap_override_w[] = {'M','o','u','s','e','W','a','r','p','O','v','e','r','r','i','d','e',0};
+ static const WCHAR disable_w[] = {'d','i','s','a','b','l','e',0};
+ static const WCHAR force_w[] = {'f','o','r','c','e',0};
SysMouseImpl* newDevice;
LPDIDATAFORMAT df = NULL;
unsigned i;
- char buffer[20];
+ WCHAR buffer[20];
HKEY hkey, appkey;
HRESULT hr;
@@ -155,11 +158,11 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseIm
newDevice->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND;
get_app_key(&hkey, &appkey);
- if (!get_config_key(hkey, appkey, "MouseWarpOverride", buffer, sizeof(buffer)))
+ if (!get_config_key(hkey, appkey, mouse_wrap_override_w, buffer, sizeof(buffer)))
{
- if (!_strnicmp(buffer, "disable", -1))
+ if (!strncmpiW(buffer, disable_w, -1))
newDevice->warp_override = WARP_DISABLE;
- else if (!_strnicmp(buffer, "force", -1))
+ else if (!strncmpiW(buffer, force_w, -1))
newDevice->warp_override = WARP_FORCE_ON;
}
if (appkey) RegCloseKey(appkey);
--
2.33.0
More information about the wine-devel
mailing list