mirror of
https://github.com/glfw/glfw.git
synced 2024-11-25 14:04:36 +00:00
Wayland: Fix GLFW_HOVERED for fallback decorations
When using the fallback decorations, GLFW_HOVERED was true also when the cursor was over one of the window decorations. This also disentangles the GLFW_HOVERED state from the fallback decorations. Because GLFW_HOVERED should have had the same behavior as GLFW_MAIN_WINDOW, the latter has been removed.
This commit is contained in:
parent
5e97447dd5
commit
ea6dd72c71
@ -181,6 +181,8 @@ information on what to include when reporting a bug.
|
|||||||
- [Wayland] Added support for `glfwFocusWindow`
|
- [Wayland] Added support for `glfwFocusWindow`
|
||||||
- [Wayland] Added dynamic loading of all Wayland libraries
|
- [Wayland] Added dynamic loading of all Wayland libraries
|
||||||
- [Wayland] Bugfix: `CLOCK_MONOTONIC` was not correctly enabled
|
- [Wayland] Bugfix: `CLOCK_MONOTONIC` was not correctly enabled
|
||||||
|
- [Wayland] Bugfix: `GLFW_HOVERED` was true when the cursor was over any
|
||||||
|
fallback window decoration
|
||||||
- [X11] Bugfix: Termination would segfault if the IM had been destroyed
|
- [X11] Bugfix: Termination would segfault if the IM had been destroyed
|
||||||
- [X11] Bugfix: Any IM started after initialization would not be detected
|
- [X11] Bugfix: Any IM started after initialization would not be detected
|
||||||
- [POSIX] Removed use of deprecated function `gettimeofday`
|
- [POSIX] Removed use of deprecated function `gettimeofday`
|
||||||
|
@ -325,7 +325,6 @@ typedef void (* PFN_libdecor_state_free)(struct libdecor_state*);
|
|||||||
|
|
||||||
typedef enum _GLFWdecorationSideWayland
|
typedef enum _GLFWdecorationSideWayland
|
||||||
{
|
{
|
||||||
GLFW_MAIN_WINDOW,
|
|
||||||
GLFW_TOP_DECORATION,
|
GLFW_TOP_DECORATION,
|
||||||
GLFW_LEFT_DECORATION,
|
GLFW_LEFT_DECORATION,
|
||||||
GLFW_RIGHT_DECORATION,
|
GLFW_RIGHT_DECORATION,
|
||||||
|
@ -1025,7 +1025,7 @@ static void incrementCursorImage(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
_GLFWcursor* cursor;
|
_GLFWcursor* cursor;
|
||||||
|
|
||||||
if (!window || window->wl.fallback.focus != GLFW_MAIN_WINDOW)
|
if (!window || !window->wl.hovered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cursor = window->wl.currentCursor;
|
cursor = window->wl.currentCursor;
|
||||||
@ -1276,7 +1276,9 @@ static void pointerHandleEnter(void* userData,
|
|||||||
|
|
||||||
_GLFWwindow* window = wl_surface_get_user_data(surface);
|
_GLFWwindow* window = wl_surface_get_user_data(surface);
|
||||||
|
|
||||||
if (surface == window->wl.fallback.top.surface)
|
if (surface == window->wl.surface)
|
||||||
|
window->wl.hovered = GLFW_TRUE;
|
||||||
|
else if (surface == window->wl.fallback.top.surface)
|
||||||
window->wl.fallback.focus = GLFW_TOP_DECORATION;
|
window->wl.fallback.focus = GLFW_TOP_DECORATION;
|
||||||
else if (surface == window->wl.fallback.left.surface)
|
else if (surface == window->wl.fallback.left.surface)
|
||||||
window->wl.fallback.focus = GLFW_LEFT_DECORATION;
|
window->wl.fallback.focus = GLFW_LEFT_DECORATION;
|
||||||
@ -1284,17 +1286,16 @@ static void pointerHandleEnter(void* userData,
|
|||||||
window->wl.fallback.focus = GLFW_RIGHT_DECORATION;
|
window->wl.fallback.focus = GLFW_RIGHT_DECORATION;
|
||||||
else if (surface == window->wl.fallback.bottom.surface)
|
else if (surface == window->wl.fallback.bottom.surface)
|
||||||
window->wl.fallback.focus = GLFW_BOTTOM_DECORATION;
|
window->wl.fallback.focus = GLFW_BOTTOM_DECORATION;
|
||||||
else
|
|
||||||
window->wl.fallback.focus = GLFW_MAIN_WINDOW;
|
|
||||||
|
|
||||||
_glfw.wl.serial = serial;
|
_glfw.wl.serial = serial;
|
||||||
_glfw.wl.pointerEnterSerial = serial;
|
_glfw.wl.pointerEnterSerial = serial;
|
||||||
_glfw.wl.pointerFocus = window;
|
_glfw.wl.pointerFocus = window;
|
||||||
|
|
||||||
window->wl.hovered = GLFW_TRUE;
|
if (window->wl.hovered)
|
||||||
|
{
|
||||||
_glfwSetCursorWayland(window, window->wl.currentCursor);
|
_glfwSetCursorWayland(window, window->wl.currentCursor);
|
||||||
_glfwInputCursorEnter(window, GLFW_TRUE);
|
_glfwInputCursorEnter(window, GLFW_TRUE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pointerHandleLeave(void* userData,
|
static void pointerHandleLeave(void* userData,
|
||||||
@ -1312,12 +1313,15 @@ static void pointerHandleLeave(void* userData,
|
|||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
window->wl.hovered = GLFW_FALSE;
|
|
||||||
|
|
||||||
_glfw.wl.serial = serial;
|
_glfw.wl.serial = serial;
|
||||||
_glfw.wl.pointerFocus = NULL;
|
_glfw.wl.pointerFocus = NULL;
|
||||||
_glfw.wl.cursorPreviousName = NULL;
|
_glfw.wl.cursorPreviousName = NULL;
|
||||||
_glfwInputCursorEnter(window, GLFW_FALSE);
|
|
||||||
|
if (window->wl.hovered)
|
||||||
|
{
|
||||||
|
window->wl.hovered = GLFW_FALSE;
|
||||||
|
_glfwInputCursorEnter(window, GLFW_FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pointerHandleMotion(void* userData,
|
static void pointerHandleMotion(void* userData,
|
||||||
@ -1338,14 +1342,17 @@ static void pointerHandleMotion(void* userData,
|
|||||||
window->wl.cursorPosX = xpos;
|
window->wl.cursorPosX = xpos;
|
||||||
window->wl.cursorPosY = ypos;
|
window->wl.cursorPosY = ypos;
|
||||||
|
|
||||||
|
if (window->wl.hovered)
|
||||||
|
{
|
||||||
|
_glfw.wl.cursorPreviousName = NULL;
|
||||||
|
_glfwInputCursorPos(window, xpos, ypos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const char* cursorName = NULL;
|
const char* cursorName = NULL;
|
||||||
|
|
||||||
switch (window->wl.fallback.focus)
|
switch (window->wl.fallback.focus)
|
||||||
{
|
{
|
||||||
case GLFW_MAIN_WINDOW:
|
|
||||||
_glfw.wl.cursorPreviousName = NULL;
|
|
||||||
_glfwInputCursorPos(window, xpos, ypos);
|
|
||||||
return;
|
|
||||||
case GLFW_TOP_DECORATION:
|
case GLFW_TOP_DECORATION:
|
||||||
if (ypos < GLFW_BORDER_SIZE)
|
if (ypos < GLFW_BORDER_SIZE)
|
||||||
cursorName = "n-resize";
|
cursorName = "n-resize";
|
||||||
@ -1429,12 +1436,28 @@ static void pointerHandleButton(void* userData,
|
|||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (window->wl.hovered)
|
||||||
|
{
|
||||||
|
_glfw.wl.serial = serial;
|
||||||
|
|
||||||
|
/* Makes left, right and middle 0, 1 and 2. Overall order follows evdev
|
||||||
|
* codes. */
|
||||||
|
glfwButton = button - BTN_LEFT;
|
||||||
|
|
||||||
|
_glfwInputMouseClick(window,
|
||||||
|
glfwButton,
|
||||||
|
state == WL_POINTER_BUTTON_STATE_PRESSED
|
||||||
|
? GLFW_PRESS
|
||||||
|
: GLFW_RELEASE,
|
||||||
|
_glfw.wl.xkb.modifiers);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (button == BTN_LEFT)
|
if (button == BTN_LEFT)
|
||||||
{
|
{
|
||||||
switch (window->wl.fallback.focus)
|
switch (window->wl.fallback.focus)
|
||||||
{
|
{
|
||||||
case GLFW_MAIN_WINDOW:
|
|
||||||
break;
|
|
||||||
case GLFW_TOP_DECORATION:
|
case GLFW_TOP_DECORATION:
|
||||||
if (window->wl.cursorPosY < GLFW_BORDER_SIZE)
|
if (window->wl.cursorPosY < GLFW_BORDER_SIZE)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP;
|
||||||
@ -1468,38 +1491,18 @@ static void pointerHandleButton(void* userData,
|
|||||||
{
|
{
|
||||||
xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat,
|
xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat,
|
||||||
serial, edges);
|
serial, edges);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (button == BTN_RIGHT)
|
else if (button == BTN_RIGHT)
|
||||||
{
|
{
|
||||||
if (window->wl.fallback.focus != GLFW_MAIN_WINDOW &&
|
if (window->wl.xdg.toplevel)
|
||||||
window->wl.xdg.toplevel)
|
|
||||||
{
|
{
|
||||||
xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
|
xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
|
||||||
_glfw.wl.seat, serial,
|
_glfw.wl.seat, serial,
|
||||||
window->wl.cursorPosX,
|
window->wl.cursorPosX,
|
||||||
window->wl.cursorPosY);
|
window->wl.cursorPosY);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don’t pass the button to the user if it was related to a decoration.
|
|
||||||
if (window->wl.fallback.focus != GLFW_MAIN_WINDOW)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_glfw.wl.serial = serial;
|
|
||||||
|
|
||||||
/* Makes left, right and middle 0, 1 and 2. Overall order follows evdev
|
|
||||||
* codes. */
|
|
||||||
glfwButton = button - BTN_LEFT;
|
|
||||||
|
|
||||||
_glfwInputMouseClick(window,
|
|
||||||
glfwButton,
|
|
||||||
state == WL_POINTER_BUTTON_STATE_PRESSED
|
|
||||||
? GLFW_PRESS
|
|
||||||
: GLFW_RELEASE,
|
|
||||||
_glfw.wl.xkb.modifiers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pointerHandleAxis(void* userData,
|
static void pointerHandleAxis(void* userData,
|
||||||
@ -2925,11 +2928,8 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
|
|||||||
|
|
||||||
// If we're not in the correct window just save the cursor
|
// If we're not in the correct window just save the cursor
|
||||||
// the next time the pointer enters the window the cursor will change
|
// the next time the pointer enters the window the cursor will change
|
||||||
if (window != _glfw.wl.pointerFocus ||
|
if (!window->wl.hovered)
|
||||||
window->wl.fallback.focus != GLFW_MAIN_WINDOW)
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
// Update pointer lock to match cursor mode
|
// Update pointer lock to match cursor mode
|
||||||
if (window->cursorMode == GLFW_CURSOR_DISABLED)
|
if (window->cursorMode == GLFW_CURSOR_DISABLED)
|
||||||
|
Loading…
Reference in New Issue
Block a user