Compare commits

...

3 Commits

Author SHA1 Message Date
Friz64
042b608a62
Merge 2307384a83 into feb2a6b728 2025-07-18 07:14:03 +08:00
Doug Binks
feb2a6b728 Wayland: Reset key repeat timer on window destruction
Windows with keyboard focus may have an active key repeat timer.
This should be reset when the window is closed, or key repeat events
could be sent to a NULL window were it not for the quickfix in PR #2732.

Fixes #2741
Probably the source of #2727
2025-07-17 17:24:19 +02:00
Friz64
2307384a83 Wayland: Partially implement glfwSetCursorPos 2024-02-25 01:48:41 +01:00
3 changed files with 43 additions and 2 deletions

View File

@ -132,6 +132,7 @@ information on what to include when reporting a bug.
- [Wayland] Bugfix: `glfwInit` would segfault on compositor with no seat (#2517) - [Wayland] Bugfix: `glfwInit` would segfault on compositor with no seat (#2517)
- [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault - [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault
- [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727) - [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727)
- [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727)
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) - [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 Vulkan 'window' surface creation via `VK_EXT_headless_surface`
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless` - [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`

View File

@ -372,6 +372,7 @@ typedef struct _GLFWwindowWayland
GLFWbool iconified; GLFWbool iconified;
GLFWbool activated; GLFWbool activated;
GLFWbool fullscreen; GLFWbool fullscreen;
double cursorPosX, cursorPosY;
} pending; } pending;
struct { struct {
@ -387,6 +388,7 @@ typedef struct _GLFWwindowWayland
_GLFWcursor* currentCursor; _GLFWcursor* currentCursor;
double cursorPosX, cursorPosY; double cursorPosX, cursorPosY;
GLFWbool pendingCursorPos;
char* appId; char* appId;

View File

@ -2187,7 +2187,12 @@ void _glfwDestroyWindowWayland(_GLFWwindow* window)
_glfw.wl.pointerFocus = NULL; _glfw.wl.pointerFocus = NULL;
if (window == _glfw.wl.keyboardFocus) if (window == _glfw.wl.keyboardFocus)
{
struct itimerspec timer = {0};
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
_glfw.wl.keyboardFocus = NULL; _glfw.wl.keyboardFocus = NULL;
}
if (window->wl.fractionalScale) if (window->wl.fractionalScale)
wp_fractional_scale_v1_destroy(window->wl.fractionalScale); wp_fractional_scale_v1_destroy(window->wl.fractionalScale);
@ -2679,8 +2684,34 @@ void _glfwGetCursorPosWayland(_GLFWwindow* window, double* xpos, double* ypos)
void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y) void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y)
{ {
if (!_glfw.wl.pointerConstraints)
{
_glfwInputError(GLFW_FEATURE_UNAVAILABLE, _glfwInputError(GLFW_FEATURE_UNAVAILABLE,
"Wayland: The platform does not support setting the cursor position"); "Wayland: The compositor does not support setting the cursor position");
return;
}
if (window->wl.lockedPointer) {
zwp_locked_pointer_v1_set_cursor_position_hint(window->wl.lockedPointer,
wl_fixed_from_double(x),
wl_fixed_from_double(y));
} else {
if (window->cursorMode != GLFW_CURSOR_DISABLED) {
_glfwInputError(GLFW_PLATFORM_ERROR,
"Wayland: Delaying the cursor position update until "
"the cursor mode is set to GLFW_CURSOR_DISABLED");
}
// The cursor is not currently locked, but it may be locked later. Either
// - the application has already set the cursor mode to GLFW_CURSOR_DISABLED,
// but the cursor is currently outside of the window, or
// - the application has not yet set the cursor mode to GLFW_CURSOR_DISABLED,
// but will do so soon.
// Defer setting the cursor position to _glfwSetCursorWayland.
window->wl.pending.cursorPosX = x;
window->wl.pending.cursorPosY = y;
window->wl.pendingCursorPos = GLFW_TRUE;
}
} }
void _glfwSetCursorModeWayland(_GLFWwindow* window, int mode) void _glfwSetCursorModeWayland(_GLFWwindow* window, int mode)
@ -3021,6 +3052,13 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
unconfinePointer(window); unconfinePointer(window);
if (!window->wl.lockedPointer) if (!window->wl.lockedPointer)
lockPointer(window); lockPointer(window);
if (window->wl.pendingCursorPos == GLFW_TRUE) {
zwp_locked_pointer_v1_set_cursor_position_hint(window->wl.lockedPointer,
wl_fixed_from_double(window->wl.pending.cursorPosX),
wl_fixed_from_double(window->wl.pending.cursorPosY));
window->wl.pendingCursorPos = GLFW_FALSE;
}
} }
else if (window->cursorMode == GLFW_CURSOR_CAPTURED) else if (window->cursorMode == GLFW_CURSOR_CAPTURED)
{ {