Bladeren bron

Remember GUI column sort and separate hotkey settings from emulated input settings (#1223)

* Separate hotkey settings from emulated input settings

* Remember gui column sort

* nit

* fix schema

* nit

* Remove unused SaveDataPath to speed up game list loading

* Reset the vertical scrollbar to the top when titles finish loading
Xpl0itR 5 jaren geleden
bovenliggende
commit
68a6960617

+ 11 - 1
Ryujinx.Common/Configuration/ConfigurationFileFormat.cs

@@ -13,7 +13,7 @@ namespace Ryujinx.Configuration
         /// <summary>
         /// The current version of the file format
         /// </summary>
-        public const int CurrentVersion = 8;
+        public const int CurrentVersion = 9;
 
         public int Version { get; set; }
 
@@ -137,6 +137,11 @@ namespace Ryujinx.Configuration
         /// </summary>
         public GuiColumns GuiColumns { get; set; }
 
+        /// <summary>
+        /// Used to configure column sort settings in the GUI
+        /// </summary>
+        public ColumnSort ColumnSort { get; set; }
+
         /// <summary>
         /// A list of directories containing games to be used to load games into the games list
         /// </summary>
@@ -157,6 +162,11 @@ namespace Ryujinx.Configuration
         /// </summary>
         public bool EnableKeyboard { get; set; }
 
+        /// <summary>
+        /// Hotkey Keyboard Bindings
+        /// </summary>
+        public KeyboardHotkeys Hotkeys { get; set; }
+
         /// <summary>
         /// Keyboard control bindings
         /// </summary>

+ 59 - 9
Ryujinx.Common/Configuration/ConfigurationState.cs

@@ -44,11 +44,28 @@ namespace Ryujinx.Configuration
                 }
             }
 
+            public class ColumnSortSettings
+            {
+                public ReactiveObject<int>  SortColumnId  { get; private set; }
+                public ReactiveObject<bool> SortAscending { get; private set; }
+
+                public ColumnSortSettings()
+                {
+                    SortColumnId  = new ReactiveObject<int>();
+                    SortAscending = new ReactiveObject<bool>();
+                }
+            }
+
             /// <summary>
             /// Used to toggle columns in the GUI
             /// </summary>
             public Columns GuiColumns { get; private set; }
 
+            /// <summary>
+            /// Used to configure column sort settings in the GUI
+            /// </summary>
+            public ColumnSortSettings ColumnSort { get; private set; }
+
             /// <summary>
             /// A list of directories containing games to be used to load games into the games list
             /// </summary>
@@ -67,6 +84,7 @@ namespace Ryujinx.Configuration
             public UiSection()
             {
                 GuiColumns        = new Columns();
+                ColumnSort        = new ColumnSortSettings();
                 GameDirs          = new ReactiveObject<List<string>>();
                 EnableCustomTheme = new ReactiveObject<bool>();
                 CustomThemePath   = new ReactiveObject<string>();
@@ -217,6 +235,11 @@ namespace Ryujinx.Configuration
             /// </summary>
             public ReactiveObject<bool> EnableKeyboard { get; private set; }
 
+            /// <summary>
+            /// Hotkey Keyboard Bindings
+            /// </summary>
+            public ReactiveObject<KeyboardHotkeys> Hotkeys { get; private set; }
+
             /// <summary>
             /// Input device configuration.
             /// NOTE: This ReactiveObject won't issue an event when the List has elements added or removed.
@@ -227,6 +250,7 @@ namespace Ryujinx.Configuration
             public HidSection()
             {
                 EnableKeyboard = new ReactiveObject<bool>();
+                Hotkeys        = new ReactiveObject<KeyboardHotkeys>();
                 InputConfig    = new ReactiveObject<List<InputConfig>>();
             }
         }
@@ -347,7 +371,7 @@ namespace Ryujinx.Configuration
                 EnableFsIntegrityChecks   = System.EnableFsIntegrityChecks,
                 FsGlobalAccessLogMode     = System.FsGlobalAccessLogMode,
                 IgnoreMissingServices     = System.IgnoreMissingServices,
-                GuiColumns                = new GuiColumns()
+                GuiColumns                = new GuiColumns
                 {
                     FavColumn        = Ui.GuiColumns.FavColumn,
                     IconColumn       = Ui.GuiColumns.IconColumn,
@@ -360,10 +384,16 @@ namespace Ryujinx.Configuration
                     FileSizeColumn   = Ui.GuiColumns.FileSizeColumn,
                     PathColumn       = Ui.GuiColumns.PathColumn,
                 },
+                ColumnSort                = new ColumnSort
+                {
+                    SortColumnId  = Ui.ColumnSort.SortColumnId,
+                    SortAscending = Ui.ColumnSort.SortAscending
+                },
                 GameDirs                  = Ui.GameDirs,
                 EnableCustomTheme         = Ui.EnableCustomTheme,
                 CustomThemePath           = Ui.CustomThemePath,
                 EnableKeyboard            = Hid.EnableKeyboard,
+                Hotkeys                   = Hid.Hotkeys,
                 KeyboardConfig            = keyboardConfigList,
                 ControllerConfig          = controllerConfigList
             };
@@ -406,10 +436,17 @@ namespace Ryujinx.Configuration
             Ui.GuiColumns.FileExtColumn.Value      = true;
             Ui.GuiColumns.FileSizeColumn.Value     = true;
             Ui.GuiColumns.PathColumn.Value         = true;
+            Ui.ColumnSort.SortColumnId.Value       = 0;
+            Ui.ColumnSort.SortAscending.Value      = false;
             Ui.GameDirs.Value                      = new List<string>();
             Ui.EnableCustomTheme.Value             = false;
             Ui.CustomThemePath.Value               = "";
             Hid.EnableKeyboard.Value               = false;
+            
+            Hid.Hotkeys.Value = new KeyboardHotkeys
+            {
+                ToggleVsync = Key.Tab
+            };
 
             Hid.InputConfig.Value = new List<InputConfig>
             {
@@ -451,10 +488,6 @@ namespace Ryujinx.Configuration
                         ButtonZr    = Key.O,
                         ButtonSl    = Key.PageUp,
                         ButtonSr    = Key.PageDown
-                    },
-                    Hotkeys        = new KeyboardHotkeys
-                    {
-                        ToggleVsync = Key.Tab
                     }
                 }
             };
@@ -553,10 +586,6 @@ namespace Ryujinx.Configuration
                             ButtonZr    = Key.O,
                             ButtonSl    = Key.Unbound,
                             ButtonSr    = Key.Unbound
