|  |  |  | @ -1308,48 +1308,6 @@ static void pointerHandleLeave(void* userData, | 
			
		
	
		
			
				
					|  |  |  |  |     _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, | 
			
		
	
		
			
				
					|  |  |  |  |                                 struct wl_pointer* pointer, | 
			
		
	
		
			
				
					|  |  |  |  |                                 uint32_t time, | 
			
		
	
	
		
			
				
					|  |  |  | @ -1405,8 +1363,49 @@ static void pointerHandleMotion(void* userData, | 
			
		
	
		
			
				
					|  |  |  |  |         default: | 
			
		
	
		
			
				
					|  |  |  |  |             assert(0); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     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, | 
			
		
	
	
		
			
				
					|  |  |  | 
 |