diff options
Diffstat (limited to 'src/yuzu')
-rw-r--r-- | src/yuzu/applets/qt_web_browser.cpp | 15 | ||||
-rw-r--r-- | src/yuzu/applets/qt_web_browser.h | 3 | ||||
-rw-r--r-- | src/yuzu/applets/qt_web_browser_scripts.h | 6 | ||||
-rw-r--r-- | src/yuzu/configuration/config.cpp | 10 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_general.cpp | 50 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_general.h | 2 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_general.ui | 34 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 2 | ||||
-rw-r--r-- | src/yuzu/main.cpp | 20 |
9 files changed, 100 insertions, 42 deletions
diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp index b112dd7b0..652d99570 100644 --- a/src/yuzu/applets/qt_web_browser.cpp +++ b/src/yuzu/applets/qt_web_browser.cpp @@ -107,6 +107,7 @@ void QtNXWebEngineView::LoadLocalWebPage(const std::string& main_url, is_local = true; LoadExtractedFonts(); + FocusFirstLinkElement(); SetUserAgent(UserAgent::WebApplet); SetFinished(false); SetExitReason(Service::AM::Applets::WebExitReason::EndButtonPressed); @@ -121,6 +122,7 @@ void QtNXWebEngineView::LoadExternalWebPage(const std::string& main_url, const std::string& additional_args) { is_local = false; + FocusFirstLinkElement(); SetUserAgent(UserAgent::WebApplet); SetFinished(false); SetExitReason(Service::AM::Applets::WebExitReason::EndButtonPressed); @@ -208,7 +210,7 @@ void QtNXWebEngineView::HandleWindowFooterButtonPressedOnce() { if (input_interpreter->IsButtonPressedOnce(button)) { page()->runJavaScript( QStringLiteral("yuzu_key_callbacks[%1] == null;").arg(static_cast<u8>(button)), - [&](const QVariant& variant) { + [this, button](const QVariant& variant) { if (variant.toBool()) { switch (button) { case HIDButton::A: @@ -364,6 +366,17 @@ void QtNXWebEngineView::LoadExtractedFonts() { Qt::QueuedConnection); } +void QtNXWebEngineView::FocusFirstLinkElement() { + QWebEngineScript focus_link_element; + + focus_link_element.setName(QStringLiteral("focus_link_element.js")); + focus_link_element.setSourceCode(QString::fromStdString(FOCUS_LINK_ELEMENT_SCRIPT)); + focus_link_element.setWorldId(QWebEngineScript::MainWorld); + focus_link_element.setInjectionPoint(QWebEngineScript::Deferred); + focus_link_element.setRunsOnSubFrames(true); + default_profile->scripts()->insert(focus_link_element); +} + #endif QtWebBrowser::QtWebBrowser(GMainWindow& main_window) { diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h index 7ad07409f..7e9f703fc 100644 --- a/src/yuzu/applets/qt_web_browser.h +++ b/src/yuzu/applets/qt_web_browser.h @@ -161,6 +161,9 @@ private: /// Loads the extracted fonts using JavaScript. void LoadExtractedFonts(); + /// Brings focus to the first available link element. + void FocusFirstLinkElement(); + InputCommon::InputSubsystem* input_subsystem; std::unique_ptr<UrlRequestInterceptor> url_interceptor; diff --git a/src/yuzu/applets/qt_web_browser_scripts.h b/src/yuzu/applets/qt_web_browser_scripts.h index 992837a85..c4ba8d40f 100644 --- a/src/yuzu/applets/qt_web_browser_scripts.h +++ b/src/yuzu/applets/qt_web_browser_scripts.h @@ -73,6 +73,12 @@ constexpr char LOAD_NX_FONT[] = R"( })(); )"; +constexpr char FOCUS_LINK_ELEMENT_SCRIPT[] = R"( +if (document.getElementsByTagName("a").length > 0) { + document.getElementsByTagName("a")[0].focus(); +} +)"; + constexpr char GAMEPAD_SCRIPT[] = R"( window.addEventListener("gamepadconnected", function(e) { console.log("Gamepad connected at index %d: %s. %d buttons, %d axes.", diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 85c37b842..ecd5dfac1 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -806,8 +806,8 @@ void Config::ReadRendererValues() { ReadGlobalSetting(Settings::values.fullscreen_mode); ReadGlobalSetting(Settings::values.aspect_ratio); ReadGlobalSetting(Settings::values.max_anisotropy); - ReadGlobalSetting(Settings::values.use_frame_limit); - ReadGlobalSetting(Settings::values.frame_limit); + ReadGlobalSetting(Settings::values.use_speed_limit); + ReadGlobalSetting(Settings::values.speed_limit); ReadGlobalSetting(Settings::values.use_disk_shader_cache); ReadGlobalSetting(Settings::values.gpu_accuracy); ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation); @@ -823,6 +823,7 @@ void Config::ReadRendererValues() { ReadGlobalSetting(Settings::values.bg_blue); if (global) { + ReadBasicSetting(Settings::values.fps_cap); ReadBasicSetting(Settings::values.renderer_debug); ReadBasicSetting(Settings::values.enable_nsight_aftermath); ReadBasicSetting(Settings::values.disable_shader_loop_safety_checks); @@ -1337,8 +1338,8 @@ void Config::SaveRendererValues() { Settings::values.fullscreen_mode.UsingGlobal()); WriteGlobalSetting(Settings::values.aspect_ratio); WriteGlobalSetting(Settings::values.max_anisotropy); - WriteGlobalSetting(Settings::values.use_frame_limit); - WriteGlobalSetting(Settings::values.frame_limit); + WriteGlobalSetting(Settings::values.use_speed_limit); + WriteGlobalSetting(Settings::values.speed_limit); WriteGlobalSetting(Settings::values.use_disk_shader_cache); WriteSetting(QString::fromStdString(Settings::values.gpu_accuracy.GetLabel()), static_cast<u32>(Settings::values.gpu_accuracy.GetValue(global)), @@ -1360,6 +1361,7 @@ void Config::SaveRendererValues() { WriteGlobalSetting(Settings::values.bg_blue); if (global) { + WriteBasicSetting(Settings::values.fps_cap); WriteBasicSetting(Settings::values.renderer_debug); WriteBasicSetting(Settings::values.enable_nsight_aftermath); WriteBasicSetting(Settings::values.disable_shader_loop_safety_checks); diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 18f25def6..1f647a0d1 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -24,8 +24,8 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent) SetConfiguration(); if (Settings::IsConfiguringGlobal()) { - connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit, - [this]() { ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked()); }); + connect(ui->toggle_speed_limit, &QCheckBox::clicked, ui->speed_limit, + [this]() { ui->speed_limit->setEnabled(ui->toggle_speed_limit->isChecked()); }); } connect(ui->button_reset_defaults, &QPushButton::clicked, this, @@ -45,16 +45,18 @@ void ConfigureGeneral::SetConfiguration() { ui->toggle_background_pause->setChecked(UISettings::values.pause_when_in_background.GetValue()); ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse.GetValue()); - ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue()); - ui->frame_limit->setValue(Settings::values.frame_limit.GetValue()); + ui->toggle_speed_limit->setChecked(Settings::values.use_speed_limit.GetValue()); + ui->speed_limit->setValue(Settings::values.speed_limit.GetValue()); + + ui->fps_cap->setValue(Settings::values.fps_cap.GetValue()); ui->button_reset_defaults->setEnabled(runtime_lock); if (Settings::IsConfiguringGlobal()) { - ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue()); + ui->speed_limit->setEnabled(Settings::values.use_speed_limit.GetValue()); } else { - ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue() && - use_frame_limit != ConfigurationShared::CheckState::Global); + ui->speed_limit->setEnabled(Settings::values.use_speed_limit.GetValue() && + use_speed_limit != ConfigurationShared::CheckState::Global); } } @@ -87,20 +89,22 @@ void ConfigureGeneral::ApplyConfiguration() { UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked(); UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked(); + Settings::values.fps_cap.SetValue(ui->fps_cap->value()); + // Guard if during game and set to game-specific value - if (Settings::values.use_frame_limit.UsingGlobal()) { - Settings::values.use_frame_limit.SetValue(ui->toggle_frame_limit->checkState() == + if (Settings::values.use_speed_limit.UsingGlobal()) { + Settings::values.use_speed_limit.SetValue(ui->toggle_speed_limit->checkState() == Qt::Checked); - Settings::values.frame_limit.SetValue(ui->frame_limit->value()); + Settings::values.speed_limit.SetValue(ui->speed_limit->value()); } } else { - bool global_frame_limit = use_frame_limit == ConfigurationShared::CheckState::Global; - Settings::values.use_frame_limit.SetGlobal(global_frame_limit); - Settings::values.frame_limit.SetGlobal(global_frame_limit); - if (!global_frame_limit) { - Settings::values.use_frame_limit.SetValue(ui->toggle_frame_limit->checkState() == + bool global_speed_limit = use_speed_limit == ConfigurationShared::CheckState::Global; + Settings::values.use_speed_limit.SetGlobal(global_speed_limit); + Settings::values.speed_limit.SetGlobal(global_speed_limit); + if (!global_speed_limit) { + Settings::values.use_speed_limit.SetValue(ui->toggle_speed_limit->checkState() == Qt::Checked); - Settings::values.frame_limit.SetValue(ui->frame_limit->value()); + Settings::values.speed_limit.SetValue(ui->speed_limit->value()); } } } @@ -122,8 +126,8 @@ void ConfigureGeneral::SetupPerGameUI() { // Disables each setting if: // - A game is running (thus settings in use), and // - A non-global setting is applied. - ui->toggle_frame_limit->setEnabled(Settings::values.use_frame_limit.UsingGlobal()); - ui->frame_limit->setEnabled(Settings::values.frame_limit.UsingGlobal()); + ui->toggle_speed_limit->setEnabled(Settings::values.use_speed_limit.UsingGlobal()); + ui->speed_limit->setEnabled(Settings::values.speed_limit.UsingGlobal()); return; } @@ -135,13 +139,13 @@ void ConfigureGeneral::SetupPerGameUI() { ui->button_reset_defaults->setVisible(false); - ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit, - Settings::values.use_frame_limit, use_frame_limit); + ConfigurationShared::SetColoredTristate(ui->toggle_speed_limit, + Settings::values.use_speed_limit, use_speed_limit); ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core, use_multi_core); - connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit, [this]() { - ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked() && - (use_frame_limit != ConfigurationShared::CheckState::Global)); + connect(ui->toggle_speed_limit, &QCheckBox::clicked, ui->speed_limit, [this]() { + ui->speed_limit->setEnabled(ui->toggle_speed_limit->isChecked() && + (use_speed_limit != ConfigurationShared::CheckState::Global)); }); } diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index a0fd52492..c9df37d73 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -43,6 +43,6 @@ private: std::unique_ptr<Ui::ConfigureGeneral> ui; - ConfigurationShared::CheckState use_frame_limit; + ConfigurationShared::CheckState use_speed_limit; ConfigurationShared::CheckState use_multi_core; }; diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index bc7041090..8ce97edec 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -27,14 +27,14 @@ <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QCheckBox" name="toggle_frame_limit"> + <widget class="QCheckBox" name="toggle_speed_limit"> <property name="text"> <string>Limit Speed Percent</string> </property> </widget> </item> <item> - <widget class="QSpinBox" name="frame_limit"> + <widget class="QSpinBox" name="speed_limit"> <property name="suffix"> <string>%</string> </property> @@ -52,6 +52,36 @@ </layout> </item> <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="fps_cap_label"> + <property name="text"> + <string>Framerate Cap</string> + </property> + <property name="toolTip"> + <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="fps_cap"> + <property name="suffix"> + <string>x</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>1000</number> + </property> + <property name="value"> + <number>500</number> + </property> + </widget> + </item> + </layout> + </item> + <item> <widget class="QCheckBox" name="use_multi_core"> <property name="text"> <string>Multicore CPU Emulation</string> diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 4a5b17740..37e896258 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -31,7 +31,7 @@ ConfigureGraphics::ConfigureGraphics(QWidget* parent) } ui->backend->addItem(QStringLiteral("GLSL")); - ui->backend->addItem(tr("GLASM (NVIDIA Only)")); + ui->backend->addItem(tr("GLASM (Assembly Shaders, NVIDIA Only)")); ui->backend->addItem(QStringLiteral("SPIR-V (Experimental, Mesa Only)")); SetupPerGameUI(); diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index f848b2982..9544f0fb0 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -972,23 +972,23 @@ void GMainWindow::InitializeHotkeys() { }); connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Speed Limit"), this), &QShortcut::activated, this, [&] { - Settings::values.use_frame_limit.SetValue( - !Settings::values.use_frame_limit.GetValue()); + Settings::values.use_speed_limit.SetValue( + !Settings::values.use_speed_limit.GetValue()); UpdateStatusBar(); }); constexpr u16 SPEED_LIMIT_STEP = 5; connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Increase Speed Limit"), this), &QShortcut::activated, this, [&] { - if (Settings::values.frame_limit.GetValue() < 9999 - SPEED_LIMIT_STEP) { - Settings::values.frame_limit.SetValue(SPEED_LIMIT_STEP + - Settings::values.frame_limit.GetValue()); + if (Settings::values.speed_limit.GetValue() < 9999 - SPEED_LIMIT_STEP) { + Settings::values.speed_limit.SetValue(SPEED_LIMIT_STEP + + Settings::values.speed_limit.GetValue()); UpdateStatusBar(); } }); connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Decrease Speed Limit"), this), &QShortcut::activated, this, [&] { - if (Settings::values.frame_limit.GetValue() > SPEED_LIMIT_STEP) { - Settings::values.frame_limit.SetValue(Settings::values.frame_limit.GetValue() - + if (Settings::values.speed_limit.GetValue() > SPEED_LIMIT_STEP) { + Settings::values.speed_limit.SetValue(Settings::values.speed_limit.GetValue() - SPEED_LIMIT_STEP); UpdateStatusBar(); } @@ -2910,16 +2910,16 @@ void GMainWindow::UpdateStatusBar() { shader_building_label->setVisible(false); } - if (Settings::values.use_frame_limit.GetValue()) { + if (Settings::values.use_speed_limit.GetValue()) { emu_speed_label->setText(tr("Speed: %1% / %2%") .arg(results.emulation_speed * 100.0, 0, 'f', 0) - .arg(Settings::values.frame_limit.GetValue())); + .arg(Settings::values.speed_limit.GetValue())); } else { emu_speed_label->setText(tr("Speed: %1%").arg(results.emulation_speed * 100.0, 0, 'f', 0)); } if (Settings::values.disable_fps_limit) { game_fps_label->setText( - tr("Game: %1 FPS (Limit off)").arg(results.average_game_fps, 0, 'f', 0)); + tr("Game: %1 FPS (Unlocked)").arg(results.average_game_fps, 0, 'f', 0)); } else { game_fps_label->setText(tr("Game: %1 FPS").arg(results.average_game_fps, 0, 'f', 0)); } |