diff --git a/pkgs/development/libraries/glfw/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch b/pkgs/development/libraries/glfw/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch new file mode 100644 index 0000000000000..70cec99815e9b --- /dev/null +++ b/pkgs/development/libraries/glfw/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch @@ -0,0 +1,59 @@ +From 9997ae55a47de469ea26f8437c30b51483abda5f Mon Sep 17 00:00:00 2001 +From: Dan Klishch +Date: Sat, 30 Sep 2023 23:38:05 -0400 +Subject: Defer setting cursor position until the cursor is locked + +--- + src/wl_platform.h | 3 +++ + src/wl_window.c | 14 ++++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/src/wl_platform.h b/src/wl_platform.h +index ca34f66e..cd1f227f 100644 +--- a/src/wl_platform.h ++++ b/src/wl_platform.h +@@ -403,6 +403,9 @@ typedef struct _GLFWwindowWayland + int scaleSize; + int compositorPreferredScale; + ++ double askedCursorPosX, askedCursorPosY; ++ GLFWbool didAskForSetCursorPos; ++ + struct zwp_relative_pointer_v1* relativePointer; + struct zwp_locked_pointer_v1* lockedPointer; + struct zwp_confined_pointer_v1* confinedPointer; +diff --git a/src/wl_window.c b/src/wl_window.c +index 1de26558..0df16747 100644 +--- a/src/wl_window.c ++++ b/src/wl_window.c +@@ -2586,8 +2586,9 @@ void _glfwGetCursorPosWayland(_GLFWwindow* window, double* xpos, double* ypos) + + void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y) + { +- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, +- "Wayland: The platform does not support setting the cursor position"); ++ window->wl.didAskForSetCursorPos = true; ++ window->wl.askedCursorPosX = x; ++ window->wl.askedCursorPosY = y; + } + + void _glfwSetCursorModeWayland(_GLFWwindow* window, int mode) +@@ -2819,6 +2820,15 @@ static const struct zwp_relative_pointer_v1_listener relativePointerListener = + static void lockedPointerHandleLocked(void* userData, + struct zwp_locked_pointer_v1* lockedPointer) + { ++ _GLFWwindow* window = userData; ++ ++ if (window->wl.didAskForSetCursorPos) ++ { ++ window->wl.didAskForSetCursorPos = false; ++ zwp_locked_pointer_v1_set_cursor_position_hint(window->wl.lockedPointer, ++ wl_fixed_from_double(window->wl.askedCursorPosX), ++ wl_fixed_from_double(window->wl.askedCursorPosY)); ++ } + } + + static void lockedPointerHandleUnlocked(void* userData, +-- +2.42.0 + diff --git a/pkgs/development/libraries/glfw/3.x-wayland-minecraft.nix b/pkgs/development/libraries/glfw/3.x-wayland-minecraft.nix index 03baa891b3b4d..e8b0174a53806 100644 --- a/pkgs/development/libraries/glfw/3.x-wayland-minecraft.nix +++ b/pkgs/development/libraries/glfw/3.x-wayland-minecraft.nix @@ -1,64 +1,8 @@ -{ stdenv, lib, fetchFromGitHub, fetchpatch2, cmake, extra-cmake-modules -, libGL, wayland, wayland-protocols, libxkbcommon, libdecor -}: - -stdenv.mkDerivation { - version = "unstable-2023-06-01"; +{ glfw }: +glfw.overrideAttrs (old: { pname = "glfw-wayland-minecraft"; - src = fetchFromGitHub { - owner = "glfw"; - repo = "GLFW"; - rev = "3eaf1255b29fdf5c2895856c7be7d7185ef2b241"; - sha256 = "sha256-UnwuE/3q6I4dS5syagpnqrDEVDK9XSVdyOg7KNkdUUA="; - }; - - patches = [ - (fetchpatch2 { - url = "https://raw.githubusercontent.com/Admicos/minecraft-wayland/15f88a515c63a9716cfdf4090fab8e16543f4ebd/0003-Don-t-crash-on-calls-to-focus-or-icon.patch"; - hash = "sha256-NZbKh16h+tWXXnz13QcFBFaeGXMNxZKGQb9xJEahFnE="; - }) - (fetchpatch2 { - url = "https://raw.githubusercontent.com/Admicos/minecraft-wayland/15f88a515c63a9716cfdf4090fab8e16543f4ebd/0005-Add-warning-about-being-an-unofficial-patch.patch"; - hash = "sha256-QMUNlnlCeFz5gIVdbM+YXPsrmiOl9cMwuVRSOvlw+T0="; - }) - ]; - - propagatedBuildInputs = [ libGL ]; - - nativeBuildInputs = [ cmake extra-cmake-modules ]; - - buildInputs = [ wayland wayland-protocols libxkbcommon ]; - - cmakeFlags = [ - "-DBUILD_SHARED_LIBS=ON" - "-DGLFW_BUILD_WAYLAND=ON" - "-DGLFW_BUILD_X11=OFF" - "-DCMAKE_C_FLAGS=-D_GLFW_EGL_LIBRARY='\"${lib.getLib libGL}/lib/libEGL.so.1\"'" + patches = old.patches or [] ++ [ + ./0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch ]; - - postPatch = '' - substituteInPlace src/wl_init.c \ - --replace "libxkbcommon.so.0" "${lib.getLib libxkbcommon}/lib/libxkbcommon.so.0" - - substituteInPlace src/wl_init.c \ - --replace "libdecor-0.so.0" "${lib.getLib libdecor}/lib/libdecor-0.so.0" - - substituteInPlace src/wl_init.c \ - --replace "libwayland-client.so.0" "${lib.getLib wayland}/lib/libwayland-client.so.0" - - substituteInPlace src/wl_init.c \ - --replace "libwayland-cursor.so.0" "${lib.getLib wayland}/lib/libwayland-cursor.so.0" - - substituteInPlace src/wl_init.c \ - --replace "libwayland-egl.so.1" "${lib.getLib wayland}/lib/libwayland-egl.so.1" - ''; - - meta = with lib; { - description = "Multi-platform library for creating OpenGL contexts and managing input, including keyboard, mouse, joystick and time - with patches to support Minecraft on Wayland"; - homepage = "https://www.glfw.org/"; - license = licenses.zlib; - maintainers = with maintainers; [ Scrumplex ]; - platforms = platforms.linux; - }; -} +}) diff --git a/pkgs/development/libraries/glfw/3.x.nix b/pkgs/development/libraries/glfw/3.x.nix index 5e0b6adbb2267..c1fab926beb1f 100644 --- a/pkgs/development/libraries/glfw/3.x.nix +++ b/pkgs/development/libraries/glfw/3.x.nix @@ -17,7 +17,7 @@ stdenv.mkDerivation rec { }; # Fix linkage issues on X11 (https://github.com/NixOS/nixpkgs/issues/142583) - patches = ./x11.patch; + patches = [ ./x11.patch ]; propagatedBuildInputs = lib.optionals stdenv.isDarwin [ OpenGL ]