Core::SetState() allow state to change without sending a callback.
Some state changes are meant to be near instantanoues, before switching to something else. By reporting ithe instant switch, the UI will flicker between states (pause/play button) and the debugger will unnecessarily update. Skipping the callback avoids these issues.
This commit is contained in:
parent
df8c0d2b39
commit
b57ba42a55
|
@ -712,7 +712,7 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
|
|||
|
||||
// Set or get the running state
|
||||
|
||||
void SetState(State state)
|
||||
void SetState(State state, bool report_state_change)
|
||||
{
|
||||
// State cannot be controlled until the CPU Thread is operational
|
||||
if (!IsRunningAndStarted())
|
||||
|
@ -739,7 +739,10 @@ void SetState(State state)
|
|||
break;
|
||||
}
|
||||
|
||||
CallOnStateChangedCallbacks(GetState());
|
||||
// Certain callers only change the state momentarily. Sending a callback for them causes
|
||||
// unwanted updates, such as the Pause/Play button flickering between states on frame advance.
|
||||
if (report_state_change)
|
||||
CallOnStateChangedCallbacks(GetState());
|
||||
}
|
||||
|
||||
State GetState()
|
||||
|
@ -1083,7 +1086,7 @@ void DoFrameStep()
|
|||
// if already paused, frame advance for 1 frame
|
||||
s_stop_frame_step = false;
|
||||
s_frame_step = true;
|
||||
SetState(State::Running);
|
||||
SetState(State::Running, false);
|
||||
}
|
||||
else if (!s_frame_step)
|
||||
{
|
||||
|
|
|
@ -147,7 +147,7 @@ bool IsHostThread();
|
|||
bool WantsDeterminism();
|
||||
|
||||
// [NOT THREADSAFE] For use by Host only
|
||||
void SetState(State state);
|
||||
void SetState(State state, bool report_state_change = true);
|
||||
State GetState();
|
||||
|
||||
void SaveScreenShot();
|
||||
|
|
|
@ -160,7 +160,7 @@ void CodeDiffDialog::ClearBlockCache()
|
|||
Core::State old_state = Core::GetState();
|
||||
|
||||
if (old_state == Core::State::Running)
|
||||
Core::SetState(Core::State::Paused);
|
||||
Core::SetState(Core::State::Paused, false);
|
||||
|
||||
Core::System::GetInstance().GetJitInterface().ClearCache();
|
||||
|
||||
|
@ -349,7 +349,7 @@ void CodeDiffDialog::Update(bool include)
|
|||
// Wrap everything in a pause
|
||||
Core::State old_state = Core::GetState();
|
||||
if (old_state == Core::State::Running)
|
||||
Core::SetState(Core::State::Paused);
|
||||
Core::SetState(Core::State::Paused, false);
|
||||
|
||||
// Main process
|
||||
if (include)
|
||||
|
|
Loading…
Reference in New Issue