mirror of
				https://github.com/glfw/glfw.git
				synced 2025-11-03 22:04:15 +00:00 
			
		
		
		
	Wayland: Merge function called once
This brings together the two halves of the cursor setting logic for the fallback decorations.
This commit is contained in:
		
							parent
							
								
									00a663dafd
								
							
						
					
					
						commit
						6b48f2be97
					
				@ -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,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user