Wayland: Merge function called once
This brings together the two halves of the cursor setting logic for the
fallback decorations.
(cherry picked from commit 6b48f2be97
)
This commit is contained in:
parent
1d766c8b39
commit
c3f15da23a
@ -1339,48 +1339,6 @@ static void pointerHandleLeave(void* userData,
|
|||||||
_glfwInputCursorEnter(window, GLFW_FALSE);
|
_glfwInputCursorEnter(window, GLFW_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setCursor(_GLFWwindow* window, const char* name)
|
|
||||||
{
|
|
||||||
struct wl_buffer* buffer;
|
|
||||||
struct wl_cursor* cursor;
|
|
||||||
struct wl_cursor_image* image;
|
|
||||||
struct wl_surface* surface = _glfw.wl.cursorSurface;
|
|
||||||
struct wl_cursor_theme* theme = _glfw.wl.cursorTheme;
|
|
||||||
int scale = 1;
|
|
||||||
|
|
||||||
if (window->wl.contentScale > 1 && _glfw.wl.cursorThemeHiDPI)
|
|
||||||
{
|
|
||||||
// We only support up to scale=2 for now, since libwayland-cursor
|
|
||||||
// requires us to load a different theme for each size.
|
|
||||||
scale = 2;
|
|
||||||
theme = _glfw.wl.cursorThemeHiDPI;
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor = wl_cursor_theme_get_cursor(theme, name);
|
|
||||||
if (!cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// TODO: handle animated cursors too.
|
|
||||||
image = cursor->images[0];
|
|
||||||
|
|
||||||
if (!image)
|
|
||||||
return;
|
|
||||||
|
|
||||||
buffer = wl_cursor_image_get_buffer(image);
|
|
||||||
if (!buffer)
|
|
||||||
return;
|
|
||||||
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial,
|
|
||||||
surface,
|
|
||||||
image->hotspot_x / scale,
|
|
||||||
image->hotspot_y / scale);
|
|
||||||
wl_surface_set_buffer_scale(surface, scale);
|
|
||||||
wl_surface_attach(surface, buffer, 0, 0);
|
|
||||||
wl_surface_damage(surface, 0, 0,
|
|
||||||
image->width, image->height);
|
|
||||||
wl_surface_commit(surface);
|
|
||||||
_glfw.wl.cursorPreviousName = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pointerHandleMotion(void* userData,
|
static void pointerHandleMotion(void* userData,
|
||||||
struct wl_pointer* pointer,
|
struct wl_pointer* pointer,
|
||||||
uint32_t time,
|
uint32_t time,
|
||||||
@ -1436,8 +1394,49 @@ static void pointerHandleMotion(void* userData,
|
|||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.wl.cursorPreviousName != cursorName)
|
if (_glfw.wl.cursorPreviousName != cursorName)
|
||||||
setCursor(window, cursorName);
|
{
|
||||||
|
struct wl_buffer* buffer;
|
||||||
|
struct wl_cursor* cursor;
|
||||||
|
struct wl_cursor_image* image;
|
||||||
|
struct wl_surface* surface = _glfw.wl.cursorSurface;
|
||||||
|
struct wl_cursor_theme* theme = _glfw.wl.cursorTheme;
|
||||||
|
int scale = 1;
|
||||||
|
|
||||||
|
if (window->wl.contentScale > 1 && _glfw.wl.cursorThemeHiDPI)
|
||||||
|
{
|
||||||
|
// We only support up to scale=2 for now, since libwayland-cursor
|
||||||
|
// requires us to load a different theme for each size.
|
||||||
|
scale = 2;
|
||||||
|
theme = _glfw.wl.cursorThemeHiDPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor = wl_cursor_theme_get_cursor(theme, name);
|
||||||
|
if (!cursor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// TODO: handle animated cursors too.
|
||||||
|
image = cursor->images[0];
|
||||||
|
|
||||||
|
if (!image)
|
||||||
|
return;
|
||||||
|
|
||||||
|
buffer = wl_cursor_image_get_buffer(image);
|
||||||
|
if (!buffer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial,
|
||||||
|
surface,
|
||||||
|
image->hotspot_x / scale,
|
||||||
|
image->hotspot_y / scale);
|
||||||
|
wl_surface_set_buffer_scale(surface, scale);
|
||||||
|
wl_surface_attach(surface, buffer, 0, 0);
|
||||||
|
wl_surface_damage(surface, 0, 0,
|
||||||
|
image->width, image->height);
|
||||||
|
wl_surface_commit(surface);
|
||||||
|
_glfw.wl.cursorPreviousName = name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pointerHandleButton(void* userData,
|
static void pointerHandleButton(void* userData,
|
||||||
|
Loading…
Reference in New Issue
Block a user