mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Miscallenious fixes to gl backend and qt frontend (#6834)
* renderer_gl: Make rasterizer normal class member * It doesn't need to be heap allocated anymore * gl_rasterizer: Remove default_texture * It's unused * gl_rasterizer: General cleanup * gl_rasterizer: Lower case lambdas * Match style with review comments from vulkan backend * rasterizer_cache: Prevent memory leak * Since the switch from shared_ptr these surfaces were no longer being destroyed properly. Use our garbage collector for that purpose to destroy it safely for both backends * rasterizer_cache: Make temp copy of old surface * The custom surface would override the memory region of the old region resulting in garbage data, this ensures the custom surface is constructed correctly * citra_qt: Manually create dialog tabs * Allows for custom constructors which is very useful. While at it, global state is now eliminated from configuration * citra_qt: Eliminate global system usage * core: Remove global system usage in memory and HIO * citra_qt: Use qOverload * tests: Run clang format * gl_texture_runtime: Fix surface scaling
This commit is contained in:
		
							parent
							
								
									970f2284d8
								
							
						
					
					
						commit
						88ea66053e
					
				
					 73 changed files with 594 additions and 555 deletions
				
			
		|  | @ -21,68 +21,8 @@ | |||
|      <item> | ||||
|       <widget class="QTabWidget" name="tabWidget"> | ||||
|        <property name="currentIndex"> | ||||
|         <number>0</number> | ||||
|         <number>-1</number> | ||||
|        </property> | ||||
|        <widget class="ConfigureGeneral" name="generalTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>General</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureSystem" name="systemTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>System</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureInput" name="inputTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Input</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureHotkeys" name="hotkeysTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Hotkeys</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureGraphics" name="graphicsTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Graphics</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureEnhancements" name="enhancementsTab"> | ||||
|          <attribute name="title"> | ||||
|            <string>Enhancements</string> | ||||
|          </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureAudio" name="audioTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Audio</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureCamera" name="cameraTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Camera</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureDebug" name="debugTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Debug</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureStorage" name="storageTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Storage</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureWeb" name="webTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>Web</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|        <widget class="ConfigureUi" name="uiTab"> | ||||
|         <attribute name="title"> | ||||
|          <string>UI</string> | ||||
|         </attribute> | ||||
|        </widget> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|  |  | |||
|  | @ -10,14 +10,13 @@ | |||
| #include "citra_qt/configuration/configuration_shared.h" | ||||
| #include "citra_qt/configuration/configure_audio.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "ui_configure_audio.h" | ||||
| 
 | ||||
| #if defined(__APPLE__) | ||||
| #include "common/apple_authorization.h" | ||||
| #endif | ||||
| 
 | ||||
| ConfigureAudio::ConfigureAudio(QWidget* parent) | ||||
| ConfigureAudio::ConfigureAudio(bool is_powered_on, QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureAudio>()) { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|  | @ -27,8 +26,7 @@ ConfigureAudio::ConfigureAudio(QWidget* parent) | |||
|             AudioCore::GetSinkName(static_cast<AudioCore::SinkType>(type)).data())); | ||||
|     } | ||||
| 
 | ||||
|     const bool is_running = Core::System::GetInstance().IsPoweredOn(); | ||||
|     ui->emulation_combo_box->setEnabled(!is_running); | ||||
|     ui->emulation_combo_box->setEnabled(!is_powered_on); | ||||
| 
 | ||||
|     connect(ui->volume_slider, &QSlider::valueChanged, this, | ||||
|             &ConfigureAudio::SetVolumeIndicatorText); | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ class ConfigureAudio : public QWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigureAudio(QWidget* parent = nullptr); | ||||
|     explicit ConfigureAudio(bool is_powered_on, QWidget* parent = nullptr); | ||||
|     ~ConfigureAudio() override; | ||||
| 
 | ||||
|     void ApplyConfiguration(); | ||||
|  |  | |||
|  | @ -47,8 +47,7 @@ ConfigureCamera::~ConfigureCamera() { | |||
| } | ||||
| 
 | ||||
