From 7f445a59fa7362615338bd93e5f57d84a594e181 Mon Sep 17 00:00:00 2001
From: german77 <juangerman-13@hotmail.com>
Date: Sun, 23 May 2021 20:34:46 -0500
Subject: [PATCH] settings: Forbid docked mode on handheld

---
 src/yuzu/configuration/config.cpp |  7 +++++++
 src/yuzu/debugger/controller.cpp  |  1 +
 src/yuzu/main.cpp                 | 20 ++++++++++++++++----
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 125feb86b..21d1dc174 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -514,6 +514,13 @@ void Config::ReadControlValues() {
         ReadSetting(QStringLiteral("mouse_panning_sensitivity"), 1).toFloat();
 
     ReadSettingGlobal(Settings::values.use_docked_mode, QStringLiteral("use_docked_mode"), true);
+
+    // Disable docked mode if handheld is selected
+    const auto controller_type = Settings::values.players.GetValue()[0].controller_type;
+    if (controller_type == Settings::ControllerType::Handheld) {
+        Settings::values.use_docked_mode.SetValue(false);
+    }
+
     ReadSettingGlobal(Settings::values.vibration_enabled, QStringLiteral("vibration_enabled"),
                       true);
     ReadSettingGlobal(Settings::values.enable_accurate_vibrations,
diff --git a/src/yuzu/debugger/controller.cpp b/src/yuzu/debugger/controller.cpp
index 7186eac76..d85408ac6 100644
--- a/src/yuzu/debugger/controller.cpp
+++ b/src/yuzu/debugger/controller.cpp
@@ -38,6 +38,7 @@ void ControllerDialog::refreshConfiguration() {
     widget->SetPlayerInputRaw(player, players[player].buttons, players[player].analogs);
     widget->SetConnectedStatus(players[player].connected);
     widget->SetControllerType(players[player].controller_type);
+    widget->repaint();
 }
 
 QAction* ControllerDialog::toggleViewAction() {
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 9275cba53..bc97f9d53 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -773,10 +773,22 @@ void GMainWindow::InitializeWidgets() {
     dock_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
     dock_status_button->setFocusPolicy(Qt::NoFocus);
     connect(dock_status_button, &QPushButton::clicked, [&] {
-        Settings::values.use_docked_mode.SetValue(!Settings::values.use_docked_mode.GetValue());
-        dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());
-        OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(),
-                            Settings::values.use_docked_mode.GetValue());
+        const bool is_docked = Settings::values.use_docked_mode.GetValue();
+        auto& controller_type = Settings::values.players.GetValue()[0].controller_type;
+
+        if (!is_docked && controller_type == Settings::ControllerType::Handheld) {
+            QMessageBox::warning(this, tr("Invalid config detected"),
+                                 tr("Handheld controller can't be used on docked mode. Pro "
+                                    "controller will be selected."));
+            controller_type = Settings::ControllerType::ProController;
+            ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get());
+            configure_dialog.ApplyConfiguration();
+            controller_dialog->refreshConfiguration();
+        }
+
+        Settings::values.use_docked_mode.SetValue(!is_docked);
+        dock_status_button->setChecked(!is_docked);
+        OnDockedModeChanged(is_docked, !is_docked);
     });
     dock_status_button->setText(tr("DOCK"));
     dock_status_button->setCheckable(true);