-                        },
-                        Hotkeys        = new KeyboardHotkeys
-                        {
-                            ToggleVsync = Key.Tab
                         }
                     }
                 };
@@ -587,6 +616,24 @@ namespace Ryujinx.Configuration
                 configurationFileUpdated = true;
             }
 
+            if (configurationFileFormat.Version < 9)
+            {
+                Common.Logging.Logger.PrintWarning(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 9.");
+
+                configurationFileFormat.ColumnSort = new ColumnSort
+                {
+                    SortColumnId  = 0,
+                    SortAscending = false
+                };
+
+                configurationFileFormat.Hotkeys = new KeyboardHotkeys
+                {
+                    ToggleVsync = Key.Tab
+                };
+
+                configurationFileUpdated = true;
+            }
+
             List<InputConfig> inputConfig = new List<InputConfig>();
             foreach (ControllerConfig controllerConfig in configurationFileFormat.ControllerConfig)
             {
@@ -631,10 +678,13 @@ namespace Ryujinx.Configuration
             Ui.GuiColumns.FileExtColumn.Value      = configurationFileFormat.GuiColumns.FileExtColumn;
             Ui.GuiColumns.FileSizeColumn.Value     = configurationFileFormat.GuiColumns.FileSizeColumn;
             Ui.GuiColumns.PathColumn.Value         = configurationFileFormat.GuiColumns.PathColumn;
+            Ui.ColumnSort.SortColumnId.Value       = configurationFileFormat.ColumnSort.SortColumnId;
+            Ui.ColumnSort.SortAscending.Value      = configurationFileFormat.ColumnSort.SortAscending;
             Ui.GameDirs.Value                      = configurationFileFormat.GameDirs;
             Ui.EnableCustomTheme.Value             = configurationFileFormat.EnableCustomTheme;
             Ui.CustomThemePath.Value               = configurationFileFormat.CustomThemePath;
             Hid.EnableKeyboard.Value               = configurationFileFormat.EnableKeyboard;
+            Hid.Hotkeys.Value                      = configurationFileFormat.Hotkeys;
             Hid.InputConfig.Value                  = inputConfig;
 
             if (configurationFileUpdated)

+ 0 - 5
Ryujinx.Common/Configuration/Hid/KeyboardConfig.cs

@@ -14,10 +14,5 @@ namespace Ryujinx.Common.Configuration.Hid
         /// Right JoyCon Keyboard Bindings
         /// </summary>
         public NpadKeyboardRight RightJoycon { get; set; }
-
-        /// <summary>
-        /// Hotkey Keyboard Bindings
-        /// </summary>
-        public KeyboardHotkeys Hotkeys { get; set; }
     }
 }

+ 8 - 0
Ryujinx.Common/Configuration/Ui/ColumnSort.cs

@@ -0,0 +1,8 @@
+namespace Ryujinx.Configuration.Ui
+{
+    public struct ColumnSort
+    {
+        public int  SortColumnId  { get; set; }
+        public bool SortAscending { get; set; }
+    }
+}

+ 8 - 4
Ryujinx/Config.json

@@ -1,5 +1,5 @@
 {
-  "version": 8,
+  "version": 9,
   "max_anisotropy": -1,
   "graphics_shaders_dump_path": "",
   "logging_enable_debug": false,
@@ -35,10 +35,17 @@
     "file_size_column": true,
     "path_column": true
   },
+  "column_sort": {
+    "sort_column_id": 0,
+    "sort_ascending": false
+  },
   "game_dirs": [],
   "enable_custom_theme": false,
   "custom_theme_path": "",
   "enable_keyboard": false,
+  "hotkeys": {
+    "toggle_vsync": "Tab"
+  },
   "keyboard_config": [
     {
       "index": 0,
@@ -75,9 +82,6 @@
         "button_zr": "O",
         "button_sl": "Unbound",
         "button_sr": "Unbound"
-      },
-      "hotkeys": {
-        "toggle_vsync": "Tab"
       }
     }
   ],

+ 0 - 1
Ryujinx/Ui/ApplicationData.cs

@@ -17,7 +17,6 @@ namespace Ryujinx.Ui
         public string FileExtension { get; set; }
         public string FileSize      { get; set; }
         public string Path          { get; set; }
-        public string SaveDataPath  { get; set; }
         public BlitStruct<ApplicationControlProperty> ControlHolder { get; set; }
     }
 }

+ 0 - 16
Ryujinx/Ui/ApplicationLibrary.cs

@@ -131,7 +131,6 @@ namespace Ryujinx.Ui
                 string titleId         = "0000000000000000";
                 string developer       = "Unknown";
                 string version         = "0";
-                string saveDataPath    = null;
                 byte[] applicationIcon = null;
                 BlitStruct<ApplicationControlProperty> controlHolder = new BlitStruct<ApplicationControlProperty>(1);
 
@@ -389,20 +388,6 @@ namespace Ryujinx.Ui
 
                 ApplicationMetadata appMetadata = LoadAndSaveMetaData(titleId);
 
-                if (ulong.TryParse(titleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNum))
-                {
-                    SaveDataFilter filter = new SaveDataFilter();
-                    filter.SetUserId(new UserId(1, 0));
-                    filter.SetProgramId(new TitleId(titleIdNum));
-
-                    Result result = virtualFileSystem.FsClient.FindSaveDataWithFilter(out SaveDataInfo saveDataInfo, SaveDataSpaceId.User, ref filter);
-
-                    if (result.IsSuccess())
-                    {
-                        saveDataPath = Path.Combine(virtualFileSystem.GetNandPath(), "user", "save", saveDataInfo.SaveDataId.ToString("x16"));
-                    }
-                }
-
                 ApplicationData data = new ApplicationData
                 {
                     Favorite      = appMetadata.Favorite,
@@ -416,7 +401,6 @@ namespace Ryujinx.Ui
                     FileExtension = Path.GetExtension(applicationPath).ToUpper().Remove(0, 1),
                     FileSize      = (fileSize < 1) ? (fileSize * 1024).ToString("0.##") + "MB" : fileSize.ToString("0.##") + "GB",
                     Path          = applicationPath,
-                    SaveDataPath  = saveDataPath,
                     ControlHolder = controlHolder
                 };
 

+ 0 - 8
Ryujinx/Ui/ControllerWindow.cs

@@ -419,10 +419,6 @@ namespace Ryujinx.Ui
                         ButtonZr    = rButtonZr,
                         ButtonSl    = rButtonSl,
                         ButtonSr    = rButtonSr
