stella/src/emucore/Settings.hxx

174 lines
5.8 KiB
C++
Raw Normal View History

//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
2019-01-01 15:05:51 +00:00
// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#ifndef SETTINGS_HXX
#define SETTINGS_HXX
#include <map>
#include "Variant.hxx"
X11 and SDL versions now fully compile and fully support the new EventHandler class. All thats left to do there is integrate the Snapshot code into the core, but that will have to wait until I rewrite the PNG handler to not need the PNG library ... Changed the Settings class to a virtual abstract class, and created a SettingsUNIX class to derive from it and work with the X11 and SDL versions. Some notes on updating the DOS and Windows ports (which I will probably do eventually), and on porting to other toolkits: A port needs the following: - a main function which takes native events and converts to the core format, and generally acts as the dispatcher (mainXXX.cxx) - a specific frontend, derived from Frontend.hxx, which sets up port specific filename and locations (FrontendXXX.hxx) - a specific settings class, derived from Settings.hxx, which deals with settings/commandline arguments specific to that port (SettingsXXX.hxx) - probably some other stuff that I've forgotten The next step is get the DOS port working with the new EventHandler (easy) and attempt to bring the Windows port into the year 2003 (it hasn't been touched for almost a year, quite hard). I also have to write a GUI class that will draw menus, etc. and actually let you remap keys from the emulator itself. And that may have to wait until the fabled graphics rewrite that Brad and I will be working on. It never ends ... git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@181 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2003-09-11 20:53:51 +00:00
#include "bspf.hxx"
/**
This class provides an interface for accessing all configurable options,
both from the settings file and from the commandline.
Note that options can be configured as 'internal' or 'external'. Internal
options are ones that the app registers with the system, and always saves
when the app exits. External options are those that may be set for
temporary use; they are used (when appropriate), but never saved to the
settings file.
Each c'tor (both in the base class and in any derived classes) are
responsible for registering all options as either internal or external.
If an option isn't registered as internal, it will be considered external
and will not be saved.
X11 and SDL versions now fully compile and fully support the new EventHandler class. All thats left to do there is integrate the Snapshot code into the core, but that will have to wait until I rewrite the PNG handler to not need the PNG library ... Changed the Settings class to a virtual abstract class, and created a SettingsUNIX class to derive from it and work with the X11 and SDL versions. Some notes on updating the DOS and Windows ports (which I will probably do eventually), and on porting to other toolkits: A port needs the following: - a main function which takes native events and converts to the core format, and generally acts as the dispatcher (mainXXX.cxx) - a specific frontend, derived from Frontend.hxx, which sets up port specific filename and locations (FrontendXXX.hxx) - a specific settings class, derived from Settings.hxx, which deals with settings/commandline arguments specific to that port (SettingsXXX.hxx) - probably some other stuff that I've forgotten The next step is get the DOS port working with the new EventHandler (easy) and attempt to bring the Windows port into the year 2003 (it hasn't been touched for almost a year, quite hard). I also have to write a GUI class that will draw menus, etc. and actually let you remap keys from the emulator itself. And that may have to wait until the fabled graphics rewrite that Brad and I will be working on. It never ends ... git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@181 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2003-09-11 20:53:51 +00:00
@author Stephen Anthony
*/
class Settings
{
public:
X11 and SDL versions now fully compile and fully support the new EventHandler class. All thats left to do there is integrate the Snapshot code into the core, but that will have to wait until I rewrite the PNG handler to not need the PNG library ... Changed the Settings class to a virtual abstract class, and created a SettingsUNIX class to derive from it and work with the X11 and SDL versions. Some notes on updating the DOS and Windows ports (which I will probably do eventually), and on porting to other toolkits: A port needs the following: - a main function which takes native events and converts to the core format, and generally acts as the dispatcher (mainXXX.cxx) - a specific frontend, derived from Frontend.hxx, which sets up port specific filename and locations (FrontendXXX.hxx) - a specific settings class, derived from Settings.hxx, which deals with settings/commandline arguments specific to that port (SettingsXXX.hxx) - probably some other stuff that I've forgotten The next step is get the DOS port working with the new EventHandler (easy) and attempt to bring the Windows port into the year 2003 (it hasn't been touched for almost a year, quite hard). I also have to write a GUI class that will draw menus, etc. and actually let you remap keys from the emulator itself. And that may have to wait until the fabled graphics rewrite that Brad and I will be working on. It never ends ... git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@181 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2003-09-11 20:53:51 +00:00
/**
Create a new settings abstract class
*/
explicit Settings();
virtual ~Settings() = default;
using Options = std::map<string, Variant>;
public:
/**
This method should be called to display usage information.
*/
void usage() const;
/**
This method is called to load settings from the settings file,
and apply commandline options specified by the given parameter.
@param cfgfile The full path to the configuration file
@param options A list of options that overrides ones in the
settings file
*/
void load(const string& cfgfile, const Options& options);
/**
This method is called to save the current settings to the
settings file.
*/
void save(const string& cfgfile) const;
/**
Get the value assigned to the specified key.
@param key The key of the setting to lookup
@return The (variant) value of the setting
*/
const Variant& value(const string& key) const;
/**
Set the value associated with the specified key.
@param key The key of the setting
@param value The (variant) value to assign to the key
*/
void setValue(const string& key, const Variant& value);
/**
Convenience methods to return specific types.
@param key The key of the setting to lookup
@return The specific type value of the value
Added 'WINDOWED_SUPPORT' compile-time argument, which can be used for those systems which don't actually have a windowing environment. When this is set, toggling from fullscreen will not be possible, and certain window-related UI functions will not be accessible. Completely revamped video subsystem. Windowed and fullscreen modes are now dealt with separately. Windows can be zoomed using the 'zoom_ui' and 'zoom_tia' arguments. Fullscreen modes are now set by resolution, not zoom, so you can specify to always use a certain fullscreen resolution, and the images will be scaled appropriately. This also fixes the fullscreen issues on widescreen monitors; just select a widescreen video mode, and the aspect ratio will always be correct. Removed dirty-rect support for software rendering of the TIA image, as it ended up being slower than just updating the entire image. For those resolutions where it will start to slow down (1024x768 or higher), one should be using OpenGL. Fixed issue in Windows when returning from fullscreen mode made the window constantly 'shrink' in size. It was related to auto-detecting the desktop resolution, which is really the job of SDL. As such, all further releases of Stella will require SDL 1.2.10, which includes this auto-detection code internally. Made ROM launcher resizable, configurable in sizes from 320x240 to 800x600. Updated the UIDialog to change these quantities from the UI (Stella will need to be restarted for it to take effect). Removed aspect ratio support, since it was causing problems, and the new fullscreen mode work has made it obsolete. i *may* consider it again in the future, if there's sufficient demand. Added 'fullres' commandline argument, used to set the fullscreen resolution. Added 'launcherres' commandline argument, used to set the ROM launcher resolution. This replaces 'launchersize' argument, which has been removed. Changed 'scale_ui' and 'scale_tia' to 'zoom_ui' and 'zoom_tia', respectively. Their function remains the same. Changed meaning of 'gl_fsmax' argument to specify what modes to use fullscreen OpenGL scaling (previously, this was a boolean, and didn't consider different modes). git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1323 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-06-20 16:33:23 +00:00
*/
int getInt(const string& key) const { return value(key).toInt(); }
float getFloat(const string& key) const { return value(key).toFloat(); }
bool getBool(const string& key) const { return value(key).toBool(); }
const string& getString(const string& key) const { return value(key).toString(); }
const GUI::Size getSize(const string& key) const { return value(key).toSize(); }
Added 'WINDOWED_SUPPORT' compile-time argument, which can be used for those systems which don't actually have a windowing environment. When this is set, toggling from fullscreen will not be possible, and certain window-related UI functions will not be accessible. Completely revamped video subsystem. Windowed and fullscreen modes are now dealt with separately. Windows can be zoomed using the 'zoom_ui' and 'zoom_tia' arguments. Fullscreen modes are now set by resolution, not zoom, so you can specify to always use a certain fullscreen resolution, and the images will be scaled appropriately. This also fixes the fullscreen issues on widescreen monitors; just select a widescreen video mode, and the aspect ratio will always be correct. Removed dirty-rect support for software rendering of the TIA image, as it ended up being slower than just updating the entire image. For those resolutions where it will start to slow down (1024x768 or higher), one should be using OpenGL. Fixed issue in Windows when returning from fullscreen mode made the window constantly 'shrink' in size. It was related to auto-detecting the desktop resolution, which is really the job of SDL. As such, all further releases of Stella will require SDL 1.2.10, which includes this auto-detection code internally. Made ROM launcher resizable, configurable in sizes from 320x240 to 800x600. Updated the UIDialog to change these quantities from the UI (Stella will need to be restarted for it to take effect). Removed aspect ratio support, since it was causing problems, and the new fullscreen mode work has made it obsolete. i *may* consider it again in the future, if there's sufficient demand. Added 'fullres' commandline argument, used to set the fullscreen resolution. Added 'launcherres' commandline argument, used to set the ROM launcher resolution. This replaces 'launchersize' argument, which has been removed. Changed 'scale_ui' and 'scale_tia' to 'zoom_ui' and 'zoom_tia', respectively. Their function remains the same. Changed meaning of 'gl_fsmax' argument to specify what modes to use fullscreen OpenGL scaling (previously, this was a boolean, and didn't consider different modes). git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1323 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-06-20 16:33:23 +00:00
protected:
/**
Add key/value pair to specified map. Note that these should only be called
directly within the c'tor, to register the 'key' and set it to the
appropriate 'value'. Elsewhere, any derived classes should call 'setValue',
and let it decide where the key/value pair will be saved.
*/
void setInternal(const string& key, const Variant& value);
void setExternal(const string& key, const Variant& value);
/**
This method will be called to load the settings from the
platform-specific settings file. Since different ports can have
different behaviour here, we mark it as virtual so derived
classes can override as needed.
@param cfgfile The full path to the configuration file
@return False on any error, else true
*/
virtual bool loadConfigFile(const string& cfgfile);
/**
This method will be called to save the current settings to the
platform-specific settings file. Since different ports can have
different behaviour here, we mark it as virtual so derived
classes can override as needed.
@param cfgfile The full path to the configuration file
@return False on any error, else true
*/
virtual bool saveConfigFile(const string& cfgfile) const;
// Trim leading and following whitespace from a string
static string trim(const string& str)
{
string::size_type first = str.find_first_not_of(' ');
return (first == string::npos) ? EmptyString :
str.substr(first, str.find_last_not_of(' ')-first+1);
}
const Options& getInternalSettings() const
{ return myInternalSettings; }
const Options& getExternalSettings() const
{ return myExternalSettings; }
private:
/**
This method must be called *after* settings have been fully loaded
to validate (and change, if necessary) any improper settings.
*/
void validate();
private:
// Holds key/value pairs that are necessary for Stella to
// function and must be saved on each program exit.
Options myInternalSettings;
// Holds auxiliary key/value pairs that shouldn't be saved on
// program exit.
Options myExternalSettings;
private:
// Following constructors and assignment operators not supported
Settings(const Settings&) = delete;
Settings(Settings&&) = delete;
Settings& operator=(const Settings&) = delete;
Settings& operator=(Settings&&) = delete;
};
#endif