Skip to content

Commit

Permalink
Add SDL_MOUSE_RELATIVE_CURSOR_VISIBLE (#7947)
Browse files Browse the repository at this point in the history
(cherry picked from commit ee559d5)
  • Loading branch information
expikr authored and slouken committed Jun 20, 2024
1 parent 4800edf commit 194d72b
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
11 changes: 11 additions & 0 deletions include/SDL_hints.h
Original file line number Diff line number Diff line change
Expand Up @@ -1654,6 +1654,17 @@ extern "C" {
*/
#define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION"

/**
* \brief A variable controlling whether the hardware cursor stays visible when relative mode is active.
*
* This variable can be set to the following values:
* "0" - The cursor will be hidden while relative mode is active (default)
* "1" - The cursor will remain visible while relative mode is active
*
* Note that for systems without raw hardware inputs, relative mode is implemented using warping, so the hardware cursor will visibly warp between frames if this is enabled on those systems.
*/
#define SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE "SDL_MOUSE_RELATIVE_CURSOR_VISIBLE"

/**
* A variable controlling whether mouse events should generate synthetic touch
* events
Expand Down
15 changes: 14 additions & 1 deletion src/events/SDL_mouse.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,13 @@ static void SDLCALL SDL_MouseRelativeWarpMotionChanged(void *userdata, const cha
mouse->relative_mode_warp_motion = SDL_GetStringBoolean(hint, SDL_FALSE);
}

static void SDLCALL SDL_MouseRelativeCursorVisibleChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;

mouse->relative_mode_cursor_visible = SDL_GetStringBoolean(hint, SDL_FALSE);
}

/* Public functions */
int SDL_MousePreInit(void)
{
Expand Down Expand Up @@ -209,6 +216,9 @@ int SDL_MousePreInit(void)
SDL_AddHintCallback(SDL_HINT_MOUSE_RELATIVE_WARP_MOTION,
SDL_MouseRelativeWarpMotionChanged, mouse);

SDL_AddHintCallback(SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE,
SDL_MouseRelativeCursorVisibleChanged, mouse);

mouse->was_touch_mouse_events = SDL_FALSE; /* no touch to mouse movement event pending */

mouse->cursor_shown = SDL_TRUE;
Expand Down Expand Up @@ -992,6 +1002,9 @@ void SDL_MouseQuit(void)

SDL_DelHintCallback(SDL_HINT_MOUSE_RELATIVE_WARP_MOTION,
SDL_MouseRelativeWarpMotionChanged, mouse);

SDL_DelHintCallback(SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE,
SDL_MouseRelativeCursorVisibleChanged, mouse);
}

Uint32 SDL_GetMouseState(int *x, int *y)
Expand Down Expand Up @@ -1412,7 +1425,7 @@ void SDL_SetCursor(SDL_Cursor *cursor)
}
}

if (cursor && mouse->cursor_shown && !mouse->relative_mode) {
if (cursor && mouse->cursor_shown && (!mouse->relative_mode || mouse->relative_mode_cursor_visible)) {
if (mouse->ShowCursor) {
mouse->ShowCursor(cursor);
}
Expand Down
1 change: 1 addition & 0 deletions src/events/SDL_mouse_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ typedef struct
SDL_bool relative_mode;
SDL_bool relative_mode_warp;
SDL_bool relative_mode_warp_motion;
SDL_bool relative_mode_cursor_visible;
SDL_bool enable_normal_speed_scale;
float normal_speed_scale;
SDL_bool enable_relative_speed_scale;
Expand Down

0 comments on commit 194d72b

Please sign in to comment.