diff --git a/Project-Aurora/Project-Aurora/App.xaml.cs b/Project-Aurora/Project-Aurora/App.xaml.cs
index d8d696750..48293d5f0 100755
--- a/Project-Aurora/Project-Aurora/App.xaml.cs
+++ b/Project-Aurora/Project-Aurora/App.xaml.cs
@@ -116,7 +116,7 @@ public static void LogLine(this NLog.Logger logger, string text, Logging_Level l
public static NetworkListener net_listener;
public static Configuration Configuration;
public static DeviceManager dev_manager;
- public static KeyboardLayoutManager kbLayout;
+ public static DeviceLayoutManager devicesLayout;
public static Effects effengine;
public static KeyRecorder key_recorder;
public static RzSdkManager razerSdkManager;
@@ -313,9 +313,9 @@ protected override void OnStartup(StartupEventArgs e)
Global.logger.Info("Loading Plugins");
(Global.PluginManager = new PluginManager()).Initialize();
- Global.logger.Info("Loading KB Layouts");
- Global.kbLayout = new KeyboardLayoutManager();
- Global.kbLayout.LoadBrandDefault();
+
+ Global.devicesLayout = new DeviceLayoutManager();
+
Global.logger.Info("Loading Input Hooking");
Global.InputEvents = new InputEvents();
@@ -407,6 +407,8 @@ protected override void OnStartup(StartupEventArgs e)
MainWindow = new ConfigUI();
((ConfigUI)MainWindow).Display();
+ Global.logger.Info("Loading Device Layouts");
+
//Debug Windows on Startup
if (Global.Configuration.BitmapWindowOnStartUp)
Window_BitmapView.Open();
diff --git a/Project-Aurora/Project-Aurora/ConfigUI.xaml b/Project-Aurora/Project-Aurora/ConfigUI.xaml
index f682fe89c..8214d9745 100755
--- a/Project-Aurora/Project-Aurora/ConfigUI.xaml
+++ b/Project-Aurora/Project-Aurora/ConfigUI.xaml
@@ -6,7 +6,7 @@
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:local="clr-namespace:Aurora"
xmlns:tb="http://www.hardcodet.net/taskbar"
- xmlns:Controls="clr-namespace:Aurora.Controls" xmlns:Settings="clr-namespace:Aurora.Settings" x:Class="Aurora.ConfigUI"
+ xmlns:Controls="clr-namespace:Aurora.Controls" xmlns:Settings="clr-namespace:Aurora.Settings" xmlns:DeviceLayout="clr-namespace:Aurora.Settings.DeviceLayoutViewer" x:Class="Aurora.ConfigUI"
mc:Ignorable="d" Height="656" Width="1000" Title="Aurora" Loaded="Window_Loaded" Initialized="Window_Initialized" Closing="Window_Closing" Activated="Window_Activated" Deactivated="Window_Deactivated" HorizontalContentAlignment="Stretch" MinWidth="926" MinHeight="575"
DataContext="{Binding RelativeSource={RelativeSource Self}}" SizeChanged="Window_SizeChanged">
@@ -87,18 +87,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/Project-Aurora/Project-Aurora/ConfigUI.xaml.cs b/Project-Aurora/Project-Aurora/ConfigUI.xaml.cs
index 01133260d..dd44f2308 100755
--- a/Project-Aurora/Project-Aurora/ConfigUI.xaml.cs
+++ b/Project-Aurora/Project-Aurora/ConfigUI.xaml.cs
@@ -15,7 +15,6 @@
using Aurora.Controls;
using Aurora.Profiles.Generic_Application;
using System.IO;
-using Aurora.Settings.Keycaps;
using Aurora.Profiles;
using Aurora.Settings.Layers;
using Aurora.Profiles.Aurora_Wrapper;
@@ -50,13 +49,7 @@ partial class ConfigUI : Window, INotifyPropertyChanged
private Timer virtual_keyboard_timer;
private Stopwatch recording_stopwatch = new Stopwatch();
- private Grid virtial_kb = new Grid();
- private readonly double virtual_keyboard_width;
- private readonly double virtual_keyboard_height;
-
- private readonly double width;
- private readonly double height;
public static readonly DependencyProperty FocusedApplicationProperty = DependencyProperty.Register("FocusedApplication", typeof(Profiles.Application), typeof(ConfigUI), new PropertyMetadata(null, new PropertyChangedCallback(FocusedProfileChanged)));
@@ -70,8 +63,6 @@ public Profiles.Application FocusedApplication
}
}
- LayerEditor layer_editor = new LayerEditor();
-
private bool _ShowHidden = false;
public bool ShowHidden
@@ -88,19 +79,10 @@ public ConfigUI()
{
InitializeComponent();
- virtual_keyboard_height = this.keyboard_grid.Height;
- virtual_keyboard_width = this.keyboard_grid.Width;
-
- width = Width;
- height = Height;
-
- Global.kbLayout.KeyboardLayoutUpdated += KbLayout_KeyboardLayoutUpdated;
-
ctrlProfileManager.ProfileSelected += CtrlProfileManager_ProfileSelected;
GenerateProfileStack();
settingsControl.DataContext = this;
-
}
@@ -141,28 +123,7 @@ private void Layer_manager_NewLayer(Layer layer)
SelectedControl = layerPresenter;
}
- private void KbLayout_KeyboardLayoutUpdated(object sender)
- {
- virtial_kb = Global.kbLayout.Virtual_keyboard;
-
- keyboard_grid.Children.Clear();
- keyboard_grid.Children.Add(virtial_kb);
- keyboard_grid.Children.Add(new LayerEditor());
-
- keyboard_grid.Width = virtial_kb.Width;
- this.Width = width + (virtial_kb.Width - virtual_keyboard_width);
-
- keyboard_grid.Height = virtial_kb.Height;
- this.Height = height + (virtial_kb.Height - virtual_keyboard_height);
-
- keyboard_grid.UpdateLayout();
-
- keyboard_viewbox.MaxWidth = virtial_kb.Width + 50;
- keyboard_viewbox.MaxHeight = virtial_kb.Height + 50;
- keyboard_viewbox.UpdateLayout();
-
- this.UpdateLayout();
- }
+
private void Window_Loaded(object sender, RoutedEventArgs e)
{
@@ -171,34 +132,15 @@ private void Window_Loaded(object sender, RoutedEventArgs e)
if (!settingsloaded)
{
virtual_keyboard_timer = new Timer(33);
- virtual_keyboard_timer.Elapsed += new ElapsedEventHandler(virtual_keyboard_timer_Tick);
+ virtual_keyboard_timer.Elapsed += new ElapsedEventHandler(LayoutRenderTimerTick);
virtual_keyboard_timer.Start();
settingsloaded = true;
}
- this.keyboard_record_message.Visibility = Visibility.Hidden;
-
current_color = desktop_color_scheme;
bg_grid.Background = new SolidColorBrush(Color.FromRgb(desktop_color_scheme.Red, desktop_color_scheme.Green, desktop_color_scheme.Blue));
- virtial_kb = Global.kbLayout.Virtual_keyboard;
-
- keyboard_grid.Children.Clear();
- keyboard_grid.Children.Add(virtial_kb);
- keyboard_grid.Children.Add(new LayerEditor());
-
- keyboard_grid.Width = virtial_kb.Width;
- this.Width = width + (virtial_kb.Width - virtual_keyboard_width);
-
- keyboard_grid.Height = virtial_kb.Height;
- this.Height = height + (virtial_kb.Height - virtual_keyboard_height);
-
- keyboard_grid.UpdateLayout();
-
- keyboard_viewbox.MaxWidth = virtial_kb.Width + 50;
- keyboard_viewbox.MaxHeight = virtial_kb.Height + 50;
- keyboard_viewbox.UpdateLayout();
UpdateManagerStackFocus(ctrlLayerManager);
@@ -233,7 +175,7 @@ public static bool ApplicationIsActivated()
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);
- private void virtual_keyboard_timer_Tick(object sender, EventArgs e)
+ private void LayoutRenderTimerTick(object sender, EventArgs e)
{
if (!ApplicationIsActivated())
return;
@@ -249,20 +191,11 @@ private void virtual_keyboard_timer_Tick(object sender, EventArgs e)
bg_grid.UpdateLayout();
}
-
- Dictionary keylights = new Dictionary();
-
if (IsActive)
{
- keylights = Global.effengine.GetKeyboardLights();
- Global.kbLayout.SetKeyboardColors(keylights);
+ deviceLayerPresenter.Refresh();
}
- if (Global.key_recorder.IsRecording())
- this.keyboard_record_message.Visibility = Visibility.Visible;
- else
- this.keyboard_record_message.Visibility = Visibility.Hidden;
-
});
}
diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml
index 3f9a01541..37ff25097 100644
--- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml
+++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml
@@ -4,6 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Aurora.Controls"
+ xmlns:DeviceLayout="clr-namespace:Aurora.Settings.DeviceLayoutViewer"
mc:Ignorable="d"
d:DesignHeight="414" d:DesignWidth="535" Loaded="UserControl_Loaded" PreviewKeyDown="UserControl_PreviewKeyDown">
@@ -11,20 +12,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs
index aa69a1fa9..0a1413b84 100644
--- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs
+++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs
@@ -1,5 +1,6 @@
using Aurora.Devices;
using Aurora.EffectsEngine.Animations;
+using Aurora.Settings;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -57,55 +58,25 @@ public Control_AnimationEditor()
{
InitializeComponent();
- UpdateVirtualKeyboard();
-
- Global.kbLayout.KeyboardLayoutUpdated += KbLayout_KeyboardLayoutUpdated;
- }
-
- private void KbLayout_KeyboardLayoutUpdated(object sender)
- {
- UpdateVirtualKeyboard();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
- }
-
- private void UpdateVirtualKeyboard()
- {
- Grid virtial_kb = Global.kbLayout.AbstractVirtualKeyboard;
-
- keyboard_grid.Children.Clear();
- keyboard_grid.Children.Add(virtial_kb);
- keyboard_grid.Children.Add(new LayerEditor());
-
- keyboard_grid.Width = virtial_kb.Width;
- keyboard_grid.Height = virtial_kb.Height;
-
- keyboard_grid.UpdateLayout();
-
- viewbxAnimationView.MaxWidth = virtial_kb.Width + 50;
- viewbxAnimationView.MaxHeight = virtial_kb.Height + 50;
- viewbxAnimationView.UpdateLayout();
-
- this.UpdateLayout();
-
- //Generate a new mapping
- foreach (FrameworkElement Child in virtial_kb.Children)
+ foreach (Settings.DeviceLayoutViewer.Control_Keycap key in deviceLayerPresenter.Keycaps)
{
- if (Child is Settings.Keycaps.IKeycap && (Child as Settings.Keycaps.IKeycap).GetKey() != DeviceKeys.NONE)
+ if (key.GetKey() != DeviceKeys.NONE)
{
- Child.PreviewMouseLeftButtonDown += KeyboardKey_PreviewMouseLeftButtonDown;
- Child.PreviewMouseRightButtonDown += KeyboardKey_PreviewMouseRightButtonDown;
+ key.PreviewMouseLeftButtonDown += KeyboardKey_PreviewMouseLeftButtonDown;
+ key.PreviewMouseRightButtonDown += KeyboardKey_PreviewMouseRightButtonDown;
}
}
}
private void KeyboardKey_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
- if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame && sender is Settings.Keycaps.IKeycap)
+ if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame && sender is Settings.DeviceLayoutViewer.Keycaps.KeycapViewer keycapViewer)
{
- SetKeyColor((sender as Settings.Keycaps.IKeycap).GetKey(), _PrimaryManualColor);
+ SetKeyColor(keycapViewer.GetKey(), _PrimaryManualColor);
this.animMixer.UpdatePlaybackTime();
}
@@ -113,15 +84,15 @@ private void KeyboardKey_PreviewMouseLeftButtonDown(object sender, MouseButtonEv
private void KeyboardKey_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
- if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame && sender is Settings.Keycaps.IKeycap)
+ if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame && sender is Settings.DeviceLayoutViewer.Keycaps.KeycapViewer keycapViewer)
{
- SetKeyColor((sender as Settings.Keycaps.IKeycap).GetKey(), _SecondaryManualColor);
+ SetKeyColor(keycapViewer.GetKey(), _SecondaryManualColor);
this.animMixer.UpdatePlaybackTime();
}
}
- private void SetKeyColor(DeviceKeys key, System.Drawing.Color color)
+ private void SetKeyColor(DeviceKey key, System.Drawing.Color color)
{
if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame)
{
@@ -443,7 +414,7 @@ private void BtnClearColors_Click(object sender, RoutedEventArgs e)
{
AnimationManualColorFrame frame = ((_selectedFrameItem as Control_AnimationFrameItem).ContextFrame as AnimationManualColorFrame);
- frame.SetBitmapColors(new Dictionary());
+ frame.SetBitmapColors(new Dictionary());
this.animMixer.UpdatePlaybackTime();
}
diff --git a/Project-Aurora/Project-Aurora/Controls/EditorResources/ResizeDecorator.xaml b/Project-Aurora/Project-Aurora/Controls/EditorResources/ResizeDecorator.xaml
index 05e2d7309..39ecdc79f 100644
--- a/Project-Aurora/Project-Aurora/Controls/EditorResources/ResizeDecorator.xaml
+++ b/Project-Aurora/Project-Aurora/Controls/EditorResources/ResizeDecorator.xaml
@@ -3,24 +3,26 @@
xmlns:s="clr-namespace:Aurora.Controls.EditorResources">
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/Controls/EditorResources/RotateDecorator.xaml b/Project-Aurora/Project-Aurora/Controls/EditorResources/RotateDecorator.xaml
index 9f0bee33e..ead7cd844 100644
--- a/Project-Aurora/Project-Aurora/Controls/EditorResources/RotateDecorator.xaml
+++ b/Project-Aurora/Project-Aurora/Controls/EditorResources/RotateDecorator.xaml
@@ -22,18 +22,18 @@
-
-
+
+
-
+
-
+
diff --git a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml
index 7fb9bb7de..0ca0b0687 100644
--- a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml
+++ b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml
@@ -3,20 +3,15 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:EnumValueConverters="clr-namespace:Aurora.Utils"
mc:Ignorable="d" MinWidth="230" MinHeight="111" Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded" IsEnabledChanged="UserControl_IsEnabledChanged" IsVisibleChanged="UserControl_IsVisibleChanged">
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs
index d4bd8b644..d8b3641d9 100644
--- a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs
+++ b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs
@@ -1,4 +1,5 @@
-using System;
+using Aurora.Settings;
+using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
@@ -40,7 +41,7 @@ public string RecordingTag
}
}
- public List List
+ public List List
{
get
{
@@ -53,7 +54,8 @@ public List List
{
if (Sequence == null)
Sequence = new Settings.KeySequence(value.ToArray());
- else {
+ else
+ {
Sequence.keys = value;
}
SequenceKeysChange?.Invoke(this, new EventArgs());
@@ -65,14 +67,17 @@ public List List
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public static readonly DependencyProperty SequenceProperty = DependencyProperty.Register("Sequence", typeof(Settings.KeySequence), typeof(UserControl), new PropertyMetadata(new Settings.KeySequence(), SequencePropertyChanged));
- public Settings.KeySequence Sequence {
+ public Settings.KeySequence Sequence
+ {
get => (Settings.KeySequence)GetValue(SequenceProperty);
set => SetValue(SequenceProperty, value);
}
- private static void SequencePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) {
+ private static void SequencePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
+ {
var source = (KeySequence)sender;
- if (!(e.NewValue is Settings.KeySequence@new)) {
+ if (!(e.NewValue is Settings.KeySequence @new))
+ {
source.Sequence = new Settings.KeySequence();
return;
}
@@ -85,7 +90,8 @@ private static void SequencePropertyChanged(DependencyObject sender, DependencyP
source.sequence_updateToLayerEditor();
// Manually update the keysequence list. Gross
- if (source.allowListRefresh) {
+ if (source.allowListRefresh)
+ {
source.keys_keysequence.Items.Clear();
foreach (var key in @new.keys)
source.keys_keysequence.Items.Add(key);
@@ -116,13 +122,14 @@ public bool FreestyleEnabled
this.sequence_freestyle_checkbox.IsEnabled = value;
this.sequence_freestyle_checkbox.ToolTip = (value ? null : "Freestyle has been disabled.");
-
+
}
}
#region ShowOnCanvas property
// Drawn freeform object bounds will only appear if this is true.
- public bool ShowOnCanvas {
+ public bool ShowOnCanvas
+ {
get => (bool)GetValue(ShowOnCanvasProperty);
set => SetValue(ShowOnCanvasProperty, value);
}
@@ -214,7 +221,7 @@ private void RecordKeySequence(string whoisrecording, Button button, ListBox seq
button.Content = "Assign Keys";
- Devices.DeviceKeys[] recorded_keys = Global.key_recorder.GetKeys();
+ DeviceKey[] recorded_keys = Global.key_recorder.GetKeys();
if (sequence_listbox.SelectedIndex > 0 && sequence_listbox.SelectedIndex < (sequence_listbox.Items.Count - 1))
{
@@ -276,7 +283,7 @@ public void sequence_updateToLayerEditor()
private void freeform_updated(Settings.FreeFormObject newfreeform)
{
- if(newfreeform != null)
+ if (newfreeform != null)
{
Sequence.freeform = newfreeform;
@@ -309,7 +316,7 @@ private void UserControl_Unloaded(object sender, RoutedEventArgs e)
private void UserControl_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
- if(e.NewValue is bool)
+ if (e.NewValue is bool)
{
this.keys_keysequence.IsEnabled = (bool)e.NewValue;
this.sequence_record.IsEnabled = (bool)e.NewValue;
@@ -328,7 +335,7 @@ private void UserControl_IsEnabledChanged(object sender, DependencyPropertyChang
private void keys_keysequence_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
- if(keys_keysequence.SelectedItems.Count <= 1)
+ if (keys_keysequence.SelectedItems.Count <= 1)
{
this.sequence_up.IsEnabled = IsEnabled && true;
this.sequence_down.IsEnabled = IsEnabled && true;
@@ -361,7 +368,7 @@ private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChang
else
sequence_removeFromLayerEditor();
}
-
+
}
}
-}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml b/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml
index fb8c7c075..d60ecab43 100644
--- a/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml
+++ b/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml
@@ -12,7 +12,4 @@
-
-
diff --git a/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml.cs b/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml.cs
index 1752ea900..108624140 100644
--- a/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml.cs
+++ b/Project-Aurora/Project-Aurora/Controls/LayerEditor.xaml.cs
@@ -16,16 +16,16 @@ public partial class LayerEditor : UserControl
{
//static FreeFormObject activeLayer = new FreeFormObject();
- private static Canvas static_canvas = new Canvas();
+ private static Canvas static_canvas;
private static Style style = new Style();
//public static event EventHandler SequenceUpdated;
- public LayerEditor()
+ public LayerEditor(Canvas editorCanvas)
{
InitializeComponent();
- static_canvas = editor_canvas;
+ static_canvas = editorCanvas;
style = this.FindResource("DesignerItemStyle") as Style;
}
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_backlights.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_backlights.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_backlights.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_backlights.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_body.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_body.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_body.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_body.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_wheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_wheel.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_Pugio_wheel.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_Pugio_wheel.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Asus_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Asus_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_Katar.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_Katar.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_Katar.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_Katar.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_Katar_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_Katar_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_Katar_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_Katar_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_Katar_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_Katar_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_Katar_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_Katar_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65_scrollwheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65_scrollwheel.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_M65_scrollwheel.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_M65_scrollwheel.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_strafe_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_strafe_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_strafe_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_strafe_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_strafe_mk2_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_strafe_mk2_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Corsair_strafe_mk2_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Corsair_strafe_mk2_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502.pdn b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502.pdn
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502.pdn
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502.pdn
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502_dpi.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502_dpi.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502_dpi.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502_dpi.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G502_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G502_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G810.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G810.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G810.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G810.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G810_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G810_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G810_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G810_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G900.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G900.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G900.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G900.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G900_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G900_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G900_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G900_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G900_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G900_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G900_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G900_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G910_badge.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G910_badge.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G910_badge.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G910_badge.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G910_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G910_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_G910_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_G910_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_g900_dpi.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_g900_dpi.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Logi_g900_dpi.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Logi_g900_dpi.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_logo.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_logo.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_logo.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_logo.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_0.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_0.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_0.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_0.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_1.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_1.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_1.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_1.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_2.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_2.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_2.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_2.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_3.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_3.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Omen_zone_3.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Omen_zone_3.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L1.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L1.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L1.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L1.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L2.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L2.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L2.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L2.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L3.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L3.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L3.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L3.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L4.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L4.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L4.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L4.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L5.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L5.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L5.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L5.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L6.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L6.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L6.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L6.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L7.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L7.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_L7.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_L7.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_Logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_Logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_Logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_Logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R1.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R1.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R1.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R1.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R2.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R2.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R2.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R2.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R3.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R3.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R3.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R3.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R4.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R4.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R4.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R4.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R5.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R5.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R5.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R5.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R6.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R6.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R6.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R6.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R7.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R7.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_R7.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_R7.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_Scroll_Wheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_Scroll_Wheel.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_Scroll_Wheel.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_Scroll_Wheel.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_Mamba_TE_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_Mamba_TE_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_logo.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_logo.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Razer_logo.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Razer_logo.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Roccat_Kone_Pure_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Roccat_Kone_Pure_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Roccat_Kone_Pure_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Roccat_Kone_Pure_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Roccat_Kone_Pure_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Roccat_Kone_Pure_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Roccat_Kone_Pure_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Roccat_Kone_Pure_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre_front_lights.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre_front_lights.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre_front_lights.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre_front_lights.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre_scrollwheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre_scrollwheel.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/Sabre_scrollwheel.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/Sabre_scrollwheel.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SoundBlasterX_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SoundBlasterX_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SoundBlasterX_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SoundBlasterX_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Apex_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Apex_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Apex_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Apex_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_logo.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_logo.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_logo.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_logo.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_outline.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_outline.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_outline.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_outline.psd
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_scrollwheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_scrollwheel.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_scrollwheel.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_scrollwheel.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_scrollwheel.psd b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_scrollwheel.psd
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/SteelSeries_Rival_300_scrollwheel.psd
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_300_scrollwheel.psd
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L1.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L1.png
new file mode 100644
index 000000000..ac4dfc79a
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L1.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L2.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L2.png
new file mode 100644
index 000000000..8853ce875
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L2.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L3.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L3.png
new file mode 100644
index 000000000..539900b88
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L3.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R1.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R1.png
new file mode 100644
index 000000000..d26fb1841
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R1.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R2.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R2.png
new file mode 100644
index 000000000..24a889721
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R2.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R3.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R3.png
new file mode 100644
index 000000000..cd8a2edc4
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R3.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_outline.png
new file mode 100644
index 000000000..57ac12af7
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_outline.png differ
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_wheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_wheel.png
new file mode 100644
index 000000000..3a9bde1fc
Binary files /dev/null and b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_wheel.png differ
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_outpost_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_outpost_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_outpost_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_outpost_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_outpost_plus_photon_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_outpost_plus_photon_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_outpost_plus_photon_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_outpost_plus_photon_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_photon_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_photon_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_photon_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_photon_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_photon_scrollwheel.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_photon_scrollwheel.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_photon_scrollwheel.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_photon_scrollwheel.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_sequencer_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_sequencer_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_sequencer_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_sequencer_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_vector_essentials_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_vector_essentials_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_vector_essentials_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_vector_essentials_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_vector_logo.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_vector_logo.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_vector_logo.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_vector_logo.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_vector_outline.png b/Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_vector_outline.png
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/images/omen_vector_outline.png
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Images/omen_vector_outline.png
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/asus_strix_flare_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/asus_strix_flare_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/asus_strix_flare_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/asus_strix_flare_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_bottom_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_bottom_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_bottom_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_top_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_top_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/cooler_master_sk650_top_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/cooler_master_sk650_top_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k65_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k65_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k65_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k65_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k68_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k68_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k68_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k68_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k70_mk2_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k70_mk2_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k70_mk2_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k70_mk2_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_mk2_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_mk2_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_mk2_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_mk2_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_mk2_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_mk2_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_mk2_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_mk2_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_strafe_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_strafe_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/drevo_blademaster_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/drevo_blademaster_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/drevo_blademaster_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/drevo_blademaster_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/ducky_shine_7_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/ducky_shine_7_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/ducky_shine_7_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/ducky_shine_7_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/hyperx_alloy_elite_rgb_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/hyperx_alloy_elite_rgb_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/hyperx_alloy_elite_rgb_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/hyperx_alloy_elite_rgb_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_gpro_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g810_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_gpro_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g810_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g815_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g815_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g815_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g815_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g910_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g910_features.json
similarity index 95%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g910_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g910_features.json
index a41d1fadd..6cae013ca 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g910_features.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g910_features.json
@@ -1,157 +1,157 @@
-{
- "group_tag": "keyboard",
- "origin_region": 1,
- "grouped_keys": [
- {
- "visualName": "G6",
- "tag": 113,
- "margin_left": 62.0,
- "margin_top": -37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": 5,
- "margin_top_bits": -3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G7",
- "tag": 114,
- "margin_left": 99.0,
- "margin_top": -37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": 8,
- "margin_top_bits": -3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G8",
- "tag": 115,
- "margin_left": 136.0,
- "margin_top": -37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": 11,
- "margin_top_bits": -3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G9",
- "tag": 116,
- "margin_left": 173.0,
- "margin_top": -37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": 14,
- "margin_top_bits": -3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "LOGO",
- "tag": 128,
- "margin_left": -45.0,
- "margin_top": 0.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 9.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 0,
- "image": "Logi_G910_logo.png",
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G1",
- "tag": 108,
- "margin_left": -45.0,
- "margin_top": 37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G2",
- "tag": 109,
- "margin_left": -45.0,
- "margin_top": 74.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 6,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G3",
- "tag": 110,
- "margin_left": -45.0,
- "margin_top": 111.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 9,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G4",
- "tag": 111,
- "margin_left": -45.0,
- "margin_top": 148.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 12,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "G5",
- "tag": 112,
- "margin_left": -45.0,
- "margin_top": 185.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 15,
- "enabled": true,
- "absolute_location": true
- }
- ]
+{
+ "group_tag": "keyboard",
+ "origin_region": 1,
+ "grouped_keys": [
+ {
+ "visualName": "G6",
+ "tag": 113,
+ "margin_left": 62.0,
+ "margin_top": -37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": 5,
+ "margin_top_bits": -3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G7",
+ "tag": 114,
+ "margin_left": 99.0,
+ "margin_top": -37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": 8,
+ "margin_top_bits": -3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G8",
+ "tag": 115,
+ "margin_left": 136.0,
+ "margin_top": -37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": 11,
+ "margin_top_bits": -3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G9",
+ "tag": 116,
+ "margin_left": 173.0,
+ "margin_top": -37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": 14,
+ "margin_top_bits": -3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "LOGO",
+ "tag": 128,
+ "margin_left": -45.0,
+ "margin_top": 0.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 9.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 0,
+ "image": "Logi_G910_logo.png",
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G1",
+ "tag": 108,
+ "margin_left": -45.0,
+ "margin_top": 37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G2",
+ "tag": 109,
+ "margin_left": -45.0,
+ "margin_top": 74.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 6,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G3",
+ "tag": 110,
+ "margin_left": -45.0,
+ "margin_top": 111.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 9,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G4",
+ "tag": 111,
+ "margin_left": -45.0,
+ "margin_top": 148.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 12,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "G5",
+ "tag": 112,
+ "margin_left": -45.0,
+ "margin_top": 185.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 15,
+ "enabled": true,
+ "absolute_location": true
+ }
+ ]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g910_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g910_left_bottom_features.json
similarity index 95%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g910_left_bottom_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g910_left_bottom_features.json
index 2d5ac5530..4b3b6c013 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g910_left_bottom_features.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_g910_left_bottom_features.json
@@ -1,22 +1,22 @@
-{
- "group_tag": "keyboard",
- "origin_region": 3,
- "grouped_keys": [
- {
- "visualName": "BADGE",
- "tag": 129,
- "margin_left": 92.5,
- "margin_top": 0.0,
- "width": 79.0,
- "height": 10.0,
- "font_size": 9.0,
- "width_bits": 8,
- "height_bits": 1,
- "margin_left_bits": 8,
- "margin_top_bits": 0,
- "image": "Logi_G910_badge.png",
- "enabled": true,
- "absolute_location": true
- }
- ]
+{
+ "group_tag": "keyboard",
+ "origin_region": 3,
+ "grouped_keys": [
+ {
+ "visualName": "BADGE",
+ "tag": 129,
+ "margin_left": 92.5,
+ "margin_top": 0.0,
+ "width": 79.0,
+ "height": 10.0,
+ "font_size": 9.0,
+ "width_bits": 8,
+ "height_bits": 1,
+ "margin_left_bits": 8,
+ "margin_top_bits": 0,
+ "image": "Logi_G910_badge.png",
+ "enabled": true,
+ "absolute_location": true
+ }
+ ]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g810_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_gpro_features.json
similarity index 95%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g810_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_gpro_features.json
index a0436cbaf..50e607a25 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g810_features.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/logitech_gpro_features.json
@@ -1,22 +1,22 @@
-{
- "group_tag": "keyboard",
- "origin_region": 1,
- "grouped_keys": [
- {
- "visualName": "LOGO",
- "tag": 128,
- "margin_left": 0.0,
- "margin_top": -37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 9.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": 0,
- "margin_top_bits": -3,
- "image": "Logi_G810_logo.png",
- "enabled": true,
- "absolute_location": true
- },
- ]
+{
+ "group_tag": "keyboard",
+ "origin_region": 1,
+ "grouped_keys": [
+ {
+ "visualName": "LOGO",
+ "tag": 128,
+ "margin_left": 0.0,
+ "margin_top": -37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 9.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": 0,
+ "margin_top_bits": -3,
+ "image": "Logi_G810_logo.png",
+ "enabled": true,
+ "absolute_location": true
+ },
+ ]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk730_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk730_bottom_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk730_bottom_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk730_bottom_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk730_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk730_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk730_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk730_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk730_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk730_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk730_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk730_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk750_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk750_bottom_features.json
old mode 100755
new mode 100644
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk750_bottom_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk750_bottom_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk750_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk750_left_features.json
old mode 100755
new mode 100644
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk750_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk750_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk750_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk750_right_features.json
old mode 100755
new mode 100644
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_mk750_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_mk750_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_pro_l_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_pro_l_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_pro_l_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_pro_l_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_pro_m_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_pro_m_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/masterkeys_pro_m_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/masterkeys_pro_m_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_four_zone_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_four_zone_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_four_zone_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_four_zone_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_outpost_plus_photon_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_outpost_plus_photon_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_outpost_plus_photon_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_outpost_plus_photon_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_photon_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_photon_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_photon_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_photon_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_sequencer_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_sequencer_bottom_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_sequencer_bottom_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_sequencer_bottom_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_sequencer_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_sequencer_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_sequencer_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_sequencer_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_sequencer_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_sequencer_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_sequencer_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_sequencer_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_vector_essentials_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_vector_essentials_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_vector_essentials_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_vector_essentials_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_vector_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_vector_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/omen_vector_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/omen_vector_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blackwidow_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blackwidow_features.json
similarity index 95%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blackwidow_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blackwidow_features.json
index 8709abd7a..c46bad3b3 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blackwidow_features.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blackwidow_features.json
@@ -1,81 +1,81 @@
-{
- "group_tag": "keyboard",
- "origin_region": 1,
- "grouped_keys": [
- {
- "visualName": "M1",
- "tag": 108,
- "margin_left": -38.0,
- "margin_top": 37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M2",
- "tag": 109,
- "margin_left": -38.0,
- "margin_top": 74.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 6,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M3",
- "tag": 110,
- "margin_left": -38.0,
- "margin_top": 111.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 9,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M4",
- "tag": 111,
- "margin_left": -38.0,
- "margin_top": 148.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 12,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M5",
- "tag": 112,
- "margin_left": -38.0,
- "margin_top": 185.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 15,
- "enabled": true,
- "absolute_location": true
- }
- ]
+{
+ "group_tag": "keyboard",
+ "origin_region": 1,
+ "grouped_keys": [
+ {
+ "visualName": "M1",
+ "tag": 108,
+ "margin_left": -38.0,
+ "margin_top": 37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M2",
+ "tag": 109,
+ "margin_left": -38.0,
+ "margin_top": 74.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 6,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M3",
+ "tag": 110,
+ "margin_left": -38.0,
+ "margin_top": 111.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 9,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M4",
+ "tag": 111,
+ "margin_left": -38.0,
+ "margin_top": 148.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 12,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M5",
+ "tag": 112,
+ "margin_left": -38.0,
+ "margin_top": 185.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 15,
+ "enabled": true,
+ "absolute_location": true
+ }
+ ]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blackwidow_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blackwidow_left_bottom_features.json
similarity index 95%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blackwidow_left_bottom_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blackwidow_left_bottom_features.json
index 581152de8..f156b475b 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blackwidow_left_bottom_features.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blackwidow_left_bottom_features.json
@@ -1,22 +1,22 @@
-{
- "group_tag": "keyboard",
- "origin_region": 3,
- "grouped_keys": [
- {
- "visualName": "LOGO",
- "tag": 128,
- "margin_left": 395.0,
- "margin_top": 0.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 9.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": 32,
- "margin_top_bits": 0,
- "image": "Razer_logo.png",
- "enabled": true,
- "absolute_location": true
- }
- ]
+{
+ "group_tag": "keyboard",
+ "origin_region": 3,
+ "grouped_keys": [
+ {
+ "visualName": "LOGO",
+ "tag": 128,
+ "margin_left": 395.0,
+ "margin_top": 0.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 9.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": 32,
+ "margin_top_bits": 0,
+ "image": "Razer_logo.png",
+ "enabled": true,
+ "absolute_location": true
+ }
+ ]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/roccat_ryos_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/roccat_ryos_features.json
similarity index 95%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/roccat_ryos_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/roccat_ryos_features.json
index 8709abd7a..c46bad3b3 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/roccat_ryos_features.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/roccat_ryos_features.json
@@ -1,81 +1,81 @@
-{
- "group_tag": "keyboard",
- "origin_region": 1,
- "grouped_keys": [
- {
- "visualName": "M1",
- "tag": 108,
- "margin_left": -38.0,
- "margin_top": 37.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 3,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M2",
- "tag": 109,
- "margin_left": -38.0,
- "margin_top": 74.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 6,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M3",
- "tag": 110,
- "margin_left": -38.0,
- "margin_top": 111.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 9,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M4",
- "tag": 111,
- "margin_left": -38.0,
- "margin_top": 148.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 12,
- "enabled": true,
- "absolute_location": true
- },
- {
- "visualName": "M5",
- "tag": 112,
- "margin_left": -38.0,
- "margin_top": 185.0,
- "width": 30.0,
- "height": 30.0,
- "font_size": 12.0,
- "width_bits": 3,
- "height_bits": 3,
- "margin_left_bits": -4,
- "margin_top_bits": 15,
- "enabled": true,
- "absolute_location": true
- }
- ]
+{
+ "group_tag": "keyboard",
+ "origin_region": 1,
+ "grouped_keys": [
+ {
+ "visualName": "M1",
+ "tag": 108,
+ "margin_left": -38.0,
+ "margin_top": 37.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 3,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M2",
+ "tag": 109,
+ "margin_left": -38.0,
+ "margin_top": 74.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 6,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M3",
+ "tag": 110,
+ "margin_left": -38.0,
+ "margin_top": 111.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 9,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M4",
+ "tag": 111,
+ "margin_left": -38.0,
+ "margin_top": 148.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 12,
+ "enabled": true,
+ "absolute_location": true
+ },
+ {
+ "visualName": "M5",
+ "tag": 112,
+ "margin_left": -38.0,
+ "margin_top": 185.0,
+ "width": 30.0,
+ "height": 30.0,
+ "font_size": 12.0,
+ "width_bits": 3,
+ "height_bits": 3,
+ "margin_left_bits": -4,
+ "margin_top_bits": 15,
+ "enabled": true,
+ "absolute_location": true
+ }
+ ]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/soundblasterx_vanguardk08_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/soundblasterx_vanguardk08_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/soundblasterx_vanguardk08_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/soundblasterx_vanguardk08_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/soundblasterx_vanguardk08_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/soundblasterx_vanguardk08_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/soundblasterx_vanguardk08_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/soundblasterx_vanguardk08_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m750_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m750_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m750_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m750_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m750_tkl_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m750_tkl_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m750_tkl_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m750_tkl_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m800_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m800_left_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m800_left_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m800_left_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m800_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m800_right_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_apex_m800_right_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/steelseries_apex_m800_right_features.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/wooting_two_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/wooting_two_features.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/wooting_two_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/wooting_two_features.json
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/abnt2_layout.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/abnt2_layout.json
new file mode 100644
index 000000000..381f80665
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/abnt2_layout.json
@@ -0,0 +1,1276 @@
+{
+ "keys": [
+ {
+ "Key": {
+ "tag": 1,
+ "visual_name": "ESC"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 2,
+ "visual_name": "F1"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 62,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 3,
+ "visual_name": "F2"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 99,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 4,
+ "visual_name": "F3"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 136,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 5,
+ "visual_name": "F4"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 173,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 6,
+ "visual_name": "F5"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 237,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 7,
+ "visual_name": "F6"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 274,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 8,
+ "visual_name": "F7"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 311,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 9,
+ "visual_name": "F8"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 348,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 10,
+ "visual_name": "F9"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 407,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 11,
+ "visual_name": "F10"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 444,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 12,
+ "visual_name": "F11"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 481,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 13,
+ "visual_name": "F12"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 518,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 14,
+ "visual_name": "PRINT"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 562,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 15,
+ "visual_name": "SCRL\r\nLOCK"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 599,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 16,
+ "visual_name": "PAUSE"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 636,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 17,
+ "visual_name": "~"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 18,
+ "visual_name": "1"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 37,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 19,
+ "visual_name": "2"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 74,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 20,
+ "visual_name": "3"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 111,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 21,
+ "visual_name": "4"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 148,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 22,
+ "visual_name": "5"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 185,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 23,
+ "visual_name": "6"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 222,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 24,
+ "visual_name": "7"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 259,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 25,
+ "visual_name": "8"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 296,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 26,
+ "visual_name": "9"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 333,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 27,
+ "visual_name": "0"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 370,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 28,
+ "visual_name": "-"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 407,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 29,
+ "visual_name": "="
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 444,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 30,
+ "visual_name": "BACKSPACE"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 481,
+ "Y": 37,
+ "Width": 67,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 31,
+ "visual_name": "INSERT"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 562,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 32,
+ "visual_name": "HOME"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 599,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 33,
+ "visual_name": "PAGE\r\nUP"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 636,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 34,
+ "visual_name": "NUM\r\nLOCK"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 680,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 35,
+ "visual_name": "/"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 717,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 36,
+ "visual_name": "*"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 754,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 37,
+ "visual_name": "-"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 791,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 38,
+ "visual_name": "TAB"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 74,
+ "Width": 50,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 39,
+ "visual_name": "Q"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 57,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 40,
+ "visual_name": "W"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 94,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 41,
+ "visual_name": "E"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 131,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 42,
+ "visual_name": "R"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 168,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 43,
+ "visual_name": "T"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 205,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 44,
+ "visual_name": "Y"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 242,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 45,
+ "visual_name": "U"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 279,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 46,
+ "visual_name": "I"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 316,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 47,
+ "visual_name": "O"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 353,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 48,
+ "visual_name": "P"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 390,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 49,
+ "visual_name": "´"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 427,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 50,
+ "visual_name": "["
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 464,
+ "Y": 74,
+ "Width": 40,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 52,
+ "visual_name": "DEL"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 562,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 53,
+ "visual_name": "END"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 599,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 54,
+ "visual_name": "PAGE\r\nDOWN"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 636,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 55,
+ "visual_name": "7"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 680,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 56,
+ "visual_name": "8"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 717,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 57,
+ "visual_name": "9"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 754,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 58,
+ "visual_name": "+"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 791,
+ "Y": 74,
+ "Width": 30,
+ "Height": 67
+ },
+ {
+ "Key": {
+ "tag": 59,
+ "visual_name": "CAPS\r\nLOCK"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 111,
+ "Width": 60,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 60,
+ "visual_name": "A"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 67,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 61,
+ "visual_name": "S"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 104,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 62,
+ "visual_name": "D"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 141,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 63,
+ "visual_name": "F"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 178,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 64,
+ "visual_name": "G"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 215,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 65,
+ "visual_name": "H"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 252,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 66,
+ "visual_name": "J"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 289,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 67,
+ "visual_name": "K"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 326,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 68,
+ "visual_name": "L"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 363,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 69,
+ "visual_name": "Ç"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 400,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 70,
+ "visual_name": "~"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 437,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 71,
+ "visual_name": "]"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 474,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 72,
+ "visual_name": "ENTER"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 511,
+ "Y": 74,
+ "Width": 38,
+ "Height": 67
+ },
+ {
+ "Key": {
+ "tag": 73,
+ "visual_name": "4"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 680,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 74,
+ "visual_name": "5"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 717,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 75,
+ "visual_name": "6"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 754,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 76,
+ "visual_name": "SHIFT"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 148,
+ "Width": 48,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 77,
+ "visual_name": "\\"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 55,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 78,
+ "visual_name": "Z"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 92,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 79,
+ "visual_name": "X"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 129,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 80,
+ "visual_name": "C"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 166,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 81,
+ "visual_name": "V"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 203,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 82,
+ "visual_name": "B"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 240,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 83,
+ "visual_name": "N"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 277,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 84,
+ "visual_name": "M"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 314,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 85,
+ "visual_name": "<"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 351,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 86,
+ "visual_name": ">"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 388,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 87,
+ "visual_name": ";"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 425,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 159,
+ "visual_name": "/"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 462,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 88,
+ "visual_name": "SHIFT"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 499,
+ "Y": 148,
+ "Width": 50,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 89,
+ "visual_name": "↑"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 598,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 90,
+ "visual_name": "1"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 680,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 91,
+ "visual_name": "2"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 717,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 92,
+ "visual_name": "3"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 754,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 93,
+ "visual_name": "ENTER"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 791,
+ "Y": 148,
+ "Width": 30,
+ "Height": 67
+ },
+ {
+ "Key": {
+ "tag": 94,
+ "visual_name": "CTRL"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 185,
+ "Width": 51,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 95,
+ "visual_name": "WIN"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 56,
+ "Y": 185,
+ "Width": 39,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 96,
+ "visual_name": "ALT"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 100,
+ "Y": 185,
+ "Width": 42,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 97,
+ "visual_name": "SPACE"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 149,
+ "Y": 185,
+ "Width": 208,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 98,
+ "visual_name": "ALT Gr"
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 362,
+ "Y": 185,
+ "Width": 41,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 99,
+ "visual_name": "WIN"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 408,
+ "Y": 185,
+ "Width": 41,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 100,
+ "visual_name": "APP"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 454,
+ "Y": 185,
+ "Width": 40,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 101,
+ "visual_name": "CTRL"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 499,
+ "Y": 185,
+ "Width": 50,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 102,
+ "visual_name": "←"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 561,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 103,
+ "visual_name": "↓"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 598,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 104,
+ "visual_name": "→"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 635,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 105,
+ "visual_name": "0"
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 680,
+ "Y": 185,
+ "Width": 67,
+ "Height": 30
+ },
+ {
+ "Key": {
+ "tag": 106,
+ "visual_name": "."
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 754,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/ansi_layout.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/ansi_layout.json
new file mode 100644
index 000000000..a7d63b135
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/ansi_layout.json
@@ -0,0 +1,1462 @@
+{
+ "layout_width":0,
+ "layout_height":0,
+ "keys":[
+ {
+ "Key":{
+ "visual_name":"ESC",
+ "tag":1,
+ "device_id":null
+ },
+ "X":0,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F1",
+ "tag":2,
+ "device_id":null
+ },
+ "X":62,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F2",
+ "tag":3,
+ "device_id":null
+ },
+ "X":99,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F3",
+ "tag":4,
+ "device_id":null
+ },
+ "X":136,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F4",
+ "tag":5,
+ "device_id":null
+ },
+ "X":173,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F5",
+ "tag":6,
+ "device_id":null
+ },
+ "X":237,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F6",
+ "tag":7,
+ "device_id":null
+ },
+ "X":274,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F7",
+ "tag":8,
+ "device_id":null
+ },
+ "X":311,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F8",
+ "tag":9,
+ "device_id":null
+ },
+ "X":348,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F9",
+ "tag":10,
+ "device_id":null
+ },
+ "X":407,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F10",
+ "tag":11,
+ "device_id":null
+ },
+ "X":444,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F11",
+ "tag":12,
+ "device_id":null
+ },
+ "X":481,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F12",
+ "tag":13,
+ "device_id":null
+ },
+ "X":518,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"PRINT",
+ "tag":14,
+ "device_id":null
+ },
+ "X":563,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"SCRL\r\nLOCK",
+ "tag":15,
+ "device_id":null
+ },
+ "X":600,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"PAUSE",
+ "tag":16,
+ "device_id":null
+ },
+ "X":637,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"~",
+ "tag":17,
+ "device_id":null
+ },
+ "X":0,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"1",
+ "tag":18,
+ "device_id":null
+ },
+ "X":37,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"2",
+ "tag":19,
+ "device_id":null
+ },
+ "X":74,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"3",
+ "tag":20,
+ "device_id":null
+ },
+ "X":111,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"4",
+ "tag":21,
+ "device_id":null
+ },
+ "X":148,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"5",
+ "tag":22,
+ "device_id":null
+ },
+ "X":185,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"6",
+ "tag":23,
+ "device_id":null
+ },
+ "X":222,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"7",
+ "tag":24,
+ "device_id":null
+ },
+ "X":259,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"8",
+ "tag":25,
+ "device_id":null
+ },
+ "X":296,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"9",
+ "tag":26,
+ "device_id":null
+ },
+ "X":333,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"0",
+ "tag":27,
+ "device_id":null
+ },
+ "X":370,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"-",
+ "tag":28,
+ "device_id":null
+ },
+ "X":407,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"=",
+ "tag":29,
+ "device_id":null
+ },
+ "X":444,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"BACKSPACE",
+ "tag":30,
+ "device_id":null
+ },
+ "X":481,
+ "Y":37,
+ "Width":67,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"INSERT",
+ "tag":31,
+ "device_id":null
+ },
+ "X":563,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"HOME",
+ "tag":32,
+ "device_id":null
+ },
+ "X":600,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"PAGE\r\nUP",
+ "tag":33,
+ "device_id":null
+ },
+ "X":637,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"NUM\r\nLOCK",
+ "tag":34,
+ "device_id":null
+ },
+ "X":682,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"/",
+ "tag":35,
+ "device_id":null
+ },
+ "X":719,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"*",
+ "tag":36,
+ "device_id":null
+ },
+ "X":756,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"-",
+ "tag":37,
+ "device_id":null
+ },
+ "X":793,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"TAB",
+ "tag":38,
+ "device_id":null
+ },
+ "X":0,
+ "Y":74,
+ "Width":50,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"Q",
+ "tag":39,
+ "device_id":null
+ },
+ "X":57,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"W",
+ "tag":40,
+ "device_id":null
+ },
+ "X":94,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"E",
+ "tag":41,
+ "device_id":null
+ },
+ "X":131,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"R",
+ "tag":42,
+ "device_id":null
+ },
+ "X":168,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"T",
+ "tag":43,
+ "device_id":null
+ },
+ "X":205,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"Y",
+ "tag":44,
+ "device_id":null
+ },
+ "X":242,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"U",
+ "tag":45,
+ "device_id":null
+ },
+ "X":279,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"I",
+ "tag":46,
+ "device_id":null
+ },
+ "X":316,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"O",
+ "tag":47,
+ "device_id":null
+ },
+ "X":353,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"P",
+ "tag":48,
+ "device_id":null
+ },
+ "X":390,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"{",
+ "tag":49,
+ "device_id":null
+ },
+ "X":427,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"}",
+ "tag":50,
+ "device_id":null
+ },
+ "X":464,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"\\",
+ "tag":51,
+ "device_id":null
+ },
+ "X":501,
+ "Y":74,
+ "Width":47,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"DEL",
+ "tag":52,
+ "device_id":null
+ },
+ "X":563,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"END",
+ "tag":53,
+ "device_id":null
+ },
+ "X":600,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"PAGE\r\nDOWN",
+ "tag":54,
+ "device_id":null
+ },
+ "X":637,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"7",
+ "tag":55,
+ "device_id":null
+ },
+ "X":682,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"8",
+ "tag":56,
+ "device_id":null
+ },
+ "X":719,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"9",
+ "tag":57,
+ "device_id":null
+ },
+ "X":756,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"+",
+ "tag":58,
+ "device_id":null
+ },
+ "X":793,
+ "Y":74,
+ "Width":30,
+ "Height":67,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"CAPS\r\nLOCK",
+ "tag":59,
+ "device_id":null
+ },
+ "X":0,
+ "Y":111,
+ "Width":60,
+ "Height":30,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"A",
+ "tag":60,
+ "device_id":null
+ },
+ "X":67,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"S",
+ "tag":61,
+ "device_id":null
+ },
+ "X":104,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"D",
+ "tag":62,
+ "device_id":null
+ },
+ "X":141,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"F",
+ "tag":63,
+ "device_id":null
+ },
+ "X":178,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"G",
+ "tag":64,
+ "device_id":null
+ },
+ "X":215,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"H",
+ "tag":65,
+ "device_id":null
+ },
+ "X":252,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"J",
+ "tag":66,
+ "device_id":null
+ },
+ "X":289,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"K",
+ "tag":67,
+ "device_id":null
+ },
+ "X":326,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"L",
+ "tag":68,
+ "device_id":null
+ },
+ "X":363,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":":",
+ "tag":69,
+ "device_id":null
+ },
+ "X":400,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"\"",
+ "tag":70,
+ "device_id":null
+ },
+ "X":437,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"ENTER",
+ "tag":72,
+ "device_id":null
+ },
+ "X":474,
+ "Y":111,
+ "Width":74,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"4",
+ "tag":73,
+ "device_id":null
+ },
+ "X":681,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"5",
+ "tag":74,
+ "device_id":null
+ },
+ "X":718,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"6",
+ "tag":75,
+ "device_id":null
+ },
+ "X":755,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"SHIFT",
+ "tag":76,
+ "device_id":null
+ },
+ "X":0,
+ "Y":148,
+ "Width":78,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"Z",
+ "tag":78,
+ "device_id":null
+ },
+ "X":85,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"X",
+ "tag":79,
+ "device_id":null
+ },
+ "X":122,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"C",
+ "tag":80,
+ "device_id":null
+ },
+ "X":159,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"V",
+ "tag":81,
+ "device_id":null
+ },
+ "X":196,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"B",
+ "tag":82,
+ "device_id":null
+ },
+ "X":233,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"N",
+ "tag":83,
+ "device_id":null
+ },
+ "X":270,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"M",
+ "tag":84,
+ "device_id":null
+ },
+ "X":307,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"<",
+ "tag":85,
+ "device_id":null
+ },
+ "X":344,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":">",
+ "tag":86,
+ "device_id":null
+ },
+ "X":381,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"?",
+ "tag":87,
+ "device_id":null
+ },
+ "X":418,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"SHIFT",
+ "tag":88,
+ "device_id":null
+ },
+ "X":455,
+ "Y":148,
+ "Width":93,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"↑",
+ "tag":89,
+ "device_id":null
+ },
+ "X":600,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"1",
+ "tag":90,
+ "device_id":null
+ },
+ "X":681,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"2",
+ "tag":91,
+ "device_id":null
+ },
+ "X":718,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"3",
+ "tag":92,
+ "device_id":null
+ },
+ "X":755,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"ENTER",
+ "tag":93,
+ "device_id":null
+ },
+ "X":792,
+ "Y":148,
+ "Width":30,
+ "Height":67,
+ "Image":"",
+ "FontSize":9.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"CTRL",
+ "tag":94,
+ "device_id":null
+ },
+ "X":0,
+ "Y":185,
+ "Width":51,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"WIN",
+ "tag":95,
+ "device_id":null
+ },
+ "X":56,
+ "Y":185,
+ "Width":39,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"ALT",
+ "tag":96,
+ "device_id":null
+ },
+ "X":100,
+ "Y":185,
+ "Width":42,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"SPACE",
+ "tag":97,
+ "device_id":null
+ },
+ "X":149,
+ "Y":185,
+ "Width":208,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"ALT",
+ "tag":98,
+ "device_id":null
+ },
+ "X":362,
+ "Y":185,
+ "Width":41,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"WIN",
+ "tag":99,
+ "device_id":null
+ },
+ "X":408,
+ "Y":185,
+ "Width":41,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"APP",
+ "tag":100,
+ "device_id":null
+ },
+ "X":454,
+ "Y":185,
+ "Width":41,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"CTRL",
+ "tag":101,
+ "device_id":null
+ },
+ "X":500,
+ "Y":185,
+ "Width":48,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"←",
+ "tag":102,
+ "device_id":null
+ },
+ "X":563,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"↓",
+ "tag":103,
+ "device_id":null
+ },
+ "X":600,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"→",
+ "tag":104,
+ "device_id":null
+ },
+ "X":637,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":"0",
+ "tag":105,
+ "device_id":null
+ },
+ "X":681,
+ "Y":185,
+ "Width":67,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ },
+ {
+ "Key":{
+ "visual_name":".",
+ "tag":106,
+ "device_id":null
+ },
+ "X":755,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "FontSize":12.0,
+ "Enabled":true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json
new file mode 100644
index 000000000..8d00a4633
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json
@@ -0,0 +1,1581 @@
+{
+ "layout_width":800,
+ "layout_height":400,
+ "keys":[
+ {
+ "Key":{
+ "visual_name":"ESC",
+ "tag":1,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F1",
+ "tag":2,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":62,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F2",
+ "tag":3,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":99,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F3",
+ "tag":4,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":136,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F4",
+ "tag":5,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":173,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F5",
+ "tag":6,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":237,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F6",
+ "tag":7,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":274,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F7",
+ "tag":8,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":311,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F8",
+ "tag":9,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":348,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F9",
+ "tag":10,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":407,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F10",
+ "tag":11,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":444,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F11",
+ "tag":12,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":481,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F12",
+ "tag":13,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":518,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PRINT",
+ "tag":14,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":562,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SCRL\r\nLOCK",
+ "tag":15,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":599,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PAUSE",
+ "tag":16,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":636,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"`",
+ "tag":17,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"1",
+ "tag":18,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":37,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"2",
+ "tag":19,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":74,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"3",
+ "tag":20,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":111,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"4",
+ "tag":21,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":148,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"5",
+ "tag":22,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":185,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"6",
+ "tag":23,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":222,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"7",
+ "tag":24,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":259,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"8",
+ "tag":25,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":296,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"9",
+ "tag":26,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":333,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"0",
+ "tag":27,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":370,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"-",
+ "tag":28,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":407,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"=",
+ "tag":29,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":444,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"BACKSPACE",
+ "tag":30,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":481,
+ "Y":37,
+ "Width":67,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"INSERT",
+ "tag":31,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":562,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"HOME",
+ "tag":32,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":599,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PAGE\r\nUP",
+ "tag":33,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":636,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"NUM\r\nLOCK",
+ "tag":34,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":680,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"/",
+ "tag":35,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"*",
+ "tag":36,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"-",
+ "tag":37,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":791,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"TAB",
+ "tag":38,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":74,
+ "Width":50,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"Q",
+ "tag":39,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":57,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"W",
+ "tag":40,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":94,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"E",
+ "tag":41,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":131,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"R",
+ "tag":42,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":168,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"T",
+ "tag":43,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":205,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"Y",
+ "tag":44,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":242,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"U",
+ "tag":45,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":279,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"I",
+ "tag":46,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":316,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"O",
+ "tag":47,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":353,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"P",
+ "tag":48,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":390,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"{",
+ "tag":49,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":427,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"}",
+ "tag":50,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":464,
+ "Y":74,
+ "Width":40,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"DEL",
+ "tag":52,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":562,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"END",
+ "tag":53,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":599,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PAGE\r\nDOWN",
+ "tag":54,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":636,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"7",
+ "tag":55,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"8",
+ "tag":56,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"9",
+ "tag":57,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"+",
+ "tag":58,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":791,
+ "Y":74,
+ "Width":30,
+ "Height":67,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"CAPS\r\nLOCK",
+ "tag":59,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":0,
+ "Y":111,
+ "Width":60,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"A",
+ "tag":60,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":67,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"S",
+ "tag":61,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":104,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"D",
+ "tag":62,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":141,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F",
+ "tag":63,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":178,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"G",
+ "tag":64,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":215,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"H",
+ "tag":65,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":252,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"J",
+ "tag":66,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":289,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"K",
+ "tag":67,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":326,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"L",
+ "tag":68,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":363,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":":",
+ "tag":69,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":400,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"'",
+ "tag":70,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":437,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"#",
+ "tag":71,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":474,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ENTER",
+ "tag":72,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":511,
+ "Y":74,
+ "Width":38,
+ "Height":67,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"4",
+ "tag":73,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"5",
+ "tag":74,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"6",
+ "tag":75,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SHIFT",
+ "tag":76,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":148,
+ "Width":48,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"\\",
+ "tag":77,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":55,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"Z",
+ "tag":78,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":92,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"X",
+ "tag":79,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":129,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"C",
+ "tag":80,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":166,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"V",
+ "tag":81,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":203,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"B",
+ "tag":82,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":240,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"N",
+ "tag":83,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":277,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"M",
+ "tag":84,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":314,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"<",
+ "tag":85,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":351,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":">",
+ "tag":86,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":388,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"?",
+ "tag":87,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":425,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SHIFT",
+ "tag":88,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":462,
+ "Y":148,
+ "Width":87,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"↑",
+ "tag":89,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":598,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"1",
+ "tag":90,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"2",
+ "tag":91,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"3",
+ "tag":92,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ENTER",
+ "tag":93,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":791,
+ "Y":148,
+ "Width":30,
+ "Height":67,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"CTRL",
+ "tag":94,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":185,
+ "Width":51,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"WIN",
+ "tag":95,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":56,
+ "Y":185,
+ "Width":39,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ALT",
+ "tag":96,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":100,
+ "Y":185,
+ "Width":42,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SPACE",
+ "tag":97,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":149,
+ "Y":185,
+ "Width":208,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ALT Gr",
+ "tag":98,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":362,
+ "Y":185,
+ "Width":41,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"WIN",
+ "tag":99,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":408,
+ "Y":185,
+ "Width":41,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"APP",
+ "tag":100,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":454,
+ "Y":185,
+ "Width":40,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"CTRL",
+ "tag":101,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":499,
+ "Y":185,
+ "Width":50,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"←",
+ "tag":102,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":561,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"↓",
+ "tag":103,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":598,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"→",
+ "tag":104,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":635,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"0",
+ "tag":105,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":185,
+ "Width":67,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":".",
+ "tag":106,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/jpn_layout.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/jpn_layout.json
new file mode 100644
index 000000000..3e0d7770d
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/jpn_layout.json
@@ -0,0 +1,1626 @@
+{
+ "layout_width":0,
+ "layout_height":0,
+ "keys":[
+ {
+ "Key":{
+ "visual_name":"ESC",
+ "tag":1,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F1",
+ "tag":2,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":62,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F2",
+ "tag":3,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":99,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F3",
+ "tag":4,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":136,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F4",
+ "tag":5,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":173,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F5",
+ "tag":6,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":237,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F6",
+ "tag":7,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":274,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F7",
+ "tag":8,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":311,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F8",
+ "tag":9,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":348,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F9",
+ "tag":10,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":407,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F10",
+ "tag":11,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":444,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F11",
+ "tag":12,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":481,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F12",
+ "tag":13,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":518,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PRINT",
+ "tag":14,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":562,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SCRL\r\nLOCK",
+ "tag":15,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":599,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PAUSE",
+ "tag":16,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":636,
+ "Y":0,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"半角/\r\n全角",
+ "tag":17,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":0,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"1",
+ "tag":18,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":37,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"2",
+ "tag":19,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":74,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"3",
+ "tag":20,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":111,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"4",
+ "tag":21,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":148,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"5",
+ "tag":22,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":185,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"6",
+ "tag":23,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":222,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"7",
+ "tag":24,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":259,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"8",
+ "tag":25,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":296,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"9",
+ "tag":26,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":333,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"0",
+ "tag":27,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":370,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"-",
+ "tag":28,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":407,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"^",
+ "tag":29,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":444,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"¥",
+ "tag":156,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":481,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"BACK",
+ "tag":30,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":518,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"INSERT",
+ "tag":31,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":562,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"HOME",
+ "tag":32,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":599,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PAGE\r\nUP",
+ "tag":33,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":636,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"NUM\r\nLOCK",
+ "tag":34,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":680,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"/",
+ "tag":35,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"*",
+ "tag":36,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"-",
+ "tag":37,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":791,
+ "Y":37,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"TAB",
+ "tag":38,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":74,
+ "Width":50,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"Q",
+ "tag":39,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":57,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"W",
+ "tag":40,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":94,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"E",
+ "tag":41,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":131,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"R",
+ "tag":42,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":168,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"T",
+ "tag":43,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":205,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"Y",
+ "tag":44,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":242,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"U",
+ "tag":45,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":279,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"I",
+ "tag":46,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":316,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"O",
+ "tag":47,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":353,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"P",
+ "tag":48,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":390,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"@",
+ "tag":49,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":427,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"[",
+ "tag":50,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":464,
+ "Y":74,
+ "Width":40,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"DEL",
+ "tag":52,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":562,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"END",
+ "tag":53,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":599,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"PAGE\r\nDOWN",
+ "tag":54,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":636,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"7",
+ "tag":55,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"8",
+ "tag":56,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"9",
+ "tag":57,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":74,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"+",
+ "tag":58,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":791,
+ "Y":74,
+ "Width":30,
+ "Height":67,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"CAPS\r\nLOCK",
+ "tag":59,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":0,
+ "Y":111,
+ "Width":60,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"A",
+ "tag":60,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":67,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"S",
+ "tag":61,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":104,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"D",
+ "tag":62,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":141,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"F",
+ "tag":63,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":178,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"G",
+ "tag":64,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":215,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"H",
+ "tag":65,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":252,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"J",
+ "tag":66,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":289,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"K",
+ "tag":67,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":326,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"L",
+ "tag":68,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":363,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":";",
+ "tag":69,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":400,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":":",
+ "tag":70,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":437,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"]",
+ "tag":71,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":474,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ENTER",
+ "tag":72,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":511,
+ "Y":74,
+ "Width":38,
+ "Height":67,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"4",
+ "tag":73,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"5",
+ "tag":74,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"6",
+ "tag":75,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":111,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SHIFT",
+ "tag":76,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":148,
+ "Width":85,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"Z",
+ "tag":78,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":92,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"X",
+ "tag":79,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":129,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"C",
+ "tag":80,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":166,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"V",
+ "tag":81,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":203,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"B",
+ "tag":82,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":240,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"N",
+ "tag":83,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":277,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"M",
+ "tag":84,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":314,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"<",
+ "tag":85,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":351,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":">",
+ "tag":86,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":388,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"/",
+ "tag":87,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":425,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"\\",
+ "tag":77,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":462,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SHIFT",
+ "tag":88,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":499,
+ "Y":148,
+ "Width":50,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"↑",
+ "tag":89,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":598,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"1",
+ "tag":90,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"2",
+ "tag":91,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":717,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"3",
+ "tag":92,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":148,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ENTER",
+ "tag":93,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":791,
+ "Y":148,
+ "Width":30,
+ "Height":67,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"CTRL",
+ "tag":94,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":0,
+ "Y":185,
+ "Width":51,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"WIN",
+ "tag":95,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":56,
+ "Y":185,
+ "Width":39,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ALT",
+ "tag":96,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":100,
+ "Y":185,
+ "Width":42,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"無変換",
+ "tag":153,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":147,
+ "Y":185,
+ "Width":42,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"SPACE",
+ "tag":97,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":196,
+ "Y":185,
+ "Width":133,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"変換",
+ "tag":98,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":336,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"カタカナ/\r\nひらがな",
+ "tag":155,
+ "device_id":null
+ },
+ "FontSize":9.0,
+ "Enabled":true,
+ "X":373,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"ALT",
+ "tag":99,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":408,
+ "Y":185,
+ "Width":41,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"APP",
+ "tag":100,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":454,
+ "Y":185,
+ "Width":40,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"CTRL",
+ "tag":101,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":499,
+ "Y":185,
+ "Width":50,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"←",
+ "tag":102,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":561,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"↓",
+ "tag":103,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":598,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"→",
+ "tag":104,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":635,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":"0",
+ "tag":105,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":680,
+ "Y":185,
+ "Width":67,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ },
+ {
+ "Key":{
+ "visual_name":".",
+ "tag":106,
+ "device_id":null
+ },
+ "FontSize":12.0,
+ "Enabled":true,
+ "X":754,
+ "Y":185,
+ "Width":30,
+ "Height":30,
+ "Image":"",
+ "IsImage":false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X.json
new file mode 100644
index 000000000..21b755c2d
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X.json
@@ -0,0 +1,508 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 14,
+ 15,
+ 16,
+ 99
+ ],
+ "key_modifications": {
+ "2": {
+ "VisualName": null,
+ "X": 37,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "3": {
+ "VisualName": null,
+ "X": 74,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "4": {
+ "VisualName": null,
+ "X": 111,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "5": {
+ "VisualName": null,
+ "X": 148,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "6": {
+ "VisualName": null,
+ "X": 185,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "7": {
+ "VisualName": null,
+ "X": 222,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "8": {
+ "VisualName": null,
+ "X": 259,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "9": {
+ "VisualName": null,
+ "X": 296,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "10": {
+ "VisualName": null,
+ "X": 333,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "11": {
+ "VisualName": null,
+ "X": 370,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "12": {
+ "VisualName": null,
+ "X": 407,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "13": {
+ "VisualName": null,
+ "X": 444,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "31": {
+ "VisualName": null,
+ "X": 481,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "32": {
+ "VisualName": "Home",
+ "X": 555,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "33": {
+ "VisualName": "PGUP",
+ "X": 629,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "34": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "35": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "36": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "37": {
+ "VisualName": null,
+ "X": 666,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "51": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": 9.0,
+ "Enabled": null
+ },
+ "52": {
+ "VisualName": null,
+ "X": 518,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "53": {
+ "VisualName": null,
+ "X": 592,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "54": {
+ "VisualName": "PGDN",
+ "X": 666,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "55": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "56": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "57": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "58": {
+ "VisualName": null,
+ "X": 666,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "73": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "74": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "75": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "88": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -37,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "89": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "90": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "91": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "92": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "93": {
+ "VisualName": null,
+ "X": 666,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "94": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -10,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "95": {
+ "VisualName": null,
+ "X": 85,
+ "Y": null,
+ "Width": -9,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "96": {
+ "VisualName": null,
+ "X": 122,
+ "Y": null,
+ "Width": -12,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "97": {
+ "VisualName": null,
+ "X": 159,
+ "Y": null,
+ "Width": -30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "98": {
+ "VisualName": null,
+ "X": 344,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "100": {
+ "VisualName": "App",
+ "X": 381,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "101": {
+ "VisualName": null,
+ "X": 418,
+ "Y": null,
+ "Width": 8,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "102": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "103": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "104": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "105": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": -37,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "106": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "107": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 107,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 48,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550.json
new file mode 100644
index 000000000..4afd44610
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550.json
@@ -0,0 +1,365 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 15,
+ 16,
+ 34,
+ 35,
+ 36,
+ 37,
+ 55,
+ 56,
+ 57,
+ 58,
+ 73,
+ 74,
+ 75,
+ 90,
+ 91,
+ 92,
+ 93,
+ 99,
+ 105,
+ 106
+ ],
+ "key_modifications": {
+ "2": {
+ "VisualName": null,
+ "X": 37,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "3": {
+ "VisualName": null,
+ "X": 74,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "4": {
+ "VisualName": null,
+ "X": 111,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "5": {
+ "VisualName": null,
+ "X": 148,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "6": {
+ "VisualName": null,
+ "X": 185,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "7": {
+ "VisualName": null,
+ "X": 222,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "8": {
+ "VisualName": null,
+ "X": 259,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "9": {
+ "VisualName": null,
+ "X": 296,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "10": {
+ "VisualName": null,
+ "X": 333,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "11": {
+ "VisualName": null,
+ "X": 370,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "12": {
+ "VisualName": null,
+ "X": 407,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "13": {
+ "VisualName": null,
+ "X": 444,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "14": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "31": {
+ "VisualName": null,
+ "X": 481,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "32": {
+ "VisualName": "Home",
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "33": {
+ "VisualName": "PGUP",
+ "X": 555,
+ "Y": 74,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "51": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": 9.0,
+ "Enabled": null
+ },
+ "52": {
+ "VisualName": null,
+ "X": 555,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "53": {
+ "VisualName": null,
+ "X": 555,
+ "Y": 148,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "54": {
+ "VisualName": "PGDN",
+ "X": 555,
+ "Y": 111,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "88": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -37,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "89": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "94": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -10,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "95": {
+ "VisualName": null,
+ "X": 85,
+ "Y": null,
+ "Width": -9,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "96": {
+ "VisualName": null,
+ "X": 122,
+ "Y": null,
+ "Width": -12,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "97": {
+ "VisualName": null,
+ "X": 159,
+ "Y": null,
+ "Width": -30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "98": {
+ "VisualName": null,
+ "X": 344,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "100": {
+ "VisualName": "App",
+ "X": 381,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "101": {
+ "VisualName": null,
+ "X": 418,
+ "Y": null,
+ "Width": 8,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "102": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "103": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "104": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "107": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 107,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 48,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ },
+ "jis_key_modifications": {}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650.json
new file mode 100644
index 000000000..c81b277ab
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650.json
@@ -0,0 +1,473 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 15,
+ 31,
+ 32,
+ 33,
+ 53,
+ 54,
+ 93,
+ 99
+ ],
+ "key_modifications": {
+ "2": {
+ "VisualName": null,
+ "X": 37,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "3": {
+ "VisualName": null,
+ "X": 74,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "4": {
+ "VisualName": null,
+ "X": 111,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "5": {
+ "VisualName": null,
+ "X": 148,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "6": {
+ "VisualName": null,
+ "X": 185,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "7": {
+ "VisualName": null,
+ "X": 222,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "8": {
+ "VisualName": null,
+ "X": 259,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "9": {
+ "VisualName": null,
+ "X": 296,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "10": {
+ "VisualName": null,
+ "X": 333,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "11": {
+ "VisualName": null,
+ "X": 370,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "12": {
+ "VisualName": null,
+ "X": 407,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "13": {
+ "VisualName": null,
+ "X": 444,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "14": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "16": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "34": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "35": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "36": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "37": {
+ "VisualName": null,
+ "X": 592,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "51": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": 9.0,
+ "Enabled": null
+ },
+ "52": {
+ "VisualName": null,
+ "X": 555,
+ "Y": 0,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "55": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "56": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "57": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "58": {
+ "VisualName": null,
+ "X": 629,
+ "Y": 0,
+ "Width": null,
+ "Height": -37,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "73": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "74": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "75": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "88": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -37,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "89": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "90": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "91": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "92": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "94": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -10,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "95": {
+ "VisualName": null,
+ "X": 85,
+ "Y": null,
+ "Width": -9,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "96": {
+ "VisualName": null,
+ "X": 122,
+ "Y": null,
+ "Width": -12,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "97": {
+ "VisualName": null,
+ "X": 159,
+ "Y": null,
+ "Width": -30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "98": {
+ "VisualName": null,
+ "X": 344,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "100": {
+ "VisualName": "App",
+ "X": 381,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "101": {
+ "VisualName": null,
+ "X": 418,
+ "Y": null,
+ "Width": 8,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "102": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "103": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "104": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "105": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": -37,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "106": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "107": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 107,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 48,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+},
+ "jis_key_modifications": {}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/asus_strix_flare.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/asus_strix_flare.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/asus_strix_flare.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/asus_strix_flare.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/asus_strix_scope.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/asus_strix_scope.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/asus_strix_scope.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/asus_strix_scope.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/cooler_master_sk650.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/cooler_master_sk650.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/cooler_master_sk650.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/cooler_master_sk650.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k65.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k65.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k65.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k65.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k68.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k68.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k68.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k68.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k70.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k70.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k70.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k70.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k70_mk2.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k70_mk2.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k70_mk2.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k70_mk2.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k95.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95.json
similarity index 52%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k95.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95.json
index a2459c37e..60eebda8e 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k95.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95.json
@@ -2,7 +2,7 @@
"keys_to_remove": [],
"key_modifications": {},
"included_features": [
- "corsair_k95_left_features.json",
- "corsair_k95_right_features.json"
+ "corsair_k95_right_features.json",
+ "corsair_k95_left_features.json"
]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json
new file mode 100644
index 000000000..25615a03d
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json
@@ -0,0 +1,487 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "139": {
+ "Key": {
+ "visual_name": "MUTE",
+ "tag": 139,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 717,
+ "Y": -37,
+ "Width": 30,
+ "Height": 24,
+ "Image": "",
+ "IsImage": false
+ },
+ "136": {
+ "Key": {
+ "visual_name": "STOP",
+ "tag": 136,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 680,
+ "Y": 0,
+ "Width": 30,
+ "Height": 24,
+ "Image": "",
+ "IsImage": false
+ },
+ "137": {
+ "Key": {
+ "visual_name": "PREV",
+ "tag": 137,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 717,
+ "Y": 0,
+ "Width": 30,
+ "Height": 24,
+ "Image": "",
+ "IsImage": false
+ },
+ "133": {
+ "Key": {
+ "visual_name": "PLAY",
+ "tag": 133,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 754,
+ "Y": 0,
+ "Width": 30,
+ "Height": 24,
+ "Image": "",
+ "IsImage": false
+ },
+ "138": {
+ "Key": {
+ "visual_name": "NEXT",
+ "tag": 138,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 791,
+ "Y": 0,
+ "Width": 30,
+ "Height": 24,
+ "Image": "",
+ "IsImage": false
+ },
+ "142": {
+ "Key": {
+ "visual_name": "",
+ "tag": 142,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -47,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "143": {
+ "Key": {
+ "visual_name": "",
+ "tag": 143,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -1,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "144": {
+ "Key": {
+ "visual_name": "",
+ "tag": 144,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 45,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "145": {
+ "Key": {
+ "visual_name": "",
+ "tag": 145,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 91,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "146": {
+ "Key": {
+ "visual_name": "",
+ "tag": 146,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 137,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "147": {
+ "Key": {
+ "visual_name": "",
+ "tag": 147,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 183,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "148": {
+ "Key": {
+ "visual_name": "",
+ "tag": 148,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 229,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "149": {
+ "Key": {
+ "visual_name": "",
+ "tag": 149,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 275,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "150": {
+ "Key": {
+ "visual_name": "",
+ "tag": 150,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 321,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "151": {
+ "Key": {
+ "visual_name": "",
+ "tag": 151,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 367,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "172": {
+ "Key": {
+ "visual_name": "",
+ "tag": 172,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 413,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "173": {
+ "Key": {
+ "visual_name": "",
+ "tag": 173,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 459,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "174": {
+ "Key": {
+ "visual_name": "",
+ "tag": 174,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 505,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "175": {
+ "Key": {
+ "visual_name": "",
+ "tag": 175,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 551,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "176": {
+ "Key": {
+ "visual_name": "",
+ "tag": 176,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 597,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "177": {
+ "Key": {
+ "visual_name": "",
+ "tag": 177,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 643,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "178": {
+ "Key": {
+ "visual_name": "",
+ "tag": 178,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 689,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "179": {
+ "Key": {
+ "visual_name": "",
+ "tag": 179,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 735,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "180": {
+ "Key": {
+ "visual_name": "",
+ "tag": 180,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 781,
+ "Y": -54,
+ "Width": 46,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "131": {
+ "Key": {
+ "visual_name": "LIGHTS",
+ "tag": 131,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 104,
+ "Y": -37,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "132": {
+ "Key": {
+ "visual_name": "LOCK",
+ "tag": 132,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 141,
+ "Y": -37,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "108": {
+ "Key": {
+ "visual_name": "G1",
+ "tag": 108,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -43,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "109": {
+ "Key": {
+ "visual_name": "G2",
+ "tag": 109,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -43,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "110": {
+ "Key": {
+ "visual_name": "G3",
+ "tag": 110,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -43,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "111": {
+ "Key": {
+ "visual_name": "G4",
+ "tag": 111,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -43,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "112": {
+ "Key": {
+ "visual_name": "G5",
+ "tag": 112,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -43,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "113": {
+ "Key": {
+ "visual_name": "G6",
+ "tag": 113,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": -43,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_sabre.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_sabre.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_sabre.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_sabre.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_strafe.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_strafe.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_strafe.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_strafe.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_strafe_mk2.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_strafe_mk2.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_strafe_mk2.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_strafe_mk2.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/drevo_blademaster.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/drevo_blademaster.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/drevo_blademaster.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/drevo_blademaster.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/ducky_one_2_rgb_tkl.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/ducky_one_2_rgb_tkl.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/ducky_one_2_rgb_tkl.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/ducky_one_2_rgb_tkl.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/ducky_shine_7.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/ducky_shine_7.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/ducky_shine_7.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/ducky_shine_7.json
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json
new file mode 100644
index 000000000..4adb42d18
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json
@@ -0,0 +1,315 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 16,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 73,
+ 74,
+ 75,
+ 90,
+ 91,
+ 92,
+ 93,
+ 99,
+ 100,
+ 105,
+ 106
+ ],
+ "key_modifications": {
+ "2": {
+ "VisualName": null,
+ "X": 37,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "3": {
+ "VisualName": null,
+ "X": 74,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "4": {
+ "VisualName": null,
+ "X": 111,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "5": {
+ "VisualName": null,
+ "X": 148,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "6": {
+ "VisualName": null,
+ "X": 185,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "7": {
+ "VisualName": null,
+ "X": 222,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "8": {
+ "VisualName": null,
+ "X": 259,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "9": {
+ "VisualName": null,
+ "X": 296,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "10": {
+ "VisualName": null,
+ "X": 333,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "11": {
+ "VisualName": null,
+ "X": 370,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "12": {
+ "VisualName": null,
+ "X": 407,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "13": {
+ "VisualName": null,
+ "X": 444,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "14": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "15": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "51": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": 9.0,
+ "Enabled": null
+ },
+ "89": {
+ "VisualName": null,
+ "X": 486,
+ "Y": 185,
+ "Width": null,
+ "Height": -17,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "94": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -10,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "95": {
+ "VisualName": null,
+ "X": 85,
+ "Y": null,
+ "Width": -9,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "96": {
+ "VisualName": null,
+ "X": 122,
+ "Y": null,
+ "Width": -12,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "97": {
+ "VisualName": null,
+ "X": 159,
+ "Y": null,
+ "Width": -30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "98": {
+ "VisualName": null,
+ "X": 344,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "101": {
+ "VisualName": null,
+ "X": 418,
+ "Y": null,
+ "Width": -18,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "102": {
+ "VisualName": null,
+ "X": 455,
+ "Y": null,
+ "Width": -6,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "103": {
+ "VisualName": null,
+ "X": 486,
+ "Y": 202,
+ "Width": null,
+ "Height": -17,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "104": {
+ "VisualName": null,
+ "X": 523,
+ "Y": null,
+ "Width": -6,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "107": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 107,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 381,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "171": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 171,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 48,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json
new file mode 100644
index 000000000..dbed1a2bc
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json
@@ -0,0 +1,468 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 16,
+ 31,
+ 32,
+ 33,
+ 52,
+ 53,
+ 54,
+ 99,
+ 100
+ ],
+ "key_modifications": {
+ "2": {
+ "VisualName": null,
+ "X": 37,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "3": {
+ "VisualName": null,
+ "X": 74,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "4": {
+ "VisualName": null,
+ "X": 111,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "5": {
+ "VisualName": null,
+ "X": 148,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "6": {
+ "VisualName": null,
+ "X": 185,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "7": {
+ "VisualName": null,
+ "X": 222,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "8": {
+ "VisualName": null,
+ "X": 259,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "9": {
+ "VisualName": null,
+ "X": 296,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "10": {
+ "VisualName": null,
+ "X": 333,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "11": {
+ "VisualName": null,
+ "X": 370,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "12": {
+ "VisualName": null,
+ "X": 407,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "13": {
+ "VisualName": null,
+ "X": 444,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "14": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "15": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "34": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "35": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "36": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "37": {
+ "VisualName": null,
+ "X": 666,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "51": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": 9.0,
+ "Enabled": null
+ },
+ "55": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "56": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "57": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "58": {
+ "VisualName": null,
+ "X": 666,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "73": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "74": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "75": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "89": {
+ "VisualName": null,
+ "X": 486,
+ "Y": 185,
+ "Width": null,
+ "Height": -17,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "90": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "91": {
+ "VisualName": null,
+ "X": 592,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "92": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "93": {
+ "VisualName": null,
+ "X": 666,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "94": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -10,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "95": {
+ "VisualName": null,
+ "X": 85,
+ "Y": null,
+ "Width": -9,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "96": {
+ "VisualName": null,
+ "X": 122,
+ "Y": null,
+ "Width": -12,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "97": {
+ "VisualName": null,
+ "X": 159,
+ "Y": null,
+ "Width": -30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "98": {
+ "VisualName": null,
+ "X": 344,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "101": {
+ "VisualName": null,
+ "X": 418,
+ "Y": null,
+ "Width": -18,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "102": {
+ "VisualName": null,
+ "X": 455,
+ "Y": null,
+ "Width": -6,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "103": {
+ "VisualName": null,
+ "X": 486,
+ "Y": 202,
+ "Width": null,
+ "Height": -17,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "104": {
+ "VisualName": null,
+ "X": 523,
+ "Y": null,
+ "Width": -6,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "105": {
+ "VisualName": null,
+ "X": 555,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "106": {
+ "VisualName": null,
+ "X": 629,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "171": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 171,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 48,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "107": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 107,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 381,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/hyperx_alloy_elite_rgb.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/hyperx_alloy_elite_rgb.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/hyperx_alloy_elite_rgb.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/hyperx_alloy_elite_rgb.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_g213.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g213.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_g213.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g213.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_g410.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g410.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_g410.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g410.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_g513.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g513.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_g513.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g513.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_g810.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g810.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_g810.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g810.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_g815.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g815.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_g815.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g815.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_g910.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g910.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_g910.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_g910.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/logitech_gpro.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_gpro.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/logitech_gpro.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/logitech_gpro.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/masterkeys_mk730.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_mk730.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/masterkeys_mk730.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_mk730.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/masterkeys_mk750.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_mk750.json
old mode 100755
new mode 100644
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/masterkeys_mk750.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_mk750.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/masterkeys_pro_l.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_l.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/masterkeys_pro_l.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_l.json
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json
new file mode 100644
index 000000000..8f1bc8568
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json
@@ -0,0 +1,207 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 14,
+ 15,
+ 16,
+ 31,
+ 32,
+ 33,
+ 52,
+ 53,
+ 54,
+ 89,
+ 102,
+ 103,
+ 104
+ ],
+ "key_modifications": {
+ "34": {
+ "VisualName": null,
+ "X": 563,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "35": {
+ "VisualName": null,
+ "X": 600,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "36": {
+ "VisualName": null,
+ "X": 637,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "37": {
+ "VisualName": null,
+ "X": 674,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "55": {
+ "VisualName": null,
+ "X": 563,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "56": {
+ "VisualName": null,
+ "X": 600,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "57": {
+ "VisualName": null,
+ "X": 637,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "58": {
+ "VisualName": null,
+ "X": 674,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "73": {
+ "VisualName": null,
+ "X": 563,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "74": {
+ "VisualName": null,
+ "X": 600,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "75": {
+ "VisualName": null,
+ "X": 637,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "90": {
+ "VisualName": null,
+ "X": 563,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "91": {
+ "VisualName": null,
+ "X": 600,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "92": {
+ "VisualName": null,
+ "X": 637,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "93": {
+ "VisualName": null,
+ "X": 674,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "105": {
+ "VisualName": null,
+ "X": 563,
+ "Y": null,
+ "Width": 30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "106": {
+ "VisualName": null,
+ "X": 637,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "169": {
+ "Key": {
+ "visual_name": "00",
+ "tag": 169,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 600,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/masterkeys_pro_s.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_s.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/masterkeys_pro_s.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_s.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/omen_four_zone.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/omen_four_zone.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/omen_four_zone.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/omen_four_zone.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/omen_sequencer.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/omen_sequencer.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/omen_sequencer.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/omen_sequencer.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/razer_blackwidow.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blackwidow.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/razer_blackwidow.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blackwidow.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/razer_blackwidow_te.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blackwidow_te.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/razer_blackwidow_te.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blackwidow_te.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/razer_blackwidow_x.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blackwidow_x.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/razer_blackwidow_x.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blackwidow_x.json
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json
new file mode 100644
index 000000000..4adb42d18
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json
@@ -0,0 +1,315 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [
+ 16,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 73,
+ 74,
+ 75,
+ 90,
+ 91,
+ 92,
+ 93,
+ 99,
+ 100,
+ 105,
+ 106
+ ],
+ "key_modifications": {
+ "2": {
+ "VisualName": null,
+ "X": 37,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "3": {
+ "VisualName": null,
+ "X": 74,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "4": {
+ "VisualName": null,
+ "X": 111,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "5": {
+ "VisualName": null,
+ "X": 148,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "6": {
+ "VisualName": null,
+ "X": 185,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "7": {
+ "VisualName": null,
+ "X": 222,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "8": {
+ "VisualName": null,
+ "X": 259,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "9": {
+ "VisualName": null,
+ "X": 296,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "10": {
+ "VisualName": null,
+ "X": 333,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "11": {
+ "VisualName": null,
+ "X": 370,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "12": {
+ "VisualName": null,
+ "X": 407,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "13": {
+ "VisualName": null,
+ "X": 444,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "14": {
+ "VisualName": null,
+ "X": 481,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "15": {
+ "VisualName": null,
+ "X": 518,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "51": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": null,
+ "Height": null,
+ "Image": null,
+ "FontSize": 9.0,
+ "Enabled": null
+ },
+ "89": {
+ "VisualName": null,
+ "X": 486,
+ "Y": 185,
+ "Width": null,
+ "Height": -17,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "94": {
+ "VisualName": null,
+ "X": null,
+ "Y": null,
+ "Width": -10,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "95": {
+ "VisualName": null,
+ "X": 85,
+ "Y": null,
+ "Width": -9,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "96": {
+ "VisualName": null,
+ "X": 122,
+ "Y": null,
+ "Width": -12,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "97": {
+ "VisualName": null,
+ "X": 159,
+ "Y": null,
+ "Width": -30,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "98": {
+ "VisualName": null,
+ "X": 344,
+ "Y": null,
+ "Width": -11,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "101": {
+ "VisualName": null,
+ "X": 418,
+ "Y": null,
+ "Width": -18,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "102": {
+ "VisualName": null,
+ "X": 455,
+ "Y": null,
+ "Width": -6,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "103": {
+ "VisualName": null,
+ "X": 486,
+ "Y": 202,
+ "Width": null,
+ "Height": -17,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ },
+ "104": {
+ "VisualName": null,
+ "X": 523,
+ "Y": null,
+ "Width": -6,
+ "Height": null,
+ "Image": null,
+ "FontSize": null,
+ "Enabled": null
+ }
+ },
+ "key_to_add": {
+ "107": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 107,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 381,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ },
+ "171": {
+ "Key": {
+ "visual_name": "FN",
+ "tag": 171,
+ "device_id": null
+ },
+ "FontSize": 9.0,
+ "Enabled": true,
+ "X": 48,
+ "Y": 185,
+ "Width": 30,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/roccat_ryos.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/roccat_ryos.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/roccat_ryos.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/roccat_ryos.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/soundblasterx_vanguardk08.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/soundblasterx_vanguardk08.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/soundblasterx_vanguardk08.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/soundblasterx_vanguardk08.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m750.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m750.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m750.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m750.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m750_tkl.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m750_tkl.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m750_tkl.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m750_tkl.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m800.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m800.json
similarity index 89%
rename from Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m800.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m800.json
index 08c84f7f8..49557166e 100644
--- a/Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m800.json
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m800.json
@@ -33,7 +33,7 @@
}
},
"included_features": [
- "steelseries_apex_m800_left_features.json",
- "steelseries_apex_m800_right_features.json"
+ "steelseries_apex_m800_right_features.json",
+ "steelseries_apex_m800_left_features.json"
]
}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/wooting_one.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/wooting_one.json
old mode 100755
new mode 100644
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/wooting_one.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/wooting_one.json
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/wooting_two.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/wooting_two.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/wooting_two.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/wooting_two.json
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json
new file mode 100644
index 000000000..9526bbcac
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json
@@ -0,0 +1,67 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 128,
+ "Height": 232,
+ "Image": "Asus_Pugio_body.png",
+ "IsImage": true
+ },
+ "161": {
+ "Key": {
+ "visual_name": "Scroll Wheel",
+ "tag": 161,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 56,
+ "Y": 22,
+ "Width": 14,
+ "Height": 41,
+ "Image": "Asus_Pugio_wheel.png",
+ "IsImage": true
+ },
+ "162": {
+ "Key": {
+ "visual_name": "Bottom Light",
+ "tag": 162,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": -1,
+ "Y": 130,
+ "Width": 128,
+ "Height": 103,
+ "Image": "Asus_Pugio_backlights.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 41,
+ "Y": 187,
+ "Width": 46,
+ "Height": 24,
+ "Image": "Asus_Pugio_logo.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json
new file mode 100644
index 000000000..402cfebd1
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json
@@ -0,0 +1,22 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "0": {
+ "Key": {
+ "visual_name": "TOUCHPAD",
+ "tag": 0,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 208,
+ "Height": 30,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json
new file mode 100644
index 000000000..8c99e3f12
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json
@@ -0,0 +1,37 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 153,
+ "Height": 232,
+ "Image": "Corsair_Katar_outline.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 58,
+ "Y": 187,
+ "Width": 35,
+ "Height": 22,
+ "Image": "Corsair_Katar_logo.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json
new file mode 100644
index 000000000..ae34fa393
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json
@@ -0,0 +1,52 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 158,
+ "Height": 232,
+ "Image": "Corsair_M65_outline.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 70,
+ "Y": 156,
+ "Width": 27,
+ "Height": 27,
+ "Image": "Corsair_M65_logo.png",
+ "IsImage": true
+ },
+ "161": {
+ "Key": {
+ "visual_name": "Scroll Wheel",
+ "tag": 161,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 74,
+ "Y": 10,
+ "Width": 21,
+ "Height": 60,
+ "Image": "Corsair_M65_scrollwheel.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_sabre_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Sabre.json
similarity index 100%
rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_sabre_features.json
rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Sabre.json
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json
new file mode 100644
index 000000000..63470335b
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json
@@ -0,0 +1,37 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 90,
+ "Height": 90,
+ "Image": "",
+ "IsImage": false
+ },
+ "0": {
+ "Key": {
+ "visual_name": "Mouse/\r\nHeadset",
+ "tag": 0,
+ "device_id": null
+ },
+ "FontSize": 12.0,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 90,
+ "Height": 90,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json
new file mode 100644
index 000000000..4a7fdc53d
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json
@@ -0,0 +1,37 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 143,
+ "Height": 232,
+ "Image": "Logi_G502_outline.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 30,
+ "Y": 107,
+ "Width": 45,
+ "Height": 65,
+ "Image": "Logi_G502_logo.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json
new file mode 100644
index 000000000..a40cf792a
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json
@@ -0,0 +1,37 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 123,
+ "Height": 232,
+ "Image": "Logi_G900_outline.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 50,
+ "Y": 163,
+ "Width": 22,
+ "Height": 24,
+ "Image": "Logi_G900_logo.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Razer - Mamba TE.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Razer - Mamba TE.json
new file mode 100644
index 000000000..060b347b1
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Razer - Mamba TE.json
@@ -0,0 +1,229 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "tag": -1,
+ "visual_name": "NONE"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 130,
+ "Height": 232,
+ "Image": "Razer_Mamba_TE_outline.png"
+ },
+ "161": {
+ "Key": {
+ "tag": 161,
+ "visual_name": "Scroll Wheel"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 54,
+ "Y": 28,
+ "Width": 16,
+ "Height": 38,
+ "Image": "Razer_Mamba_TE_Scroll_Wheel.png"
+ },
+ "160": {
+ "Key": {
+ "tag": 160,
+ "visual_name": "Peripheral Logo"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 41,
+ "Y": 162,
+ "Width": 38,
+ "Height": 39,
+ "Image": "Razer_Mamba_TE_Logo.png"
+ },
+ "217": {
+ "Key": {
+ "tag": 217,
+ "visual_name": "Left Side 1"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 3,
+ "Y": 46,
+ "Width": 6,
+ "Height": 22,
+ "Image": "Razer_Mamba_TE_L1.png"
+ },
+ "229": {
+ "Key": {
+ "tag": 229,
+ "visual_name": "Right Side 1"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 117,
+ "Y": 48,
+ "Width": 6,
+ "Height": 20,
+ "Image": "Razer_Mamba_TE_R1.png"
+ },
+ "218": {
+ "Key": {
+ "tag": 218,
+ "visual_name": "Left Side 2"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 4,
+ "Y": 67,
+ "Width": 10,
+ "Height": 24,
+ "Image": "Razer_Mamba_TE_L2.png"
+ },
+ "230": {
+ "Key": {
+ "tag": 230,
+ "visual_name": "Right Side 2"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 113,
+ "Y": 67,
+ "Width": 7,
+ "Height": 24,
+ "Image": "Razer_Mamba_TE_R2.png"
+ },
+ "219": {
+ "Key": {
+ "tag": 219,
+ "visual_name": "Left Side 3"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 10,
+ "Y": 90,
+ "Width": 8,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_L3.png"
+ },
+ "231": {
+ "Key": {
+ "tag": 231,
+ "visual_name": "Right Side 3"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 112,
+ "Y": 90,
+ "Width": 6,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_R3.png"
+ },
+ "220": {
+ "Key": {
+ "tag": 220,
+ "visual_name": "Left Side 4"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 13,
+ "Y": 113,
+ "Width": 6,
+ "Height": 24,
+ "Image": "Razer_Mamba_TE_L4.png"
+ },
+ "232": {
+ "Key": {
+ "tag": 232,
+ "visual_name": "Right Side 4"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 112,
+ "Y": 113,
+ "Width": 6,
+ "Height": 24,
+ "Image": "Razer_Mamba_TE_R4.png"
+ },
+ "221": {
+ "Key": {
+ "tag": 221,
+ "visual_name": "Left Side 5"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 10,
+ "Y": 137,
+ "Width": 8,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_L5.png"
+ },
+ "233": {
+ "Key": {
+ "tag": 233,
+ "visual_name": "Right Side 5"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 113,
+ "Y": 137,
+ "Width": 7,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_R5.png"
+ },
+ "222": {
+ "Key": {
+ "tag": 222,
+ "visual_name": "Left Side 6"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 7,
+ "Y": 159,
+ "Width": 7,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_L6.png"
+ },
+ "234": {
+ "Key": {
+ "tag": 234,
+ "visual_name": "Right Side 6"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 114,
+ "Y": 159,
+ "Width": 6,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_R6.png"
+ },
+ "223": {
+ "Key": {
+ "tag": 223,
+ "visual_name": "Left Side 7"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 7,
+ "Y": 181,
+ "Width": 9,
+ "Height": 24,
+ "Image": "Razer_Mamba_TE_L7.png"
+ },
+ "235": {
+ "Key": {
+ "tag": 235,
+ "visual_name": "Right Side 7"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 108,
+ "Y": 180,
+ "Width": 10,
+ "Height": 23,
+ "Image": "Razer_Mamba_TE_R7.png"
+ }
+ },
+ "jis_key_modifications": {}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json
new file mode 100644
index 000000000..b3dc78318
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json
@@ -0,0 +1,262 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 10,
+ "Y": 0,
+ "Width": 200,
+ "Height": 168,
+ "Image": "",
+ "IsImage": false
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Mouse Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 90,
+ "Y": 60,
+ "Width": 50,
+ "Height": 50,
+ "Image": "",
+ "IsImage": false
+ },
+ "201": {
+ "Key": {
+ "visual_name": "",
+ "tag": 201,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "202": {
+ "Key": {
+ "visual_name": "",
+ "tag": 202,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 34,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "203": {
+ "Key": {
+ "visual_name": "",
+ "tag": 203,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 68,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "204": {
+ "Key": {
+ "visual_name": "",
+ "tag": 204,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 101,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "205": {
+ "Key": {
+ "visual_name": "",
+ "tag": 205,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 135,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "206": {
+ "Key": {
+ "visual_name": "",
+ "tag": 206,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 10,
+ "Y": 168,
+ "Width": 40,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "207": {
+ "Key": {
+ "visual_name": "",
+ "tag": 207,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 50,
+ "Y": 168,
+ "Width": 40,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "208": {
+ "Key": {
+ "visual_name": "",
+ "tag": 208,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 90,
+ "Y": 168,
+ "Width": 40,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "209": {
+ "Key": {
+ "visual_name": "",
+ "tag": 209,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 130,
+ "Y": 168,
+ "Width": 40,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "210": {
+ "Key": {
+ "visual_name": "",
+ "tag": 210,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 170,
+ "Y": 168,
+ "Width": 40,
+ "Height": 10,
+ "Image": "",
+ "IsImage": false
+ },
+ "211": {
+ "Key": {
+ "visual_name": "",
+ "tag": 211,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 210,
+ "Y": 135,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "212": {
+ "Key": {
+ "visual_name": "",
+ "tag": 212,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 210,
+ "Y": 101,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "213": {
+ "Key": {
+ "visual_name": "",
+ "tag": 213,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 210,
+ "Y": 68,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "214": {
+ "Key": {
+ "visual_name": "",
+ "tag": 214,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 210,
+ "Y": 34,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ },
+ "215": {
+ "Key": {
+ "visual_name": "",
+ "tag": 215,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 210,
+ "Y": 0,
+ "Width": 10,
+ "Height": 33,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Roccat - Kone Pure.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Roccat - Kone Pure.json
new file mode 100644
index 000000000..a6269a41c
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Roccat - Kone Pure.json
@@ -0,0 +1,34 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "tag": -1,
+ "visual_name": "NONE"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 153,
+ "Height": 232,
+ "Image": "Roccat_Kone_Pure_outline.png"
+ },
+ "160": {
+ "Key": {
+ "tag": 160,
+ "visual_name": "Logo"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 54,
+ "Y": 166,
+ "Width": 66,
+ "Height": 59,
+ "Image": "Roccat_Kone_Pure_logo.png"
+ }
+ },
+ "jis_key_modifications": {}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json
new file mode 100644
index 000000000..fe3db83c4
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json
@@ -0,0 +1,232 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 200,
+ "Height": 168,
+ "Image": "",
+ "IsImage": false
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Mouse Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 75,
+ "Y": 89,
+ "Width": 50,
+ "Height": 50,
+ "Image": "",
+ "IsImage": false
+ },
+ "161": {
+ "Key": {
+ "visual_name": "Scroll Wheel",
+ "tag": 161,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 75,
+ "Y": 29,
+ "Width": 50,
+ "Height": 50,
+ "Image": "",
+ "IsImage": false
+ },
+ "201": {
+ "Key": {
+ "visual_name": "",
+ "tag": 201,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 56,
+ "Width": 16,
+ "Height": 56,
+ "Image": "",
+ "IsImage": false
+ },
+ "202": {
+ "Key": {
+ "visual_name": "",
+ "tag": 202,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 112,
+ "Width": 16,
+ "Height": 56,
+ "Image": "",
+ "IsImage": false
+ },
+ "203": {
+ "Key": {
+ "visual_name": "",
+ "tag": 203,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 16,
+ "Y": 152,
+ "Width": 56,
+ "Height": 16,
+ "Image": "",
+ "IsImage": false
+ },
+ "204": {
+ "Key": {
+ "visual_name": "",
+ "tag": 204,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 72,
+ "Y": 152,
+ "Width": 56,
+ "Height": 16,
+ "Image": "",
+ "IsImage": false
+ },
+ "205": {
+ "Key": {
+ "visual_name": "",
+ "tag": 205,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 127,
+ "Y": 152,
+ "Width": 56,
+ "Height": 16,
+ "Image": "",
+ "IsImage": false
+ },
+ "206": {
+ "Key": {
+ "visual_name": "",
+ "tag": 206,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 185,
+ "Y": 112,
+ "Width": 16,
+ "Height": 56,
+ "Image": "",
+ "IsImage": false
+ },
+ "207": {
+ "Key": {
+ "visual_name": "",
+ "tag": 207,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 185,
+ "Y": 56,
+ "Width": 16,
+ "Height": 56,
+ "Image": "",
+ "IsImage": false
+ },
+ "208": {
+ "Key": {
+ "visual_name": "",
+ "tag": 208,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 185,
+ "Y": 0,
+ "Width": 16,
+ "Height": 56,
+ "Image": "",
+ "IsImage": false
+ },
+ "209": {
+ "Key": {
+ "visual_name": "",
+ "tag": 209,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 127,
+ "Y": 0,
+ "Width": 56,
+ "Height": 16,
+ "Image": "",
+ "IsImage": false
+ },
+ "210": {
+ "Key": {
+ "visual_name": "",
+ "tag": 210,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 72,
+ "Y": 0,
+ "Width": 56,
+ "Height": 16,
+ "Image": "",
+ "IsImage": false
+ },
+ "211": {
+ "Key": {
+ "visual_name": "",
+ "tag": 211,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 16,
+ "Y": 0,
+ "Width": 56,
+ "Height": 16,
+ "Image": "",
+ "IsImage": false
+ },
+ "212": {
+ "Key": {
+ "visual_name": "",
+ "tag": 212,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 16,
+ "Height": 56,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300 HP OMEN Edition.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300 HP OMEN Edition.json
new file mode 100644
index 000000000..f59266f61
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300 HP OMEN Edition.json
@@ -0,0 +1,52 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 128,
+ "Height": 232,
+ "Image": "SteelSeries_Rival_300_outline.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 41,
+ "Y": 177,
+ "Width": 40,
+ "Height": 40,
+ "Image": "Omen_logo.png",
+ "IsImage": true
+ },
+ "161": {
+ "Key": {
+ "visual_name": "Scroll Wheel",
+ "tag": 161,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 53,
+ "Y": 43,
+ "Width": 16,
+ "Height": 31,
+ "Image": "SteelSeries_Rival_300_scrollwheel.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json
new file mode 100644
index 000000000..853945e2f
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json
@@ -0,0 +1,52 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 128,
+ "Height": 232,
+ "Image": "SteelSeries_Rival_300_outline.png",
+ "IsImage": true
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 41,
+ "Y": 177,
+ "Width": 40,
+ "Height": 40,
+ "Image": "SteelSeries_Rival_300_logo.png",
+ "IsImage": true
+ },
+ "161": {
+ "Key": {
+ "visual_name": "Scroll Wheel",
+ "tag": 161,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 53,
+ "Y": 43,
+ "Width": 16,
+ "Height": 31,
+ "Image": "SteelSeries_Rival_300_scrollwheel.png",
+ "IsImage": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Two-zone QcK Mousepad + Mouse.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Two-zone QcK Mousepad + Mouse.json
new file mode 100644
index 000000000..086463bb9
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Two-zone QcK Mousepad + Mouse.json
@@ -0,0 +1,82 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "visual_name": "NONE",
+ "tag": -1,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 200,
+ "Height": 168,
+ "Image": "",
+ "IsImage": false
+ },
+ "160": {
+ "Key": {
+ "visual_name": "Mouse Logo",
+ "tag": 160,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 75,
+ "Y": 89,
+ "Width": 50,
+ "Height": 50,
+ "Image": "",
+ "IsImage": false
+ },
+ "161": {
+ "Key": {
+ "visual_name": "Scroll Wheel",
+ "tag": 161,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 75,
+ "Y": 29,
+ "Width": 50,
+ "Height": 50,
+ "Image": "",
+ "IsImage": false
+ },
+ "201": {
+ "Key": {
+ "visual_name": "",
+ "tag": 201,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 16,
+ "Height": 168,
+ "Image": "",
+ "IsImage": false
+ },
+ "202": {
+ "Key": {
+ "visual_name": "",
+ "tag": 202,
+ "device_id": null
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 185,
+ "Y": 0,
+ "Width": 16,
+ "Height": 168,
+ "Image": "",
+ "IsImage": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Steelseries - Rival 650.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Steelseries - Rival 650.json
new file mode 100644
index 000000000..4e21ef589
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Steelseries - Rival 650.json
@@ -0,0 +1,125 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "-1": {
+ "Key": {
+ "tag": -1,
+ "visual_name": "NONE"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 1,
+ "Y": 0,
+ "Width": 122,
+ "Height": 232,
+ "Image": "SteelSeries_Rival_650_outline.png"
+ },
+ "1": {
+ "Key": {
+ "tag": 1,
+ "visual_name": "NONE"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 52,
+ "Y": 36,
+ "Width": 14,
+ "Height": 36,
+ "Image": "SteelSeries_Rival_650_wheel.png"
+ },
+ "0": {
+ "Key": {
+ "tag": 0,
+ "visual_name": "Logo"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 30,
+ "Y": 170,
+ "Width": 45,
+ "Height": 45,
+ "Image": "SteelSeries_Rival_300_logo.png"
+ },
+ "2": {
+ "Key": {
+ "tag": 2,
+ "visual_name": "L1"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 31,
+ "Y": 103,
+ "Width": 12,
+ "Height": 37,
+ "Image": "SteelSeries_Rival_650_L1.png"
+ },
+ "3": {
+ "Key": {
+ "tag": 3,
+ "visual_name": "L2"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 20,
+ "Y": 138,
+ "Width": 17,
+ "Height": 14,
+ "Image": "SteelSeries_Rival_650_L2.png"
+ },
+ "4": {
+ "Key": {
+ "tag": 4,
+ "visual_name": "L3"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 8,
+ "Y": 151,
+ "Width": 13,
+ "Height": 14,
+ "Image": "SteelSeries_Rival_650_L3.png"
+ },
+ "5": {
+ "Key": {
+ "tag": 5,
+ "visual_name": "R1"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 76,
+ "Y": 103,
+ "Width": 13,
+ "Height": 37,
+ "Image": "SteelSeries_Rival_650_R1.png"
+ },
+ "6": {
+ "Key": {
+ "tag": 6,
+ "visual_name": "R2"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 85,
+ "Y": 139,
+ "Width": 17,
+ "Height": 14,
+ "Image": "SteelSeries_Rival_650_R2.png"
+ },
+ "7": {
+ "Key": {
+ "tag": 7,
+ "visual_name": "R3"
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 98,
+ "Y": 152,
+ "Width": 14,
+ "Height": 14,
+ "Image": "SteelSeries_Rival_650_R3.png"
+ }
+ },
+ "jis_key_modifications": {}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/OtherDevices/Ram.json b/Project-Aurora/Project-Aurora/DeviceLayouts/OtherDevices/Ram.json
new file mode 100644
index 000000000..f8cfa8cf0
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/DeviceLayouts/OtherDevices/Ram.json
@@ -0,0 +1,68 @@
+{
+ "IsNewFormat": true,
+ "keys_to_remove": [],
+ "key_modifications": {},
+ "key_to_add": {
+ "0": {
+ "Key": {
+ "tag": 0,
+ "visual_name": "."
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 0,
+ "Width": 30,
+ "Height": 30
+ },
+ "1": {
+ "Key": {
+ "tag": 1,
+ "visual_name": "."
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 37,
+ "Width": 30,
+ "Height": 30
+ },
+ "2": {
+ "Key": {
+ "tag": 2,
+ "visual_name": "."
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 74,
+ "Width": 30,
+ "Height": 30
+ },
+ "3": {
+ "Key": {
+ "tag": 3,
+ "visual_name": "."
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 111,
+ "Width": 30,
+ "Height": 30
+ },
+ "4": {
+ "Key": {
+ "tag": 4,
+ "visual_name": "."
+ },
+ "FontSize": null,
+ "Enabled": true,
+ "X": 0,
+ "Y": 148,
+ "Width": 30,
+ "Height": 30
+ }
+ },
+ "jis_key_modifications": {}
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/Devices/Asus/AsusDevice.cs b/Project-Aurora/Project-Aurora/Devices/Asus/AsusDevice.cs
index 212293d29..8ed07f8a5 100644
--- a/Project-Aurora/Project-Aurora/Devices/Asus/AsusDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Asus/AsusDevice.cs
@@ -56,6 +56,7 @@ public bool Initialize()
Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_enable_unsupported_version"),
Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_force_initialize"));
isActive = asusHandler.Start();
+
return isActive;
}
@@ -103,7 +104,7 @@ public bool IsPeripheralConnected()
}
///
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
asusHandler.UpdateColors(keyColors);
return true;
diff --git a/Project-Aurora/Project-Aurora/Devices/Asus/AsusHandler.cs b/Project-Aurora/Project-Aurora/Devices/Asus/AsusHandler.cs
index 40034e098..7167e6677 100644
--- a/Project-Aurora/Project-Aurora/Devices/Asus/AsusHandler.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Asus/AsusHandler.cs
@@ -98,7 +98,7 @@ public bool Start()
{
if (AuraSdk == null)
return false;
-
+ //return false;
lock (deviceLock)
{
try
@@ -195,7 +195,7 @@ public void Stop()
}
}
- public void UpdateColors(Dictionary colors)
+ public void UpdateColors(Dictionary colors)
{
lock (deviceLock)
{
diff --git a/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncClaymoreDevice.cs b/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncClaymoreDevice.cs
index e08525e2f..7f705d3bf 100644
--- a/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncClaymoreDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncClaymoreDevice.cs
@@ -13,7 +13,7 @@ public class AsusSyncClaymoreDevice : AuraSyncDevice
public AsusSyncClaymoreDevice(AsusHandler asusHandler, IAuraSyncDevice device, int frameRate = 30) : base(
asusHandler, device, frameRate) { }
- protected override void ApplyColors(Dictionary colors)
+ protected override void ApplyColors(Dictionary colors)
{
if (Global.Configuration.DevicesDisableKeyboard)
return;
@@ -22,8 +22,8 @@ protected override void ApplyColors(Dictionary colors)
{
var light = DeviceKeyToClaymore(i);
- if (colors.ContainsKey(light))
- SetRgbLight(Device.Lights[i], colors[light]);
+ if (colors.ContainsKey((int)light))
+ SetRgbLight(Device.Lights[i], colors[(int)light]);
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncConfiguredDevice.cs b/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncConfiguredDevice.cs
index d92cbfc53..5d0efe68e 100644
--- a/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncConfiguredDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Asus/AsusSyncConfiguredDevice.cs
@@ -19,13 +19,13 @@ public AsusSyncConfiguredDevice(AsusHandler asusHandler, IAuraSyncDevice device,
}
///
- protected override void ApplyColors(Dictionary colors)
+ protected override void ApplyColors(Dictionary colors)
{
lock (configLock)
{
foreach (var keyPair in config.KeyMapper)
{
- if (colors.TryGetValue(keyPair.Value, out var color))
+ if (colors.TryGetValue((int)keyPair.Value, out var color))
SetRgbLight(keyPair.Key, color);
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncDevice.cs b/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncDevice.cs
index 9261c184b..e54c49e53 100644
--- a/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncDevice.cs
@@ -19,10 +19,10 @@ public class AuraSyncDevice : IDisposable
private readonly IAuraSyncDevice device;
public IAuraSyncDevice Device => device;
private readonly AsusHandler asusHandler;
- private readonly ConcurrentQueue> colorQueue = new ConcurrentQueue>();
+ private readonly ConcurrentQueue> colorQueue = new ConcurrentQueue>();
private CancellationTokenSource tokenSource = new CancellationTokenSource();
private readonly int frameRateMillis;
- private readonly DeviceKeys[] defaultKeys = { DeviceKeys.Peripheral, DeviceKeys.Peripheral_Logo, DeviceKeys.SPACE };
+ private readonly int[] defaultKeys = { (int)DeviceKeys.Peripheral, (int)DeviceKeys.Peripheral_Logo, (int)DeviceKeys.SPACE };
private readonly Stopwatch stopwatch = new Stopwatch();
@@ -37,7 +37,7 @@ public AuraSyncDevice(AsusHandler asusHandler, IAuraSyncDevice device, int frame
frameRateMillis = (int)((1f / frameRate) * 1000f);
}
- public void UpdateColors(Dictionary colors)
+ public void UpdateColors(Dictionary colors)
{
if (DeviceType == AsusHandler.AsusDeviceType.Mouse && Global.Configuration.DevicesDisableMouse)
return;
@@ -47,7 +47,7 @@ public void UpdateColors(Dictionary colors)
colorQueue.TryDequeue(out _);
// queue a clone of the colors
- colorQueue.Enqueue(new Dictionary(colors));
+ colorQueue.Enqueue(new Dictionary(colors));
}
public void Start()
@@ -114,7 +114,7 @@ private async void Thread(CancellationToken token)
}
catch (TaskCanceledException)
{
- asusHandler.DisconnectDevice(this);
+ //asusHandler.DisconnectDevice(this);
return;
}
catch (Exception exception)
@@ -132,7 +132,7 @@ private async void Thread(CancellationToken token)
/// Try to apply the aurora color collection to this device
///
/// The colors to apply
- protected virtual void ApplyColors(Dictionary colors)
+ protected virtual void ApplyColors(Dictionary colors)
{
// simple implementation is to assign all colors to DefaultKey
foreach (var defaultKey in defaultKeys)
@@ -163,9 +163,9 @@ protected void SetRgbLight(int index, Color color)
SetRgbLight(device.Lights[index], color);
}
- private Dictionary GetLatestColors()
+ private Dictionary GetLatestColors()
{
- Dictionary colors = null;
+ Dictionary colors = null;
while (colorQueue.Count > 0)
colorQueue.TryDequeue(out colors);
diff --git a/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncKeyboardDevice.cs b/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncKeyboardDevice.cs
index b36c62a0c..291105101 100644
--- a/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncKeyboardDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Asus/AuraSyncKeyboardDevice.cs
@@ -26,7 +26,8 @@ public AuraSyncKeyboardDevice(AsusHandler asusHandler, IAuraSyncKeyboard device,
// BackSlash Key
deviceKeyToKey[DeviceKeys.BACKSLASH_UK] = keyboard.Lights[(int)(4 * keyboard.Width + 1)];
- if (Global.Configuration.KeyboardBrand == Settings.PreferredKeyboard.Asus_Strix_Scope)
+
+ if (Global.Configuration.KeyboardBrand == Settings.PreferredKeyboard.Asus_Strix_Scope) //"Asus_Strix_Scope")
{
// Left Windows Key
deviceKeyToKey[DeviceKeys.LEFT_WINDOWS] = keyboard.Lights[(int)(5 * keyboard.Width + 2)];
@@ -37,14 +38,14 @@ public AuraSyncKeyboardDevice(AsusHandler asusHandler, IAuraSyncKeyboard device,
}
///
- protected override void ApplyColors(Dictionary colors)
+ protected override void ApplyColors(Dictionary colors)
{
if (Global.Configuration.DevicesDisableKeyboard)
return;
foreach (var keyPair in colors)
{
- if (!deviceKeyToKey.TryGetValue(keyPair.Key, out var light))
+ if (!deviceKeyToKey.TryGetValue((DeviceKeys)keyPair.Key, out var light))
continue;
SetRgbLight(light, keyPair.Value);
diff --git a/Project-Aurora/Project-Aurora/Devices/AtmoOrb/AtmoOrbDevice.cs b/Project-Aurora/Project-Aurora/Devices/AtmoOrb/AtmoOrbDevice.cs
index b0424e3f1..864516cd3 100644
--- a/Project-Aurora/Project-Aurora/Devices/AtmoOrb/AtmoOrbDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/AtmoOrb/AtmoOrbDevice.cs
@@ -185,7 +185,7 @@ public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArg
return true;
}
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
throw new NotImplementedException();
}
diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs
new file mode 100644
index 000000000..307ea598e
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs
@@ -0,0 +1,207 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.Linq;
+using System.Runtime.ExceptionServices;
+using System.Security;
+using System.Text;
+using System.Threading.Tasks;
+using Aurora.Settings;
+using Newtonsoft.Json;
+
+namespace Aurora.Devices
+{
+ public enum AuroraDeviceType
+ {
+ Keyboard = 0,
+ Mouse = 1,
+ Unkown = 2,
+ Headset = 3,
+ }
+ public class UniqueDeviceId
+ {
+ public string ConnectorName = "";
+ public string DeviceName { get; set; } = "Generic SDK device";
+ public int Index = 0;
+ [JsonIgnore]
+ public int? ViewPort = null;
+ public UniqueDeviceId()
+ {
+ }
+ public UniqueDeviceId(AuroraDeviceConnector connector, AuroraDevice device)
+ {
+ ConnectorName = connector.GetConnectorName();
+ DeviceName = device.GetDeviceName();
+ }
+ public static bool operator ==(UniqueDeviceId obj1, UniqueDeviceId obj2)
+ {
+ return (!(obj1 is null) && !(obj2 is null)
+ && string.Equals(obj1.ConnectorName, obj2.ConnectorName)
+ && string.Equals(obj1.DeviceName, obj2.DeviceName)
+ && obj1.Index == obj2.Index);
+ }
+
+ public static bool operator !=(UniqueDeviceId obj1, UniqueDeviceId obj2)
+ {
+ return !(obj1 == obj2);
+ }
+ public override bool Equals(object obj)
+ {
+ return this == obj as UniqueDeviceId;
+ }
+
+ }
+ public abstract class AuroraDevice
+ {
+ private readonly Stopwatch Watch = new Stopwatch();
+ private long LastUpdateTime = 0;
+ private bool UpdateIsOngoing = false;
+ private bool DeviceIsConnected = false;
+ private AuroraDeviceConnector connector;
+
+ public UniqueDeviceId id = null;
+ private VariableRegistry variableRegistry;
+
+ public event EventHandler ConnectionHandler;
+ public event EventHandler UpdateFinished;
+ ///
+ /// Is called every frame (30fps). Update the device here
+ ///
+
+ //[HandleProcessCorruptedStateExceptions, SecurityCritical]
+ public async void UpdateDevice(DeviceColorComposition composition)
+ {
+ if (IsConnected())
+ {
+ if (Global.Configuration.DevicesDisabled.Contains(GetType()))
+ {
+ //Initialized when it's supposed to be disabled? SMACK IT!
+ Disconnect();
+ return;
+ }
+
+ if (!UpdateIsOngoing)
+ {
+ UpdateIsOngoing = true;
+ Watch.Restart();
+ try
+ {
+ if (!await Task.Run(() => UpdateDeviceImpl(composition)))
+ {
+ LogError(DeviceName + " device, error when updating device.");
+ }
+ }
+ catch (Exception exc)
+ {
+ LogError(DeviceName + " device, error when updating device. Exception: " + exc.Message);
+ }
+
+
+ Watch.Stop();
+ LastUpdateTime = Watch.ElapsedMilliseconds;
+
+ await Task.Run(() => connector?.DeviceLedUpdateFinished());
+ UpdateFinished.Invoke(this, new EventArgs());
+ UpdateIsOngoing = false;
+ }
+
+ }
+ }
+ protected abstract bool UpdateDeviceImpl(DeviceColorComposition composition);
+
+ public string GetDeviceUpdatePerformance()
+ {
+ return IsConnected() ? LastUpdateTime + " ms" : "";
+ }
+ public async void Connect()
+ {
+ /*if (GetDeviceType() == AuroraDeviceType.Keyboard && Global.Configuration.DevicesDisableKeyboard ||
+ GetDeviceType() == AuroraDeviceType.Mouse && Global.Configuration.DevicesDisableMouse ||
+ GetDeviceType() == AuroraDeviceType.Headset && Global.Configuration.DevicesDisableHeadset)
+ {
+ Disconnect();
+ }
+ else*/
+ {
+ try
+ {
+ if (await Task.Run(() => ConnectImpl()))
+ {
+ ConnectionHandler.Invoke(this, new EventArgs());
+ DeviceIsConnected = true;
+ }
+ }
+ catch (Exception exc)
+ {
+ Global.logger.Info("Device, " + GetDeviceName() + ", throwed exception:" + exc.ToString());
+ }
+ }
+ }
+ protected virtual bool ConnectImpl()
+ {
+ return true;
+ }
+
+ public void Disconnect()
+ {
+ if (IsConnected())
+ {
+ DisconnectImpl();
+ DeviceIsConnected = false;
+ ConnectionHandler.Invoke(this, new EventArgs());
+ }
+ }
+ protected virtual void DisconnectImpl()
+ {
+ }
+
+ public abstract List GetAllDeviceKey();
+
+ protected abstract string DeviceName { get; }
+ public string GetDeviceName() => DeviceName;
+
+ public virtual string GetDeviceDetails() => DeviceName + ": " + (IsConnected() ? "Connected" : "Not connected");
+
+ protected abstract AuroraDeviceType AuroraDeviceType { get; }
+ public AuroraDeviceType GetDeviceType() => AuroraDeviceType;
+
+ public VariableRegistry GetRegisteredVariables()
+ {
+ if (variableRegistry == null)
+ {
+ variableRegistry = new VariableRegistry();
+ RegisterVariables(variableRegistry);
+ }
+ return variableRegistry;
+ }
+ ///
+ /// Only called once when registering variables. Can be empty if not needed
+ ///
+ protected virtual void RegisterVariables(VariableRegistry local)
+ {
+ //purposefully empty, if varibles are needed, this should be overridden
+ }
+
+ public bool IsConnected() => DeviceIsConnected;
+
+ protected void LogInfo(string s) => Global.logger.Info(s);
+
+ protected void LogError(string s) => Global.logger.Error(s);
+
+ protected Color CorrectAlpha(Color clr) => Utils.ColorUtils.CorrectWithAlpha(clr);
+
+ protected VariableRegistry GlobalVarRegistry => Global.Configuration.VarRegistry;
+
+ public void SetConnector(AuroraDeviceConnector connector)
+ {
+ this.connector = connector;
+ }
+ }
+
+ public abstract class AuroraKeyboardDevice : AuroraDevice
+ {
+ protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceType.Keyboard;
+
+ }
+}
diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs
new file mode 100644
index 000000000..7b884b18b
--- /dev/null
+++ b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs
@@ -0,0 +1,242 @@
+using Aurora.Settings;
+using SharpDX.Direct3D11;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Aurora.Devices
+{
+ public class OldAuroraDeviceWrapper : IDevice
+ {
+ AuroraDeviceConnector Connector;
+ public string DeviceName => Connector.GetConnectorName();
+
+ public string DeviceDetails => string.Join(", ", Connector.Devices.Select(d => d.GetDeviceName()));
+
+ public string DeviceUpdatePerformance => string.Join(", ", Connector.Devices.Select(d => d.GetDeviceUpdatePerformance()));
+
+ public bool IsInitialized => Connector.IsInitialized();
+
+ public VariableRegistry RegisteredVariables => Connector.GetRegisteredVariables();
+
+ public OldAuroraDeviceWrapper(AuroraDeviceConnector connector)
+ {
+ Connector = connector;
+ }
+
+ public bool Initialize()
+ {
+ Connector.Initialize();
+ return true;
+ }
+
+ public void Reset()
+ {
+ Connector.Reset();
+ }
+
+ public void Shutdown()
+ {
+ Connector.Shutdown();
+ }
+
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ {
+ return true;
+ }
+
+ public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArgs e, bool forced = false)
+ {
+ return true;
+ }
+ }
+ public abstract class AuroraDeviceConnector
+ {
+ //private Dictionary Devices = new Dictionary();
+ private List devices = new List();
+ public IReadOnlyList Devices => devices.AsReadOnly();
+ private bool isInitialized;
+ public event EventHandler NewSuccessfulInitiation;
+ private int DisconnectedDeviceCount = 0;
+ private int UpdatedDeviceCount = 0;
+ private SemaphoreSlim SingleThread = new SemaphoreSlim(1, 1);
+
+ protected abstract string ConnectorName { get; }
+ public string GetConnectorName() => ConnectorName;
+ public virtual void Reset()
+ {
+ Shutdown();
+ Initialize();
+ }
+ private void RegisterDeviceId (AuroraDevice dev)
+ {
+ UniqueDeviceId id = new UniqueDeviceId(this, dev);
+ while (Devices.Where(d => d.id == id).Any())
+ {
+ id.Index++;
+ }
+ var usedIdConfig = Global.devicesLayout.DevicesConfig.Values.Where(c => c.Id == id);
+ if(!usedIdConfig.Any())
+ {
+ dev.id = id;
+ }
+ else
+ {
+ dev.id = usedIdConfig.First().Id;
+ }
+
+ }
+ protected void RegisterDevice(AuroraDevice device)
+ {
+ device.SetConnector(this);
+ RegisterDeviceId(device);
+ devices.Add(device);
+ Global.Configuration.VarRegistry.Combine(device.GetRegisteredVariables());
+ device.ConnectionHandler += ConnectionHandling;
+ device.UpdateFinished += DeviceUpdated;
+ device.Connect();
+ }
+ public virtual void DeviceLedUpdateFinished()
+ {
+
+ }
+ ///
+ /// Is called first. Initialize the device here
+ ///
+ public async void Initialize()
+ {
+ await SingleThread.WaitAsync();
+
+ if (!IsInitialized() && !Global.Configuration.DevicesDisabled.Contains(GetType()))
+ {
+ Global.logger.Info("Start initializing Connector: " + GetConnectorName());
+ try
+ {
+ /*if (!Global.Configuration.devices_not_first_time.Contains(GetType()))
+ {
+ RunFirstTime();
+ Global.Configuration.devices_not_first_time.Add(GetType());
+ }*/
+ if (await Task.Run(() => InitializeImpl()))
+ {
+ DisconnectedDeviceCount = 0;
+ if (Devices.Any())
+ {
+ isInitialized = true;
+ NewSuccessfulInitiation?.Invoke(this, new EventArgs());
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ Global.logger.Info("Connector, " + GetConnectorName() + ", throwed exception:" + exc.ToString());
+ }
+ Global.logger.Info("Connector, " + GetConnectorName() + ", was" + (IsInitialized() ? "" : " not") + " initialized");
+ }
+ SingleThread.Release();
+
+ }
+
+ protected abstract bool InitializeImpl();
+ protected virtual void RunFirstTime() { }
+
+ private void ConnectionHandling(object sender, EventArgs args)
+ {
+ AuroraDevice device = sender as AuroraDevice;
+ if (device.IsConnected())
+ {
+ DisconnectedDeviceCount--;
+ }
+ else
+ {
+ DisconnectedDeviceCount++;
+ }
+ if (DisconnectedDeviceCount == 0)
+ {
+ Shutdown();
+ }
+ }
+ private void DeviceUpdated(object sender, EventArgs args)
+ {
+ AuroraDevice device = sender as AuroraDevice;
+ UpdatedDeviceCount++;
+ if (UpdatedDeviceCount == Devices.Count)
+ {
+ UpdateDevices();
+ }
+ }
+ protected virtual void UpdateDevices()
+ {
+
+ }
+ ///
+ /// Is called last. Dispose of the devices here
+ ///
+ public async void Shutdown()
+ {
+ await SingleThread.WaitAsync();
+
+ try
+ {
+ if (IsInitialized())
+ {
+ foreach (var device in Devices)
+ {
+ device.Disconnect();
+ }
+ devices.Clear();
+ await Task.Run(() => ShutdownImpl());
+ isInitialized = false;
+ Global.logger.Info("Connector, " + GetConnectorName() + ", was shutdown");
+ }
+ }
+ catch (Exception exc)
+ {
+ Global.logger.Info("Connector, " + GetConnectorName() + ", throwed exception:" + exc.ToString());
+ }
+ SingleThread.Release();
+ }
+
+ protected abstract void ShutdownImpl();
+
+
+ public bool IsInitialized() => isInitialized;
+
+ public string GetConnectorDetails() => isInitialized ?
+ ConnectorName + ": " + ConnectorSubDetails :
+ ConnectorName + ": Not Initialized";
+ protected virtual string ConnectorSubDetails => "Initialized";
+
+ protected void LogInfo(string s) => Global.logger.Info(s);
+ protected void LogError(string s) => Global.logger.Error(s);
+
+ private VariableRegistry variableRegistry;
+ public virtual VariableRegistry GetRegisteredVariables()
+ {
+ if (variableRegistry == null)
+ {
+ variableRegistry = new VariableRegistry();
+ RegisterVariables(variableRegistry);
+ foreach (var dev in Devices)
+ {
+ variableRegistry.Combine(dev.GetRegisteredVariables());
+ }
+ }
+ return variableRegistry;
+ }
+ ///
+ /// Only called once when registering variables. Can be empty if not needed
+ ///
+ protected virtual void RegisterVariables(VariableRegistry local)
+ {
+ //purposefully empty, if varibles are needed, this should be overridden
+ }
+ protected VariableRegistry GlobalVarRegistry => Global.Configuration.VarRegistry;
+
+ }
+}
\ No newline at end of file
diff --git a/Project-Aurora/Project-Aurora/Devices/Bloody/Bloody.cs b/Project-Aurora/Project-Aurora/Devices/Bloody/Bloody.cs
index f7431961a..26ce7abc2 100644
--- a/Project-Aurora/Project-Aurora/Devices/Bloody/Bloody.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Bloody/Bloody.cs
@@ -31,15 +31,15 @@ public override void Shutdown()
IsInitialized = false;
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (!IsInitialized)
return false;
- foreach (var key in keyColors)
+ foreach (var (key, clr) in keyColors)
{
- if (BloodyKeyMap.KeyMap.TryGetValue(key.Key, out var bloodyKey))
- keyboard.SetKeyColor(bloodyKey, ColorUtils.CorrectWithAlpha(key.Value));
+ if (BloodyKeyMap.KeyMap.TryGetValue((DeviceKeys)key, out var bloodyKey))
+ keyboard.SetKeyColor(bloodyKey, ColorUtils.CorrectWithAlpha(clr));
}
return keyboard.Update();
diff --git a/Project-Aurora/Project-Aurora/Devices/Clevo/ClevoDevice.cs b/Project-Aurora/Project-Aurora/Devices/Clevo/ClevoDevice.cs
index 96c629c8f..185c33f94 100644
--- a/Project-Aurora/Project-Aurora/Devices/Clevo/ClevoDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Clevo/ClevoDevice.cs
@@ -129,7 +129,7 @@ public bool IsConnected()
throw new NotImplementedException();
}
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) // Is this necessary?
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) // Is this necessary?
{
throw new NotImplementedException();
}
@@ -140,16 +140,16 @@ public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArg
watch.Restart();
bool update_result = false;
- Dictionary keyColors = colorComposition.keyColors;
+ Dictionary keyColors = colorComposition.keyColors;
if (e.Cancel) return false;
try
{
- foreach (KeyValuePair pair in keyColors)
+ foreach (KeyValuePair pair in keyColors)
{
if (e.Cancel) return false;
if (useGlobalPeriphericColors)
{
- if (pair.Key == DeviceKeys.Peripheral) // This is not working anymore. Was working in MASTER
+ if (pair.Key == (int)DeviceKeys.Peripheral) // This is not working anymore. Was working in MASTER
{
ColorKBLeft = pair.Value;
ColorKBCenter = pair.Value;
@@ -161,7 +161,7 @@ public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArg
else
{
// TouchPad (It would be nice to have a Touchpad Peripheral)
- if (pair.Key == DeviceKeys.Peripheral)
+ if (pair.Key == (int)DeviceKeys.Peripheral)
{
ColorTouchpad = pair.Value;
ColorUpdated = true;
diff --git a/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs b/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs
index 30b0564b1..ed1f3aee0 100755
--- a/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs
@@ -54,7 +54,7 @@ public override void Shutdown()
IsInitialized = false;
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
foreach (var (dev, colors) in InitializedDevices)
{
@@ -75,11 +75,12 @@ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventAr
foreach (var (dk, clr) in keyColors)
{
- DK key = dk;
+ DK key = (DeviceKeys)dk;
//HACK: the layouts for some reason switch backslash and enter
//around between ANSI and ISO needlessly. We swap them around here
- if (key == DK.ENTER && !Global.kbLayout.Loaded_Localization.IsANSI())
- key = DK.BACKSLASH;
+ //TODO fix it to work
+ /*if (key == DK.ENTER && !Global.kbLayout.Loaded_Localization.IsANSI())
+ key = DK.BACKSLASH;*/
if (dict.TryGetValue(key, out var position))
colors.KeyColor[position.row, position.column] = new Native.KEY_COLOR(ColorUtils.CorrectWithAlpha(clr));
diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs
index 567319e5e..83cd3f879 100644
--- a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs
@@ -1,8 +1,5 @@
using Aurora.Settings;
using Aurora.Utils;
-using CorsairRGB.NET;
-using CorsairRGB.NET.Enums;
-using CorsairRGB.NET.Structures;
using Mono.CSharp;
using System;
using System.Collections.Generic;
@@ -10,156 +7,174 @@
using System.Drawing;
using System.Linq;
using System.Text;
-using CUESDK = CorsairRGB.NET.CUE;
+using Corsair.CUE.SDK;
+using IronPython.Runtime;
+using SharpDX.Direct3D11;
+using System.Threading;
+using Aurora.Profiles.Discord.GSI.Nodes;
+using NLog.Fluent;
namespace Aurora.Devices.Corsair
{
- public class CorsairDevice : DefaultDevice
+ public class CorsairDeviceConnector : AuroraDeviceConnector
{
- public override string DeviceName => "Corsair";
-
- protected override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.Model));
-
- private readonly List deviceInfos = new List();
-
- public override bool Initialize()
+ private SemaphoreSlim allDeviceUpdated;
+ protected override string ConnectorName => "Corsair";
+ private int deviceWaitCounter = 0;
+ protected override bool InitializeImpl()
{
- CUESDK.PerformProtocolHandshake();
- var error = CUESDK.GetLastError();
- if (error != CorsairError.Success)
+ CUESDK.CorsairPerformProtocolHandshake();
+
+ var error = CUESDK.CorsairGetLastError();
+ if (error != CorsairError.CE_Success)
{
LogError("Error: " + error);
- return IsInitialized = false;
+ return false;
}
+ allDeviceUpdated = new SemaphoreSlim(0, 1);
- for (int i = 0; i < CUESDK.GetDeviceCount(); i++)
- deviceInfos.Add(CUESDK.GetDeviceInfo(i));
+ for (int i = 0; i < CUESDK.CorsairGetDeviceCount(); i++)
+ {
+ RegisterDevice(CreateDevice(CUESDK.CorsairGetDeviceInfo(i), i));
+ }
- if (Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_exclusive") && !CUESDK.RequestControl())
+ if (Global.Configuration.VarRegistry.GetVariable($"{ConnectorName}_exclusive") && !CUESDK.CorsairRequestControl(CorsairAccessMode.CAM_ExclusiveLightingControl))
{
- LogError("Error requesting cuesdk exclusive control:" + CUESDK.GetLastError());
+ LogError("Error requesting cuesdk exclusive control:" + CUESDK.CorsairGetLastError());
}
- CUESDK.SetLayerPriority(255);
+ CUESDK.CorsairSetLayerPriority(255);
- return IsInitialized = true;
+ return true;
+ }
+ private CorsairDevice CreateDevice(CorsairDeviceInfo info, int index)
+ {
+ switch (info.type)
+ {
+ case CorsairDeviceType.CDT_Keyboard:
+ return new CorsairKeyboard(info, index);
+ case CorsairDeviceType.CDT_Mouse:
+ case CorsairDeviceType.CDT_MouseMat:
+ return new CorsairDevice(info, index, AuroraDeviceType.Mouse);
+ case CorsairDeviceType.CDT_Headset:
+ case CorsairDeviceType.CDT_HeadsetStand:
+ return new CorsairDevice(info, index, AuroraDeviceType.Headset);
+ case CorsairDeviceType.CDT_CommanderPro:
+ case CorsairDeviceType.CDT_LightingNodePro:
+ case CorsairDeviceType.CDT_MemoryModule:
+ case CorsairDeviceType.CDT_Cooler:
+ case CorsairDeviceType.CDT_Motherboard:
+ case CorsairDeviceType.CDT_GraphicsCard:
+ default:
+ return new CorsairDevice(info, index);
+ }
}
- public override void Shutdown()
+ protected override void ShutdownImpl()
{
- CUESDK.SetLayerPriority(0);
- deviceInfos.Clear();
- CUESDK.ReleaseControl();
- IsInitialized = false;
+ CUESDK.CorsairSetLayerPriority(0);
+ CUESDK.CorsairReleaseControl(CorsairAccessMode.CAM_ExclusiveLightingControl);
+ allDeviceUpdated.Dispose();
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override void DeviceLedUpdateFinished()
{
- if (deviceInfos.Count != CUESDK.GetDeviceCount())
+ if (Devices.Count != CUESDK.CorsairGetDeviceCount())
+ {
this.Reset();
+ return;
+ }
- for (int i = 0; i < deviceInfos.Count; i++)
+ deviceWaitCounter++;
+ if (deviceWaitCounter != Devices.Where(d => d.id.ViewPort != null).ToList().Count)
{
- var deviceInfo = deviceInfos[i];
- if (deviceInfo.Type == CorsairDeviceType.Keyboard && Global.Configuration.DevicesDisableKeyboard)
- continue;
+ allDeviceUpdated.Wait();
+ return;
+ }
+ CUESDK.CorsairSetLedsColorsFlushBuffer();
+ allDeviceUpdated.Release();
+ allDeviceUpdated = new SemaphoreSlim(0, 1);
+ deviceWaitCounter = 0;
+ }
+ protected override void RegisterVariables(VariableRegistry variableRegistry)
+ {
+ variableRegistry.Register($"{ConnectorName}_exclusive", false, "Request exclusive control");
+ }
+ }
- if ((deviceInfo.Type == CorsairDeviceType.Mouse || deviceInfo.Type == CorsairDeviceType.MouseMat)
- && Global.Configuration.DevicesDisableMouse)
- continue;
- if ((deviceInfo.Type == CorsairDeviceType.Headset || deviceInfo.Type == CorsairDeviceType.HeadsetStand)
- && Global.Configuration.DevicesDisableHeadset)
- continue;
+ public class CorsairDevice : AuroraDevice
+ {
+ protected override string DeviceName => deviceInfo.model;
- List colors = new List();
+ protected List colors = new List();
+ private AuroraDeviceType type;
+ protected override AuroraDeviceType AuroraDeviceType => type;
- if (LedMaps.MapsMap.TryGetValue(deviceInfo.Type, out var dict) && dict.Count != 0)
- {
- foreach (var led in keyColors)
- {
- if (dict.TryGetValue(led.Key, out var ledid))
- {
- colors.Add(new CorsairLedColor()
- {
- LedId = ledid,
- R = led.Value.R,
- G = led.Value.G,
- B = led.Value.B
- });
- }
- }
- }
- else
- {
- if (keyColors.TryGetValue(DeviceKeys.Peripheral_Logo, out var clr))
- {
- if(deviceInfo.Type == CorsairDeviceType.LightingNodePro || deviceInfo.Type == CorsairDeviceType.CommanderPro)
- {
- int totalLeds = 0;
- for (int j = 0; j < deviceInfo.Channels.ChannelsCount; j++)
- {
- totalLeds += deviceInfo.Channels.Channels[j].TotalLedsCount;
- foreach (var ledid in LedMaps.ChannelLeds[j])
- {
- if (colors.Count == totalLeds)
- continue;
-
- colors.Add(new CorsairLedColor()
- {
- LedId = ledid,
- R = clr.R,
- G = clr.G,
- B = clr.B
- });
- }
- }
- }
- else
- {
- CorsairLedId initial = GetInitialLedIdForDeviceType(deviceInfo.Type);
-
- if (initial == CorsairLedId.I_Invalid)
- continue;
-
- for(int j = 0; j < deviceInfo.LedsCount; j++)
- {
- colors.Add(new CorsairLedColor()
- {
- LedId = initial++,
- R = clr.R,
- G = clr.G,
- B = clr.B
- });
- }
- }
- }
- }
+ protected CorsairDeviceInfo deviceInfo;
+ protected int deviceIndex;
+ protected Dictionary KeyMapping = new Dictionary(new DeviceKey.EqualityComparer());
- if (colors.Count == 0)
- continue;
+ protected CorsairDevice() {}
+ public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, AuroraDeviceType type = AuroraDeviceType.Unkown)
+ {
+ this.deviceInfo = deviceInfo;
+ deviceIndex = index;
+ this.type = type;
+ var ledPositions = CUESDK.CorsairGetLedPositionsByDeviceIndex(deviceIndex);
- CUESDK.SetDeviceColors(i, colors.ToArray());
+ int overIndex = 0;
+ foreach (var pos in ledPositions.pLedPosition)
+ {
+ KeyMapping[new DeviceKey(overIndex++, pos.ledId.ToString())] = pos.ledId;
+ colors.Add(new CorsairLedColor { ledId = pos.ledId });
}
-
- return CUESDK.Update();
}
-
- private CorsairLedId GetInitialLedIdForDeviceType(CorsairDeviceType type)
+ protected override bool UpdateDeviceImpl(DeviceColorComposition composition)
{
- return type switch
+ List colors = new List();
+ foreach (var (key, clr) in composition.keyColors)
{
- CorsairDeviceType.Headset => CorsairLedId.H_LeftLogo,
- CorsairDeviceType.MemoryModule => CorsairLedId.DRAM_1,
- CorsairDeviceType.Cooler => CorsairLedId.LC_C1_1,
- CorsairDeviceType.Motherboard => CorsairLedId.MB_Zone1,
- CorsairDeviceType.GraphicsCard => CorsairLedId.GPU_Zone1,
- _ => CorsairLedId.I_Invalid
- };
+ if (KeyMapping.TryGetValue(key, out var ledid))
+ {
+ colors.Add(new CorsairLedColor()
+ {
+ ledId = ledid,
+ r = clr.R,
+ g = clr.G,
+ b = clr.B
+ });
+ }
+ }
+ CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, colors.Count, colors.ToArray());
+ return true;
}
- protected override void RegisterVariables(VariableRegistry variableRegistry)
+
+ public override List GetAllDeviceKey() => KeyMapping.Keys.ToList();
+ }
+ public class CorsairKeyboard : CorsairDevice
+ {
+ protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceType.Keyboard;
+
+ public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index)
{
- variableRegistry.Register($"{DeviceName}_exclusive", false, "Request exclusive control");
+ this.deviceInfo = deviceInfo;
+ deviceIndex = index;
+ var ledPositions = CUESDK.CorsairGetLedPositionsByDeviceIndex(deviceIndex);
+ int overIndex = 0;
+ foreach (var pos in ledPositions.pLedPosition)
+ {
+ if (LedMaps.KeyboardLedMap.TryGetValue(pos.ledId, out var dk))
+ {
+ KeyMapping[new DeviceKey(dk)] = pos.ledId;
+ }
+ else
+ {
+ KeyMapping[new DeviceKey(500 + overIndex++, pos.ledId.ToString())] = pos.ledId;
+ }
+ colors.Add(new CorsairLedColor { ledId = pos.ledId });
+ }
+
}
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs
index 5229f910f..6f7e98195 100644
--- a/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs
@@ -4,188 +4,188 @@
using System.Text;
using System.Threading.Tasks;
using Aurora.Utils;
-using CorsairRGB.NET.Enums;
-using CorsairRGB.NET.Structures;
+using Corsair.CUE.SDK;
namespace Aurora.Devices.Corsair
{
internal static class LedMaps
{
- internal static readonly Dictionary KeyboardLedMap = new Dictionary()
+ internal static readonly Dictionary KeyboardLedMap = new Dictionary()
{
- [DeviceKeys.ESC] = CorsairLedId.K_Escape,
- [DeviceKeys.F1] = CorsairLedId.K_F1,
- [DeviceKeys.F2] = CorsairLedId.K_F2,
- [DeviceKeys.F3] = CorsairLedId.K_F3,
- [DeviceKeys.F4] = CorsairLedId.K_F4,
- [DeviceKeys.F5] = CorsairLedId.K_F5,
- [DeviceKeys.F6] = CorsairLedId.K_F6,
- [DeviceKeys.F7] = CorsairLedId.K_F7,
- [DeviceKeys.F8] = CorsairLedId.K_F8,
- [DeviceKeys.F9] = CorsairLedId.K_F9,
- [DeviceKeys.F10] = CorsairLedId.K_F10,
- [DeviceKeys.F11] = CorsairLedId.K_F11,
- [DeviceKeys.TILDE] = CorsairLedId.K_GraveAccentAndTilde,
- [DeviceKeys.ONE] = CorsairLedId.K_1,
- [DeviceKeys.TWO] = CorsairLedId.K_2,
- [DeviceKeys.THREE] = CorsairLedId.K_3,
- [DeviceKeys.FOUR] = CorsairLedId.K_4,
- [DeviceKeys.FIVE] = CorsairLedId.K_5,
- [DeviceKeys.SIX] = CorsairLedId.K_6,
- [DeviceKeys.SEVEN] = CorsairLedId.K_7,
- [DeviceKeys.EIGHT] = CorsairLedId.K_8,
- [DeviceKeys.NINE] = CorsairLedId.K_9,
- [DeviceKeys.ZERO] = CorsairLedId.K_0,
- [DeviceKeys.MINUS] = CorsairLedId.K_MinusAndUnderscore,
- [DeviceKeys.TAB] = CorsairLedId.K_Tab,
- [DeviceKeys.Q] = CorsairLedId.K_Q,
- [DeviceKeys.W] = CorsairLedId.K_W,
- [DeviceKeys.E] = CorsairLedId.K_E,
- [DeviceKeys.R] = CorsairLedId.K_R,
- [DeviceKeys.T] = CorsairLedId.K_T,
- [DeviceKeys.Y] = CorsairLedId.K_Y,
- [DeviceKeys.U] = CorsairLedId.K_U,
- [DeviceKeys.I] = CorsairLedId.K_I,
- [DeviceKeys.O] = CorsairLedId.K_O,
- [DeviceKeys.P] = CorsairLedId.K_P,
- [DeviceKeys.OPEN_BRACKET] = CorsairLedId.K_BracketLeft,
- [DeviceKeys.CAPS_LOCK] = CorsairLedId.K_CapsLock,
- [DeviceKeys.A] = CorsairLedId.K_A,
- [DeviceKeys.S] = CorsairLedId.K_S,
- [DeviceKeys.D] = CorsairLedId.K_D,
- [DeviceKeys.F] = CorsairLedId.K_F,
- [DeviceKeys.G] = CorsairLedId.K_G,
- [DeviceKeys.H] = CorsairLedId.K_H,
- [DeviceKeys.J] = CorsairLedId.K_J,
- [DeviceKeys.K] = CorsairLedId.K_K,
- [DeviceKeys.L] = CorsairLedId.K_L,
- [DeviceKeys.SEMICOLON] = CorsairLedId.K_SemicolonAndColon,
- [DeviceKeys.APOSTROPHE] = CorsairLedId.K_ApostropheAndDoubleQuote,
- [DeviceKeys.LEFT_SHIFT] = CorsairLedId.K_LeftShift,
- [DeviceKeys.BACKSLASH_UK] = CorsairLedId.K_NonUsBackslash,
- [DeviceKeys.Z] = CorsairLedId.K_Z,
- [DeviceKeys.X] = CorsairLedId.K_X,
- [DeviceKeys.C] = CorsairLedId.K_C,
- [DeviceKeys.V] = CorsairLedId.K_V,
- [DeviceKeys.B] = CorsairLedId.K_B,
- [DeviceKeys.N] = CorsairLedId.K_N,
- [DeviceKeys.M] = CorsairLedId.K_M,
- [DeviceKeys.COMMA] = CorsairLedId.K_CommaAndLessThan,
- [DeviceKeys.PERIOD] = CorsairLedId.K_PeriodAndBiggerThan,
- [DeviceKeys.FORWARD_SLASH] = CorsairLedId.K_SlashAndQuestionMark,
- [DeviceKeys.LEFT_CONTROL] = CorsairLedId.K_LeftCtrl,
- [DeviceKeys.LEFT_WINDOWS] = CorsairLedId.K_LeftGui,
- [DeviceKeys.LEFT_ALT] = CorsairLedId.K_LeftAlt,
- //[DeviceKeys.Lang2] = CorsairLedId.K_Lang2,
- [DeviceKeys.SPACE] = CorsairLedId.K_Space,
- //[DeviceKeys.Lang1] = CorsairLedId.K_Lang1,
- //[DeviceKeys.International2] = CorsairLedId.K_International2,
- [DeviceKeys.RIGHT_ALT] = CorsairLedId.K_RightAlt,
- [DeviceKeys.RIGHT_WINDOWS] = CorsairLedId.K_RightGui,
- [DeviceKeys.APPLICATION_SELECT] = CorsairLedId.K_Application,
- //[DeviceKeys.LedProgramming] = CorsairLedId.K_LedProgramming,
- [DeviceKeys.BRIGHTNESS_SWITCH] = CorsairLedId.K_Brightness,
- [DeviceKeys.F12] = CorsairLedId.K_F12,
- [DeviceKeys.PRINT_SCREEN] = CorsairLedId.K_PrintScreen,
- [DeviceKeys.SCROLL_LOCK] = CorsairLedId.K_ScrollLock,
- [DeviceKeys.PAUSE_BREAK] = CorsairLedId.K_PauseBreak,
- [DeviceKeys.INSERT] = CorsairLedId.K_Insert,
- [DeviceKeys.HOME] = CorsairLedId.K_Home,
- [DeviceKeys.PAGE_UP] = CorsairLedId.K_PageUp,
- [DeviceKeys.CLOSE_BRACKET] = CorsairLedId.K_BracketRight,
- [DeviceKeys.BACKSLASH] = CorsairLedId.K_Backslash,
- [DeviceKeys.HASHTAG] = CorsairLedId.K_NonUsTilde,
- [DeviceKeys.ENTER] = CorsairLedId.K_Enter,
- //[DeviceKeys.International1] = CorsairLedId.K_International1,
- [DeviceKeys.EQUALS] = CorsairLedId.K_EqualsAndPlus,
- //[DeviceKeys.International3] = CorsairLedId.K_International3,
- [DeviceKeys.BACKSPACE] = CorsairLedId.K_Backspace,
- [DeviceKeys.DELETE] = CorsairLedId.K_Delete,
- [DeviceKeys.END] = CorsairLedId.K_End,
- [DeviceKeys.PAGE_DOWN] = CorsairLedId.K_PageDown,
- [DeviceKeys.RIGHT_SHIFT] = CorsairLedId.K_RightShift,
- [DeviceKeys.RIGHT_CONTROL] = CorsairLedId.K_RightCtrl,
- [DeviceKeys.ARROW_UP] = CorsairLedId.K_UpArrow,
- [DeviceKeys.ARROW_LEFT] = CorsairLedId.K_LeftArrow,
- [DeviceKeys.ARROW_DOWN] = CorsairLedId.K_DownArrow,
- [DeviceKeys.ARROW_RIGHT] = CorsairLedId.K_RightArrow,
- [DeviceKeys.LOCK_SWITCH] = CorsairLedId.K_WinLock,
- [DeviceKeys.VOLUME_MUTE] = CorsairLedId.K_Mute,
- [DeviceKeys.MEDIA_STOP] = CorsairLedId.K_Stop,
- [DeviceKeys.MEDIA_PREVIOUS] = CorsairLedId.K_ScanPreviousTrack,
- [DeviceKeys.MEDIA_PLAY_PAUSE] = CorsairLedId.K_PlayPause,
- [DeviceKeys.MEDIA_NEXT] = CorsairLedId.K_ScanNextTrack,
- [DeviceKeys.NUM_LOCK] = CorsairLedId.K_NumLock,
- [DeviceKeys.NUM_SLASH] = CorsairLedId.K_KeypadSlash,
- [DeviceKeys.NUM_ASTERISK] = CorsairLedId.K_KeypadAsterisk,
- [DeviceKeys.NUM_MINUS] = CorsairLedId.K_KeypadMinus,
- [DeviceKeys.NUM_PLUS] = CorsairLedId.K_KeypadPlus,
- [DeviceKeys.NUM_ENTER] = CorsairLedId.K_KeypadEnter,
- [DeviceKeys.NUM_SEVEN] = CorsairLedId.K_Keypad7,
- [DeviceKeys.NUM_EIGHT] = CorsairLedId.K_Keypad8,
- [DeviceKeys.NUM_NINE] = CorsairLedId.K_Keypad9,
- [DeviceKeys.NUM_ZEROZERO] = CorsairLedId.K_KeypadComma,
- [DeviceKeys.NUM_FOUR] = CorsairLedId.K_Keypad4,
- [DeviceKeys.NUM_FIVE] = CorsairLedId.K_Keypad5,
- [DeviceKeys.NUM_SIX] = CorsairLedId.K_Keypad6,
- [DeviceKeys.NUM_ONE] = CorsairLedId.K_Keypad1,
- [DeviceKeys.NUM_TWO] = CorsairLedId.K_Keypad2,
- [DeviceKeys.NUM_THREE] = CorsairLedId.K_Keypad3,
- [DeviceKeys.NUM_ZERO] = CorsairLedId.K_Keypad0,
- [DeviceKeys.NUM_PERIOD] = CorsairLedId.K_KeypadPeriodAndDelete,
- [DeviceKeys.G1] = CorsairLedId.K_G1,
- [DeviceKeys.G2] = CorsairLedId.K_G2,
- [DeviceKeys.G3] = CorsairLedId.K_G3,
- [DeviceKeys.G4] = CorsairLedId.K_G4,
- [DeviceKeys.G5] = CorsairLedId.K_G5,
- [DeviceKeys.G6] = CorsairLedId.K_G6,
- [DeviceKeys.G7] = CorsairLedId.K_G7,
- [DeviceKeys.G8] = CorsairLedId.K_G8,
- [DeviceKeys.G9] = CorsairLedId.K_G9,
- [DeviceKeys.G10] = CorsairLedId.K_G10,
- [DeviceKeys.VOLUME_UP] = CorsairLedId.K_VolumeUp,
- [DeviceKeys.VOLUME_DOWN] = CorsairLedId.K_VolumeDown,
- //[DeviceKeys.MR] = CorsairLedId.K_MR,
- //[DeviceKeys.M1] = CorsairLedId.K_M1,
- //[DeviceKeys.M2] = CorsairLedId.K_M2,
- //[DeviceKeys.M3] = CorsairLedId.K_M3,
- [DeviceKeys.G11] = CorsairLedId.K_G11,
- [DeviceKeys.G12] = CorsairLedId.K_G12,
- [DeviceKeys.G13] = CorsairLedId.K_G13,
- [DeviceKeys.G14] = CorsairLedId.K_G14,
- [DeviceKeys.G15] = CorsairLedId.K_G15,
- [DeviceKeys.G16] = CorsairLedId.K_G16,
- [DeviceKeys.G17] = CorsairLedId.K_G17,
- [DeviceKeys.G18] = CorsairLedId.K_G18,
- //[DeviceKeys.International5] = CorsairLedId.K_International5,
- //[DeviceKeys.International4] = CorsairLedId.K_International4,
- [DeviceKeys.FN_Key] = CorsairLedId.K_Fn,
- [DeviceKeys.LOCK_SWITCH] = CorsairLedId.K_WinLock,
- [DeviceKeys.BRIGHTNESS_SWITCH] = CorsairLedId.K_Brightness,
- [DeviceKeys.ADDITIONALLIGHT1] = CorsairLedId.KLP_Zone1,
- [DeviceKeys.ADDITIONALLIGHT2] = CorsairLedId.KLP_Zone2,
- [DeviceKeys.ADDITIONALLIGHT3] = CorsairLedId.KLP_Zone3,
- [DeviceKeys.ADDITIONALLIGHT4] = CorsairLedId.KLP_Zone4,
- [DeviceKeys.ADDITIONALLIGHT5] = CorsairLedId.KLP_Zone5,
- [DeviceKeys.ADDITIONALLIGHT6] = CorsairLedId.KLP_Zone6,
- [DeviceKeys.ADDITIONALLIGHT7] = CorsairLedId.KLP_Zone7,
- [DeviceKeys.ADDITIONALLIGHT8] = CorsairLedId.KLP_Zone8,
- [DeviceKeys.ADDITIONALLIGHT9] = CorsairLedId.KLP_Zone9,
- [DeviceKeys.ADDITIONALLIGHT10] = CorsairLedId.KLP_Zone10,
- [DeviceKeys.ADDITIONALLIGHT11] = CorsairLedId.KLP_Zone11,
- [DeviceKeys.ADDITIONALLIGHT12] = CorsairLedId.KLP_Zone12,
- [DeviceKeys.ADDITIONALLIGHT13] = CorsairLedId.KLP_Zone13,
- [DeviceKeys.ADDITIONALLIGHT14] = CorsairLedId.KLP_Zone14,
- [DeviceKeys.ADDITIONALLIGHT15] = CorsairLedId.KLP_Zone15,
- [DeviceKeys.ADDITIONALLIGHT16] = CorsairLedId.KLP_Zone16,
- [DeviceKeys.ADDITIONALLIGHT17] = CorsairLedId.KLP_Zone17,
- [DeviceKeys.ADDITIONALLIGHT18] = CorsairLedId.KLP_Zone18,
- [DeviceKeys.ADDITIONALLIGHT19] = CorsairLedId.KLP_Zone19
+ [CorsairLedId.CLK_Escape] = DeviceKeys.ESC,
+ [CorsairLedId.CLK_F1] = DeviceKeys.F1,
+ [CorsairLedId.CLK_F2] = DeviceKeys.F2,
+ [CorsairLedId.CLK_F3] = DeviceKeys.F3,
+ [CorsairLedId.CLK_F4] = DeviceKeys.F4,
+ [CorsairLedId.CLK_F5] = DeviceKeys.F5,
+ [CorsairLedId.CLK_F6] = DeviceKeys.F6,
+ [CorsairLedId.CLK_F7] = DeviceKeys.F7,
+ [CorsairLedId.CLK_F8] = DeviceKeys.F8,
+ [CorsairLedId.CLK_F9] = DeviceKeys.F9,
+ [CorsairLedId.CLK_F10] = DeviceKeys.F10,
+ [CorsairLedId.CLK_F11] = DeviceKeys.F11,
+ [CorsairLedId.CLK_GraveAccentAndTilde] = DeviceKeys.TILDE,
+ [CorsairLedId.CLK_1] = DeviceKeys.ONE,
+ [CorsairLedId.CLK_2] = DeviceKeys.TWO,
+ [CorsairLedId.CLK_3] = DeviceKeys.THREE,
+ [CorsairLedId.CLK_4] = DeviceKeys.FOUR,
+ [CorsairLedId.CLK_5] = DeviceKeys.FIVE,
+ [CorsairLedId.CLK_6] = DeviceKeys.SIX,
+ [CorsairLedId.CLK_7] = DeviceKeys.SEVEN,
+ [CorsairLedId.CLK_8] = DeviceKeys.EIGHT,
+ [CorsairLedId.CLK_9] = DeviceKeys.NINE,
+ [CorsairLedId.CLK_0] = DeviceKeys.ZERO,
+ [CorsairLedId.CLK_MinusAndUnderscore] = DeviceKeys.MINUS,
+ [CorsairLedId.CLK_Tab] = DeviceKeys.TAB,
+ [CorsairLedId.CLK_Q] = DeviceKeys.Q,
+ [CorsairLedId.CLK_W] = DeviceKeys.W,
+ [CorsairLedId.CLK_E] = DeviceKeys.E,
+ [CorsairLedId.CLK_R] = DeviceKeys.R,
+ [CorsairLedId.CLK_T] = DeviceKeys.T,
+ [CorsairLedId.CLK_Y] = DeviceKeys.Y,
+ [CorsairLedId.CLK_U] = DeviceKeys.U,
+ [CorsairLedId.CLK_I] = DeviceKeys.I,
+ [CorsairLedId.CLK_O] = DeviceKeys.O,
+ [CorsairLedId.CLK_P] = DeviceKeys.P,
+ [CorsairLedId.CLK_BracketLeft] = DeviceKeys.OPEN_BRACKET,
+ [CorsairLedId.CLK_CapsLock] = DeviceKeys.CAPS_LOCK,
+ [CorsairLedId.CLK_A] = DeviceKeys.A,
+ [CorsairLedId.CLK_S] = DeviceKeys.S,
+ [CorsairLedId.CLK_D] = DeviceKeys.D,
+ [CorsairLedId.CLK_F] = DeviceKeys.F,
+ [CorsairLedId.CLK_G] = DeviceKeys.G,
+ [CorsairLedId.CLK_H] = DeviceKeys.H,
+ [CorsairLedId.CLK_J] = DeviceKeys.J,
+ [CorsairLedId.CLK_K] = DeviceKeys.K,
+ [CorsairLedId.CLK_L] = DeviceKeys.L,
+ [CorsairLedId.CLK_SemicolonAndColon] = DeviceKeys.SEMICOLON,
+ [CorsairLedId.CLK_ApostropheAndDoubleQuote] = DeviceKeys.APOSTROPHE,
+ [CorsairLedId.CLK_LeftShift] = DeviceKeys.LEFT_SHIFT,
+ [CorsairLedId.CLK_NonUsBackslash] = DeviceKeys.BACKSLASH_UK,
+ [CorsairLedId.CLK_Z] = DeviceKeys.Z,
+ [CorsairLedId.CLK_X] = DeviceKeys.X,
+ [CorsairLedId.CLK_C] = DeviceKeys.C,
+ [CorsairLedId.CLK_V] = DeviceKeys.V,
+ [CorsairLedId.CLK_B] = DeviceKeys.B,
+ [CorsairLedId.CLK_N] = DeviceKeys.N,
+ [CorsairLedId.CLK_M] = DeviceKeys.M,
+ [CorsairLedId.CLK_CommaAndLessThan] = DeviceKeys.COMMA,
+ [CorsairLedId.CLK_PeriodAndBiggerThan] = DeviceKeys.PERIOD,
+ [CorsairLedId.CLK_SlashAndQuestionMark] = DeviceKeys.FORWARD_SLASH,
+ [CorsairLedId.CLK_LeftCtrl] = DeviceKeys.LEFT_CONTROL,
+ [CorsairLedId.CLK_LeftGui] = DeviceKeys.LEFT_WINDOWS,
+ [CorsairLedId.CLK_LeftAlt] = DeviceKeys.LEFT_ALT,
+ //[CorsairLedId.CLK_Lang2] = DeviceKeys.Lang2,
+ [CorsairLedId.CLK_Space] = DeviceKeys.SPACE,
+ //[CorsairLedId.CLK_Lang1] = DeviceKeys.Lang1,
+ // [CorsairLedId.CLK_International2] = DeviceKeys.International2,
+ [CorsairLedId.CLK_RightAlt] = DeviceKeys.RIGHT_ALT,
+ [CorsairLedId.CLK_RightGui] = DeviceKeys.RIGHT_WINDOWS,
+ [CorsairLedId.CLK_Application] = DeviceKeys.APPLICATION_SELECT,
+ //[CorsairLedId.CLK_LedProgramming] = DeviceKeys.LedProgramming,
+ [CorsairLedId.CLK_Brightness] = DeviceKeys.BRIGHTNESS_SWITCH,
+ [CorsairLedId.CLK_F12] = DeviceKeys.F12,
+ [CorsairLedId.CLK_PrintScreen] = DeviceKeys.PRINT_SCREEN,
+ [CorsairLedId.CLK_ScrollLock] = DeviceKeys.SCROLL_LOCK,
+ [CorsairLedId.CLK_PauseBreak] = DeviceKeys.PAUSE_BREAK,
+ [CorsairLedId.CLK_Insert] = DeviceKeys.INSERT,
+ [CorsairLedId.CLK_Home] = DeviceKeys.HOME,
+ [CorsairLedId.CLK_PageUp] = DeviceKeys.PAGE_UP,
+ [CorsairLedId.CLK_BracketRight] = DeviceKeys.CLOSE_BRACKET,
+ [CorsairLedId.CLK_Backslash] = DeviceKeys.BACKSLASH,
+ [CorsairLedId.CLK_NonUsTilde] = DeviceKeys.HASHTAG,
+ [CorsairLedId.CLK_Enter] = DeviceKeys.ENTER,
+ //[CorsairLedId.CLK_International1] = DeviceKeys.International1,
+ [CorsairLedId.CLK_EqualsAndPlus] = DeviceKeys.EQUALS,
+ //[CorsairLedId.CLK_International3] = DeviceKeys.International3,
+ [CorsairLedId.CLK_Backspace] = DeviceKeys.BACKSPACE,
+ [CorsairLedId.CLK_Delete] = DeviceKeys.DELETE,
+ [CorsairLedId.CLK_End] = DeviceKeys.END,
+ [CorsairLedId.CLK_PageDown] = DeviceKeys.PAGE_DOWN,
+ [CorsairLedId.CLK_RightShift] = DeviceKeys.RIGHT_SHIFT,
+ [CorsairLedId.CLK_RightCtrl] = DeviceKeys.RIGHT_CONTROL,
+ [CorsairLedId.CLK_UpArrow] = DeviceKeys.ARROW_UP,
+ [CorsairLedId.CLK_LeftArrow] = DeviceKeys.ARROW_LEFT,
+ [CorsairLedId.CLK_DownArrow] = DeviceKeys.ARROW_DOWN,
+ [CorsairLedId.CLK_RightArrow] = DeviceKeys.ARROW_RIGHT,
+ [CorsairLedId.CLK_WinLock] = DeviceKeys.LOCK_SWITCH,
+ [CorsairLedId.CLK_Mute] = DeviceKeys.VOLUME_MUTE,
+ [CorsairLedId.CLK_Stop] = DeviceKeys.MEDIA_STOP,
+ [CorsairLedId.CLK_ScanPreviousTrack] = DeviceKeys.MEDIA_PREVIOUS,
+ [CorsairLedId.CLK_PlayPause] = DeviceKeys.MEDIA_PLAY_PAUSE,
+ [CorsairLedId.CLK_ScanNextTrack] = DeviceKeys.MEDIA_NEXT,
+ [CorsairLedId.CLK_NumLock] = DeviceKeys.NUM_LOCK,
+ [CorsairLedId.CLK_KeypadSlash] = DeviceKeys.NUM_SLASH,
+ [CorsairLedId.CLK_KeypadAsterisk] = DeviceKeys.NUM_ASTERISK,
+ [CorsairLedId.CLK_KeypadMinus] = DeviceKeys.NUM_MINUS,
+ [CorsairLedId.CLK_KeypadPlus] = DeviceKeys.NUM_PLUS,
+ [CorsairLedId.CLK_KeypadEnter] = DeviceKeys.NUM_ENTER,
+ [CorsairLedId.CLK_Keypad7] = DeviceKeys.NUM_SEVEN,
+ [CorsairLedId.CLK_Keypad8] = DeviceKeys.NUM_EIGHT,
+ [CorsairLedId.CLK_Keypad9] = DeviceKeys.NUM_NINE,
+ [CorsairLedId.CLK_KeypadComma] = DeviceKeys.NUM_ZEROZERO,
+ [CorsairLedId.CLK_Keypad4] = DeviceKeys.NUM_FOUR,
+ [CorsairLedId.CLK_Keypad5] = DeviceKeys.NUM_FIVE,
+ [CorsairLedId.CLK_Keypad6] = DeviceKeys.NUM_SIX,
+ [CorsairLedId.CLK_Keypad1] = DeviceKeys.NUM_ONE,
+ [CorsairLedId.CLK_Keypad2] = DeviceKeys.NUM_TWO,
+ [CorsairLedId.CLK_Keypad3] = DeviceKeys.NUM_THREE,
+ [CorsairLedId.CLK_Keypad0] = DeviceKeys.NUM_ZERO,
+ [CorsairLedId.CLK_KeypadPeriodAndDelete] = DeviceKeys.NUM_PERIOD,
+ [CorsairLedId.CLK_G1] = DeviceKeys.G1,
+ [CorsairLedId.CLK_G2] = DeviceKeys.G2,
+ [CorsairLedId.CLK_G3] = DeviceKeys.G3,
+ [CorsairLedId.CLK_G4] = DeviceKeys.G4,
+ [CorsairLedId.CLK_G5] = DeviceKeys.G5,
+ [CorsairLedId.CLK_G6] = DeviceKeys.G6,
+ [CorsairLedId.CLK_G7] = DeviceKeys.G7,
+ [CorsairLedId.CLK_G8] = DeviceKeys.G8,
+ [CorsairLedId.CLK_G9] = DeviceKeys.G9,
+ [CorsairLedId.CLK_G10] = DeviceKeys.G10,
+ [CorsairLedId.CLK_VolumeUp] = DeviceKeys.VOLUME_UP,
+ [CorsairLedId.CLK_VolumeDown] = DeviceKeys.VOLUME_DOWN,
+ //[CorsairLedId.CLK_MR] = DeviceKeys.MR,
+ //[CorsairLedId.CLK_M1] = //DeviceKeys.M1,
+ //[CorsairLedId.CLK_M2] = //DeviceKeys.M2,
+ //[CorsairLedId.CLK_M3] = //DeviceKeys.M3,
+ [CorsairLedId.CLK_G11] = DeviceKeys.G11,
+ [CorsairLedId.CLK_G12] = DeviceKeys.G12,
+ [CorsairLedId.CLK_G13] = DeviceKeys.G13,
+ [CorsairLedId.CLK_G14] = DeviceKeys.G14,
+ [CorsairLedId.CLK_G15] = DeviceKeys.G15,
+ [CorsairLedId.CLK_G16] = DeviceKeys.G16,
+ [CorsairLedId.CLK_G17] = DeviceKeys.G17,
+ [CorsairLedId.CLK_G18] = DeviceKeys.G18,
+ //[CorsairLedId.CLK_International5] = //DeviceKeys.International5,
+ // [CorsairLedId.CLK_International4] = //DeviceKeys.International4,
+ [CorsairLedId.CLK_Fn] = DeviceKeys.FN_Key,
+ [CorsairLedId.CLK_WinLock] = DeviceKeys.LOCK_SWITCH,
+ [CorsairLedId.CLK_Brightness] = DeviceKeys.BRIGHTNESS_SWITCH,
+ [CorsairLedId.CLK_Logo] = DeviceKeys.LOGO,
+ [CorsairLedId.CLKLP_Zone1] = DeviceKeys.ADDITIONALLIGHT1,
+ [CorsairLedId.CLKLP_Zone2] = DeviceKeys.ADDITIONALLIGHT2,
+ [CorsairLedId.CLKLP_Zone3] = DeviceKeys.ADDITIONALLIGHT3,
+ [CorsairLedId.CLKLP_Zone4] = DeviceKeys.ADDITIONALLIGHT4,
+ [CorsairLedId.CLKLP_Zone5] = DeviceKeys.ADDITIONALLIGHT5,
+ [CorsairLedId.CLKLP_Zone6] = DeviceKeys.ADDITIONALLIGHT6,
+ [CorsairLedId.CLKLP_Zone7] = DeviceKeys.ADDITIONALLIGHT7,
+ [CorsairLedId.CLKLP_Zone8] = DeviceKeys.ADDITIONALLIGHT8,
+ [CorsairLedId.CLKLP_Zone9] = DeviceKeys.ADDITIONALLIGHT9,
+ [CorsairLedId.CLKLP_Zone10] = DeviceKeys.ADDITIONALLIGHT10,
+ [CorsairLedId.CLKLP_Zone11] = DeviceKeys.ADDITIONALLIGHT11,
+ [CorsairLedId.CLKLP_Zone12] = DeviceKeys.ADDITIONALLIGHT12,
+ [CorsairLedId.CLKLP_Zone13] = DeviceKeys.ADDITIONALLIGHT13,
+ [CorsairLedId.CLKLP_Zone14] = DeviceKeys.ADDITIONALLIGHT14,
+ [CorsairLedId.CLKLP_Zone15] = DeviceKeys.ADDITIONALLIGHT15,
+ [CorsairLedId.CLKLP_Zone16] = DeviceKeys.ADDITIONALLIGHT16,
+ [CorsairLedId.CLKLP_Zone17] = DeviceKeys.ADDITIONALLIGHT17,
+ [CorsairLedId.CLKLP_Zone18] = DeviceKeys.ADDITIONALLIGHT18,
+ [CorsairLedId.CLKLP_Zone19] = DeviceKeys.ADDITIONALLIGHT19,
};
- internal static readonly Dictionary MouseMatLedMap = new Dictionary()
+ /*internal static readonly Dictionary MouseMatLedMap = new Dictionary()
{
- [DeviceKeys.MOUSEPADLIGHT1] = CorsairLedId.MM_Zone1,
+ [DeviceKeys.MOUSEPADLIGHT1] = CorsairLedId.CLMM_Zone1,
[DeviceKeys.MOUSEPADLIGHT2] = CorsairLedId.MM_Zone2,
[DeviceKeys.MOUSEPADLIGHT3] = CorsairLedId.MM_Zone3,
[DeviceKeys.MOUSEPADLIGHT4] = CorsairLedId.MM_Zone4,
@@ -223,14 +223,14 @@ internal static class LedMaps
[DeviceKeys.ADDITIONALLIGHT1] = CorsairLedId.M_4,//TODO
[DeviceKeys.ADDITIONALLIGHT2] = CorsairLedId.M_5,
[DeviceKeys.ADDITIONALLIGHT3] = CorsairLedId.M_6
- };
+ };*/
- internal static readonly Dictionary> MapsMap = new Dictionary>()
+ internal static readonly Dictionary> MapsMap = new Dictionary>()
{
- [CorsairDeviceType.Keyboard] = KeyboardLedMap,
- [CorsairDeviceType.Mouse] = MouseLedMap,
- [CorsairDeviceType.MouseMat] = MouseMatLedMap,
- [CorsairDeviceType.HeadsetStand] = HeadsetStandLedMap,
+ [CorsairDeviceType.CDT_Keyboard] = KeyboardLedMap,
+ /*[CorsairDeviceType.CDT_Mouse] = MouseLedMap,
+ [CorsairDeviceType.CDT_MouseMat] = MouseMatLedMap,
+ [CorsairDeviceType.CDT_HeadsetStand] = HeadsetStandLedMap,*/
};
internal static readonly List Channel1LedIds = EnumUtils.GetEnumValues()
@@ -252,6 +252,6 @@ internal static class LedMaps
Channel3LedIds
};
- public static string ToString(this CorsairLedColor corsairLedColor) => $"{corsairLedColor.LedId}, ({corsairLedColor.R},{corsairLedColor.G},{corsairLedColor.B})";
+ public static string ToString(this CorsairLedColor corsairLedColor) => $"{corsairLedColor.ledId}, ({corsairLedColor.r},{corsairLedColor.g},{corsairLedColor.b})";
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Creative/SoundBlasterXDevice.cs b/Project-Aurora/Project-Aurora/Devices/Creative/SoundBlasterXDevice.cs
index 80e2b2271..54ba1eeb0 100644
--- a/Project-Aurora/Project-Aurora/Devices/Creative/SoundBlasterXDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Creative/SoundBlasterXDevice.cs
@@ -317,7 +317,7 @@ public bool IsConnected()
public bool IsInitialized => (sbKeyboard != null || sbMouse != null);
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
uint maxKbLength = 0;
Dictionary> kbIndices = null;
@@ -325,13 +325,13 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
kbIndices = new Dictionary>();
LedColour[] mouseColors = null;
- foreach (KeyValuePair kv in keyColors)
+ foreach (KeyValuePair kv in keyColors)
{
if (e.Cancel) return false;
if (kbIndices != null)
{
- var kbLedIdx = GetKeyboardMappingLedIndex(kv.Key);
+ var kbLedIdx = GetKeyboardMappingLedIndex((DeviceKeys)kv.Key);
if (kbLedIdx != Keyboard_LEDIndex.NotApplicable)
{
if (!kbIndices.ContainsKey(kv.Value))
@@ -345,7 +345,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
}
if (sbMouse != null)
{
- int moosIdx = GetMouseMappingIndex(kv.Key);
+ int moosIdx = GetMouseMappingIndex((DeviceKeys)kv.Key);
if (moosIdx >= 0 && moosIdx <= MouseMapping.Length)
{
if (mouseColors == null)
diff --git a/Project-Aurora/Project-Aurora/Devices/DefaultDevice.cs b/Project-Aurora/Project-Aurora/Devices/DefaultDevice.cs
index d2d2f730a..5f79db837 100644
--- a/Project-Aurora/Project-Aurora/Devices/DefaultDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/DefaultDevice.cs
@@ -38,7 +38,7 @@ public virtual void Reset()
Initialize();
}
- public abstract bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false);
+ public abstract bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false);
public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArgs e, bool forced = false)
{
diff --git a/Project-Aurora/Project-Aurora/Devices/DeviceKeys.cs b/Project-Aurora/Project-Aurora/Devices/DeviceKeys.cs
old mode 100644
new mode 100755
index 96b758d91..1c145b629
--- a/Project-Aurora/Project-Aurora/Devices/DeviceKeys.cs
+++ b/Project-Aurora/Project-Aurora/Devices/DeviceKeys.cs
@@ -1303,6 +1303,7 @@ public enum DeviceKeys
[Description("Peripheral Light 1")]
PERIPHERAL_LIGHT1 = 217,
+
///
/// Peripheral Light 2
///
@@ -1580,4 +1581,5 @@ public enum DeviceKeys
[Description("None")]
NONE = -1,
};
+
}
diff --git a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs
index 2d8d271d3..cb7f3a9f9 100644
--- a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs
+++ b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs
@@ -63,7 +63,6 @@ public void UpdateDevice(DeviceColorComposition composition, bool forced = false
}
}
}
-
public class DeviceManager
{
private const int RETRY_INTERVAL = 10000;
@@ -83,7 +82,8 @@ private set
}
public List DeviceContainers { get; } = new List();
-
+ public List DeviceConnectors { get; } = new List();
+ public IEnumerable IndividualDevices => DeviceConnectors.SelectMany(d => d.Devices);
public IEnumerable InitializedDeviceContainers => DeviceContainers.Where(d => d.Device.IsInitialized);
public event EventHandler RetryAttemptsChanged;
@@ -160,6 +160,7 @@ private void AddDevicesFromAssembly()
where typeof(IDevice).IsAssignableFrom(type)
&& !type.IsAbstract
&& type != typeof(ScriptedDevice.ScriptedDevice)
+ && type != typeof(OldAuroraDeviceWrapper)
let inst = (IDevice)Activator.CreateInstance(type)
orderby inst.DeviceName
select inst;
@@ -168,6 +169,12 @@ orderby inst.DeviceName
{
DeviceContainers.Add(new DeviceContainer(inst));
}
+ var CorsairConnector = new Corsair.CorsairDeviceConnector();
+ DeviceContainers.Add(new DeviceContainer(new OldAuroraDeviceWrapper(CorsairConnector)));
+ DeviceConnectors.Add(CorsairConnector);
+ var OpenRGBConnector = new OpenRGB.OpenRGBDeviceConnector();
+ DeviceContainers.Add(new DeviceContainer(new OldAuroraDeviceWrapper(OpenRGBConnector)));
+ DeviceConnectors.Add(OpenRGBConnector);
}
private void AddDevicesFromDlls()
@@ -262,6 +269,7 @@ public void InitializeDevices()
Global.logger.Info(s);
}
+ DeviceConnectors.ForEach(dc => dc.Initialize());
if (devicesToRetry > 0)
Task.Run(RetryAll);
@@ -277,6 +285,7 @@ public void ShutdownDevices()
dc.Device.Shutdown();
Global.logger.Info($"[Device][{dc.Device.DeviceName}] Shutdown");
}
+ DeviceConnectors.ForEach(dc => dc.Shutdown());
}
public void ResetDevices()
@@ -286,14 +295,45 @@ public void ResetDevices()
lock (dc.actionLock)
dc.Device.Reset();
}
+ DeviceConnectors.ForEach(dc => dc.Reset());
}
- public void UpdateDevices(DeviceColorComposition composition, bool forced = false)
+ public void RegisterViewPort(ref UniqueDeviceId devicId, int viewPort)
+ {
+ foreach (var dc in IndividualDevices)
+ {
+ if (dc.id?.ViewPort == viewPort)
+ dc.id.ViewPort = null;
+ }
+ devicId.ViewPort = viewPort;
+ foreach (var dc in IndividualDevices)
+ {
+ if (dc.id == devicId)
+ dc.id = devicId;
+ }
+ }
+ public void UpdateDevices(Dictionary compositionList, bool forced = false)
{
foreach (var dc in InitializedDeviceContainers)
{
lock (dc.actionLock)
- dc.UpdateDevice(composition, forced);
+ {
+
+ foreach (var composition in compositionList)
+ {
+ if (!IndividualDevices.Where(dc => dc.id?.ViewPort == composition.Key).Any())
+ dc.UpdateDevice(composition.Value, forced);
+ }
+
+ }
+ }
+ foreach (var item in compositionList)
+ {
+ var dc = IndividualDevices.Where(d => d.IsConnected() && d.id.ViewPort == item.Key);
+ if (dc.Any())
+ {
+ dc.First().UpdateDevice(item.Value);
+ }
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Drevo/DrevoDevice.cs b/Project-Aurora/Project-Aurora/Devices/Drevo/DrevoDevice.cs
index f93dee4ae..811ada93c 100644
--- a/Project-Aurora/Project-Aurora/Devices/Drevo/DrevoDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Drevo/DrevoDevice.cs
@@ -1,4 +1,5 @@
-using System;
+using Aurora.Utils;
+using System;
using DrevoRadi;
using System.Collections.Generic;
using System.ComponentModel;
@@ -54,10 +55,11 @@ public override void Shutdown()
}
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ /// Updates the device with a specified color arrangement.
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
- if (!IsInitialized)
- return false;
+ if (e.Cancel) return false;
+ if (!IsInitialized) return false;
try
{
@@ -68,15 +70,15 @@ public override bool UpdateDevice(Dictionary keyColors, DoWor
bitmap[3] = 0x7F;
int index = 0;
- foreach (var key in keyColors)
+ foreach (var (dk, clr) in keyColors)
{
- index = DrevoRadiSDK.ToDrevoBitmap((int)key.Key);
+ index = DrevoRadiSDK.ToDrevoBitmap(dk);
if (index != -1)
{
index = index * 3 + 4;
- bitmap[index] = key.Value.R;
- bitmap[index + 1] = key.Value.G;
- bitmap[index + 2] = key.Value.B;
+ bitmap[index] = clr.R;
+ bitmap[index + 1] = clr.G;
+ bitmap[index + 2] = clr.B;
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Dualshock4/Dualshock4Device.cs b/Project-Aurora/Project-Aurora/Devices/Dualshock4/Dualshock4Device.cs
index ea8738188..a419cb1b4 100755
--- a/Project-Aurora/Project-Aurora/Devices/Dualshock4/Dualshock4Device.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Dualshock4/Dualshock4Device.cs
@@ -122,7 +122,6 @@ private void DeviceListChanged(object sender, HidSharp.DeviceListChangedEventArg
if (DS4Devices.getDS4Controllers().Count() != devices.Count)
Reset();
}
-
public override bool Initialize()
{
if (IsInitialized)
@@ -154,9 +153,10 @@ public override void Shutdown()
isDisconnecting = false;
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
- if (keyColors.TryGetValue(key, out var clr))
+ if (keyColors.TryGetValue((int)key, out var clr))
{
foreach (var dev in devices)
{
diff --git a/Project-Aurora/Project-Aurora/Devices/Ducky/DuckyDevice.cs b/Project-Aurora/Project-Aurora/Devices/Ducky/DuckyDevice.cs
index 76a4bfba9..da0133aed 100644
--- a/Project-Aurora/Project-Aurora/Devices/Ducky/DuckyDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Ducky/DuckyDevice.cs
@@ -133,16 +133,16 @@ public bool IsPeripheralConnected()
return isInitialized;
}
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
- foreach (KeyValuePair kc in keyColors)
+ foreach (KeyValuePair kc in keyColors)
{
//This keyboard doesn't take alpha (transparency) values, so we do this:
processedColor = ColorUtils.CorrectWithAlpha(kc.Value);
//This if statement grabs the packet offset from the key that Aurora wants to set, using DuckyColourOffsetMap.
//It also checks whether the key exists in the Dictionary, and if not, doesn't try and set the key colour.
- if(!DuckyRGBMappings.DuckyColourOffsetMap.TryGetValue(kc.Key, out currentKeyOffset)){
+ if(!DuckyRGBMappings.DuckyColourOffsetMap.TryGetValue((DeviceKeys)kc.Key, out currentKeyOffset)){
continue;
}
diff --git a/Project-Aurora/Project-Aurora/Devices/IDevice.cs b/Project-Aurora/Project-Aurora/Devices/IDevice.cs
index 7ed543f64..b15d1c58a 100644
--- a/Project-Aurora/Project-Aurora/Devices/IDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/IDevice.cs
@@ -13,7 +13,7 @@ namespace Aurora.Devices
public class DeviceColorComposition
{
public readonly object bitmapLock = new object();
- public Dictionary keyColors;
+ public Dictionary keyColors;
public Bitmap keyBitmap;
}
@@ -73,7 +73,7 @@ public interface IDevice
/// A dictionary of DeviceKeys their corresponding Colors
/// A boolean value indicating whether or not to forcefully update this device
///
- bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false);
+ bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false);
///
/// Updates the device with a specified color composition.
@@ -82,5 +82,6 @@ public interface IDevice
/// A boolean value indicating whether or not to forcefully update this device
///
bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArgs e, bool forced = false);
+
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/LightFX/LightFX.cs b/Project-Aurora/Project-Aurora/Devices/LightFX/LightFX.cs
index ec75d4525..c6a626341 100644
--- a/Project-Aurora/Project-Aurora/Devices/LightFX/LightFX.cs
+++ b/Project-Aurora/Project-Aurora/Devices/LightFX/LightFX.cs
@@ -320,7 +320,7 @@ public int AlienfxWaitForReady()
bool NumLock = (((ushort)LightFXSDK.GetKeyState(0x90)) & 0xffff) != 0;
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (e.Cancel) return false;
List leftColor = new List();
@@ -388,38 +388,38 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
LightFXSDK.LFX_Reset();
}
- foreach (KeyValuePair key in keyColors) {
+ foreach (KeyValuePair key in keyColors) {
if (e.Cancel) return false;
if (isInitialized) {
//left
- if (Array.Exists(leftZoneKeys, s => s == key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
+ if (Array.Exists(leftZoneKeys, s => s == (DeviceKeys)key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
leftColor.Add(key.Value);
} //middle left
- if (Array.Exists(midLeftZoneKeys, s => s == key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
+ if (Array.Exists(midLeftZoneKeys, s => s == (DeviceKeys)key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
midleftColor.Add(key.Value);
}//middle right
- if (Array.Exists(midRightZoneKeys, s => s == key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
+ if (Array.Exists(midRightZoneKeys, s => s == (DeviceKeys)key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
midRightColor.Add(key.Value);
}//right */
- if (Array.Exists(rightZoneKeys, s => s == key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
+ if (Array.Exists(rightZoneKeys, s => s == (DeviceKeys)key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
rightColor.Add(key.Value);
}
- if (Array.Exists(numpadZone, s => s == key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
+ if (Array.Exists(numpadZone, s => s == (DeviceKeys)key.Key) && (key.Value.R > 0 || key.Value.G > 0 || key.Value.B > 0)) {
numpadColor.Add(key.Value);
}
- if (key.Key == DeviceKeys.Peripheral_Logo) {
+ if ((DeviceKeys)key.Key == DeviceKeys.Peripheral_Logo) {
setColor(1, (int)BITMASK.AlienFrontLogo, key.Value.R, key.Value.G, key.Value.B);
if (!usingHID) {
diff --git a/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs b/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs
index b53279db4..e2a01ed3f 100755
--- a/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs
@@ -54,28 +54,28 @@ public override void Shutdown()
IsInitialized = false;
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (!IsInitialized)
return false;
- foreach (var key in keyColors)
+ foreach (var (key, clr) in keyColors)
{
- if (LedMaps.BitmapMap.TryGetValue(key.Key, out var index))
+ if (LedMaps.BitmapMap.TryGetValue((DeviceKeys)key, out var index))
{
- logitechBitmap[index] = key.Value.B;
- logitechBitmap[index + 1] = key.Value.G;
- logitechBitmap[index + 2] = key.Value.R;
- logitechBitmap[index + 3] = key.Value.A;
+ logitechBitmap[index] = clr.B;
+ logitechBitmap[index + 1] = clr.G;
+ logitechBitmap[index + 2] = clr.R;
+ logitechBitmap[index + 3] = clr.A;
}
- if (!Global.Configuration.DevicesDisableKeyboard && LedMaps.KeyMap.TryGetValue(key.Key, out var logiKey))
- IsInitialized &= LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(logiKey, key.Value);
- if (LedMaps.PeripheralMap.TryGetValue(key.Key, out var peripheral))
+ if (!Global.Configuration.DevicesDisableKeyboard && LedMaps.KeyMap.TryGetValue((DeviceKeys)key, out var logiKey))
+ IsInitialized &= LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(logiKey, clr);
+ if (LedMaps.PeripheralMap.TryGetValue((DeviceKeys)key, out var peripheral))
{
if ((peripheral.type == DeviceType.Headset && !Global.Configuration.DevicesDisableHeadset)
|| (peripheral.type == DeviceType.Mouse && !Global.Configuration.DevicesDisableMouse))
{
- LogitechGSDK.LogiLedSetLightingForTargetZone(peripheral.type, peripheral.zone, key.Value);
+ LogitechGSDK.LogiLedSetLightingForTargetZone(peripheral.type, peripheral.zone, clr);
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/IOmenDevice.cs b/Project-Aurora/Project-Aurora/Devices/Omen/IOmenDevice.cs
index 26dac999a..412414078 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/IOmenDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/IOmenDevice.cs
@@ -10,7 +10,7 @@ namespace Aurora.Devices.Omen
interface IOmenDevice
{
public void Shutdown();
- public void SetLights(Dictionary keyColors);
+ public void SetLights(Dictionary keyColors);
public string GetDeviceName();
};
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenChassis.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenChassis.cs
index 169a6deca..0bf139ff7 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenChassis.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenChassis.cs
@@ -72,13 +72,13 @@ public string GetDeviceName()
return (hChassis != IntPtr.Zero ? "Chassis Connected" : string.Empty);
}
- public void SetLights(Dictionary keyColors)
+ public void SetLights(Dictionary keyColors)
{
if (hChassis != IntPtr.Zero)
{
- if (keyColors.ContainsKey(DeviceKeys.Peripheral_Logo))
+ if (keyColors.ContainsKey((int)DeviceKeys.Peripheral_Logo))
{
- SetLight(DeviceKeys.Peripheral_Logo, keyColors[DeviceKeys.Peripheral_Logo]);
+ SetLight(DeviceKeys.Peripheral_Logo, keyColors[(int)DeviceKeys.Peripheral_Logo]);
return;
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenDevices.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenDevices.cs
index 02fb1f043..41894dcd5 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenDevices.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenDevices.cs
@@ -55,8 +55,9 @@ public string DeviceDetails
public bool Initialize()
{
- Global.kbLayout.KeyboardLayoutUpdated -= DeviceChangedHandler;
- Global.kbLayout.KeyboardLayoutUpdated += DeviceChangedHandler;
+ //TODO fix this
+ /*Global.kbLayout.KeyboardLayoutUpdated -= DeviceChangedHandler;
+ Global.kbLayout.KeyboardLayoutUpdated += DeviceChangedHandler;*/
lock (this)
{
@@ -161,7 +162,7 @@ public void Shutdown()
}
}
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
try
{
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenFourZoneLighting.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenFourZoneLighting.cs
index 0a4808dc3..6225a3ba9 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenFourZoneLighting.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenFourZoneLighting.cs
@@ -15,7 +15,7 @@ namespace Aurora.Devices.Omen
{
class OmenFourZoneLighting : IOmenDevice
{
- public void SetLights(Dictionary keyColors)
+ public void SetLights(Dictionary keyColors)
{
Task.Run(() => {
if (Monitor.TryEnter(this))
@@ -23,16 +23,16 @@ public void SetLights(Dictionary keyColors)
try
{
if(FourZoneLighting.IsTurnOn()
- && keyColors.ContainsKey(DeviceKeys.ADDITIONALLIGHT1)
- && keyColors.ContainsKey(DeviceKeys.ADDITIONALLIGHT2)
- && keyColors.ContainsKey(DeviceKeys.ADDITIONALLIGHT3)
- && keyColors.ContainsKey(DeviceKeys.ADDITIONALLIGHT4))
+ && keyColors.ContainsKey((int)DeviceKeys.ADDITIONALLIGHT1)
+ && keyColors.ContainsKey((int)DeviceKeys.ADDITIONALLIGHT2)
+ && keyColors.ContainsKey((int)DeviceKeys.ADDITIONALLIGHT3)
+ && keyColors.ContainsKey((int)DeviceKeys.ADDITIONALLIGHT4))
{
FourZoneLighting.SetZoneColors(
- new Color[] { keyColors[DeviceKeys.ADDITIONALLIGHT1],
- keyColors[DeviceKeys.ADDITIONALLIGHT2],
- keyColors[DeviceKeys.ADDITIONALLIGHT3],
- keyColors[DeviceKeys.ADDITIONALLIGHT4] });
+ new Color[] { keyColors[(int)DeviceKeys.ADDITIONALLIGHT1],
+ keyColors[(int)DeviceKeys.ADDITIONALLIGHT2],
+ keyColors[(int)DeviceKeys.ADDITIONALLIGHT3],
+ keyColors[(int)DeviceKeys.ADDITIONALLIGHT4] });
}
}
finally
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenKeyboard.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenKeyboard.cs
index df4ce1774..a0a68aa34 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenKeyboard.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenKeyboard.cs
@@ -43,10 +43,10 @@ public struct StaticKeyEffect
public LightingColor lightingColor;
public int key;
- public StaticKeyEffect(KeyValuePair key)
+ public StaticKeyEffect(KeyValuePair key)
{
lightingColor = LightingColor.FromColor(key.Value);
- this.key = OmenKeys.GetKey(key.Key);
+ this.key = OmenKeys.GetKey((DeviceKeys)key.Key);
}
}
@@ -55,7 +55,7 @@ public string GetDeviceName()
return (hKB != IntPtr.Zero ? "Keyboard Connected" : string.Empty);
}
- public void SetLights(Dictionary keyColors)
+ public void SetLights(Dictionary keyColors)
{
if (hKB != IntPtr.Zero && keyColors.Count > 0)
{
@@ -71,7 +71,7 @@ public void SetLights(Dictionary keyColors)
try
{
List list = new List();
- foreach (KeyValuePair key in keyColors)
+ foreach (KeyValuePair key in keyColors)
{
list.Add(new StaticKeyEffect(key));
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenMouse.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenMouse.cs
index 84767af94..782667678 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenMouse.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenMouse.cs
@@ -65,18 +65,18 @@ public enum MouseLightingZone
MOUSE_LIGHTING_ZONE_WHEEL = 2, /* Wheel zone */
}
- public void SetLights(Dictionary keyColors)
+ public void SetLights(Dictionary keyColors)
{
if (hMouse != IntPtr.Zero)
{
- foreach (KeyValuePair keyColor in keyColors)
+ foreach (var keyColor in keyColors)
{
- switch (keyColor.Key)
+ switch ((DeviceKeys)keyColor.Key)
{
case DeviceKeys.Peripheral_Logo:
case DeviceKeys.Peripheral_FrontLight:
case DeviceKeys.Peripheral_ScrollWheel:
- SetLight(keyColor.Key, keyColor.Value);
+ SetLight((DeviceKeys)keyColor.Key, keyColor.Value);
break;
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenMousePad.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenMousePad.cs
index abad3c7a7..f2fbb29b5 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenMousePad.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenMousePad.cs
@@ -58,15 +58,15 @@ private int GetZone(DeviceKeys key)
return (key == DeviceKeys.MOUSEPADLIGHT15 ? (int)MousePadZone.MOUSE_PAD_ZONE_LOGO : (int)MousePadZone.MOUSE_PAD_ZONE_0 + ((int)key - (int)DeviceKeys.MOUSEPADLIGHT1));
}
- public void SetLights(Dictionary keyColors)
+ public void SetLights(Dictionary keyColors)
{
if (hMousePad != IntPtr.Zero)
{
- foreach (KeyValuePair keyColor in keyColors)
+ foreach (var keyColor in keyColors)
{
- if (keyColor.Key >= DeviceKeys.MOUSEPADLIGHT1 && keyColor.Key <= DeviceKeys.MOUSEPADLIGHT15)
+ if (keyColor.Key >= (int)DeviceKeys.MOUSEPADLIGHT1 && keyColor.Key <= (int)DeviceKeys.MOUSEPADLIGHT15)
{
- SetLight(keyColor.Key, keyColor.Value);
+ SetLight((DeviceKeys)keyColor.Key, keyColor.Value);
}
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Omen/OmenSpeaker.cs b/Project-Aurora/Project-Aurora/Devices/Omen/OmenSpeaker.cs
index 81d814cf3..c479a6cd1 100644
--- a/Project-Aurora/Project-Aurora/Devices/Omen/OmenSpeaker.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Omen/OmenSpeaker.cs
@@ -44,13 +44,13 @@ public void Shutdown()
}
}
- public void SetLights(Dictionary keyColors)
+ public void SetLights(Dictionary keyColors)
{
if (hSpeaker != IntPtr.Zero)
{
- if (keyColors.ContainsKey(DeviceKeys.Peripheral_Logo))
+ if (keyColors.ContainsKey((int)DeviceKeys.Peripheral_Logo))
{
- SetLight(DeviceKeys.Peripheral_Logo, keyColors[DeviceKeys.Peripheral_Logo]);
+ SetLight(DeviceKeys.Peripheral_Logo, keyColors[(int)DeviceKeys.Peripheral_Logo]);
return;
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs
index cd96f1c46..0a582c2e6 100644
--- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs
@@ -18,166 +18,125 @@
namespace Aurora.Devices.OpenRGB
{
- public class OpenRGBAuroraDevice : DefaultDevice
+ public class OpenRGBDeviceConnector : AuroraDeviceConnector
{
- public override string DeviceName => "OpenRGB";
- protected override string DeviceInfo => string.Join(", ", _devices.Select(d => d.Name));
+
+ protected override string ConnectorName => "OpenRGB";
private OpenRGBClient _openRgb;
- private OpenRGBDevice[] _devices;
- private OpenRGBColor[][] _deviceColors;
- private List[] _keyMappings;
- public override bool Initialize()
+ protected override bool InitializeImpl()
{
- if (IsInitialized)
- return true;
-
try
{
_openRgb = new OpenRGBClient(name: "Aurora");
_openRgb.Connect();
- _devices = _openRgb.GetAllControllerData();
+ OpenRGBDevice[] _devices = _openRgb.GetAllControllerData();
- _deviceColors = new OpenRGBColor[_devices.Length][];
- _keyMappings = new List[_devices.Length];
for (var i = 0; i < _devices.Length; i++)
{
- var dev = _devices[i];
-
- _deviceColors[i] = new OpenRGBColor[dev.Leds.Length];
- for (var ledIdx = 0; ledIdx < dev.Leds.Length; ledIdx++)
- _deviceColors[i][ledIdx] = new OpenRGBColor();
-
- _keyMappings[i] = new List();
-
- for (int j = 0; j < dev.Leds.Length; j++)
- {
- if (dev.Type == OpenRGBDeviceType.Keyboard)
- {
- if (OpenRGBKeyNames.Keyboard.TryGetValue(dev.Leds[j].Name, out var dk))
- {
- _keyMappings[i].Add(dk);
- }
- else
- {
- _keyMappings[i].Add(DK.NONE);
- }
- }
- else if (dev.Type == OpenRGBDeviceType.Mouse)
- {
- if (OpenRGBKeyNames.Mouse.TryGetValue(dev.Leds[j].Name, out var dk))
- {
- _keyMappings[i].Add(dk);
- }
- else
- {
- _keyMappings[i].Add(DK.Peripheral_Logo);
- }
- }
- else
- {
- _keyMappings[i].Add(DK.Peripheral_Logo);
- }
- }
-
- uint LedOffset = 0;
- for (int j = 0; j < dev.Zones.Length; j++)
- {
- if (dev.Zones[j].Type == OpenRGBZoneType.Linear)
- {
- for (int k = 0; k < dev.Zones[j].LedCount; k++)
- {
- if (dev.Type == OpenRGBDeviceType.Mousemat)
- {
- if (k < 15)
- {
- _keyMappings[i][(int)(LedOffset + k)] = OpenRGBKeyNames.MousepadLights[k];
- }
- }
- else
- {
- //TODO - scale zones with more than 32 LEDs
- if (k < 32)
- {
- _keyMappings[i][(int)(LedOffset + k)] = OpenRGBKeyNames.AdditionalLights[k];
- }
- }
- }
- }
- LedOffset += dev.Zones[j].LedCount;
- }
+ OpenRGBAuroraDevice device = new OpenRGBAuroraDevice(_devices[i], i, _openRgb);
+ RegisterDevice(device);
}
}
catch (Exception e)
{
- LogError("error in OpenRGB device: " + e);
- IsInitialized = false;
+ LogError("There was an error in OpenRGB device: " + e);
return false;
}
- IsInitialized = true;
- return IsInitialized;
+ return true;
+ }
+
+ protected override void ShutdownImpl()
+ {
+ _openRgb?.Dispose();
+ _openRgb = null;
}
+ public void UpdateLeds(int deviceIndex, OpenRGBColor[] colors)
+ {
+ _openRgb.UpdateLeds(deviceIndex, colors);
+ }
+ }
+ public class OpenRGBAuroraDevice : AuroraDevice
+ {
+ private OpenRGBDevice Device;
+ private OpenRGBColor[] DeviceColors;
+ private List KeyMapping = new List();
+ private int DeviceIndex;
+ static object update_lock = new object();
+ private OpenRGBClient _openRgb;
+ protected override string DeviceName => Device.Name;
+
+ protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceTypeConverter(Device.Type);
- public override void Shutdown()
+ public int Id { get; set; }
+
+ public OpenRGBAuroraDevice(OpenRGBDevice device, int deviceIndex, OpenRGBClient openRgb)
{
- if (!IsInitialized)
- return;
+ Device = device;
+ _openRgb = openRgb;
+ DeviceIndex = deviceIndex;
+ DeviceColors = new OpenRGBColor[Device.Leds.Length];
+ for (var ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++)
+ DeviceColors[ledIdx] = new OpenRGBColor();
+
+ int overIndex = 0;
- for (var i = 0; i < _devices.Length; i++)
+ for (int j = 0; j < Device.Leds.Length; j++)
{
- try
+ if (Device.Type == OpenRGBDeviceType.Keyboard)
{
- _openRgb.UpdateLeds(i, _devices[i].Colors);
+ if (OpenRGBKeyNames.Keyboard.TryGetValue(Device.Leds[j].Name, out var dk))
+ {
+ KeyMapping.Add(new DeviceKey(dk));
+ }
+ else
+ {
+ KeyMapping.Add(new DeviceKey(500 + overIndex++, Device.Leds[j].Name));
+ }
}
- catch
+ else
{
- //we tried.
+ KeyMapping.Add(new DeviceKey(j, Device.Leds[j].Name));
}
}
-
- _openRgb?.Dispose();
- _openRgb = null;
- IsInitialized = false;
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ protected override bool UpdateDeviceImpl(DeviceColorComposition composition)
{
- if (!IsInitialized)
- return false;
- for (var i = 0; i < _devices.Length; i++)
- {
- //should probably store these bools somewhere when initing
- //might also add this as a property in the library
- if (!_devices[i].Modes.Any(m => m.Name == "Direct"))
- continue;
+ //should probably store these bools somewhere when initing
+ //might also add this as a property in the library
+ if (!Device.Modes.Any(m => m.Name == "Direct"))
+ return true;
- for (int ledIdx = 0; ledIdx < _devices[i].Leds.Length; ledIdx++)
+ for (int ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++)
+ {
+ if (composition.keyColors.TryGetValue(KeyMapping[ledIdx].Tag, out var keyColor))
{
- if (keyColors.TryGetValue(_keyMappings[i][ledIdx], out var keyColor))
- {
- _deviceColors[i][ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B);
- }
+ DeviceColors[ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B);
}
+ }
- try
- {
- _openRgb.UpdateLeds(i, _deviceColors[i]);
- }
- catch (Exception exc)
+ try
+ {
+ lock (update_lock)
{
- LogError($"Failed to update OpenRGB device {_devices[i].Name}: " + exc);
- Reset();
+ _openRgb.UpdateLeds(DeviceIndex, DeviceColors);
}
}
+ catch (Exception exc)
+ {
+ LogError($"Failed to update OpenRGB device {DeviceName}: " + exc);
+ return false;
+ }
- var sleep = Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_sleep");
+ /*var sleep = Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_sleep");
if (sleep > 0)
- Thread.Sleep(sleep);
+ Thread.Sleep(sleep);*/
return true;
}
@@ -186,5 +145,38 @@ protected override void RegisterVariables(VariableRegistry variableRegistry)
{
variableRegistry.Register($"{DeviceName}_sleep", 25, "Sleep for", 1000, 0);
}
+ private AuroraDeviceType AuroraDeviceTypeConverter(OpenRGBDeviceType type)
+ {
+ switch (type)
+ {
+ case OpenRGBDeviceType.Motherboard:
+ break;
+ case OpenRGBDeviceType.Dram:
+ break;
+ case OpenRGBDeviceType.Gpu:
+ break;
+ case OpenRGBDeviceType.Cooler:
+ break;
+ case OpenRGBDeviceType.Ledstrip:
+ break;
+ case OpenRGBDeviceType.Keyboard:
+ return AuroraDeviceType.Keyboard;
+ case OpenRGBDeviceType.Mouse:
+ return AuroraDeviceType.Mouse;
+ case OpenRGBDeviceType.Mousemat:
+ break;
+ case OpenRGBDeviceType.Headset:
+ return AuroraDeviceType.Headset;
+ case OpenRGBDeviceType.HeadsetStand:
+ break;
+ case OpenRGBDeviceType.Unknown:
+ return AuroraDeviceType.Unkown;
+ default:
+ return AuroraDeviceType.Unkown;
+ }
+ return AuroraDeviceType.Unkown;
+ }
+
+ public override List GetAllDeviceKey() => KeyMapping;
}
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs b/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs
index 770227a63..96b6d12cc 100755
--- a/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs
@@ -1,26 +1,28 @@
-using Corale.Colore.Core;
-using Corale.Colore.Razer.Keyboard;
+using Aurora.Utils;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Aurora.Settings;
-using KeyboardCustom = Corale.Colore.Razer.Keyboard.Effects.Custom;
-using MousepadCustom = Corale.Colore.Razer.Mousepad.Effects.Custom;
-using MouseCustom = Corale.Colore.Razer.Mouse.Effects.CustomGrid;
-using KeypadCustom = Corale.Colore.Razer.Keypad.Effects.Custom;
-using ChromaLinkCustom = Corale.Colore.Razer.ChromaLink.Effects.Custom;
+using KeyboardCustom = Colore.Effects.Keyboard.CustomKeyboardEffect;
+using MousepadCustom = Colore.Effects.Mousepad.CustomMousepadEffect;
+using MouseCustom = Colore.Effects.Mouse.CustomMouseEffect;
+using KeypadCustom = Colore.Effects.Keypad.CustomKeypadEffect;
+using ChromaLinkCustom = Colore.Effects.ChromaLink.CustomChromaLinkEffect;
using System.ComponentModel;
using System.Linq;
-using Corale.Colore.Razer.Mouse;
+using Colore;
+using Colore.Data;
+using Colore.Api;
namespace Aurora.Devices.Razer
{
public class RazerDevice : DefaultDevice
{
+ IChroma Chroma;
public override string DeviceName => "Razer";
- private readonly List<(string Name, Guid Guid)> DeviceGuids = typeof(Corale.Colore.Razer.Devices)
+ private readonly List<(string Name, Guid Guid)> DeviceGuids = typeof(Colore.Data.Devices)
.GetFields()
.Select(f => (f.Name, (Guid)f.GetValue(null)))
.ToList();
@@ -38,23 +40,23 @@ public class RazerDevice : DefaultDevice
public override bool Initialize()
{
- if (!Chroma.SdkAvailable)
- {
- LogError("SDK not available. Install Razer synapse");
- return IsInitialized = false;
- }
-
try
{
- Chroma.Instance.Initialize();
+ Chroma = ColoreProvider.CreateNativeAsync().Result;
+ var v = Chroma.SdkVersion;
}
- catch (Corale.Colore.Razer.NativeCallException e)
+ catch (ColoreException e)
{
LogError("Error initializing:" + e.Message);
return IsInitialized = false;
}
+ catch (AggregateException e)
+ {
+ LogError("SDK not available. Install Razer synapse " + e.Message);
+ return IsInitialized = false;
+ }
- if (!Chroma.Instance.Initialized)
+ if (!Chroma.Initialized)
{
LogError("Failed to Initialize Razer Chroma sdk");
return IsInitialized = false;
@@ -73,8 +75,8 @@ public override void Shutdown()
try
{
- Chroma.Instance.SetAll(Color.Black);
- Chroma.Instance.Uninitialize();
+ Chroma.SetAllAsync(Color.Black);
+ Chroma.UninitializeAsync();
IsInitialized = false;
}
catch (Exception e)
@@ -83,44 +85,44 @@ public override void Shutdown()
}
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (!IsInitialized)
return false;
- if (keyColors.TryGetValue(DeviceKeys.Peripheral_Logo, out var clr))
+ if (keyColors.TryGetValue((int)DeviceKeys.Peripheral_Logo, out var color))
{
- keyboard.Set(ToColore(clr));
- mousepad.Set(ToColore(clr));
- mouse.Set(ToColore(clr));
- headset = ToColore(clr);
- chromalink.Set(ToColore(clr));
- keypad.Set(ToColore(clr));
+ keyboard.Set(ToColore(color));
+ mousepad.Set(ToColore(color));
+ mouse.Set(ToColore(color));
+ headset = ToColore(color);
+ chromalink.Set(ToColore(color));
+ keypad.Set(ToColore(color));
}
- foreach (var key in keyColors)
+ foreach (var (key, clr) in keyColors)
{
- if (RazerMappings.keyboardDictionary.TryGetValue(key.Key, out var kbIndex))
- keyboard[kbIndex] = ToColore(key.Value);
+ if (RazerMappings.keyboardDictionary.TryGetValue((DeviceKeys)key, out var kbIndex))
+ keyboard[kbIndex] = ToColore(clr);
- if (RazerMappings.mousepadDictionary.TryGetValue(key.Key, out var mousepadIndex))
- mousepad[mousepadIndex] = ToColore(key.Value);
+ if (RazerMappings.mousepadDictionary.TryGetValue((DeviceKeys)key, out var mousepadIndex))
+ mousepad[mousepadIndex] = ToColore(clr);
- if (RazerMappings.mouseDictionary.TryGetValue(key.Key, out var mouseIndex))
- mouse[mouseIndex] = ToColore(key.Value);
+ if (RazerMappings.mouseDictionary.TryGetValue((DeviceKeys)key, out var mouseIndex))
+ mouse[mouseIndex] = ToColore(clr);
}
if (!Global.Configuration.DevicesDisableKeyboard)
- Chroma.Instance.Keyboard.SetCustom(keyboard);
+ Chroma.Keyboard.SetCustomAsync(keyboard);
if (!Global.Configuration.DevicesDisableMouse)
- Chroma.Instance.Mousepad.SetCustom(mousepad);
+ Chroma.Mousepad.SetCustomAsync(mousepad);
if (!Global.Configuration.DevicesDisableMouse)
- Chroma.Instance.Mouse.SetGrid(mouse);
+ Chroma.Mouse.SetGridAsync(mouse);
if (!Global.Configuration.DevicesDisableHeadset)
- Chroma.Instance.Headset.SetAll(headset);
+ Chroma.Headset.SetAllAsync(headset);
- Chroma.Instance.Keypad.SetCustom(keypad);
- Chroma.Instance.ChromaLink.SetCustom(chromalink);
+ Chroma.Keypad.SetCustomAsync(keypad);
+ Chroma.ChromaLink.SetCustomAsync(chromalink);
return true;
}
@@ -132,21 +134,21 @@ protected override void RegisterVariables(VariableRegistry variableRegistry)
private Color ToColore(System.Drawing.Color value) => new Color(value.R, value.G, value.B);
- private void DetectDevices()
+ private async void DetectDevices()
{
deviceNames.Clear();
- foreach (var device in DeviceGuids.Where(d => d.Name != "Razer Core Chroma"))//somehow this device is unsupported, can't query it
+ foreach (var device in DeviceGuids)
{
try
{
- var devInfo = Chroma.Instance.Query(device.Guid);
+ var devInfo = await Chroma.QueryAsync(device.Guid);
if (devInfo.Connected)
{
deviceNames.Add(device.Name);
}
}
- catch (Corale.Colore.Razer.NativeCallException e)
+ catch (ColoreException e)
{
LogError("Error querying device: " + e.Message);
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Razer/RazerMappings.cs b/Project-Aurora/Project-Aurora/Devices/Razer/RazerMappings.cs
index f7f9ac25e..7951ea900 100644
--- a/Project-Aurora/Project-Aurora/Devices/Razer/RazerMappings.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Razer/RazerMappings.cs
@@ -1,5 +1,5 @@
-using Corale.Colore.Razer.Keyboard;
-using Corale.Colore.Razer.Mouse;
+using Colore.Effects.Keyboard;
+using Colore.Effects.Mouse;
using System;
using System.Collections.Generic;
using System.Linq;
diff --git a/Project-Aurora/Project-Aurora/Devices/Roccat/RoccatDevice.cs b/Project-Aurora/Project-Aurora/Devices/Roccat/RoccatDevice.cs
index e4111b543..b9c3eb0c2 100755
--- a/Project-Aurora/Project-Aurora/Devices/Roccat/RoccatDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Roccat/RoccatDevice.cs
@@ -286,7 +286,7 @@ public bool IsConnected()
byte[] stateStruct = new byte[110];
Roccat_Talk.TalkFX.Color[] colorStruct = new Roccat_Talk.TalkFX.Color[110];
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (RyosTalkFX == null || !RyosInitialized)
return false;
@@ -303,10 +303,10 @@ public bool UpdateDevice(Dictionary keyColors,
else if (Global.Configuration.KeyboardLocalization == PreferredKeyboardLocalization.jpn)
layout = DeviceLayout.JP;
- foreach (KeyValuePair key in keyColors)
+ foreach (KeyValuePair key in keyColors)
{
if (e.Cancel) return false;
- DeviceKeys dev_key = key.Key;
+ DeviceKeys dev_key = (DeviceKeys)key.Key;
//Solution to slightly different mapping rather than giving a whole different dictionary
if (layout == DeviceLayout.ANSI)
{
@@ -320,7 +320,7 @@ public bool UpdateDevice(Dictionary keyColors,
if (Global.Configuration.VarRegistry.GetVariable($"{devicename}_enable_generic") == true)
{
generic_deactivated_first_time = true;
- if (key.Key == DeviceKeys.Peripheral_Logo || key.Key == DeviceKeys.Peripheral)
+ if ((DeviceKeys)key.Key == DeviceKeys.Peripheral_Logo || (DeviceKeys)key.Key == DeviceKeys.Peripheral)
{
//Send to generic roccat device if color not equal or 1. time after generic got enabled
if (!previous_peripheral_Color.Equals(key.Value) || generic_activated_first_time == true)
diff --git a/Project-Aurora/Project-Aurora/Devices/ScriptedDevice/ScriptedDevice.cs b/Project-Aurora/Project-Aurora/Devices/ScriptedDevice/ScriptedDevice.cs
index 5d322deae..e94dad1eb 100644
--- a/Project-Aurora/Project-Aurora/Devices/ScriptedDevice/ScriptedDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/ScriptedDevice/ScriptedDevice.cs
@@ -136,7 +136,7 @@ public void Shutdown()
}
}
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (isInitialized)
{
diff --git a/Project-Aurora/Project-Aurora/Devices/SteelSeries/SteelSeriesDevice.cs b/Project-Aurora/Project-Aurora/Devices/SteelSeries/SteelSeriesDevice.cs
index c68ff22cf..1454e419d 100755
--- a/Project-Aurora/Project-Aurora/Devices/SteelSeries/SteelSeriesDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/SteelSeries/SteelSeriesDevice.cs
@@ -118,7 +118,7 @@ public bool IsConnected()
public bool IsInitialized => this.isInitialized;
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (e.Cancel) return false;
@@ -139,7 +139,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
GameSensePayloadPeripheryColorEventJSON payload = new GameSensePayloadPeripheryColorEventJSON();
gameSenseSDK.setupEvent(payload);
- foreach (KeyValuePair key in keyColors)
+ foreach (KeyValuePair key in keyColors)
{
@@ -153,7 +153,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
if (e.Cancel) return false;
- switch (key.Key)
+ switch ((DeviceKeys)key.Key)
{
case DeviceKeys.Peripheral:
SendColorToPeripheral(color, payload, forced);
@@ -161,7 +161,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
case DeviceKeys.Peripheral_Logo:
case DeviceKeys.Peripheral_FrontLight:
case DeviceKeys.Peripheral_ScrollWheel:
- SendColorToPeripheralZone(key.Key, color, payload);
+ SendColorToPeripheralZone((DeviceKeys)key.Key, color, payload);
break;
case DeviceKeys.MOUSEPADLIGHT1:
case DeviceKeys.MOUSEPADLIGHT2:
@@ -179,7 +179,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
colorsMousepad.Add(Tuple.Create(color.R, color.G, color.B));
break;
default:
- byte hid = GetHIDCode(key.Key);
+ byte hid = GetHIDCode((DeviceKeys)key.Key);
if (hid != (byte)USBHIDCodes.ERROR)
{
@@ -389,9 +389,9 @@ public static byte GetHIDCode(DeviceKeys key)
case (DeviceKeys.JPN_HALFFULLWIDTH):
return (byte)USBHIDCodes.TILDE;
case (DeviceKeys.OEM5):
- if (Global.kbLayout.Loaded_Localization == Settings.PreferredKeyboardLocalization.jpn)
+ /*if (Global.kbLayout.Loaded_Localization == Settings.PreferredKeyboardLocalization.jpn)
return (byte)USBHIDCodes.ERROR;
- else
+ else*/
return (byte)USBHIDCodes.TILDE;
case (DeviceKeys.TILDE):
return (byte)USBHIDCodes.TILDE;
@@ -514,9 +514,9 @@ public static byte GetHIDCode(DeviceKeys key)
case (DeviceKeys.LEFT_SHIFT):
return (byte)USBHIDCodes.LEFT_SHIFT;
case (DeviceKeys.BACKSLASH_UK):
- if (Global.kbLayout.Loaded_Localization == Settings.PreferredKeyboardLocalization.jpn)
+ /*if (Global.kbLayout.Loaded_Localization == Settings.PreferredKeyboardLocalization.jpn)
return (byte)USBHIDCodes.ERROR;
- else
+ else*/
return (byte)USBHIDCodes.BACKSLASH_UK;
case (DeviceKeys.Z):
return (byte)USBHIDCodes.Z;
diff --git a/Project-Aurora/Project-Aurora/Devices/UnifiedHID/UnifiedHID.cs b/Project-Aurora/Project-Aurora/Devices/UnifiedHID/UnifiedHID.cs
index fc7801411..77165176a 100644
--- a/Project-Aurora/Project-Aurora/Devices/UnifiedHID/UnifiedHID.cs
+++ b/Project-Aurora/Project-Aurora/Devices/UnifiedHID/UnifiedHID.cs
@@ -138,7 +138,7 @@ public bool IsConnected()
public bool IsInitialized => this.isInitialized;
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (e.Cancel) return false;
try
@@ -151,7 +151,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
if (!device.IsKeyboard)
{
- foreach (KeyValuePair key in keyColors)
+ foreach (KeyValuePair key in keyColors)
{
Color color = (Color)key.Value;
//Apply and strip Alpha
@@ -160,9 +160,9 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg
if (e.Cancel) return false;
else if (Global.Configuration.AllowPeripheralDevices && !Global.Configuration.DevicesDisableMouse)
{
- if (key.Key == DeviceKeys.Peripheral_Logo || key.Key == DeviceKeys.Peripheral_ScrollWheel || key.Key == DeviceKeys.Peripheral_FrontLight)
+ if ((DeviceKeys)key.Key == DeviceKeys.Peripheral_Logo || (DeviceKeys)key.Key == DeviceKeys.Peripheral_ScrollWheel || (DeviceKeys)key.Key == DeviceKeys.Peripheral_FrontLight)
{
- device.SetLEDColour(key.Key, color.R, color.G, color.B);
+ device.SetLEDColour((DeviceKeys)key.Key, color.R, color.G, color.B);
}
peripheral_updated = true;
}
@@ -246,7 +246,7 @@ interface ISSDevice
bool Connect();
bool Disconnect();
bool SetLEDColour(DeviceKeys key, byte red, byte green, byte blue);
- bool SetMultipleLEDColour(Dictionary keyColors);
+ bool SetMultipleLEDColour(Dictionary keyColors);
}
abstract class UnifiedBase : ISSDevice
@@ -300,7 +300,7 @@ public virtual bool SetLEDColour(DeviceKeys key, byte red, byte green, byte blue
return false;
}
- public virtual bool SetMultipleLEDColour(Dictionary keyColors)
+ public virtual bool SetMultipleLEDColour(Dictionary keyColors)
{
return false;
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Uniwill/UniwillDevice.cs b/Project-Aurora/Project-Aurora/Devices/Uniwill/UniwillDevice.cs
index 124b41f1d..d01b07fc1 100644
--- a/Project-Aurora/Project-Aurora/Devices/Uniwill/UniwillDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Uniwill/UniwillDevice.cs
@@ -195,7 +195,7 @@ public bool IsConnected()
bool bRefreshOnce = true; // This is used to refresh effect between Row-Type and Fw-Type change or layout light level change
- public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (e.Cancel) return false;
@@ -221,9 +221,9 @@ public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArg
return update_result;
}
- private KeyValuePair AdjustBrightness(KeyValuePair kc)
+ private KeyValuePair AdjustBrightness(KeyValuePair kc)
{
- var newEntry = new KeyValuePair(kc.Key, Color.FromArgb(255, Utils.ColorUtils.MultiplyColorByScalar(kc.Value, (kc.Value.A / 255.0D) * brightness)));
+ var newEntry = new KeyValuePair(kc.Key, Color.FromArgb(255, Utils.ColorUtils.MultiplyColorByScalar(kc.Value, (kc.Value.A / 255.0D) * brightness)));
kc = newEntry;
return kc;
}
diff --git a/Project-Aurora/Project-Aurora/Devices/Vulcan/Vulcan.cs b/Project-Aurora/Project-Aurora/Devices/Vulcan/Vulcan.cs
index 999f81f49..1ba8d1db7 100644
--- a/Project-Aurora/Project-Aurora/Devices/Vulcan/Vulcan.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Vulcan/Vulcan.cs
@@ -21,15 +21,15 @@ public class VulcanDevice : DefaultDevice
public override void Shutdown() => VulcanKeyboard.Disconnect();
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (!IsInitialized)
return false;
- foreach (var key in keyColors)
+ foreach (var (key, clr) in keyColors)
{
- if (VulcanKeyMap.KeyMap.TryGetValue(key.Key, out var vulcanKey))
- VulcanKeyboard.SetKeyColor(vulcanKey, ColorUtils.CorrectWithAlpha(key.Value));
+ if (VulcanKeyMap.KeyMap.TryGetValue((DeviceKeys)key, out var vulcanKey))
+ VulcanKeyboard.SetKeyColor(vulcanKey, ColorUtils.CorrectWithAlpha(clr));
}
return VulcanKeyboard.Update();
diff --git a/Project-Aurora/Project-Aurora/Devices/Wooting/WootingDevice.cs b/Project-Aurora/Project-Aurora/Devices/Wooting/WootingDevice.cs
index 40c7d7ef1..5a7906894 100755
--- a/Project-Aurora/Project-Aurora/Devices/Wooting/WootingDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/Wooting/WootingDevice.cs
@@ -58,7 +58,7 @@ public override void Shutdown()
IsInitialized = false;
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
if (!IsInitialized)
return false;
@@ -69,14 +69,14 @@ public override bool UpdateDevice(Dictionary keyColors, DoWor
try
{
- foreach (var key in keyColors)
+ foreach (var (key, clr) in keyColors)
{
- if (WootingKeyMap.KeyMap.TryGetValue(key.Key, out var wootKey))
+ if (WootingKeyMap.KeyMap.TryGetValue((DeviceKeys)key, out var wootKey))
{
- var clr = ColorUtils.CorrectWithAlpha(key.Value);
- RGBControl.SetKey(wootKey, (byte)(clr.R * rScalar),
- (byte)(clr.G * gScalar),
- (byte)(clr.B * bScalar));
+ var color = ColorUtils.CorrectWithAlpha(clr);
+ RGBControl.SetKey(wootKey, (byte)(color.R * rScalar),
+ (byte)(color.G * gScalar),
+ (byte)(color.B * bScalar));
}
}
RGBControl.UpdateKeyboard();
diff --git a/Project-Aurora/Project-Aurora/Devices/YeeLight/YeeLightDevice.cs b/Project-Aurora/Project-Aurora/Devices/YeeLight/YeeLightDevice.cs
index e7c5770ff..3e1ed0e85 100644
--- a/Project-Aurora/Project-Aurora/Devices/YeeLight/YeeLightDevice.cs
+++ b/Project-Aurora/Project-Aurora/Devices/YeeLight/YeeLightDevice.cs
@@ -100,7 +100,7 @@ public override void Shutdown()
}
}
- public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
+ public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false)
{
// Reduce sending based on user config
if (!updateDelayStopWatch.IsRunning)
@@ -112,7 +112,7 @@ public override bool UpdateDevice(Dictionary keyColors, DoWor
return false;
var targetKey = Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_devicekey");
- if (!keyColors.TryGetValue(targetKey, out var targetColor))
+ if (!keyColors.TryGetValue((int)targetKey, out var targetColor))
return false;
if ((targetColor.R + targetColor.G + targetColor.B) > 0)
diff --git a/Project-Aurora/Project-Aurora/EffectsEngine/Animations/AnimationManualColorFrame.cs b/Project-Aurora/Project-Aurora/EffectsEngine/Animations/AnimationManualColorFrame.cs
index 11c1e13df..b30a009aa 100644
--- a/Project-Aurora/Project-Aurora/EffectsEngine/Animations/AnimationManualColorFrame.cs
+++ b/Project-Aurora/Project-Aurora/EffectsEngine/Animations/AnimationManualColorFrame.cs
@@ -1,4 +1,5 @@
using Aurora.Devices;
+using Aurora.Settings;
using System;
using System.Collections.Generic;
using System.Drawing;
@@ -11,13 +12,13 @@ namespace Aurora.EffectsEngine.Animations
public class AnimationManualColorFrame : AnimationFrame
{
[Newtonsoft.Json.JsonProperty]
- private Dictionary _BitmapColors = new Dictionary();
+ private Dictionary _BitmapColors = new Dictionary();
- public Dictionary BitmapColors {
- get { return new Dictionary(_BitmapColors); }
+ public Dictionary BitmapColors {
+ get { return new Dictionary(_BitmapColors); }
}
- public AnimationFrame SetKeyColor(DeviceKeys Key, Color Color)
+ public AnimationFrame SetKeyColor(DeviceKey Key, Color Color)
{
if (_BitmapColors.ContainsKey(Key))
_BitmapColors[Key] = Color;
@@ -27,7 +28,7 @@ public AnimationFrame SetKeyColor(DeviceKeys Key, Color Color)
return this;
}
- public AnimationFrame SetBitmapColors(Dictionary ColorMapping)
+ public AnimationFrame SetBitmapColors(Dictionary ColorMapping)
{
if(ColorMapping != null)
_BitmapColors = ColorMapping;
@@ -37,11 +38,11 @@ public AnimationFrame SetBitmapColors(Dictionary ColorMapping
public AnimationManualColorFrame()
{
- _BitmapColors = new Dictionary();
+ _BitmapColors = new Dictionary();
_duration = 0.0f;
}
- public AnimationManualColorFrame(Dictionary ColorMapping, float duration = 0.0f)
+ public AnimationManualColorFrame(Dictionary ColorMapping, float duration = 0.0f)
{
_BitmapColors = ColorMapping;
@@ -72,7 +73,7 @@ public override AnimationFrame BlendWith(AnimationFrame otherAnim, double amount
throw new FormatException("Cannot blend with another type");
}
- Dictionary _combinedBitmapColors = new Dictionary();
+ Dictionary _combinedBitmapColors = new Dictionary();
amount = GetTransitionValue(amount);
foreach (var kvp in _BitmapColors)
@@ -103,7 +104,7 @@ public override AnimationFrame BlendWith(AnimationFrame otherAnim, double amount
public override AnimationFrame GetCopy()
{
- Dictionary newmapping = new Dictionary(_BitmapColors);
+ Dictionary newmapping = new Dictionary(_BitmapColors);
return new AnimationManualColorFrame(newmapping, _duration).SetAngle(_angle).SetTransitionType(_transitionType);
}
diff --git a/Project-Aurora/Project-Aurora/EffectsEngine/EffectLayer.cs b/Project-Aurora/Project-Aurora/EffectsEngine/EffectLayer.cs
index f3b54fe36..e35bce8dc 100755
--- a/Project-Aurora/Project-Aurora/EffectsEngine/EffectLayer.cs
+++ b/Project-Aurora/Project-Aurora/EffectsEngine/EffectLayer.cs
@@ -21,15 +21,6 @@ public class EffectLayer : IDisposable
private bool needsRender = false;
- Color peripheral;
-
- private static Devices.DeviceKeys[] possible_peripheral_keys = {
- Devices.DeviceKeys.Peripheral,
- Devices.DeviceKeys.Peripheral_FrontLight,
- Devices.DeviceKeys.Peripheral_ScrollWheel,
- Devices.DeviceKeys.Peripheral_Logo
- };
-
static private ColorSpectrum rainbow = new ColorSpectrum(ColorSpectrum.RainbowLoop);
///
@@ -39,7 +30,6 @@ public EffectLayer()
{
name = "Effect Layer";
colormap = new Bitmap(Effects.canvas_width, Effects.canvas_height);
- peripheral = Color.FromArgb(0, 0, 0, 0);
Fill(Color.FromArgb(0, 0, 0, 0));
}
@@ -52,7 +42,6 @@ public EffectLayer(EffectLayer another_layer)
{
this.name = another_layer.name;
colormap = new Bitmap(another_layer.colormap);
- peripheral = another_layer.peripheral;
needsRender = another_layer.needsRender;
}
@@ -65,7 +54,6 @@ public EffectLayer(string name)
{
this.name = name;
colormap = new Bitmap(Effects.canvas_width, Effects.canvas_height);
- peripheral = Color.FromArgb(0, 0, 0, 0);
Fill(Color.FromArgb(0, 0, 0, 0));
}
@@ -79,7 +67,6 @@ public EffectLayer(string name, Color color)
{
this.name = name;
colormap = new Bitmap(Effects.canvas_width, Effects.canvas_height);
- peripheral = color;
Fill(color);
}
@@ -96,7 +83,6 @@ public EffectLayer(string name, Color color)
{
this.name = name;
colormap = new Bitmap(Effects.canvas_width, Effects.canvas_height);
- peripheral = new Color();
Brush brush;
float shift = 0.0f;
@@ -414,7 +400,7 @@ public EffectLayer Set(int x, int y, Color color)
/// DeviceKey to be set
/// Color to be used
/// Itself
- public EffectLayer Set(Devices.DeviceKeys key, Color color)
+ public EffectLayer Set(DeviceKey key, Color color)
{
SetOneKey(key, color);
@@ -427,7 +413,7 @@ public EffectLayer Set(Devices.DeviceKeys key, Color color)
/// Array of DeviceKeys to be set
/// Color to be used
/// Itself
- public EffectLayer Set(Devices.DeviceKeys[] keys, Color color)
+ public EffectLayer Set(DeviceKey[] keys, Color color)
{
foreach(var key in keys)
SetOneKey(key, color);
@@ -570,7 +556,9 @@ public EffectLayer DrawTransformed(KeySequence sequence, Action render
/// DeviceKey to be set
/// Color to be used
/// Itself
- private EffectLayer SetOneKey(Devices.DeviceKeys key, Color color) => SetOneKey(key, new SolidBrush(color));
+
+ private EffectLayer SetOneKey(DeviceKey key, Color color) => SetOneKey(key, new SolidBrush(color));
+
///
/// Sets one DeviceKeys key with a specific brush on the bitmap
@@ -578,44 +566,22 @@ public EffectLayer DrawTransformed(KeySequence sequence, Action render
/// DeviceKey to be set
/// Brush to be used
/// Itself
- private EffectLayer SetOneKey(Devices.DeviceKeys key, Brush brush)
+ private EffectLayer SetOneKey(DeviceKey key, Brush brush)
{
BitmapRectangle keymaping = Effects.GetBitmappingFromDeviceKey(key);
- if (key == Devices.DeviceKeys.Peripheral)
+ if (keymaping.Top < 0 || keymaping.Bottom > Effects.canvas_height ||
+ keymaping.Left < 0 || keymaping.Right > Effects.canvas_width)
{
- if (brush is SolidBrush solidBrush)
- peripheral = solidBrush.Color;
- // TODO Add support for this ^ to other brush types
-
- using (Graphics g = Graphics.FromImage(colormap))
- {
- foreach (Devices.DeviceKeys peri_key in possible_peripheral_keys)
- {
- BitmapRectangle peri_keymaping = Effects.GetBitmappingFromDeviceKey(peri_key);
-
- if (peri_keymaping.IsValid)
- g.FillRectangle(brush, peri_keymaping.Rectangle);
- }
-
- needsRender = true;
- }
+ Global.logger.Warn("Coudln't set key color " + key.ToString());
+ return this;
}
else
{
- if (keymaping.Top < 0 || keymaping.Bottom > Effects.canvas_height ||
- keymaping.Left < 0 || keymaping.Right > Effects.canvas_width)
- {
- Global.logger.Warn("Coudln't set key color " + key.ToString());
- return this;
- }
- else
+ using (Graphics g = Graphics.FromImage(colormap))
{
- using (Graphics g = Graphics.FromImage(colormap))
- {
- g.FillRectangle(brush, keymaping.Rectangle);
- needsRender = true;
- }
+ g.FillRectangle(brush, keymaping.Rectangle);
+ needsRender = true;
}
}
@@ -628,7 +594,7 @@ private EffectLayer SetOneKey(Devices.DeviceKeys key, Brush brush)
/// X Coordiante on the bitmap
/// Y Coordinate on the bitmap
/// Color at (X,Y)
- public Color Get(int x, int y)
+ public Color Get(int deviceId, int x, int y)
{
BitmapData srcData = colormap.LockBits(
new Rectangle(x, y, 1, 1),
@@ -661,23 +627,16 @@ public Color Get(int x, int y)
///
/// Key
/// Color of the Key
- public Color Get(Devices.DeviceKeys key)
+ public Color Get(DeviceKey key)
{
try
{
BitmapRectangle keymaping = Effects.GetBitmappingFromDeviceKey(key);
- if (keymaping.IsEmpty && key == Devices.DeviceKeys.Peripheral)
- {
- return peripheral;
- }
- else
- {
- if (keymaping.IsEmpty)
- return Color.FromArgb(0, 0, 0);
+ if (keymaping.IsEmpty || keymaping.Height + keymaping.Top > colormap.Height || keymaping.Width + keymaping.Left > colormap.Width)
+ return Color.FromArgb(0, 0, 0);
- return Utils.BitmapUtils.GetRegionColor(colormap, keymaping.Rectangle);
- }
+ return Utils.BitmapUtils.GetRegionColor(colormap, keymaping.Rectangle);
}
catch (Exception exc)
{
@@ -722,8 +681,6 @@ public Bitmap GetBitmap()
g.DrawImage(rhs.colormap, 0, 0);
}
- added.peripheral = Utils.ColorUtils.AddColors(lhs.peripheral, rhs.peripheral);
-
return added;
}
@@ -765,8 +722,6 @@ public Bitmap GetBitmap()
layer.colormap.UnlockBits(srcData);
- layer.peripheral = Utils.ColorUtils.MultiplyColorByScalar(layer.peripheral, value);
-
return layer;
}
@@ -819,7 +774,7 @@ public EffectLayer PercentEffect(ColorSpectrum spectrum, Settings.KeySequence se
/// The maxiumum progress value
/// The percent effect type
/// Itself
- public EffectLayer PercentEffect(Color foregroundColor, Color backgroundColor, Devices.DeviceKeys[] keys, double value, double total, PercentEffectType percentEffectType = PercentEffectType.Progressive, double flash_past = 0.0, bool flash_reversed = false, bool blink_background = false)
+ public EffectLayer PercentEffect(Color foregroundColor, Color backgroundColor, DeviceKey[] keys, double value, double total, PercentEffectType percentEffectType = PercentEffectType.Progressive, double flash_past = 0.0, bool flash_reversed = false, bool blink_background = false)
{
double progress_total = value / total;
if (progress_total < 0.0)
@@ -848,7 +803,7 @@ public EffectLayer PercentEffect(Color foregroundColor, Color backgroundColor, D
} else {
for (int i = 0; i < keys.Count(); i++)
{
- Devices.DeviceKeys current_key = keys[i];
+ DeviceKey current_key = keys[i];
switch (percentEffectType)
{
@@ -888,7 +843,7 @@ public EffectLayer PercentEffect(Color foregroundColor, Color backgroundColor, D
/// The maxiumum progress value
/// The percent effect type
/// Itself
- public EffectLayer PercentEffect(ColorSpectrum spectrum, Devices.DeviceKeys[] keys, double value, double total, PercentEffectType percentEffectType = PercentEffectType.Progressive, double flash_past = 0.0, bool flash_reversed = false)
+ public EffectLayer PercentEffect(ColorSpectrum spectrum, DeviceKey[] keys, double value, double total, PercentEffectType percentEffectType = PercentEffectType.Progressive, double flash_past = 0.0, bool flash_reversed = false)
{
double progress_total = value / total;
if (progress_total < 0.0)
@@ -910,7 +865,7 @@ public EffectLayer PercentEffect(ColorSpectrum spectrum, Devices.DeviceKeys[] ke
for (int i = 0; i < keys.Count(); i++)
{
- Devices.DeviceKeys current_key = keys[i];
+ DeviceKey current_key = keys[i];
switch (percentEffectType)
{
diff --git a/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs b/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs
index d396ebe5c..3cdaf955f 100755
--- a/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs
+++ b/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs
@@ -5,6 +5,7 @@
using Aurora.Devices;
using System.Drawing;
using System.Timers;
+using Aurora.Settings;
namespace Aurora
{
@@ -132,13 +133,6 @@ public class Effects
int pushedframes = 0;
Timer fpsDebugTimer = new Timer(1000D);
- public static Devices.DeviceKeys[] possible_peripheral_keys = {
- Devices.DeviceKeys.Peripheral,
- Devices.DeviceKeys.Peripheral_FrontLight,
- Devices.DeviceKeys.Peripheral_ScrollWheel,
- Devices.DeviceKeys.Peripheral_Logo
- };
-
Bitmap _forcedFrame = null;
@@ -174,6 +168,8 @@ public static float editor_to_canvas_width
{
get
{
+ if (grid_width == 0)
+ return 0;
return canvas_width / grid_width;
}
}
@@ -182,6 +178,8 @@ public static float editor_to_canvas_height
{
get
{
+ if (grid_height == 0)
+ return 0;
return canvas_height / grid_height;
}
}
@@ -199,15 +197,15 @@ public static int canvas_biggest
///
public static Aurora.Settings.FreeFormObject WholeCanvasFreeForm => new Settings.FreeFormObject(-grid_baseline_x, -grid_baseline_y, grid_width, grid_height);
- private static Dictionary bitmap_map = new Dictionary();
+ private static Dictionary bitmap_map = new Dictionary(new DeviceKey.EqualityComparer());
- private static Dictionary keyColors = new Dictionary();
+ private static Dictionary keyColors = new Dictionary(new DeviceKey.EqualityComparer());
public Effects()
{
- Devices.DeviceKeys[] allKeys = bitmap_map.Keys.ToArray();
+ DeviceKey[] allKeys = bitmap_map.Keys.ToArray();
- foreach (Devices.DeviceKeys key in allKeys)
+ foreach (var key in allKeys)
{
keyColors.Add(key, Color.FromArgb(0, 0, 0));
}
@@ -269,15 +267,15 @@ public void SetCanvasSize(int width, int height)
canvas_height = height == 0 ? 1 : height;
}
- public static BitmapRectangle GetBitmappingFromDeviceKey(DeviceKeys key)
+ public static BitmapRectangle GetBitmappingFromDeviceKey(DeviceKey key)
{
if (bitmap_map.ContainsKey(key))
- return bitmap_map[key];
- else
- return new BitmapRectangle();
+ return bitmap_map[bitmap_map.Keys.First(k => k == key)];
+
+ return new BitmapRectangle();
}
- public void SetBitmapping(Dictionary bitmap_map)
+ public void SetBitmapping(Dictionary bitmap_map)
{
Effects.bitmap_map = bitmap_map;
}
@@ -300,18 +298,11 @@ public void PushFrame(EffectFrame frame)
background += layer;
//Apply Brightness
- Dictionary peripehralColors = new Dictionary();
-
- foreach (Devices.DeviceKeys key in possible_peripheral_keys)
- {
- if(!peripehralColors.ContainsKey(key))
- peripehralColors.Add(key, background.Get(key));
- }
background.Fill(Color.FromArgb((int)(255.0f * (1.0f - Global.Configuration.KeyboardBrightness)), Color.Black));
- foreach (Devices.DeviceKeys key in possible_peripheral_keys)
- background.Set(key, Utils.ColorUtils.BlendColors(peripehralColors[key], Color.Black, (1.0f - Global.Configuration.PeripheralBrightness)));
+ //foreach (Devices.DeviceKeys key in possible_peripheral_keys)
+ // background.Set(key, Utils.ColorUtils.BlendColors(peripehralColors[key], Color.Black, (1.0f - Global.Configuration.PeripheralBrightness)));
//if (Global.Configuration.UseVolumeAsBrightness)
@@ -327,22 +318,37 @@ public void PushFrame(EffectFrame frame)
}
}
- Dictionary keyColors = new Dictionary();
- Devices.DeviceKeys[] allKeys = bitmap_map.Keys.ToArray();
+ var keyColors = new Dictionary();
+
+ DeviceKey[] allKeys = bitmap_map.Keys.ToArray();
- foreach (Devices.DeviceKeys key in allKeys)
+ foreach (var key in allKeys)
+ {
keyColors[key] = background.Get(key);
+ }
+
- Effects.keyColors = new Dictionary(keyColors);
+ Effects.keyColors = new Dictionary