From: Arkadiusz Hiler ahiler@codeweavers.com
This is a preparation for a patch that changes setupapi to return lowercased device paths, which is the source of RawInput device name here. On Windows RawInput returns mostly uppercase names (except the GUID) and we want to keep that behavior.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com ---
First two patches have been in Proton for a long while.
They aren't directly related to the SDL issue described in PATCH 3, and as we're already using upper case device paths it's possible to skip them.
However they fix some other kind of hotplug problem, and so I think they are related and worth having. Then, because SDL checks for uppercase "IG_", we need PATCH 1 before PATCH 2.
I'm a bit unsure about PATCH 4, as creating a (msg) window in DllMain is probably not great, but I don't really how else we can make sure XInput gets notified first. It would be better to avoid refreshing the device list on every call.
dlls/user32/rawinput.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c index f3dc4ae67de..a774f12231b 100644 --- a/dlls/user32/rawinput.c +++ b/dlls/user32/rawinput.c @@ -101,6 +101,7 @@ static struct device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface) struct device *device = NULL; UINT32 handle; HANDLE file; + WCHAR *pos; DWORD i, size, type;
SetupDiGetDeviceInterfaceDetailW(set, iface, NULL, 0, &size, &device_data); @@ -125,6 +126,9 @@ static struct device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface) detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W); SetupDiGetDeviceInterfaceDetailW(set, iface, detail, size, NULL, NULL);
+ /* upper case everything but the GUID */ + for (pos = detail->DevicePath; *pos && *pos != '{'; pos++) *pos = towupper(*pos); + file = CreateFileW(detail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); if (file == INVALID_HANDLE_VALUE)