From f2f8e4310736306e356c9e07443bd6da6d3a6b61 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 14 Apr 2025 21:22:02 +0100 Subject: [PATCH 01/91] Add RETROFE_WC_BRANCH to versioning --- RetroFE/CMake/Versioning.cmake | 18 ++++++++++++++++-- RetroFE/Source/Main.cpp | 6 +++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/RetroFE/CMake/Versioning.cmake b/RetroFE/CMake/Versioning.cmake index f978f280e..5514074ef 100644 --- a/RetroFE/CMake/Versioning.cmake +++ b/RetroFE/CMake/Versioning.cmake @@ -17,20 +17,33 @@ if(GIT_FOUND) OUTPUT_VARIABLE GIT_SHORT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) + + # Get the Git branch name + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE RETROFE_WC_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) endif() string(TIMESTAMP RETROFE_BUILD_DATE "%Y-%m-%d" UTC) # version number set(RETROFE_VERSION_MAJOR "2504") -set(RETROFE_VERSION_MINOR "0") set(RETROFE_VERSION_PATCH ${GIT_SHORT_HASH}) set(RETROFE_VERSION_GITNO ${GIT_COMMIT_NO}) +# If RETROFE_WC_BRANCH is master +if(RETROFE_WC_BRANCH STREQUAL "master") + set(RETROFE_WC_BRANCH "") +endif() + # If RetroFE is not built from a repo, default the version info -if(NOT GIT_SHORT_HASH OR NOT GIT_COMMIT_NO ) +if(NOT GIT_FOUND) set(RETROFE_VERSION_PATCH 0) set(RETROFE_VERSION_GITNO "0") + set(RETROFE_WC_BRANCH "Outside Git") endif() set(RETROFE_VERSION_DESCRIBE "${RETROFE_VERSION_MAJOR}.${RETROFE_VERSION_MINOR}") @@ -44,5 +57,6 @@ file(APPEND ${VERSION_HEADER} "#define RETROFE_VERSION_MINOR \"${RETROFE_VERSION file(APPEND ${VERSION_HEADER} "#define RETROFE_VERSION_PATCH \"${RETROFE_VERSION_PATCH}\"\n") file(APPEND ${VERSION_HEADER} "#define RETROFE_VERSION_GITNO \"${RETROFE_VERSION_GITNO}\"\n") file(APPEND ${VERSION_HEADER} "#define RETROFE_VERSION_DESCRIBE \"${RETROFE_VERSION_DESCRIBE}\"\n") +file(APPEND ${VERSION_HEADER} "#define RETROFE_WC_BRANCH \"${RETROFE_WC_BRANCH}\"\n") file(APPEND ${VERSION_HEADER} "#define RETROFE_BUILD_DATE \"${RETROFE_BUILD_DATE}\"\n\n") file(APPEND ${VERSION_HEADER} "#endif // VERSIONING_H\n") diff --git a/RetroFE/Source/Main.cpp b/RetroFE/Source/Main.cpp index 8b4ad5422..114fc7d27 100644 --- a/RetroFE/Source/Main.cpp +++ b/RetroFE/Source/Main.cpp @@ -147,7 +147,7 @@ int main(int argc, char** argv) else if (param == "-version" || param == "--version" || param == "-v") { - std::cout << std::endl << "RetroFE Version " << RETROFE_VERSION_DESCRIBE << "-" << RETROFE_VERSION_PATCH << std::endl << std::flush; + std::cout << std::endl << "RetroFE Version " << RETROFE_VERSION_DESCRIBE << "-" << RETROFE_WC_BRANCH << RETROFE_VERSION_PATCH << std::endl << std::flush; sendEnterKey(); return 0; } @@ -277,7 +277,7 @@ int main(int argc, char** argv) // Display information about RetroFE std::cout << std::endl; std::cout << "Absolute Path: " << Configuration::absolutePath << std::endl; - std::cout << "RetroFE Version: " << RETROFE_VERSION_DESCRIBE << "-" << RETROFE_VERSION_PATCH << std::endl; + std::cout << "RetroFE Version: " << RETROFE_VERSION_DESCRIBE << "-" << RETROFE_WC_BRANCH << RETROFE_VERSION_PATCH << std::endl; std::cout << std::endl; std::cout << "RetroFE is a cross-platform desktop frontend designed for MAME cabinets and game centers, with a focus on simplicity and customization." << std::endl; std::cout << "Licensed under GNU General Public License, version 3 or later (GPLv3+)" << std::endl; @@ -397,7 +397,7 @@ static bool ImportConfiguration(Configuration* c) { } // log version - LOG_INFO("RetroFE", "Version: " << RETROFE_VERSION_DESCRIBE << "-" << RETROFE_VERSION_PATCH << " starting"); + LOG_INFO("RetroFE", "Version: " << RETROFE_VERSION_DESCRIBE << "-" << RETROFE_WC_BRANCH << RETROFE_VERSION_PATCH << " starting"); LOG_INFO("RetroFE", "Built: " << RETROFE_BUILD_DATE); #ifdef WIN32 From b09bf5c554aa57e901975dc720d943fc986f6fe2 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 14 Apr 2025 21:22:21 +0100 Subject: [PATCH 02/91] Bump version --- CHANGELOG.md | 4 ++++ RetroFE/CMake/Versioning.cmake | 1 + 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9a87f7ad..31e8eb4b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ in the format YYMM.X ### Changed ### Fixed +## [2504.1] - 2025-04-14 +### Added +- RetroFE version appended with branch name if not on master [@aidenjbass](https://github.com/aidenjbass) + ## [2504.0] - 2025-04-13 ### Added diff --git a/RetroFE/CMake/Versioning.cmake b/RetroFE/CMake/Versioning.cmake index 5514074ef..b16e9501d 100644 --- a/RetroFE/CMake/Versioning.cmake +++ b/RetroFE/CMake/Versioning.cmake @@ -31,6 +31,7 @@ string(TIMESTAMP RETROFE_BUILD_DATE "%Y-%m-%d" UTC) # version number set(RETROFE_VERSION_MAJOR "2504") +set(RETROFE_VERSION_MINOR "1") set(RETROFE_VERSION_PATCH ${GIT_SHORT_HASH}) set(RETROFE_VERSION_GITNO ${GIT_COMMIT_NO}) From cbf91dda2e21d9db6a03275fee860ffa85c8b2ac Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 21 Apr 2025 15:22:42 +0100 Subject: [PATCH 03/91] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e5c5df43f..77307d9e7 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,10 @@ It's licensed under the terms of the GNU General Public License, version 3 or la # Building for Windows # ### Install Requirements - winget install -e --id Microsoft.VisualStudio.2022.Community && - winget install -e --id Microsoft.WindowsSDK.10.0.26100 && - winget install -e --id Microsoft.DotNet.Framework.DeveloperPack_4 && - winget install -e --id Kitware.CMake && + winget install -e --id Microsoft.VisualStudio.2022.Community + winget install -e --id Microsoft.WindowsSDK.10.0.26100 + winget install -e --id Microsoft.DotNet.Framework.DeveloperPack_4 + winget install -e --id Kitware.CMake winget install -e --id Git.Git * Install gstreamer-runtime and gstreamer-devel to `c:/gstreamer(x86-64 bit)` (https://gstreamer.freedesktop.org/download/#windows) From 8be56bb404db792ba7f6f9d8d656f4cdb82b5bd4 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 21 Apr 2025 16:25:33 +0100 Subject: [PATCH 04/91] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 77307d9e7..8d2c61d31 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,9 @@ It's licensed under the terms of the GNU General Public License, version 3 or la winget install -e --id Kitware.CMake winget install -e --id Git.Git -* Install gstreamer-runtime and gstreamer-devel to `c:/gstreamer(x86-64 bit)` (https://gstreamer.freedesktop.org/download/#windows) +* Open the Visual Studio Installer, modify the install and add the "Desktop development with C++" package group + +* Install gstreamer-runtime and gstreamer-devel MSVC 64-bit complete (https://gstreamer.freedesktop.org/download/#windows) Python 3 - Optional - Read below @@ -81,7 +83,7 @@ Alternatively, manually install * CMake (https://cmake.org/download) * Git (https://git-scm.com/downloads/win) * Python 3 (https://www.python.org/downloads/windows) -* gstreamer-runtime and gstreamer-devel to `c:/gstreamer(x86-64 bit)` (https://gstreamer.freedesktop.org/download/#windows) +* gstreamer-runtime and gstreamer-devel MSVC 64-bit complete (https://gstreamer.freedesktop.org/download/#windows) ### Download and compile the source code Download the source code From ec6ad181ff1b26eedd2c1014cec61d9ed6a13e23 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Wed, 23 Apr 2025 15:22:46 +0100 Subject: [PATCH 05/91] Change build-.yml's to OS name --- .github/workflows/{build-appimage.yml => build-linux.yml} | 0 .github/workflows/{build-appbundle.yml => build-macos.yml} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{build-appimage.yml => build-linux.yml} (100%) rename .github/workflows/{build-appbundle.yml => build-macos.yml} (100%) diff --git a/.github/workflows/build-appimage.yml b/.github/workflows/build-linux.yml similarity index 100% rename from .github/workflows/build-appimage.yml rename to .github/workflows/build-linux.yml diff --git a/.github/workflows/build-appbundle.yml b/.github/workflows/build-macos.yml similarity index 100% rename from .github/workflows/build-appbundle.yml rename to .github/workflows/build-macos.yml From 19dde821920d1b42eb616367c22038de33d2f33a Mon Sep 17 00:00:00 2001 From: "Andre L." Date: Fri, 2 May 2025 15:40:08 -0400 Subject: [PATCH 06/91] ambient basics are working. All code currently in RetroFE class --- RetroFE/Source/Control/UserInput.h | 1 + RetroFE/Source/Database/GlobalOpts.h | 2 + RetroFE/Source/RetroFE.cpp | 70 +++++++++++++++++++++++++++- RetroFE/Source/RetroFE.h | 5 +- 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/RetroFE/Source/Control/UserInput.h b/RetroFE/Source/Control/UserInput.h index ec9f469c8..8df14b927 100644 --- a/RetroFE/Source/Control/UserInput.h +++ b/RetroFE/Source/Control/UserInput.h @@ -63,6 +63,7 @@ class UserInput KeyCodeAdminMode, KeyCodeHideItem, KeyCodeQuit, + KeyCodeAmbient, KeyCodeReboot, KeyCodeSaveFirstPlaylist, KeyCodeSkipForward, diff --git a/RetroFE/Source/Database/GlobalOpts.h b/RetroFE/Source/Database/GlobalOpts.h index a937786a7..e34b8bb20 100644 --- a/RetroFE/Source/Database/GlobalOpts.h +++ b/RetroFE/Source/Database/GlobalOpts.h @@ -116,6 +116,7 @@ #define OPTION_PLAYLISTINPUTCLEAR "playlistInputClear" #define OPTION_JUMPINPUTCLEAR "jumpInputClear" #define OPTION_CONTROLLERCOMBOEXIT "controllerComboExit" +#define OPTION_CONTROLLERCOMBOAMBIENT "controllerComboAmbient" #define OPTION_CONTROLLERCOMBOSETTINGS "controllerComboSettings" #define OPTION_SETTINGSCOLLECTIONPLAYLIST "settingsCollectionPlaylist" #define OPTION_SERVOSTIKENABLED "servoStikEnabled" @@ -244,6 +245,7 @@ class global_options bool playlistinputclear() { return bool_value(OPTION_PLAYLISTINPUTCLEAR); } bool jumpinputclear() { return bool_value(OPTION_JUMPINPUTCLEAR); } bool controllercomboexit() { return bool_value(OPTION_CONTROLLERCOMBOEXIT); } + bool controllercomboambient() { return bool_value(OPTION_CONTROLLERCOMBOAMBIENT); } bool controllercombosettings() { return bool_value(OPTION_CONTROLLERCOMBOSETTINGS); } const char* quicklistcollectionplaylist() { return value(OPTION_QUICKLISTCOLLECTIONPLAYLIST); } const char *settingscollectionplaylist() { return value(OPTION_SETTINGSCOLLECTIONPLAYLIST); } diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index 2ebf66cd1..afff002ea 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -190,6 +190,42 @@ int RetroFE::initialize(void* context) return 0; } +void RetroFE::ambientMode() +{ + LOG_INFO("RetroFE", "Launching Ambient Mode"); + std::string ambientImagePath = Utils::combinePath(Configuration::absolutePath, "ambient", "default.png"); + + // do some SDL stuff - renderer, surface, texture + SDL_Renderer* renderer = SDL::getRenderer(0); // Get the renderer for the first screen + SDL_Surface* surface = IMG_Load(ambientImagePath.c_str()); + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + + // present it + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, nullptr, nullptr); + SDL_RenderPresent(renderer); + + // Clean up + SDL_DestroyTexture(texture); + + // TODO: take care of second screen if it exists + + // Wait for user input to exit ambient mode. The normal event loop is blocked while we do this + // TODO: periodically rotate ambient images + input_.resetStates(); + SDL_Event e; + while (1) { + SDL_PollEvent(&e); + input_.update(e); + if (input_.keystate(UserInput::KeyCodeSelect)) + { + input_.resetStates(); + break; + } + } +} + // Launch a game/program void RetroFE::launchEnter() { @@ -2257,7 +2293,24 @@ bool RetroFE::run() running = false; } break; - } + case RETROFE_AMBIENT_REQUEST: + // First stage of entering ambient mode: stop the current page, which fades it out visually. + currentPage_->stop(); + state = RETROFE_AMBIENT; + break; + case RETROFE_AMBIENT: + // second stage of entering ambient mode: once the fade-out is complete, actually enter ambient mode. + if (currentPage_->isGraphicsIdle()) + { + currentPage_->setIsLaunched(true); + // we're going to the ambient function, and blocking until it returns + ambientMode(); + // ... and we're back! Restart the page, and continue normally + currentPage_->start(); + state = RETROFE_IDLE; + break; + } + } // Handle screen updates and attract mode if (running) @@ -2691,6 +2744,8 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page* page) attract_.reset(); bool controllerComboExit = false; config_.getProperty(OPTION_CONTROLLERCOMBOEXIT, controllerComboExit); + bool controllerComboAmbient = false; + config_.getProperty(OPTION_CONTROLLERCOMBOAMBIENT, controllerComboAmbient); if (controllerComboExit) { #ifdef WIN32 @@ -2698,6 +2753,13 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page* page) #endif return RETROFE_QUIT_REQUEST; } + else if (controllerComboAmbient) + { +#ifdef WIN32 + Utils::postMessage("MediaplayerHiddenWindow", 0x8001, 51, 0); +#endif + return RETROFE_AMBIENT_REQUEST; + } } // KeyCodeCycleCollection shared with KeyCodeQuitCombo1 and can missfire else if (!kioskLock_ && input_.lastKeyPressed(UserInput::KeyCodeCycleCollection)) @@ -3142,7 +3204,11 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page* page) } } } - + else if (input_.keystate(UserInput::KeyCodeAmbient)) + { + LOG_INFO("RetroFE", "Ambient mode initated via keypress"); + state = RETROFE_AMBIENT_REQUEST; + } // !kioskLock_ && else if (input_.keystate(UserInput::KeyCodeQuit)) { diff --git a/RetroFE/Source/RetroFE.h b/RetroFE/Source/RetroFE.h index 26929eed4..a3823dfe9 100644 --- a/RetroFE/Source/RetroFE.h +++ b/RetroFE/Source/RetroFE.h @@ -60,6 +60,7 @@ class RetroFE void allocateGraphicsMemory( ); void launchEnter( ); void launchExit( ); + void ambientMode( ); std::vector getPlaylistCycle(); bool getAttractModeCyclePlaylist(); MetadataDatabase* getMetaDb(); @@ -144,8 +145,10 @@ class RetroFE RETROFE_SCROLL_FORWARD, RETROFE_SCROLL_BACK, RETROFE_NEW, - RETROFE_QUIT_REQUEST, + RETROFE_QUIT_REQUEST, RETROFE_QUIT, + RETROFE_AMBIENT_REQUEST, + RETROFE_AMBIENT, RETROFE_SCROLL_PLAYLIST_FORWARD, RETROFE_SCROLL_PLAYLIST_BACK, }; From 8107797ff66bdd2d481dce22ad61e942dd75332d Mon Sep 17 00:00:00 2001 From: "Andre L." Date: Sun, 4 May 2025 21:44:49 -0400 Subject: [PATCH 07/91] Ambient mode working with the majority of functionality in its own class --- RetroFE/Source/CMakeLists.txt | 2 + RetroFE/Source/Database/GlobalOpts.cpp | 2 + RetroFE/Source/Database/GlobalOpts.h | 5 + RetroFE/Source/Execute/AmbientMode.cpp | 179 +++++++++++++++++++++++++ RetroFE/Source/Execute/AmbientMode.h | 32 +++++ RetroFE/Source/RetroFE.cpp | 64 +++------ RetroFE/Source/RetroFE.h | 1 - 7 files changed, 242 insertions(+), 43 deletions(-) create mode 100644 RetroFE/Source/Execute/AmbientMode.cpp create mode 100644 RetroFE/Source/Execute/AmbientMode.h diff --git a/RetroFE/Source/CMakeLists.txt b/RetroFE/Source/CMakeLists.txt index 9e24b0b99..513345a51 100644 --- a/RetroFE/Source/CMakeLists.txt +++ b/RetroFE/Source/CMakeLists.txt @@ -205,6 +205,7 @@ set(RETROFE_HEADERS "${RETROFE_DIR}/Source/Database/GlobalOpts.h" "${RETROFE_DIR}/Source/Database/HiScores.h" "${RETROFE_DIR}/Source/Execute/AttractMode.h" + "${RETROFE_DIR}/Source/Execute/AmbientMode.h" "${RETROFE_DIR}/Source/Execute/Launcher.h" "${RETROFE_DIR}/Source/Graphics/Animate/Tween.h" "${RETROFE_DIR}/Source/Graphics/Animate/TweenTypes.h" @@ -261,6 +262,7 @@ set(RETROFE_SOURCES "${RETROFE_DIR}/Source/Database/HiScores.cpp" "${RETROFE_DIR}/Source/Database/MetadataDatabase.cpp" "${RETROFE_DIR}/Source/Execute/AttractMode.cpp" + "${RETROFE_DIR}/Source/Execute/AmbientMode.cpp" "${RETROFE_DIR}/Source/Execute/Launcher.cpp" "${RETROFE_DIR}/Source/Graphics/Font.cpp" "${RETROFE_DIR}/Source/Graphics/FontCache.cpp" diff --git a/RetroFE/Source/Database/GlobalOpts.cpp b/RetroFE/Source/Database/GlobalOpts.cpp index d5e6d5f59..cb5ac1a4c 100644 --- a/RetroFE/Source/Database/GlobalOpts.cpp +++ b/RetroFE/Source/Database/GlobalOpts.cpp @@ -118,6 +118,8 @@ const global_options::options_entry global_options::s_option_entries[] = { OPTION_ATTRACTMODELAUNCHRUNTIME, "30", global_options::option_type::INTEGER, "If attractModeLaunch = true, the length of time a launched item will run" }, { OPTION_ATTRACTMODELAUNCHMINMAXSCROLLS, "3,5", global_options::option_type::MSTRING, "If attractModeLaunch = true, comma separated min and max number of scrolls before launch" }, + { OPTION_AMBIENTMODEMINUTESPERIMAGE, "30", global_options::option_type::INTEGER, "Number of minutes between changing images in ambient mode" }, + { nullptr, nullptr, global_options::option_type::HEADER, "INPUT OPTIONS" }, { OPTION_COLLECTIONINPUTCLEAR, "false", global_options::option_type::BOOLEAN, "Clear input queue on collection change" }, { OPTION_PLAYLISTINPUTCLEAR, "false", global_options::option_type::BOOLEAN, "Clear input queue on playlist change" }, diff --git a/RetroFE/Source/Database/GlobalOpts.h b/RetroFE/Source/Database/GlobalOpts.h index e34b8bb20..eeca20b41 100644 --- a/RetroFE/Source/Database/GlobalOpts.h +++ b/RetroFE/Source/Database/GlobalOpts.h @@ -111,6 +111,9 @@ #define OPTION_ATTRACTMODELAUNCHRUNTIME "attractModeLaunchRunTime" #define OPTION_ATTRACTMODELAUNCHMINMAXSCROLLS "attractModeLaunchMinMaxScrolls" +// AMBIENT MODE OPTIONS +#define OPTION_AMBIENTMODEMINUTESPERIMAGE "ambientModeMinutesPerImage" + // INPUT OPTIONS #define OPTION_COLLECTIONINPUTCLEAR "collectionInputClear" #define OPTION_PLAYLISTINPUTCLEAR "playlistInputClear" @@ -240,6 +243,8 @@ class global_options bool attractmodelaunch() { return bool_value(OPTION_ATTRACTMODELAUNCH); } int attractmodelaunchruntime() { return int_value(OPTION_ATTRACTMODELAUNCHRUNTIME); } int attractmodelaunchminmaxScrolls() { return int_value(OPTION_ATTRACTMODELAUNCHMINMAXSCROLLS); } + + int ambientmodechangeminutes() { return int_value(OPTION_AMBIENTMODEMINUTESPERIMAGE); } bool collectioninputclear() { return bool_value(OPTION_COLLECTIONINPUTCLEAR); } bool playlistinputclear() { return bool_value(OPTION_PLAYLISTINPUTCLEAR); } diff --git a/RetroFE/Source/Execute/AmbientMode.cpp b/RetroFE/Source/Execute/AmbientMode.cpp new file mode 100644 index 000000000..a9b7c0fb2 --- /dev/null +++ b/RetroFE/Source/Execute/AmbientMode.cpp @@ -0,0 +1,179 @@ +#include "AmbientMode.h" +/* +This is the main class for "Ambient Mode". + +## Why and What + +The intent of Ambient Mode is to allow your arcade cabinet to assume a low-key presence in a room. For example, in a living room setting, you might not +want the cabinet to be a focal point all the time. Ambient Mode allows the cabinet to recede to the background without powering it all the way off. + +When enabled: +* the "exit" controller combo button from the retrofe main menu will go to ambient mode instead of exiting retrofe. +* while in ambient mode, images from the "ambient" directory will be displayed on the main screen, and rotated periodically +* to exit ambient mode, the controller combo button OR the action button will return you to the main retrofe menu. + +## Configuration + +1) create a directory called "ambient" in the same directory as the RetroFE executable, and populate it with images. +If you have a 2nd monitor, you should have at least one image name ending with "_marquee.png" (or any other common image extenion) + +2) in settings.conf: + + controllerComboExit = false + controllerComboAmbient = true + ambientModeMinutesPerImage = 30 # OPTIONAL - how often to change to a new images. if left unspecified, default is 30 minutes + +## Marquee display + +If you have two monitors, the second monitor is assumed to be a marquee display. When a new image is displayed on the main screen, +the corresponding marquee image will be displayed if it exists, by looking for "*_marquee.ext". For example, if "sunset.png" is being displayed on +the main screen, the system will look for "sunset_marquee.png" to display on the marquee. +If no corresponding marquee image is found, a random marquee image is displayed instead. +*/ + +void AmbientMode::activate() { + + // set member variables + imageFiles_.clear(); + marqueeImageFiles_.clear(); + ambientPath_ = Utils::combinePath(basePath_, "ambient"); + LOG_INFO("AmbientMode", "Activating Ambient mode. Path for images is: " + ambientPath_); + + + // Ensure the directory exists + if (!std::filesystem::is_directory(ambientPath_)) { + LOG_ERROR("AmbientMode", "Ambient directory does not exist: " + ambientPath_); + return; + } + + // Get lists of image files and marquee image files into our member variables + populateImageFiles(ambientPath_); + LOG_INFO("AmbientMode", "There are " + std::to_string(imageFiles_.size()) + " images and " + std::to_string(marqueeImageFiles_.size()) + " marquee images in the ambient directory."); + + if (imageFiles_.empty()) { + LOG_ERROR("AmbientMode", "Ambient mode will not be launched, since there are no images for the main screen in " + ambientPath_); + return; + } + + // Shuffle the image files to randomize the order + auto rng = std::default_random_engine(std::random_device{}()); + std::shuffle(std::begin(imageFiles_), std::end(imageFiles_), rng); + + input_.resetStates(); + SDL_Event e; + auto lastChangeTime = std::chrono::steady_clock::now(); + int imageIndex = 0; + displayImages(imageIndex); + + // Main loop for ambient mode + while (true) { + auto currentTime = std::chrono::steady_clock::now(); + auto elapsedTime = std::chrono::duration_cast(currentTime - lastChangeTime); + if (elapsedTime.count() >= minutesPerImage_ * 60) { + // update images + imageIndex = (imageIndex + 1) % imageFiles_.size(); + displayImages(imageIndex); + lastChangeTime = currentTime; // Reset the timer + } + + // Check events to see if it's time to exit ambient mode + SDL_PollEvent(&e); + input_.update(e); + + if (input_.keystate(UserInput::KeyCodeSelect) || + (input_.keystate(UserInput::KeyCodeQuitCombo1) && input_.keystate(UserInput::KeyCodeQuitCombo2))) { + + input_.resetStates(); + break; // by breaking, we will exit the ambient mode loop, exit this function, and cease to block the main thread, thereby returning the user to retrofe. + } + // you can also move through the images with left or right. Honestly, more useful for testing than anything else. + if (input_.keystate(UserInput::KeyCodeRight) ) { + imageIndex = (imageIndex + 1) % imageFiles_.size(); + displayImages(imageIndex); + lastChangeTime = currentTime; // Reset the timer + input_.resetStates(); + } + if (input_.keystate(UserInput::KeyCodeLeft)) { + imageIndex = (imageIndex - 1) % imageFiles_.size(); + displayImages(imageIndex); + lastChangeTime = currentTime; // Reset the timer + input_.resetStates(); + } + + // little delay to avoid busy waiting + SDL_Delay(10); + } + +} + +// Takes care of displaying the images on both the main and marquee screens. +// The imageIndex refers to the index of an image in the imageFiles_ vector (the main screen). +void AmbientMode::displayImages(int imageIndex) { + // for the main screen, just display the image by index + std::string imageName = Utils::combinePath(ambientPath_, imageFiles_[imageIndex]); + display(imageName, 0); // Display on the first screen + + + // for the marquee screen, display the corresponding marquee image if available (by naming convention), + // otherwise display a random marquee image. + if (!marqueeImageFiles_.empty()) { + std::filesystem::path path(imageName); + std::string baseName = path.stem().string(); // Get the filename without extension + std::string extension = path.extension().string(); // Get the file extension + std::string marqueeImageName = baseName +"_marquee" + extension; + std::string marqueeImagePath = Utils::combinePath(ambientPath_, marqueeImageName); + + if (std::filesystem::exists(marqueeImagePath)) { + LOG_INFO("AmbientMode", "displaying corresponding marquee image: "+ marqueeImageName); + display(marqueeImageName, 1); // Display on the second screen + } else { + std::string randomMarqueeImage = marqueeImageFiles_[std::rand() % marqueeImageFiles_.size()]; + LOG_INFO("AmbientMode", "displaying random marquee image: "+ randomMarqueeImage); + display(randomMarqueeImage, 1); // Display on the second screen + } + } +} + + +// display a specific image (indentified by name only; it is assumed to be in the "ambient" directory) on the specified screen +void AmbientMode::display(std::string imageName, int screenNum) { + std::string imagePath = Utils::combinePath(ambientPath_, imageName); + + SDL_LockMutex(SDL::getMutex()); + SDL_Renderer* renderer = SDL::getRenderer(screenNum); + SDL_Surface* surface = IMG_Load(imagePath.c_str()); + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); + // Render the texture + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, nullptr, nullptr); + SDL_RenderPresent(renderer); + + SDL_UnlockMutex(SDL::getMutex()); +} + +void AmbientMode::populateImageFiles(std::string directoryPath) { + namespace fs = std::filesystem; + + // Supported image extensions + const std::vector imageExtensions = { ".png", ".jpg", ".jpeg", ".bmp", ".gif" }; + + // Iterate through the directory + for (const auto& entry : fs::directory_iterator(directoryPath)) { + if (entry.is_regular_file()) { + std::string extension = entry.path().extension().string(); + + // Check if the file has a supported image extension + if (std::find(imageExtensions.begin(), imageExtensions.end(), extension) != imageExtensions.end()) { + std::string filenameWithoutExtension = entry.path().stem().string(); // Get the filename without extension + std::string filenameWithExtension = entry.path().filename().string(); // Get the filename with extension + + // Check if the filename (without extension) ends with "marquee" + if (filenameWithoutExtension.size() >= 8 && filenameWithoutExtension.substr(filenameWithoutExtension.size() - 8) == "_marquee") { + marqueeImageFiles_.push_back(filenameWithExtension); + } else { + imageFiles_.push_back(filenameWithExtension); + } + } + } + } +} diff --git a/RetroFE/Source/Execute/AmbientMode.h b/RetroFE/Source/Execute/AmbientMode.h new file mode 100644 index 000000000..34baa46d4 --- /dev/null +++ b/RetroFE/Source/Execute/AmbientMode.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include "../SDL.h" +#include "SDL_image.h" +#include "../Utility/Log.h" +#include "../Utility/Utils.h" +#include "../Control/UserInput.h" + +class AmbientMode { +public: + AmbientMode(UserInput& input, const std::string& basePath, int minutesPerImage) + : input_(input), basePath_(basePath), minutesPerImage_(minutesPerImage) {} + + void activate(); + void display(std::string imageName, int screenNum); + void displayImages(int imageIndex); + +private: + void populateImageFiles(std::string directory); + UserInput& input_; + std::string basePath_; + std::string ambientPath_; + std::vector imageFiles_; + std::vector marqueeImageFiles_; + int minutesPerImage_; +}; \ No newline at end of file diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index afff002ea..c82243193 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -24,6 +24,7 @@ #include "Database/GlobalOpts.h" #include "Database/HiScores.h" #include "Execute/Launcher.h" +#include "Execute/AmbientMode.h" #include "Graphics/Component/ScrollingList.h" #include "Graphics/Page.h" #include "Graphics/PageBuilder.h" @@ -190,42 +191,6 @@ int RetroFE::initialize(void* context) return 0; } -void RetroFE::ambientMode() -{ - LOG_INFO("RetroFE", "Launching Ambient Mode"); - std::string ambientImagePath = Utils::combinePath(Configuration::absolutePath, "ambient", "default.png"); - - // do some SDL stuff - renderer, surface, texture - SDL_Renderer* renderer = SDL::getRenderer(0); // Get the renderer for the first screen - SDL_Surface* surface = IMG_Load(ambientImagePath.c_str()); - SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); - SDL_FreeSurface(surface); - - // present it - SDL_RenderClear(renderer); - SDL_RenderCopy(renderer, texture, nullptr, nullptr); - SDL_RenderPresent(renderer); - - // Clean up - SDL_DestroyTexture(texture); - - // TODO: take care of second screen if it exists - - // Wait for user input to exit ambient mode. The normal event loop is blocked while we do this - // TODO: periodically rotate ambient images - input_.resetStates(); - SDL_Event e; - while (1) { - SDL_PollEvent(&e); - input_.update(e); - if (input_.keystate(UserInput::KeyCodeSelect)) - { - input_.resetStates(); - break; - } - } -} - // Launch a game/program void RetroFE::launchEnter() { @@ -2302,13 +2267,24 @@ bool RetroFE::run() // second stage of entering ambient mode: once the fade-out is complete, actually enter ambient mode. if (currentPage_->isGraphicsIdle()) { - currentPage_->setIsLaunched(true); - // we're going to the ambient function, and blocking until it returns - ambientMode(); - // ... and we're back! Restart the page, and continue normally - currentPage_->start(); +#ifdef WIN32 + // stop music + Utils::postMessage("MediaplayerHiddenWindow", 0x8001, 75, 0); +#endif + //currentPage_->setIsLaunched(true); + // initialize the instance of AmbientMode + int ambientModeMinutesPerImage = 30; + config_.getProperty(OPTION_AMBIENTMODEMINUTESPERIMAGE, ambientModeMinutesPerImage); + AmbientMode ambientMode(input_, Configuration::absolutePath, ambientModeMinutesPerImage); + ambientMode.activate(); // blocks until user exits + currentPage_->start(); // ... and we're back! Restart the page, and continue normally state = RETROFE_IDLE; - break; +#ifdef WIN32 + // restart music + Utils::postMessage("MediaplayerHiddenWindow", 0x8001, 76, 0); +#endif + + break; } } @@ -2760,6 +2736,10 @@ RetroFE::RETROFE_STATE RetroFE::processUserInput(Page* page) #endif return RETROFE_AMBIENT_REQUEST; } + else if (controllerComboAmbient) + { + return RETROFE_AMBIENT_REQUEST; + } } // KeyCodeCycleCollection shared with KeyCodeQuitCombo1 and can missfire else if (!kioskLock_ && input_.lastKeyPressed(UserInput::KeyCodeCycleCollection)) diff --git a/RetroFE/Source/RetroFE.h b/RetroFE/Source/RetroFE.h index a3823dfe9..ab5b7d047 100644 --- a/RetroFE/Source/RetroFE.h +++ b/RetroFE/Source/RetroFE.h @@ -60,7 +60,6 @@ class RetroFE void allocateGraphicsMemory( ); void launchEnter( ); void launchExit( ); - void ambientMode( ); std::vector getPlaylistCycle(); bool getAttractModeCyclePlaylist(); MetadataDatabase* getMetaDb(); From fd1da15262e50bb72bda931458d468fe01991499 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 12:05:30 +0100 Subject: [PATCH 08/91] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d2c61d31..a817e7f31 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ It's licensed under the terms of the GNU General Public License, version 3 or la ## What's so special about this fork? * Performance and optimisations - * 64bit codebase + * 64-bit codebase * C++17 as standard * Modern render engine; DX11 for Windows, Metal for MacOS * Hardware accelerated video support for Windows From cc16896a5c3663889527cb847973d564a33a51e9 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 12:06:28 +0100 Subject: [PATCH 09/91] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index a817e7f31..9a1071d65 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,6 @@ -## A cross-platform frontend for game centers - [Project Discord](https://discord.gg/dpcsP8Hm9W) | [GitHub Wiki](https://github.com/CoinOPS-Official/RetroFE/wiki) | [Changelog](CHANGELOG.md) RetroFE is a cross-platform desktop frontend designed for MAME cabinets and game centers, with a focus on simplicity and customization. From d39b8b10cae44f9e739657ef47273690e8f72b45 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 12:52:57 +0100 Subject: [PATCH 10/91] Update GlobalOpts.cpp Mention inverted logging flags --- RetroFE/Source/Database/GlobalOpts.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RetroFE/Source/Database/GlobalOpts.cpp b/RetroFE/Source/Database/GlobalOpts.cpp index d5e6d5f59..23ddbfc2d 100644 --- a/RetroFE/Source/Database/GlobalOpts.cpp +++ b/RetroFE/Source/Database/GlobalOpts.cpp @@ -30,7 +30,7 @@ const global_options::options_entry global_options::s_option_entries[] = { { nullptr, nullptr, global_options::option_type::HEADER, "LOGGING OPTIONS" }, - { OPTION_LOG, "NONE", global_options::option_type::STRING, "Set logging level, any combo of ERROR,INFO,NOTICE,WARNING,DEBUG,FILECACHE or ALL or NONE" }, + { OPTION_LOG, "NONE", global_options::option_type::STRING, "Set logging level, any combo of ERROR,INFO,NOTICE,WARNING,DEBUG,FILECACHE or ALL or NONE. Use - to invert logging (ALL, -INFO)" }, { OPTION_DUMPPROPERTIES, "false", global_options::option_type::BOOLEAN, "Dump contents of properties to txt in current directory"}, { nullptr, nullptr, global_options::option_type::HEADER, "DISPLAY OPTIONS" }, From cf1641a54743f8a55c6c379f7c018fe2f7963f51 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 12:53:16 +0100 Subject: [PATCH 11/91] Update GLOBAL_SETTINGS.md Fully updated to reflect GlobalOpts.cpp at current point in time --- docs/GLOBAL_SETTINGS.md | 189 ++++++++++++++++++++++++++++------------ 1 file changed, 134 insertions(+), 55 deletions(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index 1525fe8ce..4a23a19ba 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -2,66 +2,145 @@ [Back](README.md) -The global settings.conf file, located in your RetroFE directory, +The global settings.conf file, located in the root directory, defines how your overall system operates. See below for a list of configuration parameters that can be specified for your global settings.conf. -| Variable | Allowed values | Description | -|---------------------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| numScreens | 1+ | Defines the number of monitors used. Defaults to 1. | -| fullscreen | yes, true, no, false | Run the front-end in fullscreen | -| horizontal | stretch, #pixels | Screen pixel width (i.e. 1920) | -| vertical | stretch, #pixels | Screen pixel height (i.e. 1080) | -| fullscreenx | yes, true, no, false | Run the front-end in fullscreen on monitor x, e.g. fullscreen0 = no. Monitor numbers start at 0! | -| horizontalx | stretch, #pixels | Screen pixel width (i.e. 1920) for monitor x, e.g. horizontal0 = 1920. Monitor numbers start at 0! | -| verticalx | stretch, #pixels | Screen pixel height (i.e. 1080) for monitor x, e.g. vertical0 = 1080. Monitor numbers start at 0! | -| screenNumx | 0+ | Screen numbers start at 0! | -| rotationx | 0, 1, 2, 3 | Rotation for monitor x (in 90 degree angles), e.g. rotation0 = 1 will rotate the screen for monitor 0 by 90 degrees. | -| mirrorx | yes, true, no, false | Mirror mode for monitor x, e.g. mirror0 will set mirror mode for monitor 0. This will divide the screen into two halves, and display the same images in each half in a mirrored fashion. | -| layout | a folder name in /layouts | The layout/theme to use for RetroFE (i.e. Aeon Nox) | -| windowBorder | yes, true, no, false | Show window border | -| windowResize | yes, true, no, false | Allow window to be resized | -| fps | frames per second (positive) | Requested FPS while not in the idle state. Defaults to 60. | -| fpsIdle | frames per second (positive) | Requested FPS while in the idle state. Defaults to 60. | -| hideMouse | yes, true, no, false | Hide the mouse cursor on the screen when the FE is active | -| showParenthesis | yes, true, no, false | Hide item/ROM information between () | -| showSquareBrackets | yes, true, no, false | Hide item/ROM information between \[\] | -| firstCollection | a folder name in /collections | Specify the name of the first collection to load on start (i.e. Main) | -| videoEnable | yes, true, no, false | Enable video display | -| videoLoop | #loops | Number of times to loop video playback (enter 0 to continuously loop) | -| exitOnFirstPageBack | yes, true, no, false | Exit the frontend when the back button is pressed on the first page | -| attractModeCyclePlaylist | yes, true, no, false | Select between cycling through the full set of playlists or the ones defined in the cyclePlaylist | -| attractModeTime | time (in seconds) | Enter 0 to disable attract mode, otherwise enter the number of seconds to wait before the menu scrolls to another random point | -| attractModeNextTime | time (in seconds) | Enter the number of seconds before the menu scrolls to another random point while already in attract mode | -| attractModePlaylistTime | time (in seconds) | Enter the number of seconds before the menu switches to the next playlist. Enter 0 to disable (default). | -| attractModeSkipPlaylist | playlist name | Skip this playlist while switching playlist in attract mode. | -| attractModeCollectionTime | time (in seconds) | Enter the number of seconds before the menu switches to the next collection. Enter 0 to disable (default). | -| attractModeSkipCollection | playlist name | Skip this collection while switching collections in attract mode. | -| attractModeMinTime | time (in ms) | Minimum time attract mode will scroll (default 0 ms) | -| attractModeMaxTime | time (in ms) | Maximum time attract mode will scroll (default 5000 ms) | -| rememberMenu | yes, true, no, false | Remember the last highlighted menu item if re-entering a menu | -| firstPlaylist | playlist name | Automatically switch to this playlist if it is available, often set to favorites. Replaces the autoFavorites parameter. | -| lastplayedSize | size (natural) | Size of the automatically generated lastplayed playlist. A size of 0 disabled this feature. | -| lastPlayedSkipCollection | collection name | Name of the collection not included in the lastplayed playlist. Generally used to exclude items from a settings collection. | -| cyclePlaylist | playlist set | Comma separated set of playlists that the playlist cycle keys cycle through. | -| minimizeOnFocusLoss | yes, true, no, false | Overwrite system SDL default for SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS to force RetroFE to (not) minimize when the focus on the full-screen window is lost. | -| collectionInputClear | yes, true, no, false | Clear the input queue when entering/exiting a collection | -| playlistInputClear | yes, true, no, false | Clear the input queue when changing playlist | -| jumpInputClear | yes, true, no, false | Clear the input queue when jumping through the menu | -| enterOnCollection | yes, true, no, false | Enter the collection when using collectionUp/Down controls | -| startCollectionEnter | yes, true, no, false | Enter the first collection RetroFE boot | -| baseMediaPath | i.e.(d:/media) | Override if you choose to have your media stored outside of RetroFE. Can be used by your Collection Settings.conf. | -| baseItemPath | i.e.(d:/roms) | Override if you choose to have your roms stored outside of RetroFE. Can be used by your Collection Settings.conf. | -| unloadSDL | yes, true, no, false | Close SDL when starting a game. This is needed for some systems like RetroPie to prevent the emulator from being launched behind the front-end. | -| overwriteXML | yes, true, no, false | Allow information files (collections/\/info/\.conf) to overwrite information from meta.db | -| subsSplit | yes, true, no, false | Split merged collections based on .sub files per .sub file (yes/true) or sort them as one list (no/false) | -| cfwLetterSub | yes, true, no, false | If subs exist in a collection, jump those subs by sub in stead of by letter (CoinOPS feature) | -| prevLetterSubToCurrent | yes, true, no, false | When using previous letter control, it will jump to the start of the current letter in stead of the start of the previous one | -| lastPlayedSkipCollection | collection name | Do not include items from this collection in the lastplayed playlist | -| LEDBlinkyDirectory | LEDBlinky installation directory | Setting this directory will enable LEDBlinky support | +## LOGGING OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `log` | `NONE` | `STRING` | Set logging level, any combo of ERROR,INFO,NOTICE,WARNING,DEBUG,FILECACHE or ALL or NONE. Use - to invert logging (ALL, -INFO) | | +| `dumpProperties` | `false` | `BOOLEAN` | Dump contents of properties to txt in current directory | | + +## DISPLAY OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `numScreens` | `1` | `INTEGER` | Defines the number of monitors used | | +| `fullscreen` | `true` | `BOOLEAN` | Run the frontend in fullscreen | | +| `horizontal` | `stretch` | `STRING` | Pixel width INT or STRETCH | | +| `vertical` | `stretch` | `STRING` | Pixel height INT or STRETCH | | +| `fullscreenX` | `true` | `BOOLEAN` | Run the frontend in fullscreen for monitor x | | +| `horizontalX` | `""` | `INTEGER` | Pixel width for monitor x | | +| `verticalX` | `""` | `INTEGER` | Pixel height for monitor x | | +| `screenNumX` | `""` | `INTEGER` | Define which monitor x is which display window, Screen numbers start at 0! | | +| `mirrorX` | `false` | `BOOLEAN` | Divides monitor x into two halves | | +| `rotationX` | `0` | `INTEGER` | Rotation of monitor x (0, 1, 2, 3) | | + +## WINDOW OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `windowBorder` | `false` | `BOOLEAN` | Show window border | | +| `windowResize` | `false` | `BOOLEAN` | Allow window to be resized | | +| `fps` | `60` | `INTEGER` | Requested FPS while in an active state | | +| `fpsIdle` | `60` | `INTEGER` | Request FPS while in an idle state | | +| `hideMouse` | `true` | `BOOLEAN` | Defines whether the mouse cursor is hidden | | +| `animateDuringGame` | `true` | `BOOLEAN` | Pause animated marquees while in the game | | + +## VIDEO OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `videoEnable` | `true` | `BOOLEAN` | Defines whether video is rendered | | +| `videoLoop` | `0` | `INTEGER` | Number of times to play video, 0 forever | | +| `disableVideoRestart` | `false` | `BOOLEAN` | Pauses video while scrolling | | +| `disablePauseOnScroll` | `false` | `BOOLEAN` | Restart video when selected | | + +## RENDERER OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `vsync` | `false` | `BOOLEAN` | Vertical synchronization | | +| `hardwareVideoAccel` | `false` | `BOOLEAN` | Hardware decoding | | +| `avdecMaxThreads` | `2` | `INTEGER` | Number of threads for avdec software decoding | | +| `muteVideo` | `false` | `BOOLEAN` | Video playback is muted | | +| `sdlRenderDriver` | `direct3d` | `STRING` | Set renderer (direct3d, direct3d11, direct3d12, opengl, opengles2, opengles, metal, and software) | | +| `scaleQuality` | `1` | `INTEGER` | Scaling quality (0, 1, 2) | | +| `highPriority` | `false` | `BOOLEAN` | RetroFE Windows process priority | | +| `unloadSDL` | `false` | `BOOLEAN` | Close SDL when launching a game, MUST be true for RPI | | +| `minimizeOnFocusLoss` | `false` | `BOOLEAN` | Minimize RetroFE when focus is lost | | +| `avdecThreadType` | `2` | `INTEGER` | Type of threading in the case of software decoding (1=frame, 2=slice) | | +| `glSwapInterval` | `1` | `INTEGER` | OpenGL Swap Interval (0=immediate updates, 1=synchronized vsync, -1=adaptive vsync) | | + +## CUSTOMIZATION OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `layout` | `Arcades` | `STRING` | Theme to be used in RetroFE, a folder name in /layouts | | +| `randomLayout` | `""` | `MSTRING` | Randomly choose a layout on launch, CSV list of layout names | | +| `firstPlaylist` | `arcades` | `STRING` | Start on this playlist if available | | +| `autoPlaylist` | `all` | `STRING` | Start on this playlist when entering a collection if available | | +| `quickListCollectionPlaylist` | `""` | `STRING` | Jump to playlist by way of quickList key | | +| `cyclePlaylist` | `""` | `MSTRING` | Set of playlists that can be cycled through, CSV list of playlist names | | +| `firstCollection` | `""` | `STRING` | Start on this collection if available | | +| `cycleCollection` | `""` | `MSTRING` | Set of collections that can be cycled through, CSV list of collection names | | +| `lastPlayedSize` | `10` | `INTEGER` | Size of the auto-generated last played playlist, 0 to disable | | +| `lastPlayedSkipCollection` | `""` | `MSTRING` | Skip CSV list of collections being added to last played | | +| `action` | `""` | `STRING` | If action= and the action has setting= then perform animation | | +| `enterOnCollection` | `false` | `BOOLEAN` | Enter the collection when using collection up/down controls | | +| `backOnCollection` | `false` | `BOOLEAN` | Move to the next/previous collection when using the collectionUp/Down/Left/Right buttons | | +| `startCollectionEnter` | `false` | `BOOLEAN` | Enter the first collection on RetroFE boot | | +| `exitOnFirstPageBack` | `false` | `BOOLEAN` | Exit RetroFE when the back button is pressed on the first page | | +| `rememberMenu` | `true` | `BOOLEAN` | Remember the last highlighted item if re-entering a menu | | +| `backOnEmpty` | `false` | `BOOLEAN` | Automatically back out of empty collection | | +| `subsSplit` | `false` | `BOOLEAN` | Split merged collections based on subs (true) or sort as one list (false) | | +| `cfwLetterSub` | `false` | `BOOLEAN` | Jump subs in a collection by sub instead of by the letter of the item | | +| `prevLetterSubToCurrent` | `false` | `BOOLEAN` | Jump to the start of the current letter instead of the previous letter if jump to letter enabled | | +| `randomStart` | `false` | `BOOLEAN` | Start on a random item when RetroFE boots | | +| `randomPlaylist` | `false` | `BOOLEAN` | Start on a random playlist when RetroFE boots | | +| `kiosk` | `false` | `BOOLEAN` | Start on the first playlist in cyclePlaylist with navigation and favorites locked, can be toggled with a setting in controls.conf | | +| `globalFavLast` | `false` | `BOOLEAN` | Save last played and favorites to a new collection | | +| `infoExitOnScroll` | `false` | `BOOLEAN` | Hide info text boxes when scrolling | | +| `jukebox` | `false` | `BOOLEAN` | Enables mapping of jukebox controls | | +| `fixedResLayouts` | `false` | `BOOLEAN` | Enables the use of fixed resolution layouts ie layout1920x1080.xml | | +| `screensaver` | `false` | `BOOLEAN` | Enables screensaver mode | | + + +## ATTRACT MODE OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `attractModeCyclePlaylist` | `false` | `BOOLEAN` | Cycle through all playlists or defined in cyclePlaylist | | +| `attractModeTime` | `19` | `INTEGER` | Number of seconds to wait before scrolling to another random point | | +| `attractModeNextTime` | `19` | `INTEGER` | Number of seconds to wait before scrolling to another random point while attract mode is active | | +| `attractModePlaylistTime` | `300` | `INTEGER` | Number of seconds to wait before attract mode jumps to another playlist, 0 to lock | | +| `attractModeSkipPlaylist` | `""` | `MSTRING` | Skip CSV list of playlists while in attract mode | | +| `attractModeCollectionTime` | `300` | `INTEGER` | Number of seconds before attract mode switches to the next collection, 0 to lock | | +| `attractModeSkipCollection` | `""` | `MSTRING` | Skip CSV list of collections while in attract mode | | +| `attractModeMinTime` | `100` | `INTEGER` | Minimum number of milliseconds attract mode will scroll | | +| `attractModeMaxTime` | `1600` | `INTEGER` | Maximum number of milliseconds attract mode will scroll | | +| `attractModeFast` | `false` | `BOOLEAN` | Scroll(false) or jump(true) to the next random point while in attract mode | | +| `attractModeLaunch` | `false` | `BOOLEAN` | When in attract mode will launch games for a time configured by attractModeLaunchRunTime, default 30 sec | | +| `attractModeLaunchRunTime` | `30` | `INTEGER` | If attractModeLaunch = true, the length of time a launched item will run | | +| `attractModeLaunchMinMaxScrolls` | `3,5` | `MSTRING` | If attractModeLaunch = true, comma separated min and max number of scrolls before launch | | + +## INPUT OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `collectionInputClear` | `false` | `BOOLEAN` | Clear input queue on collection change | | +| `playlistInputClear` | `false` | `BOOLEAN` | Clear input queue on playlist change | | +| `jumpInputClear` | `false` | `BOOLEAN` | Clear input queue while jumping through the menu | | +| `controllerComboExit` | `true` | `BOOLEAN` | Close RetroFE with the controller combo set in controls.conf | | +| `controllerComboSettings` | `false` | `BOOLEAN` | Open settings playlist with the controller combo set in controls.conf | | +| `settingsCollectionPlaylist` | `Arcades:settings` | `STRING` | Used by settings toggle to go to the playlist in collection:playlist format, defaults to settings.txt in the current collection | | +| `servoStikEnabled` | `false` | `BOOLEAN` | Enable ServoStik support | | + +## METADATA OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `metaLock` | `true` | `BOOLEAN` | Locks RetroFE from looking for XML changes and uses meta.db, faster loading when true | | +| `overwriteXML` | `false` | `BOOLEAN` | Allows metadata XMLs to be overwritten by files in a collection | | +| `showParenthesis` | `true` | `BOOLEAN` | Show item information between () | | +| `showSquareBrackets` | `true` | `BOOLEAN` | Show item information between [] | | + +## WINDOWS ONLY OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `ledBlinkyDirectory` | `""` | `PATH` | Path to LEDBlinky installation | | + +## MEDIA SEARCH PATH OPTIONS +| Option | Default | Type | Description | CoinOPS Added Feature | +|--------|---------|------|-------------|-----------------------| +| `baseMediaPath` | `""` | `PATH` | Path to media if stored outside the build | | +| `baseItemPath` | `""` | `PATH` | Path to items if stored outside the build | | In order to make scripted reconfiguration easier, RetroFE supports the filenames settings1.conf, settings2.conf, ..., settings9.conf as well. -[Back](README.md) +[Back](README.md) \ No newline at end of file From a5bf996a58bc6a95a37836462050581d399413c6 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 12:59:50 +0100 Subject: [PATCH 12/91] Explicitly state global settings for clarity --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index e0d5d8d36..8b520356c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,7 +13,7 @@ additional artwork like video, box art, screenshots, etc. # Index - [Getting Started](GETTING_STARTED.md) -- [Settings](GLOBAL_SETTINGS.md) +- [Global Settings](GLOBAL_SETTINGS.md) - [Controls (Keyboard/Gamepad)](CONTROLS.md) - [Collections](COLLECTIONS.md) - [Collection Settings](SETTINGS.md) From 627657cde8ca097bd3783e47e54410fc61c99bb1 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:01:37 +0100 Subject: [PATCH 13/91] Enumerate wiki index --- docs/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8b520356c..5a11adcb5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,13 +12,13 @@ additional artwork like video, box art, screenshots, etc. # Index -- [Getting Started](GETTING_STARTED.md) -- [Global Settings](GLOBAL_SETTINGS.md) -- [Controls (Keyboard/Gamepad)](CONTROLS.md) -- [Collections](COLLECTIONS.md) -- [Collection Settings](SETTINGS.md) -- [Launchers](LAUNCHERS.md) -- [General Layout Structure](PLAYGROUND.md) -- [Layouts](LAYOUTS.md) -- [Meta information](META_INFORMATION.md) +- [1. Getting Started](GETTING_STARTED.md) +- [2. Global Settings](GLOBAL_SETTINGS.md) +- [3. Controls (Keyboard/Gamepad)](CONTROLS.md) +- [4. Collections](COLLECTIONS.md) +- [5. Collection Settings](SETTINGS.md) +- [6. Launchers](LAUNCHERS.md) +- [7. General Layout Structure](PLAYGROUND.md) +- [8. Layouts](LAYOUTS.md) +- [9. Meta information](META_INFORMATION.md) From dd47f29d37fd41b75e0d937489336394b972e1b3 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:10:59 +0100 Subject: [PATCH 14/91] Update GLOBAL_SETTINGS.md Refactor paragraph --- docs/GLOBAL_SETTINGS.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index 4a23a19ba..5bc13d438 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -1,11 +1,7 @@ # Global settings.conf [Back](README.md) - -The global settings.conf file, located in the root directory, -defines how your overall system operates. See below for a list of -configuration parameters that can be specified for your global -settings.conf. +The global `settings.conf` file, located in the root directory, controls the global behavior of your system. Below is a list of available configuration parameters you can define in this file. ## LOGGING OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | From b29bcd4d10d95e298242f588fd8e2b205e769903 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:20:27 +0100 Subject: [PATCH 15/91] Update GLOBAL_SETTINGS.md Add more info about options --- docs/GLOBAL_SETTINGS.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index 5bc13d438..334d3db78 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -1,7 +1,14 @@ # Global settings.conf [Back](README.md) -The global `settings.conf` file, located in the root directory, controls the global behavior of your system. Below is a list of available configuration parameters you can define in this file. +## Overview +The global `settings.conf` file, located in the root directory, controls the global behavior of the RetroFE instance. Below is a list of available configuration parameters you can define in this file. + +## Alternate Configuration Files +To support scripted reconfiguration or multiple setup profiles, RetroFE also supports additional configuration files named sequentially: `settings1.conf`, `settings2.conf`, up to `settings16.conf`. + +## Command-Line Overrides +Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-LOG ALL -muteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all settings.conf or settingsX.conf files. ## LOGGING OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | @@ -136,7 +143,4 @@ The global `settings.conf` file, located in the root directory, controls the glo | `baseMediaPath` | `""` | `PATH` | Path to media if stored outside the build | | | `baseItemPath` | `""` | `PATH` | Path to items if stored outside the build | | -In order to make scripted reconfiguration easier, RetroFE supports the -filenames settings1.conf, settings2.conf, ..., settings9.conf as well. - [Back](README.md) \ No newline at end of file From 4266813a3326ef92611e833e1172952adcc8df5c Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:20:41 +0100 Subject: [PATCH 16/91] Update GETTING_STARTED.md Initial Formatting --- docs/GETTING_STARTED.md | 55 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/docs/GETTING_STARTED.md b/docs/GETTING_STARTED.md index c5c05d180..901e41457 100644 --- a/docs/GETTING_STARTED.md +++ b/docs/GETTING_STARTED.md @@ -1,37 +1,36 @@ # Getting Started [Back](README.md) - -For Windows users, and some Linux users, getting started with RetroFE is -as simple as following these steps: - -1. Download RetroFE from -2. Edit the [global settings.conf](global settings.conf) file. -3. Edit the [controls.conf](CONTROLS.md) file. -4. Run RetroFE to verify if the front-end loads (and exits) correctly. -5. Edit/add/delete [collections](COLLECTIONS.md). -6. Re-run RetroFE - - + +Getting started with RetroFE is as simple as following these steps: + +1. Download RetroFE for your Desktop OS +2. Edit the [global settings.conf](global settings.conf) file. +3. Edit the [controls.conf](CONTROLS.md) file. +4. Run RetroFE to verify if the front-end loads (and exits) correctly. +5. Edit/add/delete [collections](COLLECTIONS.md). +6. Re-run RetroFE + + ## RetroFE Root Directory Structure -| File / Folder | Description | +| File / Folder | Description | |---------------------------------------|----------------------------------------------------------------------------------| -| [controls.conf](CONTROLS.md) | Controller configuration (up, down, select, back, etc) | -| log.txt | Log output | -| meta.db | Game (information database year, manufacturer, genre, #players, etc) | -| RetroFE.lnk | Windows link to core / retrofe.exe | -| [settings.conf](GLOBAL_SETTINGS.md) | Global frontend settings (display options, layout to use, base paths, etc) | -| /collections/ | Game lists, menus, artwork and ROMs | -| /core/ | Windows specific libraries needed for retrofe to run (also includes retrofe.exe) | -| /launchers/ | Configuration files for launchers (emulators) | -| /layouts/ | Layouts / themes to use or display for the frontend | -| /meta/ | Files to import into meta.db (for scraping) | - - +| [controls.conf](CONTROLS.md) | Controller configuration (up, down, select, back, etc) | +| log.txt | Log output | +| meta.db | Game (information database year, manufacturer, genre, #players, etc) | +| RetroFE.lnk/AppImage/app/retrofe | RetroFE executable | +| [settings.conf](GLOBAL_SETTINGS.md) | Global frontend settings (display options, layout to use, base paths, etc) | +| /collections/ | Game lists, menus, artwork and ROMs | +| /core/ | Windows specific libraries needed for retrofe to run (also includes retrofe.exe) | +| /launchers/ | Configuration files for launchers (emulators) | +| /layouts/ | Layouts / themes to use or display for the frontend | +| /meta/ | Files to import into meta.db (for scraping) | + + # Detailed Setup Guide - + ## Installation (Note for linux users: Since Linux comes in many shapes and sizes, @@ -45,7 +44,7 @@ executable in that directory. RetroFE comes with a pre-installed Sega Genesis system with one game so you can check if the installation went according to plan. - + ## Configuration The first configuration step is editing the RetroFE system configuration @@ -57,7 +56,7 @@ RetroFE/[controls.conf](CONTROLS.md). In here you configure the keys used to control the RetroFE front-end. Note that the default select key is space, and not enter as some people expected. - + ## Adding Collections RetroFE starts with two (almost empty) [collections](COLLECTIONS.md), but From 55a42afbaceb69d45f60a7e42487ea34a1f83ef9 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:29:01 +0100 Subject: [PATCH 17/91] Update GLOBAL_SETTINGS.md Add CoinOPS feature column --- docs/GLOBAL_SETTINGS.md | 52 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index 334d3db78..7b67814b8 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -13,8 +13,8 @@ Additionally, all settings can be passed as command-line options using the forma ## LOGGING OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | |--------|---------|------|-------------|-----------------------| -| `log` | `NONE` | `STRING` | Set logging level, any combo of ERROR,INFO,NOTICE,WARNING,DEBUG,FILECACHE or ALL or NONE. Use - to invert logging (ALL, -INFO) | | -| `dumpProperties` | `false` | `BOOLEAN` | Dump contents of properties to txt in current directory | | +| `log` | `NONE` | `STRING` | Set logging level, any combo of ERROR,INFO,NOTICE,WARNING,DEBUG,FILECACHE or ALL or NONE. Use - to invert logging (ALL, -INFO) | ✅ | +| `dumpProperties` | `false` | `BOOLEAN` | Dump contents of properties to txt in current directory | ✅ | ## DISPLAY OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | @@ -38,26 +38,26 @@ Additionally, all settings can be passed as command-line options using the forma | `fps` | `60` | `INTEGER` | Requested FPS while in an active state | | | `fpsIdle` | `60` | `INTEGER` | Request FPS while in an idle state | | | `hideMouse` | `true` | `BOOLEAN` | Defines whether the mouse cursor is hidden | | -| `animateDuringGame` | `true` | `BOOLEAN` | Pause animated marquees while in the game | | +| `animateDuringGame` | `true` | `BOOLEAN` | Pause animated marquees while in the game | ✅ | ## VIDEO OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | |--------|---------|------|-------------|-----------------------| | `videoEnable` | `true` | `BOOLEAN` | Defines whether video is rendered | | | `videoLoop` | `0` | `INTEGER` | Number of times to play video, 0 forever | | -| `disableVideoRestart` | `false` | `BOOLEAN` | Pauses video while scrolling | | -| `disablePauseOnScroll` | `false` | `BOOLEAN` | Restart video when selected | | +| `disableVideoRestart` | `false` | `BOOLEAN` | Pauses video while scrolling | ✅ | +| `disablePauseOnScroll` | `false` | `BOOLEAN` | Restart video when selected | ✅ | ## RENDERER OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | |--------|---------|------|-------------|-----------------------| | `vsync` | `false` | `BOOLEAN` | Vertical synchronization | | -| `hardwareVideoAccel` | `false` | `BOOLEAN` | Hardware decoding | | -| `avdecMaxThreads` | `2` | `INTEGER` | Number of threads for avdec software decoding | | -| `muteVideo` | `false` | `BOOLEAN` | Video playback is muted | | -| `sdlRenderDriver` | `direct3d` | `STRING` | Set renderer (direct3d, direct3d11, direct3d12, opengl, opengles2, opengles, metal, and software) | | -| `scaleQuality` | `1` | `INTEGER` | Scaling quality (0, 1, 2) | | -| `highPriority` | `false` | `BOOLEAN` | RetroFE Windows process priority | | +| `hardwareVideoAccel` | `false` | `BOOLEAN` | Hardware decoding | ✅ | +| `avdecMaxThreads` | `2` | `INTEGER` | Number of threads for avdec software decoding | ✅ | +| `muteVideo` | `false` | `BOOLEAN` | Video playback is muted | ✅ | +| `sdlRenderDriver` | `direct3d` | `STRING` | Set renderer (direct3d, direct3d11, direct3d12, opengl, opengles2, opengles, metal, and software) | ✅ | +| `scaleQuality` | `1` | `INTEGER` | Scaling quality (0, 1, 2) | ✅ | +| `highPriority` | `false` | `BOOLEAN` | RetroFE Windows process priority | ✅ | | `unloadSDL` | `false` | `BOOLEAN` | Close SDL when launching a game, MUST be true for RPI | | | `minimizeOnFocusLoss` | `false` | `BOOLEAN` | Minimize RetroFE when focus is lost | | | `avdecThreadType` | `2` | `INTEGER` | Type of threading in the case of software decoding (1=frame, 2=slice) | | @@ -67,13 +67,13 @@ Additionally, all settings can be passed as command-line options using the forma | Option | Default | Type | Description | CoinOPS Added Feature | |--------|---------|------|-------------|-----------------------| | `layout` | `Arcades` | `STRING` | Theme to be used in RetroFE, a folder name in /layouts | | -| `randomLayout` | `""` | `MSTRING` | Randomly choose a layout on launch, CSV list of layout names | | +| `randomLayout` | `""` | `MSTRING` | Randomly choose a layout on launch, CSV list of layout names | ✅ | | `firstPlaylist` | `arcades` | `STRING` | Start on this playlist if available | | | `autoPlaylist` | `all` | `STRING` | Start on this playlist when entering a collection if available | | | `quickListCollectionPlaylist` | `""` | `STRING` | Jump to playlist by way of quickList key | | | `cyclePlaylist` | `""` | `MSTRING` | Set of playlists that can be cycled through, CSV list of playlist names | | -| `firstCollection` | `""` | `STRING` | Start on this collection if available | | -| `cycleCollection` | `""` | `MSTRING` | Set of collections that can be cycled through, CSV list of collection names | | +| `firstCollection` | `""` | `STRING` | Start on this collection if available | ✅ | +| `cycleCollection` | `""` | `MSTRING` | Set of collections that can be cycled through, CSV list of collection names | ✅ | | `lastPlayedSize` | `10` | `INTEGER` | Size of the auto-generated last played playlist, 0 to disable | | | `lastPlayedSkipCollection` | `""` | `MSTRING` | Skip CSV list of collections being added to last played | | | `action` | `""` | `STRING` | If action= and the action has setting= then perform animation | | @@ -84,15 +84,15 @@ Additionally, all settings can be passed as command-line options using the forma | `rememberMenu` | `true` | `BOOLEAN` | Remember the last highlighted item if re-entering a menu | | | `backOnEmpty` | `false` | `BOOLEAN` | Automatically back out of empty collection | | | `subsSplit` | `false` | `BOOLEAN` | Split merged collections based on subs (true) or sort as one list (false) | | -| `cfwLetterSub` | `false` | `BOOLEAN` | Jump subs in a collection by sub instead of by the letter of the item | | +| `cfwLetterSub` | `false` | `BOOLEAN` | Jump subs in a collection by sub instead of by the letter of the item | ✅ | | `prevLetterSubToCurrent` | `false` | `BOOLEAN` | Jump to the start of the current letter instead of the previous letter if jump to letter enabled | | -| `randomStart` | `false` | `BOOLEAN` | Start on a random item when RetroFE boots | | +| `randomStart` | `false` | `BOOLEAN` | Start on a random item when RetroFE boots | ✅ | | `randomPlaylist` | `false` | `BOOLEAN` | Start on a random playlist when RetroFE boots | | -| `kiosk` | `false` | `BOOLEAN` | Start on the first playlist in cyclePlaylist with navigation and favorites locked, can be toggled with a setting in controls.conf | | -| `globalFavLast` | `false` | `BOOLEAN` | Save last played and favorites to a new collection | | -| `infoExitOnScroll` | `false` | `BOOLEAN` | Hide info text boxes when scrolling | | +| `kiosk` | `false` | `BOOLEAN` | Start on the first playlist in cyclePlaylist with navigation and favorites locked, can be toggled with a setting in controls.conf | ✅ | +| `globalFavLast` | `false` | `BOOLEAN` | Save last played and favorites to a new collection | ✅ | +| `infoExitOnScroll` | `false` | `BOOLEAN` | Hide info text boxes when scrolling | ✅ | | `jukebox` | `false` | `BOOLEAN` | Enables mapping of jukebox controls | | -| `fixedResLayouts` | `false` | `BOOLEAN` | Enables the use of fixed resolution layouts ie layout1920x1080.xml | | +| `fixedResLayouts` | `false` | `BOOLEAN` | Enables the use of fixed resolution layouts ie layout1920x1080.xml | ✅ | | `screensaver` | `false` | `BOOLEAN` | Enables screensaver mode | | @@ -103,12 +103,12 @@ Additionally, all settings can be passed as command-line options using the forma | `attractModeTime` | `19` | `INTEGER` | Number of seconds to wait before scrolling to another random point | | | `attractModeNextTime` | `19` | `INTEGER` | Number of seconds to wait before scrolling to another random point while attract mode is active | | | `attractModePlaylistTime` | `300` | `INTEGER` | Number of seconds to wait before attract mode jumps to another playlist, 0 to lock | | -| `attractModeSkipPlaylist` | `""` | `MSTRING` | Skip CSV list of playlists while in attract mode | | +| `attractModeSkipPlaylist` | `""` | `MSTRING` | Skip CSV list of playlists while in attract mode | ✅ | | `attractModeCollectionTime` | `300` | `INTEGER` | Number of seconds before attract mode switches to the next collection, 0 to lock | | | `attractModeSkipCollection` | `""` | `MSTRING` | Skip CSV list of collections while in attract mode | | | `attractModeMinTime` | `100` | `INTEGER` | Minimum number of milliseconds attract mode will scroll | | | `attractModeMaxTime` | `1600` | `INTEGER` | Maximum number of milliseconds attract mode will scroll | | -| `attractModeFast` | `false` | `BOOLEAN` | Scroll(false) or jump(true) to the next random point while in attract mode | | +| `attractModeFast` | `false` | `BOOLEAN` | Scroll(false) or jump(true) to the next random point while in attract mode | ✅ | | `attractModeLaunch` | `false` | `BOOLEAN` | When in attract mode will launch games for a time configured by attractModeLaunchRunTime, default 30 sec | | | `attractModeLaunchRunTime` | `30` | `INTEGER` | If attractModeLaunch = true, the length of time a launched item will run | | | `attractModeLaunchMinMaxScrolls` | `3,5` | `MSTRING` | If attractModeLaunch = true, comma separated min and max number of scrolls before launch | | @@ -119,15 +119,15 @@ Additionally, all settings can be passed as command-line options using the forma | `collectionInputClear` | `false` | `BOOLEAN` | Clear input queue on collection change | | | `playlistInputClear` | `false` | `BOOLEAN` | Clear input queue on playlist change | | | `jumpInputClear` | `false` | `BOOLEAN` | Clear input queue while jumping through the menu | | -| `controllerComboExit` | `true` | `BOOLEAN` | Close RetroFE with the controller combo set in controls.conf | | -| `controllerComboSettings` | `false` | `BOOLEAN` | Open settings playlist with the controller combo set in controls.conf | | -| `settingsCollectionPlaylist` | `Arcades:settings` | `STRING` | Used by settings toggle to go to the playlist in collection:playlist format, defaults to settings.txt in the current collection | | +| `controllerComboExit` | `true` | `BOOLEAN` | Close RetroFE with the controller combo set in controls.conf | ✅ | +| `controllerComboSettings` | `false` | `BOOLEAN` | Open settings playlist with the controller combo set in controls.conf | ✅ | +| `settingsCollectionPlaylist` | `Arcades:settings` | `STRING` | Used by settings toggle to go to the playlist in collection:playlist format, defaults to settings.txt in the current collection | ✅ | | `servoStikEnabled` | `false` | `BOOLEAN` | Enable ServoStik support | | ## METADATA OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | |--------|---------|------|-------------|-----------------------| -| `metaLock` | `true` | `BOOLEAN` | Locks RetroFE from looking for XML changes and uses meta.db, faster loading when true | | +| `metaLock` | `true` | `BOOLEAN` | Locks RetroFE from looking for XML changes and uses meta.db, faster loading when true | ✅ | | `overwriteXML` | `false` | `BOOLEAN` | Allows metadata XMLs to be overwritten by files in a collection | | | `showParenthesis` | `true` | `BOOLEAN` | Show item information between () | | | `showSquareBrackets` | `true` | `BOOLEAN` | Show item information between [] | | From c6723fb44bdaaa64ce48ed98e84f723994e9b034 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:38:38 +0100 Subject: [PATCH 18/91] Update GLOBAL_SETTINGS.md --- docs/GLOBAL_SETTINGS.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index 7b67814b8..351a01a89 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -8,7 +8,10 @@ The global `settings.conf` file, located in the root directory, controls the glo To support scripted reconfiguration or multiple setup profiles, RetroFE also supports additional configuration files named sequentially: `settings1.conf`, `settings2.conf`, up to `settings16.conf`. ## Command-Line Overrides -Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-LOG ALL -muteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all settings.conf or settingsX.conf files. +Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-log ALL -muteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all settings.conf or settingsX.conf files. + +## +For all `BOOLEAN` types, the following values are accepted: `yes`, `no`, `true`, and `false`. ## LOGGING OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | @@ -51,17 +54,17 @@ Additionally, all settings can be passed as command-line options using the forma ## RENDERER OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | |--------|---------|------|-------------|-----------------------| -| `vsync` | `false` | `BOOLEAN` | Vertical synchronization | | -| `hardwareVideoAccel` | `false` | `BOOLEAN` | Hardware decoding | ✅ | -| `avdecMaxThreads` | `2` | `INTEGER` | Number of threads for avdec software decoding | ✅ | -| `muteVideo` | `false` | `BOOLEAN` | Video playback is muted | ✅ | -| `sdlRenderDriver` | `direct3d` | `STRING` | Set renderer (direct3d, direct3d11, direct3d12, opengl, opengles2, opengles, metal, and software) | ✅ | -| `scaleQuality` | `1` | `INTEGER` | Scaling quality (0, 1, 2) | ✅ | +| `vSync` | `false` | `BOOLEAN` | Vertical synchronization | | +| `HardwareVideoAccel` | `false` | `BOOLEAN` | Hardware decoding | ✅ | +| `AvdecMaxThreads` | `2` | `INTEGER` | Number of threads for avdec software decoding | ✅ | +| `MuteVideo` | `false` | `BOOLEAN` | Video playback is muted | ✅ | +| `SDLRenderDriver` | `direct3d` | `STRING` | Set renderer (direct3d, direct3d11, direct3d12, opengl, opengles2, opengles, metal, and software) | ✅ | +| `ScaleQuality` | `1` | `INTEGER` | Scaling quality (0, 1, 2) | ✅ | | `highPriority` | `false` | `BOOLEAN` | RetroFE Windows process priority | ✅ | | `unloadSDL` | `false` | `BOOLEAN` | Close SDL when launching a game, MUST be true for RPI | | | `minimizeOnFocusLoss` | `false` | `BOOLEAN` | Minimize RetroFE when focus is lost | | -| `avdecThreadType` | `2` | `INTEGER` | Type of threading in the case of software decoding (1=frame, 2=slice) | | -| `glSwapInterval` | `1` | `INTEGER` | OpenGL Swap Interval (0=immediate updates, 1=synchronized vsync, -1=adaptive vsync) | | +| `AvdecThreadType` | `2` | `INTEGER` | Type of threading in the case of software decoding (1=frame, 2=slice) | | +| `GlSwapInterval` | `1` | `INTEGER` | OpenGL Swap Interval (0=immediate updates, 1=synchronized vsync, -1=adaptive vsync) | | ## CUSTOMIZATION OPTIONS | Option | Default | Type | Description | CoinOPS Added Feature | From dc68f6080b07e1d421531aea5815e1b5b81898e1 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 13:38:55 +0100 Subject: [PATCH 19/91] Update GLOBAL_SETTINGS.md --- docs/GLOBAL_SETTINGS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index 351a01a89..d7b4176da 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -8,7 +8,7 @@ The global `settings.conf` file, located in the root directory, controls the glo To support scripted reconfiguration or multiple setup profiles, RetroFE also supports additional configuration files named sequentially: `settings1.conf`, `settings2.conf`, up to `settings16.conf`. ## Command-Line Overrides -Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-log ALL -muteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all settings.conf or settingsX.conf files. +Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-log ALL -MuteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all settings.conf or settingsX.conf files. ## For all `BOOLEAN` types, the following values are accepted: `yes`, `no`, `true`, and `false`. From 41d2212990db8f5de6b2d1d12cd9762efb355d6f Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 14:02:16 +0100 Subject: [PATCH 20/91] Update GLOBAL_SETTINGS.md --- docs/GLOBAL_SETTINGS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/GLOBAL_SETTINGS.md b/docs/GLOBAL_SETTINGS.md index d7b4176da..8af61b5b0 100644 --- a/docs/GLOBAL_SETTINGS.md +++ b/docs/GLOBAL_SETTINGS.md @@ -2,13 +2,13 @@ [Back](README.md) ## Overview -The global `settings.conf` file, located in the root directory, controls the global behavior of the RetroFE instance. Below is a list of available configuration parameters you can define in this file. +The global `settings.conf` file, located in the root directory, controls the global behavior of the RetroFE instance. Below is a list of available configuration parameters you can define in this file. A default `settings.conf` can be generated by passing `--createconfig` as argument, see [CLI](CLI.md) ## Alternate Configuration Files To support scripted reconfiguration or multiple setup profiles, RetroFE also supports additional configuration files named sequentially: `settings1.conf`, `settings2.conf`, up to `settings16.conf`. ## Command-Line Overrides -Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-log ALL -MuteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all settings.conf or settingsX.conf files. +Additionally, all settings can be passed as command-line options using the format `-optionName value`. For example: `-log ALL -MuteVideo yes` would enable logging in all categories and mute video audio. Command-line options have the highest priority. Any value specified on the command line will override the corresponding setting in all `settings.conf` or `settingsX.conf` files. ## For all `BOOLEAN` types, the following values are accepted: `yes`, `no`, `true`, and `false`. From eee9cbd701f6c047740920fa24375d88e2be10e7 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 14:02:21 +0100 Subject: [PATCH 21/91] Create CLI.md --- docs/CLI.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/CLI.md diff --git a/docs/CLI.md b/docs/CLI.md new file mode 100644 index 000000000..9f319f628 --- /dev/null +++ b/docs/CLI.md @@ -0,0 +1,56 @@ +# RetroFE's Command Line Interface (CLI) +RetroFE supports a variety of command-line options to help automate configuration, streamline development, and troubleshoot the frontend. + +## 📌 Usage +Run RetroFE with arguments to trigger specific actions: + +```bash +retrofe [-option] [value] +```` + +All settings available in `settings.conf` can also be passed via the command line in `-key value` format. + +**CLI options always take highest priority**, overriding values in `settingsX.conf` files. + +## 🧰 Available Options +| Option | Alias | Description | +| -------------- | -------------------- | ---------------------------------------------------------------------------------- | +| `-h` | `--help` | Display this help message | +| `-v` | `--version` | Print the current RetroFE version | +| `-cc` | `--createcollection` | Create a new collection folder structure
Usage: `-cc [collectionName] {local}` | +| `-rdb` | `--rebuilddatabase` | Rebuild the metadata database from `/meta` | +| `-su` | `--showusage` | List all available global settings and their descriptions | +| `-sc` | `--showconfig` | Display all active settings loaded from `settingsX.conf` | +| `-C` | `--createconfig` | Generate a default `settings.conf` and a `README.md` | +| `-dump` | `--dumpproperties` | Dump current settings to `properties.txt` | +| `-gstdotdebug` | `--gstdotdebug` | Enable GStreamer DOT graph generation for debugging | + +## ⚙️ Passing Configuration via CLI +You can pass any configuration setting using key-value pairs: + +```bash +retrofe -log DEBUG -vSync true -muteVideo yes +``` + +## 🧪 Examples + +```bash +# Create a new collection directory +retrofe -cc "Super Nintendo" + +# Rebuild the metadata database +retrofe -rdb + +# Dump all settings to a file +retrofe -dump + +# Set logging and mute video via CLI +retrofe -log DEBUG -muteVideo true +``` + +--- + +## 🔗 Resources + +* 📘 [RetroFE GitHub Repository](https://github.com/CoinOPS-Official/RetroFE/) +* 🌐 [RetroFE Official Website](http://retrofe.nl/) From c2d24780c5b7a1d03b5c749cf89912f4b0f348c2 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 15:24:17 +0100 Subject: [PATCH 22/91] Update CONTROLS.md --- docs/CONTROLS.md | 664 +++++++++++++++++++++++++---------------------- 1 file changed, 359 insertions(+), 305 deletions(-) diff --git a/docs/CONTROLS.md b/docs/CONTROLS.md index 9266e693c..b5cae9c05 100644 --- a/docs/CONTROLS.md +++ b/docs/CONTROLS.md @@ -1,329 +1,383 @@ # Controls [Back](README.md) -The controls.conf file, located in your RetroFE directory, contains the -controls for your RetroFE front-end. Multiple keys can be assigned to a -single action, separated by a ,. +The `controls.conf` file, located in your RetroFE directory, contains the +controls for your RetroFE frontend. Multiple keys can be assigned to a +single action, separated by a `,` Example: - Up = Keypad 8, Up + Up = Keypad 8, Up This will assign both the Keypad 8 (up arrow on your keypad) and the up arrow to RetroFE's Up control. -Settings for controls: +## RetroFE Control Keys + +### Essential +These keys must be defined for RetroFE to boot +| Control | Description | +|---------|-------------| +| `up` | Scrolls menu up (for vertical menus) | +| `down` | Scrolls menu up (for vertical menus) | +| `left` | Scrolls menu left (for horizontal menus) | +| `right` | Scrolls menu right (for horizontal menus) | +| `select` | Selects the active menu item | +| `back` | Leaves current menu | +| `quit` | Exits the frontend | + +### Basic Navigation +Most users will want to use these keys to move around a build +| Control | Description | +|---------|-------------| +| `nextCyclePlaylist` | Switches to the next playlist in the cyclePlaylist set. | +| `prevCyclePlaylist` | Switches to the previous playlist in the cyclePlaylist set. | +| `letterUp` | Scrolls menu to the previous item in the alphabet | +| `letterDown` | Scrolls menu to next item in the alphabet | + +### Advanced Navigation +| Control | Description | +|---------|-------------| +| `playlistUp` | Scrolls to the previous playlist in a collection in vertical layouts. | +| `playlistDown` |Scrolls to the next playlist in a collection in vertical layouts. | +| `playlistLeft` | Scrolls to the previous playlist in a collection in horizontal layouts. | +| `playlistRight` | Scrolls to the next playlist in a collection in horizontal layouts. | +| `collectionUp` | Scrolls to the previous collection in vertical layouts. Will enter that collection if enterOnCollection is true. | +| `collectionDown` | Scrolls menu next collection in vertical layouts. Will enter that collection based if enterOnCollection is true. | +| `collectionLeft` | Scrolls to the previous collection in horizontal layouts. Will enter that collection if enterOnCollection is true. | +| `collectionRight` | Scrolls menu next collection in horizontal layouts. Will enter that collection based if enterOnCollection is true. | +| `pageUp` | Scrolls menu back by a page | +| `pageDown` | Scrolls menu forward by a page | +| `prevPlaylist` | Switches to the previous playlist. | +| `nextPlaylist` | Switches to the next playlist. | +| `cyclePlaylist` | Switches to the next playlist in the cyclePlaylist set. Still functional, but has been replaced by nextCyclePlaylist. | + +### Jukebox Mode +These keys are used to define jukebox controls when RetroFE operates in a jukebox environment +| Control | Description | +|---------|-------------| +| `jbFastForward1m` | Jukebox fast forward 1 minute | +| `jbFastRewind1m` | Jukebox fast rewind 1 minute | +| `jbFastForward5p` | Jukebox fast forward 5% | +| `jbFastRewind5p` | Jukebox fast rewind 5% | +| `jbPause` | Jukebox pause | +| `jbRestart` | Jukebox restart | + +### Button Combos +These keys are used to define button combos with two keycodes. The first value defines the shift modifier +| Control | Description | +|---------|-------------| +| `quitCombo` | Quits RetroFE | +| `settingsCombo` | Switches to the settings playlist defined in settings.conf `controllerComboSettings` | +| `gameInfoCombo` | Toggles Game Info with a button combo | +| `collectionInfoCombo` | Toggles Collection Info with a button combo | +| `buildInfoCombo` | Toggles Build Info with a button combo | + +### Favorites +| Control | Description | +|---------|-------------| +| `addPlaylist` | Adds current item to the favorites playlist | +| `removePlaylist` | Removes current item from the favorites playlist | +| `favPlaylist` | Switches to the favorites playlist | +| `togglePlaylist` | Toggle adding current item to favorites playlist | +| `random` | Selects a random item | + +### Admin +| `settings` | Switches to the settings playlist | +| `reboot` | Reboot RetroFE and refresh config | +| `kiosk` | Toggle kiosk mode | + +### Deadzone +| Control | Description | +|---------|-------------| +| `deadZone` | Defines the dead zone for analog inputs between 0 and 100, with 100 blocking all analog input | + + +| `menu` | | +| `saveFirstPlaylist` | | +| `quickPlaylist` | | +| `cycleCollection` | | +| `prevCycleCollection` | | -| Control | Description | -|-------------------|-----------------------------------------------------------------------------------------------------------------------| -| up | Scrolls menu up (for vertical menus) | -| down | Scrolls menu up (for vertical menus) | -| left | Scrolls menu left (for horizontal menus) | -| right | Scrolls menu right (for horizontal menus) | -| pageUp | Scrolls menu back by a page | -| pageDown | Scrolls menu forward by a page | -| letterUp | Scrolls to the previous item in the alphabet | -| letterDown | Scrolls menu next item in the alphabet | -| collectionUp | Scrolls to the previous collection. Will enter that collection based on enterOnCollection. | -| collectionDown | Scrolls menu next collection. Will enter that collection based on enterOnCollection. | -| addPlaylist | Adds a game to the favorites playlist | -| removePlaylist | Removes a game from the favorites playlist | -| favPlaylist | Switches to the favorites playlist. | -| nextPlaylist | Switches to the next playlist. | -| prevPlaylist | Switches to the previous playlist. | -| cyclePlaylist | Switches to the next playlist in the cyclePlaylist set. Still functional, but has been replaced by nextCyclePlaylist. | -| nextCyclePlaylist | Switches to the next playlist in the cyclePlaylist set. | -| prevCyclePlaylist | Switches to the previous playlist in the cyclePlaylist set. | -| random | Selects a random game | -| select | Selects the active menu item | -| back | Leaves current menu | -| quit | Exits the frontend | -| jbFastForward1m | Jukebox fast forward 1 minute | -| jbFastRewind1m | Jukebox fast rewind 1 minute | -| jbFastForward5p | Jukebox fast forward 5% | -| jbFastRewind5p | Jukebox fast rewind 5% | -| jbPause | Jukebox pause | -| jbRestart | Jukebox restart | -| deadZone | Defines the dead zone for analog inputs | - - ## Gamepad/Joystick codes -| Keycode | Description | -|-------------------|--------------------------------------------------------------------| -| joyXButtonY | Gamepad button (X=joypad number, Y=button number) | -| joyXHatYLeftUp | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYLeft | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYLeftDown | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYUp | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYDown | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYRightUp | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYRight | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXHatYRightDown | Gamepad hat direction (X=joypad number, Y=hat number) | -| joyXAxis0+ | First POV stick, first axis positive direction (X=joypad number) | -| joyXAxis0- | First POV stick, first axis negative direction (X=joypad number) | -| joyXAxis1+ | First POV stick, second axis positive direction (X=joypad number) | -| joyXAxis1- | First POV stick, second axis negative direction (X=joypad number) | -| joyXAxis2+ | Second POV stick, first axis positive direction (X=joypad number) | -| joyXAxis2- | Second POV stick, first axis negative direction (X=joypad number) | -| joyXAxis3+ | Second POV stick, second axis positive direction (X=joypad number) | -| joyXAxis3- | Second POV stick, second axis negative direction (X=joypad number) | +- `X` = Controller number (e.g. `joy0` is the first connected gamepad) +- `Y` = Button or hat number on controller `X` + +| Keycode| Description | +|--------|-------------| +| `joyXButtonY` | button Y on joystick X | +| `joyXHatYLeftUp` | hat (D-pad) diagonally up-left (hat Y on joystick X) | +| `joyXHatYLeft` | hat (D-pad) left direction (hat Y on joystick X) | +| `joyXHatYLeftDown` | hat (D-pad) diagonally down-left (hat Y on joystick X) | +| `joyXHatYUp` | hat (D-pad) up direction (hat Y on joystick X) | +| `joyXHatYDown` | hat (D-pad) down direction (hat Y on joystick X) | +| `joyXHatYRightUp` | hat (D-pad) diagonally up-right (hat Y on joystick X) | +| `joyXHatYRight` | hat (D-pad) right direction (hat Y on joystick X) | +| `joyXHatYRightDown` | hat (D-pad) diagonally down-right (hat Y on joystick X) | +| `joyXAxis0+` | Left analog stick, horizontal axis right (joystick X) | +| `joyXAxis0-` | Left analog stick, horizontal axis left (joystick X) | +| `joyXAxis1+` | Left analog stick, vertical axis down (joystick X) | +| `joyXAxis1-` | Left analog stick, vertical axis up (joystick X) | +| `joyXAxis2+` | Right analog stick, horizontal axis right (joystick X) | +| `joyXAxis2-` | Right analog stick, horizontal axis left (joystick X) | +| `joyXAxis3+` | Right analog stick, vertical axis down (joystick X) | +| `joyXAxis3-` | Right analog stick, vertical axis up (joystick X) | If X is omitted, RetroFE will accept input from all controllers. -(version 0.8.13+) - +(version 0.8.13+) ## Mouse Codes -| Keycode | Description | -|-------------------|-------------------------| -| mouseButtonleft | the left mouse button | -| mouseButtonMiddle | the middle mouse button | -| mouseButtonRight | the right mouse button | -| mouseButtonX1 | the X1 mouse button | -| mouseButtonX2 | the X2 mouse button | +| Keycode | Description | +|---------|-------------| +| `mouseButtonleft` | the left mouse button | +| `mouseButtonMiddle` | the middle mouse button | +| `mouseButtonRight` | the right mouse button | +| `mouseButtonX1` | the X1 mouse button | +| `mouseButtonX2` | the X2 mouse button | - -=====Keyboard Codes===== + +## Keyboard Codes -| Keycode | Description | -|-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 0 | | -| 1 | | -| 2 | | -| 3 | | -| 4 | | -| 5 | | -| 6 | | -| 7 | | -| 8 | | -| 9 | | -| A | | -| AC Back | the Back key (application control keypad) | -| AC Bookmarks | the Bookmarks key (application control keypad) | -| AC Forward | the Forward key (application control keypad) | -| AC Home | the Home key (application control keypad) | -| AC Refresh | the Refresh key (application control keypad) | -| AC Search | the Search key (application control keypad) | -| AC Stop | the Stop key (application control keypad) | -| Again | the Again key (Redo) | -| AltErase | Erase-Eaze | -| ' | | -| Application | the Application / Compose / Context Menu (Windows) key | -| AudioMute | the Mute volume key | -| AudioNext | the Next Track media key | -| AudioPlay | the Play media key | -| AudioPrev | the Previous Track media key | -| AudioStop | the Stop media key) | -| B | | -| \\ | Located at the lower left of the return key on ISO keyboards and at the right end of the QWERTY row on ANSI keyboards. Produces REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US layout, REVERSE SOLIDUS and VERTICAL LINE in a UK Mac layout, NUMBER SIGN and TILDE in a UK Windows layout, DOLLAR SIGN and POUND SIGN in a Swiss German layout, NUMBER SIGN and APOSTROPHE in a German layout, GRAVE ACCENT and POUND SIGN in a French Mac layout, and ASTERISK and MICRO SIGN in a French Windows layout. | -| Backspace | | -| BrightnessDown | the Brightness Down key | -| BrightnessUp | the Brightness Up key | -| C | | -| Calculator | the Calculator key | -| Cancel | | -| CapsLock | | -| Clear | | -| Clear / Again | | -| , | | -| Computer | the My Computer key | -| Copy | | -| CrSel | | -| CurrencySubUnit | the Currency Subunit key | -| CurrencyUnit | the Currency Unit key | -| Cut | | -| D | | -| DecimalSeparator | the Decimal Separator key | -| Delete | | -| DisplaySwitch | display mirroring/dual display switch, video mode switch | -| Down | the Down arrow key (navigation keypad) | -| E | | -| Eject | the Eject key | -| End | | -| = | | -| Escape | the Esc key | -| Execute | | -| ExSel | | -| F | | -| F1 | | -| F10 | | -| F11 | | -| F12 | | -| F13 | | -| F14 | | -| F15 | | -| F16 | | -| F17 | | -| F18 | | -| F19 | | -| F2 | | -| F20 | | -| F21 | | -| F22 | | -| F23 | | -| F24 | | -| F3 | | -| F4 | | -| F5 | | -| F6 | | -| F7 | | -| F8 | | -| F9 | | -| Find | | -| G | | -| \` | Located in the top left corner (on both ANSI and ISO keyboards). Produces GRAVE ACCENT and TILDE in a US Windows layout and in US and UK Mac layouts on ANSI keyboards, GRAVE ACCENT and NOT SIGN in a UK Windows layout, SECTION SIGN and PLUS-MINUS SIGN in US and UK Mac layouts on ISO keyboards, SECTION SIGN and DEGREE SIGN in a Swiss German layout (Mac: only on ISO keyboards), CIRCUMFLEX ACCENT and DEGREE SIGN in a German layout (Mac: only on ISO keyboards), SUPERSCRIPT TWO and TILDE in a French Windows layout, COMMERCIAL AT and NUMBER SIGN in a French Mac layout on ISO keyboards, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French Mac layout on ANSI keyboards. | -| H | | -| Help | | -| Home | | -| I | | -| Insert | insert on PC, help on some Mac keyboards (but does send code 73, not 117) | -| J | | -| K | | -| KBDIllumDown | the Keyboard Illumination Down key | -| KBDIllumToggle | the Keyboard Illumination Toggle key | -| KBDIllumUp | the Keyboard Illumination Up key | -| Keypad 0 | the 0 key (numeric keypad) | -| Keypad 00 | the 00 key (numeric keypad) | -| Keypad 000 | the 000 key (numeric keypad) | -| Keypad 1 | the 1 key (numeric keypad) | -| Keypad 2 | the 2 key (numeric keypad) | -| Keypad 3 | the 3 key (numeric keypad) | -| Keypad 4 | the 4 key (numeric keypad) | -| Keypad 5 | the 5 key (numeric keypad) | -| Keypad 6 | the 6 key (numeric keypad) | -| Keypad 7 | the 7 key (numeric keypad) | -| Keypad 8 | the 8 key (numeric keypad) | -| Keypad 9 | the 9 key (numeric keypad) | -| Keypad A | the A key (numeric keypad) | -| Keypad & | the & key (numeric keypad) | -| Keypad @ | the @ key (numeric keypad) | -| Keypad B | the B key (numeric keypad) | -| Keypad Backspace | the Backspace key (numeric keypad) | -| Keypad Binary | the Binary key (numeric keypad) | -| Keypad C | the C key (numeric keypad) | -| Keypad Clear | the Clear key (numeric keypad) | -| Keypad ClearEntry | the Clear Entry key (numeric keypad) | -| Keypad : | the : key (numeric keypad) | -| Keypad , | the Comma key (numeric keypad) | -| Keypad D | the D key (numeric keypad) | -| Keypad && | the && key (numeric keypad) | -| \\\| | \\\| key (numeric keypad) | -| Keypad Decimal | the Decimal key (numeric keypad) | -| Keypad / | the / key (numeric keypad) | -| Keypad E | the E key (numeric keypad) | -| Keypad Enter | the Enter key (numeric keypad) | -| Keypad = | the = key (numeric keypad) | -| Keypad = (AS400) | the Equals AS400 key (numeric keypad) | -| Keypad ! | the ! key (numeric keypad) | -| Keypad F | the F key (numeric keypad) | -| Keypad \> | the Greater key (numeric keypad) | -| Keypad # | the # key (numeric keypad) | -| Keypad Hexadecimal | the Hexadecimal key (numeric keypad) | -| Keypad { | the Left Brace key (numeric keypad) | -| Keypad ( | the Left Parenthesis key (numeric keypad) | -| Keypad \< | the Less key (numeric keypad) | -| Keypad MemAdd | the Mem Add key (numeric keypad) | -| Keypad MemClear | the Mem Clear key (numeric keypad) | -| Keypad MemDivide | the Mem Divide key (numeric keypad) | -| Keypad MemMultiply | the Mem Multiply key (numeric keypad) | -| Keypad MemRecall | the Mem Recall key (numeric keypad) | -| Keypad MemStore | the Mem Store key (numeric keypad) | -| Keypad MemSubtract | the Mem Subtract key (numeric keypad) | -| Keypad - | the - key (numeric keypad) | -| Keypad \\\* | the \\\* key (numeric keypad) | -| Keypad Octal | the Octal key (numeric keypad) | -| Keypad % | the Percent key (numeric keypad) | -| Keypad . | the . key (numeric keypad) | -| Keypad + | the + key (numeric keypad) | -| Keypad +/- | the +/- key (numeric keypad) | -| Keypad ^ | the Power key (numeric keypad) | -| Keypad } | the Right Brace key (numeric keypad) | -| Keypad ) | the Right Parenthesis key (numeric keypad) | -| Keypad Space | the Space key (numeric keypad) | -| Keypad Tab | the Tab key (numeric keypad) | -| key (numeric keypad) | | -| Keypad XOR | the XOR key (numeric keypad) | -| L | | -| Left Alt | alt, option | -| Left Ctrl | | -| Left | the Left arrow key (navigation keypad) | -| \[ | | -| Left GUI | windows, command (apple), meta | -| Left Shift | | -| M | | -| Mail | the Mail/eMail key | -| MediaSelect | the Media Select key | -| Menu | | -| \- | | -| ModeSwitch | I'm not sure if this is really not covered by any of the above, but since there's a special KMOD_MODE for it I'm adding it here | -| Mute | | -| N | | -| Numlock | the Num Lock key (PC) / the Clear key (Mac) | -| O | | -| Oper | | -| Out | | -| P | | -| PageDown | | -| PageUp | | -| Paste | | -| Pause the Pause / Break key | | -| . | | -| Power | The USB document says this is a status flag, not a physical key - but some Mac keyboards do have a power key. | -| PrintScreen | | -| Prior | | -| Q | | -| R | | -| Right Alt | alt gr, option | -| Right Ctrl | | -| Return | the Enter key (main keyboard) | -| Return | | -| Right GUI | windows, command (apple), meta | -| Right | the Right arrow key (navigation keypad) | -| \] | | -| Right Shift | | -| S | | -| ScrollLock | | -| Select | | -| ; | | -| Separator | | -| / | | -| Sleep | the Sleep key | -| Space | the Space Bar key(s) | -| Stop | | -| SysReq | the SysReq key | -| T | | -| Tab | the Tab key | -| ThousandsSeparator | the Thousands Separator key | -| U | | -| Undo | | -| Up | the Up arrow key (navigation keypad) | -| V | | -| VolumeDown | | -| VolumeUp | | -| W | | -| WWW | the WWW/World Wide Web key | -| X | | -| Y | | -| Z | | -| # | ISO USB keyboards actually use this code instead of 49 for the same key, but all OSes I've seen treat the two codes identically. So, as an implementor, unless your keyboard generates both of those codes and your OS treats them differently, you should generate SDL_SCANCODE_BACKSLASH instead of this code. As a user, you should not rely on this code because SDL will never generate it with most (all?) keyboards. | -| & | | -| \* | | -| @ | | -| ^ | | -| : | | -| $ | | -| ! | | -| \> | | -| # | | -| ( | | -| \< | | -| % | | -| \+ | | -| ? | | -| ) | | -| \_ | | +| Keycode | Description | +|---------|-------------| +| 0 | | +| 1 | | +| 2 | | +| 3 | | +| 4 | | +| 5 | | +| 6 | | +| 7 | | +| 8 | | +| 9 | | +| A | | +| AC Back | the Back key (application control keypad) | +| AC Bookmarks | the Bookmarks key (application control keypad) | +| AC Forward | the Forward key (application control keypad) | +| AC Home | the Home key (application control keypad) | +| AC Refresh | the Refresh key (application control keypad) | +| AC Search | the Search key (application control keypad) | +| AC Stop | the Stop key (application control keypad) | +| Again | the Again key (Redo) | +| AltErase | Erase-Eaze | +| ' | | +| Application | the Application / Compose / Context Menu (Windows) key | +| AudioMute | the Mute volume key | +| AudioNext | the Next Track media key | +| AudioPlay | the Play media key | +| AudioPrev | the Previous Track media key | +| AudioStop | the Stop media key) | +| B | | +| \\ | Located at the lower left of the return key on ISO keyboards and at the right end of the QWERTY row on ANSI keyboards. Produces REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US layout, REVERSE SOLIDUS and VERTICAL LINE in a UK Mac layout, NUMBER SIGN and TILDE in a UK Windows layout, DOLLAR SIGN and POUND SIGN in a Swiss German layout, NUMBER SIGN and APOSTROPHE in a German layout, GRAVE ACCENT and POUND SIGN in a French Mac layout, and ASTERISK and MICRO SIGN in a French Windows layout. | +| Backspace | | +| BrightnessDown | the Brightness Down key | +| BrightnessUp | the Brightness Up key | +| C | | +| Calculator | the Calculator key | +| Cancel | | +| CapsLock | | +| Clear | | +| Clear / Again | | +| , | | +| Computer | the My Computer key | +| Copy | | +| CrSel | | +| CurrencySubUnit | the Currency Subunit key | +| CurrencyUnit | the Currency Unit key | +| Cut | | +| D | | +| DecimalSeparator | the Decimal Separator key | +| Delete | | +| DisplaySwitch | display mirroring/dual display switch, video mode switch | +| Down | the Down arrow key (navigation keypad) | +| E | | +| Eject | the Eject key | +| End | | +| = | | +| Escape | the Esc key | +| Execute | | +| ExSel | | +| F | | +| F1 | | +| F10 | | +| F11 | | +| F12 | | +| F13 | | +| F14 | | +| F15 | | +| F16 | | +| F17 | | +| F18 | | +| F19 | | +| F2 | | +| F20 | | +| F21 | | +| F22 | | +| F23 | | +| F24 | | +| F3 | | +| F4 | | +| F5 | | +| F6 | | +| F7 | | +| F8 | | +| F9 | | +| Find | | +| G | | +| \` | Located in the top left corner (on both ANSI and ISO keyboards). Produces GRAVE ACCENT and TILDE in a US Windows layout and in US and UK Mac layouts on ANSI keyboards, GRAVE ACCENT and NOT SIGN in a UK Windows layout, SECTION SIGN and PLUS-MINUS SIGN in US and UK Mac layouts on ISO keyboards, SECTION SIGN and DEGREE SIGN in a Swiss German layout (Mac: only on ISO keyboards), CIRCUMFLEX ACCENT and DEGREE SIGN in a German layout (Mac: only on ISO keyboards), SUPERSCRIPT TWO and TILDE in a French Windows layout, COMMERCIAL AT and NUMBER SIGN in a French Mac layout on ISO keyboards, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French Mac layout on ANSI keyboards. | +| H | | +| Help | | +| Home | | +| I | | +| Insert | insert on PC, help on some Mac keyboards (but does send code 73, not 117) | +| J | | +| K | | +| KBDIllumDown | the Keyboard Illumination Down key | +| KBDIllumToggle | the Keyboard Illumination Toggle key | +| KBDIllumUp | the Keyboard Illumination Up key | +| Keypad 0 | the 0 key (numeric keypad) | +| Keypad 00 | the 00 key (numeric keypad) | +| Keypad 000 | the 000 key (numeric keypad) | +| Keypad 1 | the 1 key (numeric keypad) | +| Keypad 2 | the 2 key (numeric keypad) | +| Keypad 3 | the 3 key (numeric keypad) | +| Keypad 4 | the 4 key (numeric keypad) | +| Keypad 5 | the 5 key (numeric keypad) | +| Keypad 6 | the 6 key (numeric keypad) | +| Keypad 7 | the 7 key (numeric keypad) | +| Keypad 8 | the 8 key (numeric keypad) | +| Keypad 9 | the 9 key (numeric keypad) | +| Keypad A | the A key (numeric keypad) | +| Keypad & | the & key (numeric keypad) | +| Keypad @ | the @ key (numeric keypad) | +| Keypad B | the B key (numeric keypad) | +| Keypad Backspace | the Backspace key (numeric keypad) | +| Keypad Binary | the Binary key (numeric keypad) | +| Keypad C | the C key (numeric keypad) | +| Keypad Clear | the Clear key (numeric keypad) | +| Keypad ClearEntry | the Clear Entry key (numeric keypad) | +| Keypad : | the : key (numeric keypad) | +| Keypad , | the Comma key (numeric keypad) | +| Keypad D | the D key (numeric keypad) | +| Keypad && | the && key (numeric keypad) | +| \\\| | \\\| key (numeric keypad) | +| Keypad Decimal | the Decimal key (numeric keypad) | +| Keypad / | the / key (numeric keypad) | +| Keypad E | the E key (numeric keypad) | +| Keypad Enter | the Enter key (numeric keypad) | +| Keypad = | the = key (numeric keypad) | +| Keypad = (AS400) | the Equals AS400 key (numeric keypad) | +| Keypad ! | the ! key (numeric keypad) | +| Keypad F | the F key (numeric keypad) | +| Keypad \> | the Greater key (numeric keypad) | +| Keypad # | the # key (numeric keypad) | +| Keypad Hexadecimal | the Hexadecimal key (numeric keypad) | +| Keypad { | the Left Brace key (numeric keypad) | +| Keypad ( | the Left Parenthesis key (numeric keypad) | +| Keypad \< | the Less key (numeric keypad) | +| Keypad MemAdd | the Mem Add key (numeric keypad) | +| Keypad MemClear | the Mem Clear key (numeric keypad) | +| Keypad MemDivide | the Mem Divide key (numeric keypad) | +| Keypad MemMultiply | the Mem Multiply key (numeric keypad) | +| Keypad MemRecall | the Mem Recall key (numeric keypad) | +| Keypad MemStore | the Mem Store key (numeric keypad) | +| Keypad MemSubtract | the Mem Subtract key (numeric keypad) | +| Keypad - | the - key (numeric keypad) | +| Keypad \\\* | the \\\* key (numeric keypad) | +| Keypad Octal | the Octal key (numeric keypad) | +| Keypad % | the Percent key (numeric keypad) | +| Keypad . | the . key (numeric keypad) | +| Keypad + | the + key (numeric keypad) | +| Keypad +/- | the +/- key (numeric keypad) | +| Keypad ^ | the Power key (numeric keypad) | +| Keypad } | the Right Brace key (numeric keypad) | +| Keypad ) | the Right Parenthesis key (numeric keypad) | +| Keypad Space | the Space key (numeric keypad) | +| Keypad Tab | the Tab key (numeric keypad) | +| key (numeric keypad) | | +| Keypad XOR | the XOR key (numeric keypad) | +| L | | +| Left Alt | alt, option | +| Left Ctrl | | +| Left | the Left arrow key (navigation keypad) | +| \[ | | +| Left GUI | windows, command (apple), meta | +| Left Shift | | +| M | | +| Mail | the Mail/eMail key | +| MediaSelect | the Media Select key | +| Menu | | +| \- | | +| ModeSwitch | I'm not sure if this is really not covered by any of the above, but since there's a special KMOD_MODE for it I'm adding it here | +| Mute | | +| N | | +| Numlock | the Num Lock key (PC) / the Clear key (Mac) | +| O | | +| Oper | | +| Out | | +| P | | +| PageDown | | +| PageUp | | +| Paste | | +| Pause the Pause / Break key | | +| . | | +| Power | The USB document says this is a status flag, not a physical key - but some Mac keyboards do have a power key. | +| PrintScreen | | +| Prior | | +| Q | | +| R | | +| Right Alt | alt gr, option | +| Right Ctrl | | +| Return | the Enter key (main keyboard) | +| Return | | +| Right GUI | windows, command (apple), meta | +| Right | the Right arrow key (navigation keypad) | +| \] | | +| Right Shift | | +| S | | +| ScrollLock | | +| Select | | +| ; | | +| Separator | | +| / | | +| Sleep | the Sleep key | +| Space | the Space Bar key(s) | +| Stop | | +| SysReq | the SysReq key | +| T | | +| Tab | the Tab key | +| ThousandsSeparator | the Thousands Separator key | +| U | | +| Undo | | +| Up | the Up arrow key (navigation keypad) | +| V | | +| VolumeDown | | +| VolumeUp | | +| W | | +| WWW | the WWW/World Wide Web key | +| X | | +| Y | | +| Z | | +| # | ISO USB keyboards actually use this code instead of 49 for the same key, but all OSes I've seen treat the two codes identically. So, as an implementor, unless your keyboard generates both of those codes and your OS treats them differently, you should generate SDL_SCANCODE_BACKSLASH instead of this code. As a user, you should not rely on this code because SDL will never generate it with most (all?) keyboards. | +| & | | +| \* | | +| @ | | +| ^ | | +| : | | +| $ | | +| ! | | +| \> | | +| # | | +| ( | | +| \< | | +| % | | +| \+ | | +| ? | | +| ) | | +| \_ | | These codes were taken from From 6a545ce025f2e94a2916ae98512a228b30371c48 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 15:57:40 +0100 Subject: [PATCH 23/91] Update CONTROLS.md --- docs/CONTROLS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/CONTROLS.md b/docs/CONTROLS.md index b5cae9c05..96a1253ac 100644 --- a/docs/CONTROLS.md +++ b/docs/CONTROLS.md @@ -51,6 +51,8 @@ Most users will want to use these keys to move around a build | `prevPlaylist` | Switches to the previous playlist. | | `nextPlaylist` | Switches to the next playlist. | | `cyclePlaylist` | Switches to the next playlist in the cyclePlaylist set. Still functional, but has been replaced by nextCyclePlaylist. | +| `prevCycleCollection` | Switches to the previous playlist in the cycleCollection set. | +| `cycleCollection` | Switches to the next playlist in the cycleCollection set. | ### Jukebox Mode These keys are used to define jukebox controls when RetroFE operates in a jukebox environment @@ -95,9 +97,7 @@ These keys are used to define button combos with two keycodes. The first value d | `menu` | | | `saveFirstPlaylist` | | -| `quickPlaylist` | | -| `cycleCollection` | | -| `prevCycleCollection` | | +| `quickPlaylist` | | ## Gamepad/Joystick codes From c4533dc6a9605db5686fae6910bcbf6b9ad996b0 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:02:03 +0100 Subject: [PATCH 24/91] Add new source files to Xcode project --- RetroFE/xcode/retrofe.xcodeproj/project.pbxproj | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/RetroFE/xcode/retrofe.xcodeproj/project.pbxproj b/RetroFE/xcode/retrofe.xcodeproj/project.pbxproj index 7cddfdb1b..b3647187a 100644 --- a/RetroFE/xcode/retrofe.xcodeproj/project.pbxproj +++ b/RetroFE/xcode/retrofe.xcodeproj/project.pbxproj @@ -60,6 +60,7 @@ DF07B3E52B2A14CE00B732CF /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF07B3E42B2A14CE00B732CF /* GStreamer.framework */; }; DF07B3E62B2A14CE00B732CF /* GStreamer.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DF07B3E42B2A14CE00B732CF /* GStreamer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DF2B282E2B683F2E00A22011 /* GlobalOpts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2B282C2B683F2E00A22011 /* GlobalOpts.cpp */; }; + DF2FCF8C2DC90A080077B107 /* AmbientMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FCF8B2DC90A080077B107 /* AmbientMode.cpp */; }; DF87A17A2B152AAB00548E78 /* RetroFE.png in Resources */ = {isa = PBXBuildFile; fileRef = DF87A1792B152AA400548E78 /* RetroFE.png */; }; DFC83C8A2D57973600AA7522 /* webp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DFC83C882D57973600AA7522 /* webp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DFC83C8B2D57973600AA7522 /* libusb-1.0.0.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DFC83C892D57973600AA7522 /* libusb-1.0.0.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; @@ -186,6 +187,8 @@ DF07B3E42B2A14CE00B732CF /* GStreamer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GStreamer.framework; path = ../ThirdPartyMac/GStreamer.framework; sourceTree = SOURCE_ROOT; }; DF2B282C2B683F2E00A22011 /* GlobalOpts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GlobalOpts.cpp; path = Database/GlobalOpts.cpp; sourceTree = SOURCE_ROOT; }; DF2B282D2B683F2E00A22011 /* GlobalOpts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GlobalOpts.h; path = Database/GlobalOpts.h; sourceTree = SOURCE_ROOT; }; + DF2FCF8B2DC90A080077B107 /* AmbientMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AmbientMode.cpp; path = Execute/AmbientMode.cpp; sourceTree = ""; }; + DF2FCF8D2DC90A120077B107 /* AmbientMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AmbientMode.h; path = Execute/AmbientMode.h; sourceTree = ""; }; DF5A44672DABDD0B005892D0 /* versioning.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = versioning.h; path = autogen/versioning.h; sourceTree = ""; }; DF87A1792B152AA400548E78 /* RetroFE.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RetroFE.png; path = ../../Package/Environment/Common/RetroFE.png; sourceTree = ""; }; DFC83C862D5796C400AA7522 /* CollectionInfoBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CollectionInfoBuilder.cpp; path = Collection/CollectionInfoBuilder.cpp; sourceTree = SOURCE_ROOT; }; @@ -268,6 +271,7 @@ 4C418535FD0A487485FDF907 /* Header Files */ = { isa = PBXGroup; children = ( + DF2FCF8D2DC90A120077B107 /* AmbientMode.h */, 7FD09C6A782A4B69B37697F1 /* Animation.h */, 90AC9A42897248FB8AB8E13D /* AnimationEvents.h */, D32E8F4A73994068B6107132 /* AttractMode.h */, @@ -368,7 +372,7 @@ F1EBF96675C5443E881F32F0 /* Source Files */ = { isa = PBXGroup; children = ( - DFC83C9C2D579D7F00AA7522 /* VideoPool.cpp */, + DF2FCF8B2DC90A080077B107 /* AmbientMode.cpp */, 265E7B256A954D8793198331 /* Animation.cpp */, F7BFDD750A8D4FD2BD04E3E8 /* AnimationEvents.cpp */, C10786B3822040D9BB915594 /* AttractMode.cpp */, @@ -419,6 +423,7 @@ 5C2402E96D2D400793F40054 /* VideoBuilder.cpp */, F83482D74B334D73A7832224 /* VideoComponent.cpp */, A1A2A509107048D78E451632 /* VideoFactory.cpp */, + DFC83C9C2D579D7F00AA7522 /* VideoPool.cpp */, 4AE8BEDF614B479688422071 /* ViewInfo.cpp */, F916B85C7BF943D3AD1C1864 /* CollectionInfoBuilder.cpp */, ); @@ -545,6 +550,7 @@ DFC83C9D2D579D7F00AA7522 /* VideoPool.cpp in Sources */, 9E952B425AE5418FBE7740DF /* VideoComponent.cpp in Sources */, 8500F0A27BE443418BC27E80 /* ComponentItemBinding.cpp in Sources */, + DF2FCF8C2DC90A080077B107 /* AmbientMode.cpp in Sources */, 8DB049BC5D5241F48A59212D /* ComponentItemBindingBuilder.cpp in Sources */, 66790A464AE144839DE62066 /* Font.cpp in Sources */, FEC7E2567C954EC295AC1C94 /* FontCache.cpp in Sources */, From 31622df07956a5984414adf028f2dfe98b74670a Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:02:21 +0100 Subject: [PATCH 25/91] Account for macOS SDL include discrepancies --- RetroFE/Source/Execute/AmbientMode.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/RetroFE/Source/Execute/AmbientMode.h b/RetroFE/Source/Execute/AmbientMode.h index 34baa46d4..e7ff8d043 100644 --- a/RetroFE/Source/Execute/AmbientMode.h +++ b/RetroFE/Source/Execute/AmbientMode.h @@ -7,7 +7,13 @@ #include #include #include "../SDL.h" -#include "SDL_image.h" +#if __has_include() + #include +#elif __has_include() + #include +#else + #error "Cannot find SDL_image header" +#endif #include "../Utility/Log.h" #include "../Utility/Utils.h" #include "../Control/UserInput.h" @@ -29,4 +35,4 @@ class AmbientMode { std::vector imageFiles_; std::vector marqueeImageFiles_; int minutesPerImage_; -}; \ No newline at end of file +}; From 91dd3c9913b2e2cafbf6e6f850d7ad52f14973e0 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:09:46 +0100 Subject: [PATCH 26/91] Update GETTING_STARTED.md --- docs/GETTING_STARTED.md | 153 +++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 87 deletions(-) diff --git a/docs/GETTING_STARTED.md b/docs/GETTING_STARTED.md index 901e41457..2ef3ae85b 100644 --- a/docs/GETTING_STARTED.md +++ b/docs/GETTING_STARTED.md @@ -1,115 +1,94 @@ # Getting Started [Back](README.md) - + Getting started with RetroFE is as simple as following these steps: -1. Download RetroFE for your Desktop OS -2. Edit the [global settings.conf](global settings.conf) file. -3. Edit the [controls.conf](CONTROLS.md) file. -4. Run RetroFE to verify if the front-end loads (and exits) correctly. -5. Edit/add/delete [collections](COLLECTIONS.md). -6. Re-run RetroFE +1. Download RetroFE for your OS. +2. Edit the [global settings.conf](GLOBAL_SETTINGS.md) file. +3. Configure your [controls.conf](CONTROLS.md) file. +4. Run RetroFE to ensure the frontend loads and exits correctly. +5. Add, edit, or delete [collections](COLLECTIONS.md). +6. Re-run RetroFE to check everything works. - -## RetroFE Root Directory Structure +## RetroFE Root Directory Structure | File / Folder | Description | -|---------------------------------------|----------------------------------------------------------------------------------| -| [controls.conf](CONTROLS.md) | Controller configuration (up, down, select, back, etc) | -| log.txt | Log output | -| meta.db | Game (information database year, manufacturer, genre, #players, etc) | -| RetroFE.lnk/AppImage/app/retrofe | RetroFE executable | -| [settings.conf](GLOBAL_SETTINGS.md) | Global frontend settings (display options, layout to use, base paths, etc) | -| /collections/ | Game lists, menus, artwork and ROMs | -| /core/ | Windows specific libraries needed for retrofe to run (also includes retrofe.exe) | -| /launchers/ | Configuration files for launchers (emulators) | -| /layouts/ | Layouts / themes to use or display for the frontend | -| /meta/ | Files to import into meta.db (for scraping) | - - - -# Detailed Setup Guide - - -## Installation +|---------------|-------------| +| `controls.conf` | Controller definition (e.g. up, down, select, back) | +| `log.txt` | Log output | +| `meta.db` | Game database (year, manufacturer, genre, players, etc.) | +| `RetroFE.{lnk/AppImage/app}` | RetroFE executable | +| `settings.conf` | Global settings (display options, layout, base paths, etc.) | +| `/collections/` | Game lists, menus, artwork, and ROMs | +| `/retrofe/` | Windows-specific libraries needed for RetroFE to run (includes retrofe.exe) | +| `/launchers/` | Configuration files for launchers (emulators) | +| `/layouts/` | Themes/layouts for the frontend | +| `/meta/` | Files to import into meta.db | -(Note for linux users: Since Linux comes in many shapes and sizes, -RetroFE users need to compile and install their own RetroFE setup using -bitbucket. The instructions for this can be found -[here](https://bitbucket.org/phulshof/retrofe/overview).) -After copying the RetroFE system to the directory of your choice, you're -set to give your installation a first test by running the retrofe -executable in that directory. RetroFE comes with a pre-installed Sega -Genesis system with one game so you can check if the installation went -according to plan. +# Detailed Setup Guide +## Installation +Once you've copied RetroFE to your chosen directory, you can test the installation by running the `retrofe` executable. RetroFE comes with a pre-installed Sega Genesis system, which includes a single game for your first test. - ## Configuration +### Step 1: Edit the Global Settings +The first configuration step involves editing the global settings file: +`settings.conf`. +This file defines your screen settings, global theme, base paths, and other system-wide settings. -The first configuration step is editing the RetroFE system configuration -file RetroFE/[settings.conf](GLOBAL_SETTINGS.md). In here you -configure the screen settings, global theme, base paths, etc. - -The second configuration step is editing the RetroFE controls file -RetroFE/[controls.conf](CONTROLS.md). In here you configure the keys used -to control the RetroFE front-end. Note that the default select key is -space, and not enter as some people expected. - - -## Adding Collections - -RetroFE starts with two (almost empty) [collections](COLLECTIONS.md), but -more can be added easily. As an example, let's set up the Nintendo -Entertainment System collection. First, enter the RetroFE/collections -directory, and create an empty collection using the following command: -../retrofe -createcollection "Nintendo Entertainment System" +### Step 2: Configure the Controls +The second step is to edit the `controls.conf` file to define the controls for your front-end. By default, the "select" key is space, not enter as some might expect. -Next we add the roms and artwork: +--- -Download a NES romset from your favourite source, and place the roms in -the RetroFE/collections/Nintendo Entertainment System/roms directory. -Download a device image, logo, and video for the system, and place the -device.png, logo.png, and video.mp4 files in the -RetroFE/collections/Nintendo Entertainment System/system_artwork -directory. Download games artwork (artwork_front, logo's, screenshots, -titleshots, videos, etc.) from your favourite art source, and place them -in the RetroFE/collections/Nintendo Entertainment System/medium_artwork -directory. +## Adding Collections +RetroFE starts with two basic [collections](COLLECTIONS.md), but you can easily add more. For example, let's set up the **Nintendo Entertainment System (NES)** collection: -Now we configure the new system by editing RetroFE/collections/Nintendo -Entertainment System/settings.conf. If you stick to the default -directory structure, this file can be extremely simple: +1. **Create a new collection**: + - Navigate to the `RetroFE/collections` directory. + - Run the following command to create the collection: + `../retrofe -createcollection "Nintendo Entertainment System"` - list.extensions = nes +2. **Add ROMs and artwork**: + - Download a NES ROM set and place the ROMs in: + `RetroFE/collections/Nintendo Entertainment System/roms` + - Download the system artwork (e.g., device image, logo, and video) and place them in: + `RetroFE/collections/Nintendo Entertainment System/system_artwork` + - Download game-specific artwork (e.g., front artwork, logos, screenshots) and place them in: + `RetroFE/collections/Nintendo Entertainment System/medium_artwork` - launcher = NES +3. **Configure the new collection**: + - Edit the **RetroFE/collections/Nintendo Entertainment System/settings.conf** file to match the following: -The first line defines the ROM file extention as .nes; this should match -the file extentions in your RetroFE/collections/Nintendo Entertainment -System/roms directory. The second line defines the name of the launcher -used for this collection. Before the collection can be used, this -launcher needs to be configured: + ```ini + list.extensions = nes + launcher = NES + ``` -Edit the RetroFE/launchers/NES.conf (matching the launcher name defined -in the settings.conf) file. I'm currently using MAME 0.162 for this -purpose, so the launcher can be simple: + The first line defines the ROM file extension as `.nes`, which should match the ROM files in the `/roms` directory. The second line sets the launcher for this collection (in this case, "NES"). - executable = mame +4. **Configure the launcher**: + - Edit the **RetroFE/launchers/NES.conf** file to define the launcher. For example, using MAME 0.162: - arguments = nes -cart "%ITEM_FILEPATH%" + ```ini + executable = mame + arguments = nes -cart "%ITEM_FILEPATH%" + ``` -As an example: if RetroFE starts the game Willow (USA).nes, this -launcher will execute the command: + This configuration launches the game using the command: + `mame nes -cart "collections/Nintendo Entertainment System/roms/Willow (USA).nes"` - mame nes -cart "collections/Nintendo Entertainment System/roms/Willow (USA).nes". +5. **Add the collection to the main menu**: + - Edit the **RetroFE/collections/Main/menu.txt** file to include the new collection. Add the following line: -The last step is to add the newly created collection to the main menu by -editing RetroFE/collections/Main/menu.txt, and add the following line: + ```plaintext + Nintendo Entertainment System + ``` - Nintendo Entertainment System +6. **Test the collection**: + - After making all changes, test your newly added collection by running the **retrofe** executable: + `RetroFE/retrofe` -When this is done, your newly added collection is ready for testing by -running the retrofe executable RetroFE/retrofe. +--- [Back](README.md) From d67de08412425c94fb5c6c2cff165c9534a8d3b3 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:13:32 +0100 Subject: [PATCH 27/91] Update CONTROLS.md --- docs/CONTROLS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CONTROLS.md b/docs/CONTROLS.md index 96a1253ac..fb8f97ce5 100644 --- a/docs/CONTROLS.md +++ b/docs/CONTROLS.md @@ -97,7 +97,7 @@ These keys are used to define button combos with two keycodes. The first value d | `menu` | | | `saveFirstPlaylist` | | -| `quickPlaylist` | | +| `quickPlaylist` | Jumps to playlist defined at /collections/*/quicklist | ## Gamepad/Joystick codes From 9e55a4fc0588e42f41874a0fe50026b61d332062 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:23:20 +0100 Subject: [PATCH 28/91] Update README.md --- docs/README.md | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5a11adcb5..9b896425c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,13 +12,42 @@ additional artwork like video, box art, screenshots, etc. # Index -- [1. Getting Started](GETTING_STARTED.md) -- [2. Global Settings](GLOBAL_SETTINGS.md) -- [3. Controls (Keyboard/Gamepad)](CONTROLS.md) -- [4. Collections](COLLECTIONS.md) -- [5. Collection Settings](SETTINGS.md) -- [6. Launchers](LAUNCHERS.md) -- [7. General Layout Structure](PLAYGROUND.md) -- [8. Layouts](LAYOUTS.md) -- [9. Meta information](META_INFORMATION.md) +- [. Getting Started](GETTING_STARTED.md) +- [. Creating a Basic RetroFE Environment](HOW_TO.md) +- [. Global Settings](GLOBAL_SETTINGS.md) +- [. Command Line Interface](CLI.md) +- [. Controls (Keyboard/Gamepad)](CONTROLS.md) +- [. Collections](COLLECTIONS.md) +- [. Collection Settings](SETTINGS.md) +- [. Launchers](LAUNCHERS.md) +- [. General Layout Structure](PLAYGROUND.md) +- [. Layouts](LAYOUTS.md) +- [. Meta information](META_INFORMATION.md) +# These are just dev notes I needed to put somewhere +``` +Global Configuration + controls.conf + settings.conf + +Collections + Roms + Artwork + Game Information + Launcher Overrides + +Controls + Gamepad + Mouse + +Launchers + Windows + Linux + macOS + Start and Exit Scripts + +Additional Features + Jukebox + Music Player + Hiscores via hi2txt +``` \ No newline at end of file From 4ff2c6fe13e20f675b3851cb3133bdee9ec490e0 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:26:27 +0100 Subject: [PATCH 29/91] Create ADDITIONAL_FEATURES.md --- docs/ADDITIONAL_FEATURES.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/ADDITIONAL_FEATURES.md diff --git a/docs/ADDITIONAL_FEATURES.md b/docs/ADDITIONAL_FEATURES.md new file mode 100644 index 000000000..133842885 --- /dev/null +++ b/docs/ADDITIONAL_FEATURES.md @@ -0,0 +1,4 @@ +# Additional Features +[Back](README.md) + +Overtime RetroFE's need for extra features has grown due to community demand and due to the nature of open source, every line can be changed. \ No newline at end of file From 1368602de4fd31db7028fd2f592b5aa893a25b15 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:26:29 +0100 Subject: [PATCH 30/91] Create HOW_TO.md --- docs/HOW_TO.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/HOW_TO.md diff --git a/docs/HOW_TO.md b/docs/HOW_TO.md new file mode 100644 index 000000000..e69de29bb From 9b155bc5549bb91cf79c07e8b2079a12580914dd Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 16:43:52 +0100 Subject: [PATCH 31/91] Update ADDITIONAL_FEATURES.md --- docs/ADDITIONAL_FEATURES.md | 48 ++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/docs/ADDITIONAL_FEATURES.md b/docs/ADDITIONAL_FEATURES.md index 133842885..1e3201d3d 100644 --- a/docs/ADDITIONAL_FEATURES.md +++ b/docs/ADDITIONAL_FEATURES.md @@ -1,4 +1,50 @@ # Additional Features [Back](README.md) -Overtime RetroFE's need for extra features has grown due to community demand and due to the nature of open source, every line can be changed. \ No newline at end of file +Overtime RetroFE's need for extra features has grown due to community demand and due to the nature of open source, every line can be changed. + +## Ambient Mode +### Why and What + +Ambient Mode allows your arcade cabinet to assume a low-key presence in a room. For example, in a living room setting, you might not want the cabinet to be a focal point all the time. Ambient Mode allows the cabinet to recede to the background without powering it all the way off. + +Essentially, Ambient Mode acts as a screensaver, but instead of the typical "screensaver" functionality (which is already used elsewhere in the project and pulls its artwork from the `/collections` folder), it provides a visually engaging backdrop without disrupting the system. + +When enabled: + +The `quitCombo` controller combo button will go to ambient mode instead of exiting RetroFE. +While in ambient mode, images from the `/ambient`directory will be displayed on the main screen, and rotated periodically +To exit ambient mode, the controller combo button OR the action button will return you to the main RetroFE menu. + +### Configuration +To set up Ambient Mode + +- Create a Directory + - Create a directory named `/ambient` in the RetroFE root directory. + - Populate the `/ambient` directory with images you want to display. + + +- Configure Settings + +In the settings.conf file, add the following configuration options + +``` +controllerComboExit = false +controllerComboAmbient = true +ambientModeMinutesPerImage = 30 +``` + +`controllerComboExit`: Set to false to prevent the exit button from quitting RetroFE while Ambient Mode is active. + +`controllerComboAmbient`: Set to true to enable Ambient Mode when the combo button is pressed. + +`ambientModeMinutesPerImage`: Optional. This option defines how often the image should change (in minutes). If left unspecified, the default is 30 minutes. + +### Marquee Support +If you have a dual-monitor setup, Ambient Mode supports a marquee display on the second monitor: + +- How It Works + - When an image is displayed on the main screen, the system will check for a corresponding marquee image on the second monitor. + - It looks for a file named `imageName_marquee.ext` (e.g., `sunset_marquee.png`) where `imageName` matches the image displayed on the main screen. +- Fallback + - If no corresponding marquee image is found, a random marquee image from the `/ambient` directory will be displayed instead. \ No newline at end of file From 57601309aa5c554f36d917d205c64fc24ce03de2 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 17:14:33 +0100 Subject: [PATCH 32/91] Update META_INFORMATION.md --- docs/META_INFORMATION.md | 63 +++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/docs/META_INFORMATION.md b/docs/META_INFORMATION.md index c7f0cb9d0..d236b7498 100644 --- a/docs/META_INFORMATION.md +++ b/docs/META_INFORMATION.md @@ -1,46 +1,63 @@ -# Meta information database +# Meta Information Database [Back](README.md) -RetroFE uses the following information to create the item lists for the -menus: +## RetroFE's relation between Metadata and Item Lists -- menu.txt -- Files in the roms directory -- include.txt -- exclude.txt -- \.sub +RetroFE can use the following information to create the item lists: + +- `menu.txt` in the collection's folder +- Index all files in the `/roms` directory in the collection's folder +- `include.txt` in the collection's folder +- `exclude.txt` in the collection's folder +- `.sub` More information about this can be found in the -[collections](COLLECTIONS.md) section of this documentation. As can be seen +[collections](COLLECTIONS.md) section of this documentation. +As can be seen though: RetroFE does **not** use the meta xml files to create these lists! +## Metadata Overview + The files in the meta directory are used for one thing only: to fill the -meta.db database. This meta.db in turn is used to fill in the extra -information such as full title, genre, rating, score, etc. in the -created menu item list for games. Extra information for collections is -pulled from the settings.conf and/or info.conf file of the collection. +`meta.db` database. This `meta.db` in turn is used to fill in the extra +information such as; + +- Title +- Description +- Release Year +- Player Count +- Control Type +- Manufacturer +- Genre +- Rating -RetroFE supports three types of meta information: +RetroFE supports three types of metadata: -- HyperSpin xml files from the directory meta/hyperlist. -- truRIP (super)dat files from the directory meta/trurip. -- MAME xml files from the directory meta/mamelist/. +- HyperSpin xml files from the directory `/meta/hyperlist`. +- truRIP (super)dat files from the directory `/meta/trurip`. +- MAME xml files from the directory `/meta/mamelist`. -In addition, RetroFE allows you to add information via info files named -as collections/\/info/\.conf. These files +Extra information for collections is pulled from the `settings.conf` and/or `info.conf` file of the collection. + +RetroFE allows you to add information via info files named +as `collections//info/.conf`. These files can contain lines of additional/overwriting information, e.g. -manufacturer = Konami + manufacturer = Konami Information in these files will supersede information from the meta -database when the overwriteXML parameter in the [global +database when the `overwriteXML` parameter in the [global settings.conf](GLOBAL_SETTINGS.md) file is set. +RetroFE does not do any validation on the keys listed here, so really they could contain any values you like, so long as the keys match what RetroFE is set to look for. + +A demo xml file can be found at [MAME.xml](../Package/Environment/Common/meta/hyperlist/MAME.xml) + ## HyperSpin xml files HyperSpin xml files are xml files as supported by the HyperSpin -front-end. RetroFE supports the following tags (, and will ignore the +front-end. RetroFE supports the following tags (and will ignore the rest): - \ @@ -60,7 +77,7 @@ rest): ## emuArc (super)dat files emuArc (super)dat files are xml files as supported by the emuArc group. -RetroFE supports the following tags (, and will ignore the rest): +RetroFE supports the following tags (and will ignore the rest): - \ This subtag of the header tag defines the collection name used for the meta database. From 80d9b9998ef588cb2686c528b1e3ba6e40af8fb5 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 17:14:39 +0100 Subject: [PATCH 33/91] Update README.md --- docs/README.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9b896425c..785883ce1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,15 +14,19 @@ additional artwork like video, box art, screenshots, etc. - [. Getting Started](GETTING_STARTED.md) - [. Creating a Basic RetroFE Environment](HOW_TO.md) -- [. Global Settings](GLOBAL_SETTINGS.md) -- [. Command Line Interface](CLI.md) -- [. Controls (Keyboard/Gamepad)](CONTROLS.md) -- [. Collections](COLLECTIONS.md) -- [. Collection Settings](SETTINGS.md) +- Global Configuration + - [. Global Settings](GLOBAL_SETTINGS.md) + - [. Command Line Interface](CLI.md) + - [. Controls (Keyboard/Gamepad)](CONTROLS.md) +- Collections + - [. Collections](COLLECTIONS.md) + - [. Collection Settings](SETTINGS.md) + - [. Meta information](META_INFORMATION.md) - [. Launchers](LAUNCHERS.md) -- [. General Layout Structure](PLAYGROUND.md) -- [. Layouts](LAYOUTS.md) -- [. Meta information](META_INFORMATION.md) +- Layouts + - [. General Layout Structure](PLAYGROUND.md) + - [. Layouts](LAYOUTS.md) + # These are just dev notes I needed to put somewhere ``` @@ -46,6 +50,9 @@ Launchers macOS Start and Exit Scripts +Layouts + Structure + Additional Features Jukebox Music Player From 9b7008fd8259eaddaf7ebff490c8034365061ed0 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 17:16:47 +0100 Subject: [PATCH 34/91] Update META_INFORMATION.md --- docs/META_INFORMATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/META_INFORMATION.md b/docs/META_INFORMATION.md index d236b7498..1411289f1 100644 --- a/docs/META_INFORMATION.md +++ b/docs/META_INFORMATION.md @@ -94,6 +94,6 @@ RetroFE supports the following tags (and will ignore the rest): ## MAME xml files -MAME xml files are the output of the -listxml output of MAME. +MAME xml files are the output of the -listxml option of MAME. [Back](README.md) From 37c1145afc10f36c572201f488ca1f692f5c01d1 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 17:27:45 +0100 Subject: [PATCH 35/91] Create pages.yml --- .github/workflows/pages.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/pages.yml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 000000000..cbae18bd5 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,19 @@ +name: Deploy GitHub Pages + +on: + push: + paths: + - 'docs/**' + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs From 08afce0fc2928adafd21f5d415a1b4458f027c77 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 17:31:32 +0100 Subject: [PATCH 36/91] Update README.md --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 785883ce1..4085369dc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ additional artwork like video, box art, screenshots, etc. # Index -- [. Getting Started](GETTING_STARTED.md) +- [Getting Started](GETTING_STARTED.md) - [. Creating a Basic RetroFE Environment](HOW_TO.md) - Global Configuration - [. Global Settings](GLOBAL_SETTINGS.md) From 1ee4a15337cd1af32735db60904ee22078a83303 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 17:34:06 +0100 Subject: [PATCH 37/91] Update pages.yml --- .github/workflows/pages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index cbae18bd5..9545c3d84 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -17,3 +17,4 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs + publish_branch: gh-pages From 29cea12d70a8510e847ecaebed23d168fd93738a Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 17:34:45 +0100 Subject: [PATCH 38/91] Update README.md --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 4085369dc..b26db10b4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,7 +13,7 @@ additional artwork like video, box art, screenshots, etc. # Index - [Getting Started](GETTING_STARTED.md) -- [. Creating a Basic RetroFE Environment](HOW_TO.md) +- [Creating a Basic RetroFE Environment](HOW_TO.md) - Global Configuration - [. Global Settings](GLOBAL_SETTINGS.md) - [. Command Line Interface](CLI.md) From edd3b7404b730a3ab66f1f3f9c94d0af7c65d62b Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 17:38:23 +0100 Subject: [PATCH 39/91] Update pages.yml --- .github/workflows/pages.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 9545c3d84..007a6b2cb 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -8,9 +8,14 @@ on: jobs: deploy: runs-on: ubuntu-latest + permissions: + contents: write + pages: write steps: - name: Checkout code uses: actions/checkout@v3 + with: + fetch-depth: 1 - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 From 1534b098962cb5f0a6c2df9276ab8ca7aa843714 Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 17:38:48 +0100 Subject: [PATCH 40/91] Update README.md --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index b26db10b4..b447119d6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ additional artwork like video, box art, screenshots, etc. - [Getting Started](GETTING_STARTED.md) - [Creating a Basic RetroFE Environment](HOW_TO.md) - Global Configuration - - [. Global Settings](GLOBAL_SETTINGS.md) + - [Global Settings](GLOBAL_SETTINGS.md) - [. Command Line Interface](CLI.md) - [. Controls (Keyboard/Gamepad)](CONTROLS.md) - Collections From b144fa67a7540ae5766a5e017a0e3182cf9ada64 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 17:42:42 +0100 Subject: [PATCH 41/91] Delete .github/workflows/pages.yml --- .github/workflows/pages.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .github/workflows/pages.yml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml deleted file mode 100644 index 007a6b2cb..000000000 --- a/.github/workflows/pages.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Deploy GitHub Pages - -on: - push: - paths: - - 'docs/**' - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: write - pages: write - steps: - - name: Checkout code - uses: actions/checkout@v3 - with: - fetch-depth: 1 - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs - publish_branch: gh-pages From 8e64764564af96579926a79238647b4a1fa311a0 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 17:47:03 +0100 Subject: [PATCH 42/91] Create _config.yml --- docs/_config.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 000000000..f810c06b0 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,2 @@ +theme: jekyll-theme-minimal +title: RetroFE Documentation From da787fea46d28787f6488cb598882784ad12db4e Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 17:53:00 +0100 Subject: [PATCH 43/91] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a1071d65..02054ed6c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ -[Project Discord](https://discord.gg/dpcsP8Hm9W) | [GitHub Wiki](https://github.com/CoinOPS-Official/RetroFE/wiki) | [Changelog](CHANGELOG.md) +[Project Discord](https://discord.gg/dpcsP8Hm9W) | [GitHub Wiki](https://coinops-official.github.io/RetroFE/) | [Changelog](CHANGELOG.md) RetroFE is a cross-platform desktop frontend designed for MAME cabinets and game centers, with a focus on simplicity and customization. This repository is actively maintained and hundreds of commits ahead of the original RetroFE project. From 49059ada7ce1a6ebeb31d447acfda0264ce3820c Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:01:45 +0100 Subject: [PATCH 44/91] Create jekyll-gh-pages.yml --- .github/workflows/jekyll-gh-pages.yml | 44 +++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/jekyll-gh-pages.yml diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml new file mode 100644 index 000000000..1676f2b97 --- /dev/null +++ b/.github/workflows/jekyll-gh-pages.yml @@ -0,0 +1,44 @@ +name: Deploy Jekyll site to GitHub Pages + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docs/**' + +permissions: + contents: write + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.1 + bundler-cache: true + + - name: Install dependencies + run: | + cd docs + bundle install + + - name: Build the site + run: | + cd docs + bundle exec jekyll build + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/_site From 60bfbdc5dc88b079ac91eb2a788f5a9142d3dbe8 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:03:37 +0100 Subject: [PATCH 45/91] Create Gemfile --- docs/Gemfile | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/Gemfile diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 000000000..ce58085b2 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "jekyll", "~> 4.2.0" +gem "jekyll-seo-tag", "~> 2.7.1" From 45eaadd5c32c58cf6ef88bbef0d7d4d5528e0bee Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:05:26 +0100 Subject: [PATCH 46/91] Update jekyll-gh-pages.yml --- .github/workflows/jekyll-gh-pages.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml index 1676f2b97..41a40d7b0 100644 --- a/.github/workflows/jekyll-gh-pages.yml +++ b/.github/workflows/jekyll-gh-pages.yml @@ -34,7 +34,6 @@ jobs: - name: Build the site run: | - cd docs bundle exec jekyll build - name: Deploy to GitHub Pages From aaa91a0fa15a17d153703a4083179c5f91f38b5a Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:07:57 +0100 Subject: [PATCH 47/91] Update jekyll-gh-pages.yml --- .github/workflows/jekyll-gh-pages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml index 41a40d7b0..1676f2b97 100644 --- a/.github/workflows/jekyll-gh-pages.yml +++ b/.github/workflows/jekyll-gh-pages.yml @@ -34,6 +34,7 @@ jobs: - name: Build the site run: | + cd docs bundle exec jekyll build - name: Deploy to GitHub Pages From 0b5aa3b3b97bb4e57209718b19bf2f706ff71482 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:17:59 +0100 Subject: [PATCH 48/91] Delete .github/workflows/jekyll-gh-pages.yml --- .github/workflows/jekyll-gh-pages.yml | 44 --------------------------- 1 file changed, 44 deletions(-) delete mode 100644 .github/workflows/jekyll-gh-pages.yml diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml deleted file mode 100644 index 1676f2b97..000000000 --- a/.github/workflows/jekyll-gh-pages.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Deploy Jekyll site to GitHub Pages - -on: - workflow_dispatch: - push: - branches: - - master - paths: - - 'docs/**' - -permissions: - contents: write - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v3 - with: - fetch-depth: 1 - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.1 - bundler-cache: true - - - name: Install dependencies - run: | - cd docs - bundle install - - - name: Build the site - run: | - cd docs - bundle exec jekyll build - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/_site From 85ce839cf09f9b47bde38a9a6bce5e54b3a270cd Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:18:12 +0100 Subject: [PATCH 49/91] Delete docs/_config.yml --- docs/_config.yml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index f810c06b0..000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,2 +0,0 @@ -theme: jekyll-theme-minimal -title: RetroFE Documentation From f74bd68b7fbcc4616917baa9d7125a4912168ae3 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:22:21 +0100 Subject: [PATCH 50/91] Create sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/sync-to-wiki.yml diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml new file mode 100644 index 000000000..9a976aa46 --- /dev/null +++ b/.github/workflows/sync-to-wiki.yml @@ -0,0 +1,33 @@ +name: Sync Docs to Wiki + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docs/**' + +jobs: + sync-wiki: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 1 + + - name: Clone Wiki repository + run: | + git clone https://github.com/${{ github.repository }}.wiki.git wiki + + - name: Sync docs to Wiki + run: | + rsync -av --delete docs/ wiki/ + cd wiki + git config user.name "${{ github.actor }}" + git config user.email "${{ github.actor }}@users.noreply.github.com" + git add . + git commit -m "Sync docs to Wiki" + git push From 4133484d2800d05649b3512249865d11b6962c60 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:23:55 +0100 Subject: [PATCH 51/91] Update sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml index 9a976aa46..1662cf2a4 100644 --- a/.github/workflows/sync-to-wiki.yml +++ b/.github/workflows/sync-to-wiki.yml @@ -8,6 +8,9 @@ on: paths: - 'docs/**' +permissions: + contents: write + jobs: sync-wiki: runs-on: ubuntu-latest From fba4e1c34481d0bcd01e65cb4d62a7f2f5ef8466 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:26:38 +0100 Subject: [PATCH 52/91] Update sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml index 1662cf2a4..2fbe30fd6 100644 --- a/.github/workflows/sync-to-wiki.yml +++ b/.github/workflows/sync-to-wiki.yml @@ -10,7 +10,7 @@ on: permissions: contents: write - + jobs: sync-wiki: runs-on: ubuntu-latest @@ -33,4 +33,12 @@ jobs: git config user.email "${{ github.actor }}@users.noreply.github.com" git add . git commit -m "Sync docs to Wiki" - git push + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + branch: sync-docs-to-wiki + commit-message: "Sync docs to Wiki" + title: "Sync Wiki Docs" + body: "This PR syncs the latest documentation to the wiki." + labels: automated From d699867d7b6c07125fcd4dd25b997774e519a29c Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:28:07 +0100 Subject: [PATCH 53/91] Update sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml index 2fbe30fd6..117f3f336 100644 --- a/.github/workflows/sync-to-wiki.yml +++ b/.github/workflows/sync-to-wiki.yml @@ -10,6 +10,7 @@ on: permissions: contents: write + pull-requests: write jobs: sync-wiki: From 5942bd9ea44d46a6ee1608838c8be2d0f6225d22 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:34:20 +0100 Subject: [PATCH 54/91] Update sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml index 117f3f336..55a0c3012 100644 --- a/.github/workflows/sync-to-wiki.yml +++ b/.github/workflows/sync-to-wiki.yml @@ -42,4 +42,9 @@ jobs: commit-message: "Sync docs to Wiki" title: "Sync Wiki Docs" body: "This PR syncs the latest documentation to the wiki." - labels: automated + + - name: Merge Pull Request + uses: peter-evans/merge-pull-request@v2 + with: + pull-request: ${{ steps.create_pr.outputs.pull-request-number }} + merge-method: squash From 191374bbee8afae7c18f3226af8a5c9013db76ce Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:37:49 +0100 Subject: [PATCH 55/91] Update sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml index 55a0c3012..a0882756a 100644 --- a/.github/workflows/sync-to-wiki.yml +++ b/.github/workflows/sync-to-wiki.yml @@ -42,9 +42,3 @@ jobs: commit-message: "Sync docs to Wiki" title: "Sync Wiki Docs" body: "This PR syncs the latest documentation to the wiki." - - - name: Merge Pull Request - uses: peter-evans/merge-pull-request@v2 - with: - pull-request: ${{ steps.create_pr.outputs.pull-request-number }} - merge-method: squash From 4d90327d41a54e9b5ee5c741b843b47f517bb5e6 Mon Sep 17 00:00:00 2001 From: aidenjbass <72824515+aidenjbass@users.noreply.github.com> Date: Mon, 5 May 2025 18:41:17 +0100 Subject: [PATCH 56/91] Delete .github/workflows/sync-to-wiki.yml --- .github/workflows/sync-to-wiki.yml | 44 ------------------------------ 1 file changed, 44 deletions(-) delete mode 100644 .github/workflows/sync-to-wiki.yml diff --git a/.github/workflows/sync-to-wiki.yml b/.github/workflows/sync-to-wiki.yml deleted file mode 100644 index a0882756a..000000000 --- a/.github/workflows/sync-to-wiki.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Sync Docs to Wiki - -on: - workflow_dispatch: - push: - branches: - - master - paths: - - 'docs/**' - -permissions: - contents: write - pull-requests: write - -jobs: - sync-wiki: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 1 - - - name: Clone Wiki repository - run: | - git clone https://github.com/${{ github.repository }}.wiki.git wiki - - - name: Sync docs to Wiki - run: | - rsync -av --delete docs/ wiki/ - cd wiki - git config user.name "${{ github.actor }}" - git config user.email "${{ github.actor }}@users.noreply.github.com" - git add . - git commit -m "Sync docs to Wiki" - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 - with: - branch: sync-docs-to-wiki - commit-message: "Sync docs to Wiki" - title: "Sync Wiki Docs" - body: "This PR syncs the latest documentation to the wiki." From 5ba18b9a612064d88afc6a7754c64655105113ea Mon Sep 17 00:00:00 2001 From: aidenjbass Date: Mon, 5 May 2025 18:48:56 +0100 Subject: [PATCH 57/91] Bring in old wiki only additions --- docs/COLLECTIONS.md | 6 +++++ docs/SETTINGS.md | 4 ++++ docs/STRUCTURE.md | 55 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 docs/STRUCTURE.md diff --git a/docs/COLLECTIONS.md b/docs/COLLECTIONS.md index c7569be61..44b4a8036 100644 --- a/docs/COLLECTIONS.md +++ b/docs/COLLECTIONS.md @@ -232,4 +232,10 @@ autoFavorites = yes parameter setting in your [global settings.conf](GLOBAL_SETTINGS.md) file to automatically switch to your favorite games when you enter a collection. +(CoinOPS) +Other special types are based on a metadata field to sort by that field. +Rename the playlist to the below metadata. +sortType year, manufacturer, developer, genre, numberPlayers, numberButtons, ctrlType, joyWays, rating, score, playCount +make sure to add the playlist to the cyclePlaylist and can add * inside the playlist file to include all games in the list. + [Back](README.md) diff --git a/docs/SETTINGS.md b/docs/SETTINGS.md index 01531e4a1..21849f72e 100644 --- a/docs/SETTINGS.md +++ b/docs/SETTINGS.md @@ -17,6 +17,10 @@ that can be specified in your collection's settings.conf file. | metadata.type | \ | Specifies the meta file used in the meta.db to pull additional information like manufacturer, year, genre, etc. from | | meda.\ | collections/\/medium_artwork/\ | Overwrites the path used to pull medium artwork from | | media.system_artwork | collections/\/system_artwork | Overwrites the path used to pull system artwork from | +| `firstPlaylist, autoPlaylist, attractModeCyclePlaylist, cyclePlaylist, attractModeSkipPlaylist` | | (**CoinOPS**) These settings used to be in global, but can be overwritten by collection settings now +| layout | name of theme in the layouts/ from which to find layout/resources for collection | (**CoinOPS**) This "layout" that overides global setting, so different themes can be loaded under one collection menu + + All the settings above can take advantage of the following variables: diff --git a/docs/STRUCTURE.md b/docs/STRUCTURE.md new file mode 100644 index 000000000..00924bbaf --- /dev/null +++ b/docs/STRUCTURE.md @@ -0,0 +1,55 @@ + +Layouts define the look and feel for your frontend. Each layout is a +folder containing at least the following two main files. + + +## Directory Structure + +| Path | Description | +|------------------------------------|----------------------------------------------------------------------------------------------| +| /layouts/\/ | Folder to store all image files for a particular asset. i.e. \ = "Default 16x9" | +| /layouts/\/splash.xml | Splash screen to show at startup | +| /layouts/\/layout.xml | Main layout file to show when frontend is loaded | +| start.bat | (**CoinOPS**) runs on start and on restart (theme change) to launch other things | +| exit.bat | (**CoinOPS**) runs on exit and on restart (theme change) to cleanup the launch ofother things | + +[An example of a +layout](https://bitbucket.org/teamretro/retrofe/src/default/Package/Environment/Common/layouts/Default%2016x9) +[An example of a +layout.xml](https://bitbucket.org/teamretro/retrofe/src/default/Package/Environment/Common/layouts/Default%2016x9/layout.xml?at=default) + +The global settings.conf file contains the default layout used by +RetroFE. It is however possible to give a collection a completely +different layout by adding the layout.xml and layout artwork to the +/layouts/\/collections/\/layout/ +directory. A splash.xml is not required/used for a collection's layout. +This way you can give each collection a completely different look and +feel. + +RetroFE will first search for a layout XML file that matches the screen +ratio, so e.g. layout 16x9.xml or layout 4x3.xml. If that file is not +found, it will default to layout.xml. + +## General Layout Structure + +A layout generally consists of the following structure: + + + + +