From e50faf4e6aa48d2684818420201260e0c4caf957 Mon Sep 17 00:00:00 2001 From: Cameron Cawley 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 | 68 +++++----- src/video/x11/SDL_x11mouse.c | 14 ++ test/testcustomcursor.c | 28 ++++ test/testwm.c | 50 ++++--- 11 files changed, 391 insertions(+), 90 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 0491ccab20..9df90cd446 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 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 { diff --git a/include/SDL3/SDL_mouse.h b/include/SDL3/SDL_mouse.h index fb03c0178d..a5227d89d5 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 6e3eeeeba8..86826b8b61 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 8fb9cc2328..1cfd23ad3f 100644 --- a/src/video/cocoa/SDL_cocoamouse.m +++ b/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; diff --git a/src/video/haiku/SDL_bvideo.cc b/src/video/haiku/SDL_bvideo.cc index 9297704a7a..4ed466fa6c 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 849c62d595..585006ecbd 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 1a23544d64..92db17158e 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 3e7772b451..5bf634b7c2 100644 --- a/src/video/windows/SDL_windowsmouse.c +++ b/src/video/windows/SDL_windowsmouse.c @@ -490,62 +490,62 @@ 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: - name = IDC_SIZENWSE; - break; - case SDL_SYSTEM_CURSOR_NESW_RESIZE: - name = IDC_SIZENESW; - break; - case SDL_SYSTEM_CURSOR_EW_RESIZE: - name = IDC_SIZEWE; - break; - case SDL_SYSTEM_CURSOR_NS_RESIZE: - name = IDC_SIZENS; - break; - case SDL_SYSTEM_CURSOR_MOVE: - name = IDC_SIZEALL; - break; - case SDL_SYSTEM_CURSOR_NOT_ALLOWED: - name = IDC_NO; - break; - case SDL_SYSTEM_CURSOR_POINTER: - 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_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_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 7ad974b132..b214e98120 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 bf4e136e1d..4fb7ad5b87 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 393f82c3f7..77d89102bc 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);