|
@@ -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,
|