dinput: Don't disable HID joysticks by default.

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@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2021-09-15 09:29:50 +02:00 committed by Alexandre Julliard
parent c0ea122c0c
commit df0e491cb1
6 changed files with 44 additions and 26 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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",

View File

@ -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 ),

View File

@ -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);

View File

@ -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);