early-access version 2149

main
pineappleEA 2021-10-20 01:37:33 +02:00
parent 6a02e7140f
commit fe662edf4a
12 changed files with 92 additions and 104 deletions

View File

@ -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

View File

@ -565,6 +565,7 @@ struct Values {
// Miscellaneous
BasicSetting<std::string> log_filter{"*:Info", "log_filter"};
BasicSetting<bool> use_dev_keys{false, "use_dev_keys"};
BasicSetting<bool> disable_screen_saver{true, "disable_screen_saver"};
// Network
BasicSetting<std::string> network_interface{std::string(), "network_interface"};

View File

@ -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)

View File

@ -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();
}

View File

@ -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);

View File

@ -119,6 +119,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="toggle_screen_saver">
<property name="text">
<string>Disable screen saver while in game</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@ -14,14 +14,14 @@
<item row="0" column="0" colspan="4">
<widget class="QLabel" name="label_1">
<property name="text">
<string>Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation please consult the FAQ on the yuzu website.</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QLabel" name="label_2">
<property name="text">
<string>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (General -&gt; Hotkeys).</string>
<string>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</string>
</property>
<property name="wordWrap">
<bool>true</bool>

View File

@ -48,12 +48,6 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#define QT_NO_OPENGL
#include <QClipboard>
#ifdef __linux__
#include <QDBusConnection>
#include <QDBusError>
#include <QDBusInterface>
#include <QDBusReply>
#endif
#include <QDesktopServices>
#include <QDesktopWidget>
#include <QDialogButtonBox>
@ -72,6 +66,10 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include <QUrl>
#include <QtConcurrent/QtConcurrent>
#ifdef HAVE_SDL2
#include <SDL.h> // For SDL ScreenSaver functions
#endif
#include <fmt/format.h>
#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<uint32_t> 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<void> 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<u32>(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.<br><br>For an explanation of the various Switch formats yuzu supports, <a "
"support.<br><br>For an explanation of the various Switch formats yuzu "
"supports, <a "
"href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our "
"wiki</a>. 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: "
"<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How "
"<a "
"href='https://community.citra-emu.org/t/how-to-upload-the-log-file/"
"296'>How "
"to "
"Upload the Log File</a>."
"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<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the "
tr("%1<br>Please follow <a "
"href='https://yuzu-emu.org/help/quickstart/'>the "
"yuzu quickstart guide</a> to redump your files.<br>You can refer "
"to the yuzu wiki</a> or the yuzu Discord</a> 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.<br>Full will copy all of the "
tr("Please select the how you would like the RomFS dumped.<br>Full will copy all of "
"the "
"files into the new directory while <br>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<UISettings::GameDir> old_game_dirs = std::move(UISettings::values.game_dirs);
QVector<u64> 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();
}

View File

@ -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<FileSys::VfsFilesystem> vfs;
std::unique_ptr<FileSys::ManualContentProvider> provider;

View File

@ -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 =

View File

@ -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 =

View File

@ -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();
}