diff --git a/gtk/meson.build b/gtk/meson.build index 66555110..9973f089 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -1,7 +1,7 @@ project('snes9x-gtk', ['c', 'cpp'], version: '1.60', - default_options: ['cpp_std=c++11']) + default_options: ['cpp_std=c++14']) args = ['-DSNES9X_GTK', '-DUNZIP_SUPPORT', '-DNETPLAY_SUPPORT', '-DJMA_SUPPORT', '-Wall', '-W', '-Wno-unused-parameter'] srcs = [] diff --git a/gtk/src/gtk_binding.cpp b/gtk/src/gtk_binding.cpp index 63b2d153..dfa2cf21 100644 --- a/gtk/src/gtk_binding.cpp +++ b/gtk/src/gtk_binding.cpp @@ -227,6 +227,13 @@ Binding::Binding (const char *raw_string) } } +std::string Binding::as_string() +{ + char buf[PATH_MAX]; + to_string(buf, false); + return std::string(buf); +} + void Binding::to_string (char *str, bool translate) { diff --git a/gtk/src/gtk_binding.h b/gtk/src/gtk_binding.h index a5a2706e..2ecf9433 100644 --- a/gtk/src/gtk_binding.h +++ b/gtk/src/gtk_binding.h @@ -8,6 +8,7 @@ #define __GTK_BINDING_H #include "gtk_2_3_compat.h" +#include #define AXIS_POS 1 #define AXIS_NEG 0 @@ -44,6 +45,7 @@ class Binding Binding (); Binding (const char *str); void to_string (char *str, bool translate = true); + std::string as_string(); unsigned int hex (); unsigned int base_hex (); void clear (); diff --git a/gtk/src/gtk_config.cpp b/gtk/src/gtk_config.cpp index 7aa31558..cba365b4 100644 --- a/gtk/src/gtk_config.cpp +++ b/gtk/src/gtk_config.cpp @@ -15,30 +15,30 @@ #include "gtk_display.h" #include "conffile.h" -static bool directory_exists (std::string str) +static bool directory_exists(std::string str) { DIR *dir; - dir = opendir (str.c_str ()); + dir = opendir(str.c_str()); if (dir) { - closedir (dir); + closedir(dir); return true; } return false; } -std::string get_config_dir () +std::string get_config_dir() { // Find config directory - char *env_home = getenv ("HOME"); - char *env_xdg_config_home = getenv ("XDG_CONFIG_HOME"); + char *env_home = getenv("HOME"); + char *env_xdg_config_home = getenv("XDG_CONFIG_HOME"); if (!env_home && !env_xdg_config_home) { - return std::string (".snes9x"); + return std::string(".snes9x"); } std::string config; @@ -51,30 +51,30 @@ std::string get_config_dir () (legacy += env_home) += "/.snes9x"; } else - config = std::string (env_xdg_config_home) + "/snes9x"; + config = std::string(env_xdg_config_home) + "/snes9x"; - if (directory_exists (legacy) && !directory_exists(config)) + if (directory_exists(legacy) && !directory_exists(config)) return legacy; return config; } -std::string get_config_file_name () +std::string get_config_file_name() { - return get_config_dir () + "/snes9x.conf"; + return get_config_dir() + "/snes9x.conf"; } -void S9xParsePortConfig (ConfigFile &conf, int pass) +void S9xParsePortConfig(ConfigFile &conf, int pass) { } -Snes9xConfig::Snes9xConfig () +Snes9xConfig::Snes9xConfig() { joystick = NULL; joystick_threshold = 40; } -int Snes9xConfig::load_defaults () +int Snes9xConfig::load_defaults() { full_screen_on_open = false; change_display_resolution = false; @@ -107,8 +107,8 @@ int Snes9xConfig::load_defaults () sound_playback_rate = 5; sound_input_rate = 31950; auto_input_rate = true; - last_directory.clear (); - last_shader_directory.clear (); + last_directory.clear(); + last_shader_directory.clear(); window_width = -1; window_height = -1; preferences_width = -1; @@ -117,11 +117,11 @@ int Snes9xConfig::load_defaults () shader_parameters_height = -1; enable_icons = true; current_display_tab = 0; - sram_directory.clear (); - export_directory.clear (); - savestate_directory.clear (); - cheat_directory.clear (); - patch_directory.clear (); + sram_directory.clear(); + export_directory.clear(); + savestate_directory.clear(); + cheat_directory.clear(); + patch_directory.clear(); screensaver_needs_reset = false; ntsc_setup = snes_ntsc_composite; ntsc_scanline_intensity = 1; @@ -134,12 +134,12 @@ int Snes9xConfig::load_defaults () netplay_send_rom = false; netplay_default_port = 6096; netplay_max_frame_loss = 10; - netplay_last_rom.clear (); - netplay_last_host.clear (); + netplay_last_rom.clear(); + netplay_last_host.clear(); netplay_last_port = 6096; modal_dialogs = true; current_save_slot = 0; - S9xCheatsEnable (); + S9xCheatsEnable(); rewind_granularity = 5; rewind_buffer_size = 0; @@ -151,7 +151,7 @@ int Snes9xConfig::load_defaults () pbo_format = 0; npot_textures = false; use_shaders = false; - shader_filename.clear (); + shader_filename.clear(); use_glfinish = false; use_sync_control = false; #endif @@ -204,202 +204,193 @@ int Snes9xConfig::load_defaults () return 0; } -void Snes9xConfig::joystick_register_centers () +void Snes9xConfig::joystick_register_centers() { for (int i = 0; joystick[i] != NULL; i++) - joystick[i]->register_centers (); + joystick[i]->register_centers(); } -void Snes9xConfig::flush_joysticks () +void Snes9xConfig::flush_joysticks() { - int i; - - for (i = 0; joystick[i] != NULL; i++) - joystick[i]->flush (); + for (int i = 0; joystick[i] != NULL; i++) + joystick[i]->flush(); } -void Snes9xConfig::set_joystick_mode (int mode) +void Snes9xConfig::set_joystick_mode(int mode) { - int i; - for (i = 0; joystick[i] != NULL; i++) + for (int i = 0; joystick[i] != NULL; i++) joystick[i]->mode = mode; } -static inline void outbool (ConfigFile &cf, const char *key, bool value, const char *comment = "") +int Snes9xConfig::save_config_file() { - cf.SetBool (key, value, "true", "false", comment); -} - -int Snes9xConfig::save_config_file () -{ - char key[PATH_MAX]; - char buffer[PATH_MAX]; ConfigFile cf; + std::string section = ""; -#undef z -#define z "Display::" - outbool (cf, z"FullscreenOnOpen", full_screen_on_open,"Set the screen resolution after opening a ROM"); - outbool (cf, z"ChangeDisplayResolution", change_display_resolution, "Set the resolution in fullscreen mode"); - cf.SetInt (z"VideoMode", xrr_index, "Platform-specific video mode number"); - outbool (cf, z"ScaleToFit", scale_to_fit, "Scale the image to fit the window size"); - outbool (cf, z"MaintainAspectRatio", maintain_aspect_ratio, "Resize the screen to the proportions set by aspect ratio option"); - cf.SetInt (z"AspectRatio", aspect_ratio, "0: uncorrected, 1: uncorrected integer scale, 2: 4:3, 3: 4/3 integer scale, 4: NTSC/PAL, 5: NTSC/PAL integer scale"); - cf.SetInt (z"SoftwareScaleFilter", scale_method, "Build-specific number of filter used for software scaling"); - cf.SetInt (z"ScanlineFilterIntensity", scanline_filter_intensity, "0: 0%, 1: 12.5%, 2: 25%, 3: 50%, 4: 100%"); - outbool (cf, z"ShowOverscanArea", overscan); - cf.SetInt (z"HiresEffect", hires_effect, "0: Downscale to low-res, 1: Leave as-is, 2: Upscale low-res screens"); - cf.SetInt (z"ForceInvertedByteOrder", force_inverted_byte_order); - outbool (cf, z"Multithreading", multithreading, "Apply filters using multiple threads"); - cf.SetInt (z"NumberOfThreads", num_threads); - cf.SetInt (z"HardwareAcceleration", hw_accel, "0: None, 1: OpenGL, 2: XVideo"); - outbool (cf, z"BilinearFilter", Settings.BilinearFilter, "Smoothes scaled image"); - cf.SetInt (z"SplashBackground", splash_image, "0: Black, 1: Color bars, 2: Pattern, 3: Blue, 4: Default"); + auto outbool = [&](std::string name, bool b, std::string comment = "") { + cf.SetBool((section + "::" + name).c_str(), b, "true", "false", comment.c_str()); + }; -#undef z -#define z "NTSC::" - cf.SetString (z"Hue", std::to_string (ntsc_setup.hue)); - cf.SetString (z"Saturation", std::to_string (ntsc_setup.saturation)); - cf.SetString (z"Contrast", std::to_string (ntsc_setup.contrast)); - cf.SetString (z"Brightness", std::to_string (ntsc_setup.brightness)); - cf.SetString (z"Sharpness", std::to_string (ntsc_setup.sharpness)); - cf.SetString (z"Artifacts", std::to_string (ntsc_setup.artifacts)); - cf.SetString (z"Gamma", std::to_string (ntsc_setup.gamma)); - cf.SetString (z"Bleed", std::to_string (ntsc_setup.bleed)); - cf.SetString (z"Fringing", std::to_string (ntsc_setup.fringing)); - cf.SetString (z"Resolution", std::to_string (ntsc_setup.resolution)); - outbool (cf, z"MergeFields", ntsc_setup.merge_fields); - cf.SetInt (z"ScanlineIntensity", ntsc_scanline_intensity); + auto outstring = [&](std::string name, std::string str, std::string comment = "") { + cf.SetString((section + "::" + name).c_str(), str, comment.c_str()); + }; + + auto outint = [&](std::string name, int i, std::string comment = "") { + cf.SetInt((section + "::" + name).c_str(), i, comment.c_str()); + }; + + section = "Display"; + outbool("FullscreenOnOpen", full_screen_on_open, "Set the screen resolution after opening a ROM"); + outbool("ChangeDisplayResolution", change_display_resolution, "Set the resolution in fullscreen mode"); + outbool("ScaleToFit", scale_to_fit, "Scale the image to fit the window size"); + outbool("ShowOverscanArea", overscan); + outbool("MaintainAspectRatio", maintain_aspect_ratio, "Resize the screen to the proportions set by aspect ratio option"); + outbool("Multithreading", multithreading, "Apply filters using multiple threads"); + outbool("BilinearFilter", Settings.BilinearFilter, "Smoothes scaled image"); + outbool("ForceInvertedByteOrder", force_inverted_byte_order); + outint("VideoMode", xrr_index, "Platform-specific video mode number"); + outint("AspectRatio", aspect_ratio, "0: uncorrected, 1: uncorrected integer scale, 2: 4:3, 3: 4/3 integer scale, 4: NTSC/PAL, 5: NTSC/PAL integer scale"); + outint("SoftwareScaleFilter", scale_method, "Build-specific number of filter used for software scaling"); + outint("ScanlineFilterIntensity", scanline_filter_intensity, "0: 0%, 1: 12.5%, 2: 25%, 3: 50%, 4: 100%"); + outint("HiresEffect", hires_effect, "0: Downscale to low-res, 1: Leave as-is, 2: Upscale low-res screens"); + outint("NumberOfThreads", num_threads); + outint("HardwareAcceleration", hw_accel, "0: None, 1: OpenGL, 2: XVideo"); + outint("SplashBackground", splash_image, "0: Black, 1: Color bars, 2: Pattern, 3: Blue, 4: Default"); + + section = "NTSC"; + outstring("Hue", std::to_string(ntsc_setup.hue)); + outstring("Saturation", std::to_string(ntsc_setup.saturation)); + outstring("Contrast", std::to_string(ntsc_setup.contrast)); + outstring("Brightness", std::to_string(ntsc_setup.brightness)); + outstring("Sharpness", std::to_string(ntsc_setup.sharpness)); + outstring("Artifacts", std::to_string(ntsc_setup.artifacts)); + outstring("Gamma", std::to_string(ntsc_setup.gamma)); + outstring("Bleed", std::to_string(ntsc_setup.bleed)); + outstring("Fringing", std::to_string(ntsc_setup.fringing)); + outstring("Resolution", std::to_string(ntsc_setup.resolution)); + outbool("MergeFields", ntsc_setup.merge_fields); + outint("ScanlineIntensity", ntsc_scanline_intensity); #ifdef USE_OPENGL -#undef z -#define z "OpenGL::" - outbool (cf, z"VSync", sync_to_vblank); - outbool (cf, z"glFinish", use_glfinish); - outbool (cf, z"SyncControl", use_sync_control); - outbool (cf, z"UsePixelBufferObjects", use_pbos); - cf.SetInt (z"PixelBufferObjectBitDepth", pbo_format); - outbool (cf, z"UseNonPowerOfTwoTextures", npot_textures); - outbool (cf, z"EnableCustomShaders", use_shaders); - cf.SetString (z"ShaderFile", shader_filename); + section = "OpenGL"; + outbool("VSync", sync_to_vblank); + outbool("glFinish", use_glfinish); + outbool("SyncControl", use_sync_control); + outbool("UseNonPowerOfTwoTextures", npot_textures); + outbool("EnableCustomShaders", use_shaders); + outbool("UsePixelBufferObjects", use_pbos); + outint("PixelBufferObjectBitDepth", pbo_format); + outstring("ShaderFile", shader_filename); #endif -#undef z -#define z "Sound::" - outbool (cf, z"MuteSound", mute_sound); - outbool (cf, z"MuteSoundDuringTurbo", mute_sound_turbo); - cf.SetInt (z"BufferSize", sound_buffer_size, "Buffer size in milliseconds"); - cf.SetInt (z"Driver", sound_driver); - cf.SetInt (z"InputRate", sound_input_rate); - outbool (cf, z"DynamicRateControl", Settings.DynamicRateControl); - cf.SetInt (z"DynamicRateControlLimit", Settings.DynamicRateLimit); - outbool (cf, z"AutomaticInputRate", auto_input_rate, "Guess input rate by asking the monitor what its refresh rate is"); - cf.SetInt (z"PlaybackRate", gui_config->sound_playback_rate, "1: 8000Hz, 2: 11025Hz, 3: 16000Hz, 4: 22050Hz, 5: 32000Hz, 6: 44100Hz, 7: 48000Hz"); + section = "Sound"; + outbool("MuteSound", mute_sound); + outbool("MuteSoundDuringTurbo", mute_sound_turbo); + outint("BufferSize", sound_buffer_size, "Buffer size in milliseconds"); + outint("Driver", sound_driver); + outint("InputRate", sound_input_rate); + outbool("DynamicRateControl", Settings.DynamicRateControl); + outint("DynamicRateControlLimit", Settings.DynamicRateLimit); + outbool("AutomaticInputRate", auto_input_rate, "Guess input rate by asking the monitor what its refresh rate is"); + outint("PlaybackRate", gui_config->sound_playback_rate, "1: 8000Hz, 2: 11025Hz, 3: 16000Hz, 4: 22050Hz, 5: 32000Hz, 6: 44100Hz, 7: 48000Hz"); -#undef z -#define z "Files::" + section = "Files"; + outstring("LastDirectory", last_directory); + outstring("LastShaderDirectory", last_shader_directory); + outstring("SRAMDirectory", sram_directory); + outstring("SaveStateDirectory", savestate_directory); + outstring("CheatDirectory", cheat_directory); + outstring("PatchDirectory", patch_directory); + outstring("ExportDirectory", export_directory); - cf.SetString (z"LastDirectory", last_directory); - cf.SetString (z"LastShaderDirectory", last_shader_directory); - cf.SetString (z"SRAMDirectory", sram_directory); - cf.SetString (z"SaveStateDirectory", savestate_directory); - cf.SetString (z"CheatDirectory", cheat_directory); - cf.SetString (z"PatchDirectory", patch_directory); - cf.SetString (z"ExportDirectory", export_directory); - -#undef z -#define z "Window State::" - cf.SetInt (z"MainWidth", window_width); - cf.SetInt (z"MainHeight", window_height); - cf.SetInt (z"PreferencesWidth", preferences_width); - cf.SetInt (z"PreferencesHeight", preferences_height); - cf.SetInt (z"ShaderParametersWidth", shader_parameters_width); - cf.SetInt (z"ShaderParametersHeight", shader_parameters_height); - cf.SetInt (z"CurrentDisplayTab", current_display_tab); - outbool (cf, z"UIVisible", ui_visible); - outbool (cf, z"EnableIcons", enable_icons); + section = "Window State"; + outint("MainWidth", window_width); + outint("MainHeight", window_height); + outint("PreferencesWidth", preferences_width); + outint("PreferencesHeight", preferences_height); + outint("ShaderParametersWidth", shader_parameters_width); + outint("ShaderParametersHeight", shader_parameters_height); + outint("CurrentDisplayTab", current_display_tab); + outbool("UIVisible", ui_visible); + outbool("EnableIcons", enable_icons); if (default_esc_behavior != ESC_TOGGLE_MENUBAR) - outbool (cf, z"Fullscreen", 0); + outbool("Fullscreen", 0); else - outbool (cf, z"Fullscreen", fullscreen); + outbool("Fullscreen", fullscreen); -#undef z -#define z "Netplay::" - outbool (cf, z"ActAsServer", netplay_is_server); - outbool (cf, z"UseResetToSync", netplay_sync_reset); - outbool (cf, z"SendROM", netplay_send_rom); - cf.SetInt (z"DefaultPort", netplay_default_port); - cf.SetInt (z"MaxFrameLoss", netplay_max_frame_loss); - cf.SetInt (z"LastUsedPort", netplay_last_port); - cf.SetString (z"LastUsedROM", netplay_last_rom); - cf.SetString (z"LastUsedHost", netplay_last_host); + section = "Netplay"; + outbool("ActAsServer", netplay_is_server); + outbool("UseResetToSync", netplay_sync_reset); + outbool("SendROM", netplay_send_rom); + outint("DefaultPort", netplay_default_port); + outint("MaxFrameLoss", netplay_max_frame_loss); + outint("LastUsedPort", netplay_last_port); + outstring("LastUsedROM", netplay_last_rom); + outstring("LastUsedHost", netplay_last_host); -#undef z -#define z "Behavior::" - outbool (cf, z"PauseEmulationWhenFocusLost", pause_emulation_on_switch); - cf.SetInt (z"DefaultESCKeyBehavior", default_esc_behavior); - outbool (cf, z"PreventScreensaver", prevent_screensaver); - outbool (cf, z"UseModalDialogs", modal_dialogs); - cf.SetInt (z"RewindBufferSize", rewind_buffer_size, "Amount of memory (in MB) to use for rewinding"); - cf.SetInt (z"RewindGranularity", rewind_granularity, "Only save rewind snapshots every N frames"); - cf.SetInt (z"CurrentSaveSlot", current_save_slot); + section = "Behavior"; + outbool("PauseEmulationWhenFocusLost", pause_emulation_on_switch); + outint("DefaultESCKeyBehavior", default_esc_behavior); + outbool("PreventScreensaver", prevent_screensaver); + outbool("UseModalDialogs", modal_dialogs); + outint("RewindBufferSize", rewind_buffer_size, "Amount of memory (in MB) to use for rewinding"); + outint("RewindGranularity", rewind_granularity, "Only save rewind snapshots every N frames"); + outint("CurrentSaveSlot", current_save_slot); -#undef z -#define z "Emulation::" - outbool (cf, z"EmulateTransparency", Settings.Transparency); - outbool (cf, z"DisplayTime", Settings.DisplayTime); - outbool (cf, z"DisplayFrameRate", Settings.DisplayFrameRate); - outbool (cf, z"DisplayPressedKeys", Settings.DisplayPressedKeys); - cf.SetInt (z"SpeedControlMethod", Settings.SkipFrames, "0: Time the frames to 50 or 60Hz, 1: Same, but skip frames if too slow, 2: Synchronize to the sound buffer, 3: Unlimited, except potentially by vsync"); - cf.SetInt (z"SaveSRAMEveryNSeconds", Settings.AutoSaveDelay); - outbool (cf, z"BlockInvalidVRAMAccess", Settings.BlockInvalidVRAMAccessMaster); - outbool (cf, z"AllowDPadContradictions", Settings.UpAndDown, "Allow the D-Pad to press both up + down at the same time, or left + right"); + section = "Emulation"; + outbool("EmulateTransparency", Settings.Transparency); + outbool("DisplayTime", Settings.DisplayTime); + outbool("DisplayFrameRate", Settings.DisplayFrameRate); + outbool("DisplayPressedKeys", Settings.DisplayPressedKeys); + outint("SpeedControlMethod", Settings.SkipFrames, "0: Time the frames to 50 or 60Hz, 1: Same, but skip frames if too slow, 2: Synchronize to the sound buffer, 3: Unlimited, except potentially by vsync"); + outint("SaveSRAMEveryNSeconds", Settings.AutoSaveDelay); + outbool("BlockInvalidVRAMAccess", Settings.BlockInvalidVRAMAccessMaster); + outbool("AllowDPadContradictions", Settings.UpAndDown, "Allow the D-Pad to press both up + down at the same time, or left + right"); -#undef z -#define z "Hacks::" - cf.SetInt (z"SuperFXClockMultiplier", Settings.SuperFXClockMultiplier); - cf.SetInt (z"SoundInterpolationMethod", Settings.InterpolationMethod, "0: None, 1: Linear, 2: Gaussian (what the hardware uses), 3: Cubic, 4: Sinc"); - outbool (cf, z"RemoveSpriteLimit", Settings.MaxSpriteTilesPerLine == 34 ? 0 : 1); - outbool (cf, z"OverclockCPU", Settings.OneClockCycle == 6 ? 0 : 1); - outbool (cf, z"EchoBufferHack", Settings.SeparateEchoBuffer, "Prevents echo buffer from overwriting APU RAM"); + section = "Hacks"; + outint("SuperFXClockMultiplier", Settings.SuperFXClockMultiplier); + outint("SoundInterpolationMethod", Settings.InterpolationMethod, "0: None, 1: Linear, 2: Gaussian (what the hardware uses), 3: Cubic, 4: Sinc"); + outbool("RemoveSpriteLimit", Settings.MaxSpriteTilesPerLine == 34 ? 0 : 1); + outbool("OverclockCPU", Settings.OneClockCycle == 6 ? 0 : 1); + outbool("EchoBufferHack", Settings.SeparateEchoBuffer, "Prevents echo buffer from overwriting APU RAM"); -#undef z -#define z "Input::" + section = "Input"; controllers controller = CTL_NONE; int8 id[4]; for (int i = 0; i < 2; i++) { - const char *output_string; - snprintf (buffer, PATH_MAX, z"ControllerPort%d", i); - S9xGetController (i, &controller, &id[0], &id[1], &id[2], &id[3]); + std::string name; + std::string value; + + name = "ControllerPort" + std::to_string(i); + S9xGetController(i, &controller, &id[0], &id[1], &id[2], &id[3]); switch (controller) { case CTL_JOYPAD: - output_string = "joypad"; + value = "joypad"; break; case CTL_MOUSE: - output_string = "mouse"; + value = "mouse"; break; case CTL_SUPERSCOPE: - output_string = "superscope"; + value = "superscope"; break; case CTL_MP5: - output_string = "multitap"; + value = "multitap"; break; case CTL_JUSTIFIER: - output_string = "justifier"; + value = "justifier"; break; default: - output_string = "none"; + value = "none"; } - cf.SetString (buffer, output_string); + outstring(name, value); } - cf.SetInt (z"JoystickThreshold", joystick_threshold); - -#undef z + outint("JoystickThreshold", joystick_threshold); for (int i = 0; i < NUM_JOYPADS; i++) { @@ -407,238 +398,236 @@ int Snes9xConfig::save_config_file () for (int j = 0; j < NUM_JOYPAD_LINKS; j++) { - snprintf (key, PATH_MAX, "Joypad %d::%s", i, b_links[j].snes9x_name); - joypad.data[j].to_string (buffer, false); - cf.SetString (key, std::string (buffer)); + section = "Joypad " + std::to_string(i); + outstring(b_links[j].snes9x_name, joypad.data[j].as_string()); } } + section = "Shortcuts"; for (int i = NUM_JOYPAD_LINKS; b_links[i].snes9x_name; i++) { - snprintf (key, PATH_MAX, "Shortcuts::%s", b_links[i].snes9x_name); - shortcut[i - NUM_JOYPAD_LINKS].to_string (buffer, false); - cf.SetString (key, std::string (buffer)); + outstring(b_links[i].snes9x_name, shortcut[i - NUM_JOYPAD_LINKS].as_string()); } - cf.SetNiceAlignment (true); - cf.SetShowComments (true); - cf.SaveTo (get_config_file_name ().c_str ()); + cf.SetNiceAlignment(true); + cf.SetShowComments(true); + cf.SaveTo(get_config_file_name().c_str()); return 0; } -int Snes9xConfig::load_config_file () +int Snes9xConfig::load_config_file() { struct stat file_info; - std::string path; - ConfigFile cf; - char key[PATH_MAX]; + ConfigFile cf; - load_defaults (); + load_defaults(); - path = get_config_dir (); + std::string path = get_config_dir(); - if (stat (path.c_str (), &file_info)) + if (stat(path.c_str(), &file_info)) { - if (mkdir (path.c_str (), 0755)) + if (mkdir(path.c_str(), 0755)) { - fprintf (stderr, - _("Couldn't create config directory: %s\n"), - path.c_str ()); + fprintf(stderr, + _("Couldn't create config directory: %s\n"), + path.c_str()); return -1; } } else { if (!(file_info.st_mode & 0700)) - chmod (path.c_str (), file_info.st_mode | 0700); + chmod(path.c_str(), file_info.st_mode | 0700); } - path = get_config_file_name (); + path = get_config_file_name(); - if (stat (path.c_str (), &file_info)) + if (stat(path.c_str(), &file_info)) { - save_config_file (); + save_config_file(); } - if (!cf.LoadFile (path.c_str ())) + if (!cf.LoadFile(path.c_str())) return -1; std::string none; -#define inbool(key, var) { if (cf.Exists (key)) var = cf.GetBool (key); } -#define inint(key, var) { if (cf.Exists(key)) var = cf.GetInt (key); } -#define infloat(key, var) { if (cf.Exists(key)) var = atof (cf.GetString (key, none).c_str()); } -#define instr(key, var) var = cf.GetString (key, none); + std::string section; -#undef z -#define z "Display::" - inbool (z"FullscreenOnOpen", full_screen_on_open); - inbool (z"ChangeDisplayResolution", change_display_resolution); - inint (z"VideoMode", xrr_index); - inbool (z"ScaleToFit", scale_to_fit); - inbool (z"MaintainAspectRatio", maintain_aspect_ratio); - inint (z"AspectRatio", aspect_ratio); - inint (z"SoftwareScaleFilter", scale_method); - inint (z"ScanlineFilterIntensity", scanline_filter_intensity); - inbool (z"ShowOverscanArea", overscan); - inint (z"HiresEffect", hires_effect); - inint (z"ForceInvertedByteOrder", force_inverted_byte_order); - inbool (z"Multithreading", multithreading); - inint (z"NumberOfThreads", num_threads); - inint (z"HardwareAcceleration", hw_accel); - inbool (z"BilinearFilter", Settings.BilinearFilter); - inint (z"SplashBackground", splash_image); + auto inbool = [&](std::string name, auto &b) { + if (cf.Exists((section + "::" + name).c_str())) + b = cf.GetBool((section + "::" + name).c_str()); + }; -#undef z -#define z "NTSC::" - infloat (z"Hue", ntsc_setup.hue); - infloat (z"Saturation", ntsc_setup.saturation); - infloat (z"Contrast", ntsc_setup.contrast); - infloat (z"Brightness", ntsc_setup.brightness); - infloat (z"Sharpness", ntsc_setup.sharpness); - infloat (z"Artifacts", ntsc_setup.artifacts); - infloat (z"Gamma", ntsc_setup.gamma); - infloat (z"Bleed", ntsc_setup.bleed); - infloat (z"Fringing", ntsc_setup.fringing); - infloat (z"Resolution", ntsc_setup.resolution); - inbool (z"MergeFields", ntsc_setup.merge_fields); - inint (z"ScanlineIntensity", ntsc_scanline_intensity); + auto inint = [&](std::string name, auto &i) { + if (cf.Exists((section + "::" + name).c_str())) + i = cf.GetInt((section + "::" + name).c_str()); + }; + + auto indouble = [&](std::string name, double &d) { + if (cf.Exists((section + "::" + name).c_str())) + d = atof(cf.GetString((section + "::" + name).c_str())); + }; + + auto instr = [&](std::string name, std::string &str) { + str = cf.GetString((section + "::" + name).c_str(), none); + }; + + section = "Display"; + inbool("FullscreenOnOpen", full_screen_on_open); + inbool("ChangeDisplayResolution", change_display_resolution); + inint("VideoMode", xrr_index); + inbool("ScaleToFit", scale_to_fit); + inbool("MaintainAspectRatio", maintain_aspect_ratio); + inint("AspectRatio", aspect_ratio); + inint("SoftwareScaleFilter", scale_method); + inint("ScanlineFilterIntensity", scanline_filter_intensity); + inbool("ShowOverscanArea", overscan); + inint("HiresEffect", hires_effect); + inbool("ForceInvertedByteOrder", force_inverted_byte_order); + inbool("Multithreading", multithreading); + inint("NumberOfThreads", num_threads); + inint("HardwareAcceleration", hw_accel); + inbool("BilinearFilter", Settings.BilinearFilter); + inint("SplashBackground", splash_image); + + section = "NTSC"; + indouble("Hue", ntsc_setup.hue); + indouble("Saturation", ntsc_setup.saturation); + indouble("Contrast", ntsc_setup.contrast); + indouble("Brightness", ntsc_setup.brightness); + indouble("Sharpness", ntsc_setup.sharpness); + indouble("Artifacts", ntsc_setup.artifacts); + indouble("Gamma", ntsc_setup.gamma); + indouble("Bleed", ntsc_setup.bleed); + indouble("Fringing", ntsc_setup.fringing); + indouble("Resolution", ntsc_setup.resolution); + inbool("MergeFields", ntsc_setup.merge_fields); + inint("ScanlineIntensity", ntsc_scanline_intensity); #ifdef USE_OPENGL -#undef z -#define z "OpenGL::" - inbool (z"VSync", sync_to_vblank); - inbool (z"glFinish", use_glfinish); - inbool (z"SyncControl", use_sync_control); - inbool (z"UsePixelBufferObjects", use_pbos); - inint (z"PixelBufferObjectBitDepth", pbo_format); - inbool (z"UseNonPowerOfTwoTextures", npot_textures); - inbool (z"EnableCustomShaders", use_shaders); - instr (z"ShaderFile", shader_filename); + section = "OpenGL"; + inbool("VSync", sync_to_vblank); + inbool("glFinish", use_glfinish); + inbool("SyncControl", use_sync_control); + inbool("UsePixelBufferObjects", use_pbos); + inint("PixelBufferObjectBitDepth", pbo_format); + inbool("UseNonPowerOfTwoTextures", npot_textures); + inbool("EnableCustomShaders", use_shaders); + instr("ShaderFile", shader_filename); #endif -#undef z -#define z "Sound::" - inbool (z"MuteSound", mute_sound); - inbool (z"MuteSoundDuringTurbo", mute_sound_turbo); - inint (z"BufferSize", sound_buffer_size); - inint (z"Driver", sound_driver); - inint (z"InputRate", sound_input_rate); - inbool (z"DynamicRateControl", Settings.DynamicRateControl); - inint (z"DynamicRateControlLimit", Settings.DynamicRateLimit); - inbool (z"AutomaticInputRate", auto_input_rate); - inint (z"PlaybackRate", gui_config->sound_playback_rate); + section = "Sound"; + inbool("MuteSound", mute_sound); + inbool("MuteSoundDuringTurbo", mute_sound_turbo); + inint("BufferSize", sound_buffer_size); + inint("Driver", sound_driver); + inint("InputRate", sound_input_rate); + inbool("DynamicRateControl", Settings.DynamicRateControl); + inint("DynamicRateControlLimit", Settings.DynamicRateLimit); + inbool("AutomaticInputRate", auto_input_rate); + inint("PlaybackRate", gui_config->sound_playback_rate); -#undef z -#define z "Files::" - instr (z"LastDirectory", last_directory); - instr (z"LastShaderDirectory", last_shader_directory); - instr (z"SRAMDirectory", sram_directory); - instr (z"SaveStateDirectory", savestate_directory); - instr (z"CheatDirectory", cheat_directory); - instr (z"PatchDirectory", patch_directory); - instr (z"ExportDirectory", export_directory); + section = "Files"; + instr("LastDirectory", last_directory); + instr("LastShaderDirectory", last_shader_directory); + instr("SRAMDirectory", sram_directory); + instr("SaveStateDirectory", savestate_directory); + instr("CheatDirectory", cheat_directory); + instr("PatchDirectory", patch_directory); + instr("ExportDirectory", export_directory); -#undef z -#define z "Window State::" + section = "Window State"; + inint("MainWidth", window_width); + inint("MainHeight", window_height); + inint("PreferencesWidth", preferences_width); + inint("PreferencesHeight", preferences_height); + inint("ShaderParametersWidth", shader_parameters_width); + inint("ShaderParametersHeight", shader_parameters_height); + inint("CurrentDisplayTab", current_display_tab); + inbool("UIVisible", ui_visible); + inbool("Fullscreen", fullscreen); + inbool("EnableIcons", enable_icons); - inint (z"MainWidth", window_width); - inint (z"MainHeight", window_height); - inint (z"PreferencesWidth", preferences_width); - inint (z"PreferencesHeight", preferences_height); - inint (z"ShaderParametersWidth", shader_parameters_width); - inint (z"ShaderParametersHeight", shader_parameters_height); - inint (z"CurrentDisplayTab", current_display_tab); - inbool (z"UIVisible", ui_visible); - inbool (z"Fullscreen", fullscreen); - inbool (z"EnableIcons", enable_icons); + section = "Netplay"; + inbool("ActAsServer", netplay_is_server); + inbool("UseResetToSync", netplay_sync_reset); + inbool("SendROM", netplay_send_rom); + inint("DefaultPort", netplay_default_port); + inint("MaxFrameLoss", netplay_max_frame_loss); + inint("LastUsedPort", netplay_last_port); + instr("LastUsedROM", netplay_last_rom); + instr("LastUsedHost", netplay_last_host); -#undef z -#define z "Netplay::" - inbool (z"ActAsServer", netplay_is_server); - inbool (z"UseResetToSync", netplay_sync_reset); - inbool (z"SendROM", netplay_send_rom); - inint (z"DefaultPort", netplay_default_port); - inint (z"MaxFrameLoss", netplay_max_frame_loss); - inint (z"LastUsedPort", netplay_last_port); - instr (z"LastUsedROM", netplay_last_rom); - instr (z"LastUsedHost", netplay_last_host); + section = "Behavior"; + inbool("PauseEmulationWhenFocusLost", pause_emulation_on_switch); + inint("DefaultESCKeyBehavior", default_esc_behavior); + inbool("PreventScreensaver", prevent_screensaver); + inbool("UseModalDialogs", modal_dialogs); + inint("RewindBufferSize", rewind_buffer_size); + inint("RewindGranularity", rewind_granularity); + inint("CurrentSaveSlot", current_save_slot); -#undef z -#define z "Behavior::" - inbool (z"PauseEmulationWhenFocusLost", pause_emulation_on_switch); - inint (z"DefaultESCKeyBehavior", default_esc_behavior); - inbool (z"PreventScreensaver", prevent_screensaver); - inbool (z"UseModalDialogs", modal_dialogs); - inint (z"RewindBufferSize", rewind_buffer_size); - inint (z"RewindGranularity", rewind_granularity); - inint (z"CurrentSaveSlot", current_save_slot); + section = "Emulation"; + inbool("EmulateTransparency", Settings.Transparency); + inbool("DisplayTime", Settings.DisplayTime); + inbool("DisplayFrameRate", Settings.DisplayFrameRate); + inbool("DisplayPressedKeys", Settings.DisplayPressedKeys); + inint("SpeedControlMethod", Settings.SkipFrames); + inint("SaveSRAMEveryNSeconds", Settings.AutoSaveDelay); + inbool("BlockInvalidVRAMAccess", Settings.BlockInvalidVRAMAccessMaster); + inbool("AllowDPadContradictions", Settings.UpAndDown); -#undef z -#define z "Emulation::" - inbool (z"EmulateTransparency", Settings.Transparency); - inbool (z"DisplayTime", Settings.DisplayTime); - inbool (z"DisplayFrameRate", Settings.DisplayFrameRate); - inbool (z"DisplayPressedKeys", Settings.DisplayPressedKeys); - inint (z"SpeedControlMethod", Settings.SkipFrames); - inint (z"SaveSRAMEveryNSeconds", Settings.AutoSaveDelay); - inbool (z"BlockInvalidVRAMAccess", Settings.BlockInvalidVRAMAccessMaster); - inbool (z"AllowDPadContradictions", Settings.UpAndDown); - -#undef z -#define z "Hacks::" - inint (z"SuperFXClockMultiplier", Settings.SuperFXClockMultiplier); - inint (z"SoundInterpolationMethod", Settings.InterpolationMethod); + section = "Hacks"; + inint("SuperFXClockMultiplier", Settings.SuperFXClockMultiplier); + inint("SoundInterpolationMethod", Settings.InterpolationMethod); bool RemoveSpriteLimit = false; - inbool (z"RemoveSpriteLimit", RemoveSpriteLimit); + inbool("RemoveSpriteLimit", RemoveSpriteLimit); bool OverclockCPU = false; - inbool (z"OverclockCPU", OverclockCPU); - inbool (z"EchoBufferHack", Settings.SeparateEchoBuffer); + inbool("OverclockCPU", OverclockCPU); + inbool("EchoBufferHack", Settings.SeparateEchoBuffer); -#undef z -#define z "Input::" + section = "Input"; for (int i = 0; i < 2; i++) { - snprintf (key, PATH_MAX, z"ControllerPort%d", i); - std::string tmp = cf.GetString (key, ""); + std::string name = "ControllerPort" + std::to_string(i); + std::string value; + instr(name, value); - if (tmp.find ("joypad") != std::string::npos) - S9xSetController (i, CTL_JOYPAD, i, 0, 0, 0); - else if (tmp.find ("multitap") != std::string::npos) - S9xSetController (i, CTL_MP5, i, i + 1, i + 2, i + 3); - else if (tmp.find ("superscope") != std::string::npos) - S9xSetController (i, CTL_SUPERSCOPE, 0, 0, 0, 0); - else if (tmp.find ("mouse") != std::string::npos) - S9xSetController (i, CTL_MOUSE, i, 0, 0, 0); - else if (tmp.find ("none") != std::string::npos) - S9xSetController (i, CTL_NONE, 0, 0, 0, 0); + if (value.find("joypad") != std::string::npos) + S9xSetController(i, CTL_JOYPAD, i, 0, 0, 0); + else if (value.find("multitap") != std::string::npos) + S9xSetController(i, CTL_MP5, i, i + 1, i + 2, i + 3); + else if (value.find("superscope") != std::string::npos) + S9xSetController(i, CTL_SUPERSCOPE, 0, 0, 0, 0); + else if (value.find("mouse") != std::string::npos) + S9xSetController(i, CTL_MOUSE, i, 0, 0, 0); + else if (value.find("none") != std::string::npos) + S9xSetController(i, CTL_NONE, 0, 0, 0, 0); } - inint (z"JoystickThreshold", joystick_threshold); - -#undef z + inint("JoystickThreshold", joystick_threshold); std::string buffer; - for (int i = 0; i < NUM_JOYPADS; i++) { auto &joypad = pad[i]; + section = "Joypad " + std::to_string(i); for (int j = 0; j < NUM_JOYPAD_LINKS; j++) { - snprintf (key, PATH_MAX, "Joypad %d::%s", i, b_links[j].snes9x_name); - instr (key, buffer); - joypad.data[j] = Binding (buffer.c_str ()); + instr(b_links[j].snes9x_name, buffer); + joypad.data[j] = Binding(buffer.c_str()); } } + section = "Shortcuts"; for (int i = NUM_JOYPAD_LINKS; b_links[i].snes9x_name; i++) { - snprintf (key, PATH_MAX, "Shortcuts::%s", b_links[i].snes9x_name); - instr (key, buffer); - shortcut[i - NUM_JOYPAD_LINKS] = Binding (buffer.c_str ()); + instr(b_links[i].snes9x_name, buffer); + shortcut[i - NUM_JOYPAD_LINKS] = Binding(buffer.c_str()); } /* Validation */ @@ -662,13 +651,13 @@ int Snes9xConfig::load_config_file () } #ifndef ALLOW_CPU_OVERCLOCK - Settings.OneClockCycle = 6; - Settings.OneSlowClockCycle = 8; - Settings.TwoClockCycles = 12; - Settings.MaxSpriteTilesPerLine = 34; - Settings.SeparateEchoBuffer = false; - Settings.InterpolationMethod = 2; - Settings.BlockInvalidVRAMAccessMaster = true; + Settings.OneClockCycle = 6; + Settings.OneSlowClockCycle = 8; + Settings.TwoClockCycles = 12; + Settings.MaxSpriteTilesPerLine = 34; + Settings.SeparateEchoBuffer = false; + Settings.InterpolationMethod = 2; + Settings.BlockInvalidVRAMAccessMaster = true; #endif if (default_esc_behavior != ESC_TOGGLE_MENUBAR) @@ -700,11 +689,11 @@ int Snes9xConfig::load_config_file () else Settings.SoundSync = false; - hires_effect = CLAMP (hires_effect, 0, 2); - Settings.DynamicRateLimit = CLAMP (Settings.DynamicRateLimit, 1, 1000); - Settings.SuperFXClockMultiplier = CLAMP (Settings.SuperFXClockMultiplier, 50, 400); - ntsc_scanline_intensity = MIN (ntsc_scanline_intensity, 4); - scanline_filter_intensity = MIN (scanline_filter_intensity, 3); + hires_effect = CLAMP(hires_effect, 0, 2); + Settings.DynamicRateLimit = CLAMP(Settings.DynamicRateLimit, 1, 1000); + Settings.SuperFXClockMultiplier = CLAMP(Settings.SuperFXClockMultiplier, 50, 400); + ntsc_scanline_intensity = MIN(ntsc_scanline_intensity, 4); + scanline_filter_intensity = MIN(scanline_filter_intensity, 3); return 0; } diff --git a/gtk/src/gtk_file.cpp b/gtk/src/gtk_file.cpp index ed92ccd0..b0e34e98 100644 --- a/gtk/src/gtk_file.cpp +++ b/gtk/src/gtk_file.cpp @@ -140,28 +140,28 @@ S9xGetDirectory (enum s9x_getdirtype dirtype) switch (dirtype) { case HOME_DIR: - snprintf(path, PATH_MAX + 1, get_config_dir().c_str()); + snprintf(path, PATH_MAX + 1, "%s", get_config_dir().c_str()); break; case SNAPSHOT_DIR: - snprintf(path, PATH_MAX + 1, gui_config->savestate_directory.c_str()); + snprintf(path, PATH_MAX + 1, "%s", gui_config->savestate_directory.c_str()); break; case PATCH_DIR: - snprintf(path, PATH_MAX + 1, gui_config->patch_directory.c_str()); + snprintf(path, PATH_MAX + 1, "%s", gui_config->patch_directory.c_str()); break; case CHEAT_DIR: - snprintf(path, PATH_MAX + 1, gui_config->cheat_directory.c_str()); + snprintf(path, PATH_MAX + 1, "%s", gui_config->cheat_directory.c_str()); break; case SRAM_DIR: - snprintf(path, PATH_MAX + 1, gui_config->sram_directory.c_str()); + snprintf(path, PATH_MAX + 1, "%s", gui_config->sram_directory.c_str()); break; case SCREENSHOT_DIR: case SPC_DIR: - snprintf(path, PATH_MAX + 1, gui_config->export_directory.c_str()); + snprintf(path, PATH_MAX + 1, "%s", gui_config->export_directory.c_str()); break; default: @@ -249,7 +249,7 @@ S9xBasenameNoExt (const char *f) ext = strrchr (f, '.'); if (!ext) - snprintf (filename, PATH_MAX, base); + snprintf (filename, PATH_MAX, "%s", base); else { int len = ext - base; @@ -288,7 +288,7 @@ S9xOpenSnapshotFile (const char *fname, bool8 read_only, STREAM *file) if (*drive || *dir == '/' || (*dir == '.' && (*(dir + 1) == '/'))) { - snprintf (filename, PATH_MAX + 1, fname); + snprintf (filename, PATH_MAX + 1, "%s", fname); if (!file_exists (filename)) {