openMSX
GlobalSettings.cc
Go to the documentation of this file.
1#include "GlobalSettings.hh"
2#include "SettingsConfig.hh"
4#include "strCat.hh"
5#include "view.hh"
6#include "xrange.hh"
7#include "build-info.hh"
8#include <memory>
9#include <SDL.h>
10
11namespace openmsx {
12
14 : commandController(commandController_)
15 , pauseSetting(commandController, "pause",
16 "pauses the emulation", false, Setting::DONT_SAVE)
17 , powerSetting(commandController, "power",
18 "turn power on/off", false, Setting::DONT_SAVE)
19 , autoSaveSetting(commandController, "save_settings_on_exit",
20 "automatically save settings when openMSX exits", true)
21 , umrCallBackSetting(commandController, "umr_callback",
22 "Tcl proc to call when an UMR is detected", {})
23 , invalidPsgDirectionsSetting(commandController,
24 "invalid_psg_directions_callback",
25 "Tcl proc called when the MSX program has set invalid PSG port directions",
26 "default_invalid_psg_directions_callback")
27 , invalidPpiModeSetting(commandController,
28 "invalid_ppi_mode_callback",
29 "Tcl proc called when the MSX program has set an invalid PPI mode",
30 "default_invalid_ppi_mode_callback")
31 , resampleSetting(commandController, "resampler", "Resample algorithm",
33 // For Dingux, LQ is good compromise between quality and performance
36 // For Android, BLIP is good compromise between quality and performance
38#else
39 // For other platforms, default setting may be changed in future
41#endif
46 , speedManager(commandController)
47 , throttleManager(commandController)
48{
49 deadZoneSettings = to_vector(
50 view::transform(xrange(SDL_NumJoysticks()), [&](auto i) {
51 return std::make_unique<IntegerSetting>(
52 commandController,
53 tmpStrCat("joystick", i + 1, "_deadzone"),
54 "size (as a percentage) of the dead center zone",
55 25, 0, 100);
56 }));
57 getPowerSetting().attach(*this);
58}
59
61{
62 getPowerSetting().detach(*this);
63 commandController.getSettingsConfig().setSaveSettings(
64 autoSaveSetting.getBoolean());
65}
66
67// Observer<Setting>
68void GlobalSettings::update(const Setting& setting) noexcept
69{
70 if (&setting == &getPowerSetting()) { // either on or off
71 // automatically unpause after a power off/on cycle
72 // this solved a bug, but apart from that this behaviour also
73 // makes more sense
74 try {
75 getPauseSetting().setBoolean(false);
76 } catch(...) {
77 // Ignore. E.g. can trigger when a Tcl trace on the
78 // pause setting triggers errors in the Tcl script.
79 }
80 }
81}
82
83} // namespace openmsx
BaseSetting * setting
Definition: Interpreter.cc:28
#define PLATFORM_DINGUX
Definition: build-info.hh:16
#define PLATFORM_ANDROID
Definition: build-info.hh:17
bool getBoolean() const noexcept
GlobalSettings(GlobalCommandController &commandController)
BooleanSetting & getPowerSetting()
void setSaveSettings(bool save)
void detach(Observer< T > &observer)
Definition: Subject.hh:56
This file implemented 3 utility functions:
Definition: Autofire.cc:9
constexpr auto transform(Range &&range, UnaryOp op)
Definition: view.hh:458
auto to_vector(Range &&range) -> std::vector< detail::ToVectorType< T, decltype(std::begin(range))> >
Definition: stl.hh:266
TemporaryString tmpStrCat(Ts &&... ts)
Definition: strCat.hh:610
constexpr auto xrange(T e)
Definition: xrange.hh:132