diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index d71c903ba..5113423cb 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -59,8 +59,8 @@ DECLARE_bool(d3d12_clear_memory_page_state); DEFINE_bool(fullscreen, false, "Whether to launch the emulator in fullscreen.", "Display"); -DEFINE_bool(controller_hotkeys, true, - "Hotkeys for Xbox and PS controllers.", "General"); +DEFINE_bool(controller_hotkeys, true, "Hotkeys for Xbox and PS controllers.", + "General"); DEFINE_string( postprocess_antialiasing, "", @@ -1148,7 +1148,9 @@ const std::map controller_hotkey_map = { {X_INPUT_GAMEPAD_B | X_INPUT_GAMEPAD_GUIDE, EmulatorWindow::ControllerHotKey( EmulatorWindow::ButtonFunctions::ToggleLogging, - "B + Guide = Toggle between loglevel set in config and the 'Disabled' loglevel.", true, true)}, + "B + Guide = Toggle between loglevel set in config and the 'Disabled' " + "loglevel.", + true, true)}, {X_INPUT_GAMEPAD_Y | X_INPUT_GAMEPAD_GUIDE, EmulatorWindow::ControllerHotKey( EmulatorWindow::ButtonFunctions::ToggleFullscreen, @@ -1191,7 +1193,9 @@ const std::map controller_hotkey_map = { {X_INPUT_GAMEPAD_BACK | X_INPUT_GAMEPAD_START, EmulatorWindow::ControllerHotKey( EmulatorWindow::ButtonFunctions::ToggleLogging, - "Back + Start = Toggle between loglevel set in config and the 'Disabled' loglevel.", false, false)}, + "Back + Start = Toggle between loglevel set in config and the " + "'Disabled' loglevel.", + false, false)}, {X_INPUT_GAMEPAD_DPAD_DOWN, EmulatorWindow::ControllerHotKey( EmulatorWindow::ButtonFunctions::IncTitleSelect, @@ -1239,7 +1243,7 @@ EmulatorWindow::ControllerHotKey EmulatorWindow::ProcessControllerHotkey( switch (button_combination.function) { case ButtonFunctions::ToggleFullscreen: - ToggleFullscreen(); + app_context().CallInUIThread([this]() { ToggleFullscreen(); }); // Extra Sleep xe::threading::Sleep(delay); @@ -1250,7 +1254,6 @@ EmulatorWindow::ControllerHotKey EmulatorWindow::ProcessControllerHotkey( app_context().CallInUIThread([this]() { RunTitle(recently_launched_titles_[selected_title_index].path_to_file); }); - } break; case ButtonFunctions::ClearMemoryPageState: ToggleGPUSetting(gpu_cvar::ClearMemoryPageState); @@ -1305,7 +1308,7 @@ EmulatorWindow::ControllerHotKey EmulatorWindow::ProcessControllerHotkey( } if ((button_combination.function == ButtonFunctions::IncTitleSelect || - button_combination.function == ButtonFunctions::DecTitleSelect) && + button_combination.function == ButtonFunctions::DecTitleSelect) && recently_launched_titles_.size() > 0) { selected_title_index = std::clamp( selected_title_index, 0, (int)recently_launched_titles_.size() - 1); @@ -1315,10 +1318,20 @@ EmulatorWindow::ControllerHotKey EmulatorWindow::ProcessControllerHotkey( // Titles may contain Unicode characters such as At World’s End // Must use ImGUI font that can render these Unicode characters - std::string title = - std::to_string(selected_title_index + 1) + ": " + - recently_launched_titles_[selected_title_index].title_name + "\n\n" + - controller_hotkey_map.find(X_INPUT_GAMEPAD_START)->second.pretty; + std::string title_name; + + // Use filename if title name is empty + if (recently_launched_titles_[selected_title_index].title_name.empty()) { + title_name = recently_launched_titles_[selected_title_index] + .path_to_file.filename() + .string(); + } else { + title_name = recently_launched_titles_[selected_title_index].title_name; + } + + std::string title = fmt::format( + "{}: {}\n\n{}", selected_title_index + 1, title_name, + controller_hotkey_map.find(X_INPUT_GAMEPAD_START)->second.pretty); xe::ui::ImGuiDialog::ShowMessageBox(imgui_drawer_.get(), "Title Selection", title); @@ -1583,6 +1596,10 @@ void EmulatorWindow::LoadRecentlyLaunchedTitles() { void EmulatorWindow::AddRecentlyLaunchedTitle( std::filesystem::path path_to_file, std::string title_name) { + if (cvars::recent_titles_entry_amount <= 0) { + return; + } + // Check if game is already on list and pop it to front auto entry_index = std::find_if(recently_launched_titles_.cbegin(), recently_launched_titles_.cend(), diff --git a/src/xenia/app/emulator_window.h b/src/xenia/app/emulator_window.h index b25941826..962d0d521 100644 --- a/src/xenia/app/emulator_window.h +++ b/src/xenia/app/emulator_window.h @@ -69,6 +69,7 @@ class EmulatorWindow { void OnEmulatorInitialized(); + xe::X_STATUS RunTitle(std::filesystem::path path_to_file); void UpdateTitle(); void SetFullscreen(bool fullscreen); void ToggleFullscreen(); @@ -210,7 +211,6 @@ class EmulatorWindow { std::string BoolToString(bool value); void DisplayHotKeysConfig(); - xe::X_STATUS RunTitle(std::filesystem::path path_to_file); void RunPreviouslyPlayedTitle(); void FillRecentlyLaunchedTitlesMenu(xe::ui::MenuItem* recent_menu); void LoadRecentlyLaunchedTitles(); diff --git a/src/xenia/app/xenia_main.cc b/src/xenia/app/xenia_main.cc index b7e29bf34..c62662e99 100644 --- a/src/xenia/app/xenia_main.cc +++ b/src/xenia/app/xenia_main.cc @@ -615,7 +615,8 @@ void EmulatorApp::EmulatorThread() { // Normalize the path and make absolute. auto abs_path = std::filesystem::absolute(path); - result = app_context().CallInUIThread([this, abs_path]() { return emulator_->LaunchPath(abs_path); }); + result = app_context().CallInUIThread( + [this, abs_path]() { return emulator_window_->RunTitle(abs_path); }); if (XFAILED(result)) { xe::FatalError(fmt::format("Failed to launch target: {:08X}", result)); app_context().RequestDeferredQuit();