From b11c81cc1337b55f42a1653771517add1fb47d0c Mon Sep 17 00:00:00 2001
From: lat9nq <22451773+lat9nq@users.noreply.github.com>
Date: Fri, 23 Jul 2021 10:11:42 -0400
Subject: [PATCH 1/2] general: Implement FullscreenMode enumeration

Prevents us from using an unclear 0 or 1 to describe the fullscreen
mode.
---
 src/common/settings.h                           | 11 ++++++++---
 src/yuzu/configuration/config.cpp               |  5 ++++-
 src/yuzu/configuration/config.h                 |  1 +
 src/yuzu/configuration/configuration_shared.cpp | 14 --------------
 src/yuzu/configuration/configuration_shared.h   | 15 ++++++++++++++-
 src/yuzu/configuration/configure_graphics.cpp   |  8 +++++---
 src/yuzu/main.cpp                               |  8 ++++----
 src/yuzu_cmd/emu_window/emu_window_sdl2.cpp     |  4 ++--
 8 files changed, 38 insertions(+), 28 deletions(-)

diff --git a/src/common/settings.h b/src/common/settings.h
index ce1bc647d..fd2a263ec 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -36,6 +36,11 @@ enum class CPUAccuracy : u32 {
     Unsafe = 2,
 };
 
