From e50faf4e6aa48d2684818420201260e0c4caf957 Mon Sep 17 00:00:00 2001
From: Cameron Cawley <[EMAIL REDACTED]>
Date: Mon, 11 May 2026 19:19:07 +0100
Subject: [PATCH] Support the full set of standard CSS cursors
---
.../main/java/org/libsdl/app/SDLActivity.java | 128 +++++++++++++-----
include/SDL3/SDL_mouse.h | 14 ++
src/video/SDL_video.c | 50 ++++++-
src/video/cocoa/SDL_cocoamouse.m | 38 ++++++
src/video/haiku/SDL_bvideo.cc | 14 ++
src/video/qnx/SDL_qnxmouse.c | 33 +++++
src/video/wayland/SDL_waylandmouse.c | 44 +++++-
src/video/windows/SDL_windowsmouse.c | 46 +++----
src/video/x11/SDL_x11mouse.c | 14 ++
test/testcustomcursor.c | 28 ++++
test/testwm.c | 50 ++++---
11 files changed, 380 insertions(+), 79 deletions(-)
diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
index 0491ccab207e5..9df90cd446850 100644
--- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
+++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
@@ -170,26 +170,40 @@ public static void debugSource(int sources, String prefix) {
// Cursor types
// private static final int SDL_SYSTEM_CURSOR_NONE = -1;
- private static final int SDL_SYSTEM_CURSOR_ARROW = 0;
- private static final int SDL_SYSTEM_CURSOR_IBEAM = 1;
+ private static final int SDL_SYSTEM_CURSOR_DEFAULT = 0;
+ private static final int SDL_SYSTEM_CURSOR_TEXT = 1;
private static final int SDL_SYSTEM_CURSOR_WAIT = 2;
private static final int SDL_SYSTEM_CURSOR_CROSSHAIR = 3;
- private static final int SDL_SYSTEM_CURSOR_WAITARROW = 4;
- private static final int SDL_SYSTEM_CURSOR_SIZENWSE = 5;
- private static final int SDL_SYSTEM_CURSOR_SIZENESW = 6;
- private static final int SDL_SYSTEM_CURSOR_SIZEWE = 7;
- private static final int SDL_SYSTEM_CURSOR_SIZENS = 8;
- private static final int SDL_SYSTEM_CURSOR_SIZEALL = 9;
- private static final int SDL_SYSTEM_CURSOR_NO = 10;
- private static final int SDL_SYSTEM_CURSOR_HAND = 11;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_TOPLEFT = 12;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_TOP = 13;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_TOPRIGHT = 14;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_RIGHT = 15;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_BOTTOMRIGHT = 16;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_BOTTOM = 17;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_BOTTOMLEFT = 18;
- private static final int SDL_SYSTEM_CURSOR_WINDOW_LEFT = 19;
+ private static final int SDL_SYSTEM_CURSOR_PROGRESS = 4;
+ private static final int SDL_SYSTEM_CURSOR_NWSE_RESIZE = 5;
+ private static final int SDL_SYSTEM_CURSOR_NESW_RESIZE = 6;
+ private static final int SDL_SYSTEM_CURSOR_EW_RESIZE = 7;
+ private static final int SDL_SYSTEM_CURSOR_NS_RESIZE = 8;
+ private static final int SDL_SYSTEM_CURSOR_MOVE = 9;
+ private static final int SDL_SYSTEM_CURSOR_NOT_ALLOWED = 10;
+ private static final int SDL_SYSTEM_CURSOR_POINTER = 11;
+ private static final int SDL_SYSTEM_CURSOR_NW_RESIZE = 12;
+ private static final int SDL_SYSTEM_CURSOR_N_RESIZE = 13;
+ private static final int SDL_SYSTEM_CURSOR_NE_RESIZE = 14;
+ private static final int SDL_SYSTEM_CURSOR_E_RESIZE = 15;
+ private static final int SDL_SYSTEM_CURSOR_SE_RESIZE = 16;
+ private static final int SDL_SYSTEM_CURSOR_S_RESIZE = 17;
+ private static final int SDL_SYSTEM_CURSOR_SW_RESIZE = 18;
+ private static final int SDL_SYSTEM_CURSOR_W_RESIZE = 19;
+ private static final int SDL_SYSTEM_CURSOR_CONTEXT_MENU = 20;
+ private static final int SDL_SYSTEM_CURSOR_HELP = 21;
+ private static final int SDL_SYSTEM_CURSOR_CELL = 22;
+ private static final int SDL_SYSTEM_CURSOR_VERTICAL_TEXT = 23;
+ private static final int SDL_SYSTEM_CURSOR_ALIAS = 24;
+ private static final int SDL_SYSTEM_CURSOR_COPY = 25;
+ private static final int SDL_SYSTEM_CURSOR_NO_DROP = 26;
+ private static final int SDL_SYSTEM_CURSOR_GRAB = 27;
+ private static final int SDL_SYSTEM_CURSOR_GRABBING = 28;
+ private static final int SDL_SYSTEM_CURSOR_COL_RESIZE = 29;
+ private static final int SDL_SYSTEM_CURSOR_ROW_RESIZE = 30;
+ private static final int SDL_SYSTEM_CURSOR_ALL_SCROLL = 31;
+ private static final int SDL_SYSTEM_CURSOR_ZOOM_IN = 32;
+ private static final int SDL_SYSTEM_CURSOR_ZOOM_OUT = 33;
protected static final int SDL_ORIENTATION_UNKNOWN = 0;
protected static final int SDL_ORIENTATION_LANDSCAPE = 1;
@@ -1862,10 +1876,10 @@ public static boolean setCustomCursor(int cursorID) {
public static boolean setSystemCursor(int cursorID) {
int cursor_type = 0; //PointerIcon.TYPE_NULL;
switch (cursorID) {
- case SDL_SYSTEM_CURSOR_ARROW:
+ case SDL_SYSTEM_CURSOR_DEFAULT:
cursor_type = 1000; //PointerIcon.TYPE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_IBEAM:
+ case SDL_SYSTEM_CURSOR_TEXT:
cursor_type = 1008; //PointerIcon.TYPE_TEXT;
break;
case SDL_SYSTEM_CURSOR_WAIT:
@@ -1874,54 +1888,96 @@ public static boolean setSystemCursor(int cursorID) {
case SDL_SYSTEM_CURSOR_CROSSHAIR:
cursor_type = 1007; //PointerIcon.TYPE_CROSSHAIR;
break;
- case SDL_SYSTEM_CURSOR_WAITARROW:
+ case SDL_SYSTEM_CURSOR_PROGRESS:
cursor_type = 1004; //PointerIcon.TYPE_WAIT;
break;
- case SDL_SYSTEM_CURSOR_SIZENWSE:
+ case SDL_SYSTEM_CURSOR_NWSE_RESIZE:
cursor_type = 1017; //PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_SIZENESW:
+ case SDL_SYSTEM_CURSOR_NESW_RESIZE:
cursor_type = 1016; //PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_SIZEWE:
+ case SDL_SYSTEM_CURSOR_EW_RESIZE:
cursor_type = 1014; //PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_SIZENS:
+ case SDL_SYSTEM_CURSOR_NS_RESIZE:
cursor_type = 1015; //PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_SIZEALL:
+ case SDL_SYSTEM_CURSOR_MOVE:
cursor_type = 1020; //PointerIcon.TYPE_GRAB;
break;
- case SDL_SYSTEM_CURSOR_NO:
+ case SDL_SYSTEM_CURSOR_NOT_ALLOWED:
cursor_type = 1012; //PointerIcon.TYPE_NO_DROP;
break;
- case SDL_SYSTEM_CURSOR_HAND:
+ case SDL_SYSTEM_CURSOR_POINTER:
cursor_type = 1002; //PointerIcon.TYPE_HAND;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_TOPLEFT:
+ case SDL_SYSTEM_CURSOR_NW_RESIZE:
cursor_type = 1017; //PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_TOP:
+ case SDL_SYSTEM_CURSOR_N_RESIZE:
cursor_type = 1015; //PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_TOPRIGHT:
+ case SDL_SYSTEM_CURSOR_NE_RESIZE:
cursor_type = 1016; //PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_RIGHT:
+ case SDL_SYSTEM_CURSOR_E_RESIZE:
cursor_type = 1014; //PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_BOTTOMRIGHT:
+ case SDL_SYSTEM_CURSOR_SE_RESIZE:
cursor_type = 1017; //PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_BOTTOM:
+ case SDL_SYSTEM_CURSOR_S_RESIZE:
cursor_type = 1015; //PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_BOTTOMLEFT:
+ case SDL_SYSTEM_CURSOR_SW_RESIZE:
cursor_type = 1016; //PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
break;
- case SDL_SYSTEM_CURSOR_WINDOW_LEFT:
+ case SDL_SYSTEM_CURSOR_W_RESIZE:
cursor_type = 1014; //PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
break;
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ cursor_type = 1001; //PointerIcon.TYPE_CONTEXT_MENU;
+ break;
+ case SDL_SYSTEM_CURSOR_HELP:
+ cursor_type = 1003; //PointerIcon.TYPE_HELP;
+ break;
+ case SDL_SYSTEM_CURSOR_CELL:
+ cursor_type = 1006; //PointerIcon.TYPE_CELL;
+ break;
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
+ cursor_type = 1009; //PointerIcon.TYPE_VERTICAL_TEXT;
+ break;
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ cursor_type = 1010; //PointerIcon.TYPE_ALIAS;
+ break;
+ case SDL_SYSTEM_CURSOR_COPY:
+ cursor_type = 1011; //PointerIcon.TYPE_COPY;
+ break;
+ case SDL_SYSTEM_CURSOR_NO_DROP:
+ cursor_type = 1012; //PointerIcon.TYPE_NO_DROP;
+ break;
+ case SDL_SYSTEM_CURSOR_GRAB:
+ cursor_type = 1020; //PointerIcon.TYPE_GRAB;
+ break;
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ cursor_type = 1021; //PointerIcon.TYPE_GRABBING;
+ break;
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
+ cursor_type = 1014; //PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
+ break;
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
+ cursor_type = 1015; //PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
+ break;
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
+ cursor_type = 1013; //PointerIcon.TYPE_ALL_SCROLL;
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ cursor_type = 1018; //PointerIcon.TYPE_ZOOM_IN;
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
+ cursor_type = 1019; //PointerIcon.TYPE_ZOOM_OUT;
+ break;
}
if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {
try {
diff --git a/include/SDL3/SDL_mouse.h b/include/SDL3/SDL_mouse.h
index fb03c0178d377..a5227d89d58bd 100644
--- a/include/SDL3/SDL_mouse.h
+++ b/include/SDL3/SDL_mouse.h
@@ -116,6 +116,20 @@ typedef enum SDL_SystemCursor
SDL_SYSTEM_CURSOR_S_RESIZE, /**< Window resize bottom. May be NS_RESIZE. */
SDL_SYSTEM_CURSOR_SW_RESIZE, /**< Window resize bottom-left. May be NESW_RESIZE. */
SDL_SYSTEM_CURSOR_W_RESIZE, /**< Window resize left. May be EW_RESIZE. */
+ SDL_SYSTEM_CURSOR_CONTEXT_MENU, /**< A context menu is available for the object under the cursor. */
+ SDL_SYSTEM_CURSOR_HELP, /**< Help is available for the object under the cursor. */
+ SDL_SYSTEM_CURSOR_CELL, /**< A set of cells may be selected. */
+ SDL_SYSTEM_CURSOR_VERTICAL_TEXT,/**< Text selection. May be TEXT */
+ SDL_SYSTEM_CURSOR_ALIAS, /**< A shortcut is to be created. */
+ SDL_SYSTEM_CURSOR_COPY, /**< Something is to be copied. */
+ SDL_SYSTEM_CURSOR_NO_DROP, /**< The dragged item cannot be dropped at this location. May be NOT_ALLOWED. */
+ SDL_SYSTEM_CURSOR_GRAB, /**< The object under the cursor can be grabbed */
+ SDL_SYSTEM_CURSOR_GRABBING, /**< An object is currently being grabbed. */
+ SDL_SYSTEM_CURSOR_COL_RESIZE, /**< Column resize. May be EW_RESIZE. */
+ SDL_SYSTEM_CURSOR_ROW_RESIZE, /**< Row resize. May be NS_RESIZE. */
+ SDL_SYSTEM_CURSOR_ALL_SCROLL, /**< Four pointed arrow pointing north, south, east, and west. */
+ SDL_SYSTEM_CURSOR_ZOOM_IN, /**< Zoom in. */
+ SDL_SYSTEM_CURSOR_ZOOM_OUT, /**< Zoom out. */
SDL_SYSTEM_CURSOR_COUNT
} SDL_SystemCursor;
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 6e3eeeeba82af..86826b8b61778 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -6463,7 +6463,10 @@ const char *SDL_GetCSSCursorName(SDL_SystemCursor id, const char **fallback_name
return "ns-resize";
case SDL_SYSTEM_CURSOR_MOVE:
- return "all-scroll";
+ if (fallback_name) {
+ *fallback_name = "all-scroll";
+ }
+ return "move";
case SDL_SYSTEM_CURSOR_NOT_ALLOWED:
return "not-allowed";
@@ -6495,6 +6498,51 @@ const char *SDL_GetCSSCursorName(SDL_SystemCursor id, const char **fallback_name
case SDL_SYSTEM_CURSOR_W_RESIZE:
return "w-resize";
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ return "context-menu";
+
+ case SDL_SYSTEM_CURSOR_HELP:
+ return "help";
+
+ case SDL_SYSTEM_CURSOR_CELL:
+ return "cell";
+
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
+ return "vertical-text";
+
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ return "alias";
+
+ case SDL_SYSTEM_CURSOR_COPY:
+ return "copy";
+
+ case SDL_SYSTEM_CURSOR_NO_DROP:
+ return "no-drop";
+
+ case SDL_SYSTEM_CURSOR_GRAB:
+ return "grab";
+
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ return "grabbing";
+
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
+ return "col-resize";
+
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
+ return "row-resize";
+
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
+ if (fallback_name) {
+ *fallback_name = "move";
+ }
+ return "all-scroll";
+
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ return "zoom-in";
+
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
+ return "zoom-out";
+
default:
return "default";
}
diff --git a/src/video/cocoa/SDL_cocoamouse.m b/src/video/cocoa/SDL_cocoamouse.m
index 8fb9cc23283d3..1cfd23ad3feae 100644
--- a/src/video/cocoa/SDL_cocoamouse.m
+++ b/src/video/cocoa/SDL_cocoamouse.m
@@ -200,9 +200,11 @@ + (NSCursor *)invisibleCursor
nscursor = LoadHiddenSystemCursor(@"resizenorthsouth", @selector(resizeUpDownCursor));
break;
case SDL_SYSTEM_CURSOR_MOVE:
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
nscursor = LoadHiddenSystemCursor(@"move", @selector(closedHandCursor));
break;
case SDL_SYSTEM_CURSOR_NOT_ALLOWED:
+ case SDL_SYSTEM_CURSOR_NO_DROP:
nscursor = [NSCursor operationNotAllowedCursor];
break;
case SDL_SYSTEM_CURSOR_POINTER:
@@ -232,6 +234,42 @@ + (NSCursor *)invisibleCursor
case SDL_SYSTEM_CURSOR_W_RESIZE:
nscursor = LoadHiddenSystemCursor(@"resizeeastwest", @selector(resizeLeftRightCursor));
break;
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ nscursor = [NSCursor contextualMenuCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_HELP:
+ nscursor = LoadHiddenSystemCursor(@"help", @selector(helpCursor));
+ break;
+ case SDL_SYSTEM_CURSOR_CELL:
+ nscursor = LoadHiddenSystemCursor(@"cell", @selector(cellCursor));
+ break;
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
+ nscursor = [NSCursor IBeamCursorForVerticalLayout];
+ break;
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ nscursor = [NSCursor dragLinkCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_COPY:
+ nscursor = [NSCursor dragCopyCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_GRAB:
+ nscursor = [NSCursor openHandCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ nscursor = [NSCursor closedHandCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
+ nscursor = [NSCursor resizeLeftRightCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
+ nscursor = [NSCursor resizeUpDownCursor];
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ nscursor = LoadHiddenSystemCursor(@"zoomin", @selector(zoomInCursor));
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
+ nscursor = LoadHiddenSystemCursor(@"zoomout", @selector(zoomOutCursor));
+ break;
default:
SDL_assert(!"Unknown system cursor");
return NULL;
diff --git a/src/video/haiku/SDL_bvideo.cc b/src/video/haiku/SDL_bvideo.cc
index 9297704a7a385..4ed466fa6cdb1 100644
--- a/src/video/haiku/SDL_bvideo.cc
+++ b/src/video/haiku/SDL_bvideo.cc
@@ -173,6 +173,20 @@ static SDL_Cursor * HAIKU_CreateSystemCursor(SDL_SystemCursor id)
CURSORCASE(S_RESIZE, RESIZE_NORTH_SOUTH);
CURSORCASE(SW_RESIZE, RESIZE_NORTH_EAST_SOUTH_WEST);
CURSORCASE(W_RESIZE, RESIZE_EAST_WEST);
+ CURSORCASE(CONTEXT_MENU, CONTEXT_MENU);
+ CURSORCASE(HELP, HELP);
+ CURSORCASE(CELL, CROSS_HAIR);
+ CURSORCASE(VERTICAL_TEXT, I_BEAM_HORIZONTAL);
+ CURSORCASE(ALIAS, CREATE_LINK);
+ CURSORCASE(COPY, COPY);
+ CURSORCASE(NO_DROP, NOT_ALLOWED);
+ CURSORCASE(GRAB, GRAB);
+ CURSORCASE(GRABBING, GRABBING);
+ CURSORCASE(COL_RESIZE, RESIZE_EAST_WEST);
+ CURSORCASE(ROW_RESIZE, RESIZE_NORTH_SOUTH);
+ CURSORCASE(ALL_SCROLL, MOVE);
+ CURSORCASE(ZOOM_IN, ZOOM_IN);
+ CURSORCASE(ZOOM_OUT, ZOOM_OUT);
#undef CURSORCASE
default:
SDL_assert(0);
diff --git a/src/video/qnx/SDL_qnxmouse.c b/src/video/qnx/SDL_qnxmouse.c
index 849c62d595630..585006ecbd6f5 100644
--- a/src/video/qnx/SDL_qnxmouse.c
+++ b/src/video/qnx/SDL_qnxmouse.c
@@ -36,15 +36,19 @@ static int SDLToScreenCursorShape(SDL_SystemCursor id)
{
case SDL_SYSTEM_CURSOR_DEFAULT:
case SDL_SYSTEM_CURSOR_NOT_ALLOWED:
+ case SDL_SYSTEM_CURSOR_NO_DROP:
shape = SCREEN_CURSOR_SHAPE_ARROW;
break;
case SDL_SYSTEM_CURSOR_TEXT:
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
shape = SCREEN_CURSOR_SHAPE_IBEAM;
break;
case SDL_SYSTEM_CURSOR_WAIT:
+ case SDL_SYSTEM_CURSOR_PROGRESS:
shape = SCREEN_CURSOR_SHAPE_WAIT;
break;
case SDL_SYSTEM_CURSOR_CROSSHAIR:
+ case SDL_SYSTEM_CURSOR_CELL:
shape = SCREEN_CURSOR_SHAPE_CROSS;
break;
case SDL_SYSTEM_CURSOR_NWSE_RESIZE:
@@ -52,11 +56,40 @@ static int SDLToScreenCursorShape(SDL_SystemCursor id)
case SDL_SYSTEM_CURSOR_EW_RESIZE:
case SDL_SYSTEM_CURSOR_NS_RESIZE:
case SDL_SYSTEM_CURSOR_MOVE:
+ case SDL_SYSTEM_CURSOR_NW_RESIZE:
+ case SDL_SYSTEM_CURSOR_N_RESIZE:
+ case SDL_SYSTEM_CURSOR_NE_RESIZE:
+ case SDL_SYSTEM_CURSOR_E_RESIZE:
+ case SDL_SYSTEM_CURSOR_SE_RESIZE:
+ case SDL_SYSTEM_CURSOR_S_RESIZE:
+ case SDL_SYSTEM_CURSOR_SW_RESIZE:
+ case SDL_SYSTEM_CURSOR_W_RESIZE:
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
shape = SCREEN_CURSOR_SHAPE_MOVE;
break;
case SDL_SYSTEM_CURSOR_POINTER:
+ case SDL_SYSTEM_CURSOR_HELP:
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ case SDL_SYSTEM_CURSOR_COPY:
shape = SCREEN_CURSOR_SHAPE_HAND;
break;
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ shape = SCREEN_CURSOR_SHAPE_MENU;
+ break;
+ case SDL_SYSTEM_CURSOR_GRAB:
+ shape = SCREEN_CURSOR_SHAPE_GRAB;
+ break;
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ shape = SCREEN_CURSOR_SHAPE_GRABBING;
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ shape = SCREEN_CURSOR_SHAPE_ZOOM_IN;
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
+ shape = SCREEN_CURSOR_SHAPE_ZOOM_OUT;
+ break;
default:
break;
}
diff --git a/src/video/wayland/SDL_waylandmouse.c b/src/video/wayland/SDL_waylandmouse.c
index 1a23544d6406d..92db17158ea56 100644
--- a/src/video/wayland/SDL_waylandmouse.c
+++ b/src/video/wayland/SDL_waylandmouse.c
@@ -989,7 +989,7 @@ static enum wp_cursor_shape_device_v1_shape Wayland_GetSystemCursorShape(SDL_Sys
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE;
break;
case SDL_SYSTEM_CURSOR_MOVE:
- shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL;
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE;
break;
case SDL_SYSTEM_CURSOR_NOT_ALLOWED:
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED;
@@ -1021,6 +1021,48 @@ static enum wp_cursor_shape_device_v1_shape Wayland_GetSystemCursorShape(SDL_Sys
case SDL_SYSTEM_CURSOR_W_RESIZE:
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE;
break;
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CONTEXT_MENU;
+ break;
+ case SDL_SYSTEM_CURSOR_HELP:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_HELP;
+ break;
+ case SDL_SYSTEM_CURSOR_CELL:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CELL;
+ break;
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_VERTICAL_TEXT;
+ break;
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALIAS;
+ break;
+ case SDL_SYSTEM_CURSOR_COPY:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COPY;
+ break;
+ case SDL_SYSTEM_CURSOR_NO_DROP:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NO_DROP;
+ break;
+ case SDL_SYSTEM_CURSOR_GRAB:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRAB;
+ break;
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRABBING;
+ break;
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COL_RESIZE;
+ break;
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ROW_RESIZE;
+ break;
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL;
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_IN;
+ break;
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
+ shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_OUT;
+ break;
default:
SDL_assert(0); // Should never be here...
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT;
diff --git a/src/video/windows/SDL_windowsmouse.c b/src/video/windows/SDL_windowsmouse.c
index 3e7772b4513f5..5bf634b7c2ea6 100644
--- a/src/video/windows/SDL_windowsmouse.c
+++ b/src/video/windows/SDL_windowsmouse.c
@@ -490,61 +490,61 @@ static SDL_Cursor *WIN_CreateSystemCursor(SDL_SystemCursor id)
name = IDC_ARROW;
break;
case SDL_SYSTEM_CURSOR_TEXT:
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
name = IDC_IBEAM;
break;
case SDL_SYSTEM_CURSOR_WAIT:
name = IDC_WAIT;
break;
case SDL_SYSTEM_CURSOR_CROSSHAIR:
+ case SDL_SYSTEM_CURSOR_CELL:
name = IDC_CROSS;
break;
case SDL_SYSTEM_CURSOR_PROGRESS:
name = IDC_APPSTARTING;
break;
case SDL_SYSTEM_CURSOR_NWSE_RESIZE:
+ case SDL_SYSTEM_CURSOR_NW_RESIZE:
+ case SDL_SYSTEM_CURSOR_SE_RESIZE:
name = IDC_SIZENWSE;
break;
case SDL_SYSTEM_CURSOR_NESW_RESIZE:
+ case SDL_SYSTEM_CURSOR_NE_RESIZE:
+ case SDL_SYSTEM_CURSOR_SW_RESIZE:
name = IDC_SIZENESW;
break;
case SDL_SYSTEM_CURSOR_EW_RESIZE:
+ case SDL_SYSTEM_CURSOR_E_RESIZE:
+ case SDL_SYSTEM_CURSOR_W_RESIZE:
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
name = IDC_SIZEWE;
break;
case SDL_SYSTEM_CURSOR_NS_RESIZE:
+ case SDL_SYSTEM_CURSOR_N_RESIZE:
+ case SDL_SYSTEM_CURSOR_S_RESIZE:
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
name = IDC_SIZENS;
break;
case SDL_SYSTEM_CURSOR_MOVE:
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
name = IDC_SIZEALL;
break;
case SDL_SYSTEM_CURSOR_NOT_ALLOWED:
+ case SDL_SYSTEM_CURSOR_NO_DROP:
name = IDC_NO;
break;
case SDL_SYSTEM_CURSOR_POINTER:
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ case SDL_SYSTEM_CURSOR_COPY:
+ case SDL_SYSTEM_CURSOR_GRAB:
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
name = IDC_HAND;
break;
- case SDL_SYSTEM_CURSOR_NW_RESIZE:
- name = IDC_SIZENWSE;
- break;
- case SDL_SYSTEM_CURSOR_N_RESIZE:
- name = IDC_SIZENS;
- break;
- case SDL_SYSTEM_CURSOR_NE_RESIZE:
- name = IDC_SIZENESW;
- break;
- case SDL_SYSTEM_CURSOR_E_RESIZE:
- name = IDC_SIZEWE;
- break;
- case SDL_SYSTEM_CURSOR_SE_RESIZE:
- name = IDC_SIZENWSE;
- break;
- case SDL_SYSTEM_CURSOR_S_RESIZE:
- name = IDC_SIZENS;
- break;
- case SDL_SYSTEM_CURSOR_SW_RESIZE:
- name = IDC_SIZENESW;
- break;
- case SDL_SYSTEM_CURSOR_W_RESIZE:
- name = IDC_SIZEWE;
+ case SDL_SYSTEM_CURSOR_HELP:
+ name = IDC_HELP;
break;
}
return WIN_CreateCursorAndData(LoadCursor(NULL, name));
diff --git a/src/video/x11/SDL_x11mouse.c b/src/video/x11/SDL_x11mouse.c
index 7ad974b132837..b214e98120d21 100644
--- a/src/video/x11/SDL_x11mouse.c
+++ b/src/video/x11/SDL_x11mouse.c
@@ -298,6 +298,20 @@ static unsigned int GetLegacySystemCursorShape(SDL_SystemCursor id)
case SDL_SYSTEM_CURSOR_S_RESIZE: return XC_bottom_side;
case SDL_SYSTEM_CURSOR_SW_RESIZE: return XC_bottom_left_corner;
case SDL_SYSTEM_CURSOR_W_RESIZE: return XC_left_side;
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU: return XC_hand2;
+ case SDL_SYSTEM_CURSOR_HELP: return XC_question_arrow;
+ case SDL_SYSTEM_CURSOR_CELL: return XC_cross;
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT: return XC_xterm;
+ case SDL_SYSTEM_CURSOR_ALIAS: return XC_hand2;
+ case SDL_SYSTEM_CURSOR_COPY: return XC_hand2;
+ case SDL_SYSTEM_CURSOR_NO_DROP: return XC_pirate;
+ case SDL_SYSTEM_CURSOR_GRAB: return XC_hand2;
+ case SDL_SYSTEM_CURSOR_GRABBING: return XC_hand2;
+ case SDL_SYSTEM_CURSOR_COL_RESIZE: return XC_sb_h_double_arrow;
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE: return XC_sb_v_double_arrow;
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL: return XC_fleur;
+ case SDL_SYSTEM_CURSOR_ZOOM_IN: return XC_hand2;
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT: return XC_hand2;
case SDL_SYSTEM_CURSOR_COUNT: break; // so the compiler might notice if an enum value is missing here.
}
diff --git a/test/testcustomcursor.c b/test/testcustomcursor.c
index bf4e136e1da85..4fb7ad5b87925 100644
--- a/test/testcustomcursor.c
+++ b/test/testcustomcursor.c
@@ -397,6 +397,34 @@ static const char *get_active_cursor_name()
return "Window resize bottom-left";
case SDL_SYSTEM_CURSOR_W_RESIZE:
return "Window resize left";
+ case SDL_SYSTEM_CURSOR_CONTEXT_MENU:
+ return "Context menu";
+ case SDL_SYSTEM_CURSOR_HELP:
+ return "Help";
+ case SDL_SYSTEM_CURSOR_CELL:
+ return "Cell";
+ case SDL_SYSTEM_CURSOR_VERTICAL_TEXT:
+ return "Vertical text";
+ case SDL_SYSTEM_CURSOR_ALIAS:
+ return "Alias";
+ case SDL_SYSTEM_CURSOR_COPY:
+ return "Copy";
+ case SDL_SYSTEM_CURSOR_NO_DROP:
+ return "No drop";
+ case SDL_SYSTEM_CURSOR_GRAB:
+ return "Grab";
+ case SDL_SYSTEM_CURSOR_GRABBING:
+ return "Grabbing";
+ case SDL_SYSTEM_CURSOR_COL_RESIZE:
+ return "Column resize";
+ case SDL_SYSTEM_CURSOR_ROW_RESIZE:
+ return "Row resize";
+ case SDL_SYSTEM_CURSOR_ALL_SCROLL:
+ return "All scroll: Four pointed arrow pointing north, south, east, and west";
+ case SDL_SYSTEM_CURSOR_ZOOM_IN:
+ return "Zoom in";
+ case SDL_SYSTEM_CURSOR_ZOOM_OUT:
+ return "Zoom out";
default:
return "UNKNOWN CURSOR TYPE, FIX THIS PROGRAM.";
}
diff --git a/test/testwm.c b/test/testwm.c
index 393f82c3f7f6a..77d89102bc634 100644
--- a/test/testwm.c
+++ b/test/testwm.c
@@ -22,26 +22,40 @@ static SDLTest_CommonState *state;
static int done;
static const char *cursorNames[] = {
- "arrow",
- "ibeam",
+ "default",
+ "text",
"wait",
"crosshair",
- "waitarrow",
- "sizeNWSE",
- "sizeNESW",
- "sizeWE",
- "sizeNS",
- "sizeALL",
- "NO",
- "hand",
- "window top left",
- "window top",
- "window top right",
- "window right",
- "window bottom right",
- "window bottom",
- "window bottom left",
- "window left"
+ "progress",
+ "NWSE resize",
+ "NESW resize",
+ "EW resize",
+ "NS resize",
+ "move",
+ "not allowed",
+ "pointer",
+ "NW resize",
+ "N resize",
+ "NE resize",
+ "E resize",
+ "SE resize",
+ "S resize",
+ "SW resize",
+ "W resize",
+ "context menu",
+ "help",
+ "cell",
+ "vertical text",
+ "alias",
+ "copy",
+ "no drop",
+ "grab",
+ "grabbing",
+ "column resize",
+ "row resize",
+ "all scroll",
+ "zoom in",
+ "zoom out"
};
SDL_COMPILE_TIME_ASSERT(cursorNames, SDL_arraysize(cursorNames) == SDL_SYSTEM_CURSOR_COUNT);