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() 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 e73d30a2b..debceb92a 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` - [Wayland] Bugfix: Events being lost due to some drivers moving events to the default event queue during buffer swapping (#2793) - [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) @@ -153,6 +155,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 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 64c314bbd..a5916abd5 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -1442,7 +1442,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++) { @@ -1720,7 +1720,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; } @@ -1866,7 +1867,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); } @@ -3002,10 +3005,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, @@ -3053,6 +3062,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, 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)