From fe662edf4a89ab76b1b362ffb9fcd5a5910db477 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Wed, 20 Oct 2021 01:37:33 +0200 Subject: [PATCH] early-access version 2149 --- README.md | 2 +- src/common/settings.h | 1 + src/yuzu/CMakeLists.txt | 10 +- src/yuzu/configuration/config.cpp | 2 + src/yuzu/configuration/configure_general.cpp | 3 + src/yuzu/configuration/configure_general.ui | 7 + src/yuzu/configuration/configure_tas.ui | 4 +- src/yuzu/main.cpp | 154 ++++++++----------- src/yuzu/main.h | 5 - src/yuzu_cmd/config.cpp | 1 + src/yuzu_cmd/default_ini.h | 4 + src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | 3 + 12 files changed, 92 insertions(+), 104 deletions(-) diff --git a/README.md b/README.md index fd1b3119f..25e2274a2 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 2148. +This is the source code for early-access 2149. ## Legal Notice diff --git a/src/common/settings.h b/src/common/settings.h index 9ff4cf85d..1e5e99aec 100755 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -565,6 +565,7 @@ struct Values { // Miscellaneous BasicSetting log_filter{"*:Info", "log_filter"}; BasicSetting use_dev_keys{false, "use_dev_keys"}; + BasicSetting disable_screen_saver{true, "disable_screen_saver"}; // Network BasicSetting network_interface{std::string(), "network_interface"}; diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 4f42aa9d1..d62fd566f 100755 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -285,11 +285,6 @@ if (USE_DISCORD_PRESENCE) target_compile_definitions(yuzu PRIVATE -DUSE_DISCORD_PRESENCE) endif() -if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS DBus ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH} REQUIRED) - target_link_libraries(yuzu PRIVATE Qt5::DBus) -endif() - if (YUZU_USE_QT_WEB_ENGINE) target_link_libraries(yuzu PRIVATE Qt5::WebEngineCore Qt5::WebEngineWidgets) target_compile_definitions(yuzu PRIVATE -DYUZU_USE_QT_WEB_ENGINE) @@ -304,6 +299,11 @@ if (YUZU_USE_BUNDLED_QT) copy_yuzu_Qt5_deps(yuzu) endif() +if (ENABLE_SDL2) + target_link_libraries(yuzu PRIVATE SDL2) + target_compile_definitions(yuzu PRIVATE HAVE_SDL2) +endif() + if (MSVC) include(CopyYuzuSDLDeps) include(CopyYuzuFFmpegDeps) diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index faea5dda1..c152e4ea1 100755 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -738,6 +738,7 @@ void Config::ReadMiscellaneousValues() { ReadBasicSetting(Settings::values.log_filter); ReadBasicSetting(Settings::values.use_dev_keys); + ReadBasicSetting(Settings::values.disable_screen_saver); qt_config->endGroup(); } @@ -1296,6 +1297,7 @@ void Config::SaveMiscellaneousValues() { WriteBasicSetting(Settings::values.log_filter); WriteBasicSetting(Settings::values.use_dev_keys); + WriteBasicSetting(Settings::values.disable_screen_saver); qt_config->endGroup(); } diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 7af3ea97e..544f78ab0 100755 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -44,6 +44,7 @@ void ConfigureGeneral::SetConfiguration() { ui->toggle_user_on_boot->setChecked(UISettings::values.select_user_on_boot.GetValue()); ui->toggle_background_pause->setChecked(UISettings::values.pause_when_in_background.GetValue()); ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse.GetValue()); + ui->toggle_screen_saver->setChecked(Settings::values.disable_screen_saver.GetValue()); ui->toggle_speed_limit->setChecked(Settings::values.use_speed_limit.GetValue()); ui->speed_limit->setValue(Settings::values.speed_limit.GetValue()); @@ -88,6 +89,7 @@ void ConfigureGeneral::ApplyConfiguration() { UISettings::values.select_user_on_boot = ui->toggle_user_on_boot->isChecked(); UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked(); UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked(); + Settings::values.disable_screen_saver = ui->toggle_screen_saver->isChecked(); Settings::values.fps_cap.SetValue(ui->fps_cap->value()); @@ -136,6 +138,7 @@ void ConfigureGeneral::SetupPerGameUI() { ui->toggle_user_on_boot->setVisible(false); ui->toggle_background_pause->setVisible(false); ui->toggle_hide_mouse->setVisible(false); + ui->toggle_screen_saver->setVisible(false); ui->button_reset_defaults->setVisible(false); diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index f9f0e3ebf..3c54d57d8 100755 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -119,6 +119,13 @@ + + + + Disable screen saver while in game + + + diff --git a/src/yuzu/configuration/configure_tas.ui b/src/yuzu/configuration/configure_tas.ui index 6caa19031..7d44895c4 100755 --- a/src/yuzu/configuration/configure_tas.ui +++ b/src/yuzu/configuration/configure_tas.ui @@ -14,14 +14,14 @@ - Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation please consult the FAQ on the yuzu website. + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://yuzu-emu.org/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the yuzu website.</p></body></html> - To check which hotkeys control the playback/recording, please refer to the Hotkey settings (General -> Hotkeys). + To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -> General -> Hotkeys). true diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index dfc014d34..4ef0317bc 100755 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -48,12 +48,6 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #define QT_NO_OPENGL #include -#ifdef __linux__ -#include -#include -#include -#include -#endif #include #include #include @@ -72,6 +66,10 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include #include +#ifdef HAVE_SDL2 +#include // For SDL ScreenSaver functions +#endif + #include #include "common/detached_tasks.h" #include "common/fs/fs.h" @@ -1094,20 +1092,23 @@ void GMainWindow::RestoreUIState() { } void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) { - if (!UISettings::values.pause_when_in_background) { - return; - } if (state != Qt::ApplicationHidden && state != Qt::ApplicationInactive && state != Qt::ApplicationActive) { LOG_DEBUG(Frontend, "ApplicationState unusual flag: {} ", state); } - if (ui->action_Pause->isEnabled() && - (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) { - auto_paused = true; - OnPauseGame(); - } else if (ui->action_Start->isEnabled() && auto_paused && state == Qt::ApplicationActive) { - auto_paused = false; - OnStartGame(); + if (state & (Qt::ApplicationHidden | Qt::ApplicationInactive)) { + if (UISettings::values.pause_when_in_background && ui->action_Pause->isEnabled()) { + auto_paused = true; + OnPauseGame(); + } + AllowOSSleep(); + } else if (state == Qt::ApplicationActive) { + if (UISettings::values.pause_when_in_background && ui->action_Start->isEnabled() && + auto_paused) { + auto_paused = false; + OnStartGame(); + } + PreventOSSleep(); } } @@ -1227,74 +1228,20 @@ void GMainWindow::OnDisplayTitleBars(bool show) { } void GMainWindow::PreventOSSleep() { + if (Settings::values.disable_screen_saver) { #ifdef _WIN32 - SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); -#elif defined(__linux__) - QDBusConnection bus = QDBusConnection::sessionBus(); - if (bus.isConnected()) { - // Specs: https://specifications.freedesktop.org/idle-inhibit-spec/0.1/re01.html - const QString service = QStringLiteral("org.freedesktop.ScreenSaver"); - const QString path = QStringLiteral("/org/freedesktop/ScreenSaver"); - - QDBusInterface screen_saver_interface(service, path, service, bus, this); - if (screen_saver_interface.isValid()) { - const QString method = QStringLiteral("Inhibit"); - const QString application_name = QStringLiteral("org.yuzu-emu.Yuzu"); - const QString reason_for_inhibit = QStringLiteral("Playing a game"); - - QDBusReply reply = - screen_saver_interface.call(method, application_name, reason_for_inhibit); - - if (reply.isValid()) { - screensaver_dbus_cookie = reply.value(); - screensaver_inhibited = true; - - LOG_INFO(Frontend, "Screen saver disabled successfully (cookie: {})", - screensaver_dbus_cookie); - } else { - QDBusError error = reply.error(); - LOG_ERROR(Frontend, "Could not disable screen saver: {} {}", - error.message().toStdString(), error.name().toStdString()); - } - } - } + SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); +#elif defined(HAVE_SDL2) + SDL_DisableScreenSaver(); #endif + } } void GMainWindow::AllowOSSleep() { #ifdef _WIN32 SetThreadExecutionState(ES_CONTINUOUS); -#elif defined(__linux__) - if (!screensaver_inhibited) { - LOG_WARNING(Frontend, "Screen saver already enabled."); - return; - } - - QDBusConnection bus = QDBusConnection::sessionBus(); - if (bus.isConnected()) { - // Specs: https://specifications.freedesktop.org/idle-inhibit-spec/0.1/re01.html - const QString service = QStringLiteral("org.freedesktop.ScreenSaver"); - const QString path = QStringLiteral("/org/freedesktop/ScreenSaver"); - - QDBusInterface screen_saver_interface(service, path, service, bus, this); - if (screen_saver_interface.isValid()) { - const QString method = QStringLiteral("UnInhibit"); - - QDBusReply reply = screen_saver_interface.call(method, screensaver_dbus_cookie); - - if (reply.isValid()) { - LOG_INFO(Frontend, "Screen saver enabled successfully (cookie: {})", - screensaver_dbus_cookie); - - screensaver_dbus_cookie = 0; - screensaver_inhibited = false; - } else { - QDBusError error = reply.error(); - LOG_ERROR(Frontend, "Could not disable screen saver: {} {}", - error.message().toStdString(), error.name().toStdString()); - } - } - } +#elif defined(HAVE_SDL2) + SDL_EnableScreenSaver(); #endif } @@ -1332,10 +1279,12 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p static_cast(CalloutFlag::DRDDeprecation); QMessageBox::warning( this, tr("Warning Outdated Game Format"), - tr("You are using the deconstructed ROM directory format for this game, which is an " + tr("You are using the deconstructed ROM directory format for this game, which is " + "an " "outdated format that has been superseded by others such as NCA, NAX, XCI, or " "NSP. Deconstructed ROM directories lack icons, metadata, and update " - "support.

