diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_profile_select.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_software_keyboard.cpp | 10 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_software_keyboard.h | 17 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_web_browser.cpp | 12 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_web_browser.h | 10 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_audio.cpp | 117 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_audio.h | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input.cpp | 18 | ||||
| -rw-r--r-- | src/yuzu/game_list.cpp | 12 | ||||
| -rw-r--r-- | src/yuzu/game_list.h | 3 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 168 | ||||
| -rw-r--r-- | src/yuzu/main.h | 38 | 
13 files changed, 248 insertions, 172 deletions
| diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index bc667b39f..76f06da12 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -378,8 +378,6 @@ elseif(WIN32)      endif()  endif() -create_target_directory_groups(yuzu) -  target_link_libraries(yuzu PRIVATE common core input_common frontend_common network video_core)  target_link_libraries(yuzu PRIVATE Boost::headers glad Qt${QT_MAJOR_VERSION}::Widgets)  target_link_libraries(yuzu PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) @@ -475,3 +473,5 @@ endif()  if (YUZU_USE_PRECOMPILED_HEADERS)      target_precompile_headers(yuzu PRIVATE precompiled_headers.h)  endif() + +create_target_directory_groups(yuzu) diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp index 79162a491..66edd6acd 100644 --- a/src/yuzu/applets/qt_profile_select.cpp +++ b/src/yuzu/applets/qt_profile_select.cpp @@ -162,7 +162,7 @@ void QtProfileSelectionDialog::SelectUser(const QModelIndex& index) {  void QtProfileSelectionDialog::SetWindowTitle(      const Core::Frontend::ProfileSelectParameters& parameters) { -    using Service::AM::Applets::UiMode; +    using Service::AM::Frontend::UiMode;      switch (parameters.mode) {      case UiMode::UserCreator:      case UiMode::UserCreatorForStarter: @@ -193,7 +193,7 @@ void QtProfileSelectionDialog::SetWindowTitle(  void QtProfileSelectionDialog::SetDialogPurpose(      const Core::Frontend::ProfileSelectParameters& parameters) { -    using Service::AM::Applets::UserSelectionPurpose; +    using Service::AM::Frontend::UserSelectionPurpose;      switch (parameters.purpose) {      case UserSelectionPurpose::GameCardRegistration: diff --git a/src/yuzu/applets/qt_software_keyboard.cpp b/src/yuzu/applets/qt_software_keyboard.cpp index ac81ace9e..2749e6ed3 100644 --- a/src/yuzu/applets/qt_software_keyboard.cpp +++ b/src/yuzu/applets/qt_software_keyboard.cpp @@ -20,7 +20,7 @@  namespace { -using namespace Service::AM::Applets; +using namespace Service::AM::Frontend;  constexpr float BASE_HEADER_FONT_SIZE = 23.0f;  constexpr float BASE_SUB_FONT_SIZE = 17.0f; @@ -389,7 +389,7 @@ void QtSoftwareKeyboardDialog::ShowNormalKeyboard(QPoint pos, QSize size) {  }  void QtSoftwareKeyboardDialog::ShowTextCheckDialog( -    Service::AM::Applets::SwkbdTextCheckResult text_check_result, +    Service::AM::Frontend::SwkbdTextCheckResult text_check_result,      std::u16string text_check_message) {      switch (text_check_result) {      case SwkbdTextCheckResult::Success: @@ -1612,7 +1612,7 @@ void QtSoftwareKeyboard::ShowNormalKeyboard() const {  }  void QtSoftwareKeyboard::ShowTextCheckDialog( -    Service::AM::Applets::SwkbdTextCheckResult text_check_result, +    Service::AM::Frontend::SwkbdTextCheckResult text_check_result,      std::u16string text_check_message) const {      emit MainWindowShowTextCheckDialog(text_check_result, std::move(text_check_message));  } @@ -1662,12 +1662,12 @@ void QtSoftwareKeyboard::ExitKeyboard() const {      emit MainWindowExitKeyboard();  } -void QtSoftwareKeyboard::SubmitNormalText(Service::AM::Applets::SwkbdResult result, +void QtSoftwareKeyboard::SubmitNormalText(Service::AM::Frontend::SwkbdResult result,                                            std::u16string submitted_text, bool confirmed) const {      submit_normal_callback(result, submitted_text, confirmed);  } -void QtSoftwareKeyboard::SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type, +void QtSoftwareKeyboard::SubmitInlineText(Service::AM::Frontend::SwkbdReplyType reply_type,                                            std::u16string submitted_text,                                            s32 cursor_position) const {      submit_inline_callback(reply_type, submitted_text, cursor_position); diff --git a/src/yuzu/applets/qt_software_keyboard.h b/src/yuzu/applets/qt_software_keyboard.h index ac23ce047..7e2fdf09e 100644 --- a/src/yuzu/applets/qt_software_keyboard.h +++ b/src/yuzu/applets/qt_software_keyboard.h @@ -39,7 +39,7 @@ public:      void ShowNormalKeyboard(QPoint pos, QSize size); -    void ShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result, +    void ShowTextCheckDialog(Service::AM::Frontend::SwkbdTextCheckResult text_check_result,                               std::u16string text_check_message);      void ShowInlineKeyboard(Core::Frontend::InlineAppearParameters appear_parameters, QPoint pos, @@ -52,10 +52,10 @@ public:      void ExitKeyboard();  signals: -    void SubmitNormalText(Service::AM::Applets::SwkbdResult result, std::u16string submitted_text, +    void SubmitNormalText(Service::AM::Frontend::SwkbdResult result, std::u16string submitted_text,                            bool confirmed = false) const; -    void SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type, +    void SubmitInlineText(Service::AM::Frontend::SwkbdReplyType reply_type,                            std::u16string submitted_text, s32 cursor_position) const;  public slots: @@ -244,7 +244,7 @@ public:      void ShowNormalKeyboard() const override; -    void ShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result, +    void ShowTextCheckDialog(Service::AM::Frontend::SwkbdTextCheckResult text_check_result,                               std::u16string text_check_message) const override;      void ShowInlineKeyboard( @@ -262,8 +262,9 @@ signals:      void MainWindowShowNormalKeyboard() const; -    void MainWindowShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result, -                                       std::u16string text_check_message) const; +    void MainWindowShowTextCheckDialog( +        Service::AM::Frontend::SwkbdTextCheckResult text_check_result, +        std::u16string text_check_message) const;      void MainWindowShowInlineKeyboard(          Core::Frontend::InlineAppearParameters appear_parameters) const; @@ -275,10 +276,10 @@ signals:      void MainWindowExitKeyboard() const;  private: -    void SubmitNormalText(Service::AM::Applets::SwkbdResult result, std::u16string submitted_text, +    void SubmitNormalText(Service::AM::Frontend::SwkbdResult result, std::u16string submitted_text,                            bool confirmed) const; -    void SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type, +    void SubmitInlineText(Service::AM::Frontend::SwkbdReplyType reply_type,                            std::u16string submitted_text, s32 cursor_position) const;      mutable SubmitNormalCallback submit_normal_callback; diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp index 34c5fd3be..cce9b2efb 100644 --- a/src/yuzu/applets/qt_web_browser.cpp +++ b/src/yuzu/applets/qt_web_browser.cpp @@ -96,7 +96,7 @@ QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system,          [this] {              if (page()->url() == url_interceptor->GetRequestedURL()) {                  SetFinished(true); -                SetExitReason(Service::AM::Applets::WebExitReason::WindowClosed); +                SetExitReason(Service::AM::Frontend::WebExitReason::WindowClosed);              }          },          Qt::QueuedConnection); @@ -115,7 +115,7 @@ void QtNXWebEngineView::LoadLocalWebPage(const std::string& main_url,      FocusFirstLinkElement();      SetUserAgent(UserAgent::WebApplet);      SetFinished(false); -    SetExitReason(Service::AM::Applets::WebExitReason::EndButtonPressed); +    SetExitReason(Service::AM::Frontend::WebExitReason::EndButtonPressed);      SetLastURL("http://localhost/");      StartInputThread(); @@ -130,7 +130,7 @@ void QtNXWebEngineView::LoadExternalWebPage(const std::string& main_url,      FocusFirstLinkElement();      SetUserAgent(UserAgent::WebApplet);      SetFinished(false); -    SetExitReason(Service::AM::Applets::WebExitReason::EndButtonPressed); +    SetExitReason(Service::AM::Frontend::WebExitReason::EndButtonPressed);      SetLastURL("http://localhost/");      StartInputThread(); @@ -170,11 +170,11 @@ void QtNXWebEngineView::SetFinished(bool finished_) {      finished = finished_;  } -Service::AM::Applets::WebExitReason QtNXWebEngineView::GetExitReason() const { +Service::AM::Frontend::WebExitReason QtNXWebEngineView::GetExitReason() const {      return exit_reason;  } -void QtNXWebEngineView::SetExitReason(Service::AM::Applets::WebExitReason exit_reason_) { +void QtNXWebEngineView::SetExitReason(Service::AM::Frontend::WebExitReason exit_reason_) {      exit_reason = exit_reason_;  } @@ -441,7 +441,7 @@ void QtWebBrowser::MainWindowExtractOfflineRomFS() {      extract_romfs_callback();  } -void QtWebBrowser::MainWindowWebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason, +void QtWebBrowser::MainWindowWebBrowserClosed(Service::AM::Frontend::WebExitReason exit_reason,                                                std::string last_url) {      if (callback) {          callback(exit_reason, last_url); diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h index 1234108ae..e8a0b6931 100644 --- a/src/yuzu/applets/qt_web_browser.h +++ b/src/yuzu/applets/qt_web_browser.h @@ -85,8 +85,8 @@ public:      [[nodiscard]] bool IsFinished() const;      void SetFinished(bool finished_); -    [[nodiscard]] Service::AM::Applets::WebExitReason GetExitReason() const; -    void SetExitReason(Service::AM::Applets::WebExitReason exit_reason_); +    [[nodiscard]] Service::AM::Frontend::WebExitReason GetExitReason() const; +    void SetExitReason(Service::AM::Frontend::WebExitReason exit_reason_);      [[nodiscard]] const std::string& GetLastURL() const;      void SetLastURL(std::string last_url_); @@ -176,8 +176,8 @@ private:      std::atomic<bool> finished{}; -    Service::AM::Applets::WebExitReason exit_reason{ -        Service::AM::Applets::WebExitReason::EndButtonPressed}; +    Service::AM::Frontend::WebExitReason exit_reason{ +        Service::AM::Frontend::WebExitReason::EndButtonPressed};      std::string last_url{"http://localhost/"}; @@ -212,7 +212,7 @@ signals:  private:      void MainWindowExtractOfflineRomFS(); -    void MainWindowWebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason, +    void MainWindowWebBrowserClosed(Service::AM::Frontend::WebExitReason exit_reason,                                      std::string last_url);      mutable ExtractROMFSCallback extract_romfs_callback; diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp index 9b6ef47a7..c235b0fca 100644 --- a/src/yuzu/configuration/configure_audio.cpp +++ b/src/yuzu/configuration/configure_audio.cpp @@ -5,6 +5,7 @@  #include <memory>  #include <vector>  #include <QComboBox> +#include <QPushButton>  #include "audio_core/sink/sink.h"  #include "audio_core/sink/sink_details.h" @@ -67,19 +68,99 @@ void ConfigureAudio::Setup(const ConfigurationShared::Builder& builder) {          hold.emplace(std::pair{setting->Id(), widget}); +        auto global_sink_match = [this] { +            return static_cast<Settings::AudioEngine>(sink_combo_box->currentIndex()) == +                   Settings::values.sink_id.GetValue(true); +        };          if (setting->Id() == Settings::values.sink_id.Id()) {              // TODO (lat9nq): Let the system manage sink_id              sink_combo_box = widget->combobox;              InitializeAudioSinkComboBox(); -            connect(sink_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, -                    &ConfigureAudio::UpdateAudioDevices); +            if (Settings::IsConfiguringGlobal()) { +                connect(sink_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, +                        &ConfigureAudio::UpdateAudioDevices); +            } else { +                restore_sink_button = ConfigurationShared::Widget::CreateRestoreGlobalButton( +                    Settings::values.sink_id.UsingGlobal(), widget); +                widget->layout()->addWidget(restore_sink_button); +                connect(restore_sink_button, &QAbstractButton::clicked, [this](bool) { +                    Settings::values.sink_id.SetGlobal(true); +                    const int sink_index = static_cast<int>(Settings::values.sink_id.GetValue()); +                    sink_combo_box->setCurrentIndex(sink_index); +                    ConfigureAudio::UpdateAudioDevices(sink_index); +                    Settings::values.audio_output_device_id.SetGlobal(true); +                    Settings::values.audio_input_device_id.SetGlobal(true); +                    restore_sink_button->setVisible(false); +                }); +                connect(sink_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), +                        [this, global_sink_match](const int slot) { +                            Settings::values.sink_id.SetGlobal(false); +                            Settings::values.audio_output_device_id.SetGlobal(false); +                            Settings::values.audio_input_device_id.SetGlobal(false); + +                            restore_sink_button->setVisible(true); +                            restore_sink_button->setEnabled(true); +                            output_device_combo_box->setCurrentIndex(0); +                            restore_output_device_button->setVisible(true); +                            restore_output_device_button->setEnabled(global_sink_match()); +                            input_device_combo_box->setCurrentIndex(0); +                            restore_input_device_button->setVisible(true); +                            restore_input_device_button->setEnabled(global_sink_match()); +                            ConfigureAudio::UpdateAudioDevices(slot); +                        }); +            }          } else if (setting->Id() == Settings::values.audio_output_device_id.Id()) {              // Keep track of output (and input) device comboboxes to populate them with system              // devices, which are determined at run time              output_device_combo_box = widget->combobox; + +            if (!Settings::IsConfiguringGlobal()) { +                restore_output_device_button = +                    ConfigurationShared::Widget::CreateRestoreGlobalButton( +                        Settings::values.audio_output_device_id.UsingGlobal(), widget); +                restore_output_device_button->setEnabled(global_sink_match()); +                restore_output_device_button->setVisible( +                    !Settings::values.audio_output_device_id.UsingGlobal()); +                widget->layout()->addWidget(restore_output_device_button); +                connect(restore_output_device_button, &QAbstractButton::clicked, [this](bool) { +                    Settings::values.audio_output_device_id.SetGlobal(true); +                    SetOutputDevicesFromDeviceID(); +                    restore_output_device_button->setVisible(false); +                }); +                connect(output_device_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), +                        [this, global_sink_match](int) { +                            if (updating_devices) { +                                return; +                            } +                            Settings::values.audio_output_device_id.SetGlobal(false); +                            restore_output_device_button->setVisible(true); +                            restore_output_device_button->setEnabled(global_sink_match()); +                        }); +            }          } else if (setting->Id() == Settings::values.audio_input_device_id.Id()) {              input_device_combo_box = widget->combobox; + +            if (!Settings::IsConfiguringGlobal()) { +                restore_input_device_button = +                    ConfigurationShared::Widget::CreateRestoreGlobalButton( +                        Settings::values.audio_input_device_id.UsingGlobal(), widget); +                widget->layout()->addWidget(restore_input_device_button); +                connect(restore_input_device_button, &QAbstractButton::clicked, [this](bool) { +                    Settings::values.audio_input_device_id.SetGlobal(true); +                    SetInputDevicesFromDeviceID(); +                    restore_input_device_button->setVisible(false); +                }); +                connect(input_device_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), +                        [this, global_sink_match](int) { +                            if (updating_devices) { +                                return; +                            } +                            Settings::values.audio_input_device_id.SetGlobal(false); +                            restore_input_device_button->setVisible(true); +                            restore_input_device_button->setEnabled(global_sink_match()); +                        }); +            }          }      } @@ -89,16 +170,13 @@ void ConfigureAudio::Setup(const ConfigurationShared::Builder& builder) {  }  void ConfigureAudio::SetConfiguration() { -    if (!Settings::IsConfiguringGlobal()) { -        return; -    } -      SetOutputSinkFromSinkID();      // The device list cannot be pre-populated (nor listed) until the output sink is known.      UpdateAudioDevices(sink_combo_box->currentIndex()); -    SetAudioDevicesFromDeviceID(); +    SetOutputDevicesFromDeviceID(); +    SetInputDevicesFromDeviceID();  }  void ConfigureAudio::SetOutputSinkFromSinkID() { @@ -116,8 +194,8 @@ void ConfigureAudio::SetOutputSinkFromSinkID() {      sink_combo_box->setCurrentIndex(new_sink_index);  } -void ConfigureAudio::SetAudioDevicesFromDeviceID() { -    int new_device_index = -1; +void ConfigureAudio::SetOutputDevicesFromDeviceID() { +    int new_device_index = 0;      const QString output_device_id =          QString::fromStdString(Settings::values.audio_output_device_id.GetValue()); @@ -129,8 +207,10 @@ void ConfigureAudio::SetAudioDevicesFromDeviceID() {      }      output_device_combo_box->setCurrentIndex(new_device_index); +} -    new_device_index = -1; +void ConfigureAudio::SetInputDevicesFromDeviceID() { +    int new_device_index = 0;      const QString input_device_id =          QString::fromStdString(Settings::values.audio_input_device_id.GetValue());      for (int index = 0; index < input_device_combo_box->count(); index++) { @@ -149,15 +229,12 @@ void ConfigureAudio::ApplyConfiguration() {          apply_func(is_powered_on);      } -    if (Settings::IsConfiguringGlobal()) { -        Settings::values.sink_id.LoadString( -            sink_combo_box->itemText(sink_combo_box->currentIndex()).toStdString()); -        Settings::values.audio_output_device_id.SetValue( -            output_device_combo_box->itemText(output_device_combo_box->currentIndex()) -                .toStdString()); -        Settings::values.audio_input_device_id.SetValue( -            input_device_combo_box->itemText(input_device_combo_box->currentIndex()).toStdString()); -    } +    Settings::values.sink_id.LoadString( +        sink_combo_box->itemText(sink_combo_box->currentIndex()).toStdString()); +    Settings::values.audio_output_device_id.SetValue( +        output_device_combo_box->itemText(output_device_combo_box->currentIndex()).toStdString()); +    Settings::values.audio_input_device_id.SetValue( +        input_device_combo_box->itemText(input_device_combo_box->currentIndex()).toStdString());  }  void ConfigureAudio::changeEvent(QEvent* event) { @@ -169,6 +246,7 @@ void ConfigureAudio::changeEvent(QEvent* event) {  }  void ConfigureAudio::UpdateAudioDevices(int sink_index) { +    updating_devices = true;      output_device_combo_box->clear();      output_device_combo_box->addItem(QString::fromUtf8(AudioCore::Sink::auto_device_name)); @@ -183,6 +261,7 @@ void ConfigureAudio::UpdateAudioDevices(int sink_index) {      for (const auto& device : AudioCore::Sink::GetDeviceListForSink(sink_id, true)) {          input_device_combo_box->addItem(QString::fromStdString(device));      } +    updating_devices = false;  }  void ConfigureAudio::InitializeAudioSinkComboBox() { diff --git a/src/yuzu/configuration/configure_audio.h b/src/yuzu/configuration/configure_audio.h index 82d7f6524..32a2fa5f0 100644 --- a/src/yuzu/configuration/configure_audio.h +++ b/src/yuzu/configuration/configure_audio.h @@ -45,7 +45,8 @@ private:      void UpdateAudioDevices(int sink_index);      void SetOutputSinkFromSinkID(); -    void SetAudioDevicesFromDeviceID(); +    void SetOutputDevicesFromDeviceID(); +    void SetInputDevicesFromDeviceID();      void Setup(const ConfigurationShared::Builder& builder); @@ -55,7 +56,11 @@ private:      std::vector<std::function<void(bool)>> apply_funcs{}; +    bool updating_devices = false;      QComboBox* sink_combo_box; +    QPushButton* restore_sink_button;      QComboBox* output_device_combo_box; +    QPushButton* restore_output_device_button;      QComboBox* input_device_combo_box; +    QPushButton* restore_input_device_button;  }; diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 49ec52546..e28df10bd 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -9,6 +9,8 @@  #include "core/core.h"  #include "core/hle/service/am/am.h"  #include "core/hle/service/am/applet_ae.h" +#include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/applet_message_queue.h"  #include "core/hle/service/am/applet_oe.h"  #include "core/hle/service/sm/sm.h"  #include "hid_core/frontend/emulated_controller.h" @@ -47,22 +49,8 @@ void OnDockedModeChanged(bool last_state, bool new_state, Core::System& system)      if (!system.IsPoweredOn()) {          return;      } -    Service::SM::ServiceManager& sm = system.ServiceManager(); -    // Message queue is shared between these services, we just need to signal an operation -    // change to one and it will handle both automatically -    auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE"); -    auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE"); -    bool has_signalled = false; - -    if (applet_oe != nullptr) { -        applet_oe->GetMessageQueue()->OperationModeChanged(); -        has_signalled = true; -    } - -    if (applet_ae != nullptr && !has_signalled) { -        applet_ae->GetMessageQueue()->OperationModeChanged(); -    } +    system.GetAppletManager().OperationModeChanged();  }  ConfigureInput::ConfigureInput(Core::System& system_, QWidget* parent) diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 59b317135..b40af957c 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -596,14 +596,10 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri      connect(open_save_location, &QAction::triggered, [this, program_id, path]() {          emit OpenFolderRequested(program_id, GameListOpenTarget::SaveData, path);      }); -    connect(start_game, &QAction::triggered, [this, path]() { -        emit BootGame(QString::fromStdString(path), 0, 0, StartGameType::Normal, -                      AmLaunchType::UserInitiated); -    }); -    connect(start_game_global, &QAction::triggered, [this, path]() { -        emit BootGame(QString::fromStdString(path), 0, 0, StartGameType::Global, -                      AmLaunchType::UserInitiated); -    }); +    connect(start_game, &QAction::triggered, +            [this, path]() { emit BootGame(QString::fromStdString(path), StartGameType::Normal); }); +    connect(start_game_global, &QAction::triggered, +            [this, path]() { emit BootGame(QString::fromStdString(path), StartGameType::Global); });      connect(open_mod_location, &QAction::triggered, [this, program_id, path]() {          emit OpenFolderRequested(program_id, GameListOpenTarget::ModData, path);      }); diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h index 563a3a35b..79f9c7ec0 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game_list.h @@ -106,8 +106,7 @@ public:      static const QStringList supported_file_extensions;  signals: -    void BootGame(const QString& game_path, u64 program_id, std::size_t program_index, -                  StartGameType type, AmLaunchType launch_type); +    void BootGame(const QString& game_path, StartGameType type);      void GameChosen(const QString& game_path, const u64 title_id = 0);      void OpenFolderRequested(u64 program_id, GameListOpenTarget target,                               const std::string& game_path); diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 782bcbb61..303d84a1f 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -8,6 +8,7 @@  #include <iostream>  #include <memory>  #include <thread> +#include "core/hle/service/am/applet_manager.h"  #include "core/loader/nca.h"  #include "core/tools/renderdoc.h" @@ -39,13 +40,14 @@  #include "core/file_sys/vfs/vfs_real.h"  #include "core/frontend/applets/cabinet.h"  #include "core/frontend/applets/controller.h" -#include "core/frontend/applets/general_frontend.h" +#include "core/frontend/applets/general.h"  #include "core/frontend/applets/mii_edit.h"  #include "core/frontend/applets/software_keyboard.h"  #include "core/hle/service/acc/profile_manager.h"  #include "core/hle/service/am/applet_ae.h" +#include "core/hle/service/am/applet_message_queue.h"  #include "core/hle/service/am/applet_oe.h" -#include "core/hle/service/am/applets/applets.h" +#include "core/hle/service/am/frontend/applets.h"  #include "core/hle/service/set/system_settings_server.h"  #include "frontend_common/content_manager.h"  #include "hid_core/frontend/emulated_controller.h" @@ -568,7 +570,7 @@ GMainWindow::GMainWindow(std::unique_ptr<QtConfig> config_, bool has_broken_vulk      }      if (!game_path.isEmpty()) { -        BootGame(game_path); +        BootGame(game_path, ApplicationAppletParameters());      }  } @@ -630,13 +632,14 @@ void GMainWindow::RegisterMetaTypes() {      qRegisterMetaType<Core::Frontend::InlineAppearParameters>(          "Core::Frontend::InlineAppearParameters");      qRegisterMetaType<Core::Frontend::InlineTextParameters>("Core::Frontend::InlineTextParameters"); -    qRegisterMetaType<Service::AM::Applets::SwkbdResult>("Service::AM::Applets::SwkbdResult"); -    qRegisterMetaType<Service::AM::Applets::SwkbdTextCheckResult>( -        "Service::AM::Applets::SwkbdTextCheckResult"); -    qRegisterMetaType<Service::AM::Applets::SwkbdReplyType>("Service::AM::Applets::SwkbdReplyType"); +    qRegisterMetaType<Service::AM::Frontend::SwkbdResult>("Service::AM::Frontend::SwkbdResult"); +    qRegisterMetaType<Service::AM::Frontend::SwkbdTextCheckResult>( +        "Service::AM::Frontend::SwkbdTextCheckResult"); +    qRegisterMetaType<Service::AM::Frontend::SwkbdReplyType>( +        "Service::AM::Frontend::SwkbdReplyType");      // Web Browser Applet -    qRegisterMetaType<Service::AM::Applets::WebExitReason>("Service::AM::Applets::WebExitReason"); +    qRegisterMetaType<Service::AM::Frontend::WebExitReason>("Service::AM::Frontend::WebExitReason");      // Register loader types      qRegisterMetaType<Core::SystemResultStatus>("Core::SystemResultStatus"); @@ -746,7 +749,7 @@ void GMainWindow::SoftwareKeyboardInitialize(      if (is_inline) {          connect(              software_keyboard, &QtSoftwareKeyboardDialog::SubmitInlineText, this, -            [this](Service::AM::Applets::SwkbdReplyType reply_type, std::u16string submitted_text, +            [this](Service::AM::Frontend::SwkbdReplyType reply_type, std::u16string submitted_text,                     s32 cursor_position) {                  emit SoftwareKeyboardSubmitInlineText(reply_type, submitted_text, cursor_position);              }, @@ -754,7 +757,7 @@ void GMainWindow::SoftwareKeyboardInitialize(      } else {          connect(              software_keyboard, &QtSoftwareKeyboardDialog::SubmitNormalText, this, -            [this](Service::AM::Applets::SwkbdResult result, std::u16string submitted_text, +            [this](Service::AM::Frontend::SwkbdResult result, std::u16string submitted_text,                     bool confirmed) {                  emit SoftwareKeyboardSubmitNormalText(result, submitted_text, confirmed);              }, @@ -781,7 +784,7 @@ void GMainWindow::SoftwareKeyboardShowNormal() {  }  void GMainWindow::SoftwareKeyboardShowTextCheck( -    Service::AM::Applets::SwkbdTextCheckResult text_check_result, +    Service::AM::Frontend::SwkbdTextCheckResult text_check_result,      std::u16string text_check_message) {      if (!software_keyboard) {          LOG_ERROR(Frontend, "The software keyboard is not initialized!"); @@ -852,7 +855,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,      // Raw input breaks with the web applet, Disable web applets if enabled      if (UISettings::values.disable_web_applet || Settings::values.enable_raw_input) { -        emit WebBrowserClosed(Service::AM::Applets::WebExitReason::WindowClosed, +        emit WebBrowserClosed(Service::AM::Frontend::WebExitReason::WindowClosed,                                "http://localhost/");          return;      } @@ -940,7 +943,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,                      if (variant.toBool()) {                          web_applet->SetFinished(true);                          web_applet->SetExitReason( -                            Service::AM::Applets::WebExitReason::EndButtonPressed); +                            Service::AM::Frontend::WebExitReason::EndButtonPressed);                      }                  }); @@ -950,7 +953,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,          if (web_applet->GetCurrentURL().contains(QStringLiteral("localhost"))) {              if (!web_applet->IsFinished()) {                  web_applet->SetFinished(true); -                web_applet->SetExitReason(Service::AM::Applets::WebExitReason::CallbackURL); +                web_applet->SetExitReason(Service::AM::Frontend::WebExitReason::CallbackURL);              }              web_applet->SetLastURL(web_applet->GetCurrentURL().toStdString()); @@ -983,7 +986,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,  #else      // Utilize the same fallback as the default web browser applet. -    emit WebBrowserClosed(Service::AM::Applets::WebExitReason::WindowClosed, "http://localhost/"); +    emit WebBrowserClosed(Service::AM::Frontend::WebExitReason::WindowClosed, "http://localhost/");  #endif  } @@ -991,7 +994,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,  void GMainWindow::WebBrowserRequestExit() {  #ifdef YUZU_USE_QT_WEB_ENGINE      if (web_applet) { -        web_applet->SetExitReason(Service::AM::Applets::WebExitReason::ExitRequested); +        web_applet->SetExitReason(Service::AM::Frontend::WebExitReason::ExitRequested);          web_applet->SetFinished(true);      }  #endif @@ -1472,7 +1475,7 @@ void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {  }  void GMainWindow::ConnectWidgetEvents() { -    connect(game_list, &GameList::BootGame, this, &GMainWindow::BootGame); +    connect(game_list, &GameList::BootGame, this, &GMainWindow::BootGameFromList);      connect(game_list, &GameList::GameChosen, this, &GMainWindow::OnGameListLoadFile);      connect(game_list, &GameList::OpenDirectory, this, &GMainWindow::OnGameListOpenDirectory);      connect(game_list, &GameList::OpenFolderRequested, this, &GMainWindow::OnGameListOpenFolder); @@ -1760,8 +1763,7 @@ void GMainWindow::AllowOSSleep() {  #endif  } -bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t program_index, -                          AmLaunchType launch_type) { +bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletParameters params) {      // Shutdown previous session if the emu thread is still active...      if (emu_thread != nullptr) {          ShutdownGame(); @@ -1773,11 +1775,11 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p      system->SetFilesystem(vfs); -    if (launch_type == AmLaunchType::UserInitiated) { +    if (params.launch_type == Service::AM::LaunchType::FrontendInitiated) {          system->GetUserChannel().clear();      } -    system->SetAppletFrontendSet({ +    system->SetFrontendAppletSet({          std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings          (UISettings::values.controller_applet_disabled.GetValue() == true)              ? nullptr @@ -1792,7 +1794,7 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p      });      const Core::SystemResultStatus result{ -        system->Load(*render_window, filename.toStdString(), program_id, program_index)}; +        system->Load(*render_window, filename.toStdString(), params)};      const auto drd_callout = (UISettings::values.callout_flags.GetValue() &                                static_cast<u32>(CalloutFlag::DRDDeprecation)) == 0; @@ -1915,12 +1917,12 @@ void GMainWindow::ConfigureFilesystemProvider(const std::string& filepath) {      }  } -void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t program_index, -                           StartGameType type, AmLaunchType launch_type) { +void GMainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletParameters params, +                           StartGameType type) {      LOG_INFO(Frontend, "yuzu starting..."); -    if (program_id == 0 || -        program_id > static_cast<u64>(Service::AM::Applets::AppletProgramId::MaxProgramId)) { +    if (params.program_id == 0 || +        params.program_id > static_cast<u64>(Service::AM::AppletProgramId::MaxProgramId)) {          StoreRecentFile(filename); // Put the filename on top of the list      } @@ -1935,7 +1937,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      ConfigureFilesystemProvider(filename.toStdString());      const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData()); -    const auto loader = Loader::GetLoader(*system, v_file, program_id, program_index); +    const auto loader = Loader::GetLoader(*system, v_file, params.program_id, params.program_index);      if (loader != nullptr && loader->ReadProgramId(title_id) == Loader::ResultStatus::Success &&          type == StartGameType::Normal) { @@ -1954,10 +1956,10 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      if (UISettings::values.select_user_on_boot && !user_flag_cmd_line) {          const Core::Frontend::ProfileSelectParameters parameters{ -            .mode = Service::AM::Applets::UiMode::UserSelector, +            .mode = Service::AM::Frontend::UiMode::UserSelector,              .invalid_uid_list = {},              .display_options = {}, -            .purpose = Service::AM::Applets::UserSelectionPurpose::General, +            .purpose = Service::AM::Frontend::UserSelectionPurpose::General,          };          if (SelectAndSetCurrentUser(parameters) == false) {              return; @@ -1969,7 +1971,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      // behavior of asking.      user_flag_cmd_line = false; -    if (!LoadROM(filename, program_id, program_index, launch_type)) { +    if (!LoadROM(filename, params)) {          return;      } @@ -2059,6 +2061,10 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      OnStartGame();  } +void GMainWindow::BootGameFromList(const QString& filename, StartGameType with_config) { +    BootGame(filename, ApplicationAppletParameters(), with_config); +} +  bool GMainWindow::OnShutdownBegin() {      if (!emulation_running) {          return false; @@ -2160,7 +2166,7 @@ void GMainWindow::OnEmulationStopped() {      OnTasStateChanged();      render_window->FinalizeCamera(); -    system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::None); +    system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::None);      // Enable all controllers      system->HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All}); @@ -2239,7 +2245,10 @@ void GMainWindow::UpdateRecentFiles() {  }  void GMainWindow::OnGameListLoadFile(QString game_path, u64 program_id) { -    BootGame(game_path, program_id); +    auto params = ApplicationAppletParameters(); +    params.program_id = program_id; + +    BootGame(game_path, params);  }  void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, @@ -2280,10 +2289,10 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target              // User save data              const auto select_profile = [this] {                  const Core::Frontend::ProfileSelectParameters parameters{ -                    .mode = Service::AM::Applets::UiMode::UserSelector, +                    .mode = Service::AM::Frontend::UiMode::UserSelector,                      .invalid_uid_list = {},                      .display_options = {}, -                    .purpose = Service::AM::Applets::UserSelectionPurpose::General, +                    .purpose = Service::AM::Frontend::UserSelectionPurpose::General,                  };                  QtProfileSelectionDialog dialog(*system, this, parameters);                  dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | @@ -3171,7 +3180,7 @@ void GMainWindow::OnMenuLoadFile() {      }      UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); -    BootGame(filename); +    BootGame(filename, ApplicationAppletParameters());  }  void GMainWindow::OnMenuLoadFolder() { @@ -3185,7 +3194,7 @@ void GMainWindow::OnMenuLoadFolder() {      const QDir dir{dir_path};      const QStringList matching_main = dir.entryList({QStringLiteral("main")}, QDir::Files);      if (matching_main.size() == 1) { -        BootGame(dir.path() + QDir::separator() + matching_main[0]); +        BootGame(dir.path() + QDir::separator() + matching_main[0], ApplicationAppletParameters());      } else {          QMessageBox::warning(this, tr("Invalid Directory Selected"),                               tr("The directory you have selected does not contain a 'main' file.")); @@ -3379,7 +3388,7 @@ void GMainWindow::OnMenuRecentFile() {      const QString filename = action->data().toString();      if (QFileInfo::exists(filename)) { -        BootGame(filename); +        BootGame(filename, ApplicationAppletParameters());      } else {          // Display an error message and remove the file from the list.          QMessageBox::information(this, tr("File not found"), @@ -3417,7 +3426,7 @@ void GMainWindow::OnRestartGame() {          // Make a copy since ShutdownGame edits game_path          const auto current_game = QString(current_game_path);          ShutdownGame(); -        BootGame(current_game); +        BootGame(current_game, ApplicationAppletParameters());      }  } @@ -3485,8 +3494,11 @@ void GMainWindow::OnLoadComplete() {  void GMainWindow::OnExecuteProgram(std::size_t program_index) {      ShutdownGame(); -    BootGame(last_filename_booted, 0, program_index, StartGameType::Normal, -             AmLaunchType::ApplicationInitiated); + +    auto params = ApplicationAppletParameters(); +    params.program_index = static_cast<s32>(program_index); +    params.launch_type = Service::AM::LaunchType::ApplicationInitiated; +    BootGame(last_filename_booted, params);  }  void GMainWindow::OnExit() { @@ -4153,7 +4165,7 @@ void GMainWindow::OnToggleStatusBar() {  }  void GMainWindow::OnAlbum() { -    constexpr u64 AlbumId = static_cast<u64>(Service::AM::Applets::AppletProgramId::PhotoViewer); +    constexpr u64 AlbumId = static_cast<u64>(Service::AM::AppletProgramId::PhotoViewer);      auto bis_system = system->GetFileSystemController().GetSystemNANDContents();      if (!bis_system) {          QMessageBox::warning(this, tr("No firmware available"), @@ -4168,15 +4180,15 @@ void GMainWindow::OnAlbum() {          return;      } -    system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::PhotoViewer); +    system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::PhotoViewer);      const auto filename = QString::fromStdString(album_nca->GetFullPath());      UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); -    BootGame(filename, AlbumId); +    BootGame(filename, LibraryAppletParameters(AlbumId, Service::AM::AppletId::PhotoViewer));  }  void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { -    constexpr u64 CabinetId = static_cast<u64>(Service::AM::Applets::AppletProgramId::Cabinet); +    constexpr u64 CabinetId = static_cast<u64>(Service::AM::AppletProgramId::Cabinet);      auto bis_system = system->GetFileSystemController().GetSystemNANDContents();      if (!bis_system) {          QMessageBox::warning(this, tr("No firmware available"), @@ -4191,16 +4203,16 @@ void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) {          return;      } -    system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::Cabinet); -    system->GetAppletManager().SetCabinetMode(mode); +    system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Cabinet); +    system->GetFrontendAppletHolder().SetCabinetMode(mode);      const auto filename = QString::fromStdString(cabinet_nca->GetFullPath());      UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); -    BootGame(filename, CabinetId); +    BootGame(filename, LibraryAppletParameters(CabinetId, Service::AM::AppletId::Cabinet));  }  void GMainWindow::OnMiiEdit() { -    constexpr u64 MiiEditId = static_cast<u64>(Service::AM::Applets::AppletProgramId::MiiEdit); +    constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit);      auto bis_system = system->GetFileSystemController().GetSystemNANDContents();      if (!bis_system) {          QMessageBox::warning(this, tr("No firmware available"), @@ -4215,16 +4227,15 @@ void GMainWindow::OnMiiEdit() {          return;      } -    system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::MiiEdit); +    system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::MiiEdit);      const auto filename = QString::fromStdString((mii_applet_nca->GetFullPath()));      UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); -    BootGame(filename, MiiEditId); +    BootGame(filename, LibraryAppletParameters(MiiEditId, Service::AM::AppletId::MiiEdit));  }  void GMainWindow::OnOpenControllerMenu() { -    constexpr u64 ControllerAppletId = -        static_cast<u64>(Service::AM::Applets::AppletProgramId::Controller); +    constexpr u64 ControllerAppletId = static_cast<u64>(Service::AM::AppletProgramId::Controller);      auto bis_system = system->GetFileSystemController().GetSystemNANDContents();      if (!bis_system) {          QMessageBox::warning(this, tr("No firmware available"), @@ -4240,11 +4251,12 @@ void GMainWindow::OnOpenControllerMenu() {          return;      } -    system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::Controller); +    system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Controller);      const auto filename = QString::fromStdString((controller_applet_nca->GetFullPath()));      UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); -    BootGame(filename, ControllerAppletId); +    BootGame(filename, +             LibraryAppletParameters(ControllerAppletId, Service::AM::AppletId::Controller));  }  void GMainWindow::OnCaptureScreenshot() { @@ -4564,7 +4576,7 @@ void GMainWindow::OnCheckFirmwareDecryption() {  }  bool GMainWindow::CheckFirmwarePresence() { -    constexpr u64 MiiEditId = static_cast<u64>(Service::AM::Applets::AppletProgramId::MiiEdit); +    constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit);      auto bis_system = system->GetFileSystemController().GetSystemNANDContents();      if (!bis_system) { @@ -4727,7 +4739,7 @@ bool GMainWindow::DropAction(QDropEvent* event) {      } else {          // Game          if (ConfirmChangeGame()) { -            BootGame(filename); +            BootGame(filename, ApplicationAppletParameters());          }      }      return true; @@ -4771,36 +4783,12 @@ void GMainWindow::RequestGameExit() {          return;      } -    auto& sm{system->ServiceManager()}; -    auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE"); -    auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE"); -    bool has_signalled = false; -      system->SetExitRequested(true); - -    if (applet_oe != nullptr) { -        applet_oe->GetMessageQueue()->RequestExit(); -        has_signalled = true; -    } - -    if (applet_ae != nullptr && !has_signalled) { -        applet_ae->GetMessageQueue()->RequestExit(); -    } +    system->GetAppletManager().RequestExit();  }  void GMainWindow::RequestGameResume() { -    auto& sm{system->ServiceManager()}; -    auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE"); -    auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE"); - -    if (applet_oe != nullptr) { -        applet_oe->GetMessageQueue()->RequestResume(); -        return; -    } - -    if (applet_ae != nullptr) { -        applet_ae->GetMessageQueue()->RequestResume(); -    } +    system->GetAppletManager().RequestResume();  }  void GMainWindow::filterBarSetChecked(bool state) { @@ -4942,6 +4930,22 @@ void GMainWindow::changeEvent(QEvent* event) {      QWidget::changeEvent(event);  } +Service::AM::FrontendAppletParameters GMainWindow::ApplicationAppletParameters() { +    return Service::AM::FrontendAppletParameters{ +        .applet_id = Service::AM::AppletId::Application, +        .applet_type = Service::AM::AppletType::Application, +    }; +} + +Service::AM::FrontendAppletParameters GMainWindow::LibraryAppletParameters( +    u64 program_id, Service::AM::AppletId applet_id) { +    return Service::AM::FrontendAppletParameters{ +        .program_id = program_id, +        .applet_id = applet_id, +        .applet_type = Service::AM::AppletType::LibraryApplet, +    }; +} +  void VolumeButton::wheelEvent(QWheelEvent* event) {      int num_degrees = event->angleDelta().y() / 8; diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 6b72094ff..aba61e388 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -64,11 +64,6 @@ enum class StartGameType {      Global, // Only uses global configuration  }; -enum class AmLaunchType { -    UserInitiated, -    ApplicationInitiated, -}; -  namespace Core {  enum class SystemResultStatus : u32;  class System; @@ -101,12 +96,17 @@ namespace InputCommon {  class InputSubsystem;  } -namespace Service::AM::Applets { +namespace Service::AM { +struct FrontendAppletParameters; +enum class AppletId : u32; +} // namespace Service::AM + +namespace Service::AM::Frontend {  enum class SwkbdResult : u32;  enum class SwkbdTextCheckResult : u32;  enum class SwkbdReplyType : u32;  enum class WebExitReason : u32; -} // namespace Service::AM::Applets +} // namespace Service::AM::Frontend  namespace Service::NFC {  class NfcDevice; @@ -204,13 +204,13 @@ signals:      void ProfileSelectorFinishedSelection(std::optional<Common::UUID> uuid); -    void SoftwareKeyboardSubmitNormalText(Service::AM::Applets::SwkbdResult result, +    void SoftwareKeyboardSubmitNormalText(Service::AM::Frontend::SwkbdResult result,                                            std::u16string submitted_text, bool confirmed); -    void SoftwareKeyboardSubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type, +    void SoftwareKeyboardSubmitInlineText(Service::AM::Frontend::SwkbdReplyType reply_type,                                            std::u16string submitted_text, s32 cursor_position);      void WebBrowserExtractOfflineRomFS(); -    void WebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason, std::string last_url); +    void WebBrowserClosed(Service::AM::Frontend::WebExitReason exit_reason, std::string last_url);      void SigInterrupt(); @@ -228,8 +228,9 @@ public slots:      void SoftwareKeyboardInitialize(          bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters);      void SoftwareKeyboardShowNormal(); -    void SoftwareKeyboardShowTextCheck(Service::AM::Applets::SwkbdTextCheckResult text_check_result, -                                       std::u16string text_check_message); +    void SoftwareKeyboardShowTextCheck( +        Service::AM::Frontend::SwkbdTextCheckResult text_check_result, +        std::u16string text_check_message);      void SoftwareKeyboardShowInline(Core::Frontend::InlineAppearParameters appear_parameters);      void SoftwareKeyboardHideInline();      void SoftwareKeyboardInlineTextChanged(Core::Frontend::InlineTextParameters text_parameters); @@ -267,11 +268,10 @@ private:      void PreventOSSleep();      void AllowOSSleep(); -    bool LoadROM(const QString& filename, u64 program_id, std::size_t program_index, -                 AmLaunchType launch_type); -    void BootGame(const QString& filename, u64 program_id = 0, std::size_t program_index = 0, -                  StartGameType with_config = StartGameType::Normal, -                  AmLaunchType launch_type = AmLaunchType::UserInitiated); +    bool LoadROM(const QString& filename, Service::AM::FrontendAppletParameters params); +    void BootGame(const QString& filename, Service::AM::FrontendAppletParameters params, +                  StartGameType with_config = StartGameType::Normal); +    void BootGameFromList(const QString& filename, StartGameType with_config);      void ShutdownGame();      void ShowTelemetryCallout(); @@ -324,6 +324,10 @@ private:      void SetGamemodeEnabled(bool state);  #endif +    Service::AM::FrontendAppletParameters ApplicationAppletParameters(); +    Service::AM::FrontendAppletParameters LibraryAppletParameters(u64 program_id, +                                                                  Service::AM::AppletId applet_id); +  private slots:      void OnStartGame();      void OnRestartGame(); | 
