Browse Source

Support the full set of standard CSS cursors

Cameron Cawley 4 days ago
parent
commit
e50faf4e6a

+ 92 - 36
android-project/app/src/main/java/org/libsdl/app/SDLActivity.java

@@ -170,26 +170,40 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
 
     // 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 class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
     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 class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
         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 {

+ 14 - 0
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;
 

+ 49 - 1
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";
     }

+ 38 - 0
src/video/cocoa/SDL_cocoamouse.m

@@ -200,9 +200,11 @@ static SDL_Cursor *Cocoa_CreateSystemCursor(SDL_SystemCursor id)
             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 @@ static SDL_Cursor *Cocoa_CreateSystemCursor(SDL_SystemCursor id)
         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;

+ 14 - 0
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);

+ 33 - 0
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;
     }

+ 43 - 1
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;

+ 23 - 23
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));

+ 14 - 0
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.
     }
 

+ 28 - 0
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.";
     }

+ 32 - 18
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);