Wayland: Clean up pointer locking

Shorten names and allow C99 declarations.  Replace helper function with
the NULL check it was hiding.  Separate cursor hiding from pointer
locking.
master
Camilla Löwy ago%!(EXTRA string=3 years) committed by Camilla Löwy
parent b9ed25d2e9
commit e85b645b8a
  1. 6
      src/wl_platform.h
  2. 88
      src/wl_window.c

@ -267,10 +267,8 @@ typedef struct _GLFWwindowWayland
int monitorsCount;
int monitorsSize;
struct {
struct zwp_relative_pointer_v1* relativePointer;
struct zwp_locked_pointer_v1* lockedPointer;
} pointerLock;
struct zwp_relative_pointer_v1* relativePointer;
struct zwp_locked_pointer_v1* lockedPointer;
struct zwp_idle_inhibitor_v1* idleInhibitor;

@ -2241,15 +2241,14 @@ void _glfwGetCursorPosWayland(_GLFWwindow* window, double* xpos, double* ypos)
*ypos = window->wl.cursorPosY;
}
static GLFWbool isPointerLocked(_GLFWwindow* window);
void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y)
{
if (isPointerLocked(window))
if (window->wl.lockedPointer)
{
zwp_locked_pointer_v1_set_cursor_position_hint(
window->wl.pointerLock.lockedPointer,
wl_fixed_from_double(x), wl_fixed_from_double(y));
window->wl.lockedPointer,
wl_fixed_from_double(x),
wl_fixed_from_double(y));
}
}
@ -2486,20 +2485,13 @@ static void lockedPointerHandleLocked(void* userData,
static void unlockPointer(_GLFWwindow* window)
{
struct zwp_relative_pointer_v1* relativePointer =
window->wl.pointerLock.relativePointer;
struct zwp_locked_pointer_v1* lockedPointer =
window->wl.pointerLock.lockedPointer;
zwp_relative_pointer_v1_destroy(relativePointer);
zwp_locked_pointer_v1_destroy(lockedPointer);
zwp_relative_pointer_v1_destroy(window->wl.relativePointer);
window->wl.relativePointer = NULL;
window->wl.pointerLock.relativePointer = NULL;
window->wl.pointerLock.lockedPointer = NULL;
zwp_locked_pointer_v1_destroy(window->wl.lockedPointer);
window->wl.lockedPointer = NULL;
}
static void lockPointer(_GLFWwindow* window);
static void lockedPointerHandleUnlocked(void* userData,
struct zwp_locked_pointer_v1* lockedPointer)
{
@ -2513,9 +2505,6 @@ static const struct zwp_locked_pointer_v1_listener lockedPointerListener =
static void lockPointer(_GLFWwindow* window)
{
struct zwp_relative_pointer_v1* relativePointer;
struct zwp_locked_pointer_v1* lockedPointer;
if (!_glfw.wl.relativePointerManager)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
@ -2523,42 +2512,28 @@ static void lockPointer(_GLFWwindow* window)
return;
}
relativePointer =
window->wl.relativePointer =
zwp_relative_pointer_manager_v1_get_relative_pointer(
_glfw.wl.relativePointerManager,
_glfw.wl.pointer);
zwp_relative_pointer_v1_add_listener(relativePointer,
zwp_relative_pointer_v1_add_listener(window->wl.relativePointer,
&relativePointerListener,
window);
lockedPointer =
window->wl.lockedPointer =
zwp_pointer_constraints_v1_lock_pointer(
_glfw.wl.pointerConstraints,
window->wl.surface,
_glfw.wl.pointer,
NULL,
ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT);
zwp_locked_pointer_v1_add_listener(lockedPointer,
zwp_locked_pointer_v1_add_listener(window->wl.lockedPointer,
&lockedPointerListener,
window);
window->wl.pointerLock.relativePointer = relativePointer;
window->wl.pointerLock.lockedPointer = lockedPointer;
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial,
NULL, 0, 0);
}
static GLFWbool isPointerLocked(_GLFWwindow* window)
{
return window->wl.pointerLock.lockedPointer != NULL;
}
void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
{
struct wl_cursor* defaultCursor;
struct wl_cursor* defaultCursorHiDPI = NULL;
if (!_glfw.wl.pointer)
return;
@ -2569,9 +2544,17 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
if (window != _glfw.wl.pointerFocus || window->wl.decorations.focus != mainWindow)
return;
// Unlock possible pointer lock if no longer disabled.
if (window->cursorMode != GLFW_CURSOR_DISABLED && isPointerLocked(window))
unlockPointer(window);
// Update pointer lock to match cursor mode
if (window->cursorMode == GLFW_CURSOR_DISABLED)
{
if (!window->wl.lockedPointer)
lockPointer(window);
}
else
{
if (window->wl.lockedPointer)
unlockPointer(window);
}
if (window->cursorMode == GLFW_CURSOR_NORMAL)
{
@ -2579,19 +2562,24 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
setCursorImage(window, &cursor->wl);
else
{
defaultCursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme,
"left_ptr");
struct wl_cursor* defaultCursor =
wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme, "left_ptr");
if (!defaultCursor)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"Wayland: Standard cursor not found");
return;
}
struct wl_cursor* defaultCursorHiDPI = NULL;
if (_glfw.wl.cursorThemeHiDPI)
{
defaultCursorHiDPI =
wl_cursor_theme_get_cursor(_glfw.wl.cursorThemeHiDPI,
"left_ptr");
_GLFWcursorWayland cursorWayland = {
wl_cursor_theme_get_cursor(_glfw.wl.cursorThemeHiDPI, "left_ptr");
}
_GLFWcursorWayland cursorWayland =
{
defaultCursor,
defaultCursorHiDPI,
NULL,
@ -2599,18 +2587,12 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
0, 0,
0
};
setCursorImage(window, &cursorWayland);
}
}
else if (window->cursorMode == GLFW_CURSOR_DISABLED)
{
if (!isPointerLocked(window))
lockPointer(window);
}
else if (window->cursorMode == GLFW_CURSOR_HIDDEN)
{
else
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial, NULL, 0, 0);
}
}
static void dataSourceHandleTarget(void* userData,

Loading…
Cancel
Save