@@ -321,12 +321,15 @@ bool Application::init(const char* title, int width, int height)
321321 }
322322
323323 SDL_EventState (SDL_SYSWMEVENT, SDL_ENABLE);
324+
324325 _coreName.clear ();
325326 _gameData = NULL ;
326327 _validSlots = 0 ;
327328 _isDriveFloppy = false ;
328329 lastHardcore = hardcore ();
329330 cancelLoad = false ;
331+ _absViewMouseX = _absViewMouseY = 0 ;
332+
330333 updateMenu ();
331334 updateDiscMenu (true );
332335 return true ;
@@ -2420,6 +2423,7 @@ void Application::handle(const SDL_SysWMEvent* syswm)
24202423
24212424 case IDM_EMULATOR_CONFIG:
24222425 _config.showEmulatorSettingsDialog ();
2426+ updateMouseCapture ();
24232427 updateSpeedIndicator ();
24242428 _video.redraw ();
24252429 break ;
@@ -2527,34 +2531,45 @@ void Application::handle(const SDL_MouseMotionEvent* motion)
25272531 else if (viewY >= viewScaledHeight)
25282532 viewY = viewScaledHeight - 1 ;
25292533
2534+ if (SDL_GetRelativeMouseMode ())
2535+ {
2536+ _absViewMouseX += motion->xrel ;
2537+ _absViewMouseY += motion->yrel ;
2538+ }
2539+ else
2540+ {
2541+ _absViewMouseX = viewX;
2542+ _absViewMouseY = viewY;
2543+ }
2544+
25302545 switch (_video.getRotation ())
25312546 {
25322547 default :
25332548 rel_x = ((viewX << 16 ) / viewScaledWidth) - 32767 ;
25342549 rel_y = ((viewY << 16 ) / viewScaledHeight) - 32767 ;
2535- abs_x = (viewX * viewWidth) / viewScaledWidth;
2536- abs_y = (viewY * viewHeight) / viewScaledHeight;
2550+ abs_x = (_absViewMouseX * viewWidth) / viewScaledWidth;
2551+ abs_y = (_absViewMouseY * viewHeight) / viewScaledHeight;
25372552 break ;
25382553
25392554 case Video::Rotation::Ninety:
25402555 rel_x = 32767 - ((viewY << 16 ) / viewScaledHeight);
25412556 rel_y = ((viewX << 16 ) / viewScaledWidth) - 32767 ;
2542- abs_x = viewWidth - ((viewY * viewWidth) / viewScaledHeight) - 1 ;
2543- abs_y = (viewX * viewHeight) / viewScaledWidth;
2557+ abs_x = viewWidth - ((_absViewMouseY * viewWidth) / viewScaledHeight) - 1 ;
2558+ abs_y = (_absViewMouseX * viewHeight) / viewScaledWidth;
25442559 break ;
25452560
25462561 case Video::Rotation::OneEighty:
25472562 rel_x = 32767 - ((viewX << 16 ) / viewScaledWidth);
25482563 rel_y = 32767 - ((viewY << 16 ) / viewScaledHeight);
2549- abs_x = viewWidth - ((viewX * viewWidth) / viewScaledWidth) - 1 ;
2550- abs_y = viewHeight - ((viewY * viewHeight) / viewScaledHeight) - 1 ;
2564+ abs_x = viewWidth - ((_absViewMouseX * viewWidth) / viewScaledWidth) - 1 ;
2565+ abs_y = viewHeight - ((_absViewMouseY * viewHeight) / viewScaledHeight) - 1 ;
25512566 break ;
25522567
25532568 case Video::Rotation::TwoSeventy:
25542569 rel_x = ((viewY << 16 ) / viewScaledHeight) - 32767 ;
25552570 rel_y = 32767 - ((viewX << 16 ) / viewScaledWidth);
2556- abs_x = (viewY * viewWidth) / viewScaledHeight;
2557- abs_y = viewHeight - ((viewX * viewHeight) / viewScaledWidth) - 1 ;
2571+ abs_x = (_absViewMouseY * viewWidth) / viewScaledHeight;
2572+ abs_y = viewHeight - ((_absViewMouseX * viewHeight) / viewScaledWidth) - 1 ;
25582573 break ;
25592574 }
25602575
@@ -2684,11 +2699,16 @@ void Application::handle(const KeyBinds::Action action, unsigned extra)
26842699 updateMenu ();
26852700
26862701 _video.showMessage (_keybinds.hasGameFocus () ? " Game focus enabled" : " Game focus disabled" , 60 );
2687- SDL_SetRelativeMouseMode (_keybinds. hasGameFocus () ? SDL_TRUE : SDL_FALSE );
2702+ updateMouseCapture ( );
26882703 break ;
26892704 }
26902705}
26912706
2707+ void Application::updateMouseCapture ()
2708+ {
2709+ SDL_SetRelativeMouseMode (_keybinds.hasGameFocus () && _config.getGameFocusCaptureMouse () ? SDL_TRUE : SDL_FALSE);
2710+ }
2711+
26922712void Application::toggleFastForwarding (unsigned extra)
26932713{
26942714 // get the current fast forward selection
0 commit comments