mirror of
https://github.com/glfw/glfw.git
synced 2025-12-21 14:42:06 +00:00
Compare commits
8 Commits
1f8ff031d5
...
42997d45ea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42997d45ea | ||
|
|
acb92944d4 | ||
|
|
7ef6efeb66 | ||
|
|
3cf9f6726d | ||
|
|
bfa1c424e5 | ||
|
|
0c181dcf74 | ||
|
|
337a4589a9 | ||
|
|
1e9380584a |
@ -134,11 +134,15 @@ information on what to include when reporting a bug.
|
||||
- [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727)
|
||||
- [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727)
|
||||
- [Wayland] Bugfix: Memory would leak if reading a data offer failed midway
|
||||
- [Wayland] Bugfix: Keyboard leave event handler now processes key repeats (#2736)
|
||||
- [Wayland] Bugfix: Retrieved cursor position would be incorrect when hovering over
|
||||
fallback decorations
|
||||
- [Wayland] Bugfix: Fallback decorations would report scroll events
|
||||
- [Wayland] Bugfix: Keyboard repeat events halted when any key is released (#2568)
|
||||
- [Wayland] Bugfix: Fallback decorations would show menu at wrong position
|
||||
- [Wayland] Bugfix: The cursor was not updated when clicking through from
|
||||
a modal to a fallback decoration
|
||||
- [Wayland] Bugfix: The cursor position was not updated when clicking through
|
||||
from a modal to the content area
|
||||
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
|
||||
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
|
||||
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`
|
||||
|
||||
61
src/input.c
61
src/input.c
@ -65,21 +65,68 @@ static GLFWbool initJoysticks(void)
|
||||
return _glfw.joysticksInitialized = GLFW_TRUE;
|
||||
}
|
||||
|
||||
// Finds a mapping based on joystick GUID
|
||||
//
|
||||
static _GLFWmapping* findMapping(const char* guid)
|
||||
{
|
||||
int i;
|
||||
#if defined(GLFW_BUILD_LINUX_JOYSTICK)
|
||||
|
||||
for (i = 0; i < _glfw.mappingCount; i++)
|
||||
uint16_t parseHexDigit(char c)
|
||||
{
|
||||
if (c >= '0' && c <= '9') return c - '0';
|
||||
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
||||
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
|
||||
assert(GLFW_FALSE);
|
||||
}
|
||||
|
||||
struct vendor_product
|
||||
{
|
||||
uint16_t vendor;
|
||||
uint16_t product;
|
||||
};
|
||||
|
||||
static struct vendor_product parseGUID(const char* guid)
|
||||
{
|
||||
struct vendor_product result;
|
||||
result.vendor = parseHexDigit(guid[8]) | (parseHexDigit(guid[9]) << 8);
|
||||
result.product = parseHexDigit(guid[16]) | (parseHexDigit(guid[17]) << 8);
|
||||
return result;
|
||||
}
|
||||
|
||||
static _GLFWmapping* findMappingUSBVendorProduct(const char* guid)
|
||||
{
|
||||
|
||||
struct vendor_product this;
|
||||
this = parseGUID(guid);
|
||||
|
||||
for (int i = 0; i < _glfw.mappingCount; i++)
|
||||
{
|
||||
if (strcmp(_glfw.mappings[i].guid, guid) == 0)
|
||||
struct vendor_product that = parseGUID(_glfw.mappings[i].guid);
|
||||
|
||||
if (memcmp(&this, &that, sizeof(struct vendor_product)) == 0)
|
||||
return _glfw.mappings + i;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Finds a mapping based on joystick GUID
|
||||
//
|
||||
static _GLFWmapping* findMapping(const char* guid)
|
||||
{
|
||||
// exact match
|
||||
for (int i = 0; i < _glfw.mappingCount; i++)
|
||||
{
|
||||
if (strncmp(_glfw.mappings[i].guid, guid, 32) == 0)
|
||||
return _glfw.mappings + i;
|
||||
}
|
||||
|
||||
#if defined(GLFW_BUILD_LINUX_JOYSTICK)
|
||||
// only match vendor id, product id
|
||||
return findMappingUSBVendorProduct(guid);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Checks whether a gamepad mapping element is present in the hardware
|
||||
//
|
||||
static GLFWbool isValidElementForJoystick(const _GLFWmapelement* e,
|
||||
|
||||
@ -76,6 +76,7 @@ typedef struct _GLFWmonitor _GLFWmonitor;
|
||||
typedef struct _GLFWcursor _GLFWcursor;
|
||||
typedef struct _GLFWmapelement _GLFWmapelement;
|
||||
typedef struct _GLFWmapping _GLFWmapping;
|
||||
typedef struct _GLFWusbinfo _GLFWusbinfo;
|
||||
typedef struct _GLFWjoystick _GLFWjoystick;
|
||||
typedef struct _GLFWtls _GLFWtls;
|
||||
typedef struct _GLFWmutex _GLFWmutex;
|
||||
@ -640,6 +641,16 @@ struct _GLFWmapping
|
||||
_GLFWmapelement axes[6];
|
||||
};
|
||||
|
||||
// USB vendor, product, version
|
||||
//
|
||||
struct _GLFWusbinfo
|
||||
{
|
||||
uint16_t bustype;
|
||||
uint16_t vendor;
|
||||
uint16_t product;
|
||||
uint16_t version;
|
||||
};
|
||||
|
||||
// Joystick structure
|
||||
//
|
||||
struct _GLFWjoystick
|
||||
@ -655,6 +666,7 @@ struct _GLFWjoystick
|
||||
char name[128];
|
||||
void* userPointer;
|
||||
char guid[33];
|
||||
_GLFWusbinfo usbInfo;
|
||||
_GLFWmapping* mapping;
|
||||
|
||||
// This is defined in platform.h
|
||||
|
||||
@ -170,6 +170,12 @@ static GLFWbool openJoystickDevice(const char* path)
|
||||
|
||||
char guid[33] = "";
|
||||
|
||||
_GLFWusbinfo usbinfo;
|
||||
usbinfo.bustype = id.bustype;
|
||||
usbinfo.vendor = id.vendor;
|
||||
usbinfo.product = id.product;
|
||||
usbinfo.version = id.version;
|
||||
|
||||
// Generate a joystick GUID that matches the SDL 2.0.5+ one
|
||||
if (id.vendor && id.product && id.version)
|
||||
{
|
||||
@ -229,6 +235,7 @@ static GLFWbool openJoystickDevice(const char* path)
|
||||
close(linjs.fd);
|
||||
return GLFW_FALSE;
|
||||
}
|
||||
js->usbInfo = usbinfo;
|
||||
|
||||
strncpy(linjs.path, path, sizeof(linjs.path) - 1);
|
||||
memcpy(&js->linjs, &linjs, sizeof(linjs));
|
||||
|
||||
@ -405,13 +405,19 @@ static void handleFallbackDecorationButton(_GLFWwindow* window,
|
||||
}
|
||||
else if (button == BTN_RIGHT)
|
||||
{
|
||||
if (window->wl.xdg.toplevel)
|
||||
{
|
||||
if (!window->wl.xdg.toplevel)
|
||||
return;
|
||||
|
||||
if (window->wl.fallback.focus != window->wl.fallback.top.surface)
|
||||
return;
|
||||
|
||||
if (ypos < GLFW_BORDER_SIZE)
|
||||
return;
|
||||
|
||||
xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
|
||||
_glfw.wl.seat, serial,
|
||||
window->wl.cursorPosX,
|
||||
window->wl.cursorPosY);
|
||||
}
|
||||
xpos,
|
||||
ypos - GLFW_CAPTION_HEIGHT - GLFW_BORDER_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1532,11 +1538,21 @@ static void pointerHandleEnter(void* userData,
|
||||
window->wl.hovered = GLFW_TRUE;
|
||||
_glfwSetCursorWayland(window, window->wl.currentCursor);
|
||||
_glfwInputCursorEnter(window, GLFW_TRUE);
|
||||
|
||||
if (window->cursorMode != GLFW_CURSOR_DISABLED)
|
||||
{
|
||||
window->wl.cursorPosX = wl_fixed_to_double(sx);
|
||||
window->wl.cursorPosY = wl_fixed_to_double(sy);
|
||||
_glfwInputCursorPos(window, window->wl.cursorPosX, window->wl.cursorPosY);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (window->wl.fallback.decorations)
|
||||
{
|
||||
window->wl.fallback.focus = surface;
|
||||
updateFallbackDecorationCursor(window, sx, sy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user