Compare commits

...

4 Commits

Author SHA1 Message Date
Tygyh
15f5765efb
Merge a327466771 into a163877413 2025-06-10 19:13:02 -07:00
JMC47
a163877413
Merge pull request #13746 from LillyJadeKatrin/retroachievements-hardcore-changed
MainWindow - Avoid excessive emulation state changes
2025-06-10 17:32:04 -04:00
LillyJadeKatrin
417badc55c MainWindow - Avoid excessive emulation state changes
Updates the Hardcore Changed callback to only signal EmulationStateChanged if the new Hardcore Mode setting is different from the previous one.
2025-06-10 16:03:14 -04:00
Dr. Dystopia
a327466771 Replace lazy implementation - Tools find-includes-cycles 2025-04-18 12:18:02 +02:00
3 changed files with 28 additions and 23 deletions

View File

@ -2010,9 +2010,14 @@ void MainWindow::ShowAchievementSettings()
void MainWindow::OnHardcoreChanged()
{
if (AchievementManager::GetInstance().IsHardcoreModeActive())
bool hardcore_active = AchievementManager::GetInstance().IsHardcoreModeActive();
if (hardcore_active)
Settings::Instance().SetDebugModeEnabled(false);
emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance()));
// EmulationStateChanged causes several dialogs to redraw, including anything affected by hardcore
// mode. Every dialog that depends on hardcore mode is redrawn by EmulationStateChanged.
if (hardcore_active != m_former_hardcore_setting)
emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance()));
m_former_hardcore_setting = hardcore_active;
}
#endif // USE_RETRO_ACHIEVEMENTS

View File

@ -267,6 +267,7 @@ private:
#ifdef USE_RETRO_ACHIEVEMENTS
AchievementsWindow* m_achievements_window = nullptr;
Config::ConfigChangedCallbackID m_config_changed_callback_id;
bool m_former_hardcore_setting = false;
#endif // USE_RETRO_ACHIEVEMENTS
AssemblerWidget* m_assembler_widget;

View File

@ -1,26 +1,20 @@
#! /usr/bin/env python
#! /usr/bin/env python3
'''
Run this script from Source/Core/ to find all the #include cycles.
'''
import subprocess
from typing import Iterator
from pathlib import Path
def get_local_includes_for(path):
lines = open(path).read().split('\n')
includes = [l.strip() for l in lines if l.strip().startswith('#include')]
return [i.split()[1][1:-1] for i in includes if '"' in i.split()[1]]
def get_local_includes_for(path: Path) -> Iterator[str]:
with path.open() as file:
for line in file:
line = line.strip()
if line.startswith("#include") and '"' in line:
yield line.split()[1].strip(' "')
def find_all_files():
'''Could probably use os.walk, but meh.'''
f = subprocess.check_output(['find', '.', '-name', '*.h'],
universal_newlines=True).strip().split('\n')
return [p[2:] for p in f]
def make_include_graph():
return { f: get_local_includes_for(f) for f in find_all_files() }
def strongly_connected_components(graph):
def strongly_connected_components(graph: dict[str, list[str]]) -> list[tuple[str, ...]]:
"""
Tarjan's Algorithm (named for its discoverer, Robert Tarjan) is a graph theory algorithm
for finding the strongly connected components of a graph.
@ -34,7 +28,7 @@ def strongly_connected_components(graph):
index = {}
result = []
def strongconnect(node):
def strongconnect(node: str) -> None:
# set the depth index for this node to the smallest unused index
index[node] = index_counter[0]
lowlinks[node] = index_counter[0]
@ -74,7 +68,12 @@ def strongly_connected_components(graph):
return result
if __name__ == '__main__':
comp = strongly_connected_components(make_include_graph())
for c in comp:
if len(c) != 1:
print(c)
paths = Path(".").glob("**/*.h")
graph = {
path.as_posix(): list(get_local_includes_for(path))
for path in paths
}
components = strongly_connected_components(graph)
for component in components:
if len(component) != 1:
print(component)