Compare commits

...

3 Commits

Author SHA1 Message Date
Felipe Jorge
3eff5e1233
Merge 52243c2ff4 into 0d2d85d19c 2025-08-18 13:21:21 +08:00
Doug Binks
0d2d85d19c Revert "Wayland: Keyboard leave event handler now processes key repeats" 2025-08-15 11:27:59 +02:00
Felipe Jorge
52243c2ff4 Win32: Update GUID for SDL newer format 2025-07-15 17:41:32 -03:00
4 changed files with 44 additions and 22 deletions

View File

@ -126,6 +126,9 @@ static GLFWbool loadLibraries(void)
{ {
_glfw.win32.xinput.GetCapabilities = (PFN_XInputGetCapabilities) _glfw.win32.xinput.GetCapabilities = (PFN_XInputGetCapabilities)
_glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetCapabilities"); _glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetCapabilities");
// 108 is the ordinal for _XInputGetCapabilitiesEx, which additionally returns VID/PID of the controller.
_glfw.win32.xinput.GetCapabilitiesEx = (PFN_XInputGetCapabilitiesEx)
_glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, (LPCSTR)108);
_glfw.win32.xinput.GetState = (PFN_XInputGetState) _glfw.win32.xinput.GetState = (PFN_XInputGetState)
_glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetState"); _glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetState");

View File

@ -519,12 +519,33 @@ void _glfwDetectJoystickConnectionWin32(void)
if (jid <= GLFW_JOYSTICK_LAST) if (jid <= GLFW_JOYSTICK_LAST)
continue; continue;
if (XInputGetCapabilities(index, 0, &xic) != ERROR_SUCCESS) if (XInputGetCapabilities(index, XINPUT_FLAG_GAMEPAD, &xic) != ERROR_SUCCESS)
continue; continue;
// Generate a joystick GUID that matches the SDL 2.0.5+ one GLFW_XINPUT_CAPABILITIES_EX xic_ex;
sprintf(guid, "78696e707574%02x000000000000000000", if (!XInputGetCapabilitiesEx || XInputGetCapabilitiesEx(1, index, 0, &xic_ex) != ERROR_SUCCESS)
xic.SubType & 0xff); {
// use a generic VID/PID representing an XInput controller
xic_ex.VendorId = USB_VENDOR_MICROSOFT;
xic_ex.ProductId = USB_PRODUCT_XBOX360_XUSB_CONTROLLER;
xic_ex.VersionNumber = 0;
}
else
{
// fixup for Wireless Xbox 360 Controller
if (xic_ex.ProductId == 0 && xic_ex.Capabilities.Flags & XINPUT_CAPS_WIRELESS)
{
xic_ex.VendorId = USB_VENDOR_MICROSOFT;
xic_ex.ProductId = USB_PRODUCT_XBOX360_XUSB_CONTROLLER;
}
}
// Generate a joystick GUID that matches the SDL one
// SDL_xinputjoystick.c:207
uint8_t* vid = (uint8_t*)&xic_ex.VendorId;
uint8_t* pid = (uint8_t*)&xic_ex.ProductId;
uint8_t* ver = (uint8_t*)&xic_ex.VersionNumber;
sprintf(guid, "03000000%02x%02x0000%02x%02x0000%02x%02x0000", vid[0], vid[1], pid[0], pid[1], ver[0], ver[1]);
js = _glfwAllocJoystick(getDeviceDescription(&xic), guid, 6, 10, 1); js = _glfwAllocJoystick(getDeviceDescription(&xic), guid, 6, 10, 1);
if (!js) if (!js)

View File

@ -216,11 +216,26 @@ typedef enum
#define ERROR_INVALID_PROFILE_ARB 0x2096 #define ERROR_INVALID_PROFILE_ARB 0x2096
#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
// this struct might not defined in XInput headers
typedef struct
{
XINPUT_CAPABILITIES Capabilities;
WORD VendorId;
WORD ProductId;
WORD VersionNumber;
WORD unk1;
DWORD unk2;
} GLFW_XINPUT_CAPABILITIES_EX;
// xinput.dll function pointer typedefs // xinput.dll function pointer typedefs
typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*); typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
typedef DWORD (WINAPI * PFN_XInputGetCapabilitiesEx)(DWORD,DWORD,DWORD,GLFW_XINPUT_CAPABILITIES_EX*);
typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*); typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
#define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities #define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities
#define XInputGetCapabilitiesEx _glfw.win32.xinput.GetCapabilitiesEx
#define XInputGetState _glfw.win32.xinput.GetState #define XInputGetState _glfw.win32.xinput.GetState
#define USB_VENDOR_MICROSOFT 0x045e
#define USB_PRODUCT_XBOX360_XUSB_CONTROLLER 0x02a1 // XUSB driver software PID
// dinput8.dll function pointer typedefs // dinput8.dll function pointer typedefs
typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN); typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
@ -412,6 +427,7 @@ typedef struct _GLFWlibraryWin32
struct { struct {
HINSTANCE instance; HINSTANCE instance;
PFN_XInputGetCapabilities GetCapabilities; PFN_XInputGetCapabilities GetCapabilities;
PFN_XInputGetCapabilitiesEx GetCapabilitiesEx;
PFN_XInputGetState GetState; PFN_XInputGetState GetState;
} xinput; } xinput;

View File

@ -1778,24 +1778,6 @@ static void keyboardHandleLeave(void* userData,
if (!window) if (!window)
return; return;
// Handle any key repeats up to this point. We don't poll as this should be infrequent.
uint64_t repeats;
if (read(_glfw.wl.keyRepeatTimerfd, &repeats, sizeof(repeats)) == 8)
{
if(_glfw.wl.keyboardFocus)
{
for (uint64_t i = 0; i < repeats; i++)
{
_glfwInputKey(_glfw.wl.keyboardFocus,
translateKey(_glfw.wl.keyRepeatScancode),
_glfw.wl.keyRepeatScancode,
GLFW_PRESS,
_glfw.wl.xkb.modifiers);
inputText(_glfw.wl.keyboardFocus, _glfw.wl.keyRepeatScancode);
}
}
}
struct itimerspec timer = {0}; struct itimerspec timer = {0};
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL); timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);