diff --git a/external/imgui/snes9x_imgui.cpp b/external/imgui/snes9x_imgui.cpp index 1b617cff..590bd2c5 100644 --- a/external/imgui/snes9x_imgui.cpp +++ b/external/imgui/snes9x_imgui.cpp @@ -67,7 +67,7 @@ static void ImGui_DrawPressedKeys(int spacing) draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + box_width, y + box_height), settings.box_color, - 3.0f); + spacing / 2); draw_list->AddText(ImVec2(x + spacing, y + spacing), settings.text_color, string); @@ -85,7 +85,7 @@ static void ImGui_DrawPressedKeys(int spacing) draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + box_width, y + box_height), settings.box_color, - spacing / 3); + spacing / 2); x += spacing; y += spacing; @@ -132,12 +132,15 @@ static void ImGui_DrawTextOverlay(const char *text, draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + box_size.x, y + box_size.y), settings.box_color, - settings.spacing / 3); + settings.spacing / 2); draw_list->AddText(ImVec2(x + padding, y + padding), settings.text_color, text); } bool S9xImGuiDraw(int width, int height) { + if (Memory.ROMFilename.empty()) + return false; + if (!ImGui::GetCurrentContext()) return false; @@ -147,15 +150,6 @@ bool S9xImGuiDraw(int width, int height) ImGui::GetIO().DisplayFramebufferScale.y = 1.0; ImGui::NewFrame(); - if (!GFX.InfoString.empty()) - ImGui_DrawTextOverlay(GFX.InfoString.c_str(), - settings.spacing, - height - settings.spacing, - settings.spacing, - ImGui::DrawTextAlignment::BEGIN, - ImGui::DrawTextAlignment::END, - width - settings.spacing * 4); - if (Settings.DisplayTime) { char string[256]; @@ -206,20 +200,32 @@ bool S9xImGuiDraw(int width, int height) ImGui_DrawPressedKeys(settings.spacing / 2); } - if (Settings.Paused || Settings.ForcedPause) + if (Settings.DisplayIndicators) { - ImGui_DrawTextOverlay("❚❚", - settings.spacing, - settings.spacing, - settings.spacing); + if (Settings.Paused || Settings.ForcedPause) + { + ImGui_DrawTextOverlay("❚❚", + settings.spacing, + settings.spacing, + settings.spacing); + } + else if (Settings.TurboMode) + { + ImGui_DrawTextOverlay("▶▶", + settings.spacing, + settings.spacing, + settings.spacing); + } } - else if (Settings.TurboMode) - { - ImGui_DrawTextOverlay("▶▶", + + if (!GFX.InfoString.empty()) + ImGui_DrawTextOverlay(GFX.InfoString.c_str(), settings.spacing, + height - settings.spacing, settings.spacing, - settings.spacing); - } + ImGui::DrawTextAlignment::BEGIN, + ImGui::DrawTextAlignment::END, + width - settings.spacing * 4); ImGui::Render(); diff --git a/gtk/src/gtk_config.cpp b/gtk/src/gtk_config.cpp index d3b0b124..1f03795d 100644 --- a/gtk/src/gtk_config.cpp +++ b/gtk/src/gtk_config.cpp @@ -96,6 +96,7 @@ int Snes9xConfig::load_defaults() allow_xv = false; allow_xrandr = false; auto_vrr = false; + osd_size = 24; force_inverted_byte_order = false; hires_effect = HIRES_NORMAL; pause_emulation_on_switch = false; @@ -165,6 +166,7 @@ int Snes9xConfig::load_defaults() Settings.Transparency = true; Settings.DisplayTime = false; Settings.DisplayFrameRate = false; + Settings.DisplayIndicators = false; Settings.SixteenBitSound = true; Settings.Stereo = true; Settings.ReverseStereo = false; @@ -236,6 +238,7 @@ int Snes9xConfig::save_config_file() outstring("HardwareAcceleration", display_driver, "none, opengl, xv, vulkan"); outint("SplashBackground", splash_image, "0: Black, 1: Color bars, 2: Pattern, 3: Blue, 4: Default"); outbool("AutoVRR", auto_vrr, "Automatically use the best settings for variable sync in fullscreen mode"); + outint("OSDSize", osd_size, "Size of on-screen display elements. Default: 24pt"); section = "NTSC"; outstring("Hue", std::to_string(ntsc_setup.hue)); @@ -316,6 +319,7 @@ int Snes9xConfig::save_config_file() outbool("DisplayTime", Settings.DisplayTime); outbool("DisplayFrameRate", Settings.DisplayFrameRate); outbool("DisplayPressedKeys", Settings.DisplayPressedKeys); + outbool("DisplayIndicators", Settings.DisplayIndicators); 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); @@ -460,6 +464,7 @@ int Snes9xConfig::load_config_file() inbool("BilinearFilter", Settings.BilinearFilter); inint("SplashBackground", splash_image); inbool("AutoVRR", auto_vrr); + inint("OSDSize", osd_size); section = "NTSC"; indouble("Hue", ntsc_setup.hue); @@ -541,6 +546,7 @@ int Snes9xConfig::load_config_file() inint("SaveSRAMEveryNSeconds", Settings.AutoSaveDelay); inbool("BlockInvalidVRAMAccess", Settings.BlockInvalidVRAMAccessMaster); inbool("AllowDPadContradictions", Settings.UpAndDown); + inbool("DisplayIndicators", Settings.DisplayIndicators); section = "Hacks"; inint("SuperFXClockMultiplier", Settings.SuperFXClockMultiplier); diff --git a/gtk/src/gtk_config.h b/gtk/src/gtk_config.h index 031dbc8f..a20ca982 100644 --- a/gtk/src/gtk_config.h +++ b/gtk/src/gtk_config.h @@ -72,6 +72,7 @@ class Snes9xConfig bool force_inverted_byte_order; int splash_image; bool auto_vrr; + int osd_size; snes_ntsc_setup_t ntsc_setup; int ntsc_format; diff --git a/gtk/src/gtk_display_driver_opengl.cpp b/gtk/src/gtk_display_driver_opengl.cpp index 1678feb6..c98674d3 100644 --- a/gtk/src/gtk_display_driver_opengl.cpp +++ b/gtk/src/gtk_display_driver_opengl.cpp @@ -407,7 +407,10 @@ int S9xOpenGLDisplayDriver::init() if (version >= 33) { - S9xImGuiInit(); + auto defaults = S9xImGuiGetDefaults(); + defaults.font_size = gui_config->osd_size; + defaults.spacing = defaults.font_size / 2.4; + S9xImGuiInit(&defaults); ImGui_ImplOpenGL3_Init(); } diff --git a/gtk/src/gtk_display_driver_vulkan.cpp b/gtk/src/gtk_display_driver_vulkan.cpp index cdae88b6..64220b8a 100644 --- a/gtk/src/gtk_display_driver_vulkan.cpp +++ b/gtk/src/gtk_display_driver_vulkan.cpp @@ -31,7 +31,10 @@ S9xVulkanDisplayDriver::~S9xVulkanDisplayDriver() bool S9xVulkanDisplayDriver::init_imgui() { - S9xImGuiInit(); + auto defaults = S9xImGuiGetDefaults(); + defaults.font_size = gui_config->osd_size; + defaults.spacing = defaults.font_size / 2.4; + S9xImGuiInit(&defaults); ImGui_ImplVulkan_LoadFunctions([](const char *function, void *instance) { return VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr(*((VkInstance *)instance), function); diff --git a/gtk/src/gtk_preferences.cpp b/gtk/src/gtk_preferences.cpp index be41178f..3f566c2c 100644 --- a/gtk/src/gtk_preferences.cpp +++ b/gtk/src/gtk_preferences.cpp @@ -394,6 +394,8 @@ void Snes9xPreferences::move_settings_to_dialog() set_check("show_time", Settings.DisplayTime); set_check("show_frame_rate", Settings.DisplayFrameRate); set_check("show_pressed_keys", Settings.DisplayPressedKeys); + set_check("show_indicators", Settings.DisplayIndicators); + set_spin("osd_size", config->osd_size); set_check("change_display_resolution", config->change_display_resolution); set_check("scale_to_fit", config->scale_to_fit); set_check("overscan", config->overscan); @@ -554,6 +556,10 @@ void Snes9xPreferences::get_settings_from_dialog() if (config->force_inverted_byte_order != get_check("force_inverted_byte_order")) gfx_needs_restart = true; + if (config->osd_size != get_spin("osd_size")) + gfx_needs_restart = true; + + config->enable_icons = get_check("force_enable_icons"); auto settings = Gtk::Settings::get_default(); settings->set_property("gtk-menu-images", gui_config->enable_icons); @@ -563,6 +569,8 @@ void Snes9xPreferences::get_settings_from_dialog() Settings.DisplayTime = get_check("show_time"); Settings.DisplayFrameRate = get_check("show_frame_rate"); Settings.DisplayPressedKeys = get_check("show_pressed_keys"); + Settings.DisplayIndicators = get_check("show_indicators"); + config->osd_size = get_spin("osd_size"); config->scale_to_fit = get_check("scale_to_fit"); config->overscan = get_check("overscan"); config->maintain_aspect_ratio = get_check("maintain_aspect_ratio"); diff --git a/gtk/src/snes9x.ui b/gtk/src/snes9x.ui index f2896492..08e811ee 100644 --- a/gtk/src/snes9x.ui +++ b/gtk/src/snes9x.ui @@ -209,6 +209,13 @@ 1 1 + + 12 + 128 + 24 + 1 + 1 + 1 100 @@ -2866,6 +2873,21 @@ 3 + + + Show fast-forward and pause indicators + True + True + False + True + True + + + False + False + 4 + + Use overscanned height @@ -2879,9 +2901,56 @@ False False - 4 + 5 + + + + + True + False + 12 + + + + True + False + On-screen display size: + + + False + False + + + + + True + True + Connect to specified TCP port on remote computer + False + False + True + True + osd_size_adjustment + True + 6 + True + + + False + False + + + + + False + False + 7 + + + + True @@ -2925,9 +2994,11 @@ False False - 5 + 6 + + diff --git a/snes9x.h b/snes9x.h index 502dbf98..df305469 100644 --- a/snes9x.h +++ b/snes9x.h @@ -254,6 +254,7 @@ struct SSettings bool8 DisplayWatchedAddresses; bool8 DisplayPressedKeys; bool8 DisplayMovieFrame; + bool DisplayIndicators; bool8 AutoDisplayMessages; uint32 InitialInfoStringTimeout; uint16 DisplayColor;