|
|
|
@ -370,24 +370,26 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, |
|
|
|
|
const GLFWimage* image, |
|
|
|
|
int xhot, int yhot) |
|
|
|
|
{ |
|
|
|
|
struct wl_shm_pool *pool; |
|
|
|
|
struct wl_shm_pool* pool; |
|
|
|
|
int stride = image->width * 4; |
|
|
|
|
int length = image->width * image->height * 4; |
|
|
|
|
void *data; |
|
|
|
|
void* data; |
|
|
|
|
int fd, i; |
|
|
|
|
|
|
|
|
|
fd = createAnonymousFile(length); |
|
|
|
|
if (fd < 0) { |
|
|
|
|
if (fd < 0) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Wayland: Creating a buffer file for %d B failed: %m\n", |
|
|
|
|
length); |
|
|
|
|
"Wayland: Creating a buffer file for %d B failed: %m\n", |
|
|
|
|
length); |
|
|
|
|
return GL_FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
data = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); |
|
|
|
|
if (data == MAP_FAILED) { |
|
|
|
|
if (data == MAP_FAILED) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Wayland: Cursor mmap failed: %m\n"); |
|
|
|
|
"Wayland: Cursor mmap failed: %m\n"); |
|
|
|
|
close(fd); |
|
|
|
|
return GL_FALSE; |
|
|
|
|
} |
|
|
|
@ -405,10 +407,11 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, |
|
|
|
|
*target++ = source[3]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cursor->wl.buffer = wl_shm_pool_create_buffer(pool, 0, |
|
|
|
|
image->width, |
|
|
|
|
image->height, |
|
|
|
|
stride, WL_SHM_FORMAT_ARGB8888); |
|
|
|
|
cursor->wl.buffer = |
|
|
|
|
wl_shm_pool_create_buffer(pool, 0, |
|
|
|
|
image->width, |
|
|
|
|
image->height, |
|
|
|
|
stride, WL_SHM_FORMAT_ARGB8888); |
|
|
|
|
munmap(data, length); |
|
|
|
|
wl_shm_pool_destroy(pool); |
|
|
|
|
|
|
|
|
@ -426,9 +429,9 @@ void _glfwPlatformDestroyCursor(_GLFWcursor* cursor) |
|
|
|
|
|
|
|
|
|
void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor) |
|
|
|
|
{ |
|
|
|
|
struct wl_buffer *buffer; |
|
|
|
|
struct wl_cursor_image *image; |
|
|
|
|
struct wl_surface *surface = _glfw.wl.cursorSurface; |
|
|
|
|
struct wl_buffer* buffer; |
|
|
|
|
struct wl_cursor_image* image; |
|
|
|
|
struct wl_surface* surface = _glfw.wl.cursorSurface; |
|
|
|
|
|
|
|
|
|
if (!_glfw.wl.pointer) |
|
|
|
|
return; |
|
|
|
@ -449,23 +452,23 @@ void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor) |
|
|
|
|
if (!buffer) |
|
|
|
|
return; |
|
|
|
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerSerial, |
|
|
|
|
surface, |
|
|
|
|
image->hotspot_x, |
|
|
|
|
image->hotspot_y); |
|
|
|
|
surface, |
|
|
|
|
image->hotspot_x, |
|
|
|
|
image->hotspot_y); |
|
|
|
|
wl_surface_attach(surface, buffer, 0, 0); |
|
|
|
|
wl_surface_damage(surface, 0, 0, |
|
|
|
|
image->width, image->height); |
|
|
|
|
image->width, image->height); |
|
|
|
|
wl_surface_commit(surface); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerSerial, |
|
|
|
|
surface, |
|
|
|
|
cursor->wl.xhot, |
|
|
|
|
cursor->wl.yhot); |
|
|
|
|
surface, |
|
|
|
|
cursor->wl.xhot, |
|
|
|
|
cursor->wl.yhot); |
|
|
|
|
wl_surface_attach(surface, cursor->wl.buffer, 0, 0); |
|
|
|
|
wl_surface_damage(surface, 0, 0, |
|
|
|
|
cursor->wl.width, cursor->wl.height); |
|
|
|
|
cursor->wl.width, cursor->wl.height); |
|
|
|
|
wl_surface_commit(surface); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|