For an explanation of the various Switch formats yuzu supports,
For an explanation of the various Switch formats yuzu " + "supports,
check out our " "wiki. This message will not be shown again.")); } @@ -1353,7 +1302,9 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p tr("yuzu has encountered an error while running the video core, please see the " "log for more details." "For more information on accessing the log, please see the following page: " - "How " + "How " "to " "Upload the Log File." "Ensure that you have the latest graphics drivers for your GPU.")); @@ -1371,7 +1322,8 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p tr("Error while loading ROM! %1", "%1 signifies a numeric error code.") .arg(QString::fromStdString(error_code)); const auto description = - tr("%1
Please follow the " + tr("%1
Please follow
the " "yuzu quickstart guide to redump your files.
You can refer " "to the yuzu wiki or the yuzu Discord for help.", "%1 signifies an error string.") @@ -1445,6 +1397,14 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t SelectAndSetCurrentUser(); } +#if defined(HAVE_SDL2) && !defined(_WIN32) + SDL_InitSubSystem(SDL_INIT_VIDEO); + // SDL disables the screen saver by default, and setting the hint + // SDL_HINT_VIDEO_ALLOW_SCREENSAVER doesn't seem to work, so we just enable the screen saver + // for now. + SDL_EnableScreenSaver(); +#endif + if (!LoadROM(filename, program_id, program_index)) return; @@ -1462,8 +1422,8 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t connect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame); connect(render_window, &GRenderWindow::MouseActivity, this, &GMainWindow::OnMouseActivity); - // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views - // before the CPU continues + // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our + // views before the CPU continues connect(emu_thread.get(), &EmuThread::DebugModeEntered, waitTreeWidget, &WaitTreeWidget::OnDebugModeEntered, Qt::BlockingQueuedConnection); connect(emu_thread.get(), &EmuThread::DebugModeLeft, waitTreeWidget, @@ -1537,6 +1497,10 @@ void GMainWindow::ShutdownGame() { AllowOSSleep(); +#if defined(HAVE_SDL2) && !defined(_WIN32) + SDL_QuitSubSystem(SDL_INIT_VIDEO); +#endif + discord_rpc->Pause(); emu_thread->RequestStop(); @@ -2047,7 +2011,8 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa const QStringList selections{tr("Full"), tr("Skeleton")}; const auto res = QInputDialog::getItem( this, tr("Select RomFS Dump Mode"), - tr("Please select the how you would like the RomFS dumped.
Full will copy all of the " + tr("Please select the how you would like the RomFS dumped.
Full will copy all of " + "the " "files into the new directory while
skeleton will only create the directory " "structure."), selections, 0, false, &ok); @@ -2309,7 +2274,8 @@ void GMainWindow::OnMenuInstallToNAND() { if (detected_base_install) { QMessageBox::warning( this, tr("Install Results"), - tr("To avoid possible conflicts, we discourage users from installing base games to the " + tr("To avoid possible conflicts, we discourage users from installing base games to " + "the " "NAND.\nPlease, only use this feature to install updates and DLC.")); } @@ -2721,13 +2687,13 @@ void GMainWindow::OnConfigure() { const auto result = configure_dialog.exec(); if (result != QDialog::Accepted && !UISettings::values.configuration_applied && !UISettings::values.reset_to_defaults) { - // Runs if the user hit Cancel or closed the window, and did not ever press the Apply button - // or `Reset to Defaults` button + // Runs if the user hit Cancel or closed the window, and did not ever press the Apply + // button or `Reset to Defaults` button return; } else if (result == QDialog::Accepted) { // Only apply new changes if user hit Okay - // This is here to avoid applying changes if the user hit Apply, made some changes, then hit - // Cancel + // This is here to avoid applying changes if the user hit Apply, made some changes, then + // hit Cancel configure_dialog.ApplyConfiguration(); } else if (UISettings::values.reset_to_defaults) { LOG_INFO(Frontend, "Resetting all settings to defaults"); @@ -2743,8 +2709,8 @@ void GMainWindow::OnConfigure() { LOG_WARNING(Frontend, "Failed to remove game metadata cache files"); } - // Explicitly save the game directories, since reinitializing config does not explicitly do - // so. + // Explicitly save the game directories, since reinitializing config does not explicitly + // do so. QVector old_game_dirs = std::move(UISettings::values.game_dirs); QVector old_favorited_ids = std::move(UISettings::values.favorited_ids); @@ -2791,6 +2757,12 @@ void GMainWindow::OnConfigure() { render_window->setAttribute(Qt::WA_Hover, false); } + if (emulation_running) { + PreventOSSleep(); + } else { + AllowOSSleep(); + } + if (UISettings::values.hide_mouse) { mouse_hide_timer.start(); } diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 1d2741d25..aed15a0a0 100755 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -348,11 +348,6 @@ private: bool auto_paused = false; QTimer mouse_hide_timer; -#ifdef __linux__ - bool screensaver_inhibited = false; - uint32_t screensaver_dbus_cookie; -#endif - // FS std::shared_ptr vfs; std::unique_ptr provider; diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index 0b8fde691..4bac2ca8a 100755 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp @@ -482,6 +482,7 @@ void Config::ReadValues() { Settings::values.log_filter = sdl2_config->Get("Miscellaneous", Settings::values.log_filter.GetLabel(), "*:Trace"); ReadSetting("Miscellaneous", Settings::values.use_dev_keys); + ReadSetting("Miscellaneous", Settings::values.disable_screen_saver); // Debugging Settings::values.record_frame_times = diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index 339dca766..5208cb5e4 100755 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h @@ -391,6 +391,10 @@ log_filter = *:Trace # 0 (default): Disabled, 1: Enabled use_dev_keys = +# Disables the screensaver while yuzu is in session. +# 1 (defualt): Yes, 0 : No +disable_screen_saver = + [Debugging] # Record frame time data, can be found in the log directory. Boolean value record_frame_times = diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp index 87fce0c23..c8bc1eb79 100755 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp @@ -22,6 +22,9 @@ EmuWindow_SDL2::EmuWindow_SDL2(InputCommon::InputSubsystem* input_subsystem_, Co LOG_CRITICAL(Frontend, "Failed to initialize SDL2! Exiting..."); exit(1); } + if (!Settings::values.disable_screen_saver) { + SDL_EnableScreenSaver(); + } input_subsystem->Initialize(); SDL_SetMainReady(); }