cursor: Support css and wayland cursor-shape cursors

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3668>
This commit is contained in:
Sebastian Wick 2025-01-31 15:52:56 +01:00 committed by Marge Bot
parent 4009bfe006
commit 92c6452753
6 changed files with 214 additions and 108 deletions

View File

@ -53,43 +53,78 @@ meta_cursor_get_name (MetaCursor cursor)
{
case META_CURSOR_DEFAULT:
return "default";
case META_CURSOR_NORTH_RESIZE:
return "n-resize";
case META_CURSOR_SOUTH_RESIZE:
return "s-resize";
case META_CURSOR_WEST_RESIZE:
return "w-resize";
case META_CURSOR_EAST_RESIZE:
case META_CURSOR_CONTEXT_MENU:
return "context-menu";
case META_CURSOR_HELP:
return "help";
case META_CURSOR_POINTER:
return "pointer";
case META_CURSOR_PROGRESS:
return "progress";
case META_CURSOR_WAIT:
return "wait";
case META_CURSOR_CELL:
return "cell";
case META_CURSOR_CROSSHAIR:
return "crosshair";
case META_CURSOR_TEXT:
return "text";
case META_CURSOR_VERTICAL_TEXT:
return "vertical-text";
case META_CURSOR_ALIAS:
return "alias";
case META_CURSOR_COPY:
return "copy";
case META_CURSOR_MOVE:
return "move";
case META_CURSOR_NO_DROP:
return "no-drop";
case META_CURSOR_NOT_ALLOWED:
return "not-allowed";
case META_CURSOR_GRAB:
return "grab";
case META_CURSOR_GRABBING:
return "grabbing";
case META_CURSOR_E_RESIZE:
return "e-resize";
case META_CURSOR_SE_RESIZE:
return "se-resize";
case META_CURSOR_SW_RESIZE:
return "sw-resize";
case META_CURSOR_N_RESIZE:
return "n-resize";
case META_CURSOR_NE_RESIZE:
return "ne-resize";
case META_CURSOR_NW_RESIZE:
return "nw-resize";
case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
return "move";
case META_CURSOR_BUSY:
return "wait";
case META_CURSOR_DND_IN_DRAG:
return "default";
case META_CURSOR_DND_MOVE:
return "default";
case META_CURSOR_DND_COPY:
return "copy";
case META_CURSOR_DND_UNSUPPORTED_TARGET:
return "no-drop";
case META_CURSOR_POINTING_HAND:
return "pointer";
case META_CURSOR_CROSSHAIR:
return "crosshair";
case META_CURSOR_IBEAM:
return "text";
case META_CURSOR_BLANK:
case META_CURSOR_S_RESIZE:
return "s-resize";
case META_CURSOR_SE_RESIZE:
return "se-resize";
case META_CURSOR_SW_RESIZE:
return "sw-resize";
case META_CURSOR_W_RESIZE:
return "w-resize";
case META_CURSOR_EW_RESIZE:
return "ew-resize";
case META_CURSOR_NS_RESIZE:
return "ns-resize";
case META_CURSOR_NESW_RESIZE:
return "nesw-resize";
case META_CURSOR_NWSE_RESIZE:
return "nwse-resize";
case META_CURSOR_COL_RESIZE:
return "col-resize";
case META_CURSOR_ROW_RESIZE:
return "row-resize";
case META_CURSOR_ALL_SCROLL:
return "all-scroll";
case META_CURSOR_ZOOM_IN:
return "zoom-in";
case META_CURSOR_ZOOM_OUT:
return "zoom-out";
case META_CURSOR_DND_ASK:
return "dnd-ask";
case META_CURSOR_ALL_RESIZE:
return "all-resize";
case META_CURSOR_INVALID:
case META_CURSOR_NONE:
case META_CURSOR_LAST:
break;
}
@ -104,43 +139,78 @@ meta_cursor_get_legacy_name (MetaCursor cursor)
{
case META_CURSOR_DEFAULT:
return "left_ptr";
case META_CURSOR_NORTH_RESIZE:
return "top_side";
case META_CURSOR_SOUTH_RESIZE:
return "bottom_side";
case META_CURSOR_WEST_RESIZE:
return "left_side";
case META_CURSOR_EAST_RESIZE:
case META_CURSOR_CONTEXT_MENU:
return "left_ptr";
case META_CURSOR_HELP:
return "question_arrow";
case META_CURSOR_POINTER:
return "hand";
case META_CURSOR_PROGRESS:
return "left_ptr_watch";
case META_CURSOR_WAIT:
return "watch";
case META_CURSOR_CELL:
return "crosshair";
case META_CURSOR_CROSSHAIR:
return "cross";
case META_CURSOR_TEXT:
return "xterm";
case META_CURSOR_VERTICAL_TEXT:
return "xterm";
case META_CURSOR_ALIAS:
return "dnd-link";
case META_CURSOR_COPY:
return "dnd-copy";
case META_CURSOR_MOVE:
return "dnd-move";
case META_CURSOR_NO_DROP:
return "dnd-none";
case META_CURSOR_NOT_ALLOWED:
return "crossed_circle";
case META_CURSOR_GRAB:
return "hand2";
case META_CURSOR_GRABBING:
return "hand2";
case META_CURSOR_E_RESIZE:
return "right_side";
case META_CURSOR_SE_RESIZE:
return "bottom_right_corner";
case META_CURSOR_SW_RESIZE:
return "bottom_left_corner";
case META_CURSOR_N_RESIZE:
return "top_side";
case META_CURSOR_NE_RESIZE:
return "top_right_corner";
case META_CURSOR_NW_RESIZE:
return "top_left_corner";
case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
return "fleur";
case META_CURSOR_BUSY:
return "watch";
case META_CURSOR_DND_IN_DRAG:
return "dnd-none";
case META_CURSOR_DND_MOVE:
return "dnd-move";
case META_CURSOR_DND_COPY:
case META_CURSOR_S_RESIZE:
return "bottom_side";
case META_CURSOR_SE_RESIZE:
return "bottom_right_corner";
case META_CURSOR_SW_RESIZE:
return "bottom_left_corner";
case META_CURSOR_W_RESIZE:
return "left_side";
case META_CURSOR_EW_RESIZE:
return "h_double_arrow";
case META_CURSOR_NS_RESIZE:
return "v_double_arrow";
case META_CURSOR_NESW_RESIZE:
return "fd_double_arrow";
case META_CURSOR_NWSE_RESIZE:
return "bd_double_arrow";
case META_CURSOR_COL_RESIZE:
return "h_double_arrow";
case META_CURSOR_ROW_RESIZE:
return "v_double_arrow";
case META_CURSOR_ALL_SCROLL:
return "left_ptr";
case META_CURSOR_ZOOM_IN:
return "left_ptr";
case META_CURSOR_ZOOM_OUT:
return "left_ptr";
case META_CURSOR_DND_ASK:
return "dnd-copy";
case META_CURSOR_DND_UNSUPPORTED_TARGET:
return "dnd-none";
case META_CURSOR_POINTING_HAND:
return "hand2";
case META_CURSOR_CROSSHAIR:
return "crosshair";
case META_CURSOR_IBEAM:
return "xterm";
case META_CURSOR_BLANK:
case META_CURSOR_ALL_RESIZE:
return "dnd-move";
case META_CURSOR_INVALID:
case META_CURSOR_NONE:
case META_CURSOR_LAST:
break;
}
@ -177,7 +247,7 @@ load_cursor_on_client (MetaCursor cursor,
int fallback_size, i;
const char *cursor_names[2];
if (cursor == META_CURSOR_BLANK)
if (cursor == META_CURSOR_NONE)
return create_blank_cursor_images ();
cursor_names[0] = meta_cursor_get_name (cursor);
@ -347,7 +417,7 @@ load_cursor_from_theme (MetaCursorSprite *sprite)
{
MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
g_assert (sprite_xcursor->cursor != META_CURSOR_NONE);
g_assert (sprite_xcursor->cursor != META_CURSOR_INVALID);
sprite_xcursor->theme_dirty = FALSE;

View File

@ -73,7 +73,7 @@ create_x_cursor (Display *xdisplay,
{
Cursor result;
if (cursor == META_CURSOR_BLANK)
if (cursor == META_CURSOR_NONE)
return create_blank_cursor (xdisplay);
result = XcursorLibraryLoadCursor (xdisplay, meta_cursor_get_name (cursor));
@ -109,7 +109,7 @@ meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer,
MetaCursor cursor;
cursor = meta_cursor_sprite_xcursor_get_cursor (sprite_xcursor);
if (cursor != META_CURSOR_NONE)
if (cursor != META_CURSOR_INVALID)
{
Cursor xcursor;

View File

@ -309,7 +309,7 @@ meta_cursor_for_grab_op (MetaGrabOp op)
break;
case META_GRAB_OP_RESIZING_S:
case META_GRAB_OP_KEYBOARD_RESIZING_S:
return META_CURSOR_SOUTH_RESIZE;
return META_CURSOR_S_RESIZE;
break;
case META_GRAB_OP_RESIZING_SW:
case META_GRAB_OP_KEYBOARD_RESIZING_SW:
@ -317,7 +317,7 @@ meta_cursor_for_grab_op (MetaGrabOp op)
break;
case META_GRAB_OP_RESIZING_N:
case META_GRAB_OP_KEYBOARD_RESIZING_N:
return META_CURSOR_NORTH_RESIZE;
return META_CURSOR_N_RESIZE;
break;
case META_GRAB_OP_RESIZING_NE:
case META_GRAB_OP_KEYBOARD_RESIZING_NE:
@ -329,18 +329,18 @@ meta_cursor_for_grab_op (MetaGrabOp op)
break;
case META_GRAB_OP_RESIZING_W:
case META_GRAB_OP_KEYBOARD_RESIZING_W:
return META_CURSOR_WEST_RESIZE;
return META_CURSOR_W_RESIZE;
break;
case META_GRAB_OP_RESIZING_E:
case META_GRAB_OP_KEYBOARD_RESIZING_E:
return META_CURSOR_EAST_RESIZE;
return META_CURSOR_E_RESIZE;
break;
case META_GRAB_OP_MOVING:
return META_CURSOR_DEFAULT;
break;
case META_GRAB_OP_KEYBOARD_MOVING:
case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN:
return META_CURSOR_MOVE_OR_RESIZE_WINDOW;
return META_CURSOR_MOVE;
break;
default:
break;

View File

@ -143,7 +143,7 @@ meta_startup_notification_update_cursor (MetaStartupNotification *sn)
{
meta_topic (META_DEBUG_STARTUP,
"Setting busy cursor");
cursor = META_CURSOR_BUSY;
cursor = META_CURSOR_WAIT;
}
else
{

View File

@ -116,49 +116,85 @@ typedef enum
/**
* MetaCursor:
* @META_CURSOR_INVALID: No cursor
* @META_CURSOR_NONE: No cursor
* @META_CURSOR_DEFAULT: Default cursor
* @META_CURSOR_NORTH_RESIZE: Resize northern edge cursor
* @META_CURSOR_SOUTH_RESIZE: Resize southern edge cursor
* @META_CURSOR_WEST_RESIZE: Resize western edge cursor
* @META_CURSOR_EAST_RESIZE: Resize eastern edge cursor
* @META_CURSOR_SE_RESIZE: Resize south-eastern corner cursor
* @META_CURSOR_SW_RESIZE: Resize south-western corner cursor
* @META_CURSOR_CONTEXT_MENU: Context menu cursor
* @META_CURSOR_HELP: Help cursor
* @META_CURSOR_POINTER: Pointer cursor
* @META_CURSOR_PROGRESS: Progress cursor
* @META_CURSOR_WAIT: Wait cursor
* @META_CURSOR_CELL: Cell cursor
* @META_CURSOR_CROSSHAIR: Crosshair cursor
* @META_CURSOR_TEXT: Text cursor
* @META_CURSOR_VERTICAL_TEXT: Vertical text cursor
* @META_CURSOR_ALIAS: DnD alias cursor
* @META_CURSOR_COPY: DnD copy cursor
* @META_CURSOR_MOVE: DnD move cursor
* @META_CURSOR_NO_DROP: DnD no drop cursor
* @META_CURSOR_NOT_ALLOWED: DnD not allowed cursor
* @META_CURSOR_GRAB: DnD grab cursor
* @META_CURSOR_GRABBING: DnD grabbing cursor
* @META_CURSOR_E_RESIZE: Resize eastern edge cursor
* @META_CURSOR_N_RESIZE: Resize northern edge cursor
* @META_CURSOR_NE_RESIZE: Resize north-eastern corner cursor
* @META_CURSOR_NW_RESIZE: Resize north-western corner cursor
* @META_CURSOR_MOVE_OR_RESIZE_WINDOW: Move or resize cursor
* @META_CURSOR_BUSY: Busy cursor
* @META_CURSOR_DND_IN_DRAG: DND in drag cursor
* @META_CURSOR_DND_MOVE: DND move cursor
* @META_CURSOR_DND_COPY: DND copy cursor
* @META_CURSOR_DND_UNSUPPORTED_TARGET: DND unsupported target
* @META_CURSOR_POINTING_HAND: pointing hand
* @META_CURSOR_CROSSHAIR: crosshair (action forbidden)
* @META_CURSOR_IBEAM: I-beam (text input)
* @META_CURSOR_BLANK: Invisible cursor
* @META_CURSOR_S_RESIZE: Resize southern edge cursor
* @META_CURSOR_SE_RESIZE: Resize south-eastern corner cursor
* @META_CURSOR_SW_RESIZE: Resize south-western corner cursor
* @META_CURSOR_W_RESIZE: Resize western edge cursor
* @META_CURSOR_EW_RESIZE: Resize eastern and western edges cursor
* @META_CURSOR_NS_RESIZE: Resize northern and eastern edges cursor
* @META_CURSOR_NESW_RESIZE: Resize north-east and south-west corners cursor
* @META_CURSOR_NWSE_RESIZE: Resize north-west and south-east corners cursor
* @META_CURSOR_COL_RESIZE: Resize column cursor
* @META_CURSOR_ROW_RESIZE: Resize row cursor
* @META_CURSOR_ALL_SCROLL: Scroll all directions cursor
* @META_CURSOR_ZOOM_IN: Zoom in cursor
* @META_CURSOR_ZOOM_OUT: Zoom out cursor
* @META_CURSOR_DND_ASK: DnD ask cursor
* @META_CURSOR_ALL_RESIZE: Resize all directions
*/
typedef enum
{
META_CURSOR_NONE = 0,
META_CURSOR_INVALID = 0,
META_CURSOR_NONE,
META_CURSOR_DEFAULT,
META_CURSOR_NORTH_RESIZE,
META_CURSOR_SOUTH_RESIZE,
META_CURSOR_WEST_RESIZE,
META_CURSOR_EAST_RESIZE,
META_CURSOR_SE_RESIZE,
META_CURSOR_SW_RESIZE,
META_CURSOR_CONTEXT_MENU,
META_CURSOR_HELP,
META_CURSOR_POINTER,
META_CURSOR_PROGRESS,
META_CURSOR_WAIT,
META_CURSOR_CELL,
META_CURSOR_CROSSHAIR,
META_CURSOR_TEXT,
META_CURSOR_VERTICAL_TEXT,
META_CURSOR_ALIAS,
META_CURSOR_COPY,
META_CURSOR_MOVE,
META_CURSOR_NO_DROP,
META_CURSOR_NOT_ALLOWED,
META_CURSOR_GRAB,
META_CURSOR_GRABBING,
META_CURSOR_E_RESIZE,
META_CURSOR_N_RESIZE,
META_CURSOR_NE_RESIZE,
META_CURSOR_NW_RESIZE,
META_CURSOR_MOVE_OR_RESIZE_WINDOW,
META_CURSOR_BUSY,
META_CURSOR_DND_IN_DRAG,
META_CURSOR_DND_MOVE,
META_CURSOR_DND_COPY,
META_CURSOR_DND_UNSUPPORTED_TARGET,
META_CURSOR_POINTING_HAND,
META_CURSOR_CROSSHAIR,
META_CURSOR_IBEAM,
META_CURSOR_BLANK,
META_CURSOR_LAST
META_CURSOR_S_RESIZE,
META_CURSOR_SE_RESIZE,
META_CURSOR_SW_RESIZE,
META_CURSOR_W_RESIZE,
META_CURSOR_EW_RESIZE,
META_CURSOR_NS_RESIZE,
META_CURSOR_NESW_RESIZE,
META_CURSOR_NWSE_RESIZE,
META_CURSOR_COL_RESIZE,
META_CURSOR_ROW_RESIZE,
META_CURSOR_ALL_SCROLL,
META_CURSOR_ZOOM_IN,
META_CURSOR_ZOOM_OUT,
META_CURSOR_DND_ASK, /* not css */
META_CURSOR_ALL_RESIZE, /* not css */
} MetaCursor;
/**

View File

@ -419,7 +419,7 @@ meta_test_native_cursor_scaling (void)
};
int i;
cursor = META_CURSOR_MOVE_OR_RESIZE_WINDOW;
cursor = META_CURSOR_MOVE;
meta_display_set_cursor (display, cursor);
virtual_pointer = clutter_seat_create_virtual_device (seat,
CLUTTER_POINTER_DEVICE);
@ -535,7 +535,7 @@ meta_test_native_cursor_cropping (void)
test_client_cursor (view,
CURSOR_SCALE_METHOD_VIEWPORT_CROPPED,
META_CURSOR_MOVE_OR_RESIZE_WINDOW,
META_CURSOR_MOVE,
MTK_MONITOR_TRANSFORM_NORMAL,
ref_test_name, 0,
meta_ref_test_determine_ref_test_flag ());
@ -629,7 +629,7 @@ meta_test_native_cursor_transform (void)
meta_ref_test_determine_ref_test_flag ());
test_client_cursor (view,
CURSOR_SCALE_METHOD_VIEWPORT_CROPPED,
META_CURSOR_MOVE_OR_RESIZE_WINDOW,
META_CURSOR_MOVE,
test_cases[i].transform,
ref_test_name, 2,
meta_ref_test_determine_ref_test_flag ());