Commit df0e491c authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

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: 's avatarRémi Bernon <rbernon@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent c0ea122c
...@@ -305,14 +305,11 @@ BOOL get_app_key(HKEY *defkey, HKEY *appkey) ...@@ -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 * Get a config key from either the app-specific or the default config
*/ */
DWORD get_config_key( HKEY defkey, HKEY appkey, const char *name, DWORD get_config_key( HKEY defkey, HKEY appkey, const WCHAR *name, WCHAR *buffer, DWORD size )
char *buffer, DWORD size )
{ {
if (appkey && !RegQueryValueExA( appkey, name, 0, NULL, (LPBYTE)buffer, &size )) if (appkey && !RegQueryValueExW( appkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
return 0;
if (defkey && !RegQueryValueExA( defkey, name, 0, NULL, (LPBYTE)buffer, &size )) if (defkey && !RegQueryValueExW( defkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
return 0;
return ERROR_FILE_NOT_FOUND; return ERROR_FILE_NOT_FOUND;
} }
......
...@@ -97,7 +97,7 @@ extern HRESULT direct_input_device_alloc( SIZE_T size, const IDirectInputDevice8 ...@@ -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 const IDirectInputDevice8AVtbl dinput_device_a_vtbl DECLSPEC_HIDDEN;
extern BOOL get_app_key(HKEY*, HKEY*) 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 */ /* Routines to do DataFormat / WineFormat conversions */
extern void fill_DataFormat(void *out, DWORD size, const void *in, const DataFormat *df) DECLSPEC_HIDDEN; extern void fill_DataFormat(void *out, DWORD size, const void *in, const DataFormat *df) DECLSPEC_HIDDEN;
......
...@@ -273,10 +273,18 @@ void dump_DIEFFECT(LPCDIEFFECT eff, REFGUID guid, DWORD dwFlags) ...@@ -273,10 +273,18 @@ void dump_DIEFFECT(LPCDIEFFECT eff, REFGUID guid, DWORD dwFlags)
BOOL device_disabled_registry(const char* name, BOOL disable) BOOL device_disabled_registry(const char* name, BOOL disable)
{ {
static const char disabled_str[] = "disabled"; DIDEVICEINSTANCEW instance;
static const char enabled_str[] = "enabled";
static const char joystick_key[] = "Joysticks"; MultiByteToWideChar( CP_ACP, 0, name, -1, instance.tszInstanceName, MAX_PATH );
char buffer[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; HKEY hkey, appkey, temp;
get_app_key(&hkey, &appkey); get_app_key(&hkey, &appkey);
...@@ -284,28 +292,29 @@ BOOL device_disabled_registry(const char* name, BOOL disable) ...@@ -284,28 +292,29 @@ BOOL device_disabled_registry(const char* name, BOOL disable)
/* Joystick settings are in the 'joysticks' subkey */ /* Joystick settings are in the 'joysticks' subkey */
if (appkey) if (appkey)
{ {
if (RegOpenKeyA(appkey, joystick_key, &temp)) temp = 0; if (RegOpenKeyW( appkey, joystick_key, &temp )) temp = 0;
RegCloseKey(appkey); RegCloseKey(appkey);
appkey = temp; appkey = temp;
} }
if (hkey) if (hkey)
{ {
if (RegOpenKeyA(hkey, joystick_key, &temp)) temp = 0; if (RegOpenKeyW( hkey, joystick_key, &temp )) temp = 0;
RegCloseKey(hkey); RegCloseKey(hkey);
hkey = temp; hkey = temp;
} }
/* Look for the "controllername"="disabled" key */ /* 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; 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; disable = FALSE;
} }
} }
...@@ -854,6 +863,15 @@ DWORD joystick_map_pov(const POINTL *p) ...@@ -854,6 +863,15 @@ DWORD joystick_map_pov(const POINTL *p)
return p->y < 0 ? 0 : !p->y ? -1 : 18000; 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. * Setup the dinput options.
*/ */
...@@ -870,7 +888,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_ ...@@ -870,7 +888,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_
/* get options */ /* 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); This->deadzone = atoi(buffer);
TRACE("setting default deadzone to: \"%s\" %d\n", buffer, This->deadzone); 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_ ...@@ -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)); This->axis_map = HeapAlloc(GetProcessHeap(), 0, This->device_axis_count * sizeof(int));
if (!This->axis_map) return DIERR_OUTOFMEMORY; 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", static const char *axis_names[] = {"X", "Y", "Z", "Rx", "Ry", "Rz",
"Slider1", "Slider2", "Slider1", "Slider2",
......
...@@ -1043,8 +1043,7 @@ static HRESULT hid_joystick_enum_device( DWORD type, DWORD flags, DIDEVICEINSTAN ...@@ -1043,8 +1043,7 @@ static HRESULT hid_joystick_enum_device( DWORD type, DWORD flags, DIDEVICEINSTAN
if (version >= 0x0800 && type != DI8DEVCLASS_ALL && type != DI8DEVCLASS_GAMECTRL) if (version >= 0x0800 && type != DI8DEVCLASS_ALL && type != DI8DEVCLASS_GAMECTRL)
return S_FALSE; return S_FALSE;
if (device_disabled_registry( "HID", TRUE )) if (device_instance_is_disabled( instance, FALSE )) return DIERR_DEVICENOTREG;
return DIERR_DEVICENOTREG;
TRACE( "found device %s, usage %04x:%04x, product %s, instance %s, name %s\n", debugstr_w(device_path), 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 ), instance->wUsagePage, instance->wUsage, debugstr_guid( &instance->guidProduct ),
......
...@@ -58,6 +58,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_ ...@@ -58,6 +58,7 @@ HRESULT setup_dinput_options(JoystickGenericImpl *This, const int *default_axis_
DWORD joystick_map_pov(const POINTL *p) DECLSPEC_HIDDEN; DWORD joystick_map_pov(const POINTL *p) DECLSPEC_HIDDEN;
BOOL device_disabled_registry(const char* name, BOOL disable) 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); ULONG WINAPI JoystickWGenericImpl_Release(LPDIRECTINPUTDEVICE8W iface);
......
...@@ -140,10 +140,13 @@ static HRESULT mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEIN ...@@ -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 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; SysMouseImpl* newDevice;
LPDIDATAFORMAT df = NULL; LPDIDATAFORMAT df = NULL;
unsigned i; unsigned i;
char buffer[20]; WCHAR buffer[20];
HKEY hkey, appkey; HKEY hkey, appkey;
HRESULT hr; HRESULT hr;
...@@ -155,11 +158,11 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseIm ...@@ -155,11 +158,11 @@ static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseIm
newDevice->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; newDevice->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND;
get_app_key(&hkey, &appkey); 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; newDevice->warp_override = WARP_DISABLE;
else if (!_strnicmp(buffer, "force", -1)) else if (!strncmpiW(buffer, force_w, -1))
newDevice->warp_override = WARP_FORCE_ON; newDevice->warp_override = WARP_FORCE_ON;
} }
if (appkey) RegCloseKey(appkey); if (appkey) RegCloseKey(appkey);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment