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: case META_CURSOR_DEFAULT:
return "default"; return "default";
case META_CURSOR_NORTH_RESIZE: case META_CURSOR_CONTEXT_MENU:
return "n-resize"; return "context-menu";
case META_CURSOR_SOUTH_RESIZE: case META_CURSOR_HELP:
return "s-resize"; return "help";
case META_CURSOR_WEST_RESIZE: case META_CURSOR_POINTER:
return "w-resize"; return "pointer";
case META_CURSOR_EAST_RESIZE: 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"; return "e-resize";
case META_CURSOR_SE_RESIZE: case META_CURSOR_N_RESIZE:
return "se-resize"; return "n-resize";
case META_CURSOR_SW_RESIZE:
return "sw-resize";
case META_CURSOR_NE_RESIZE: case META_CURSOR_NE_RESIZE:
return "ne-resize"; return "ne-resize";
case META_CURSOR_NW_RESIZE: case META_CURSOR_NW_RESIZE:
return "nw-resize"; return "nw-resize";
case META_CURSOR_MOVE_OR_RESIZE_WINDOW: case META_CURSOR_S_RESIZE:
return "move"; return "s-resize";
case META_CURSOR_BUSY: case META_CURSOR_SE_RESIZE:
return "wait"; return "se-resize";
case META_CURSOR_DND_IN_DRAG: case META_CURSOR_SW_RESIZE:
return "default"; return "sw-resize";
case META_CURSOR_DND_MOVE: case META_CURSOR_W_RESIZE:
return "default"; return "w-resize";
case META_CURSOR_DND_COPY: case META_CURSOR_EW_RESIZE:
return "copy"; return "ew-resize";
case META_CURSOR_DND_UNSUPPORTED_TARGET: case META_CURSOR_NS_RESIZE:
return "no-drop"; return "ns-resize";
case META_CURSOR_POINTING_HAND: case META_CURSOR_NESW_RESIZE:
return "pointer"; return "nesw-resize";
case META_CURSOR_CROSSHAIR: case META_CURSOR_NWSE_RESIZE:
return "crosshair"; return "nwse-resize";
case META_CURSOR_IBEAM: case META_CURSOR_COL_RESIZE:
return "text"; return "col-resize";
case META_CURSOR_BLANK: 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_NONE:
case META_CURSOR_LAST:
break; break;
} }
@ -104,43 +139,78 @@ meta_cursor_get_legacy_name (MetaCursor cursor)
{ {
case META_CURSOR_DEFAULT: case META_CURSOR_DEFAULT:
return "left_ptr"; return "left_ptr";
case META_CURSOR_NORTH_RESIZE: case META_CURSOR_CONTEXT_MENU:
return "top_side"; return "left_ptr";
case META_CURSOR_SOUTH_RESIZE: case META_CURSOR_HELP:
return "bottom_side"; return "question_arrow";
case META_CURSOR_WEST_RESIZE: case META_CURSOR_POINTER:
return "left_side"; return "hand";
case META_CURSOR_EAST_RESIZE: 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"; return "right_side";
case META_CURSOR_SE_RESIZE: case META_CURSOR_N_RESIZE:
return "bottom_right_corner"; return "top_side";
case META_CURSOR_SW_RESIZE:
return "bottom_left_corner";
case META_CURSOR_NE_RESIZE: case META_CURSOR_NE_RESIZE:
return "top_right_corner"; return "top_right_corner";
case META_CURSOR_NW_RESIZE: case META_CURSOR_NW_RESIZE:
return "top_left_corner"; return "top_left_corner";
case META_CURSOR_MOVE_OR_RESIZE_WINDOW: case META_CURSOR_S_RESIZE:
return "fleur"; return "bottom_side";
case META_CURSOR_BUSY: case META_CURSOR_SE_RESIZE:
return "watch"; return "bottom_right_corner";
case META_CURSOR_DND_IN_DRAG: case META_CURSOR_SW_RESIZE:
return "dnd-none"; return "bottom_left_corner";
case META_CURSOR_DND_MOVE: case META_CURSOR_W_RESIZE:
return "dnd-move"; return "left_side";
case META_CURSOR_DND_COPY: 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"; return "dnd-copy";
case META_CURSOR_DND_UNSUPPORTED_TARGET: case META_CURSOR_ALL_RESIZE:
return "dnd-none"; return "dnd-move";
case META_CURSOR_POINTING_HAND: case META_CURSOR_INVALID:
return "hand2";
case META_CURSOR_CROSSHAIR:
return "crosshair";
case META_CURSOR_IBEAM:
return "xterm";
case META_CURSOR_BLANK:
case META_CURSOR_NONE: case META_CURSOR_NONE:
case META_CURSOR_LAST:
break; break;
} }
@ -177,7 +247,7 @@ load_cursor_on_client (MetaCursor cursor,
int fallback_size, i; int fallback_size, i;
const char *cursor_names[2]; const char *cursor_names[2];
if (cursor == META_CURSOR_BLANK) if (cursor == META_CURSOR_NONE)
return create_blank_cursor_images (); return create_blank_cursor_images ();
cursor_names[0] = meta_cursor_get_name (cursor); 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); 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; sprite_xcursor->theme_dirty = FALSE;

View File

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

View File

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

View File

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

View File

@ -116,49 +116,85 @@ typedef enum
/** /**
* MetaCursor: * MetaCursor:
* @META_CURSOR_INVALID: No cursor
* @META_CURSOR_NONE: No cursor
* @META_CURSOR_DEFAULT: Default cursor * @META_CURSOR_DEFAULT: Default cursor
* @META_CURSOR_NORTH_RESIZE: Resize northern edge cursor * @META_CURSOR_CONTEXT_MENU: Context menu cursor
* @META_CURSOR_SOUTH_RESIZE: Resize southern edge cursor * @META_CURSOR_HELP: Help cursor
* @META_CURSOR_WEST_RESIZE: Resize western edge cursor * @META_CURSOR_POINTER: Pointer cursor
* @META_CURSOR_EAST_RESIZE: Resize eastern edge cursor * @META_CURSOR_PROGRESS: Progress cursor
* @META_CURSOR_SE_RESIZE: Resize south-eastern corner cursor * @META_CURSOR_WAIT: Wait cursor
* @META_CURSOR_SW_RESIZE: Resize south-western corner 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_NE_RESIZE: Resize north-eastern corner cursor
* @META_CURSOR_NW_RESIZE: Resize north-western corner cursor * @META_CURSOR_NW_RESIZE: Resize north-western corner cursor
* @META_CURSOR_MOVE_OR_RESIZE_WINDOW: Move or resize cursor * @META_CURSOR_S_RESIZE: Resize southern edge cursor
* @META_CURSOR_BUSY: Busy cursor * @META_CURSOR_SE_RESIZE: Resize south-eastern corner cursor
* @META_CURSOR_DND_IN_DRAG: DND in drag cursor * @META_CURSOR_SW_RESIZE: Resize south-western corner cursor
* @META_CURSOR_DND_MOVE: DND move cursor * @META_CURSOR_W_RESIZE: Resize western edge cursor
* @META_CURSOR_DND_COPY: DND copy cursor * @META_CURSOR_EW_RESIZE: Resize eastern and western edges cursor
* @META_CURSOR_DND_UNSUPPORTED_TARGET: DND unsupported target * @META_CURSOR_NS_RESIZE: Resize northern and eastern edges cursor
* @META_CURSOR_POINTING_HAND: pointing hand * @META_CURSOR_NESW_RESIZE: Resize north-east and south-west corners cursor
* @META_CURSOR_CROSSHAIR: crosshair (action forbidden) * @META_CURSOR_NWSE_RESIZE: Resize north-west and south-east corners cursor
* @META_CURSOR_IBEAM: I-beam (text input) * @META_CURSOR_COL_RESIZE: Resize column cursor
* @META_CURSOR_BLANK: Invisible 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 typedef enum
{ {
META_CURSOR_NONE = 0, META_CURSOR_INVALID = 0,
META_CURSOR_NONE,
META_CURSOR_DEFAULT, META_CURSOR_DEFAULT,
META_CURSOR_NORTH_RESIZE, META_CURSOR_CONTEXT_MENU,
META_CURSOR_SOUTH_RESIZE, META_CURSOR_HELP,
META_CURSOR_WEST_RESIZE, META_CURSOR_POINTER,
META_CURSOR_EAST_RESIZE, META_CURSOR_PROGRESS,
META_CURSOR_SE_RESIZE, META_CURSOR_WAIT,
META_CURSOR_SW_RESIZE, 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_NE_RESIZE,
META_CURSOR_NW_RESIZE, META_CURSOR_NW_RESIZE,
META_CURSOR_MOVE_OR_RESIZE_WINDOW, META_CURSOR_S_RESIZE,
META_CURSOR_BUSY, META_CURSOR_SE_RESIZE,
META_CURSOR_DND_IN_DRAG, META_CURSOR_SW_RESIZE,
META_CURSOR_DND_MOVE, META_CURSOR_W_RESIZE,
META_CURSOR_DND_COPY, META_CURSOR_EW_RESIZE,
META_CURSOR_DND_UNSUPPORTED_TARGET, META_CURSOR_NS_RESIZE,
META_CURSOR_POINTING_HAND, META_CURSOR_NESW_RESIZE,
META_CURSOR_CROSSHAIR, META_CURSOR_NWSE_RESIZE,
META_CURSOR_IBEAM, META_CURSOR_COL_RESIZE,
META_CURSOR_BLANK, META_CURSOR_ROW_RESIZE,
META_CURSOR_LAST 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; } MetaCursor;
/** /**

View File

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