-                    },
-                    Hotkeys        = new KeyboardHotkeys
-                    {
-                        ToggleVsync = Key.Tab //TODO: Make this an option in the GUI
                     }
                 };
             }
@@ -754,10 +750,6 @@ namespace Ryujinx.Ui
                             ButtonZr    = Key.O,
                             ButtonSl    = Key.Unbound,
                             ButtonSr    = Key.Unbound
-                        },
-                        Hotkeys        = new KeyboardHotkeys
-                        {
-                            ToggleVsync = Key.Tab
                         }
                     };
                 }

+ 11 - 11
Ryujinx/Ui/GLRenderer.cs

@@ -449,17 +449,6 @@ namespace Ryujinx.Ui
                         {
                             _device.Hid.Keyboard.Update(hidKeyboard.Value);
                         }
-
-                        // Toggle vsync
-                        HotkeyButtons currentHotkeyButtons = keyboardController.GetHotkeyButtons();
-
-                        if (currentHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync) &&
-                            !_prevHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync))
-                        {
-                            _device.EnableDeviceVsync = !_device.EnableDeviceVsync;
-                        }
-
-                        _prevHotkeyButtons = currentHotkeyButtons;
                     }
                 }
                 else if (inputConfig is Common.Configuration.Hid.ControllerConfig controllerConfig)
@@ -498,6 +487,17 @@ namespace Ryujinx.Ui
 
             _device.Hid.Npads.SetGamepadsInput(gamepadInputs.ToArray());
 
+            // Hotkeys
+            HotkeyButtons currentHotkeyButtons = KeyboardController.GetHotkeyButtons(OpenTK.Input.Keyboard.GetState());
+
+            if (currentHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync) &&
+                !_prevHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync))
+            {
+                _device.EnableDeviceVsync = !_device.EnableDeviceVsync;
+            }
+
+            _prevHotkeyButtons = currentHotkeyButtons;
+
             //Touchscreen
             bool hasTouch = false;
 

+ 7 - 5
Ryujinx/Ui/KeyboardController.cs

@@ -1,6 +1,7 @@
 using System;
 using OpenTK.Input;
 using Ryujinx.Common.Configuration.Hid;
+using Ryujinx.Configuration;
 using Ryujinx.HLE.HOS.Services.Hid;
 
 namespace Ryujinx.Ui
@@ -91,20 +92,21 @@ namespace Ryujinx.Ui
             return (dx, dy);
         }
 
-        public HotkeyButtons GetHotkeyButtons()
+        public static HotkeyButtons GetHotkeyButtons(KeyboardState keyboard)
         {
-            KeyboardState keyboard = GetKeyboardState(_config.Index);
-
             HotkeyButtons buttons = 0;
 
-            if (keyboard[(Key)_config.Hotkeys.ToggleVsync]) buttons |= HotkeyButtons.ToggleVSync;
+            if (keyboard[(Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ToggleVsync])
+            {
+                buttons |= HotkeyButtons.ToggleVSync;
+            }
 
             return buttons;
         }
 
         class KeyMappingEntry
         {
-            public Key TargetKey;
+            public Key  TargetKey;
             public byte Target;
         }
 

+ 59 - 10
Ryujinx/Ui/MainWindow.cs

@@ -167,7 +167,11 @@ namespace Ryujinx.Ui
             _tableStore.SetSortFunc(5, TimePlayedSort);
             _tableStore.SetSortFunc(6, LastPlayedSort);
             _tableStore.SetSortFunc(8, FileSizeSort);
-            _tableStore.SetSortColumnId(0, SortType.Descending);
+
+            int  columnId  = ConfigurationState.Instance.Ui.ColumnSort.SortColumnId;
+            bool ascending = ConfigurationState.Instance.Ui.ColumnSort.SortAscending;
+
+            _tableStore.SetSortColumnId(columnId, ascending ? SortType.Ascending : SortType.Descending);
 
             _gameTable.EnableSearch = true;
             _gameTable.SearchColumn = 2;
@@ -254,15 +258,45 @@ namespace Ryujinx.Ui
 
             foreach (TreeViewColumn column in _gameTable.Columns)
             {
-                if      (column.Title == "Fav"         && ConfigurationState.Instance.Ui.GuiColumns.FavColumn)        column.SortColumnId = 0;
-                else if (column.Title == "Application" && ConfigurationState.Instance.Ui.GuiColumns.AppColumn)        column.SortColumnId = 2;
-                else if (column.Title == "Developer"   && ConfigurationState.Instance.Ui.GuiColumns.DevColumn)        column.SortColumnId = 3;
-                else if (column.Title == "Version"     && ConfigurationState.Instance.Ui.GuiColumns.VersionColumn)    column.SortColumnId = 4;
-                else if (column.Title == "Time Played" && ConfigurationState.Instance.Ui.GuiColumns.TimePlayedColumn) column.SortColumnId = 5;
-                else if (column.Title == "Last Played" && ConfigurationState.Instance.Ui.GuiColumns.LastPlayedColumn) column.SortColumnId = 6;
-                else if (column.Title == "File Ext"    && ConfigurationState.Instance.Ui.GuiColumns.FileExtColumn)    column.SortColumnId = 7;
-                else if (column.Title == "File Size"   && ConfigurationState.Instance.Ui.GuiColumns.FileSizeColumn)   column.SortColumnId = 8;
-                else if (column.Title == "Path"        && ConfigurationState.Instance.Ui.GuiColumns.PathColumn)       column.SortColumnId = 9;
+                switch (column.Title)
+                {
+                    case "Fav":
+                        column.SortColumnId = 0;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "Application":
+                        column.SortColumnId = 2;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "Developer":
+                        column.SortColumnId = 3;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "Version":
+                        column.SortColumnId = 4;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "Time Played":
+                        column.SortColumnId = 5;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "Last Played":
+                        column.SortColumnId = 6;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "File Ext":
+                        column.SortColumnId = 7;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "File Size":
+                        column.SortColumnId = 8;
+                        column.Clicked += Column_Clicked;
+                        break;
+                    case "Path":
+                        column.SortColumnId = 9;
+                        column.Clicked += Column_Clicked;
+                        break;
+                }
             }
         }
 
@@ -666,6 +700,11 @@ namespace Ryujinx.Ui
                 }
 
                 _progressBar.Value = barValue;
+
+                if (args.NumAppsLoaded == args.NumAppsFound) // Reset the vertical scrollbar to the top when titles finish loading
+                {
+                    _gameTableWindow.Vadjustment.Value = 0;
+                }
             });
         }
 