| void ConfigureCamera::ConnectEvents() { | ||||
|     connect(ui->image_source, | ||||
|             static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, | ||||
|     connect(ui->image_source, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             [this](int index) { | ||||
|                 StopPreviewing(); | ||||
|                 UpdateImageSourceUI(); | ||||
|  | @ -58,36 +57,33 @@ void ConfigureCamera::ConnectEvents() { | |||
|                 } | ||||
| #endif | ||||
|             }); | ||||
|     connect(ui->camera_selection, | ||||
|             static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [this] { | ||||
|                 StopPreviewing(); | ||||
|                 if (GetCameraSelection() != current_selected) { | ||||
|                     RecordConfig(); | ||||
|                 } | ||||
|                 if (ui->camera_selection->currentIndex() == 1) { | ||||
|                     ui->camera_mode->setCurrentIndex(1); // Double
 | ||||
|                     if (camera_name[0] == camera_name[2] && camera_config[0] == camera_config[2]) { | ||||
|                         ui->camera_mode->setCurrentIndex(0); // Single
 | ||||
|                     } | ||||
|                 } | ||||
|                 UpdateCameraMode(); | ||||
|                 SetConfiguration(); | ||||
|             }); | ||||
|     connect(ui->camera_mode, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), | ||||
|             this, [this] { | ||||
|                 StopPreviewing(); | ||||
|                 ui->camera_position_label->setVisible(ui->camera_mode->currentIndex() == 1); | ||||
|                 ui->camera_position->setVisible(ui->camera_mode->currentIndex() == 1); | ||||
|                 current_selected = GetCameraSelection(); | ||||
|             }); | ||||
|     connect(ui->camera_position, | ||||
|             static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [this] { | ||||
|                 StopPreviewing(); | ||||
|                 if (GetCameraSelection() != current_selected) { | ||||
|                     RecordConfig(); | ||||
|                 } | ||||
|                 SetConfiguration(); | ||||
|             }); | ||||
|     connect(ui->camera_selection, qOverload<int>(&QComboBox::currentIndexChanged), this, [this] { | ||||
|         StopPreviewing(); | ||||
|         if (GetCameraSelection() != current_selected) { | ||||
|             RecordConfig(); | ||||
|         } | ||||
|         if (ui->camera_selection->currentIndex() == 1) { | ||||
|             ui->camera_mode->setCurrentIndex(1); // Double
 | ||||
|             if (camera_name[0] == camera_name[2] && camera_config[0] == camera_config[2]) { | ||||
|                 ui->camera_mode->setCurrentIndex(0); // Single
 | ||||
|             } | ||||
|         } | ||||
|         UpdateCameraMode(); | ||||
|         SetConfiguration(); | ||||
|     }); | ||||
|     connect(ui->camera_mode, qOverload<int>(&QComboBox::currentIndexChanged), this, [this] { | ||||
|         StopPreviewing(); | ||||
|         ui->camera_position_label->setVisible(ui->camera_mode->currentIndex() == 1); | ||||
|         ui->camera_position->setVisible(ui->camera_mode->currentIndex() == 1); | ||||
|         current_selected = GetCameraSelection(); | ||||
|     }); | ||||
|     connect(ui->camera_position, qOverload<int>(&QComboBox::currentIndexChanged), this, [this] { | ||||
|         StopPreviewing(); | ||||
|         if (GetCameraSelection() != current_selected) { | ||||
|             RecordConfig(); | ||||
|         } | ||||
|         SetConfiguration(); | ||||
|     }); | ||||
|     connect(ui->toolButton, &QToolButton::clicked, this, &ConfigureCamera::OnToolButtonClicked); | ||||
|     connect(ui->preview_button, &QPushButton::clicked, this, [this] { StartPreviewing(); }); | ||||
|     connect(ui->prompt_before_load, &QCheckBox::stateChanged, this, [this](int state) { | ||||
|  |  | |||
|  | @ -9,11 +9,9 @@ | |||
| #include "core/cheats/cheat_base.h" | ||||
| #include "core/cheats/cheats.h" | ||||
| #include "core/cheats/gateway_cheat.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "ui_configure_cheats.h" | ||||
| 
 | ||||
| ConfigureCheats::ConfigureCheats(u64 title_id_, QWidget* parent) | ||||
| ConfigureCheats::ConfigureCheats(Core::System& system, u64 title_id_, QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureCheats>()), title_id{title_id_} { | ||||
|     // Setup gui control settings
 | ||||
|     ui->setupUi(this); | ||||
|  | @ -36,7 +34,7 @@ ConfigureCheats::ConfigureCheats(u64 title_id_, QWidget* parent) | |||
|             [this] { SaveCheat(ui->tableCheats->currentRow()); }); | ||||
|     connect(ui->buttonDelete, &QPushButton::clicked, this, &ConfigureCheats::OnDeleteCheat); | ||||
| 
 | ||||
|     cheat_engine = std::make_unique<Cheats::CheatEngine>(title_id, Core::System::GetInstance()); | ||||
|     cheat_engine = std::make_unique<Cheats::CheatEngine>(title_id, system); | ||||
| 
 | ||||
|     LoadCheats(); | ||||
| } | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <QWidget> | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Cheats { | ||||
|  | @ -12,6 +13,10 @@ class CheatBase; | |||
| class CheatEngine; | ||||
| } // namespace Cheats
 | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| namespace Ui { | ||||
| class ConfigureCheats; | ||||
| } // namespace Ui
 | ||||
|  | @ -20,7 +25,7 @@ class ConfigureCheats : public QWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigureCheats(u64 title_id_, QWidget* parent = nullptr); | ||||
|     explicit ConfigureCheats(Core::System& system, u64 title_id, QWidget* parent = nullptr); | ||||
|     ~ConfigureCheats(); | ||||
|     bool ApplyConfiguration(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,6 @@ | |||
| #include "common/file_util.h" | ||||
| #include "common/logging/backend.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "ui_configure_debug.h" | ||||
| 
 | ||||
| // The QSlider doesn't have an easy way to set a custom step amount,
 | ||||
|  | @ -25,8 +24,8 @@ static constexpr int SettingsToSlider(int value) { | |||
|     return (value - 5) / 5; | ||||
| } | ||||
| 
 | ||||
| ConfigureDebug::ConfigureDebug(QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureDebug>()) { | ||||
| ConfigureDebug::ConfigureDebug(bool is_powered_on_, QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureDebug>()), is_powered_on{is_powered_on_} { | ||||
|     ui->setupUi(this); | ||||
|     SetConfiguration(); | ||||
| 
 | ||||
|  | @ -35,7 +34,6 @@ ConfigureDebug::ConfigureDebug(QWidget* parent) | |||
|         QDesktopServices::openUrl(QUrl::fromLocalFile(path)); | ||||
|     }); | ||||
| 
 | ||||
|     const bool is_powered_on = Core::System::GetInstance().IsPoweredOn(); | ||||
|     ui->toggle_cpu_jit->setEnabled(!is_powered_on); | ||||
|     ui->toggle_renderer_debug->setEnabled(!is_powered_on); | ||||
| 
 | ||||
|  | @ -59,7 +57,7 @@ void ConfigureDebug::SetConfiguration() { | |||
|     ui->toggle_gdbstub->setChecked(Settings::values.use_gdbstub.GetValue()); | ||||
|     ui->gdbport_spinbox->setEnabled(Settings::values.use_gdbstub.GetValue()); | ||||
|     ui->gdbport_spinbox->setValue(Settings::values.gdbstub_port.GetValue()); | ||||
|     ui->toggle_console->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||
|     ui->toggle_console->setEnabled(!is_powered_on); | ||||
|     ui->toggle_console->setChecked(UISettings::values.show_console.GetValue()); | ||||
|     ui->log_filter_edit->setText(QString::fromStdString(Settings::values.log_filter.GetValue())); | ||||
|     ui->toggle_cpu_jit->setChecked(Settings::values.use_cpu_jit.GetValue()); | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ class ConfigureDebug : public QWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigureDebug(QWidget* parent = nullptr); | ||||
|     explicit ConfigureDebug(bool is_powered_on, QWidget* parent = nullptr); | ||||
|     ~ConfigureDebug() override; | ||||
| 
 | ||||
|     void ApplyConfiguration(); | ||||
|  | @ -25,4 +25,5 @@ public: | |||
| 
 | ||||
| private: | ||||
|     std::unique_ptr<Ui::ConfigureDebug> ui; | ||||
|     bool is_powered_on; | ||||
| }; | ||||
|  |  | |||
|  | @ -4,8 +4,19 @@ | |||
| 
 | ||||
| #include <map> | ||||
| #include <QListWidgetItem> | ||||
| #include "citra_qt/configuration/config.h" | ||||
| #include "citra_qt/configuration/configure_audio.h" | ||||
| #include "citra_qt/configuration/configure_camera.h" | ||||
| #include "citra_qt/configuration/configure_debug.h" | ||||
| #include "citra_qt/configuration/configure_dialog.h" | ||||
| #include "citra_qt/configuration/configure_enhancements.h" | ||||
| #include "citra_qt/configuration/configure_general.h" | ||||
| #include "citra_qt/configuration/configure_graphics.h" | ||||
| #include "citra_qt/configuration/configure_hotkeys.h" | ||||
| #include "citra_qt/configuration/configure_input.h" | ||||
| #include "citra_qt/configuration/configure_storage.h" | ||||
| #include "citra_qt/configuration/configure_system.h" | ||||
| #include "citra_qt/configuration/configure_ui.h" | ||||
| #include "citra_qt/configuration/configure_web.h" | ||||
| #include "citra_qt/hotkeys.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
|  | @ -14,16 +25,41 @@ | |||
| ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, Core::System& system_, | ||||
|                                  bool enable_web_config) | ||||
|     : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()}, registry{registry_}, | ||||
|       system{system_} { | ||||
|       system{system_}, is_powered_on{system.IsPoweredOn()}, | ||||
|       general_tab{std::make_unique<ConfigureGeneral>(this)}, | ||||
|       system_tab{std::make_unique<ConfigureSystem>(system, this)}, | ||||
|       input_tab{std::make_unique<ConfigureInput>(this)}, | ||||
|       hotkeys_tab{std::make_unique<ConfigureHotkeys>(this)}, | ||||
|       graphics_tab{std::make_unique<ConfigureGraphics>(is_powered_on, this)}, | ||||
|       enhancements_tab{std::make_unique<ConfigureEnhancements>(this)}, | ||||
|       audio_tab{std::make_unique<ConfigureAudio>(is_powered_on, this)}, | ||||
|       camera_tab{std::make_unique<ConfigureCamera>(this)}, | ||||
|       debug_tab{std::make_unique<ConfigureDebug>(is_powered_on, this)}, | ||||
|       storage_tab{std::make_unique<ConfigureStorage>(is_powered_on, this)}, | ||||
|       web_tab{std::make_unique<ConfigureWeb>(this)}, ui_tab{std::make_unique<ConfigureUi>(this)} { | ||||
|     Settings::SetConfiguringGlobal(true); | ||||
| 
 | ||||
|     ui->setupUi(this); | ||||
|     ui->hotkeysTab->Populate(registry); | ||||
|     ui->webTab->SetWebServiceConfigEnabled(enable_web_config); | ||||
| 
 | ||||
|     ui->tabWidget->addTab(general_tab.get(), tr("General")); | ||||
|     ui->tabWidget->addTab(system_tab.get(), tr("System")); | ||||
|     ui->tabWidget->addTab(input_tab.get(), tr("Input")); | ||||
|     ui->tabWidget->addTab(hotkeys_tab.get(), tr("Hotkeys")); | ||||
|     ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics")); | ||||
|     ui->tabWidget->addTab(enhancements_tab.get(), tr("Enhancements")); | ||||
|     ui->tabWidget->addTab(audio_tab.get(), tr("Audio")); | ||||
|     ui->tabWidget->addTab(camera_tab.get(), tr("Camera")); | ||||
|     ui->tabWidget->addTab(debug_tab.get(), tr("Debug")); | ||||
|     ui->tabWidget->addTab(storage_tab.get(), tr("Storage")); | ||||
|     ui->tabWidget->addTab(web_tab.get(), tr("Web")); | ||||
|     ui->tabWidget->addTab(ui_tab.get(), tr("UI")); | ||||
| 
 | ||||
|     hotkeys_tab->Populate(registry); | ||||
|     web_tab->SetWebServiceConfigEnabled(enable_web_config); | ||||
| 
 | ||||
|     PopulateSelectionList(); | ||||
| 
 | ||||
|     connect(ui->uiTab, &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged); | ||||
|     connect(ui_tab.get(), &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged); | ||||
|     connect(ui->selectorList, &QListWidget::itemSelectionChanged, this, | ||||
|             &ConfigureDialog::UpdateVisibleTabs); | ||||
| 
 | ||||
|  | @ -31,46 +67,46 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, Cor | |||
|     ui->selectorList->setCurrentRow(0); | ||||
| 
 | ||||
|     // Set up used key list synchronisation
 | ||||
|     connect(ui->inputTab, &ConfigureInput::InputKeysChanged, ui->hotkeysTab, | ||||
|     connect(input_tab.get(), &ConfigureInput::InputKeysChanged, hotkeys_tab.get(), | ||||
|             &ConfigureHotkeys::OnInputKeysChanged); | ||||
|     connect(ui->hotkeysTab, &ConfigureHotkeys::HotkeysChanged, ui->inputTab, | ||||
|     connect(hotkeys_tab.get(), &ConfigureHotkeys::HotkeysChanged, input_tab.get(), | ||||
|             &ConfigureInput::OnHotkeysChanged); | ||||
| 
 | ||||
|     // Synchronise lists upon initialisation
 | ||||
|     ui->inputTab->EmitInputKeysChanged(); | ||||
|     ui->hotkeysTab->EmitHotkeysChanged(); | ||||
|     input_tab->EmitInputKeysChanged(); | ||||
|     hotkeys_tab->EmitHotkeysChanged(); | ||||
| } | ||||
| 
 | ||||
| ConfigureDialog::~ConfigureDialog() = default; | ||||
| 
 | ||||
| void ConfigureDialog::SetConfiguration() { | ||||
|     ui->generalTab->SetConfiguration(); | ||||
|     ui->systemTab->SetConfiguration(); | ||||
|     ui->inputTab->LoadConfiguration(); | ||||
|     ui->graphicsTab->SetConfiguration(); | ||||
|     ui->enhancementsTab->SetConfiguration(); | ||||
|     ui->audioTab->SetConfiguration(); | ||||
|     ui->cameraTab->SetConfiguration(); | ||||
|     ui->debugTab->SetConfiguration(); | ||||
|     ui->webTab->SetConfiguration(); | ||||
|     ui->uiTab->SetConfiguration(); | ||||
|     ui->storageTab->SetConfiguration(); | ||||
|     general_tab->SetConfiguration(); | ||||
|     system_tab->SetConfiguration(); | ||||
|     input_tab->LoadConfiguration(); | ||||
|     graphics_tab->SetConfiguration(); | ||||
|     enhancements_tab->SetConfiguration(); | ||||
|     audio_tab->SetConfiguration(); | ||||
|     camera_tab->SetConfiguration(); | ||||
|     debug_tab->SetConfiguration(); | ||||
|     web_tab->SetConfiguration(); | ||||
|     ui_tab->SetConfiguration(); | ||||
|     storage_tab->SetConfiguration(); | ||||
| } | ||||
| 
 | ||||
| void ConfigureDialog::ApplyConfiguration() { | ||||
|     ui->generalTab->ApplyConfiguration(); | ||||
|     ui->systemTab->ApplyConfiguration(); | ||||
|     ui->inputTab->ApplyConfiguration(); | ||||
|     ui->inputTab->ApplyProfile(); | ||||
|     ui->hotkeysTab->ApplyConfiguration(registry); | ||||
|     ui->graphicsTab->ApplyConfiguration(); | ||||
|     ui->enhancementsTab->ApplyConfiguration(); | ||||
|     ui->audioTab->ApplyConfiguration(); | ||||
|     ui->cameraTab->ApplyConfiguration(); | ||||
|     ui->debugTab->ApplyConfiguration(); | ||||
|     ui->webTab->ApplyConfiguration(); | ||||
|     ui->uiTab->ApplyConfiguration(); | ||||
|     ui->storageTab->ApplyConfiguration(); | ||||
|     general_tab->ApplyConfiguration(); | ||||
|     system_tab->ApplyConfiguration(); | ||||
|     input_tab->ApplyConfiguration(); | ||||
|     input_tab->ApplyProfile(); | ||||
|     hotkeys_tab->ApplyConfiguration(registry); | ||||
|     graphics_tab->ApplyConfiguration(); | ||||
|     enhancements_tab->ApplyConfiguration(); | ||||
|     audio_tab->ApplyConfiguration(); | ||||
|     camera_tab->ApplyConfiguration(); | ||||
|     debug_tab->ApplyConfiguration(); | ||||
|     web_tab->ApplyConfiguration(); | ||||
|     ui_tab->ApplyConfiguration(); | ||||
|     storage_tab->ApplyConfiguration(); | ||||
|     system.ApplySettings(); | ||||
|     Settings::LogSettings(); | ||||
| } | ||||
|  | @ -81,11 +117,11 @@ void ConfigureDialog::PopulateSelectionList() { | |||
|     ui->selectorList->clear(); | ||||
| 
 | ||||
|     const std::array<std::pair<QString, QList<QWidget*>>, 5> items{ | ||||
|         {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}}, | ||||
|          {tr("System"), {ui->systemTab, ui->cameraTab, ui->storageTab}}, | ||||
|          {tr("Graphics"), {ui->enhancementsTab, ui->graphicsTab}}, | ||||
|          {tr("Audio"), {ui->audioTab}}, | ||||
|          {tr("Controls"), {ui->inputTab, ui->hotkeysTab}}}}; | ||||
|         {{tr("General"), {general_tab.get(), web_tab.get(), debug_tab.get(), ui_tab.get()}}, | ||||
|          {tr("System"), {system_tab.get(), camera_tab.get(), storage_tab.get()}}, | ||||
|          {tr("Graphics"), {enhancements_tab.get(), graphics_tab.get()}}, | ||||
|          {tr("Audio"), {audio_tab.get()}}, | ||||
|          {tr("Controls"), {input_tab.get(), hotkeys_tab.get()}}}}; | ||||
| 
 | ||||
|     for (const auto& entry : items) { | ||||
|         auto* const item = new QListWidgetItem(entry.first); | ||||
|  | @ -112,18 +148,18 @@ void ConfigureDialog::RetranslateUI() { | |||
|     ui->selectorList->setCurrentRow(old_row); | ||||
|     ui->tabWidget->setCurrentIndex(old_index); | ||||
| 
 | ||||
|     ui->generalTab->RetranslateUI(); | ||||
|     ui->systemTab->RetranslateUI(); | ||||
|     ui->inputTab->RetranslateUI(); | ||||
|     ui->hotkeysTab->RetranslateUI(); | ||||
|     ui->graphicsTab->RetranslateUI(); | ||||
|     ui->enhancementsTab->RetranslateUI(); | ||||
|     ui->audioTab->RetranslateUI(); | ||||
|     ui->cameraTab->RetranslateUI(); | ||||
|     ui->debugTab->RetranslateUI(); | ||||
|     ui->webTab->RetranslateUI(); | ||||
|     ui->uiTab->RetranslateUI(); | ||||
|     ui->storageTab->RetranslateUI(); | ||||
|     general_tab->RetranslateUI(); | ||||
|     system_tab->RetranslateUI(); | ||||
|     input_tab->RetranslateUI(); | ||||
|     hotkeys_tab->RetranslateUI(); | ||||
|     graphics_tab->RetranslateUI(); | ||||
|     enhancements_tab->RetranslateUI(); | ||||
|     audio_tab->RetranslateUI(); | ||||
|     camera_tab->RetranslateUI(); | ||||
|     debug_tab->RetranslateUI(); | ||||
|     web_tab->RetranslateUI(); | ||||
|     ui_tab->RetranslateUI(); | ||||
|     storage_tab->RetranslateUI(); | ||||
| } | ||||
| 
 | ||||
| void ConfigureDialog::UpdateVisibleTabs() { | ||||
|  | @ -131,18 +167,18 @@ void ConfigureDialog::UpdateVisibleTabs() { | |||
|     if (items.isEmpty()) | ||||
|         return; | ||||
| 
 | ||||
|     const std::map<QWidget*, QString> widgets = {{ui->generalTab, tr("General")}, | ||||
|                                                  {ui->systemTab, tr("System")}, | ||||
|                                                  {ui->inputTab, tr("Input")}, | ||||
|                                                  {ui->hotkeysTab, tr("Hotkeys")}, | ||||
|                                                  {ui->enhancementsTab, tr("Enhancements")}, | ||||
|                                                  {ui->graphicsTab, tr("Advanced")}, | ||||
|                                                  {ui->audioTab, tr("Audio")}, | ||||
|                                                  {ui->cameraTab, tr("Camera")}, | ||||
|                                                  {ui->debugTab, tr("Debug")}, | ||||
|                                                  {ui->storageTab, tr("Storage")}, | ||||
|                                                  {ui->webTab, tr("Web")}, | ||||
|                                                  {ui->uiTab, tr("UI")}}; | ||||
|     const std::map<QWidget*, QString> widgets = {{general_tab.get(), tr("General")}, | ||||
|                                                  {system_tab.get(), tr("System")}, | ||||
|                                                  {input_tab.get(), tr("Input")}, | ||||
|                                                  {hotkeys_tab.get(), tr("Hotkeys")}, | ||||
|                                                  {enhancements_tab.get(), tr("Enhancements")}, | ||||
|                                                  {graphics_tab.get(), tr("Advanced")}, | ||||
|                                                  {audio_tab.get(), tr("Audio")}, | ||||
|                                                  {camera_tab.get(), tr("Camera")}, | ||||
|                                                  {debug_tab.get(), tr("Debug")}, | ||||
|                                                  {storage_tab.get(), tr("Storage")}, | ||||
|                                                  {web_tab.get(), tr("Web")}, | ||||
|                                                  {ui_tab.get(), tr("UI")}}; | ||||
| 
 | ||||
|     ui->tabWidget->clear(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,6 +17,19 @@ namespace Core { | |||
| class System; | ||||
| } | ||||
| 
 | ||||
| class ConfigureGeneral; | ||||
| class ConfigureSystem; | ||||
| class ConfigureInput; | ||||
| class ConfigureHotkeys; | ||||
| class ConfigureGraphics; | ||||
| class ConfigureEnhancements; | ||||
| class ConfigureAudio; | ||||
| class ConfigureCamera; | ||||
| class ConfigureDebug; | ||||
| class ConfigureStorage; | ||||
| class ConfigureWeb; | ||||
| class ConfigureUi; | ||||
| 
 | ||||
| class ConfigureDialog : public QDialog { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
|  | @ -42,4 +55,18 @@ private: | |||
|     std::unique_ptr<Ui::ConfigureDialog> ui; | ||||
|     HotkeyRegistry& registry; | ||||
|     Core::System& system; | ||||
|     bool is_powered_on; | ||||
| 
 | ||||
|     std::unique_ptr<ConfigureGeneral> general_tab; | ||||
|     std::unique_ptr<ConfigureSystem> system_tab; | ||||
|     std::unique_ptr<ConfigureInput> input_tab; | ||||
|     std::unique_ptr<ConfigureHotkeys> hotkeys_tab; | ||||
|     std::unique_ptr<ConfigureGraphics> graphics_tab; | ||||
|     std::unique_ptr<ConfigureEnhancements> enhancements_tab; | ||||
|     std::unique_ptr<ConfigureAudio> audio_tab; | ||||
|     std::unique_ptr<ConfigureCamera> camera_tab; | ||||
|     std::unique_ptr<ConfigureDebug> debug_tab; | ||||
|     std::unique_ptr<ConfigureStorage> storage_tab; | ||||
|     std::unique_ptr<ConfigureWeb> web_tab; | ||||
|     std::unique_ptr<ConfigureUi> ui_tab; | ||||
| }; | ||||
|  |  | |||
|  | @ -22,8 +22,7 @@ ConfigureEnhancements::ConfigureEnhancements(QWidget* parent) | |||
|     const bool res_scale_enabled = graphics_api != Settings::GraphicsAPI::Software; | ||||
|     ui->resolution_factor_combobox->setEnabled(res_scale_enabled); | ||||
| 
 | ||||
|     connect(ui->render_3d_combobox, | ||||
|             static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, | ||||
|     connect(ui->render_3d_combobox, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             [this](int currentIndex) { | ||||
|                 updateShaders(static_cast<Settings::StereoRenderOption>(currentIndex)); | ||||
|             }); | ||||
|  |  | |||
|  | @ -6,14 +6,13 @@ | |||
| #include "citra_qt/configuration/configuration_shared.h" | ||||
| #include "citra_qt/configuration/configure_graphics.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "ui_configure_graphics.h" | ||||
| 
 | ||||
| ConfigureGraphics::ConfigureGraphics(QWidget* parent) | ||||
| ConfigureGraphics::ConfigureGraphics(bool is_powered_on, QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureGraphics>()) { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|     ui->toggle_vsync_new->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||
|     ui->toggle_vsync_new->setEnabled(!is_powered_on); | ||||
|     // Set the index to -1 to ensure the below lambda is called with setCurrentIndex
 | ||||
|     ui->graphics_api_combo->setCurrentIndex(-1); | ||||
| 
 | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ class ConfigureGraphics : public QWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigureGraphics(QWidget* parent = nullptr); | ||||
|     explicit ConfigureGraphics(bool is_powered_on, QWidget* parent = nullptr); | ||||
|     ~ConfigureGraphics() override; | ||||
| 
 | ||||
|     void ApplyConfiguration(); | ||||
|  |  | |||
|  | @ -19,6 +19,9 @@ | |||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <property name="accessibleName"> | ||||
|    <string>Graphics</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QGroupBox" name="apiBox"> | ||||
|  |  | |||
|  | @ -9,7 +9,6 @@ | |||
| #include "citra_qt/configuration/configure_hotkeys.h" | ||||
| #include "citra_qt/hotkeys.h" | ||||
| #include "citra_qt/util/sequence_dialog/sequence_dialog.h" | ||||
| #include "common/settings.h" | ||||
| #include "ui_configure_hotkeys.h" | ||||
| 
 | ||||
| constexpr int name_column = 0; | ||||
|  | @ -189,9 +188,9 @@ void ConfigureHotkeys::PopupContextMenu(const QPoint& menu_location) { | |||
|     QAction* clear = context_menu.addAction(tr("Clear")); | ||||
| 
 | ||||
|     const auto hotkey_index = index.sibling(index.row(), hotkey_column); | ||||
|     connect(restore_default, &QAction::triggered, | ||||
|     connect(restore_default, &QAction::triggered, this, | ||||
|             [this, hotkey_index] { RestoreHotkey(hotkey_index); }); | ||||
|     connect(clear, &QAction::triggered, | ||||
|     connect(clear, &QAction::triggered, this, | ||||
|             [this, hotkey_index] { model->setData(hotkey_index, QString{}); }); | ||||
| 
 | ||||
|     context_menu.exec(ui->hotkey_list->viewport()->mapToGlobal(menu_location)); | ||||
|  |  | |||
|  | @ -31,13 +31,14 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const QString | |||
|                                                 : fmt::format("{:016X}", title_id); | ||||
|     game_config = std::make_unique<Config>(config_file_name, Config::ConfigType::PerGameConfig); | ||||
| 
 | ||||
|     audio_tab = std::make_unique<ConfigureAudio>(this); | ||||
|     const bool is_powered_on = system.IsPoweredOn(); | ||||
|     audio_tab = std::make_unique<ConfigureAudio>(is_powered_on, this); | ||||
|     general_tab = std::make_unique<ConfigureGeneral>(this); | ||||
|     enhancements_tab = std::make_unique<ConfigureEnhancements>(this); | ||||
|     graphics_tab = std::make_unique<ConfigureGraphics>(this); | ||||
|     system_tab = std::make_unique<ConfigureSystem>(this); | ||||
|     debug_tab = std::make_unique<ConfigureDebug>(this); | ||||
|     cheat_tab = std::make_unique<ConfigureCheats>(title_id, this); | ||||
|     graphics_tab = std::make_unique<ConfigureGraphics>(is_powered_on, this); | ||||
|     system_tab = std::make_unique<ConfigureSystem>(system, this); | ||||
|     debug_tab = std::make_unique<ConfigureDebug>(is_powered_on, this); | ||||
|     cheat_tab = std::make_unique<ConfigureCheats>(system, title_id, this); | ||||
| 
 | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,11 +8,10 @@ | |||
| #include "citra_qt/configuration/configure_storage.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "ui_configure_storage.h" | ||||
| 
 | ||||
| ConfigureStorage::ConfigureStorage(QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureStorage>()) { | ||||
| ConfigureStorage::ConfigureStorage(bool is_powered_on_, QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureStorage>()), is_powered_on{is_powered_on_} { | ||||
|     ui->setupUi(this); | ||||
|     SetConfiguration(); | ||||
| 
 | ||||
|  | @ -75,7 +74,7 @@ void ConfigureStorage::SetConfiguration() { | |||
|     ui->toggle_virtual_sd->setChecked(Settings::values.use_virtual_sd.GetValue()); | ||||
|     ui->toggle_custom_storage->setChecked(Settings::values.use_custom_storage.GetValue()); | ||||
| 
 | ||||
|     ui->storage_group->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||
|     ui->storage_group->setEnabled(!is_powered_on); | ||||
| } | ||||
| 
 | ||||
| void ConfigureStorage::ApplyConfiguration() { | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ class ConfigureStorage : public QWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigureStorage(QWidget* parent = nullptr); | ||||
|     explicit ConfigureStorage(bool is_powered_on, QWidget* parent = nullptr); | ||||
|     ~ConfigureStorage() override; | ||||
| 
 | ||||
|     void ApplyConfiguration(); | ||||
|  | @ -23,4 +23,5 @@ public: | |||
|     void SetConfiguration(); | ||||
| 
 | ||||
|     std::unique_ptr<Ui::ConfigureStorage> ui; | ||||
|     bool is_powered_on; | ||||
| }; | ||||
|  |  | |||
|  | @ -223,14 +223,12 @@ static const std::array<const char*, 187> country_names = { | |||
|     QT_TRANSLATE_NOOP("ConfigureSystem", "Bermuda"), // 180-186
 | ||||
| }; | ||||
| 
 | ||||
| ConfigureSystem::ConfigureSystem(QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureSystem>()) { | ||||
| ConfigureSystem::ConfigureSystem(Core::System& system_, QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureSystem>()), system{system_} { | ||||
|     ui->setupUi(this); | ||||
|     connect(ui->combo_birthmonth, | ||||
|             static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, | ||||
|     connect(ui->combo_birthmonth, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             &ConfigureSystem::UpdateBirthdayComboBox); | ||||
|     connect(ui->combo_init_clock, | ||||
|             static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, | ||||
|     connect(ui->combo_init_clock, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             &ConfigureSystem::UpdateInitTime); | ||||
|     connect(ui->button_regenerate_console_id, &QPushButton::clicked, this, | ||||
|             &ConfigureSystem::RefreshConsoleID); | ||||
|  | @ -280,7 +278,7 @@ ConfigureSystem::ConfigureSystem(QWidget* parent) | |||
| ConfigureSystem::~ConfigureSystem() = default; | ||||
| 
 | ||||
| void ConfigureSystem::SetConfiguration() { | ||||
|     enabled = !Core::System::GetInstance().IsPoweredOn(); | ||||
|     enabled = !system.IsPoweredOn(); | ||||
| 
 | ||||
|     ui->combo_init_clock->setCurrentIndex(static_cast<u8>(Settings::values.init_clock.GetValue())); | ||||
|     QDateTime date_time; | ||||
|  | @ -296,7 +294,7 @@ void ConfigureSystem::SetConfiguration() { | |||
|     ui->edit_init_time_offset_time->setTime(time); | ||||
| 
 | ||||
|     if (!enabled) { | ||||
|         cfg = Service::CFG::GetModule(Core::System::GetInstance()); | ||||
|         cfg = Service::CFG::GetModule(system); | ||||
|         ASSERT_MSG(cfg, "CFG Module missing!"); | ||||
|         ReadSystemSettings(); | ||||
|         ui->group_system_settings->setEnabled(false); | ||||
|  |  | |||
|  | @ -16,6 +16,10 @@ namespace ConfigurationShared { | |||
| enum class CheckState; | ||||
| } | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace CFG { | ||||
| class Module; | ||||
|  | @ -26,7 +30,7 @@ class ConfigureSystem : public QWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigureSystem(QWidget* parent = nullptr); | ||||
|     explicit ConfigureSystem(Core::System& system, QWidget* parent = nullptr); | ||||
|     ~ConfigureSystem() override; | ||||
| 
 | ||||
|     void ApplyConfiguration(); | ||||
|  | @ -45,8 +49,10 @@ private: | |||
| 
 | ||||
|     void DownloadFromNUS(); | ||||
| 
 | ||||
|     ConfigurationShared::CheckState is_new_3ds; | ||||
| private: | ||||
|     std::unique_ptr<Ui::ConfigureSystem> ui; | ||||
|     Core::System& system; | ||||
|     ConfigurationShared::CheckState is_new_3ds; | ||||
|     bool enabled = false; | ||||
| 
 | ||||
|     std::shared_ptr<Service::CFG::Module> cfg; | ||||
|  |  | |||
|  | @ -16,7 +16,6 @@ | |||
| #include "citra_qt/debugger/graphics/graphics_cmdlists.h" | ||||
| #include "citra_qt/util/util.h" | ||||
| #include "common/vector_math.h" | ||||
| #include "core/core.h" | ||||
| #include "core/memory.h" | ||||
| #include "video_core/debug_utils/debug_utils.h" | ||||
| #include "video_core/pica_state.h" | ||||
|  | @ -167,8 +166,7 @@ void GPUCommandListWidget::SetCommandInfo(const QModelIndex& index) { | |||
|         const auto format = texture.format; | ||||
| 
 | ||||
|         const auto info = Pica::Texture::TextureInfo::FromPicaRegister(config, format); | ||||
|         const u8* src = | ||||
|             Core::System::GetInstance().Memory().GetPhysicalPointer(config.GetPhysicalAddress()); | ||||
|         const u8* src = memory.GetPhysicalPointer(config.GetPhysicalAddress()); | ||||
|         new_info_widget = new TextureInfoWidget(src, info); | ||||
|     } | ||||
|     if (command_info_widget) { | ||||
|  | @ -182,8 +180,8 @@ void GPUCommandListWidget::SetCommandInfo(const QModelIndex& index) { | |||
| } | ||||
| #undef COMMAND_IN_RANGE | ||||
| 
 | ||||
| GPUCommandListWidget::GPUCommandListWidget(QWidget* parent) | ||||
|     : QDockWidget(tr("Pica Command List"), parent) { | ||||
| GPUCommandListWidget::GPUCommandListWidget(Memory::MemorySystem& memory_, QWidget* parent) | ||||
|     : QDockWidget(tr("Pica Command List"), parent), memory{memory_} { | ||||
|     setObjectName(QStringLiteral("Pica Command List")); | ||||
|     GPUCommandListModel* model = new GPUCommandListModel(this); | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,11 +7,14 @@ | |||
| #include <QAbstractListModel> | ||||
| #include <QDockWidget> | ||||
| #include "video_core/debug_utils/debug_utils.h" | ||||
| #include "video_core/gpu_debugger.h" | ||||
| 
 | ||||
| class QPushButton; | ||||
| class QTreeView; | ||||
| 
 | ||||
| namespace Memory { | ||||
| class MemorySystem; | ||||
| } | ||||
| 
 | ||||
| class GPUCommandListModel : public QAbstractListModel { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
|  | @ -39,7 +42,7 @@ class GPUCommandListWidget : public QDockWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit GPUCommandListWidget(QWidget* parent = nullptr); | ||||
|     explicit GPUCommandListWidget(Memory::MemorySystem& memory, QWidget* parent = nullptr); | ||||
| 
 | ||||
| public slots: | ||||
|     void OnToggleTracing(); | ||||
|  | @ -54,7 +57,7 @@ signals: | |||
| 
 | ||||
| private: | ||||
|     std::unique_ptr<Pica::DebugUtils::PicaTrace> pica_trace; | ||||
| 
 | ||||
|     Memory::MemorySystem& memory; | ||||
|     QTreeView* list_widget; | ||||
|     QWidget* command_info_widget; | ||||
|     QPushButton* toggle_tracing; | ||||
|  |  | |||
|  | @ -15,8 +15,6 @@ | |||
| #include "citra_qt/debugger/graphics/graphics_surface.h" | ||||
| #include "citra_qt/util/spinbox.h" | ||||
| #include "common/color.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hw/gpu.h" | ||||
| #include "core/memory.h" | ||||
| #include "video_core/pica_state.h" | ||||
| #include "video_core/regs_framebuffer.h" | ||||
|  | @ -51,9 +49,10 @@ void SurfacePicture::mouseMoveEvent(QMouseEvent* event) { | |||
|     mousePressEvent(event); | ||||
| } | ||||
| 
 | ||||
| GraphicsSurfaceWidget::GraphicsSurfaceWidget(std::shared_ptr<Pica::DebugContext> debug_context, | ||||
| GraphicsSurfaceWidget::GraphicsSurfaceWidget(Memory::MemorySystem& memory_, | ||||
|                                              std::shared_ptr<Pica::DebugContext> debug_context, | ||||
|                                              QWidget* parent) | ||||
|     : BreakPointObserverDock(debug_context, tr("Pica Surface Viewer"), parent), | ||||
|     : BreakPointObserverDock(debug_context, tr("Pica Surface Viewer"), parent), memory{memory_}, | ||||
|       surface_source(Source::ColorBuffer) { | ||||
|     setObjectName(QStringLiteral("PicaSurface")); | ||||
| 
 | ||||
|  | @ -290,57 +289,57 @@ void GraphicsSurfaceWidget::Pick(int x, int y) { | |||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     u8* buffer = Core::System::GetInstance().Memory().GetPhysicalPointer(surface_address); | ||||
|     if (buffer == nullptr) { | ||||
|     const u8* buffer = memory.GetPhysicalPointer(surface_address); | ||||
|     if (!buffer) { | ||||
|         surface_info_label->setText(tr("(unable to access pixel data)")); | ||||
|         surface_info_label->setAlignment(Qt::AlignCenter); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     unsigned nibbles_per_pixel = GraphicsSurfaceWidget::NibblesPerPixel(surface_format); | ||||
|     unsigned stride = nibbles_per_pixel * surface_width / 2; | ||||
| 
 | ||||
|     unsigned bytes_per_pixel; | ||||
|     bool nibble_mode = (nibbles_per_pixel == 1); | ||||
|     if (nibble_mode) { | ||||
|         // As nibbles are contained in a byte we still need to access one byte per nibble
 | ||||
|         bytes_per_pixel = 1; | ||||
|     } else { | ||||
|         bytes_per_pixel = nibbles_per_pixel / 2; | ||||
|     } | ||||
|     const u32 nibbles_per_pixel = GraphicsSurfaceWidget::NibblesPerPixel(surface_format); | ||||
|     const u32 stride = nibbles_per_pixel * surface_width / 2; | ||||
|     const bool nibble_mode = (nibbles_per_pixel == 1); | ||||
|     const u32 bytes_per_pixel = [&] { | ||||
|         if (nibble_mode) { | ||||
|             // As nibbles are contained in a byte we still need to access one byte per nibble
 | ||||
|             return 1u; | ||||
|         } else { | ||||
|             return nibbles_per_pixel / 2; | ||||
|         } | ||||
|     }(); | ||||
| 
 | ||||
|     const u32 coarse_y = y & ~7; | ||||
|     u32 offset = VideoCore::GetMortonOffset(x, y, bytes_per_pixel) + coarse_y * stride; | ||||
|     const u32 offset = VideoCore::GetMortonOffset(x, y, bytes_per_pixel) + coarse_y * stride; | ||||
|     const u8* pixel = buffer + (nibble_mode ? (offset / 2) : offset); | ||||
| 
 | ||||
|     auto GetText = [offset](Format format, const u8* pixel) { | ||||
|     const auto get_text = [offset](Format format, const u8* pixel) { | ||||
|         switch (format) { | ||||
|         case Format::RGBA8: { | ||||
|             auto value = Common::Color::DecodeRGBA8(pixel) / 255.0f; | ||||
|             const auto value = Common::Color::DecodeRGBA8(pixel) / 255.0f; | ||||
|             return QStringLiteral("Red: %1, Green: %2, Blue: %3, Alpha: %4") | ||||
|                 .arg(QString::number(value.r(), 'f', 2), QString::number(value.g(), 'f', 2), | ||||
|                      QString::number(value.b(), 'f', 2), QString::number(value.a(), 'f', 2)); | ||||
|         } | ||||
|         case Format::RGB8: { | ||||
|             auto value = Common::Color::DecodeRGB8(pixel) / 255.0f; | ||||
|             const auto value = Common::Color::DecodeRGB8(pixel) / 255.0f; | ||||
|             return QStringLiteral("Red: %1, Green: %2, Blue: %3") | ||||
|                 .arg(QString::number(value.r(), 'f', 2), QString::number(value.g(), 'f', 2), | ||||
|                      QString::number(value.b(), 'f', 2)); | ||||
|         } | ||||
|         case Format::RGB5A1: { | ||||
|             auto value = Common::Color::DecodeRGB5A1(pixel) / 255.0f; | ||||
|             const auto value = Common::Color::DecodeRGB5A1(pixel) / 255.0f; | ||||
|             return QStringLiteral("Red: %1, Green: %2, Blue: %3, Alpha: %4") | ||||
|                 .arg(QString::number(value.r(), 'f', 2), QString::number(value.g(), 'f', 2), | ||||
|                      QString::number(value.b(), 'f', 2), QString::number(value.a(), 'f', 2)); | ||||
|         } | ||||
|         case Format::RGB565: { | ||||
|             auto value = Common::Color::DecodeRGB565(pixel) / 255.0f; | ||||
|             const auto value = Common::Color::DecodeRGB565(pixel) / 255.0f; | ||||
|             return QStringLiteral("Red: %1, Green: %2, Blue: %3") | ||||
|                 .arg(QString::number(value.r(), 'f', 2), QString::number(value.g(), 'f', 2), | ||||
|                      QString::number(value.b(), 'f', 2)); | ||||
|         } | ||||
|         case Format::RGBA4: { | ||||
|             auto value = Common::Color::DecodeRGBA4(pixel) / 255.0f; | ||||
|             const auto value = Common::Color::DecodeRGBA4(pixel) / 255.0f; | ||||
|             return QStringLiteral("Red: %1, Green: %2, Blue: %3, Alpha: %4") | ||||
|                 .arg(QString::number(value.r(), 'f', 2), QString::number(value.g(), 'f', 2), | ||||
|                      QString::number(value.b(), 'f', 2), QString::number(value.a(), 'f', 2)); | ||||
|  | @ -348,7 +347,7 @@ void GraphicsSurfaceWidget::Pick(int x, int y) { | |||
|         case Format::IA8: | ||||
|             return QStringLiteral("Index: %1, Alpha: %2").arg(pixel[0], pixel[1]); | ||||
|         case Format::RG8: { | ||||
|             auto value = Common::Color::DecodeRG8(pixel) / 255.0f; | ||||
|             const auto value = Common::Color::DecodeRG8(pixel) / 255.0f; | ||||
|             return QStringLiteral("Red: %1, Green: %2") | ||||
|                 .arg(QString::number(value.r(), 'f', 2), QString::number(value.g(), 'f', 2)); | ||||
|         } | ||||
|  | @ -359,11 +358,11 @@ void GraphicsSurfaceWidget::Pick(int x, int y) { | |||
|         case Format::IA4: | ||||
|             return QStringLiteral("Index: %1, Alpha: %2").arg(*pixel & 0xF, (*pixel & 0xF0) >> 4); | ||||
|         case Format::I4: { | ||||
|             u8 i = (*pixel >> ((offset % 2) ? 4 : 0)) & 0xF; | ||||
|             const u8 i = (*pixel >> ((offset % 2) ? 4 : 0)) & 0xF; | ||||
|             return QStringLiteral("Index: %1").arg(i); | ||||
|         } | ||||
|         case Format::A4: { | ||||
|             u8 a = (*pixel >> ((offset % 2) ? 4 : 0)) & 0xF; | ||||
|             const u8 a = (*pixel >> ((offset % 2) ? 4 : 0)) & 0xF; | ||||
|             return QStringLiteral("Alpha: %1").arg(QString::number(a / 15.0f, 'f', 2)); | ||||
|         } | ||||
|         case Format::ETC1: | ||||
|  | @ -371,17 +370,17 @@ void GraphicsSurfaceWidget::Pick(int x, int y) { | |||
|             // TODO: Display block information or channel values?
 | ||||
|             return QStringLiteral("Compressed data"); | ||||
|         case Format::D16: { | ||||
|             auto value = Common::Color::DecodeD16(pixel); | ||||
|             const auto value = Common::Color::DecodeD16(pixel); | ||||
|             return QStringLiteral("Depth: %1").arg(QString::number(value / (float)0xFFFF, 'f', 4)); | ||||
|         } | ||||
|         case Format::D24: { | ||||
|             auto value = Common::Color::DecodeD24(pixel); | ||||
|             const auto value = Common::Color::DecodeD24(pixel); | ||||
|             return QStringLiteral("Depth: %1") | ||||
|                 .arg(QString::number(value / (float)0xFFFFFF, 'f', 4)); | ||||
|         } | ||||
|         case Format::D24X8: | ||||
|         case Format::X24S8: { | ||||
|             auto values = Common::Color::DecodeD24S8(pixel); | ||||
|             const auto values = Common::Color::DecodeD24S8(pixel); | ||||
|             return QStringLiteral("Depth: %1, Stencil: %2") | ||||
|                 .arg(QString::number(values[0] / (float)0xFFFFFF, 'f', 4), values[1]); | ||||
|         } | ||||
|  | @ -398,13 +397,13 @@ void GraphicsSurfaceWidget::Pick(int x, int y) { | |||
|         if (nibble_mode) { | ||||
|             nibble_index += (offset % 2) ? 0 : 1; | ||||
|         } | ||||
|         u8 byte = pixel[nibble_index / 2]; | ||||
|         u8 nibble = (byte >> ((nibble_index % 2) ? 0 : 4)) & 0xF; | ||||
|         const u8 byte = pixel[nibble_index / 2]; | ||||
|         const u8 nibble = (byte >> ((nibble_index % 2) ? 0 : 4)) & 0xF; | ||||
|         nibbles.append(QString::number(nibble, 16).toUpper()); | ||||
|     } | ||||
| 
 | ||||
|     surface_info_label->setText( | ||||
|         QStringLiteral("Raw: 0x%3\n(%4)").arg(nibbles, GetText(surface_format, pixel))); | ||||
|         QStringLiteral("Raw: 0x%3\n(%4)").arg(nibbles, get_text(surface_format, pixel))); | ||||
|     surface_info_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); | ||||
| } | ||||
| 
 | ||||
|  | @ -546,9 +545,9 @@ void GraphicsSurfaceWidget::OnUpdate() { | |||
|     // TODO: Implement a good way to visualize alpha components!
 | ||||
| 
 | ||||
|     QImage decoded_image(surface_width, surface_height, QImage::Format_ARGB32); | ||||
|     u8* buffer = Core::System::GetInstance().Memory().GetPhysicalPointer(surface_address); | ||||
|     const u8* buffer = memory.GetPhysicalPointer(surface_address); | ||||
| 
 | ||||
|     if (buffer == nullptr) { | ||||
|     if (!buffer) { | ||||
|         surface_picture_label->hide(); | ||||
|         surface_info_label->setText(tr("(invalid surface address)")); | ||||
|         surface_info_label->setAlignment(Qt::AlignCenter); | ||||
|  | @ -682,9 +681,8 @@ void GraphicsSurfaceWidget::SaveSurface() { | |||
|                                  tr("Failed to save surface data to file '%1'").arg(filename)); | ||||
|         } | ||||
|     } else if (selected_filter == bin_filter) { | ||||
|         const u8* const buffer = | ||||
|             Core::System::GetInstance().Memory().GetPhysicalPointer(surface_address); | ||||
|         ASSERT_MSG(buffer != nullptr, "Memory not accessible"); | ||||
|         const u8* const buffer = memory.GetPhysicalPointer(surface_address); | ||||
|         ASSERT_MSG(buffer, "Memory not accessible"); | ||||
| 
 | ||||
|         QFile file{filename}; | ||||
|         if (!file.open(QIODevice::WriteOnly)) { | ||||
|  |  | |||
|  | @ -14,6 +14,10 @@ class CSpinBox; | |||
| 
 | ||||
| class GraphicsSurfaceWidget; | ||||
| 
 | ||||
| namespace Memory { | ||||
| class MemorySystem; | ||||
| } | ||||
| 
 | ||||
| class SurfacePicture : public QLabel { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
|  | @ -72,7 +76,8 @@ class GraphicsSurfaceWidget : public BreakPointObserverDock { | |||
|     static unsigned int NibblesPerPixel(Format format); | ||||
| 
 | ||||
| public: | ||||
|     explicit GraphicsSurfaceWidget(std::shared_ptr<Pica::DebugContext> debug_context, | ||||
|     explicit GraphicsSurfaceWidget(Memory::MemorySystem& memory, | ||||
|                                    std::shared_ptr<Pica::DebugContext> debug_context, | ||||
|                                    QWidget* parent = nullptr); | ||||
|     void Pick(int x, int y); | ||||
| 
 | ||||
|  | @ -95,6 +100,7 @@ private: | |||
| 
 | ||||
|     void SaveSurface(); | ||||
| 
 | ||||
|     Memory::MemorySystem& memory; | ||||
|     QComboBox* surface_source_list; | ||||
|     CSpinBox* surface_address_control; | ||||
|     QSpinBox* surface_width_control; | ||||
|  |  | |||
|  | @ -16,13 +16,13 @@ | |||
| #include "core/hle/service/sm/sm.h" | ||||
| #include "ui_recorder.h" | ||||
| 
 | ||||
| IPCRecorderWidget::IPCRecorderWidget(QWidget* parent) | ||||
|     : QDockWidget(parent), ui(std::make_unique<Ui::IPCRecorder>()) { | ||||
| IPCRecorderWidget::IPCRecorderWidget(Core::System& system_, QWidget* parent) | ||||
|     : QDockWidget(parent), ui(std::make_unique<Ui::IPCRecorder>()), system{system_} { | ||||
| 
 | ||||
|     ui->setupUi(this); | ||||
|     qRegisterMetaType<IPCDebugger::RequestRecord>(); | ||||
| 
 | ||||
|     connect(ui->enabled, &QCheckBox::stateChanged, | ||||
|     connect(ui->enabled, &QCheckBox::stateChanged, this, | ||||
|             [this](int new_state) { SetEnabled(new_state == Qt::Checked); }); | ||||
|     connect(ui->clearButton, &QPushButton::clicked, this, &IPCRecorderWidget::Clear); | ||||
|     connect(ui->filter, &QLineEdit::textChanged, this, &IPCRecorderWidget::ApplyFilterToAll); | ||||
|  | @ -90,7 +90,7 @@ void IPCRecorderWidget::OnEntryUpdated(IPCDebugger::RequestRecord record) { | |||
|         (record.status == IPCDebugger::RequestStatus::Handled && | ||||
|          record.translated_reply_cmdbuf[1] != RESULT_SUCCESS.raw)) { // Unimplemented / Error
 | ||||
| 
 | ||||
|         auto* item = ui->main->invisibleRootItem()->child(row_id); | ||||
|         auto item = ui->main->invisibleRootItem()->child(row_id); | ||||
|         for (int column = 0; column < item->columnCount(); ++column) { | ||||
|             item->setBackground(column, QBrush(QColor::fromRgb(255, 0, 0))); | ||||
|         } | ||||
|  | @ -100,11 +100,11 @@ void IPCRecorderWidget::OnEntryUpdated(IPCDebugger::RequestRecord record) { | |||
| } | ||||
| 
 | ||||
| void IPCRecorderWidget::SetEnabled(bool enabled) { | ||||
|     if (!Core::System::GetInstance().IsPoweredOn()) { | ||||
|     if (!system.IsPoweredOn()) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     auto& ipc_recorder = Core::System::GetInstance().Kernel().GetIPCRecorder(); | ||||
|     auto& ipc_recorder = system.Kernel().GetIPCRecorder(); | ||||
|     ipc_recorder.SetEnabled(enabled); | ||||
| 
 | ||||
|     if (enabled) { | ||||
|  | @ -123,10 +123,10 @@ void IPCRecorderWidget::Clear() { | |||
| } | ||||
| 
 | ||||
| QString IPCRecorderWidget::GetServiceName(const IPCDebugger::RequestRecord& record) const { | ||||
|     if (Core::System::GetInstance().IsPoweredOn() && record.client_port.id != -1) { | ||||
|         const auto service_name = | ||||
|             Core::System::GetInstance().ServiceManager().GetServiceNameByPortId( | ||||
|                 static_cast<u32>(record.client_port.id)); | ||||
|     if (system.IsPoweredOn() && record.client_port.id != -1) { | ||||
|         const Service::SM::ServiceManager& sm = system.ServiceManager(); | ||||
|         const u32 port_id = static_cast<u32>(record.client_port.id); | ||||
|         const auto service_name = sm.GetServiceNameByPortId(port_id); | ||||
| 
 | ||||
|         if (!service_name.empty()) { | ||||
|             return QString::fromStdString(service_name); | ||||
|  |  | |||
|  | @ -14,11 +14,15 @@ namespace Ui { | |||
| class IPCRecorder; | ||||
| } | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class IPCRecorderWidget : public QDockWidget { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit IPCRecorderWidget(QWidget* parent = nullptr); | ||||
|     explicit IPCRecorderWidget(Core::System& system, QWidget* parent = nullptr); | ||||
|     ~IPCRecorderWidget(); | ||||
| 
 | ||||
|     void OnEmulationStarting(); | ||||
|  | @ -37,9 +41,10 @@ private: | |||
|     QString GetFunctionName(const IPCDebugger::RequestRecord& record) const; | ||||
|     void OpenRecordDialog(QTreeWidgetItem* item, int column); | ||||
| 
 | ||||
| private: | ||||
|     std::unique_ptr<Ui::IPCRecorder> ui; | ||||
|     IPCDebugger::CallbackHandle handle; | ||||
| 
 | ||||
|     Core::System& system; | ||||
|     // The offset between record id and row id, assuming record ids are assigned
 | ||||
|     // continuously and only the 'Clear' action can be performed, this is enough.
 | ||||
|     // The initial value is 1, which means record 1 = row 0.
 | ||||
|  |  | |||
|  | @ -9,8 +9,8 @@ | |||
| #include "core/core.h" | ||||
| #include "ui_registers.h" | ||||
| 
 | ||||
| RegistersWidget::RegistersWidget(QWidget* parent) | ||||
|     : QDockWidget(parent), cpu_regs_ui(std::make_unique<Ui::ARMRegisters>()) { | ||||
| RegistersWidget::RegistersWidget(const Core::System& system_, QWidget* parent) | ||||
|     : QDockWidget(parent), cpu_regs_ui(std::make_unique<Ui::ARMRegisters>()), system{system_} { | ||||
|     cpu_regs_ui->setupUi(this); | ||||
| 
 | ||||
|     tree = cpu_regs_ui->treeWidget; | ||||
|  | @ -62,17 +62,21 @@ RegistersWidget::RegistersWidget(QWidget* parent) | |||
| RegistersWidget::~RegistersWidget() = default; | ||||
| 
 | ||||
| void RegistersWidget::OnDebugModeEntered() { | ||||
|     if (!Core::System::GetInstance().IsPoweredOn()) | ||||
|     if (!system.IsPoweredOn()) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // Todo: Handle all cores
 | ||||
|     for (int i = 0; i < core_registers->childCount(); ++i) | ||||
|     // TODO: Handle all cores
 | ||||
|     const ARM_Interface& core = system.GetCore(0); | ||||
|     for (int i = 0; i < core_registers->childCount(); ++i) { | ||||
|         core_registers->child(i)->setText( | ||||
|             1, QStringLiteral("0x%1").arg(Core::GetCore(0).GetReg(i), 8, 16, QLatin1Char('0'))); | ||||
|             1, QStringLiteral("0x%1").arg(core.GetReg(i), 8, 16, QLatin1Char('0'))); | ||||
|     } | ||||
| 
 | ||||
|     for (int i = 0; i < vfp_registers->childCount(); ++i) | ||||
|     for (int i = 0; i < vfp_registers->childCount(); ++i) { | ||||
|         vfp_registers->child(i)->setText( | ||||
|             1, QStringLiteral("0x%1").arg(Core::GetCore(0).GetVFPReg(i), 8, 16, QLatin1Char('0'))); | ||||
|             1, QStringLiteral("0x%1").arg(core.GetVFPReg(i), 8, 16, QLatin1Char('0'))); | ||||
|     } | ||||
| 
 | ||||
|     UpdateCPSRValues(); | ||||
|     UpdateVFPSystemRegisterValues(); | ||||
|  | @ -86,24 +90,29 @@ void RegistersWidget::OnEmulationStarting(EmuThread* emu_thread) { | |||
| 
 | ||||
| void RegistersWidget::OnEmulationStopping() { | ||||
|     // Reset widget text
 | ||||
|     for (int i = 0; i < core_registers->childCount(); ++i) | ||||
|     for (int i = 0; i < core_registers->childCount(); ++i) { | ||||
|         core_registers->child(i)->setText(1, QString{}); | ||||
|     } | ||||
| 
 | ||||
|     for (int i = 0; i < vfp_registers->childCount(); ++i) | ||||
|     for (int i = 0; i < vfp_registers->childCount(); ++i) { | ||||
|         vfp_registers->child(i)->setText(1, QString{}); | ||||
|     } | ||||
| 
 | ||||
|     for (int i = 0; i < cpsr->childCount(); ++i) | ||||
|     for (int i = 0; i < cpsr->childCount(); ++i) { | ||||
|         cpsr->child(i)->setText(1, QString{}); | ||||
|     } | ||||
| 
 | ||||
|     cpsr->setText(1, QString{}); | ||||
| 
 | ||||
|     // FPSCR
 | ||||
|     for (int i = 0; i < vfp_system_registers->child(0)->childCount(); ++i) | ||||
|     for (int i = 0; i < vfp_system_registers->child(0)->childCount(); ++i) { | ||||
|         vfp_system_registers->child(0)->child(i)->setText(1, QString{}); | ||||
|     } | ||||
| 
 | ||||
|     // FPEXC
 | ||||
|     for (int i = 0; i < vfp_system_registers->child(1)->childCount(); ++i) | ||||
|     for (int i = 0; i < vfp_system_registers->child(1)->childCount(); ++i) { | ||||
|         vfp_system_registers->child(1)->child(i)->setText(1, QString{}); | ||||
|     } | ||||
| 
 | ||||
|     vfp_system_registers->child(0)->setText(1, QString{}); | ||||
|     vfp_system_registers->child(1)->setText(1, QString{}); | ||||
|  | @ -130,8 +139,8 @@ void RegistersWidget::CreateCPSRChildren() { | |||
| } | ||||
| 
 | ||||
| void RegistersWidget::UpdateCPSRValues() { | ||||
|     // Todo: Handle all cores
 | ||||
|     const u32 cpsr_val = Core::GetCore(0).GetCPSR(); | ||||
|     // TODO: Handle all cores
 | ||||
|     const u32 cpsr_val = system.GetCore(0).GetCPSR(); | ||||
| 
 | ||||
|     cpsr->setText(1, QStringLiteral("0x%1").arg(cpsr_val, 8, 16, QLatin1Char('0'))); | ||||
|     cpsr->child(0)->setText( | ||||
|  | @ -193,9 +202,10 @@ void RegistersWidget::CreateVFPSystemRegisterChildren() { | |||
| } | ||||
| 
 | ||||
| void RegistersWidget::UpdateVFPSystemRegisterValues() { | ||||
|     // Todo: handle all cores
 | ||||
|     const u32 fpscr_val = Core::GetCore(0).GetVFPSystemReg(VFP_FPSCR); | ||||
|     const u32 fpexc_val = Core::GetCore(0).GetVFPSystemReg(VFP_FPEXC); | ||||
|     // TODO: handle all cores
 | ||||
|     const ARM_Interface& core = system.GetCore(0); | ||||
|     const u32 fpscr_val = core.GetVFPSystemReg(VFP_FPSCR); | ||||
|     const u32 fpexc_val = core.GetVFPSystemReg(VFP_FPEXC); | ||||
| 
 | ||||
|     QTreeWidgetItem* const fpscr = vfp_system_registers->child(0); | ||||
|     fpscr->setText(1, QStringLiteral("0x%1").arg(fpscr_val, 8, 16, QLatin1Char('0'))); | ||||
|  |  | |||
|  | @ -15,11 +15,15 @@ namespace Ui { | |||
| class ARMRegisters; | ||||
| } | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class RegistersWidget : public QDockWidget { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit RegistersWidget(QWidget* parent = nullptr); | ||||
|     explicit RegistersWidget(const Core::System& system, QWidget* parent = nullptr); | ||||
|     ~RegistersWidget(); | ||||
| 
 | ||||
| public slots: | ||||
|  | @ -37,7 +41,7 @@ private: | |||
|     void UpdateVFPSystemRegisterValues(); | ||||
| 
 | ||||
|     std::unique_ptr<Ui::ARMRegisters> cpu_regs_ui; | ||||
| 
 | ||||
|     const Core::System& system; | ||||
|     QTreeWidget* tree; | ||||
| 
 | ||||
|     QTreeWidgetItem* core_registers; | ||||
|  |  | |||
|  | @ -75,13 +75,13 @@ std::size_t WaitTreeItem::Row() const { | |||
|     return row; | ||||
| } | ||||
| 
 | ||||
| std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList() { | ||||
|     const u32 num_cores = Core::GetNumCores(); | ||||
| std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList( | ||||
|     Core::System& system) { | ||||
|     const u32 num_cores = system.GetNumCores(); | ||||
|     std::vector<std::unique_ptr<WaitTreeThread>> item_list; | ||||
|     item_list.reserve(num_cores); | ||||
|     for (u32 i = 0; i < num_cores; ++i) { | ||||
|         const auto& threads = | ||||
|             Core::System::GetInstance().Kernel().GetThreadManager(i).GetThreadList(); | ||||
|         const auto threads = system.Kernel().GetThreadManager(i).GetThreadList(); | ||||
|         item_list.reserve(item_list.size() + threads.size()); | ||||
|         for (std::size_t j = 0; j < threads.size(); ++j) { | ||||
|             item_list.push_back(std::make_unique<WaitTreeThread>(*threads[j])); | ||||
|  | @ -435,11 +435,12 @@ void WaitTreeModel::ClearItems() { | |||
|     thread_items.clear(); | ||||
| } | ||||
| 
 | ||||
| void WaitTreeModel::InitItems() { | ||||
|     thread_items = WaitTreeItem::MakeThreadItemList(); | ||||
| void WaitTreeModel::InitItems(Core::System& system) { | ||||
|     thread_items = WaitTreeItem::MakeThreadItemList(system); | ||||
| } | ||||
| 
 | ||||
| WaitTreeWidget::WaitTreeWidget(QWidget* parent) : QDockWidget(tr("Wait Tree"), parent) { | ||||
| WaitTreeWidget::WaitTreeWidget(Core::System& system_, QWidget* parent) | ||||
|     : QDockWidget(tr("Wait Tree"), parent), system{system_} { | ||||
|     setObjectName(QStringLiteral("WaitTreeWidget")); | ||||
|     view = new QTreeView(this); | ||||
|     view->setHeaderHidden(true); | ||||
|  | @ -448,9 +449,10 @@ WaitTreeWidget::WaitTreeWidget(QWidget* parent) : QDockWidget(tr("Wait Tree"), p | |||
| } | ||||
| 
 | ||||
| void WaitTreeWidget::OnDebugModeEntered() { | ||||
|     if (!Core::System::GetInstance().IsPoweredOn()) | ||||
|     if (!system.IsPoweredOn()) { | ||||
|         return; | ||||
|     model->InitItems(); | ||||
|     } | ||||
|     model->InitItems(system); | ||||
|     view->setModel(model); | ||||
|     setEnabled(true); | ||||
| } | ||||
|  |  | |||
|  | @ -23,6 +23,10 @@ class Thread; | |||
| class Timer; | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class WaitTreeThread; | ||||
| 
 | ||||
| class WaitTreeItem : public QObject { | ||||
|  | @ -39,7 +43,7 @@ public: | |||
|     WaitTreeItem* Parent() const; | ||||
|     std::span<const std::unique_ptr<WaitTreeItem>> Children() const; | ||||
|     std::size_t Row() const; | ||||
|     static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(); | ||||
|     static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(Core::System& system); | ||||
| 
 | ||||
| private: | ||||
|     std::size_t row; | ||||
|  | @ -166,7 +170,7 @@ public: | |||
|     int columnCount(const QModelIndex& parent) const override; | ||||
| 
 | ||||
|     void ClearItems(); | ||||
|     void InitItems(); | ||||
|     void InitItems(Core::System& system); | ||||
| 
 | ||||
| private: | ||||
|     std::vector<std::unique_ptr<WaitTreeThread>> thread_items; | ||||
|  | @ -176,7 +180,7 @@ class WaitTreeWidget : public QDockWidget { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit WaitTreeWidget(QWidget* parent = nullptr); | ||||
|     explicit WaitTreeWidget(Core::System& system, QWidget* parent = nullptr); | ||||
| 
 | ||||
| public slots: | ||||
|     void OnDebugModeEntered(); | ||||
|  | @ -188,4 +192,5 @@ public slots: | |||
| private: | ||||
|     QTreeView* view; | ||||
|     WaitTreeModel* model; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  |  | |||
|  | @ -353,8 +353,8 @@ void GMainWindow::InitializeWidgets() { | |||
|     }); | ||||
| 
 | ||||
|     InputCommon::Init(); | ||||
|     multiplayer_state = new MultiplayerState(this, game_list->GetModel(), ui->action_Leave_Room, | ||||
|                                              ui->action_Show_Room); | ||||
|     multiplayer_state = new MultiplayerState(system, this, game_list->GetModel(), | ||||
|                                              ui->action_Leave_Room, ui->action_Show_Room); | ||||
|     multiplayer_state->setVisible(false); | ||||
| 
 | ||||
| #if ENABLE_QT_UPDATER | ||||
|  | @ -434,7 +434,7 @@ void GMainWindow::InitializeDebugWidgets() { | |||
|     debug_menu->addAction(microProfileDialog->toggleViewAction()); | ||||
| #endif | ||||
| 
 | ||||
|     registersWidget = new RegistersWidget(this); | ||||
|     registersWidget = new RegistersWidget(system, this); | ||||
|     addDockWidget(Qt::RightDockWidgetArea, registersWidget); | ||||
|     registersWidget->hide(); | ||||
|     debug_menu->addAction(registersWidget->toggleViewAction()); | ||||
|  | @ -448,7 +448,7 @@ void GMainWindow::InitializeDebugWidgets() { | |||
|     graphicsWidget->hide(); | ||||
|     debug_menu->addAction(graphicsWidget->toggleViewAction()); | ||||
| 
 | ||||
|     graphicsCommandsWidget = new GPUCommandListWidget(this); | ||||
|     graphicsCommandsWidget = new GPUCommandListWidget(system.Memory(), this); | ||||
|     addDockWidget(Qt::RightDockWidgetArea, graphicsCommandsWidget); | ||||
|     graphicsCommandsWidget->hide(); | ||||
|     debug_menu->addAction(graphicsCommandsWidget->toggleViewAction()); | ||||
|  | @ -472,7 +472,7 @@ void GMainWindow::InitializeDebugWidgets() { | |||
|     connect(this, &GMainWindow::EmulationStopping, graphicsTracingWidget, | ||||
|             &GraphicsTracingWidget::OnEmulationStopping); | ||||
| 
 | ||||
|     waitTreeWidget = new WaitTreeWidget(this); | ||||
|     waitTreeWidget = new WaitTreeWidget(system, this); | ||||
|     addDockWidget(Qt::LeftDockWidgetArea, waitTreeWidget); | ||||
|     waitTreeWidget->hide(); | ||||
|     debug_menu->addAction(waitTreeWidget->toggleViewAction()); | ||||
|  | @ -490,7 +490,7 @@ void GMainWindow::InitializeDebugWidgets() { | |||
|     connect(this, &GMainWindow::EmulationStopping, waitTreeWidget, | ||||
|             [this] { lleServiceModulesWidget->setDisabled(false); }); | ||||
| 
 | ||||
|     ipcRecorderWidget = new IPCRecorderWidget(this); | ||||
|     ipcRecorderWidget = new IPCRecorderWidget(system, this); | ||||
|     addDockWidget(Qt::RightDockWidgetArea, ipcRecorderWidget); | ||||
|     ipcRecorderWidget->hide(); | ||||
|     debug_menu->addAction(ipcRecorderWidget->toggleViewAction()); | ||||
|  | @ -2046,7 +2046,6 @@ void GMainWindow::OnLoadAmiibo() { | |||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     Core::System& system{Core::System::GetInstance()}; | ||||
|     Service::SM::ServiceManager& sm = system.ServiceManager(); | ||||
|     auto nfc = sm.GetService<Service::NFC::Module::Interface>("nfc:u"); | ||||
|     if (nfc == nullptr) { | ||||
|  | @ -2118,7 +2117,8 @@ void GMainWindow::OnToggleFilterBar() { | |||
| } | ||||
| 
 | ||||
| void GMainWindow::OnCreateGraphicsSurfaceViewer() { | ||||
|     auto graphicsSurfaceViewerWidget = new GraphicsSurfaceWidget(Pica::g_debug_context, this); | ||||
|     auto graphicsSurfaceViewerWidget = | ||||
|         new GraphicsSurfaceWidget(system.Memory(), Pica::g_debug_context, this); | ||||
|     addDockWidget(Qt::RightDockWidgetArea, graphicsSurfaceViewerWidget); | ||||
|     // TODO: Maybe graphicsSurfaceViewerWidget->setFloating(true);
 | ||||
|     graphicsSurfaceViewerWidget->show(); | ||||
|  |  | |||
|  | @ -9,10 +9,8 @@ | |||
| #include <QString> | ||||
| #include <QtConcurrent/QtConcurrentRun> | ||||
| #include "citra_qt/main.h" | ||||
| #include "citra_qt/multiplayer/client_room.h" | ||||
| #include "citra_qt/multiplayer/direct_connect.h" | ||||
| #include "citra_qt/multiplayer/message.h" | ||||
| #include "citra_qt/multiplayer/state.h" | ||||
| #include "citra_qt/multiplayer/validation.h" | ||||
| #include "citra_qt/uisettings.h" | ||||
| #include "core/hle/service/cfg/cfg.h" | ||||
|  | @ -22,9 +20,9 @@ | |||
| 
 | ||||
| enum class ConnectionType : u8 { TraversalServer, IP }; | ||||
| 
 | ||||
| DirectConnectWindow::DirectConnectWindow(QWidget* parent) | ||||
| DirectConnectWindow::DirectConnectWindow(Core::System& system_, QWidget* parent) | ||||
|     : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | ||||
|       ui(std::make_unique<Ui::DirectConnect>()) { | ||||
|       ui(std::make_unique<Ui::DirectConnect>()), system{system_} { | ||||
| 
 | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|  | @ -91,7 +89,7 @@ void DirectConnectWindow::Connect() { | |||
|         if (auto room_member = Network::GetRoomMember().lock()) { | ||||
|             auto port = UISettings::values.port.toUInt(); | ||||
|             room_member->Join(ui->nickname->text().toStdString(), | ||||
|                               Service::CFG::GetConsoleIdHash(Core::System::GetInstance()), | ||||
|                               Service::CFG::GetConsoleIdHash(system), | ||||
|                               ui->ip->text().toStdString().c_str(), port, 0, | ||||
|                               Network::NoPreferredMac, ui->password->text().toStdString().c_str()); | ||||
|         } | ||||
|  |  | |||
|  | @ -13,11 +13,15 @@ namespace Ui { | |||
| class DirectConnect; | ||||
| } | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class DirectConnectWindow : public QDialog { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit DirectConnectWindow(QWidget* parent = nullptr); | ||||
|     explicit DirectConnectWindow(Core::System& system, QWidget* parent = nullptr); | ||||
|     ~DirectConnectWindow(); | ||||
| 
 | ||||
|     void RetranslateUi(); | ||||
|  | @ -39,5 +43,6 @@ private: | |||
| 
 | ||||
|     QFutureWatcher<void>* watcher; | ||||
|     std::unique_ptr<Ui::DirectConnect> ui; | ||||
|     Core::System& system; | ||||
|     Validation validation; | ||||
| }; | ||||
|  |  | |||
|  | @ -12,7 +12,6 @@ | |||
| #include <QTime> | ||||
| #include <QtConcurrent/QtConcurrentRun> | ||||
| #include "citra_qt/game_list_p.h" | ||||
| #include "citra_qt/main.h" | ||||
| #include "citra_qt/multiplayer/host_room.h" | ||||
| #include "citra_qt/multiplayer/message.h" | ||||
| #include "citra_qt/multiplayer/state.h" | ||||
|  | @ -27,10 +26,10 @@ | |||
| #include "web_service/verify_user_jwt.h" | ||||
| #endif | ||||
| 
 | ||||
| HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, | ||||
| HostRoomWindow::HostRoomWindow(Core::System& system_, QWidget* parent, QStandardItemModel* list, | ||||
|                                std::shared_ptr<Network::AnnounceMultiplayerSession> session) | ||||
|     : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | ||||
|       ui(std::make_unique<Ui::HostRoom>()), announce_multiplayer_session(session) { | ||||
|       ui(std::make_unique<Ui::HostRoom>()), system{system_}, announce_multiplayer_session(session) { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|     // set up validation for all of the fields
 | ||||
|  | @ -196,9 +195,8 @@ void HostRoomWindow::Host() { | |||
|             } | ||||
|         } | ||||
| #endif | ||||
|         member->Join(ui->username->text().toStdString(), | ||||
|                      Service::CFG::GetConsoleIdHash(Core::System::GetInstance()), "127.0.0.1", port, | ||||
|                      0, Network::NoPreferredMac, password, token); | ||||
|         member->Join(ui->username->text().toStdString(), Service::CFG::GetConsoleIdHash(system), | ||||
|                      "127.0.0.1", port, 0, Network::NoPreferredMac, password, token); | ||||
| 
 | ||||
|         // Store settings
 | ||||
|         UISettings::values.room_nickname = ui->username->text(); | ||||
|  |  | |||
|  | @ -9,14 +9,16 @@ | |||
| #include <QSortFilterProxyModel> | ||||
| #include <QStandardItemModel> | ||||
| #include <QVariant> | ||||
| #include "citra_qt/multiplayer/chat_room.h" | ||||
| #include "citra_qt/multiplayer/validation.h" | ||||
| #include "network/network.h" | ||||
| 
 | ||||
| namespace Ui { | ||||
| class HostRoom; | ||||
| } | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| namespace Network { | ||||
| class AnnounceMultiplayerSession; | ||||
| } | ||||
|  | @ -34,7 +36,7 @@ class HostRoomWindow : public QDialog { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit HostRoomWindow(QWidget* parent, QStandardItemModel* list, | ||||
|     explicit HostRoomWindow(Core::System& system, QWidget* parent, QStandardItemModel* list, | ||||
|                             std::shared_ptr<Network::AnnounceMultiplayerSession> session); | ||||
|     ~HostRoomWindow(); | ||||
| 
 | ||||
|  | @ -50,6 +52,7 @@ private: | |||
|     std::unique_ptr<Network::VerifyUser::Backend> CreateVerifyBackend(bool use_validation) const; | ||||
| 
 | ||||
|     std::unique_ptr<Ui::HostRoom> ui; | ||||
|     Core::System& system; | ||||
|     std::weak_ptr<Network::AnnounceMultiplayerSession> announce_multiplayer_session; | ||||
|     QStandardItemModel* game_list; | ||||
|     ComboBoxProxyModel* proxy; | ||||
|  |  | |||
|  | @ -7,11 +7,9 @@ | |||
| #include <QtConcurrent/QtConcurrentRun> | ||||
| #include "citra_qt/game_list_p.h" | ||||
| #include "citra_qt/main.h" | ||||
| #include "citra_qt/multiplayer/client_room.h" | ||||
| #include "citra_qt/multiplayer/lobby.h" | ||||
| #include "citra_qt/multiplayer/lobby_p.h" | ||||
| #include "citra_qt/multiplayer/message.h" | ||||
| #include "citra_qt/multiplayer/state.h" | ||||
| #include "citra_qt/multiplayer/validation.h" | ||||
| #include "citra_qt/uisettings.h" | ||||
| #include "common/logging/log.h" | ||||
|  | @ -23,10 +21,10 @@ | |||
| #include "web_service/web_backend.h" | ||||
| #endif | ||||
| 
 | ||||
| Lobby::Lobby(QWidget* parent, QStandardItemModel* list, | ||||
| Lobby::Lobby(Core::System& system_, QWidget* parent, QStandardItemModel* list, | ||||
|              std::shared_ptr<Network::AnnounceMultiplayerSession> session) | ||||
|     : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | ||||
|       ui(std::make_unique<Ui::Lobby>()), announce_multiplayer_session(session) { | ||||
|       ui(std::make_unique<Ui::Lobby>()), system{system_}, announce_multiplayer_session(session) { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|     // setup the watcher for background connections
 | ||||
|  | @ -152,8 +150,8 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { | |||
|     const std::string verify_UID = | ||||
|         proxy->data(connection_index, LobbyItemHost::HostVerifyUIDRole).toString().toStdString(); | ||||
| 
 | ||||
|     // attempt to connect in a different thread
 | ||||
|     QFuture<void> f = QtConcurrent::run([nickname, ip, port, password, verify_UID] { | ||||
|     // Attempt to connect in a different thread
 | ||||
|     QFuture<void> f = QtConcurrent::run([this, nickname, ip, port, password, verify_UID] { | ||||
|         std::string token; | ||||
| #ifdef ENABLE_WEB_SERVICE | ||||
|         if (!NetSettings::values.citra_username.empty() && | ||||
|  | @ -170,8 +168,8 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { | |||
|         } | ||||
| #endif | ||||
|         if (auto room_member = Network::GetRoomMember().lock()) { | ||||
|             room_member->Join(nickname, Service::CFG::GetConsoleIdHash(Core::System::GetInstance()), | ||||
|                               ip.c_str(), port, 0, Network::NoPreferredMac, password, token); | ||||
|             room_member->Join(nickname, Service::CFG::GetConsoleIdHash(system), ip.c_str(), port, 0, | ||||
|                               Network::NoPreferredMac, password, token); | ||||
|         } | ||||
|     }); | ||||
|     watcher->setFuture(f); | ||||
|  |  | |||
|  | @ -12,12 +12,16 @@ | |||
| #include "citra_qt/multiplayer/validation.h" | ||||
| #include "common/announce_multiplayer_room.h" | ||||
| #include "network/announce_multiplayer_session.h" | ||||
| #include "network/network.h" | ||||
| #include "network/room_member.h" | ||||
| 
 | ||||
| namespace Ui { | ||||
| class Lobby; | ||||
| } | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class LobbyModel; | ||||
| class LobbyFilterProxyModel; | ||||
| 
 | ||||
|  | @ -29,7 +33,7 @@ class Lobby : public QDialog { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit Lobby(QWidget* parent, QStandardItemModel* list, | ||||
|     explicit Lobby(Core::System& system, QWidget* parent, QStandardItemModel* list, | ||||
|                    std::shared_ptr<Network::AnnounceMultiplayerSession> session); | ||||
|     ~Lobby() override; | ||||
| 
 | ||||
|  | @ -84,7 +88,9 @@ private: | |||
|      */ | ||||
|     QString PasswordPrompt(); | ||||
| 
 | ||||
| private: | ||||
|     std::unique_ptr<Ui::Lobby> ui; | ||||
|     Core::System& system; | ||||
| 
 | ||||
|     QStandardItemModel* model{}; | ||||
|     QStandardItemModel* game_list{}; | ||||
|  |  | |||
|  | @ -17,9 +17,10 @@ | |||
| #include "citra_qt/util/clickable_label.h" | ||||
| #include "common/logging/log.h" | ||||
| 
 | ||||
| MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_list_model, | ||||
|                                    QAction* leave_room, QAction* show_room) | ||||
|     : QWidget(parent), game_list_model(game_list_model), leave_room(leave_room), | ||||
| MultiplayerState::MultiplayerState(Core::System& system_, QWidget* parent, | ||||
|                                    QStandardItemModel* game_list_model, QAction* leave_room, | ||||
|                                    QAction* show_room) | ||||
|     : QWidget(parent), system{system_}, game_list_model(game_list_model), leave_room(leave_room), | ||||
|       show_room(show_room) { | ||||
|     if (auto member = Network::GetRoomMember().lock()) { | ||||
|         // register the network structs to use in slots and signals
 | ||||
|  | @ -203,14 +204,14 @@ static void BringWidgetToFront(QWidget* widget) { | |||
| 
 | ||||
| void MultiplayerState::OnViewLobby() { | ||||
|     if (lobby == nullptr) { | ||||
|         lobby = new Lobby(this, game_list_model, announce_multiplayer_session); | ||||
|         lobby = new Lobby(system, this, game_list_model, announce_multiplayer_session); | ||||
|     } | ||||
|     BringWidgetToFront(lobby); | ||||
| } | ||||
| 
 | ||||
| void MultiplayerState::OnCreateRoom() { | ||||
|     if (host_room == nullptr) { | ||||
|         host_room = new HostRoomWindow(this, game_list_model, announce_multiplayer_session); | ||||
|         host_room = new HostRoomWindow(system, this, game_list_model, announce_multiplayer_session); | ||||
|     } | ||||
|     BringWidgetToFront(host_room); | ||||
| } | ||||
|  | @ -274,7 +275,7 @@ void MultiplayerState::OnOpenNetworkRoom() { | |||
| 
 | ||||
| void MultiplayerState::OnDirectConnectToRoom() { | ||||
|     if (direct_connect == nullptr) { | ||||
|         direct_connect = new DirectConnectWindow(this); | ||||
|         direct_connect = new DirectConnectWindow(system, this); | ||||
|     } | ||||
|     BringWidgetToFront(direct_connect); | ||||
| } | ||||
|  |  | |||
|  | @ -15,12 +15,16 @@ class ClientRoomWindow; | |||
| class DirectConnectWindow; | ||||
| class ClickableLabel; | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class MultiplayerState : public QWidget { | ||||
|     Q_OBJECT; | ||||
| 
 | ||||
| public: | ||||
|     explicit MultiplayerState(QWidget* parent, QStandardItemModel* game_list, QAction* leave_room, | ||||
|                               QAction* show_room); | ||||
|     explicit MultiplayerState(Core::System& system, QWidget* parent, QStandardItemModel* game_list, | ||||
|                               QAction* leave_room, QAction* show_room); | ||||
|     ~MultiplayerState(); | ||||
| 
 | ||||
|     /**
 | ||||
|  | @ -71,6 +75,7 @@ signals: | |||
|     void AnnounceFailed(const Common::WebResult&); | ||||
| 
 | ||||
| private: | ||||
|     Core::System& system; | ||||
|     Lobby* lobby = nullptr; | ||||
|     HostRoomWindow* host_room = nullptr; | ||||
|     ClientRoomWindow* client_room = nullptr; | ||||
|  |  | |||
|  | @ -130,11 +130,9 @@ bool UpdaterPrivate::StartUpdateCheck() { | |||
|     main_process->setProgram(tool_info.absoluteFilePath()); | ||||
|     main_process->setArguments({QStringLiteral("--checkupdates"), QStringLiteral("-v")}); | ||||
| 
 | ||||
|     connect(main_process, | ||||
|             static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, | ||||
|     connect(main_process, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this, | ||||
|             &UpdaterPrivate::UpdaterReady, Qt::QueuedConnection); | ||||
|     connect(main_process, | ||||
|             static_cast<void (QProcess::*)(QProcess::ProcessError)>(&QProcess::errorOccurred), this, | ||||
|     connect(main_process, qOverload<QProcess::ProcessError>(&QProcess::errorOccurred), this, | ||||
|             &UpdaterPrivate::UpdaterError, Qt::QueuedConnection); | ||||
| 
 | ||||
|     main_process->start(QIODevice::ReadOnly); | ||||
|  | @ -156,7 +154,7 @@ void UpdaterPrivate::StopUpdateCheck(int delay, bool async) { | |||
|             QTimer* timer = new QTimer(this); | ||||
|             timer->setSingleShot(true); | ||||
| 
 | ||||
|             connect(timer, &QTimer::timeout, [this, timer]() { | ||||
|             connect(timer, &QTimer::timeout, this, [this, timer]() { | ||||
|                 StopUpdateCheck(0, false); | ||||
|                 timer->deleteLater(); | ||||
|             }); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue