From 3846286bee501a56d4df769ee4364a1ab87c9c42 Mon Sep 17 00:00:00 2001 From: Luflosi Date: Mon, 25 May 2020 15:20:48 +0200 Subject: [PATCH] Wayland: Implement raw mouse motion control From upstream: https://github.com/glfw/glfw/commit/44af6bb9360df274b514f958f9a6a52a93c7fe32. --- glfw/wl_window.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/glfw/wl_window.c b/glfw/wl_window.c index f49bc4eb0..5ce48bc16 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -1239,11 +1239,12 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window UNUSED, float opacity UNU void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window UNUSED, bool enabled UNUSED) { + // This is handled in relativePointerHandleRelativeMotion } bool _glfwPlatformRawMouseMotionSupported(void) { - return false; + return true; } void _glfwPlatformPollEvents(void) @@ -1344,19 +1345,30 @@ static void relativePointerHandleRelativeMotion(void* data, struct zwp_relative_pointer_v1* pointer UNUSED, uint32_t timeHi UNUSED, uint32_t timeLo UNUSED, - wl_fixed_t dx UNUSED, - wl_fixed_t dy UNUSED, + wl_fixed_t dx, + wl_fixed_t dy, wl_fixed_t dxUnaccel, wl_fixed_t dyUnaccel) { _GLFWwindow* window = data; + double xpos = window->virtualCursorPosX; + double ypos = window->virtualCursorPosY; if (window->cursorMode != GLFW_CURSOR_DISABLED) return; - _glfwInputCursorPos(window, - window->virtualCursorPosX + wl_fixed_to_double(dxUnaccel), - window->virtualCursorPosY + wl_fixed_to_double(dyUnaccel)); + if (window->rawMouseMotion) + { + xpos += wl_fixed_to_double(dxUnaccel); + ypos += wl_fixed_to_double(dyUnaccel); + } + else + { + xpos += wl_fixed_to_double(dx); + ypos += wl_fixed_to_double(dy); + } + + _glfwInputCursorPos(window, xpos, ypos); } static const struct zwp_relative_pointer_v1_listener relativePointerListener = {