@@ -707,6 +746,16 @@ namespace Ryujinx.Ui
             });
         }
 
+        private void Column_Clicked(object sender, EventArgs args)
+        {
+            TreeViewColumn column = (TreeViewColumn)sender;
+
+            ConfigurationState.Instance.Ui.ColumnSort.SortColumnId.Value  = column.SortColumnId;
+            ConfigurationState.Instance.Ui.ColumnSort.SortAscending.Value = column.SortOrder == SortType.Ascending;
+
+            SaveConfig();
+        }
+
         private void Row_Activated(object sender, RowActivatedArgs args)
         {
             _gameTableSelection.GetSelected(out TreeIter treeIter);

+ 703 - 509
Ryujinx/_schema.json

@@ -22,10 +22,9 @@
     "enable_ptc",
     "enable_fs_integrity_checks",
     "fs_global_access_log_mode",
-    "controller_type",
     "enable_keyboard",
-    "keyboard_controls",
-    "joystick_controls"
+    "keyboard_config",
+    "controller_config"
   ],
   "definitions": {
     "key": {
@@ -222,9 +221,498 @@
         "Hat2Left",
         "Hat2Right"
       ]
+    },
+    "keyboard_config": {
+      "type": "object",
+      "properties": {
+        "index": {
+          "$id": "#/definitions/keyboard_config/properties/index",
+          "type": "integer",
+          "title": "Keyboard Index",
+          "description": "Keyboard Device Index",
+          "default": 0,
+          "minimum": 0,
+          "examples": [
+            0,
+            1,
+            2
+          ]
+        },
+        "controller_type": {
+          "$id": "#/properties/keyboard_config/properties/controller_type",
+          "type": "string",
+          "title": "Controller Type",
+          "default": "Handheld",
+          "enum": [
+            "Handheld",
+            "ProController",
+            "JoyconPair",
+            "JoyconLeft",
+            "JoyconRight"
+          ],
+          "examples": [
+            "Handheld",
+            "ProController",
+            "JoyconPair",
+            "JoyconLeft",
+            "JoyconRight"
+          ]
+        },
+        "player_index": {
+          "$id": "#/properties/keyboard_config/properties/player_index",
+          "type": "string",
+          "title": "Player Index",
+          "default": "Player1",
+          "enum": [
+            "Player1",
+            "Player2",
+            "Player3",
+            "Player4",
+            "Player5",
+            "Player6",
+            "Player7",
+            "Player8",
+            "Handheld"
+          ]
+        },
+        "left_joycon": {
+          "$id": "#/definitions/keyboard_config/properties/left_joycon",
+          "type": "object",
+          "title": "Left JoyCon Controls",
+          "required": [
+            "stick_up",
+            "stick_down",
+            "stick_left",
+            "stick_right",
+            "stick_button",
+            "dpad_up",
+            "dpad_down",
+            "dpad_left",
+            "dpad_right",
+            "button_minus",
+            "button_l",
+            "button_zl"
+          ],
+          "properties": {
+            "stick_up": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_up",
+              "$ref": "#/definitions/key",
+              "title": "Stick Up",
+              "default": "w"
+            },
+            "stick_down": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_down",
+              "$ref": "#/definitions/key",
+              "title": "Stick Down",
+              "default": "S"
+            },
+            "stick_left": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_left",
+              "$ref": "#/definitions/key",
+              "title": "Stick Left",
+              "default": "A"
+            },
+            "stick_right": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_right",
+              "$ref": "#/definitions/key",
+              "title": "Stick Right",
+              "default": "D"
+            },
+            "stick_button": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_button",
+              "$ref": "#/definitions/key",
+              "title": "Stick Button",
+              "default": "F"
+            },
+            "dpad_up": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_up",
+              "$ref": "#/definitions/key",
+              "title": "Dpad Up",
+              "default": "Up"
+            },
+            "dpad_down": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_down",
+              "$ref": "#/definitions/key",
+              "title": "Dpad Down",
+              "default": "Down"
+            },
+            "dpad_left": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_left",
+              "$ref": "#/definitions/key",
+              "title": "Dpad Left",
+              "default": "Left"
+            },
+            "dpad_right": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_right",
+              "$ref": "#/definitions/key",
+              "title": "Dpad Right",
+              "default": "Right"
+            },
+            "button_minus": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/button_minus",
+              "$ref": "#/definitions/key",
+              "title": "Button Minus",
+              "default": "Minus"
+            },
+            "button_l": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/button_l",
+              "$ref": "#/definitions/key",
+              "title": "Button L",
+              "default": "E"
+            },
+            "button_zl": {
+              "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/button_zl",
+              "$ref": "#/definitions/key",
+              "title": "Button ZL",
+              "default": "Q"
+            }
+          }
+        },
+        "right_joycon": {
+          "$id": "#/definitions/keyboard_config/properties/right_joycon",
+          "type": "object",
+          "title": "Right JoyCon Controls",
+          "required": [
+            "stick_up",
+            "stick_down",
+            "stick_left",
+            "stick_right",
+            "stick_button",
+            "button_a",
+            "button_b",
+            "button_x",
+            "button_y",
+            "button_plus",
+            "button_r",
+            "button_zr"
+          ],
+          "properties": {
+            "stick_up": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_up",
+              "$ref": "#/definitions/key",
+              "title": "Stick Up",
+              "default": "I"
+            },
+            "stick_down": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_down",
+              "$ref": "#/definitions/key",
+              "title": "Stick Down",
+              "default": "K"
+            },
+            "stick_left": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_left",
+              "$ref": "#/definitions/key",
+              "title": "Stick Left",
+              "default": "J"
+            },
+            "stick_right": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_right",
+              "$ref": "#/definitions/key",
+              "title": "Stick Right",
+              "default": "L"
+            },
+            "stick_button": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_button",
+              "$ref": "#/definitions/key",
+              "title": "Stick Button",
+              "default": "H"
+            },
+            "button_a": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_a",
+              "$ref": "#/definitions/key",
+              "title": "Button A",
+              "default": "Z"
+            },
+            "button_b": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_b",
+              "$ref": "#/definitions/key",
+              "title": "Button B",
+              "default": "X"
+            },
+            "button_x": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_x",
+              "$ref": "#/definitions/key",
+              "title": "Button X",
+              "default": "C"
+            },
+            "button_y": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_y",
+              "$ref": "#/definitions/key",
+              "title": "Button Y",
+              "default": "V"
+            },
+            "button_plus": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_plus",
+              "$ref": "#/definitions/key",
+              "title": "Button Plus",
+              "default": "Plus"
+            },
+            "button_r": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_r",
+              "$ref": "#/definitions/key",
+              "title": "Button R",
+              "default": "U"
+            },
+            "button_zr": {
+              "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_zr",
+              "$ref": "#/definitions/key",
+              "title": "Button Zr",
+              "default": "O"
+            }
+          }
+        }
+      }
+    },
+    "controller_config": {
+      "type": "object",
+      "properties": {
+        "index": {
+          "$id": "#/definitions/controller_config/properties/index",
+          "type": "integer",
+          "title": "Controller Index",
+          "description": "Controller Device Index",
+          "default": 0,
+          "minimum": 0,
+          "examples": [
+            0,
+            1,
+            2
+          ]
+        },
+        "controller_type": {
+          "$id": "#/properties/controller_config/properties/controller_type",
+          "type": "string",
+          "title": "Controller Type",
+          "default": "Handheld",
+          "enum": [
+            "Handheld",
+            "ProController",
+            "JoyconPair",
+            "JoyconLeft",
+            "JoyconRight"
+          ],
+          "examples": [
+            "Handheld",
+            "ProController",
+            "JoyconPair",
+            "JoyconLeft",
+            "JoyconRight"
+          ]
+        },
+        "player_index": {
+          "$id": "#/properties/controller_config/properties/player_index",
+          "type": "string",
+          "title": "Player Index",
+          "default": "Player1",
+          "enum": [
+            "Player1",
+            "Player2",
+            "Player3",
+            "Player4",
+            "Player5",
+            "Player6",
+            "Player7",
+            "Player8",
+            "Handheld"
+          ]
+        },
+        "deadzone_left": {
+          "$id": "#/definitions/controller_config/properties/deadzone_left",
+          "type": "number",
+          "title": "Left Joystick Deadzone",
+          "description": "Controller Left Analog Stick Deadzone",
+          "default": 0.05,
+          "minimum": 0.00,
+          "maximum": 1.00,
+          "examples": [
+            0.05
+          ]
+        },
+        "deadzone_right": {
+          "$id": "#/definitions/controller_config/properties/deadzone_right",
+          "type": "number",
+          "title": "Right Joystick Deadzone",
+          "description": "Controller Right Analog Stick Deadzone",
+          "default": 0.05,
+          "minimum": 0.00,
+          "maximum": 1.00,
+          "examples": [
+            0.05
+          ]
+        },
+        "trigger_threshold": {
+          "$id": "#/definitions/controller_config/properties/trigger_threshold",
+          "type": "number",
+          "title": "Controller Trigger Threshold",
+          "description": "The value of how pressed down each trigger has to be in order to register a button press",
+          "default": 0.5,
+          "minimum": 0.0,
+          "maximum": 1.0,
+          "examples": [
+            0.5
+          ]
+        },
+        "left_joycon": {
+          "$id": "#/definitions/controller_config/properties/left_joycon",
+          "type": "object",
+          "title": "Left JoyCon Controls",
+          "required": [
+            "stick",
+            "stick_button",
+            "dpad_up",
+            "dpad_down",
+            "dpad_left",
+            "dpad_right",
+            "button_minus",
+            "button_l",
+            "button_zl"
+          ],
+          "properties": {
+            "stick": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/stick",
+              "$ref": "#/definitions/input",
+              "title": "Stick",
+              "default": "Axis0"
+            },
+            "stick_button": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/stick_button",
+              "$ref": "#/definitions/input",
+              "title": "Stick Button",
+              "default": "Button13"
+            },
+            "dpad_up": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_up",
+              "$ref": "#/definitions/input",
+              "title": "Dpad Up",
+              "default": "Hat0Up"
+            },
+            "dpad_down": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_down",
+              "$ref": "#/definitions/input",
+              "title": "Dpad Down",
+              "default": "Hat0Down"
+            },
+            "dpad_left": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_left",
+              "$ref": "#/definitions/input",
+              "title": "Dpad Left",
+              "default": "Hat0Left"
+            },
+            "dpad_right": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_right",
+              "$ref": "#/definitions/input",
+              "title": "Dpad Right",
+              "default": "Hat0Right"
+            },
+            "button_minus": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/button_minus",
+              "$ref": "#/definitions/input",
+              "title": "Button Minus",
+              "default": "Button10"
+            },
+            "button_l": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/button_l",
+              "$ref": "#/definitions/input",
+              "title": "Button L",
+              "default": "Button6"
+            },
+            "button_zl": {
+              "$id": "#/definitions/controller_config/properties/left_joycon/properties/button_zl",
+              "$ref": "#/definitions/input",
+              "title": "Button ZL",
+              "default": "Button8"
+            }
+          }
+        },
+        "right_joycon": {
+          "$id": "#/definitions/controller_config/properties/right_joycon",
+          "type": "object",
+          "title": "Right JoyCon Controls",
+          "required": [
+            "stick",
+            "stick_button",
+            "button_a",
+            "button_b",
+            "button_x",
+            "button_y",
+            "button_plus",
+            "button_r",
+            "button_zr"
+          ],
+          "properties": {
+            "stick": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/stick",
+              "$ref": "#/definitions/input",
+              "title": "Stick",
+              "default": "Axis2"
+            },
+            "stick_button": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/stick_button",
+              "$ref": "#/definitions/input",
+              "title": "Stick Button",
+              "default": "Button14"
+            },
+            "button_a": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_a",
+              "$ref": "#/definitions/input",
+              "title": "Button A",
+              "default": "Button0"
+            },
+            "button_b": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_b",
+              "$ref": "#/definitions/input",
+              "title": "Button B",
+              "default": "Button1"
+            },
+            "button_x": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_x",
+              "$ref": "#/definitions/input",
+              "title": "Button X",
+              "default": "Button3"
+            },
+            "button_y": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_y",
+              "$ref": "#/definitions/input",
+              "title": "Button Y",
+              "default": "Button4"
+            },
+            "button_plus": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_plus",
+              "$ref": "#/definitions/input",
+              "title": "Button Plus",
+              "default": "Button11"
+            },
+            "button_r": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_r",
+              "$ref": "#/definitions/input",
+              "title": "Button R",
+              "default": "Button7"
+            },
+            "button_zr": {
+              "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_zr",
+              "$ref": "#/definitions/input",
+              "title": "Button ZR",
+              "default": "Button9"
+            }
+          }
+        }
+      }
     }
   },
   "properties": {
+    "max_anisotropy": {
+      "$id": "#/properties/max_anisotropy",
+      "type": "integer",
+      "title": "Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide.",
+      "description": "Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide.",
+      "default": -1,
+      "examples": [
+        -1,
+        4,
+        8,
+        16
+      ]
+    },
     "graphics_shaders_dump_path": {
       "$id": "#/properties/graphics_shaders_dump_path",
       "type": "string",
@@ -499,522 +987,228 @@
       "examples": [
         true,
         false
-      ]
-    },
-    "fs_global_access_log_mode": {
-      "$id": "#/properties/fs_global_access_log_mode",
-      "type": "integer",
-      "title": "Enable FS access log",
-      "description": "Enables FS access log output. Possible modes are 0-3. Modes 2 and 3 output to the console",
-      "default": 0,
-      "minimum": 0,
-      "examples": [
-        0,
-        1,
-        2,
-        3
-      ]
-    },
-    "ignore_missing_services": {
-      "$id": "#/properties/ignore_missing_services",
-      "type": "boolean",
-      "title": "Ignore Missing Services",
-      "description": "Enable or disable ignoring missing services, this may cause instability",
-      "default": false,
-      "examples": [
-        true,
-        false
-      ]
-    },
-    "game_dirs": {
-      "$id": "#/properties/game_dirs",
-      "type": "array",
-      "title": "List of Game Directories",
-      "description": "A list of directories containing games to be used to load games into the games list",
-      "default": []
-    },
-    "gui_columns": {
-      "$id": "#/properties/gui_columns",
-      "type": "array",
-      "title": "Used to toggle columns in the GUI",
-      "description": "Used to toggle columns in the GUI",
-      "default": {
-        "fav_column": true,
-        "icon_column": true,
-        "app_column": true,
-        "dev_column": true,
-        "version_column": true,
-        "time_played_column": true,
-        "last_played_column": true,
-        "file_ext_column": true,
-        "file_size_column": true,
-        "path_column": true
-      }
-    },
-    "enable_custom_theme": {
-      "$id": "#/properties/enable_custom_theme",
-      "type": "boolean",
-      "title": "Enable custom themes in the GUI",
-      "description": "Enable or disable custom themes in the GUI",
-      "default": false,
-      "examples": [
-        true,
-        false
-      ]
-    },
-    "custom_theme_path": {
-      "$id": "#/properties/custom_theme_path",
-      "type": "string",
-      "title": "Path to custom GUI theme",
-      "description": "Path to custom GUI theme",
-      "default": ""
-    },
-    "controller_type": {
-      "$id": "#/properties/controller_type",
-      "type": "string",
-      "title": "Controller Type",
-      "default": "Handheld",
-      "enum": [
-        "Handheld",
-        "ProController",
-        "NpadPair",
-        "NpadLeft",
-        "NpadRight"
-      ],
-      "examples": [
-        "Handheld",
-        "ProController",
-        "NpadPair",
-        "NpadLeft",
-        "NpadRight"
-      ]
-    },
-    "enable_keyboard": {
-      "$id": "#/properties/enable_keyboard",
-      "type": "boolean",
-      "title": "(HID) Keyboard Enable",
-      "description": "Enable or disable direct keyboard access (HID) support (Provides games access to your keyboard as a text entry device)",
-      "default": true,
-      "examples": [
-        true,
-        false
-      ]
-    },
-    "keyboard_controls": {
-      "$id": "#/properties/keyboard_controls",
-      "type": "object",
-      "title": "Keyboard Controls",
-      "required": [
-        "left_joycon",
-        "right_joycon"
-      ],
-      "properties": {
-        "left_joycon": {
-          "$id": "#/properties/keyboard_controls/properties/left_joycon",
-          "type": "object",
-          "title": "Left JoyCon Controls",
-          "required": [
-            "stick_up",
-            "stick_down",
-            "stick_left",
-            "stick_right",
-            "stick_button",
-            "dpad_up",
-            "dpad_down",
-            "dpad_left",
-            "dpad_right",
-            "button_minus",
-            "button_l",
-            "button_zl"
-          ],
-          "properties": {
-            "stick_up": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_up",
-              "$ref": "#/definitions/key",
-              "title": "Stick Up",
-              "default": "w"
-            },
-            "stick_down": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_down",
-              "$ref": "#/definitions/key",
-              "title": "Stick Down",
-              "default": "S"
-            },
-            "stick_left": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_left",
-              "$ref": "#/definitions/key",
-              "title": "Stick Left",
-              "default": "A"
-            },
-            "stick_right": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_right",
-              "$ref": "#/definitions/key",
-              "title": "Stick Right",
-              "default": "D"
-            },
-            "stick_button": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_button",
-              "$ref": "#/definitions/key",
-              "title": "Stick Button",
-              "default": "F"
-            },
-            "dpad_up": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_up",
-              "$ref": "#/definitions/key",
-              "title": "Dpad Up",
-              "default": "Up"
-            },
-            "dpad_down": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_down",
-              "$ref": "#/definitions/key",
-              "title": "Dpad Down",
-              "default": "Down"
-            },
-            "dpad_left": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_left",
-              "$ref": "#/definitions/key",
-              "title": "Dpad Left",
-              "default": "Left"
-            },
-            "dpad_right": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_right",
-              "$ref": "#/definitions/key",
-              "title": "Dpad Right",
-              "default": "Right"
-            },
-            "button_minus": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/button_minus",
-              "$ref": "#/definitions/key",
-              "title": "Button Minus",
-              "default": "Minus"
-            },
-            "button_l": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/button_l",
-              "$ref": "#/definitions/key",
-              "title": "Button L",
-              "default": "E"
-            },
-            "button_zl": {
-              "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/button_zl",
-              "$ref": "#/definitions/key",
-              "title": "Button ZL",
-              "default": "Q"
-            }
-          }
-        },
-        "right_joycon": {
-          "$id": "#/properties/keyboard_controls/properties/right_joycon",
-          "type": "object",
-          "title": "Right JoyCon Controls",
-          "required": [
-            "stick_up",
-            "stick_down",
-            "stick_left",
-            "stick_right",
-            "stick_button",
-            "button_a",
-            "button_b",
-            "button_x",
-            "button_y",
-            "button_plus",
-            "button_r",
-            "button_zr"
-          ],
-          "properties": {
-            "stick_up": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_up",
-              "$ref": "#/definitions/key",
-              "title": "Stick Up",
-              "default": "I"
-            },
-            "stick_down": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_down",
-              "$ref": "#/definitions/key",
-              "title": "Stick Down",
-              "default": "K"
-            },
-            "stick_left": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_left",
-              "$ref": "#/definitions/key",
-              "title": "Stick Left",
-              "default": "J"
-            },
-            "stick_right": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_right",
-              "$ref": "#/definitions/key",
-              "title": "Stick Right",
-              "default": "L"
-            },
-            "stick_button": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_button",
-              "$ref": "#/definitions/key",
-              "title": "Stick Button",
-              "default": "H"
-            },
-            "button_a": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_a",
-              "$ref": "#/definitions/key",
-              "title": "Button A",
-              "default": "Z"
-            },
-            "button_b": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_b",
-              "$ref": "#/definitions/key",
-              "title": "Button B",
-              "default": "X"
-            },
-            "button_x": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_x",
-              "$ref": "#/definitions/key",
-              "title": "Button X",
-              "default": "C"
-            },
-            "button_y": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_y",
-              "$ref": "#/definitions/key",
-              "title": "Button Y",
-              "default": "V"
-            },
-            "button_plus": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_plus",
-              "$ref": "#/definitions/key",
-              "title": "Button Plus",
-              "default": "Plus"
-            },
-            "button_r": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_r",
-              "$ref": "#/definitions/key",
-              "title": "Button R",
-              "default": "U"
-            },
-            "button_zr": {
-              "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_zr",
-              "$ref": "#/definitions/key",
-              "title": "Button Zr",
-              "default": "O"
-            }
-          }
-        },
-        "hotkeys": {
-          "$id": "#/properties/keyboard_controls/properties/hotkeys",
-          "type": "object",
-          "title": "Hotkey Controls",
-          "required": [
-            "toggle_vsync"
-          ],
-          "properties": {
-            "toggle_vsync": {
-              "$id": "#/properties/keyboard_controls/properties/hotkeys/properties/toggle_vsync",
-              "$ref": "#/definitions/key",
-              "title": "Toggle VSync",
-              "default": "Tab"
-            }
-          }
-        }
-      }
+      ]
+    },
+    "fs_global_access_log_mode": {
+      "$id": "#/properties/fs_global_access_log_mode",
+      "type": "integer",
+      "title": "Enable FS access log",
+      "description": "Enables FS access log output. Possible modes are 0-3. Modes 2 and 3 output to the console",
+      "default": 0,
+      "minimum": 0,
+      "examples": [
+        0,
+        1,
+        2,
+        3
+      ]
+    },
+    "ignore_missing_services": {
+      "$id": "#/properties/ignore_missing_services",
+      "type": "boolean",
+      "title": "Ignore Missing Services",
+      "description": "Enable or disable ignoring missing services, this may cause instability",
+      "default": false,
+      "examples": [
+        true,
+        false
+      ]
     },
-    "joystick_controls": {
-      "$id": "#/properties/joystick_controls",
+    "gui_columns": {
+      "$id": "#/properties/gui_columns",
       "type": "object",
-      "title": "Joystick Controls",
-      "required": [
-        "left_joycon",
-        "right_joycon"
-      ],
+      "title": "Used to toggle columns in the GUI",
+      "description": "Used to toggle columns in the GUI",
       "properties": {
-        "enable": {
-          "$id": "#/properties/joystick_controls/properties/enable",
+        "fav_column": {
+          "$id": "#/properties/gui_columns/properties/fav_column",
           "type": "boolean",
-          "title": "Joystick Enable",
-          "description": "Enables or disables controller support",
-          "default": true,
-          "examples": [
-            true,
-            false
-          ]
+          "title": "",
+          "default": true
         },
-        "index": {
-          "$id": "#/properties/joystick_controls/properties/index",
-          "type": "integer",
-          "title": "Joystick Index",
-          "description": "Controller Device Index",
-          "default": 0,
-          "minimum": 0,
-          "examples": [
-            0,
-            1,
-            2
-          ]
+        "icon_column": {
+          "$id": "#/properties/gui_columns/properties/icon_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
         },
-        "deadzone": {
-          "$id": "#/properties/joystick_controls/properties/deadzone",
-          "type": "number",
-          "title": "Joystick Deadzone",
-          "description": "Controller Analog Stick Deadzone",
-          "default": 0.05,
-          "minimum": 0.00,
-          "maximum": 1.00,
-          "examples": [
-            0.05
-          ]
+        "app_column": {
+          "$id": "#/properties/gui_columns/properties/app_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
         },
-        "trigger_threshold": {
-          "$id": "#/properties/joystick_controls/properties/trigger_threshold",
-          "type": "number",
-          "title": "Controller Trigger Threshold",
-          "description": "The value of how pressed down each trigger has to be in order to register a button press",
-          "default": 0.5,
-          "minimum": 0.0,
-          "maximum": 1.0,
-          "examples": [
-            0.5
-          ]
+        "dev_column": {
+          "$id": "#/properties/gui_columns/properties/dev_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
         },
-        "left_joycon": {
-          "$id": "#/properties/joystick_controls/properties/left_joycon",
-          "type": "object",
-          "title": "Left JoyCon Controls",
-          "required": [
-            "stick",
-            "stick_button",
-            "dpad_up",
-            "dpad_down",
-            "dpad_left",
-            "dpad_right",
-            "button_minus",
-            "button_l",
-            "button_zl"
-          ],
-          "properties": {
-            "stick": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/stick",
-              "$ref": "#/definitions/input",
-              "title": "Stick",
-              "default": "Axis0"
-            },
-            "stick_button": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/stick_button",
-              "$ref": "#/definitions/input",
-              "title": "Stick Button",
-              "default": "Button13"
-            },
-            "dpad_up": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_up",
-              "$ref": "#/definitions/input",
-              "title": "Dpad Up",
-              "default": "Hat0Up"
-            },
-            "dpad_down": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_down",
-              "$ref": "#/definitions/input",
-              "title": "Dpad Down",
-              "default": "Hat0Down"
-            },
-            "dpad_left": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_left",
-              "$ref": "#/definitions/input",
-              "title": "Dpad Left",
-              "default": "Hat0Left"
-            },
-            "dpad_right": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_right",
-              "$ref": "#/definitions/input",
-              "title": "Dpad Right",
-              "default": "Hat0Right"
-            },
-            "button_minus": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/button_minus",
-              "$ref": "#/definitions/input",
-              "title": "Button Minus",
-              "default": "Button10"
-            },
-            "button_l": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/button_l",
-              "$ref": "#/definitions/input",
-              "title": "Button L",
-              "default": "Button6"
-            },
-            "button_zl": {
-              "$id": "#/properties/joystick_controls/properties/left_joycon/properties/button_zl",
-              "$ref": "#/definitions/input",
-              "title": "Button ZL",
-              "default": "Button8"
-            }
-          }
+        "version_column": {
+          "$id": "#/properties/gui_columns/properties/version_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
         },
-        "right_joycon": {
-          "$id": "#/properties/joystick_controls/properties/right_joycon",
-          "type": "object",
-          "title": "Right JoyCon Controls",
-          "required": [
-            "stick",
-            "stick_button",
-            "button_a",
-            "button_b",
-            "button_x",
-            "button_y",
-            "button_plus",
-            "button_r",
-            "button_zr"
-          ],
-          "properties": {
-            "stick": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/stick",
-              "$ref": "#/definitions/input",
-              "title": "Stick",
-              "default": "Axis2"
-            },
-            "stick_button": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/stick_button",
-              "$ref": "#/definitions/input",
-              "title": "Stick Button",
-              "default": "Button14"
-            },
-            "button_a": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_a",
-              "$ref": "#/definitions/input",
-              "title": "Button A",
-              "default": "Button0"
-            },
-            "button_b": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_b",
-              "$ref": "#/definitions/input",
-              "title": "Button B",
-              "default": "Button1"
-            },
-            "button_x": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_x",
-              "$ref": "#/definitions/input",
-              "title": "Button X",
-              "default": "Button3"
-            },
-            "button_y": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_y",
-              "$ref": "#/definitions/input",
-              "title": "Button Y",
-              "default": "Button4"
-            },
-            "button_plus": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_plus",
-              "$ref": "#/definitions/input",
-              "title": "Button Plus",
-              "default": "Button11"
-            },
-            "button_r": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_r",
-              "$ref": "#/definitions/input",
-              "title": "Button R",
-              "default": "Button7"
-            },
-            "button_zr": {
-              "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_zr",
-              "$ref": "#/definitions/input",
-              "title": "Button ZR",
-              "default": "Button9"
-            }
-          }
+        "time_played_column": {
+          "$id": "#/properties/gui_columns/properties/time_played_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
+        },
+        "last_played_column": {
+          "$id": "#/properties/gui_columns/properties/last_played_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
+        },
+        "file_ext_column": {
+          "$id": "#/properties/gui_columns/properties/file_ext_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
+        },
+        "file_size_column": {
+          "$id": "#/properties/gui_columns/properties/file_size_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
+        },
+        "path_column": {
+          "$id": "#/properties/gui_columns/properties/path_column",
+          "type": "boolean",
+          "title": "",
+          "default": true
+        }
+      }
+    },
+    "column_sort": {
+      "$id": "#/properties/column_sort",
+      "type": "object",
+      "title": "Used to configure column sort settings in the GUI",
+      "description": "Used to configure column sort settings in the GUI",
+      "properties": {
+        "sort_column_id": {
+          "$id": "#/properties/column_sort/properties/sort_column_id",
+          "type": "integer",
+          "title": "",
+          "default": 0
+        },
+        "sort_ascending": {
+          "$id": "#/properties/column_sort/properties/sort_ascending",
+          "type": "boolean",
+          "title": "",
+          "default": false
+        }
+      }
+    },
+    "game_dirs": {
+      "$id": "#/properties/game_dirs",
+      "type": "array",
+      "title": "List of Game Directories",
+      "description": "A list of directories containing games to be used to load games into the games list",
+      "default": []
+    },
+    "enable_custom_theme": {
+      "$id": "#/properties/enable_custom_theme",
+      "type": "boolean",
+      "title": "Enable custom themes in the GUI",
+      "description": "Enable or disable custom themes in the GUI",
+      "default": false,
+      "examples": [
+        true,
+        false
+      ]
+    },
+    "custom_theme_path": {
+      "$id": "#/properties/custom_theme_path",
+      "type": "string",
+      "title": "Path to custom GUI theme",
+      "description": "Path to custom GUI theme",
+      "default": ""
+    },
+    "enable_keyboard": {
+      "$id": "#/properties/enable_keyboard",
+      "type": "boolean",
+      "title": "(HID) Keyboard Enable",
+      "description": "Enable or disable direct keyboard access (HID) support (Provides games access to your keyboard as a text entry device)",
+      "default": true,
+      "examples": [
+        true,
+        false
+      ]
+    },
+    "hotkeys": {
+      "$id": "#/properties/hotkeys",
+      "type": "object",
+      "title": "Hotkey Controls",
+      "required": [
+        "toggle_vsync"
+      ],
+      "properties": {
+        "toggle_vsync": {
+          "$id": "#/properties/hotkeys/properties/toggle_vsync",
+          "$ref": "#/definitions/key",
+          "title": "Toggle VSync",
+          "default": "Tab"
         }
       }
+    },
+    "keyboard_config": {
+      "$id": "#/properties/keyboard_config",
+      "type": "array",
+      "title": "Keyboard Config",
+      "items": {
+        "$ref": "#/definitions/keyboard_config"
+      },
+      "default": [
+        {
+          "index": 0,
+          "controller_type": "JoyconPair",
+          "player_index": "Player1",
+          "left_joycon": {
+            "stick_up": "W",
+            "stick_down": "S",
+            "stick_left": "A",
+            "stick_right": "D",
+            "stick_button": "F",
+            "dpad_up": "Up",
+            "dpad_down": "Down",
+            "dpad_left": "Left",
+            "dpad_right": "Right",
+            "button_minus": "Minus",
+            "button_l": "E",
+            "button_zl": "Q",
+            "button_sl": "Unbound",
+            "button_sr": "Unbound"
+          },
+          "right_joycon": {
+            "stick_up": "I",
+            "stick_down": "K",
+            "stick_left": "J",
+            "stick_right": "L",
+            "stick_button": "H",
+            "button_a": "Z",
+            "button_b": "X",
+            "button_x": "C",
+            "button_y": "V",
+            "button_plus": "Plus",
+            "button_r": "U",
+            "button_zr": "O",
+            "button_sl": "Unbound",
+            "button_sr": "Unbound"
+          }
+        }
+      ] 
+    },
+    "controller_config": {
+      "$id": "#/properties/controller_config",
+      "type": "array",
+      "title": "Controller Config",
+      "items": {
+        "$ref": "#/definitions/controller_config"
+      },
+      "default": []
     }
   }
-}
+}