From ebff6606ee1e30f12859c6c308452110022a4aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Mon, 1 Sep 2025 17:27:07 +0200 Subject: [PATCH 1/4] Simplify test for shared library build --- CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 398b36eb1..063533c4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,11 +38,7 @@ set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING "Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)") if (GLFW_LIBRARY_TYPE) - if (GLFW_LIBRARY_TYPE STREQUAL "SHARED") - set(GLFW_BUILD_SHARED_LIBRARY TRUE) - else() - set(GLFW_BUILD_SHARED_LIBRARY FALSE) - endif() + string(COMPARE EQUAL "${GLFW_LIBRARY_TYPE}" "SHARED" GLFW_BUILD_SHARED_LIBRARY) else() set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS}) endif() From 1ce855b0b1c8c7418ef2925d75f3b7f366ff5cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Mon, 1 Sep 2025 18:43:26 +0200 Subject: [PATCH 2/4] Wayland: Fix missing checks for optional protocol --- README.md | 2 ++ src/wl_window.c | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9bad25a0f..89aaaac95 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,8 @@ information on what to include when reporting a bug. from a modal to the content area - [Wayland] Bugfix: free modules at end of terminate function to resolve potential segmentation fault (#2744) + - [Wayland] Bugfix: Confining or disabling the cursor could segfault on + compositors without `pointer-constraints-unstable-v1` - [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) - [X11] Bugfix: Occasional crash when an idle display awakes (#2766) - [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale diff --git a/src/wl_window.c b/src/wl_window.c index 4220d17e0..1bb32f5f0 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -2974,10 +2974,16 @@ static void lockPointer(_GLFWwindow* window) if (!_glfw.wl.relativePointerManager) { _glfwInputError(GLFW_FEATURE_UNAVAILABLE, - "Wayland: The compositor does not support pointer locking"); + "Wayland: The compositor does not support relative pointer motion"); return; } + if (!_glfw.wl.pointerConstraints) + { + _glfwInputError(GLFW_FEATURE_UNAVAILABLE, + "Wayland: The compositor does not support locking the pointer"); + } + window->wl.relativePointer = zwp_relative_pointer_manager_v1_get_relative_pointer( _glfw.wl.relativePointerManager, @@ -3025,6 +3031,12 @@ static const struct zwp_confined_pointer_v1_listener confinedPointerListener = static void confinePointer(_GLFWwindow* window) { + if (!_glfw.wl.pointerConstraints) + { + _glfwInputError(GLFW_FEATURE_UNAVAILABLE, + "Wayland: The compositor does not support confining the pointer"); + } + window->wl.confinedPointer = zwp_pointer_constraints_v1_confine_pointer( _glfw.wl.pointerConstraints, From 08449b71830c82d5341b97d3eb84261106552ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Tue, 25 Nov 2025 19:46:34 +0100 Subject: [PATCH 3/4] Linux: Add missing header for ioctl Fixes #2778 --- CONTRIBUTORS.md | 1 + README.md | 1 + src/linux_joystick.c | 1 + 3 files changed, 3 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 0e1d88342..031962ecd 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -162,6 +162,7 @@ video tutorials. - Marcel Metz - Liam Middlebrook - mightgoyardstill + - Mihail - Ave Milia - Icyllis Milica - Jonathan Miller diff --git a/README.md b/README.md index 89aaaac95..b27ea51dd 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ information on what to include when reporting a bug. - [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale less than 1 (#2754) - [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit + - [Linux] Bugfix: The header for `ioctl` was only implicitly included (#2778) - [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface` - [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless` - [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to diff --git a/src/linux_joystick.c b/src/linux_joystick.c index d8a916b08..e4d2852b3 100644 --- a/src/linux_joystick.c +++ b/src/linux_joystick.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include From dbadda26835ec5089ef922e6c290bcf58cf12056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Thu, 14 Aug 2025 18:03:35 +0200 Subject: [PATCH 4/4] Formatting --- src/win32_init.c | 3 ++- src/wl_init.c | 4 +++- src/wl_platform.h | 8 ++++++-- src/wl_window.c | 9 ++++++--- src/x11_monitor.c | 3 ++- src/x11_window.c | 4 ++-- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/win32_init.c b/src/win32_init.c index 6b6e9d08e..90e47670e 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -528,7 +528,8 @@ void _glfwUpdateKeyNamesWin32(void) if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD) { - const UINT vks[] = { + const UINT vks[] = + { VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, VK_NUMPAD8, VK_NUMPAD9, VK_DECIMAL, VK_DIVIDE, diff --git a/src/wl_init.c b/src/wl_init.c index 704906381..d32c4adf4 100644 --- a/src/wl_init.c +++ b/src/wl_init.c @@ -979,7 +979,8 @@ void _glfwTerminateWayland(void) if (_glfw.wl.cursorTimerfd >= 0) close(_glfw.wl.cursorTimerfd); - // Free modules only after all wayland termination functions are called + // Free modules only after all Wayland termination functions are called + if (_glfw.egl.handle) { _glfwPlatformFreeModule(_glfw.egl.handle); @@ -1003,6 +1004,7 @@ void _glfwTerminateWayland(void) _glfwPlatformFreeModule(_glfw.wl.xkb.handle); _glfw.wl.xkb.handle = NULL; } + if (_glfw.wl.cursor.handle) { _glfwPlatformFreeModule(_glfw.wl.cursor.handle); diff --git a/src/wl_platform.h b/src/wl_platform.h index c3e456931..bdadb657e 100644 --- a/src/wl_platform.h +++ b/src/wl_platform.h @@ -136,18 +136,22 @@ struct wl_output; #define GLFW_WAYLAND_MONITOR_STATE _GLFWmonitorWayland wl; #define GLFW_WAYLAND_CURSOR_STATE _GLFWcursorWayland wl; -struct wl_cursor_image { +struct wl_cursor_image +{ uint32_t width; uint32_t height; uint32_t hotspot_x; uint32_t hotspot_y; uint32_t delay; }; -struct wl_cursor { + +struct wl_cursor +{ unsigned int image_count; struct wl_cursor_image** images; char* name; }; + typedef struct wl_cursor_theme* (* PFN_wl_cursor_theme_load)(const char*, int, struct wl_shm*); typedef void (* PFN_wl_cursor_theme_destroy)(struct wl_cursor_theme*); typedef struct wl_cursor* (* PFN_wl_cursor_theme_get_cursor)(struct wl_cursor_theme*, const char*); diff --git a/src/wl_window.c b/src/wl_window.c index 1bb32f5f0..ad39b2e0e 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -1413,7 +1413,7 @@ static void handleEvents(double* timeout) if (read(_glfw.wl.keyRepeatTimerfd, &repeats, sizeof(repeats)) == 8) { - if(_glfw.wl.keyboardFocus) + if (_glfw.wl.keyboardFocus) { for (uint64_t i = 0; i < repeats; i++) { @@ -1692,7 +1692,8 @@ static void keyboardHandleKeymap(void* userData, } mapStr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); - if (mapStr == MAP_FAILED) { + if (mapStr == MAP_FAILED) + { close(fd); return; } @@ -1838,7 +1839,9 @@ static void keyboardHandleKey(void* userData, timer.it_value.tv_nsec = (_glfw.wl.keyRepeatDelay % 1000) * 1000000; timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL); } - } else if (scancode == _glfw.wl.keyRepeatScancode) { + } + else if (scancode == _glfw.wl.keyRepeatScancode) + { timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL); } diff --git a/src/x11_monitor.c b/src/x11_monitor.c index 74c57ed01..abf9cbff5 100644 --- a/src/x11_monitor.c +++ b/src/x11_monitor.c @@ -151,7 +151,8 @@ void _glfwPollMonitorsX11(void) } XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc); - if (!ci) { + if (!ci) + { XRRFreeOutputInfo(oi); continue; } diff --git a/src/x11_window.c b/src/x11_window.c index 02c4ab58d..045878aa5 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -2207,10 +2207,10 @@ void _glfwGetWindowSizeX11(_GLFWwindow* window, int* width, int* height) void _glfwSetWindowSizeX11(_GLFWwindow* window, int width, int height) { - // The dimensions must be nonzero, or a BadValue error results. + // The dimensions must be nonzero, or a BadValue error results width = _glfw_max(1, width); height = _glfw_max(1, height); - + if (window->monitor) { if (window->monitor->window == window)