engine: platform: sdl: try to save and restore mouse position during showing or hiding cursor

This commit is contained in:
Alibek Omarov 2025-02-22 17:35:45 +03:00
parent bda4c45504
commit 9decba873b

View file

@ -33,6 +33,12 @@ static struct
} cursors; } cursors;
#endif #endif
static struct
{
int x, y;
qboolean pushed;
} in_visible_cursor_pos;
/* /*
============= =============
Platform_GetMousePos Platform_GetMousePos
@ -203,11 +209,6 @@ void Platform_SetCursorType( VGUI_DefaultCursor type )
{ {
qboolean visible; qboolean visible;
#if SDL_VERSION_ATLEAST( 2, 0, 0 )
if( !cursors.initialized )
return;
#endif
switch( type ) switch( type )
{ {
case dc_user: case dc_user:
@ -229,11 +230,28 @@ void Platform_SetCursorType( VGUI_DefaultCursor type )
#if SDL_VERSION_ATLEAST( 2, 0, 0 ) #if SDL_VERSION_ATLEAST( 2, 0, 0 )
if( host.mouse_visible ) if( host.mouse_visible )
{ {
if( cursors.initialized )
SDL_SetCursor( cursors.cursors[type] ); SDL_SetCursor( cursors.cursors[type] );
SDL_ShowCursor( true ); SDL_ShowCursor( true );
// restore the last mouse position
if( in_visible_cursor_pos.pushed )
{
SDL_WarpMouseInWindow( host.hWnd, in_visible_cursor_pos.x, in_visible_cursor_pos.y );
in_visible_cursor_pos.pushed = false;
}
} }
else else
{ {
// save last mouse position and warp it to the center
if( !in_visible_cursor_pos.pushed )
{
SDL_GetMouseState( &in_visible_cursor_pos.x, &in_visible_cursor_pos.y );
SDL_WarpMouseInWindow( host.hWnd, host.window_center_x, host.window_center_y );
in_visible_cursor_pos.pushed = true;
}
SDL_ShowCursor( false ); SDL_ShowCursor( false );
} }
#else #else