diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/applets/qt_profile_select.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 12 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_general.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_general.ui | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 29 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_profile_manager.cpp | 10 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_touch_from_button.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/debugger/console.cpp | 1 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 157 | ||||
| -rw-r--r-- | src/yuzu/main.h | 4 | ||||
| -rw-r--r-- | src/yuzu/main.ui | 2 | ||||
| -rw-r--r-- | src/yuzu/uisettings.h | 1 | 
13 files changed, 159 insertions, 75 deletions
| diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp index 5b32da923..4cd8f7784 100644 --- a/src/yuzu/applets/qt_profile_select.cpp +++ b/src/yuzu/applets/qt_profile_select.cpp @@ -23,13 +23,13 @@ QString FormatUserEntryText(const QString& username, Common::UUID uuid) {      return QtProfileSelectionDialog::tr(                 "%1\n%2", "%1 is the profile username, %2 is the formatted UUID (e.g. "                           "00112233-4455-6677-8899-AABBCCDDEEFF))") -        .arg(username, QString::fromStdString(uuid.FormatSwitch())); +        .arg(username, QString::fromStdString(uuid.FormattedString()));  }  QString GetImagePath(Common::UUID uuid) {      const auto path =          Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir) / -        fmt::format("system/save/8000000000000010/su/avators/{}.jpg", uuid.FormatSwitch()); +        fmt::format("system/save/8000000000000010/su/avators/{}.jpg", uuid.FormattedString());      return QString::fromStdString(Common::FS::PathToUTF8String(path));  } diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 2c8c10c50..d5ba86c03 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -65,23 +65,25 @@ const std::array<int, 2> Config::default_stick_mod = {  // This must be in alphabetical order according to action name as it must have the same order as  // UISetting::values.shortcuts, which is alphabetically ordered.  // clang-format off -const std::array<UISettings::Shortcut, 20> Config::default_hotkeys{{ +const std::array<UISettings::Shortcut, 22> Config::default_hotkeys{{      {QStringLiteral("Audio Mute/Unmute"),        QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"),  QStringLiteral("Home+Dpad_Right"), Qt::WindowShortcut}},      {QStringLiteral("Audio Volume Down"),        QStringLiteral("Main Window"), {QStringLiteral("-"),       QStringLiteral("Home+Dpad_Down"), Qt::ApplicationShortcut}},      {QStringLiteral("Audio Volume Up"),          QStringLiteral("Main Window"), {QStringLiteral("+"),       QStringLiteral("Home+Dpad_Up"), Qt::ApplicationShortcut}},      {QStringLiteral("Capture Screenshot"),       QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"),  QStringLiteral("Screenshot"), Qt::WidgetWithChildrenShortcut}}, +    {QStringLiteral("Change Adapting Filter"),   QStringLiteral("Main Window"), {QStringLiteral("F8"),      QStringLiteral("Home+L"), Qt::ApplicationShortcut}},      {QStringLiteral("Change Docked Mode"),       QStringLiteral("Main Window"), {QStringLiteral("F10"),     QStringLiteral("Home+X"), Qt::ApplicationShortcut}}, +    {QStringLiteral("Change GPU Accuracy"),      QStringLiteral("Main Window"), {QStringLiteral("F9"),      QStringLiteral("Home+R"), Qt::ApplicationShortcut}},      {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"),      QStringLiteral("Home+Plus"), Qt::WindowShortcut}},      {QStringLiteral("Exit Fullscreen"),          QStringLiteral("Main Window"), {QStringLiteral("Esc"),     QStringLiteral(""), Qt::WindowShortcut}},      {QStringLiteral("Exit yuzu"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Q"),  QStringLiteral("Home+Minus"), Qt::WindowShortcut}},      {QStringLiteral("Fullscreen"),               QStringLiteral("Main Window"), {QStringLiteral("F11"),     QStringLiteral("Home+B"), Qt::WindowShortcut}}, -    {QStringLiteral("Load Amiibo"),              QStringLiteral("Main Window"), {QStringLiteral("F2"),      QStringLiteral("Home+A"), Qt::WidgetWithChildrenShortcut}},      {QStringLiteral("Load File"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+O"),  QStringLiteral(""), Qt::WidgetWithChildrenShortcut}}, +    {QStringLiteral("Load/Remove Amiibo"),       QStringLiteral("Main Window"), {QStringLiteral("F2"),      QStringLiteral("Home+A"), Qt::WidgetWithChildrenShortcut}},      {QStringLiteral("Restart Emulation"),        QStringLiteral("Main Window"), {QStringLiteral("F6"),      QStringLiteral(""), Qt::WindowShortcut}},      {QStringLiteral("Stop Emulation"),           QStringLiteral("Main Window"), {QStringLiteral("F5"),      QStringLiteral(""), Qt::WindowShortcut}}, -    {QStringLiteral("TAS Start/Stop"),           QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F5"), QStringLiteral(""), Qt::ApplicationShortcut}}, -    {QStringLiteral("TAS Reset"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F6"), QStringLiteral(""), Qt::ApplicationShortcut}},      {QStringLiteral("TAS Record"),               QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F7"), QStringLiteral(""), Qt::ApplicationShortcut}}, +    {QStringLiteral("TAS Reset"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F6"), QStringLiteral(""), Qt::ApplicationShortcut}}, +    {QStringLiteral("TAS Start/Stop"),           QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F5"), QStringLiteral(""), Qt::ApplicationShortcut}},      {QStringLiteral("Toggle Filter Bar"),        QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F"),  QStringLiteral(""), Qt::WindowShortcut}},      {QStringLiteral("Toggle Framerate Limit"),   QStringLiteral("Main Window"), {QStringLiteral("Ctrl+U"),  QStringLiteral("Home+Y"), Qt::ApplicationShortcut}},      {QStringLiteral("Toggle Mouse Panning"),     QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F9"), QStringLiteral(""), Qt::ApplicationShortcut}}, @@ -767,6 +769,7 @@ void Config::ReadUIValues() {      ReadBasicSetting(UISettings::values.callout_flags);      ReadBasicSetting(UISettings::values.show_console);      ReadBasicSetting(UISettings::values.pause_when_in_background); +    ReadBasicSetting(UISettings::values.mute_when_in_background);      ReadBasicSetting(UISettings::values.hide_mouse);      qt_config->endGroup(); @@ -1295,6 +1298,7 @@ void Config::SaveUIValues() {      WriteBasicSetting(UISettings::values.callout_flags);      WriteBasicSetting(UISettings::values.show_console);      WriteBasicSetting(UISettings::values.pause_when_in_background); +    WriteBasicSetting(UISettings::values.mute_when_in_background);      WriteBasicSetting(UISettings::values.hide_mouse);      qt_config->endGroup(); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 60b20a62f..ae3e36a11 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -46,7 +46,7 @@ public:          default_mouse_buttons;      static const std::array<int, Settings::NativeKeyboard::NumKeyboardKeys> default_keyboard_keys;      static const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> default_keyboard_mods; -    static const std::array<UISettings::Shortcut, 20> default_hotkeys; +    static const std::array<UISettings::Shortcut, 22> default_hotkeys;      static constexpr UISettings::Theme default_theme{  #ifdef _WIN32 diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 566879317..978a29fe6 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -46,6 +46,7 @@ void ConfigureGeneral::SetConfiguration() {      ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing.GetValue());      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_background_mute->setChecked(UISettings::values.mute_when_in_background.GetValue());      ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse.GetValue());      ui->toggle_speed_limit->setChecked(Settings::values.use_speed_limit.GetValue()); @@ -95,6 +96,7 @@ void ConfigureGeneral::ApplyConfiguration() {          UISettings::values.confirm_before_closing = ui->toggle_check_exit->isChecked();          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.mute_when_in_background = ui->toggle_background_mute->isChecked();          UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked();          Settings::values.fps_cap.SetValue(ui->fps_cap->value()); diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index 112dc72b3..bfc771135 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -164,6 +164,13 @@             </widget>            </item>            <item> +           <widget class="QCheckBox" name="toggle_background_mute"> +            <property name="text"> +             <string>Mute audio when in background</string> +            </property> +           </widget> +          </item> +          <item>             <widget class="QCheckBox" name="toggle_hide_mouse">              <property name="text">               <string>Hide mouse on inactivity</string> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index cc0534907..0aa4ac3e4 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -488,6 +488,32 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i                              emulated_controller->SetStickParam(analog_id, {});                              analog_map_buttons[analog_id][sub_button_id]->setText(tr("[not set]"));                          }); +                        context_menu.addAction(tr("Center axis"), [&] { +                            const auto stick_value = +                                emulated_controller->GetSticksValues()[analog_id]; +                            const float offset_x = stick_value.x.properties.offset; +                            const float offset_y = stick_value.y.properties.offset; +                            float raw_value_x = stick_value.x.raw_value; +                            float raw_value_y = stick_value.y.raw_value; +                            // See Core::HID::SanitizeStick() to obtain the original raw axis value +                            if (std::abs(offset_x) < 0.5f) { +                                if (raw_value_x > 0) { +                                    raw_value_x *= 1 + offset_x; +                                } else { +                                    raw_value_x *= 1 - offset_x; +                                } +                            } +                            if (std::abs(offset_x) < 0.5f) { +                                if (raw_value_y > 0) { +                                    raw_value_y *= 1 + offset_y; +                                } else { +                                    raw_value_y *= 1 - offset_y; +                                } +                            } +                            param.Set("offset_x", -raw_value_x + offset_x); +                            param.Set("offset_y", -raw_value_y + offset_y); +                            emulated_controller->SetStickParam(analog_id, param); +                        });                          context_menu.addAction(tr("Invert axis"), [&] {                              if (sub_button_id == 2 || sub_button_id == 3) {                                  const bool invert_value = param.Get("invert_x", "+") == "-"; @@ -1306,6 +1332,9 @@ void ConfigureInputPlayer::HandleClick(      QPushButton* button, std::size_t button_id,      std::function<void(const Common::ParamPackage&)> new_input_setter,      InputCommon::Polling::InputType type) { +    if (timeout_timer->isActive()) { +        return; +    }      if (button == ui->buttonMotionLeft || button == ui->buttonMotionRight) {          button->setText(tr("Shake!"));      } else { diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index 78b6374c0..d9f6dee4e 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -33,10 +33,10 @@ constexpr std::array<u8, 107> backup_jpeg{      0x01, 0x01, 0x00, 0x00, 0x3f, 0x00, 0xd2, 0xcf, 0x20, 0xff, 0xd9,  }; -QString GetImagePath(Common::UUID uuid) { +QString GetImagePath(const Common::UUID& uuid) {      const auto path =          Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir) / -        fmt::format("system/save/8000000000000010/su/avators/{}.jpg", uuid.FormatSwitch()); +        fmt::format("system/save/8000000000000010/su/avators/{}.jpg", uuid.FormattedString());      return QString::fromStdString(Common::FS::PathToUTF8String(path));  } @@ -55,10 +55,10 @@ QString FormatUserEntryText(const QString& username, Common::UUID uuid) {      return ConfigureProfileManager::tr("%1\n%2",                                         "%1 is the profile username, %2 is the formatted UUID (e.g. "                                         "00112233-4455-6677-8899-AABBCCDDEEFF))") -        .arg(username, QString::fromStdString(uuid.FormatSwitch())); +        .arg(username, QString::fromStdString(uuid.FormattedString()));  } -QPixmap GetIcon(Common::UUID uuid) { +QPixmap GetIcon(const Common::UUID& uuid) {      QPixmap icon{GetImagePath(uuid)};      if (!icon) { @@ -200,7 +200,7 @@ void ConfigureProfileManager::AddUser() {          return;      } -    const auto uuid = Common::UUID::Generate(); +    const auto uuid = Common::UUID::MakeRandom();      profile_manager->CreateNewUser(uuid, username.toStdString());      item_model->appendRow(new QStandardItem{GetIcon(uuid), FormatUserEntryText(username, uuid)}); diff --git a/src/yuzu/configuration/configure_touch_from_button.cpp b/src/yuzu/configuration/configure_touch_from_button.cpp index bde0a08c4..211a00217 100644 --- a/src/yuzu/configuration/configure_touch_from_button.cpp +++ b/src/yuzu/configuration/configure_touch_from_button.cpp @@ -227,6 +227,9 @@ void ConfigureTouchFromButton::RenameMapping() {  }  void ConfigureTouchFromButton::GetButtonInput(const int row_index, const bool is_new) { +    if (timeout_timer->isActive()) { +        return; +    }      binding_list_model->item(row_index, 0)->setText(tr("[press key]"));      input_setter = [this, row_index, is_new](const Common::ParamPackage& params, diff --git a/src/yuzu/debugger/console.cpp b/src/yuzu/debugger/console.cpp index f89ea8ea7..4b508b466 100644 --- a/src/yuzu/debugger/console.cpp +++ b/src/yuzu/debugger/console.cpp @@ -30,6 +30,7 @@ void ToggleConsole() {              freopen_s(&temp, "CONIN$", "r", stdin);              freopen_s(&temp, "CONOUT$", "w", stdout);              freopen_s(&temp, "CONOUT$", "w", stderr); +            SetConsoleOutputCP(65001);              SetColorConsoleBackendEnabled(true);          }      } else { diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index c788db12d..e3fd38a02 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -806,21 +806,8 @@ void GMainWindow::InitializeWidgets() {      filter_status_button = new QPushButton();      filter_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));      filter_status_button->setFocusPolicy(Qt::NoFocus); -    connect(filter_status_button, &QPushButton::clicked, [&] { -        auto filter = Settings::values.scaling_filter.GetValue(); -        if (filter == Settings::ScalingFilter::LastFilter) { -            filter = Settings::ScalingFilter::NearestNeighbor; -        } else { -            filter = static_cast<Settings::ScalingFilter>(static_cast<u32>(filter) + 1); -        } -        if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL && -            filter == Settings::ScalingFilter::Fsr) { -            filter = Settings::ScalingFilter::NearestNeighbor; -        } -        Settings::values.scaling_filter.SetValue(filter); -        filter_status_button->setChecked(true); -        UpdateFilterText(); -    }); +    connect(filter_status_button, &QPushButton::clicked, this, +            &GMainWindow::OnToggleAdaptingFilter);      auto filter = Settings::values.scaling_filter.GetValue();      if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL &&          filter == Settings::ScalingFilter::Fsr) { @@ -835,25 +822,7 @@ void GMainWindow::InitializeWidgets() {      dock_status_button = new QPushButton();      dock_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));      dock_status_button->setFocusPolicy(Qt::NoFocus); -    connect(dock_status_button, &QPushButton::clicked, [&] { -        const bool is_docked = Settings::values.use_docked_mode.GetValue(); -        auto* player_1 = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); -        auto* handheld = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); - -        if (!is_docked && handheld->IsConnected()) { -            QMessageBox::warning(this, tr("Invalid config detected"), -                                 tr("Handheld controller can't be used on docked mode. Pro " -                                    "controller will be selected.")); -            handheld->Disconnect(); -            player_1->SetNpadStyleIndex(Core::HID::NpadStyleIndex::ProController); -            player_1->Connect(); -            controller_dialog->refreshConfiguration(); -        } - -        Settings::values.use_docked_mode.SetValue(!is_docked); -        dock_status_button->setChecked(!is_docked); -        OnDockedModeChanged(is_docked, !is_docked, *system); -    }); +    connect(dock_status_button, &QPushButton::clicked, this, &GMainWindow::OnToggleDockedMode);      dock_status_button->setText(tr("DOCK"));      dock_status_button->setCheckable(true);      dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue()); @@ -863,22 +832,7 @@ void GMainWindow::InitializeWidgets() {      gpu_accuracy_button->setObjectName(QStringLiteral("GPUStatusBarButton"));      gpu_accuracy_button->setCheckable(true);      gpu_accuracy_button->setFocusPolicy(Qt::NoFocus); -    connect(gpu_accuracy_button, &QPushButton::clicked, [this] { -        switch (Settings::values.gpu_accuracy.GetValue()) { -        case Settings::GPUAccuracy::High: { -            Settings::values.gpu_accuracy.SetValue(Settings::GPUAccuracy::Normal); -            break; -        } -        case Settings::GPUAccuracy::Normal: -        case Settings::GPUAccuracy::Extreme: -        default: { -            Settings::values.gpu_accuracy.SetValue(Settings::GPUAccuracy::High); -        } -        } - -        system->ApplySettings(); -        UpdateGPUAccuracyButton(); -    }); +    connect(gpu_accuracy_button, &QPushButton::clicked, this, &GMainWindow::OnToggleGpuAccuracy);      UpdateGPUAccuracyButton();      statusBar()->insertPermanentWidget(0, gpu_accuracy_button); @@ -980,7 +934,7 @@ void GMainWindow::InitializeHotkeys() {      hotkey_registry.LoadHotkeys();      LinkActionShortcut(ui->action_Load_File, QStringLiteral("Load File")); -    LinkActionShortcut(ui->action_Load_Amiibo, QStringLiteral("Load Amiibo")); +    LinkActionShortcut(ui->action_Load_Amiibo, QStringLiteral("Load/Remove Amiibo"));      LinkActionShortcut(ui->action_Exit, QStringLiteral("Exit yuzu"));      LinkActionShortcut(ui->action_Restart, QStringLiteral("Restart Emulation"));      LinkActionShortcut(ui->action_Pause, QStringLiteral("Continue/Pause Emulation")); @@ -1009,12 +963,10 @@ void GMainWindow::InitializeHotkeys() {              ToggleFullscreen();          }      }); -    connect_shortcut(QStringLiteral("Change Docked Mode"), [&] { -        Settings::values.use_docked_mode.SetValue(!Settings::values.use_docked_mode.GetValue()); -        OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(), -                            Settings::values.use_docked_mode.GetValue(), *system); -        dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue()); -    }); +    connect_shortcut(QStringLiteral("Change Adapting Filter"), +                     &GMainWindow::OnToggleAdaptingFilter); +    connect_shortcut(QStringLiteral("Change Docked Mode"), &GMainWindow::OnToggleDockedMode); +    connect_shortcut(QStringLiteral("Change GPU Accuracy"), &GMainWindow::OnToggleGpuAccuracy);      connect_shortcut(QStringLiteral("Audio Mute/Unmute"),                       [] { Settings::values.audio_muted = !Settings::values.audio_muted; });      connect_shortcut(QStringLiteral("Audio Volume Down"), [] { @@ -1082,14 +1034,14 @@ 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 (emulation_running) { +    if (!emulation_running) { +        return; +    } +    if (UISettings::values.pause_when_in_background) {          if (emu_thread->IsRunning() &&              (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {              auto_paused = true; @@ -1099,6 +1051,16 @@ void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {              OnStartGame();          }      } +    if (UISettings::values.mute_when_in_background) { +        if (!Settings::values.audio_muted && +            (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) { +            Settings::values.audio_muted = true; +            auto_muted = true; +        } else if (auto_muted && state == Qt::ApplicationActive) { +            Settings::values.audio_muted = false; +            auto_muted = false; +        } +    }  }  void GMainWindow::ConnectWidgetEvents() { @@ -1690,7 +1652,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target              const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath(                  *system, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData, -                program_id, user_id->uuid, 0); +                program_id, user_id->AsU128(), 0);              path = Common::FS::ConcatPathSafe(nand_dir, user_save_data_path);          } else { @@ -2868,6 +2830,59 @@ void GMainWindow::OnTasReset() {      input_subsystem->GetTas()->Reset();  } +void GMainWindow::OnToggleDockedMode() { +    const bool is_docked = Settings::values.use_docked_mode.GetValue(); +    auto* player_1 = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); +    auto* handheld = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); + +    if (!is_docked && handheld->IsConnected()) { +        QMessageBox::warning(this, tr("Invalid config detected"), +                             tr("Handheld controller can't be used on docked mode. Pro " +                                "controller will be selected.")); +        handheld->Disconnect(); +        player_1->SetNpadStyleIndex(Core::HID::NpadStyleIndex::ProController); +        player_1->Connect(); +        controller_dialog->refreshConfiguration(); +    } + +    Settings::values.use_docked_mode.SetValue(!is_docked); +    dock_status_button->setChecked(!is_docked); +    OnDockedModeChanged(is_docked, !is_docked, *system); +} + +void GMainWindow::OnToggleGpuAccuracy() { +    switch (Settings::values.gpu_accuracy.GetValue()) { +    case Settings::GPUAccuracy::High: { +        Settings::values.gpu_accuracy.SetValue(Settings::GPUAccuracy::Normal); +        break; +    } +    case Settings::GPUAccuracy::Normal: +    case Settings::GPUAccuracy::Extreme: +    default: { +        Settings::values.gpu_accuracy.SetValue(Settings::GPUAccuracy::High); +    } +    } + +    system->ApplySettings(); +    UpdateGPUAccuracyButton(); +} + +void GMainWindow::OnToggleAdaptingFilter() { +    auto filter = Settings::values.scaling_filter.GetValue(); +    if (filter == Settings::ScalingFilter::LastFilter) { +        filter = Settings::ScalingFilter::NearestNeighbor; +    } else { +        filter = static_cast<Settings::ScalingFilter>(static_cast<u32>(filter) + 1); +    } +    if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL && +        filter == Settings::ScalingFilter::Fsr) { +        filter = Settings::ScalingFilter::NearestNeighbor; +    } +    Settings::values.scaling_filter.SetValue(filter); +    filter_status_button->setChecked(true); +    UpdateFilterText(); +} +  void GMainWindow::OnConfigurePerGame() {      const u64 title_id = system->GetCurrentProcessProgramID();      OpenPerGameConfiguration(title_id, game_path.toStdString()); @@ -2912,6 +2927,24 @@ void GMainWindow::OnLoadAmiibo() {          return;      } +    Service::SM::ServiceManager& sm = system->ServiceManager(); +    auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user"); +    if (nfc == nullptr) { +        QMessageBox::warning(this, tr("Error"), tr("The current game is not looking for amiibos")); +        return; +    } +    const auto nfc_state = nfc->GetCurrentState(); +    if (nfc_state == Service::NFP::DeviceState::TagFound || +        nfc_state == Service::NFP::DeviceState::TagMounted) { +        nfc->CloseAmiibo(); +        return; +    } + +    if (nfc_state != Service::NFP::DeviceState::SearchingForTag) { +        QMessageBox::warning(this, tr("Error"), tr("The current game is not looking for amiibos")); +        return; +    } +      is_amiibo_file_select_active = true;      const QString extensions{QStringLiteral("*.bin")};      const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index ca4ab9af5..6a35b9e3d 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -284,6 +284,9 @@ private slots:      void OnTasStartStop();      void OnTasRecord();      void OnTasReset(); +    void OnToggleDockedMode(); +    void OnToggleGpuAccuracy(); +    void OnToggleAdaptingFilter();      void OnConfigurePerGame();      void OnLoadAmiibo();      void OnOpenYuzuFolder(); @@ -369,6 +372,7 @@ private:      QString game_path;      bool auto_paused = false; +    bool auto_muted = false;      QTimer mouse_hide_timer;      // FS diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 5719b2ee4..6ab95b9a5 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -266,7 +266,7 @@      <bool>false</bool>     </property>     <property name="text"> -    <string>Load &Amiibo...</string> +    <string>Load/Remove &Amiibo...</string>     </property>    </action>    <action name="action_Report_Compatibility"> diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h index f7298ddad..06e8b46da 100644 --- a/src/yuzu/uisettings.h +++ b/src/yuzu/uisettings.h @@ -73,6 +73,7 @@ struct Values {      Settings::BasicSetting<bool> confirm_before_closing{true, "confirmClose"};      Settings::BasicSetting<bool> first_start{true, "firstStart"};      Settings::BasicSetting<bool> pause_when_in_background{false, "pauseWhenInBackground"}; +    Settings::BasicSetting<bool> mute_when_in_background{false, "muteWhenInBackground"};      Settings::BasicSetting<bool> hide_mouse{true, "hideInactiveMouse"};      Settings::BasicSetting<bool> select_user_on_boot{false, "select_user_on_boot"}; | 