+enum class FullscreenMode : u32 {
+    Borderless = 0,
+    Exclusive = 1,
+};
+
 /** The BasicSetting class is a simple resource manager. It defines a label and default value
  * alongside the actual value of the setting for simpler and less-error prone use with frontend
  * configurations. Setting a default value and label is required, though subclasses may deviate from
@@ -313,11 +318,11 @@ struct Values {
     Setting<u16> resolution_factor{1, "resolution_factor"};
     // *nix platforms may have issues with the borderless windowed fullscreen mode.
     // Default to exclusive fullscreen on these platforms for now.
-    Setting<int> fullscreen_mode{
+    Setting<FullscreenMode> fullscreen_mode{
 #ifdef _WIN32
-        0,
+        FullscreenMode::Borderless,
 #else
-        1,
+        FullscreenMode::Exclusive,
 #endif
         "fullscreen_mode"};
     Setting<int> aspect_ratio{0, "aspect_ratio"};
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index a5e032959..9fe5613b6 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -1329,7 +1329,10 @@ void Config::SaveRendererValues() {
                  static_cast<u32>(Settings::values.renderer_backend.GetDefault()),
                  Settings::values.renderer_backend.UsingGlobal());
     WriteGlobalSetting(Settings::values.vulkan_device);
-    WriteGlobalSetting(Settings::values.fullscreen_mode);
+    WriteSetting(QString::fromStdString(Settings::values.fullscreen_mode.GetLabel()),
+                 static_cast<u32>(Settings::values.fullscreen_mode.GetValue(global)),
+                 static_cast<u32>(Settings::values.fullscreen_mode.GetDefault()),
+                 Settings::values.fullscreen_mode.UsingGlobal());
     WriteGlobalSetting(Settings::values.aspect_ratio);
     WriteGlobalSetting(Settings::values.max_anisotropy);
     WriteGlobalSetting(Settings::values.use_frame_limit);
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index 96f9b6de1..24950e8f8 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -182,3 +182,4 @@ private:
 Q_DECLARE_METATYPE(Settings::CPUAccuracy);
 Q_DECLARE_METATYPE(Settings::RendererBackend);
 Q_DECLARE_METATYPE(Settings::GPUAccuracy);
+Q_DECLARE_METATYPE(Settings::FullscreenMode);
diff --git a/src/yuzu/configuration/configuration_shared.cpp b/src/yuzu/configuration/configuration_shared.cpp
index 096e42e94..251aab912 100644
--- a/src/yuzu/configuration/configuration_shared.cpp
+++ b/src/yuzu/configuration/configuration_shared.cpp
@@ -25,20 +25,6 @@ void ConfigurationShared::ApplyPerGameSetting(Settings::Setting<bool>* setting,
     }
 }
 
-void ConfigurationShared::ApplyPerGameSetting(Settings::Setting<int>* setting,
-                                              const QComboBox* combobox) {
-    if (Settings::IsConfiguringGlobal() && setting->UsingGlobal()) {
-        setting->SetValue(combobox->currentIndex());
-    } else if (!Settings::IsConfiguringGlobal()) {
-        if (combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
-            setting->SetGlobal(true);
-        } else {
-            setting->SetGlobal(false);
-            setting->SetValue(combobox->currentIndex() - ConfigurationShared::USE_GLOBAL_OFFSET);
-        }
-    }
-}
-
 void ConfigurationShared::SetPerGameSetting(QCheckBox* checkbox,
                                             const Settings::Setting<bool>* setting) {
     if (setting->UsingGlobal()) {
diff --git a/src/yuzu/configuration/configuration_shared.h b/src/yuzu/configuration/configuration_shared.h
index 1e0ef01ca..5423dbc92 100644
--- a/src/yuzu/configuration/configuration_shared.h
+++ b/src/yuzu/configuration/configuration_shared.h
@@ -28,7 +28,20 @@ enum class CheckState {
 // ApplyPerGameSetting, given a Settings::Setting and a Qt UI element, properly applies a Setting
 void ApplyPerGameSetting(Settings::Setting<bool>* setting, const QCheckBox* checkbox,
                          const CheckState& tracker);
-void ApplyPerGameSetting(Settings::Setting<int>* setting, const QComboBox* combobox);
+template <typename Type>
+void ApplyPerGameSetting(Settings::Setting<Type>* setting, const QComboBox* combobox) {
+    if (Settings::IsConfiguringGlobal() && setting->UsingGlobal()) {
+        setting->SetValue(static_cast<Type>(combobox->currentIndex()));
+    } else if (!Settings::IsConfiguringGlobal()) {
+        if (combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
+            setting->SetGlobal(true);
+        } else {
+            setting->SetGlobal(false);
+            setting->SetValue(static_cast<Type>(combobox->currentIndex() -
+                                                ConfigurationShared::USE_GLOBAL_OFFSET));
+        }
+    }
+}
 
 // Sets a Qt UI element given a Settings::Setting
 void SetPerGameSetting(QCheckBox* checkbox, const Settings::Setting<bool>* setting);
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index 4d5b4c0e6..6287a3caa 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -79,7 +79,8 @@ void ConfigureGraphics::SetConfiguration() {
 
     if (Settings::IsConfiguringGlobal()) {
         ui->api->setCurrentIndex(static_cast<int>(Settings::values.renderer_backend.GetValue()));
-        ui->fullscreen_mode_combobox->setCurrentIndex(Settings::values.fullscreen_mode.GetValue());
+        ui->fullscreen_mode_combobox->setCurrentIndex(
+            static_cast<int>(Settings::values.fullscreen_mode.GetValue()));
         ui->aspect_ratio_combobox->setCurrentIndex(Settings::values.aspect_ratio.GetValue());
     } else {
         ConfigurationShared::SetPerGameSetting(ui->api, &Settings::values.renderer_backend);
@@ -282,8 +283,9 @@ void ConfigureGraphics::SetupPerGameUI() {
 
     ConfigurationShared::SetColoredComboBox(ui->aspect_ratio_combobox, ui->ar_label,
                                             Settings::values.aspect_ratio.GetValue(true));
-    ConfigurationShared::SetColoredComboBox(ui->fullscreen_mode_combobox, ui->fullscreen_mode_label,
-                                            Settings::values.fullscreen_mode.GetValue(true));
+    ConfigurationShared::SetColoredComboBox(
+        ui->fullscreen_mode_combobox, ui->fullscreen_mode_label,
+        static_cast<int>(Settings::values.fullscreen_mode.GetValue(true)));
     ConfigurationShared::InsertGlobalItem(
         ui->api, static_cast<int>(Settings::values.renderer_backend.GetValue(true)));
 }
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 03a909d17..96a301dda 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -2515,7 +2515,7 @@ void GMainWindow::ShowFullscreen() {
         ui.menubar->hide();
         statusBar()->hide();
 
-        if (Settings::values.fullscreen_mode.GetValue() == 1) {
+        if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Exclusive) {
             showFullScreen();
             return;
         }
@@ -2530,7 +2530,7 @@ void GMainWindow::ShowFullscreen() {
     } else {
         UISettings::values.renderwindow_geometry = render_window->saveGeometry();
 
-        if (Settings::values.fullscreen_mode.GetValue() == 1) {
+        if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Exclusive) {
             render_window->showFullScreen();
             return;
         }
@@ -2547,7 +2547,7 @@ void GMainWindow::ShowFullscreen() {
 
 void GMainWindow::HideFullscreen() {
     if (ui.action_Single_Window_Mode->isChecked()) {
-        if (Settings::values.fullscreen_mode.GetValue() == 1) {
+        if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Exclusive) {
             showNormal();
             restoreGeometry(UISettings::values.geometry);
         } else {
@@ -2561,7 +2561,7 @@ void GMainWindow::HideFullscreen() {
         statusBar()->setVisible(ui.action_Show_Status_Bar->isChecked());
         ui.menubar->show();
     } else {
-        if (Settings::values.fullscreen_mode.GetValue() == 1) {
+        if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Exclusive) {
             render_window->showNormal();
             render_window->restoreGeometry(UISettings::values.renderwindow_geometry);
         } else {
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
index 353e51ea7..ea3e0ada4 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
@@ -124,7 +124,7 @@ void EmuWindow_SDL2::OnResize() {
 
 void EmuWindow_SDL2::Fullscreen() {
     switch (Settings::values.fullscreen_mode.GetValue()) {
-    case 1: // Exclusive fullscreen
+    case Settings::FullscreenMode::Exclusive:
         // Set window size to render size before entering fullscreen -- SDL does not resize to
         // display dimensions in this mode.
         // TODO: Multiply the window size by resolution_factor (for both docked modes)
@@ -140,7 +140,7 @@ void EmuWindow_SDL2::Fullscreen() {
         LOG_ERROR(Frontend, "Fullscreening failed: {}", SDL_GetError());
         LOG_INFO(Frontend, "Attempting to use borderless fullscreen...");
         [[fallthrough]];
-    case 0: // Borderless window
+    case Settings::FullscreenMode::Borderless:
         if (SDL_SetWindowFullscreen(render_window, SDL_WINDOW_FULLSCREEN_DESKTOP) == 0) {
             return;
         }

From d8b00fd863c8aa9fca02a479ce958899f1aadf24 Mon Sep 17 00:00:00 2001
From: lat9nq <22451773+lat9nq@users.noreply.github.com>
Date: Fri, 23 Jul 2021 10:18:07 -0400
Subject: [PATCH 2/2] configuration: Use combobox apply template where possible

We don't need to manually apply this setting now that a template can do
this for us.
---
 src/yuzu/configuration/configure_cpu.cpp      | 17 +---------------
 .../configure_graphics_advanced.cpp           | 20 +------------------
 2 files changed, 2 insertions(+), 35 deletions(-)

diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp
index 8d7171487..784b6484e 100644
--- a/src/yuzu/configuration/configure_cpu.cpp
+++ b/src/yuzu/configuration/configure_cpu.cpp
@@ -65,6 +65,7 @@ void ConfigureCpu::UpdateGroup(int index) {
 }
 
 void ConfigureCpu::ApplyConfiguration() {
+    ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpu_accuracy, ui->accuracy);
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_unfuse_fma,
                                              ui->cpuopt_unsafe_unfuse_fma,
                                              cpuopt_unsafe_unfuse_fma);
@@ -80,22 +81,6 @@ void ConfigureCpu::ApplyConfiguration() {
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_fastmem_check,
                                              ui->cpuopt_unsafe_fastmem_check,
                                              cpuopt_unsafe_fastmem_check);
-
-    if (Settings::IsConfiguringGlobal()) {
-        // Guard if during game and set to game-specific value
-        if (Settings::values.cpu_accuracy.UsingGlobal()) {
-            Settings::values.cpu_accuracy.SetValue(
-                static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()));
-        }
-    } else {
-        if (ui->accuracy->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
-            Settings::values.cpu_accuracy.SetGlobal(true);
-        } else {
-            Settings::values.cpu_accuracy.SetGlobal(false);
-            Settings::values.cpu_accuracy.SetValue(static_cast<Settings::CPUAccuracy>(
-                ui->accuracy->currentIndex() - ConfigurationShared::USE_GLOBAL_OFFSET));
-        }
-    }
 }
 
 void ConfigureCpu::changeEvent(QEvent* event) {
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp
index a9e611125..e952777ab 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.cpp
+++ b/src/yuzu/configuration/configure_graphics_advanced.cpp
@@ -50,11 +50,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
 }
 
 void ConfigureGraphicsAdvanced::ApplyConfiguration() {
-    // Subtract 2 if configuring per-game (separator and "use global configuration" take 2 slots)
-    const auto gpu_accuracy = static_cast<Settings::GPUAccuracy>(
-        ui->gpu_accuracy->currentIndex() -
-        ((Settings::IsConfiguringGlobal()) ? 0 : ConfigurationShared::USE_GLOBAL_OFFSET));
-
+    ConfigurationShared::ApplyPerGameSetting(&Settings::values.gpu_accuracy, ui->gpu_accuracy);
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy,
                                              ui->anisotropic_filtering_combobox);
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync, use_vsync);
@@ -67,20 +63,6 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {
                                              use_caches_gc);
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_fast_gpu_time,
                                              ui->use_fast_gpu_time, use_fast_gpu_time);
-
-    if (Settings::IsConfiguringGlobal()) {
-        // Must guard in case of a during-game configuration when set to be game-specific.
-        if (Settings::values.gpu_accuracy.UsingGlobal()) {
-            Settings::values.gpu_accuracy.SetValue(gpu_accuracy);
-        }
-    } else {
-        if (ui->gpu_accuracy->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
-            Settings::values.gpu_accuracy.SetGlobal(true);
-        } else {
-            Settings::values.gpu_accuracy.SetGlobal(false);
-            Settings::values.gpu_accuracy.SetValue(gpu_accuracy);
-        }
-    }
 }
 
 void ConfigureGraphicsAdvanced::changeEvent(QEvent* event) {