[gens-sdl] EmuLoop: Show the ROM name in the window title.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Tue, 8 Sep 2015 04:48:31 +0000 (00:48 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Tue, 8 Sep 2015 04:48:31 +0000 (00:48 -0400)
updateRomName() gets the ROM names from the EmuContext and, depending
on region codes, sets the window title to the appropriate ROM name.

EventLoop: New function updateWindowTitle(). This sets the window title,
sans paused and fps indicators. It's used by EmuLoop's updateRomName()
function to set the window title to the ROM name.

FIXME: On my XP VM, there's a slight pause while loading where it shows
"Gens/GS II [SDL]", then it gets changed to the ROM name.

src/gens-sdl/EmuLoop.cpp
src/gens-sdl/EventLoop.cpp
src/gens-sdl/EventLoop_p.hpp

index 99651c9..aec604b 100644 (file)
@@ -108,7 +108,7 @@ class EmuLoopPrivate : public EventLoopPrivate
                 * @param zomg Save file.
                 * @return String contianing the mtime, or an error message if invalid.
                 */
-               static std::string getSaveSlot_mtime(const LibZomg::ZomgBase *zomg);
+               static string getSaveSlot_mtime(const LibZomg::ZomgBase *zomg);
 
                /**
                 * Save slot selection.
@@ -135,6 +135,11 @@ class EmuLoopPrivate : public EventLoopPrivate
                 * Take a screenshot.
                 */
                void doScreenShot(void);
+
+               /**
+                * Update the window title using the ROM name.
+                */
+               void updateRomName(void);
 };
 
 /** EmuLoopPrivate **/
@@ -388,6 +393,44 @@ void EmuLoopPrivate::doScreenShot(void)
        }
 }
 
+/**
+ * Update the window title using the ROM name.
+ */
+void EmuLoopPrivate::updateRomName(void)
+{
+       string romName;
+
+       if (emuContext->versionRegisterObject()->isEast()) {
+               // East (JP). Use the domestic ROM name.
+               romName = rom->romNameJP();
+               if (romName.empty()) {
+                       // Domestic ROM name is empty.
+                       // Use the overseas ROM name.
+                       romName = rom->romNameUS();
+               }
+       } else {
+               // West (US/EU). Use the overseas ROM name.
+               romName = rom->romNameUS();
+               if (romName.empty()) {
+                       // Overseas ROM name is empty.
+                       // Use the domestic ROM name.
+                       romName = rom->romNameJP();
+               }
+       }
+
+       if (romName.empty()) {
+               // ROM name is empty.
+               // This might be an unlicensed and/or pirated ROM.
+
+               // Use the ROM filename, without extensions.
+               // TODO: Also the z_filename?
+               romName = rom->filename_baseNoExt();
+       }
+
+       // Set the window title to the ROM's name.
+       updateWindowTitle(romName.c_str());
+}
+
 /** EmuLoop **/
 
 EmuLoop::EmuLoop()
@@ -577,9 +620,6 @@ int EmuLoop::run(const char *rom_filename)
                return EXIT_FAILURE;
        d->vBackend = d->sdlHandler->vBackend();
 
-       // Set the window title.
-       d->sdlHandler->set_window_title("Gens/GS II [SDL]");
-
        // Check for startup messages.
        checkForStartupMessages();
 
@@ -588,6 +628,12 @@ int EmuLoop::run(const char *rom_filename)
        bool isPal = false;
        d->setFrameTiming(isPal ? 50 : 60);
 
+       // Update the ROM name and the window title.
+       // FIXME: On my XP VM, there's a slight pause while
+       // loading where it shows "Gens/GS II [SDL]", then
+       // it gets changed to the ROM name.
+       d->updateRomName();
+
        // TODO: Close the ROM, or let EmuContext do it?
 
        // Set the color depth.
index 01fb059..6b51f01 100644 (file)
@@ -58,6 +58,7 @@ EventLoopPrivate::EventLoopPrivate()
        , exposed(false)
        , lastF1time(0)
        , usec_per_frame(0)
+       , win_title("Gens/GS II [SDL]")
 {
        paused.data = 0;
 
@@ -104,11 +105,7 @@ void EventLoopPrivate::doPauseProcessing(void)
        sdlHandler->pause_audio(any);
 
        // Update the window title.
-       if (manual) {
-               sdlHandler->set_window_title("Gens/GS II [SDL] [Paused]");
-       } else {
-               sdlHandler->set_window_title("Gens/GS II [SDL]");
-       }
+       updateWindowTitle();
 }
 
 /**
@@ -178,6 +175,43 @@ void EventLoopPrivate::setFrameTiming(int framerate)
        clks.reset();
 }
 
+/**
+ * Update the window title.
+ * Call this function if the name doesn't
+ * need to be changed, but the state does.
+ */
+void EventLoopPrivate::updateWindowTitle(void)
+{
+       char title[512];
+
+       // If the emulator is paused manually,
+       // prefix the window title.
+       const char *paused_prefix = (paused.manual ? "[Paused] " : "");
+
+       if (clks.fps > 0) {
+               snprintf(title, sizeof(title), "%s%s (%u fps)",
+                        paused_prefix,
+                        this->win_title.c_str(),
+                        clks.fps);
+       } else {
+               snprintf(title, sizeof(title), "%s%s",
+                        paused_prefix,
+                        this->win_title.c_str());
+       }
+
+       sdlHandler->set_window_title(title);
+}
+
+/**
+ * Update the window title.
+ * @param win_title New window title.
+ */
+void EventLoopPrivate::updateWindowTitle(const char *win_title)
+{
+       this->win_title = string(win_title);
+       updateWindowTitle();
+}
+
 /** EventLoop **/
 
 EventLoop::EventLoop(EventLoopPrivate *d)
@@ -380,12 +414,12 @@ void EventLoop::runFrame(void)
                }
                d_ptr->clks.frames_old = d_ptr->clks.frames;
 
-               // Update the window title.
                // TODO: Average the FPS over multiple seconds
                // and/or quarter-seconds.
-               char win_title[256];
-               snprintf(win_title, sizeof(win_title), "Gens/GS II [SDL] - %u fps", d_ptr->clks.fps);
-               d_ptr->sdlHandler->set_window_title(win_title);
+               // TODO: FPS manager and OSD FPS.
+
+               // Update the window title.
+               d_ptr->updateWindowTitle();
        }
 
        // Frameskip.
index 285ac46..635d491 100644 (file)
@@ -47,6 +47,9 @@
 
 #include "libgens/Util/Timing.hpp"
 
+// C++ includes.
+#include <string>
+
 namespace GensSdl {
 
 class SdlHandler;
@@ -171,6 +174,26 @@ class EventLoopPrivate
                 * @param framerate Frame rate, e.g. 50 or 60.
                 */
                void setFrameTiming(int framerate);
+
+       private:
+               // Window title.
+               // Usually the ROM's name.
+               // Does not include modifiers like "[Paused]".
+               std::string win_title;
+
+       public:
+               /**
+                * Update the window title.
+                * Call this function if the name doesn't
+                * need to be changed, but the state does.
+                */
+               void updateWindowTitle(void);
+
+               /**
+                * Update the window title.
+                * @param win_title New window title.
+                */
+               void updateWindowTitle(const char *win_title);
 };
 
 }