From 667089891a200d51f56ef17a069ab52197571c4e Mon Sep 17 00:00:00 2001
From: "ALIENJACK\\alien" <alienjack@foxmail.com>
Date: Mon, 17 Mar 2025 20:32:34 +0800
Subject: [PATCH] =?UTF-8?q?KeyMapper=E6=A0=B9=E6=8D=AE=E6=AF=8F=E7=A7=8D?=
 =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=8D=95=E7=8B=AC=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../KeyMapperSetting/KeyMapperSetting.cs      | 62 +++++++++++--------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
index 10252195..87e02443 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
@@ -5,6 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
+using static AxibugEmuOnline.Client.Settings.EmuCoreControllerKeyBinding<T>;
 
 namespace AxibugEmuOnline.Client.Settings
 {
@@ -231,10 +232,12 @@ namespace AxibugEmuOnline.Client.Settings
             else return totalFloat / totalControl;
         }
 
+        public class MapSetting : Dictionary<T, List<InputDevice.InputControl>> { }
+
         public class BindingPage
         {
-            Dictionary<T, List<InputDevice.InputControl>> m_mapSetting = new Dictionary<T, List<InputDevice.InputControl>>();
             Dictionary<Type, InputDevice> m_registedDevices = new Dictionary<Type, InputDevice>();
+            Dictionary<InputDevice, MapSetting> m_mapSetting = new Dictionary<InputDevice, MapSetting>();
 
             public int ControllerIndex { get; }
             public EmuCoreControllerKeyBinding<T> Host { get; }
@@ -243,9 +246,6 @@ namespace AxibugEmuOnline.Client.Settings
             {
                 ControllerIndex = controllerIndex;
                 Host = host;
-
-                foreach (var emuBtn in host.DefineKeys())
-                    m_mapSetting[emuBtn] = new List<InputDevice.InputControl>();
             }
 
             internal bool IsRegisted<DEVICE>() where DEVICE : InputDevice
@@ -264,6 +264,7 @@ namespace AxibugEmuOnline.Client.Settings
                 if (IsRegisted(type)) return;
 
                 m_registedDevices.Add(type, device);
+                m_mapSetting[device] = new MapSetting();
                 Host.RaiseDeviceRegist(device, this);
             }
 
@@ -273,19 +274,7 @@ namespace AxibugEmuOnline.Client.Settings
                 if (!IsRegisted(type)) return;
 
                 m_registedDevices.Remove(type);
-
-                foreach (var list in m_mapSetting.Values)
-                {
-                    for (int i = 0; i < list.Count; i++)
-                    {
-                        var inputControl = list[i];
-                        if (inputControl.Device == device)
-                        {
-                            list.RemoveAt(i);
-                            i--;
-                        }
-                    }
-                }
+                m_mapSetting.Remove(device);
             }
 
             public void SetBinding(T emuBtn, InputDevice.InputControl key, int settingSlot)
@@ -295,7 +284,12 @@ namespace AxibugEmuOnline.Client.Settings
 
                 Debug.Assert(inputDevice == device);
 
-                var settingList = m_mapSetting[emuBtn];
+                var setting = m_mapSetting[inputDevice];
+                if (!setting.TryGetValue(emuBtn, out var settingList))
+                {
+                    settingList = new List<InputDevice.InputControl>();
+                    setting[emuBtn] = settingList;
+                }
 
                 int needFixCount = settingSlot - settingList.Count + 1;
                 if (needFixCount > 0) for (int i = 0; i < needFixCount; i++) settingList.Add(null);
@@ -303,25 +297,41 @@ namespace AxibugEmuOnline.Client.Settings
                 settingList[settingSlot] = key;
             }
 
-            public InputDevice.InputControl GetBinding(T emuBtn, int settingSlot)
+            public InputDevice.InputControl GetBinding(T emuBtn, InputDevice device, int settingSlot)
             {
-                var settingList = m_mapSetting[emuBtn];
-                if (settingSlot >= settingList.Count) return null;
+                m_mapSetting.TryGetValue(device, out var mapSetting);
+                if (mapSetting == null) return null;
+
+                mapSetting.TryGetValue(emuBtn, out var settingList);
+                if (settingList == null || settingSlot >= settingList.Count) return null;
+
                 return settingList[settingSlot];
             }
 
-            public List<InputDevice.InputControl> GetBinding(T emuBtn)
+            public IEnumerable<InputDevice.InputControl> GetBinding(T emuBtn)
             {
-                return m_mapSetting[emuBtn];
+                foreach (var mapSettings in m_mapSetting.Values)
+                {
+                    mapSettings.TryGetValue(emuBtn, out var bindControls);
+                    if (bindControls != null)
+                    {
+                        return bindControls;
+                    }
+                }
+
+                return null;
             }
 
             public bool AnyKeyDown()
             {
-                foreach (var item in m_mapSetting)
+                foreach (var mapSettings in m_mapSetting.Values)
                 {
-                    foreach (var key in item.Value)
+                    foreach (var keys in mapSettings.Values)
                     {
-                        if (key.Start) return true;
+                        foreach (var key in keys)
+                        {
+                            if (key.Start) return true;
+                        }
                     }
                 }