From 871c29568c3290f5c6972b74c53cb0486985b871 Mon Sep 17 00:00:00 2001 From: Alex Ritter Date: Thu, 6 Feb 2020 23:17:11 +0100 Subject: [PATCH 01/42] Dynamical layout json files scanning --- .../Images}/Asus_Pugio.psd | Bin .../Images}/Asus_Pugio_backlights.png | Bin .../Images}/Asus_Pugio_body.png | Bin .../Images}/Asus_Pugio_logo.png | Bin .../Images}/Asus_Pugio_wheel.png | Bin .../Images}/Corsair_Katar.psd | Bin .../Images}/Corsair_Katar_logo.png | Bin .../Images}/Corsair_Katar_outline.png | Bin .../Images}/Corsair_M65.psd | Bin .../Images}/Corsair_M65_logo.png | Bin .../Images}/Corsair_M65_outline.png | Bin .../Images}/Corsair_M65_scrollwheel.png | Bin .../Images}/Corsair_logo.png | Bin .../Images}/Corsair_strafe_logo.png | Bin .../Images}/Logi_G502.pdn | Bin .../Images}/Logi_G502_logo.png | Bin .../Images}/Logi_G502_outline.png | Bin .../Images}/Logi_G810.psd | Bin .../Images}/Logi_G810_logo.png | Bin .../Images}/Logi_G900.psd | Bin .../Images}/Logi_G900_logo.png | Bin .../Images}/Logi_G900_outline.png | Bin .../Images}/Logi_G910_badge.png | Bin .../Images}/Logi_G910_logo.png | Bin .../Images}/Omen_logo.png | Bin .../Images}/Omen_logo.psd | Bin .../Images}/Razer_logo.png | Bin .../Images}/Razer_logo.psd | Bin .../images => DeviceLayouts/Images}/Sabre.psd | Bin .../Images}/Sabre_front_lights.png | Bin .../Images}/Sabre_outline.png | Bin .../Images}/Sabre_scrollwheel.png | Bin .../Images}/SoundBlasterX_logo.png | Bin .../Images}/SteelSeries_Apex_logo.png | Bin .../Images}/SteelSeries_Rival_300_logo.png | Bin .../Images}/SteelSeries_Rival_300_logo.psd | Bin .../Images}/SteelSeries_Rival_300_outline.png | Bin .../Images}/SteelSeries_Rival_300_outline.psd | Bin .../SteelSeries_Rival_300_scrollwheel.png | Bin .../SteelSeries_Rival_300_scrollwheel.psd | Bin .../corsair_k65_right_features.json | 0 .../corsair_k68_right_features.json | 0 .../corsair_k70_mk2_features.json | 0 .../corsair_k95_left_features.json | 0 .../corsair_k95_platinum_left_features.json | 0 .../corsair_k95_platinum_right_features.json | 0 .../corsair_k95_right_features.json | 0 .../corsair_strafe_left_features.json | 0 .../corsair_strafe_right_features.json | 0 .../drevo_blademaster_left_features.json | 0 .../generic_laptop_left_bottom_features.json | 0 ...ic_laptop_numpad_left_bottom_features.json | 0 ...c_laptop_numpad_right_bottom_features.json | 0 .../generic_laptop_numpad_right_features.json | 0 .../generic_laptop_right_bottom_features.json | 0 .../generic_laptop_right_features.json | 0 .../logitech_g810_features.json} | 0 .../logitech_g910_features.json | 312 +++++++------- .../logitech_g910_left_bottom_features.json | 42 +- .../logitech_gpro_features.json} | 42 +- .../masterkeys_mk750_bottom_features.json | 0 .../masterkeys_mk750_left_features.json | 0 .../masterkeys_mk750_right_features.json | 0 .../masterkeys_pro_l_right_features.json | 0 .../masterkeys_pro_m_features.json | 0 .../razer_blackwidow_features.json | 160 +++---- ...razer_blackwidow_left_bottom_features.json | 42 +- .../razer_blade_left_bottom_features.json | 0 .../razer_blade_right_bottom_features.json | 0 .../razer_blade_right_features.json | 0 .../Extra Features/roccat_ryos_features.json | 160 +++---- ...undblasterx_vanguardk08_left_features.json | 0 ...ndblasterx_vanguardk08_right_features.json | 0 .../steelseries_apex_m750_features.json | 0 .../steelseries_apex_m750_tkl_features.json | 0 .../steelseries_apex_m800_left_features.json | 0 .../steelseries_apex_m800_right_features.json | 0 .../Extra Features/wooting_two_features.json | 0 .../Plain Keyboard/layout.abnt2.json | 0 .../Keyboard}/Plain Keyboard/layout.ansi.json | 0 .../Keyboard}/Plain Keyboard/layout.de.json | 0 .../Plain Keyboard/layout.dvorak.json | 0 .../Plain Keyboard/layout.dvorak_int.json | 0 .../Keyboard}/Plain Keyboard/layout.es.json | 0 .../Keyboard}/Plain Keyboard/layout.fr.json | 0 .../Keyboard}/Plain Keyboard/layout.hu.json | 0 .../Keyboard}/Plain Keyboard/layout.intl.json | 0 .../Keyboard}/Plain Keyboard/layout.iso.json | 0 .../Keyboard}/Plain Keyboard/layout.it.json | 0 .../Keyboard}/Plain Keyboard/layout.jpn.json | 0 .../Keyboard}/Plain Keyboard/layout.la.json | 0 .../Plain Keyboard/layout.nordic.json | 0 .../Keyboard}/Plain Keyboard/layout.ru.json | 0 .../Plain Keyboard/layout.swiss.json | 0 .../Keyboard}/Plain Keyboard/layout.tr.json | 0 .../Keyboard}/Plain Keyboard/layout.uk.json | 0 .../Keyboard}/Plain Keyboard/layout.us.json | 0 .../Keyboard}/asus_strix_flare.json | 0 .../Keyboard}/corsair_k65.json | 0 .../Keyboard}/corsair_k68.json | 0 .../Keyboard}/corsair_k70.json | 0 .../Keyboard}/corsair_k70_mk2.json | 0 .../Keyboard}/corsair_k95.json | 0 .../Keyboard}/corsair_k95_platinum.json | 0 .../Keyboard}/corsair_sabre.json | 0 .../Keyboard}/corsair_strafe.json | 0 .../Keyboard}/drevo_blademaster.json | 0 .../Keyboard}/generic_laptop.json | 0 .../Keyboard}/generic_laptop_numpad.json | 0 .../Keyboard}/logitech_g213.json | 0 .../Keyboard}/logitech_g410.json | 0 .../Keyboard}/logitech_g810.json | 0 .../Keyboard}/logitech_g910.json | 0 .../Keyboard}/logitech_gpro.json | 0 .../Keyboard}/masterkeys_mk750.json | 0 .../Keyboard}/masterkeys_pro_l.json | 0 .../Keyboard}/masterkeys_pro_m.json | 0 .../Keyboard}/masterkeys_pro_s.json | 0 .../Keyboard}/razer_blackwidow.json | 0 .../Keyboard}/razer_blackwidow_te.json | 0 .../Keyboard}/razer_blackwidow_x.json | 0 .../Keyboard}/razer_blade.json | 0 .../Keyboard}/roccat_ryos.json | 0 .../Keyboard}/soundblasterx_vanguardk08.json | 0 .../Keyboard}/steelseries_apex_m750.json | 0 .../Keyboard}/steelseries_apex_m750_tkl.json | 0 .../Keyboard}/steelseries_apex_m800.json | 0 .../Keyboard}/wooting_one.json | 0 .../Keyboard}/wooting_two.json | 0 .../Mouse/Asus - Pugio.json} | 0 .../Mouse/Clevo - Touchpad.json} | 0 .../Mouse/Corsair - Katar.json} | 0 .../Mouse/Corsair - M65.json} | 0 .../Mouse/Corsair - Sabre.json} | 0 .../Mouse/Generic Peripheral.json} | 0 .../Mouse/Logitech - G502.json} | 0 .../Mouse/Logitech - G900.json} | 0 .../RazerICorsair Mousepad + Mouse.json} | 0 ...lSeries - QcK Prism Mousepad + Mouse.json} | 0 ...elSeries - Rival 300 HP OMEN Edition.json} | 0 .../Mouse/SteelSeries - Rival 300.json} | 0 ...ries - Two-zone QcK Mousepad + Mouse.json} | 0 .../Devices/Logitech/LogitechDevice.cs | 2 +- .../Devices/Razer/RazerDevice.cs | 2 +- .../Project-Aurora/Project-Aurora.csproj | 398 +----------------- .../Project-Aurora/Settings/Configuration.cs | 8 +- .../Settings/Control_Settings.xaml | 24 +- .../Settings/Control_Settings.xaml.cs | 21 +- .../Settings/KeyboardLayoutManager.cs | 191 ++------- 149 files changed, 449 insertions(+), 955 deletions(-) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Asus_Pugio.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Asus_Pugio_backlights.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Asus_Pugio_body.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Asus_Pugio_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Asus_Pugio_wheel.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_Katar.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_Katar_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_Katar_outline.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_M65.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_M65_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_M65_outline.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_M65_scrollwheel.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Corsair_strafe_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G502.pdn (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G502_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G502_outline.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G810.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G810_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G900.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G900_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G900_outline.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G910_badge.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Logi_G910_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Omen_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Omen_logo.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Razer_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Razer_logo.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Sabre.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Sabre_front_lights.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Sabre_outline.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/Sabre_scrollwheel.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SoundBlasterX_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Apex_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Rival_300_logo.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Rival_300_logo.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Rival_300_outline.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Rival_300_outline.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Rival_300_scrollwheel.png (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/images => DeviceLayouts/Images}/SteelSeries_Rival_300_scrollwheel.psd (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k65_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k68_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k70_mk2_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k95_left_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k95_platinum_left_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k95_platinum_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_k95_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_strafe_left_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/corsair_strafe_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/drevo_blademaster_left_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/generic_laptop_left_bottom_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/generic_laptop_numpad_left_bottom_features.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/generic_laptop_numpad_right_bottom_features.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/generic_laptop_numpad_right_features.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/generic_laptop_right_bottom_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/generic_laptop_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/logitech_gpro_features.json => DeviceLayouts/Keyboard/Extra Features/logitech_g810_features.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/logitech_g910_features.json (95%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/logitech_g910_left_bottom_features.json (95%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/logitech_g810_features.json => DeviceLayouts/Keyboard/Extra Features/logitech_gpro_features.json} (95%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/masterkeys_mk750_bottom_features.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/masterkeys_mk750_left_features.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/masterkeys_mk750_right_features.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/masterkeys_pro_l_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/masterkeys_pro_m_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/razer_blackwidow_features.json (95%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/razer_blackwidow_left_bottom_features.json (95%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/razer_blade_left_bottom_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/razer_blade_right_bottom_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/razer_blade_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/roccat_ryos_features.json (95%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/soundblasterx_vanguardk08_left_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/soundblasterx_vanguardk08_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/steelseries_apex_m750_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/steelseries_apex_m750_tkl_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/steelseries_apex_m800_left_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/steelseries_apex_m800_right_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Extra Features/wooting_two_features.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.abnt2.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.ansi.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.de.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.dvorak.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.dvorak_int.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.es.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.fr.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.hu.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.intl.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.iso.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.it.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.jpn.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.la.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.nordic.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.ru.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.swiss.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.tr.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.uk.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/Plain Keyboard/layout.us.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/asus_strix_flare.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_k65.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_k68.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_k70.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_k70_mk2.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_k95.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_k95_platinum.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_sabre.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/corsair_strafe.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/drevo_blademaster.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/generic_laptop.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/generic_laptop_numpad.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/logitech_g213.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/logitech_g410.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/logitech_g810.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/logitech_g910.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/logitech_gpro.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/masterkeys_mk750.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/masterkeys_pro_l.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/masterkeys_pro_m.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/masterkeys_pro_s.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/razer_blackwidow.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/razer_blackwidow_te.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/razer_blackwidow_x.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/razer_blade.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/roccat_ryos.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/soundblasterx_vanguardk08.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/steelseries_apex_m750.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/steelseries_apex_m750_tkl.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/steelseries_apex_m800.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/wooting_one.json (100%) mode change 100755 => 100644 rename Project-Aurora/Project-Aurora/{kb_layouts => DeviceLayouts/Keyboard}/wooting_two.json (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/asus_pugio_features.json => DeviceLayouts/Mouse/Asus - Pugio.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/clevo_touchpad_features.json => DeviceLayouts/Mouse/Clevo - Touchpad.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/corsair_katar_features.json => DeviceLayouts/Mouse/Corsair - Katar.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/corsair_m65_features.json => DeviceLayouts/Mouse/Corsair - M65.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/corsair_sabre_features.json => DeviceLayouts/Mouse/Corsair - Sabre.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/generic_peripheral.json => DeviceLayouts/Mouse/Generic Peripheral.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/logitech_g502_features.json => DeviceLayouts/Mouse/Logitech - G502.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/logitech_g900_features.json => DeviceLayouts/Mouse/Logitech - G900.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/generic_mousepad.json => DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/steelseries_qck_prism_features.json => DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/steelseries_rival_300_hp_omen_edition_features.json => DeviceLayouts/Mouse/SteelSeries - Rival 300 HP OMEN Edition.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/steelseries_rival_300_features.json => DeviceLayouts/Mouse/SteelSeries - Rival 300.json} (100%) rename Project-Aurora/Project-Aurora/{kb_layouts/Extra Features/steelseries_qck_2zone_features.json => DeviceLayouts/Mouse/SteelSeries - Two-zone QcK Mousepad + Mouse.json} (100%) 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/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/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_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/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/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/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/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_platinum_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_left_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_platinum_left_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_left_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_platinum_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_right_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_k95_platinum_right_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_right_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_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/generic_laptop_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_left_bottom_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_left_bottom_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_left_bottom_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_left_bottom_features.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_numpad_left_bottom_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_left_bottom_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_numpad_right_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_bottom_features.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_numpad_right_bottom_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_bottom_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_numpad_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_features.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_numpad_right_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_right_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_bottom_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_right_bottom_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_bottom_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_laptop_right_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_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_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_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/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/razer_blade_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_left_bottom_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blade_left_bottom_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_left_bottom_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blade_right_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_bottom_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blade_right_bottom_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_bottom_features.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blade_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_features.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/razer_blade_right_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_features.json 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/kb_layouts/Plain Keyboard/layout.abnt2.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.abnt2.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.abnt2.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.abnt2.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.ansi.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ansi.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.ansi.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ansi.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.de.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.de.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.de.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.de.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.dvorak.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.dvorak.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.dvorak_int.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak_int.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.dvorak_int.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak_int.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.es.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.es.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.es.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.es.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.fr.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.fr.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.fr.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.fr.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.hu.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.hu.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.hu.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.hu.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.intl.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.intl.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.intl.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.intl.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.iso.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.iso.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.iso.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.iso.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.it.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.it.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.it.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.it.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.jpn.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.jpn.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.jpn.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.jpn.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.la.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.la.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.la.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.la.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.nordic.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.nordic.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.nordic.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.nordic.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.ru.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ru.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.ru.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ru.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.swiss.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.swiss.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.swiss.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.swiss.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.tr.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.tr.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.tr.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.tr.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.uk.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.uk.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.uk.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.uk.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.us.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.us.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Plain Keyboard/layout.us.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.us.json 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/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 100% rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k95.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/corsair_k95_platinum.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/corsair_k95_platinum.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json 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/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/generic_laptop.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/generic_laptop.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/generic_laptop_numpad.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/generic_laptop_numpad.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.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_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_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_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/kb_layouts/masterkeys_pro_m.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json old mode 100755 new mode 100644 similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/masterkeys_pro_m.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json 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/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/kb_layouts/razer_blade.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/razer_blade.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json 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 100% rename from Project-Aurora/Project-Aurora/kb_layouts/steelseries_apex_m800.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/steelseries_apex_m800.json 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/kb_layouts/Extra Features/asus_pugio_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/asus_pugio_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/clevo_touchpad_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/clevo_touchpad_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_katar_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_katar_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_m65_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/corsair_m65_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json 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/kb_layouts/Extra Features/generic_peripheral.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_peripheral.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g502_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g502_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g900_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/logitech_g900_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_mousepad.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/generic_mousepad.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_qck_prism_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_qck_prism_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_rival_300_hp_omen_edition_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300 HP OMEN Edition.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_rival_300_hp_omen_edition_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300 HP OMEN Edition.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_rival_300_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_rival_300_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_qck_2zone_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Two-zone QcK Mousepad + Mouse.json similarity index 100% rename from Project-Aurora/Project-Aurora/kb_layouts/Extra Features/steelseries_qck_2zone_features.json rename to Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Two-zone QcK Mousepad + Mouse.json diff --git a/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs b/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs index 362d52e13..b0a010618 100755 --- a/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Logitech/LogitechDevice.cs @@ -362,7 +362,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArg { try { - bool isZoneKeyboard = (Global.Configuration.keyboard_brand == PreferredKeyboard.Logitech_G213); + bool isZoneKeyboard = (Global.Configuration.keyboard_brand == "logitech_g213"); if (!Global.Configuration.devices_disable_keyboard && !isZoneKeyboard) { diff --git a/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs b/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs index 82474a50b..b055cb019 100755 --- a/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs @@ -169,7 +169,7 @@ private int[] GetKeyCoord(DeviceKeys key) { Dictionary layout = RazerLayoutMap.GenericKeyboard; - if (Global.Configuration.keyboard_brand == PreferredKeyboard.Razer_Blade) + if (Global.Configuration.keyboard_brand == "razer_blade") layout = RazerLayoutMap.Blade; if (layout.ContainsKey(key)) diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index 08db99da4..f0bcb61f6 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -14,6 +14,7 @@ false + publish\ true Disk @@ -28,7 +29,6 @@ 1.0.0.%2a false true - @@ -1035,294 +1035,6 @@ Designer - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - @@ -1530,39 +1242,6 @@ Always - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - @@ -1613,24 +1292,6 @@ - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest Designer @@ -2382,6 +2043,9 @@ + + + @@ -2396,57 +2060,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - @@ -2545,6 +2158,9 @@ + + xcopy /F /E /Y /I /R "$(SolutionDir)Project-Aurora/DeviceLayouts/*" "$(TargetDir)DeviceLayouts" + + + + + + + + \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs new file mode 100644 index 000000000..60d99c081 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; + +namespace Aurora.Settings.Keycaps +{ + /// + /// Interaction logic for Control_DeviceConfig.xaml + /// + public partial class Window_DeviceConfig : Window + { + public DeviceConfig Config; + public Window_DeviceConfig(DeviceConfig config) + { + InitializeComponent(); + Config = config; + LoadDeviceType(config.Type); + this.device_layout.SelectedItem = Config.SelectedLayout; + if (config.SelectedKeyboardLayout != null) + this.keyboard_layout.SelectedItem = Config.SelectedKeyboardLayout; + } + private List GetBrandsName(string dicName) + { + string layoutsPath = Path.Combine(Global.ExecutingDirectory, "DeviceLayouts", dicName); + List FilesName = new List() { "None" }; + foreach (var name in Directory.GetFiles(layoutsPath)) + { + FilesName.Add(name.Split('\\').Last().Split('.').First()); + } + return FilesName; + } + private void LoadDeviceType(int type) + { + switch (type) + { + case 0: + this.device_layout.ItemsSource = GetBrandsName("Keyboard"); + this.keyboard_layout.ItemsSource = GetBrandsName("Keyboard\\Plain Keyboard"); + this.keyboard_layout.Visibility = Visibility.Visible; + this.keyboard_layout_tb.Visibility = Visibility.Visible; + break; + default: + this.device_layout.ItemsSource = GetBrandsName("Mouse"); + this.keyboard_layout.Visibility = Visibility.Collapsed; + this.keyboard_layout_tb.Visibility = Visibility.Collapsed; + break; + } + } + private void device_type_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + Config.Type = this.device_layout.SelectedIndex; + } + } + private void device_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + Config.SelectedLayout = this.device_layout.SelectedItem.ToString(); + } + } + private void keyboard_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + Config.SelectedKeyboardLayout = this.keyboard_layout.SelectedItem.ToString(); + } + } + private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) + { + if (IsLoaded && sender is CheckBox) + { + Config.LightingEnabled = ((sender as CheckBox).IsChecked.HasValue) ? !(sender as CheckBox).IsChecked.Value : true; + } + } + + private void okButton_Click(object sender, RoutedEventArgs e) + { + DialogResult = true; + Close(); + } + + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml new file mode 100644 index 000000000..d48327fe2 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs new file mode 100644 index 000000000..ff16bf22b --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs @@ -0,0 +1,278 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; + +namespace Aurora.Settings.Keycaps +{ + /// + /// Interaction logic for Control_DeviceLayout.xaml + /// + public partial class Control_DeviceLayout : UserControl + { + public delegate void LayoutUpdatedEventHandler(object sender); + + public event LayoutUpdatedEventHandler DeviceLayoutUpdated; + public bool IsLayoutMoveEnabled = false; + public Dictionary KeyboardMap = new Dictionary(new DeviceKey.EqualityComparer()); + + private System.Windows.Point _positionInBlock; + + private DeviceConfig DeviceConfig; + + private string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + + public Control_DeviceLayout(DeviceConfig config) + { + InitializeComponent(); + DeviceConfig = config; + + } + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + Keys = LoadKeys(); + } + + private List _Keys = new List(); + public List Keys + { + get { return _Keys;} + set + { + _Keys = value; + device_grid.Children.Clear(); + Grid deviceControl = CreateUserControl(); + device_grid.Children.Add(deviceControl); + + this.Width = deviceControl.Width; + this.Height = deviceControl.Height; + + RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); + device_grid.UpdateLayout(); + device_viewbox.UpdateLayout(); + DeviceLayoutUpdated?.Invoke(this); + + } + } + private List LoadKeys() + { + DeviceLayout layout; + switch (DeviceConfig.Type) + { + case 0: + layout = new KeyboardDeviceLayout(DeviceConfig); + break; + case 1: + layout = new GeneralDeviceLayout(DeviceConfig); + break; + default: + layout = new GeneralDeviceLayout(DeviceConfig); + break; + } + return layout.LoadLayout(); + } + + private void UserControl_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + this.ReleaseMouseCapture(); + Window_DeviceConfig configWindow = new Window_DeviceConfig(DeviceConfig); + if(configWindow.ShowDialog() == true) + { + DeviceConfig = configWindow.Config; + Keys = LoadKeys(); + DeviceConfig.Save(); + } + + } + private void UserControl_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ClickCount < 2 && IsLayoutMoveEnabled) + { + // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) + _positionInBlock = Mouse.GetPosition(this); + + // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) + this.CaptureMouse(); + } + + } + + private void UserControl_MouseMove(object sender, MouseEventArgs e) + { + // if the mouse is captured. you are moving it. (there is your 'real' boolean) + if (this.IsMouseCaptured) + { + // get the parent container + var container = VisualTreeHelper.GetParent(this) as UIElement; + + // get the position within the container + var mousePosition = e.GetPosition(container); + + // move the usercontrol. + this.RenderTransform = new TranslateTransform(mousePosition.X - _positionInBlock.X, mousePosition.Y - _positionInBlock.Y); + + } + } + + private void UserControl_MouseUp(object sender, MouseButtonEventArgs e) + { + // release this control. + this.ReleaseMouseCapture(); + + DeviceLayoutUpdated?.Invoke(this); + + SaveLayoutPosition(TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement)); + } + public Grid CreateUserControl(bool abstractKeycaps = false) + { + KeyboardMap.Clear(); + + Grid deviceControl = new Grid(); + if (Keys.Count > 0) + { + string images_path = System.IO.Path.Combine(layoutsPath, "Images"); + + int layout_height = 0; + int layout_width = 0; + foreach (DeviceKeyConfiguration key in Keys) + { + string image_path = ""; + + if (!String.IsNullOrWhiteSpace(key.Image)) + image_path = System.IO.Path.Combine(images_path, key.Image); + + Control_Keycap keycap = new Control_Keycap(key, image_path); + + + keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); + deviceControl.Children.Add(keycap); + + if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag) && keycap is IKeycap && !abstractKeycaps) + KeyboardMap.Add(key.Key, keycap); + + if (key.Region.Width + key.Region.X > layout_width) + layout_width = key.Region.Width + key.Region.X; + + if (key.Region.Height + key.Region.Y > layout_height) + layout_height = key.Region.Height + key.Region.Y; + + } + //Update size + deviceControl.Width = layout_width; + deviceControl.Height = layout_height; + } + else + { + Label error_message = new Label(); + + DockPanel info_panel = new DockPanel(); + + TextBlock info_message = new TextBlock() + { + Text = "No Device selected\r\nPlease doubleclick on this box", + TextAlignment = TextAlignment.Center, + Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0)), + }; + + DockPanel.SetDock(info_message, Dock.Top); + info_panel.Children.Add(info_message); + + DockPanel info_instruction = new DockPanel(); + + info_instruction.Children.Add(new TextBlock() + { + Text = "Press (", + Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0)), + VerticalAlignment = VerticalAlignment.Center + }); + + info_instruction.Children.Add(new System.Windows.Controls.Image() + { + Source = new BitmapImage(new Uri(@"Resources/settings_icon.png", UriKind.Relative)), + Stretch = Stretch.Uniform, + Height = 40.0, + VerticalAlignment = VerticalAlignment.Center + }); + + info_instruction.Children.Add(new TextBlock() + { + Text = ") and go into \"Devices & Wrappers\" tab", + Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0)), + VerticalAlignment = VerticalAlignment.Center + }); + + DockPanel.SetDock(info_instruction, Dock.Bottom); + info_panel.Children.Add(info_instruction); + + error_message.Content = info_panel; + + error_message.FontSize = 16.0; + error_message.FontWeight = FontWeights.Bold; + error_message.HorizontalContentAlignment = HorizontalAlignment.Center; + error_message.VerticalContentAlignment = VerticalAlignment.Center; + + deviceControl.Children.Add(error_message); + //Update size + deviceControl.Width = 450; + deviceControl.Height = 200; + } + + + + return deviceControl; + } + public static int PixelToByte(int pixel) + { + return PixelToByte((double)pixel); + } + + public static int PixelToByte(double pixel) + { + return (int)Math.Round(pixel / (double)(Global.Configuration.BitmapAccuracy)); + } + public Dictionary GetBitmap() + { + Dictionary bitmapMap = new Dictionary(); + + foreach (var key in Keys) + { + + double width = key.Region.Width; + double height = key.Region.Height; + double x_offset = DeviceConfig.Offset.X + key.Region.X; + double y_offset = DeviceConfig.Offset.Y + key.Region.Y; + + bitmapMap[key.Key] = new BitmapRectangle(PixelToByte(x_offset), PixelToByte(y_offset), PixelToByte(width), PixelToByte(height)); + + } + return bitmapMap; + + } + public void SaveLayoutPosition(Point pos) + { + DeviceConfig.Offset = pos; + DeviceConfig.Save(); + } + public void SetKeyboardColors(Dictionary keylights) + { + foreach (var kvp in keylights) + { + if (KeyboardMap.ContainsKey(kvp.Key)) + { + System.Drawing.Color key_color = kvp.Value; + KeyboardMap[kvp.Key].SetColor(Utils.ColorUtils.DrawingColorToMediaColor(System.Drawing.Color.FromArgb(255, Utils.ColorUtils.MultiplyColorByScalar(key_color, key_color.A / 255.0D)))); + } + } + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml new file mode 100644 index 000000000..6c473fd3b --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs new file mode 100644 index 000000000..e526eb8b8 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs @@ -0,0 +1,149 @@ +using Aurora.Controls; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Timers; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.Keycaps +{ + /// + /// Interaction logic for Control_DeviceLayoutPresenter.xaml + /// + public partial class Control_DeviceLayoutPresenter : UserControl + { + List DeviceLayouts = new List(); + + public List Keycaps => DeviceLayouts.SelectMany(dl => dl.KeyboardMap.Values).ToList(); + public bool IsLayoutMoveEnabled { get; set; } + + public Control_DeviceLayoutPresenter() + { + InitializeComponent(); + Global.devicesLayout.DeviceLayoutNumberChanged += DeviceLayoutNumberChanged; + Global.Configuration.PropertyChanged += Configuration_PropertyChanged; + this.keyboard_record_message.Visibility = Visibility.Hidden; + + //DeviceLayoutNumberChanged(this); + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + Global.devicesLayout.Load(); + //DeviceLayoutNumberChanged(this); + } + + public void Refresh() + { + var keylights = Global.effengine.GetDevicesColor(); + DeviceLayouts.ForEach(dp => dp.SetKeyboardColors(keylights)); + + if (Global.key_recorder.IsRecording()) + this.keyboard_record_message.Visibility = Visibility.Visible; + else + this.keyboard_record_message.Visibility = Visibility.Hidden; + } + private void Configuration_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName.Equals(nameof(Configuration.BitmapAccuracy))) + { + CalculateBitmap(); + } + } + private void Layout_DeviceLayoutUpdated(object sender) + { + + double baseline_x = double.MaxValue; + double baseline_y = double.MaxValue; + double current_width = double.MinValue; + double current_height = double.MinValue; + foreach (FrameworkElement layout in DeviceLayouts) + { + Point offset = layout.TranslatePoint(new Point(0, 0), layouts_grid); + + if (offset.X + layout.Width > current_width) + current_width = offset.X + layout.Width; + if (offset.X < baseline_x) + baseline_x = offset.X; + + if (offset.Y + layout.Height > current_height) + current_height = offset.Y + layout.Height; + if (offset.Y < baseline_y) + baseline_y = offset.Y; + //layout as Control_DeviceLayout).SaveLayoutPosition(offset); + } + /*foreach (UIElement layout in layouts_grid.Children) + { + Point offset = layout.TranslatePoint(new Point(0, 0), layouts_grid); + /*if (offset.X + layout.Width - baseline_x > current_width) + current_width = offset.X + layout.Width- baseline_x; + + if (offset.Y + layout.Height - baseline_y > current_height) + current_height = offset.Y + layout.Height - baseline_y;*/ + //layout.RenderTransform = new TranslateTransform(offset + //layout.Margin = new Thickness(offset.X - baseline_x, offset.Y - baseline_y, 0, 0); + /* layout.RenderTransform = new TranslateTransform(offset.X - baseline_x, offset.Y - baseline_y); + if (layout is Control_DeviceLayout) + (layout as Control_DeviceLayout).SaveLayoutPosition(offset); + }*/ + + layouts_grid.Width = current_width - baseline_x; + //this.Width = width + (keyboard_grid.Width - virtual_keyboard_width); + + layouts_grid.Height = current_height - baseline_y; + layouts_grid.RenderTransform = new TranslateTransform(-baseline_x, -baseline_y); + //keyboard_grid.Clip = new RectangleGeometry(new Rect(baseline_x, baseline_x, current_width - baseline_x, current_height - baseline_y)); + //this.Height = height + (keyboard_grid.Height - virtual_keyboard_height); + Effects.grid_baseline_x = 0; + Effects.grid_baseline_y = 0; + Effects.grid_width = (float)layouts_grid.Width; + Effects.grid_height = (float)layouts_grid.Height; + + + //keyboard_grid.Margin = new Thickness(-baseline_x, -baseline_y, 0, 0); + //layout2.LayoutTransform = new TranslateTransform(layout2.Region.X, layout2.Region.Y); + layouts_viewbox.MaxWidth = current_width; + layouts_viewbox.MaxHeight = current_height; + MaxWidth = current_width + 50;// + 50; + MaxHeight = current_height + 50;// + 50; + layouts_grid.UpdateLayout(); + layouts_viewbox.UpdateLayout(); + this.UpdateLayout(); + CalculateBitmap(); + + } + public void CalculateBitmap() + { + if (IsLayoutMoveEnabled) + { + Global.effengine.SetCanvasSize(Control_DeviceLayout.PixelToByte(layouts_grid.Width) + 1, Control_DeviceLayout.PixelToByte(layouts_grid.Height) + 1); + var bitmap = new Dictionary(new DeviceKey.EqualityComparer()); + DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => bitmap.Add(x.Key, x.Value))); + Global.effengine.SetBitmapping(bitmap); + } + } + private void DeviceLayoutNumberChanged(object sender) + { + DeviceLayouts = Global.devicesLayout.GetDeviceLayouts(); + //keyboard_grid.ClipToBounds = true; + + layouts_grid.Children.Clear(); + DeviceLayouts.ForEach(d => layouts_grid.Children.Add(d)); + DeviceLayouts.ForEach(d => d.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated); + layouts_grid.Children.Add(new LayerEditor(layouts_grid)); + + DeviceLayouts.ForEach(l => l.IsLayoutMoveEnabled = IsLayoutMoveEnabled); + } + + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_GhostKeycap.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_GhostKeycap.xaml deleted file mode 100644 index 7206ec239..000000000 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_GhostKeycap.xaml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_GhostKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_GhostKeycap.xaml.cs deleted file mode 100644 index ad540c0ae..000000000 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_GhostKeycap.xaml.cs +++ /dev/null @@ -1,156 +0,0 @@ -using Aurora.Devices; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Aurora.Settings.Keycaps -{ - /// - /// Interaction logic for Control_GhostKeycap.xaml - /// - public partial class Control_GhostKeycap : UserControl, IKeycap - { - private Color current_color = Color.FromArgb(0, 0, 0, 0); - private Devices.DeviceKeys associatedKey = DeviceKeys.NONE; - private bool isImage = false; - - public Control_GhostKeycap() - { - InitializeComponent(); - } - - public Control_GhostKeycap(KeyboardKey key, string image_path) - { - InitializeComponent(); - - associatedKey = key.tag; - - this.Width = key.width.Value; - this.Height = key.height.Value; - - //Keycap adjustments - if (string.IsNullOrWhiteSpace(key.image)) - keyBorder.BorderThickness = new Thickness(1.5); - else - keyBorder.BorderThickness = new Thickness(0.0); - keyBorder.IsEnabled = key.enabled.Value; - - if (!key.enabled.Value) - { - ToolTipService.SetShowOnDisabled(keyBorder, true); - keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; - } - - if (string.IsNullOrWhiteSpace(key.image)) - { - keyCap.Text = key.visualName; - keyCap.Tag = key.tag; - if (key.font_size != null) - keyCap.FontSize = key.font_size.Value; - } - else - { - keyCap.Visibility = System.Windows.Visibility.Hidden; - - if (System.IO.File.Exists(image_path)) - { - var memStream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(image_path)); - BitmapImage image = new BitmapImage(); - image.BeginInit(); - image.StreamSource = memStream; - image.EndInit(); - - if (key.tag == DeviceKeys.NONE) - keyBorder.Background = new ImageBrush(image); - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 255, 255)); - keyBorder.OpacityMask = new ImageBrush(image); - } - - isImage = true; - } - } - } - - public DeviceKeys GetKey() - { - return associatedKey; - } - - public void SetColor(Color key_color) - { - key_color = Color.FromArgb(255, 255, 255, 255); //No colors allowed! - - if (!current_color.Equals(key_color)) - { - if (isImage) - { - if (associatedKey != DeviceKeys.NONE) - keyBorder.Background = new SolidColorBrush(key_color); - } - current_color = key_color; - } - - if (Global.key_recorder.HasRecorded(associatedKey)) - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else - { - if (keyBorder.IsEnabled) - { - if (isImage) - keyBorder.Background = new SolidColorBrush(key_color); - else - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); - } - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); - keyBorder.BorderThickness = new Thickness(0); - } - } - } - - private void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) - { - if (sender is Border) - virtualkeyboard_key_selected(associatedKey); - } - - private void keyBorder_MouseMove(object sender, MouseEventArgs e) - { - } - - private void virtualkeyboard_key_selected(Devices.DeviceKeys key) - { - if (key != DeviceKeys.NONE) - { - if (Global.key_recorder.HasRecorded(key)) - Global.key_recorder.RemoveKey(key); - else - Global.key_recorder.AddKey(key); - } - } - - private void keyBorder_MouseLeave(object sender, MouseEventArgs e) - { - } - - private void keyBorder_MouseEnter(object sender, MouseEventArgs e) - { - if (e.LeftButton == MouseButtonState.Pressed && sender is Border) - virtualkeyboard_key_selected(associatedKey); - } - } -} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DefaultKeycapBackglow.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml similarity index 92% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DefaultKeycapBackglow.xaml rename to Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml index e5e63ceb3..6f85833b0 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DefaultKeycapBackglow.xaml +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml @@ -1,4 +1,4 @@ - - + \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DefaultKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs old mode 100755 new mode 100644 similarity index 58% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DefaultKeycap.xaml.cs rename to Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs index b26638f82..e9f6d421f --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DefaultKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs @@ -18,48 +18,46 @@ namespace Aurora.Settings.Keycaps { /// - /// Interaction logic for Control_DefaultKeycap.xaml + /// Interaction logic for Control_Keycap.xaml /// - public partial class Control_DefaultKeycap : UserControl, IKeycap + public partial class Control_Keycap : UserControl, IKeycap { private Color current_color = Color.FromArgb(0, 0, 0, 0); - private Devices.DeviceKeys associatedKey = DeviceKeys.NONE; + private DeviceKey associatedKey = DeviceKeys.NONE; private bool isImage = false; - - public Control_DefaultKeycap() + public Control_Keycap() { InitializeComponent(); } - public Control_DefaultKeycap(KeyboardKey key, string image_path) + public Control_Keycap(DeviceKeyConfiguration key, string image_path) { InitializeComponent(); - associatedKey = key.tag; + associatedKey = key.Key; - this.Width = key.width.Value; - this.Height = key.height.Value; + this.Width = key.Region.Width; + this.Height = key.Region.Height; //Keycap adjustments - if (string.IsNullOrWhiteSpace(key.image)) + if (string.IsNullOrWhiteSpace(key.Image)) keyBorder.BorderThickness = new Thickness(1.5); else keyBorder.BorderThickness = new Thickness(0.0); - keyBorder.IsEnabled = key.enabled.Value; + keyBorder.IsEnabled = key.Enabled.Value; - if (!key.enabled.Value) + if (!key.Enabled.Value) { ToolTipService.SetShowOnDisabled(keyBorder, true); keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; } - if (string.IsNullOrWhiteSpace(key.image)) + if (string.IsNullOrWhiteSpace(key.Image)) { - keyCap.Text = key.visualName; - keyCap.Tag = key.tag; - if (key.font_size != null) - keyCap.FontSize = key.font_size.Value; - keyCap.Visibility = System.Windows.Visibility.Visible; + keyCap.Text = associatedKey.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (key.FontSize != null) + keyCap.FontSize = key.FontSize.Value; } else { @@ -73,8 +71,11 @@ public Control_DefaultKeycap(KeyboardKey key, string image_path) image.StreamSource = memStream; image.EndInit(); - if (key.tag == DeviceKeys.NONE) + grid_backglow.Visibility = Visibility.Hidden; + if (key.Tag == -1) + { keyBorder.Background = new ImageBrush(image); + } else { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 0, 0, 0)); @@ -84,55 +85,87 @@ public Control_DefaultKeycap(KeyboardKey key, string image_path) isImage = true; } } + + } - public DeviceKeys GetKey() + public DeviceKey GetKey() { return associatedKey; } public void SetColor(Color key_color) { - if (!current_color.Equals(key_color)) + //key_color = Color.FromArgb(255, 255, 255, 255); //No colors allowed! + if (keyBorder.IsEnabled) { if (!isImage) { - if (string.IsNullOrWhiteSpace(keyCap.Text)) - keyBorder.BorderBrush = new SolidColorBrush(key_color); - else - keyCap.Foreground = new SolidColorBrush(key_color); + switch (Global.Configuration.virtualkeyboard_keycap_type) + { + case KeycapType.Default_backglow: + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 30, 30, 30)); + keyCap.Foreground = new SolidColorBrush(key_color); + grid_backglow.Background = new SolidColorBrush(key_color); + break; + case KeycapType.Default_backglow_only: + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 30, 30, 30)); + grid_backglow.Background = new SolidColorBrush(key_color); + break; + case KeycapType.Colorized: + case KeycapType.Colorized_blank: + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + keyBorder.BorderBrush = new SolidColorBrush(key_color); + break; + default: + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 30, 30, 30)); + if (string.IsNullOrWhiteSpace(keyCap.Text)) + keyBorder.BorderBrush = new SolidColorBrush(key_color); + else + keyCap.Foreground = new SolidColorBrush(key_color); + break; + } + } else { - if (associatedKey != DeviceKeys.NONE) + if (associatedKey.Tag != (int)DeviceKeys.NONE) keyBorder.Background = new SolidColorBrush(key_color); } - current_color = key_color; } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + if (Global.key_recorder.HasRecorded(associatedKey)) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + if (Global.Configuration.virtualkeyboard_keycap_type == KeycapType.Colorized_blank) + { + keyCap.Text = ""; + } else + { + UpdateText(); + } + /*else { if (keyBorder.IsEnabled) { - if (!isImage) - { - if (string.IsNullOrWhiteSpace(keyCap.Text)) - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); - else - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); - } - else + if (isImage) keyBorder.Background = new SolidColorBrush(key_color); + else + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); } else { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } - } - UpdateText(); + }*/ + } private void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) @@ -143,24 +176,11 @@ private void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) private void keyBorder_MouseMove(object sender, MouseEventArgs e) { - /* - if (e.LeftButton == MouseButtonState.Pressed) - { - if (sender is Border && (sender as Border).Child != null && (sender as Border).Child is TextBlock && last_selected_element != ((sender as Border).Child as TextBlock)) - { - virtualkeyboard_key_selected((sender as Border).Child as TextBlock); - } - else if (sender is Border && (sender as Border).Tag != null && last_selected_element != (sender as Border)) - { - virtualkeyboard_key_selected(sender as Border); - } - } - */ } - private void virtualkeyboard_key_selected(Devices.DeviceKeys key) + private void virtualkeyboard_key_selected(DeviceKey key) { - if(key != DeviceKeys.NONE) + if (key != DeviceKeys.NONE) { if (Global.key_recorder.HasRecorded(key)) Global.key_recorder.RemoveKey(key); @@ -178,24 +198,23 @@ private void keyBorder_MouseEnter(object sender, MouseEventArgs e) if (e.LeftButton == MouseButtonState.Pressed && sender is Border) virtualkeyboard_key_selected(associatedKey); } - public void UpdateText() { - if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration()) + //if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration()) { //if (keyCap.Text.Length > 1) // return; StringBuilder sb = new StringBuilder(2); - var scan_code = KeyUtils.GetScanCode(associatedKey); + var scan_code = KeyUtils.GetScanCode((DeviceKeys)associatedKey.Tag); if (scan_code == -1) return; /*var key = KeyUtils.GetFormsKey((KeyboardKeys)associatedKey.LedID); var scan_code = KeyUtils.MapVirtualKeyEx((uint)key, KeyUtils.MapVirtualKeyMapTypes.MapvkVkToVsc, (IntPtr)0x8090809);*/ int ret = KeyUtils.GetKeyNameTextW((uint)scan_code << 16, sb, 2); - keyCap.Text = sb.ToString(); + keyCap.Text = sb.ToString().ToUpper(); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs index 69e25e780..ba24840b7 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; + using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,7 +11,6 @@ namespace Aurora.Settings.Keycaps public interface IKeycap { void SetColor(Color key_color); - - Devices.DeviceKeys GetKey(); + DeviceKey GetKey(); } } diff --git a/Project-Aurora/Project-Aurora/Settings/Layers/Control_RazerLayer.xaml b/Project-Aurora/Project-Aurora/Settings/Layers/Control_RazerLayer.xaml index 75d1d1c89..d82f75189 100644 --- a/Project-Aurora/Project-Aurora/Settings/Layers/Control_RazerLayer.xaml +++ b/Project-Aurora/Project-Aurora/Settings/Layers/Control_RazerLayer.xaml @@ -9,7 +9,7 @@ mc:Ignorable="d" Loaded="OnUserControlLoaded"> - + diff --git a/Project-Aurora/Project-Aurora/Settings/Layers/ToolbarLayerHandler.cs b/Project-Aurora/Project-Aurora/Settings/Layers/ToolbarLayerHandler.cs index b1a1c5353..b2be16956 100644 --- a/Project-Aurora/Project-Aurora/Settings/Layers/ToolbarLayerHandler.cs +++ b/Project-Aurora/Project-Aurora/Settings/Layers/ToolbarLayerHandler.cs @@ -40,7 +40,7 @@ public override void Default() { /// public class ToolbarLayerHandler : LayerHandler { - private DeviceKeys activeKey = DeviceKeys.NONE; + private DeviceKey activeKey = DeviceKeys.NONE; public ToolbarLayerHandler() { _ID = "Toolbar"; diff --git a/Project-Aurora/Project-Aurora/Settings/Layers/WrapperLightsLayerHandler.cs b/Project-Aurora/Project-Aurora/Settings/Layers/WrapperLightsLayerHandler.cs index 4288d2e13..7ebbc5011 100644 --- a/Project-Aurora/Project-Aurora/Settings/Layers/WrapperLightsLayerHandler.cs +++ b/Project-Aurora/Project-Aurora/Settings/Layers/WrapperLightsLayerHandler.cs @@ -37,8 +37,8 @@ public class WrapperLightsLayerHandlerProperties : LayerHandlerProperties CloningMap => Logic._CloningMap ?? _CloningMap ?? new Dictionary(); - public Dictionary _CloningMap { get; set; } + public Dictionary CloningMap => Logic._CloningMap ?? _CloningMap ?? new Dictionary(); + public Dictionary _CloningMap { get; set; } public WrapperLightsLayerHandlerProperties() : base() { } @@ -54,7 +54,7 @@ public override void Default() _ColorEnhanceColorFactor = 90; _ColorEnhanceColorHSVSine = 0.1f; _ColorEnhanceColorHSVGamma = 2.5f; - _CloningMap = new Dictionary(); + _CloningMap = new Dictionary(); } } diff --git a/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs b/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs index 2c43c2dcc..a2643fb74 100755 --- a/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs +++ b/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs @@ -90,12 +90,12 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu } } - public class DeviceKeysToStringVC : IValueConverter + public class DeviceKeyToStringVC : IValueConverter { protected Type EnumType = typeof(DeviceKeys); protected Enum DefaultEnum = DeviceKeys.NONE; - public DeviceKeysToStringVC() { } + public DeviceKeyToStringVC() { } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { @@ -106,7 +106,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn if (value == null || string.IsNullOrEmpty(value.ToString()) || (value.GetType() != EnumType && value.GetType() != typeof(string))) return DefaultEnum.GetDescription(); - DeviceKeys key = (DeviceKeys)value; + DeviceKeys key = (DeviceKeys)((DeviceKey)value).Tag; //Better description for these keys by using the DeviceKeys description instead switch (key) @@ -186,8 +186,8 @@ public object Convert(object value, Type targetType, object parameter, CultureIn case DeviceKeys.MOUSEPADLIGHT15: return key.GetDescription(); } - - return Global.kbLayout.GetVisualName(key) ?? key.GetDescription(); + //TODO + return key.GetDescription();//Global.kbLayout.GetVisualName(key) ?? key.GetDescription(); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) diff --git a/Project-Aurora/Project-Aurora/Utils/KeyUtils.cs b/Project-Aurora/Project-Aurora/Utils/KeyUtils.cs index c5aba21e9..289bb564b 100755 --- a/Project-Aurora/Project-Aurora/Utils/KeyUtils.cs +++ b/Project-Aurora/Project-Aurora/Utils/KeyUtils.cs @@ -69,8 +69,8 @@ public static DeviceKeys GetDeviceKey(Keys forms_key, int scanCode = 0, bool isE { DeviceKeys key = getDeviceKey(forms_key, scanCode, isExtendedKey); //Global.logger.LogLine(key.ToString() + ":" + ((int)key).ToString()); - if (Global.kbLayout.LayoutKeyConversion.ContainsKey(key)) - return Global.kbLayout.LayoutKeyConversion[key]; + /*if (Global.kbLayout.LayoutKeyConversion.ContainsKey(key)) + return Global.kbLayout.LayoutKeyConversion[key];*/ return key; } @@ -102,8 +102,8 @@ public static DeviceKeys GetDeviceKey(Keys forms_key, int scanCode = 0, bool isE {7, DeviceKeys.SIX}, {8, DeviceKeys.SEVEN}, {9, DeviceKeys.EIGHT}, - {10, DeviceKeys.NINE}, - {11, DeviceKeys.ZERO},*/ + {10, DeviceKeys.NINE},*/ + {11, DeviceKeys.ZERO}, {12, DeviceKeys.MINUS}, {13, DeviceKeys.EQUALS}, /*{14, DeviceKeys.BACKSPACE}, @@ -233,7 +233,7 @@ public static void CorrectRawInputData(KeyboardInputEventArgs e) // see http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html bool isE0 = e.ScanCodeFlags.HasFlag(ScanCodeFlags.E0); bool isE1 = e.ScanCodeFlags.HasFlag(ScanCodeFlags.E1); - if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration() && ((e.Key >= Keys.A && e.Key <= Keys.Z) || (e.Key >= Keys.Oem1 && e.Key <= Keys.Oem102))) + if ((e.Key >= Keys.A && e.Key <= Keys.Z) || (e.Key >= Keys.Oem1 && e.Key <= Keys.Oem102)) { uint thread = GetWindowThreadProcessId(ActiveProcessMonitor.GetForegroundWindow(), IntPtr.Zero); var layout = GetKeyboardLayout(thread); @@ -884,9 +884,9 @@ private static DeviceKeys getDeviceKey(Keys forms_key, int scanCode = 0, bool is /// /// Array of Forms.Keys to be converted /// The resulting Devices.DeviceKeys - public static DeviceKeys[] GetDeviceKeys(Keys[] formsKeys, bool extendedKeys = false, bool getBoth = false) + public static DeviceKey[] GetDeviceKeys(Keys[] formsKeys, bool extendedKeys = false, bool getBoth = false) { - HashSet _returnKeys = new HashSet(); + HashSet _returnKeys = new HashSet(); for (int i = 0; i < formsKeys.Length; i++) { diff --git a/Project-Aurora/Project-Aurora/Utils/UIUtils.cs b/Project-Aurora/Project-Aurora/Utils/UIUtils.cs index c60105bd9..1101656e5 100644 --- a/Project-Aurora/Project-Aurora/Utils/UIUtils.cs +++ b/Project-Aurora/Project-Aurora/Utils/UIUtils.cs @@ -1,4 +1,5 @@ using Aurora.Devices; +using Aurora.Settings; using System; using System.Collections.Generic; using System.ComponentModel; @@ -14,19 +15,19 @@ namespace Aurora.Utils { public static class UIUtils { - public static void SetSingleKey(TextBlock key_destination, List keyslist, int position) + public static void SetSingleKey(TextBlock key_destination, List keyslist, int position) { if (keyslist.Count > position) - key_destination.Text = Enum.GetName(typeof(DeviceKeys), keyslist[position]); + key_destination.Text = keyslist[position].VisualName; else - key_destination.Text = Enum.GetName(typeof(DeviceKeys), DeviceKeys.NONE); + key_destination.Text = "None"; } - public static List SequenceToList(ItemCollection items) + public static List SequenceToList(ItemCollection items) { - List newsequence = new List(); + List newsequence = new List(); - foreach (Devices.DeviceKeys key in items) + foreach (DeviceKey key in items) { newsequence.Add(key); } From 3d9c28119c56b3eb231133561cdac3e7b44bd525 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 29 Feb 2020 20:37:42 +0100 Subject: [PATCH 04/42] Enable to move deviceKeys and some fixes --- Project-Aurora/Project-Aurora/ConfigUI.xaml | 2 +- .../Controls/Control_AnimationEditor.xaml | 8 +- .../Controls/Control_AnimationEditor.xaml.cs | 42 +- .../Project-Aurora/Project-Aurora.csproj | 6 +- .../Settings/DeviceLayoutManager.cs | 607 ++++++++---------- .../Settings/KeyboardLayoutManager.cs | 6 +- .../Keycaps/Control_DeviceConfig.xaml | 35 - .../Keycaps/Control_DeviceConfig.xaml.cs | 96 --- .../Keycaps/Control_DeviceLayout.xaml | 11 +- .../Keycaps/Control_DeviceLayout.xaml.cs | 158 ++--- .../Control_DeviceLayoutPresenter.xaml | 19 +- .../Control_DeviceLayoutPresenter.xaml.cs | 156 ++++- .../Settings/Keycaps/Control_Keycap.xaml | 3 +- .../Settings/Keycaps/Control_Keycap.xaml.cs | 91 ++- .../Settings/Keycaps/Window_DeviceConfig.xaml | 50 ++ .../Keycaps/Window_DeviceConfig.xaml.cs | 181 ++++++ 16 files changed, 783 insertions(+), 688 deletions(-) delete mode 100644 Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml delete mode 100644 Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs diff --git a/Project-Aurora/Project-Aurora/ConfigUI.xaml b/Project-Aurora/Project-Aurora/ConfigUI.xaml index 5002ac2c6..aba38182e 100755 --- a/Project-Aurora/Project-Aurora/ConfigUI.xaml +++ b/Project-Aurora/Project-Aurora/ConfigUI.xaml @@ -75,7 +75,7 @@ - + diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml index bd4d1d485..be530ad51 100644 --- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml +++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml @@ -12,13 +12,13 @@ - - + + + + - - diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs index 3974931f1..2d344259e 100644 --- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs @@ -58,43 +58,15 @@ public Control_AnimationEditor() { InitializeComponent(); - //UpdateVirtualKeyboard(); + Global.devicesLayout.DeviceLayoutNumberChanged += Layout_DevicesNumberChanged; - //Global.devicesLayout.DeviceLayoutNumberChanged += KbLayout_KeyboardLayoutUpdated; - deviceLayerPresenter.SizeChanged += KbLayout_KeyboardLayoutUpdated2; - - } - - private void KbLayout_KeyboardLayoutUpdated2(object sender, SizeChangedEventArgs e) - { - UpdateVirtualKeyboard(); - } - - private void KbLayout_KeyboardLayoutUpdated(object sender) - { - UpdateVirtualKeyboard(); } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) + private void Layout_DevicesNumberChanged(object sender) { - } - - 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();*/ deviceLayerPresenter.UpdateLayout(); - viewbxAnimationView.MaxWidth = deviceLayerPresenter.MaxWidth + 15; - viewbxAnimationView.MaxHeight = deviceLayerPresenter.MaxHeight + 15; - viewbxAnimationView.UpdateLayout(); + //deviceLayerPresenter.MaxWidth = deviceLayerPresenter.MaxWidth + 15; + //deviceLayerPresenter.MaxHeight = deviceLayerPresenter.MaxHeight + 15; + //viewbxAnimationView.UpdateLayout(); this.UpdateLayout(); @@ -109,6 +81,10 @@ private void UpdateVirtualKeyboard() } } + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + } + private void KeyboardKey_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame && sender is Settings.Keycaps.IKeycap) diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index b0eb98f81..a740ab2c3 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -682,8 +682,8 @@ Resources.resx - - Control_DeviceConfig.xaml + + Window_DeviceConfig.xaml Control_DeviceLayout.xaml @@ -1747,7 +1747,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index a5bc7cc64..17582f9da 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -128,10 +128,38 @@ public void UpdateFromOtherKey(KeyboardKey key) if (key.image != null) Image = key.image; } } + public void UpdateFromOtherKey(DeviceKeyConfiguration key) + { + if (key.Key.VisualName != null) Key.VisualName = key.Key.VisualName; + if ((int)key.Key.Tag != -1) + Key.Tag = (int)key.Key.Tag; + if (key.Region != null) + { + Region.Width = (int)key.Region.Width; + Region.Height = (int)key.Region.Height; + Region.X = (int)key.Region.X; + Region.Y = (int)key.Region.Y; + } + if (key.FontSize != null) FontSize = key.FontSize; + if (key.Enabled != null) Enabled = key.Enabled; + if (key.Image != null) Image = key.Image; + } + public static bool operator ==(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) + { + const int epsilon = 3; + return key1.Tag == key2.Tag && key1.Image == key2.Image && key1.Enabled == key2.Enabled && key1.FontSize == key2.FontSize && key1.Region.Width == key2.Region.Width && key1.Region.Height == key2.Region.Height && + key1.Region.X > key2.Region.X - epsilon && key1.Region.X < key2.Region.X + epsilon && key1.Region.Y > key2.Region.Y - epsilon && key1.Region.Y < key2.Region.Y + epsilon; + } + public static bool operator !=(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) + { + return !(key1 == key2); + } } public class VirtualKeyboardConfiguration { + public bool IsNewFormat = false; + public int[] keys_to_remove = new int[] { }; public Dictionary key_modifications = new Dictionary(); @@ -146,208 +174,33 @@ public class VirtualKeyboardConfiguration } - public abstract class DeviceLayout + public class DeviceLayout { - - public Dictionary LayoutKeyConversion = new Dictionary(); - - public List Keys = new List(); - public System.Drawing.Rectangle Region = new System.Drawing.Rectangle(0, 0, 0, 0); + public Dictionary Keys = new Dictionary(); protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); - protected string SelectedLayout = ""; - protected string SelectedKeyboardLayout = null; - protected int DeviceId { get; set; } - - public DeviceLayout(DeviceConfig config) - { - DeviceId = config.Id; - SelectedLayout = config.SelectedLayout; - SelectedKeyboardLayout = config.SelectedKeyboardLayout; - - } - //private Grid LayoutCanvas = new Grid(); - public abstract List LoadLayout(); - - - public void AddFeature(KeyboardKey[] keys, KeyboardRegion insertion_region = KeyboardRegion.TopLeft) - { - double location_x = 0.0D; - double location_y = 0.0D; - - if (insertion_region == KeyboardRegion.TopRight) - { - location_x = Region.Width; - } - else if (insertion_region == KeyboardRegion.BottomLeft) - { - location_y = Region.Height + 7; - } - else if (insertion_region == KeyboardRegion.BottomRight) - { - location_x = Region.Width; - location_y = Region.Height + 7; - - } - - int added_width = 0; - int added_height = 0; - - foreach (var key in keys) - { - key.margin_left += location_x; - key.margin_top += location_y; + private System.Drawing.Rectangle Region = new System.Drawing.Rectangle(0, 0, 0, 0); - Keys.Add(new DeviceKeyConfiguration(key, DeviceId)); + private DeviceConfig Config; - if (key.width + key.margin_left > Region.Width) - Region.Width = (int)(key.width + key.margin_left); - else if (key.margin_left + added_width < 0) - { - added_width = -(int)(key.margin_left); - } - - if (key.height + key.margin_top > Region.Height) - Region.Height = (int)(key.height + key.margin_top); - else if (key.margin_top + added_height < 0) - { - added_height = -(int)(key.margin_top); - } - - } - Region.Width += added_width; - Region.Height += added_height; - //NormalizeKeys(); - } - protected void NormalizeKeys() + public DeviceLayout(DeviceConfig config) { - int x_correction = 0; - int y_correction = 0; - int layout_height = 0; - int layout_width = 0; - - foreach (var key in Keys) - { - if (key.Region.X < x_correction) - x_correction = key.Region.X; - - if (key.Region.Y < y_correction) - y_correction = key.Region.Y; - } + Config = config; - if (Keys.Count > 0) - { - //grouped_keys[0].margin_top -= y_correction; - - foreach (var key in Keys) - { - key.Region.Y -= y_correction; - key.Region.X -= x_correction; - - if (key.Region.Width + key.Region.X > layout_width) - layout_width = key.Region.Width + key.Region.X; - - if (key.Region.Height + key.Region.Y > layout_height) - layout_height = key.Region.Height + key.Region.Y; - } - Region.Width = layout_width; - Region.Height = layout_height; - } } - } - class KeyboardDeviceLayout : DeviceLayout - { - public KeyboardDeviceLayout(DeviceConfig config) : base(config){} - - private PreferredKeyboardLocalization GetSystemKeyboardCulture() + private string GetFolder() { - string culture = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; - switch (culture) + switch (Config.Type) { - case ("tr-TR"): - return PreferredKeyboardLocalization.tr; - case ("ja-JP"): - return PreferredKeyboardLocalization.jpn; - case ("de-DE"): - case ("hsb-DE"): - case ("dsb-DE"): - return PreferredKeyboardLocalization.de; - case ("fr-CH"): - case ("de-CH"): - return PreferredKeyboardLocalization.swiss; - case ("fr-FR"): - case ("br-FR"): - case ("oc-FR"): - case ("co-FR"): - case ("gsw-FR"): - return PreferredKeyboardLocalization.fr; - case ("cy-GB"): - case ("gd-GB"): - case ("en-GB"): - return PreferredKeyboardLocalization.uk; - case ("ru-RU"): - case ("tt-RU"): - case ("ba-RU"): - case ("sah-RU"): - return PreferredKeyboardLocalization.ru; - case ("en-US"): - return PreferredKeyboardLocalization.us; - case ("da-DK"): - case ("se-SE"): - case ("nb-NO"): - case ("nn-NO"): - case ("nordic"): - return PreferredKeyboardLocalization.nordic; - case ("pt-BR"): - return PreferredKeyboardLocalization.abnt2; - case ("dvorak"): - return PreferredKeyboardLocalization.dvorak; - case ("dvorak_int"): - return PreferredKeyboardLocalization.dvorak_int; - case ("hu-HU"): - return PreferredKeyboardLocalization.hu; - case ("it-IT"): - return PreferredKeyboardLocalization.it; - case ("es-AR"): - case ("es-BO"): - case ("es-CL"): - case ("es-CO"): - case ("es-CR"): - case ("es-EC"): - case ("es-MX"): - case ("es-PA"): - case ("es-PY"): - case ("es-PE"): - case ("es-UY"): - case ("es-VE"): - case ("es-419"): - return PreferredKeyboardLocalization.la; - case ("es-ES"): - return PreferredKeyboardLocalization.es; - case ("iso"): - return PreferredKeyboardLocalization.iso; - case ("ansi"): - return PreferredKeyboardLocalization.ansi; + case 0: + return "Keyboard"; default: - return PreferredKeyboardLocalization.intl; - + return "Mouse"; } } - private string GetKeyboardCulture() - { - PreferredKeyboardLocalization layout = (PreferredKeyboardLocalization)Enum.Parse(typeof(PreferredKeyboardLocalization), SelectedKeyboardLayout); - - if (layout == PreferredKeyboardLocalization.None) - { - layout = GetSystemKeyboardCulture(); - } - //_loaded_localization = layout; - return layout.ToString(); - - } - private class NewKeyboardLayout + protected class NewKeyboardLayout { [JsonProperty("layout_width")] public int Width = 0; @@ -358,37 +211,38 @@ private class NewKeyboardLayout [JsonProperty("keys")] public DeviceKeyConfiguration[] Keys = null; } - public override List LoadLayout() + public List LoadLayout() { var layoutConfigPath = ""; - string keyboard_preference = SelectedLayout; + string keyboard_preference = Config.SelectedLayout; if (keyboard_preference != "" && keyboard_preference != "None") { - layoutConfigPath = Path.Combine(layoutsPath, "Keyboard", keyboard_preference + ".json"); + layoutConfigPath = Path.Combine(layoutsPath, GetFolder(), keyboard_preference + ".json"); } if (!String.IsNullOrWhiteSpace(layoutConfigPath) && File.Exists(layoutConfigPath)) { //Load keyboard layout //LoadCulture(); - + //TODO //if (!File.Exists(layoutPath)) // LoadDefault(); - var fileName = "Plain Keyboard\\" +SelectedKeyboardLayout + ".json"; - var layoutPath = Path.Combine(layoutsPath, "Keyboard", fileName); + var fileName = "Plain Keyboard\\" + Config.SelectedKeyboardLayout + ".json"; + var layoutPath = Path.Combine(layoutsPath, GetFolder(), fileName); if (File.Exists(layoutPath)) { string c = File.ReadAllText(layoutPath, Encoding.UTF8); NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - Keys = keyboard.Keys.ToList(); - Keys.ForEach(k => k.Key.DeviceId = DeviceId); - Region.Width = keyboard.Width; - Region.Height = keyboard.Height; + Keys = keyboard.Keys.ToDictionary(k => k.Tag, k => k); + Keys.Values.ToList().ForEach(k => k.Key.DeviceId = Config.Id); + + /*Region.Width = keyboard.Width; + Region.Height = keyboard.Height;*/ } - - + + /* var fileName = "Plain Keyboard\\layout." + "ansi" + ".json"; var layoutPath = Path.Combine(layoutsPath, "Keyboard", fileName); @@ -396,7 +250,7 @@ public override List LoadLayout() KeyboardLayout keyboard = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); LoadFromKeys(keyboard.Keys.ToList()); - + NewKeyboardLayout saved = new NewKeyboardLayout(); saved.KeyConversion = keyboard.KeyConversion; saved.Keys = Keys.ToArray(); @@ -404,209 +258,223 @@ public override List LoadLayout() fileName = "Plain Keyboard\\" + "ansi" + "_layout.json"; File.WriteAllText(Path.Combine(layoutsPath, "Keyboard", fileName), content, Encoding.UTF8);*/ - - string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); - VirtualKeyboardConfiguration layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + try + { + if (Config.Type == 0) + { + string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); + VirtualKeyboardConfiguration layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + if (layoutConfig.IsNewFormat == true) + throw new Exception(); + + //AdjustKeys + var adjustKeys = layoutConfig.key_modifications; + Keys.Values.ToList().FindAll(key => adjustKeys.ContainsKey((int)key.Tag)).ForEach(k => k.UpdateFromOtherKey(adjustKeys[k.Tag])); + foreach (var keyTag in layoutConfig.keys_to_remove) + { + Keys.Remove(keyTag); + } + + NormalizeKeys(); - //AdjustKeys - var adjustKeys = layoutConfig.key_modifications; - Keys.FindAll(key => adjustKeys.ContainsKey((int)key.Tag)).ForEach(k => k.UpdateFromOtherKey(adjustKeys[k.Tag])); - var removeKeys = layoutConfig.keys_to_remove; - Keys.RemoveAll(key => removeKeys.Contains((int)key.Tag)); + foreach (string feature in layoutConfig.included_features) + { + string feature_path = Path.Combine(layoutsPath, GetFolder(), "Extra Features", feature); + if (File.Exists(feature_path)) + { + string feature_content = File.ReadAllText(feature_path, Encoding.UTF8); + VirtualGroup feature_config = JsonConvert.DeserializeObject(feature_content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - NormalizeKeys(); + AddFeature(feature_config.grouped_keys.ToArray(), feature_config.origin_region); + } + } - if (layoutConfig.KeyConversion != null) - { - foreach (var key in layoutConfig.KeyConversion) + NormalizeKeys(); + } + else { - if (!this.LayoutKeyConversion.ContainsKey(key.Key)) - this.LayoutKeyConversion.Add(key.Key, key.Value); + if (!string.IsNullOrWhiteSpace(layoutConfigPath) && File.Exists(layoutConfigPath)) + { + string mouseConfigContent = File.ReadAllText(layoutConfigPath, Encoding.UTF8); + VirtualGroup mouseConfig = JsonConvert.DeserializeObject(mouseConfigContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + if (mouseConfig.origin_region == null) + throw new Exception(); + AddFeature(mouseConfig.grouped_keys.ToArray(), mouseConfig.origin_region); + NormalizeKeys(); + } } } - foreach (string feature in layoutConfig.included_features) + catch (Exception) { - string feature_path = Path.Combine(layoutsPath, "Keyboard", "Extra Features", feature); + string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); + KeycapGroupConfiguration layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - if (File.Exists(feature_path)) + //AdjustKeys + foreach (var keyTag in layoutConfig.keys_to_remove) { - string feature_content = File.ReadAllText(feature_path, Encoding.UTF8); - VirtualGroup feature_config = JsonConvert.DeserializeObject(feature_content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - - AddFeature(feature_config.grouped_keys.ToArray(), feature_config.origin_region); - if (feature_config.KeyConversion != null) + Keys.Remove(keyTag); + } + foreach (var key in layoutConfig.key_modifications) + { + if (Keys.ContainsKey(key.Key)) { - foreach (var key in feature_config.KeyConversion) - { - if (!this.LayoutKeyConversion.ContainsKey((int)key.Key)) - this.LayoutKeyConversion.Add((int)key.Key, (int)key.Value); - } + Keys[key.Key].UpdateFromOtherKey(key.Value); + } + else + { + Keys[key.Key] = key.Value; } } + + NormalizeKeys(); } - NormalizeKeys(); - } - else - { - //LoadNone(); } - return Keys; + + return Keys.Values.ToList(); } - - private void LoadFromKeys(List JsonKeys) + public void SaveLayout(List layoutKey) { - int layout_height = 0; - int layout_width = 0; - int current_height = 0; - int current_width = 0; + List saveKeys = new List(); + layoutKey.ForEach(key => saveKeys.Add(key.GetConfiguration())); - foreach (var key in JsonKeys) + KeycapGroupConfiguration config = new KeycapGroupConfiguration(); + Dictionary defaultLayout = new Dictionary(); + if (!String.IsNullOrWhiteSpace(Config.SelectedKeyboardLayout)) { + var fileName = "Plain Keyboard\\" + Config.SelectedKeyboardLayout + ".json"; + var layoutPath = Path.Combine(layoutsPath, GetFolder(), fileName); + if (File.Exists(layoutPath)) + { + string c = File.ReadAllText(layoutPath, Encoding.UTF8); + NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - if (key.width + key.margin_left > 0) - current_width += (int)key.width.Value + (int)key.margin_left.Value; - - if (key.margin_top > 0) - current_height += (int)key.margin_top.Value; - - key.margin_left = current_width - key.width.Value; - key.margin_top = current_height + key.margin_top.Value; - - if (layout_width < current_width) - layout_width = current_width; - - if (key.line_break ?? false) + defaultLayout = keyboard.Keys.ToDictionary(k => k.Tag, k => k); + //defaultLayout.Values.ToList().ForEach(k => k.Key.DeviceId = DeviceId); + } + } + foreach (var key in saveKeys) + { + if (defaultLayout.ContainsKey(key.Tag)) { - current_height += 37; - current_width = 0; + if (defaultLayout[key.Tag] != key) + { + config.key_modifications[key.Tag] = key; + } + defaultLayout.Remove(key.Tag); + } + else + { + config.key_modifications[key.Tag] = key; } - - if (layout_height < current_height) - layout_height = current_height; - - Keys.Add(new DeviceKeyConfiguration(key, null)); } + config.keys_to_remove = defaultLayout.Keys.ToArray(); + var content = JsonConvert.SerializeObject(config); - Region.Width = layout_width; - Region.Height = layout_height; + File.WriteAllText(Path.Combine(layoutsPath, GetFolder(), Config.SelectedLayout + ".json"), content, Encoding.UTF8); } - private class KeyboardLayout - { - [JsonProperty("key_conversion")] - public Dictionary KeyConversion = null; - [JsonProperty("keys")] - public KeyboardKey[] Keys = null; - } - private void LoadCulture(String culture) + public void AddFeature(KeyboardKey[] keys, KeyboardRegion? insertion_region = KeyboardRegion.TopLeft) { - var fileName = "Plain Keyboard\\layout." + culture + ".json"; - var layoutPath = Path.Combine(layoutsPath, "Keyboard", fileName); - - //if (!File.Exists(layoutPath)) - // LoadDefault(); - - string content = File.ReadAllText(layoutPath, Encoding.UTF8); - KeyboardLayout keyboard = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - - //virtualKeyboardGroup = new VirtualGroup(keyboard.Keys); - - LayoutKeyConversion = keyboard.KeyConversion ?? new Dictionary(); - - } - } + double location_x = 0.0D; + double location_y = 0.0D; - class GeneralDeviceLayout : DeviceLayout - { - public GeneralDeviceLayout(DeviceConfig config) : base(config) { } - public override List LoadLayout() - { - string layoutConfigPath = ""; - string mouse_preference = SelectedLayout; - if (mouse_preference != "" && mouse_preference != "None") + if (insertion_region == KeyboardRegion.TopRight) { - layoutConfigPath = Path.Combine(layoutsPath, "Mouse", mouse_preference + ".json"); + location_x = Region.Width; } - - if (!string.IsNullOrWhiteSpace(layoutConfigPath) && File.Exists(layoutConfigPath)) + else if (insertion_region == KeyboardRegion.BottomLeft) { - string mouseConfigContent = File.ReadAllText(layoutConfigPath, Encoding.UTF8); - VirtualGroup mouseConfig = JsonConvert.DeserializeObject(mouseConfigContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - - AddFeature(mouseConfig.grouped_keys.ToArray(), mouseConfig.origin_region); - NormalizeKeys(); + location_y = Region.Height + 7; } - return Keys; - - } - private void LoadFromKeys(List JsonKeys) - { - double layout_height = 0; - double layout_width = 0; - double current_height = 0; - double current_width = 0; - - foreach (var key in JsonKeys) + else if (insertion_region == KeyboardRegion.BottomRight) { + location_x = Region.Width; + location_y = Region.Height + 7; - if (key.width + key.margin_left > 0) - current_width += key.width.Value + key.margin_left.Value; + } - if (key.margin_top > 0) - current_height += key.margin_top.Value; + int added_width = 0; + int added_height = 0; - key.margin_left = current_width - key.width.Value; - key.margin_top = current_height + key.margin_top.Value; + foreach (var key in keys) + { + key.margin_left += location_x; + key.margin_top += location_y; - if (layout_width < current_width) - layout_width = current_width; + Keys[(int)key.tag] = new DeviceKeyConfiguration(key, Config.Id); - if (key.line_break ?? false) + if (key.width + key.margin_left > Region.Width) + Region.Width = (int)(key.width + key.margin_left); + else if (key.margin_left + added_width < 0) { - current_height += 37; - current_width = 0; + added_width = -(int)(key.margin_left); } - if (layout_height < current_height) - layout_height = current_height; + if (key.height + key.margin_top > Region.Height) + Region.Height = (int)(key.height + key.margin_top); + else if (key.margin_top + added_height < 0) + { + added_height = -(int)(key.margin_top); + } - Keys.Add(new DeviceKeyConfiguration(key, DeviceId)); } - - Region.Width = (int)layout_width; - Region.Height = (int)layout_height; + Region.Width += added_width; + Region.Height += added_height; + //NormalizeKeys(); } - private class KeyboardLayout + protected void NormalizeKeys() { - [JsonProperty("key_conversion")] - public Dictionary KeyConversion = null; + int x_correction = 0; + int y_correction = 0; + int layout_height = 0; + int layout_width = 0; - [JsonProperty("keys")] - public KeyboardKey[] Keys = null; - } - private void LoadCulture(String culture) - { - var fileName = "Plain Keyboard\\layout." + culture + ".json"; - var layoutPath = Path.Combine(layoutsPath, "Keyboard", fileName); + foreach (var key in Keys.Values) + { + if (key.Region.X < x_correction) + x_correction = key.Region.X; - //if (!File.Exists(layoutPath)) - // LoadDefault(); + if (key.Region.Y < y_correction) + y_correction = key.Region.Y; + } + foreach (var key in Keys.Values) + { + key.Region.Y -= y_correction; + key.Region.X -= x_correction; - string content = File.ReadAllText(layoutPath, Encoding.UTF8); - KeyboardLayout keyboard = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + if (key.Region.Width + key.Region.X > layout_width) + layout_width = key.Region.Width + key.Region.X; - //virtualKeyboardGroup = new VirtualGroup(keyboard.Keys); + if (key.Region.Height + key.Region.Y > layout_height) + layout_height = key.Region.Height + key.Region.Y; + } + Region.Width = layout_width; + Region.Height = layout_height; + } + } + public class KeycapGroupConfiguration + { + public bool IsNewFormat = true; + public int[] keys_to_remove = new int[] { }; + + [JsonProperty("key_modifications")] + public Dictionary key_modifications = new Dictionary(); - LayoutKeyConversion = keyboard.KeyConversion ?? new Dictionary(); + [JsonProperty("key_to_add")] + public Dictionary key_to_add = new Dictionary(); + + public KeycapGroupConfiguration() + { } } + public class DeviceConfig @@ -618,12 +486,34 @@ public class DeviceConfig public Point Offset = new Point(0, 0); public bool LightingEnabled = true; + public DeviceConfig(DeviceConfig config) + { + Id = config.Id; + SelectedLayout = config.SelectedLayout; + SelectedKeyboardLayout = config.SelectedKeyboardLayout; + Type = config.Type; + } + + public DeviceConfig() + { + } + + public delegate void ConfigChangedEventHandler(); public delegate void SaveConfigEventHandler(DeviceConfig sender); + public delegate void DeleteConfigEventHandler(DeviceConfig sender); + public event ConfigChangedEventHandler ConfigurationChanged; public event SaveConfigEventHandler SaveConfiguration; + public event DeleteConfigEventHandler DeleteConfiguration; + public void Save() { SaveConfiguration?.Invoke(this); + ConfigurationChanged?.Invoke(); + } + public void Delete() + { + DeleteConfiguration?.Invoke(this); } } @@ -673,13 +563,11 @@ public void Load() DevicesConfig[2].Id = 2; DevicesConfig[2].Type = 0;*/ //DevicesLayout[1].Region.X = 825; - double baseline_x = 0.0; - double baseline_y = 0.0; - double current_height = 0; - double current_width = 0; + foreach (var layout in DevicesConfig) { layout.SaveConfiguration += SaveConfiguration; + layout.DeleteConfiguration += DeleteConfiguration; /* if (layout.Offset.X + layout.Region.Width > current_width) current_width = layout.Region.X + layout.Region.Width; @@ -691,8 +579,6 @@ public void Load() else if (layout.Region.Y < baseline_y) baseline_y = layout.Region.Y;*/ } - Width = current_width - baseline_x; - Height = current_height - baseline_y; DeviceLayoutNumberChanged?.Invoke(this); } @@ -704,6 +590,25 @@ private void SaveConfiguration(DeviceConfig config) var content = JsonConvert.SerializeObject(this); File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); } + private void DeleteConfiguration(DeviceConfig config) + { + DevicesConfig.Remove(config); + + var fileName = "DevicesConfig.json"; + var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); + var content = JsonConvert.SerializeObject(this); + File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); + DeviceLayoutNumberChanged?.Invoke(this); + } + public void AddNewDevice() + { + var config = new DeviceConfig(); + config.Id = DevicesConfig.Count; + config.SaveConfiguration += SaveConfiguration; + config.DeleteConfiguration += DeleteConfiguration; + DevicesConfig.Add(config); + DeviceLayoutNumberChanged?.Invoke(this); + } private void Layout_DeviceLayoutUpdated(object sender) { /*var layout = (sender as Control_DeviceLayout); diff --git a/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs index f4309ad97..184139304 100755 --- a/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs @@ -100,7 +100,7 @@ public class VirtualGroup { public string group_tag; - public KeyboardRegion origin_region; + public KeyboardRegion? origin_region; public List grouped_keys = new List(); @@ -126,7 +126,7 @@ public VirtualGroup(KeyboardKey[] keys) //NormalizeKeys(); } - public void AddFeature(KeyboardKey[] keys, KeyboardRegion insertion_region = KeyboardRegion.TopLeft) + public void AddFeature(KeyboardKey[] keys, KeyboardRegion? insertion_region = KeyboardRegion.TopLeft) { double location_x = 0.0D; double location_y = 0.0D; @@ -435,7 +435,7 @@ private string GetKeyboardCulture() return layout.ToString(); } - public void LoadBrand(string keyboard_preference = "", string mouse_preference = "", MouseOrientationType mouse_orientation = MouseOrientationType.RightHanded) + public void LoadBrand(string keyboard_preference = "", string mouse_preference = "", MouseOrientationType? mouse_orientation = MouseOrientationType.RightHanded) { #if !DEBUG try diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml deleted file mode 100644 index 059618e12..000000000 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs deleted file mode 100644 index 60d99c081..000000000 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceConfig.xaml.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; - -namespace Aurora.Settings.Keycaps -{ - /// - /// Interaction logic for Control_DeviceConfig.xaml - /// - public partial class Window_DeviceConfig : Window - { - public DeviceConfig Config; - public Window_DeviceConfig(DeviceConfig config) - { - InitializeComponent(); - Config = config; - LoadDeviceType(config.Type); - this.device_layout.SelectedItem = Config.SelectedLayout; - if (config.SelectedKeyboardLayout != null) - this.keyboard_layout.SelectedItem = Config.SelectedKeyboardLayout; - } - private List GetBrandsName(string dicName) - { - string layoutsPath = Path.Combine(Global.ExecutingDirectory, "DeviceLayouts", dicName); - List FilesName = new List() { "None" }; - foreach (var name in Directory.GetFiles(layoutsPath)) - { - FilesName.Add(name.Split('\\').Last().Split('.').First()); - } - return FilesName; - } - private void LoadDeviceType(int type) - { - switch (type) - { - case 0: - this.device_layout.ItemsSource = GetBrandsName("Keyboard"); - this.keyboard_layout.ItemsSource = GetBrandsName("Keyboard\\Plain Keyboard"); - this.keyboard_layout.Visibility = Visibility.Visible; - this.keyboard_layout_tb.Visibility = Visibility.Visible; - break; - default: - this.device_layout.ItemsSource = GetBrandsName("Mouse"); - this.keyboard_layout.Visibility = Visibility.Collapsed; - this.keyboard_layout_tb.Visibility = Visibility.Collapsed; - break; - } - } - private void device_type_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (IsLoaded) - { - Config.Type = this.device_layout.SelectedIndex; - } - } - private void device_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (IsLoaded) - { - Config.SelectedLayout = this.device_layout.SelectedItem.ToString(); - } - } - private void keyboard_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (IsLoaded) - { - Config.SelectedKeyboardLayout = this.keyboard_layout.SelectedItem.ToString(); - } - } - private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) - { - if (IsLoaded && sender is CheckBox) - { - Config.LightingEnabled = ((sender as CheckBox).IsChecked.HasValue) ? !(sender as CheckBox).IsChecked.Value : true; - } - } - - private void okButton_Click(object sender, RoutedEventArgs e) - { - DialogResult = true; - Close(); - } - - } -} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml index d48327fe2..5790cf10f 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml @@ -5,15 +5,14 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Aurora.Settings.Keycaps" mc:Ignorable="d" - Loaded="UserControl_Loaded" - MouseDown="UserControl_MouseDown" MouseUp="UserControl_MouseUp" MouseMove="UserControl_MouseMove" MouseDoubleClick="UserControl_MouseDoubleClick"> + Loaded="UserControl_Loaded"> - - + + - - + + diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs index ff16bf22b..f56ae3952 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs @@ -23,26 +23,48 @@ public partial class Control_DeviceLayout : UserControl public delegate void LayoutUpdatedEventHandler(object sender); public event LayoutUpdatedEventHandler DeviceLayoutUpdated; - public bool IsLayoutMoveEnabled = false; public Dictionary KeyboardMap = new Dictionary(new DeviceKey.EqualityComparer()); + private Point BaseOffset = new Point(0,0); - private System.Windows.Point _positionInBlock; + public static readonly DependencyProperty DeviceConfigProperty = DependencyProperty.Register("DeviceConfig", typeof(DeviceConfig), typeof(DeviceConfig)); + + public DeviceConfig DeviceConfig + { + get { return (DeviceConfig)GetValue(DeviceConfigProperty); } + set { + SetValue(DeviceConfigProperty, value); + DeviceConfig.ConfigurationChanged += ConfigChanged; + ConfigChanged(); + } + } - private DeviceConfig DeviceConfig; private string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + public Control_DeviceLayout() + { + InitializeComponent(); + DeviceConfig = new DeviceConfig(); + } public Control_DeviceLayout(DeviceConfig config) { InitializeComponent(); DeviceConfig = config; - + //ConfigChanged(); + + } - private void UserControl_Loaded(object sender, RoutedEventArgs e) + + private void ConfigChanged() { Keys = LoadKeys(); } + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + DeviceLayoutUpdated?.Invoke(this); + } + private List _Keys = new List(); public List Keys { @@ -50,94 +72,32 @@ public List Keys set { _Keys = value; - device_grid.Children.Clear(); - Grid deviceControl = CreateUserControl(); - device_grid.Children.Add(deviceControl); - this.Width = deviceControl.Width; - this.Height = deviceControl.Height; + CreateUserControl(device_grid); + + this.Width = device_grid.Width; + this.Height = device_grid.Height; RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); + device_grid.UpdateLayout(); device_viewbox.UpdateLayout(); + this.UpdateLayout(); DeviceLayoutUpdated?.Invoke(this); } } private List LoadKeys() { - DeviceLayout layout; - switch (DeviceConfig.Type) - { - case 0: - layout = new KeyboardDeviceLayout(DeviceConfig); - break; - case 1: - layout = new GeneralDeviceLayout(DeviceConfig); - break; - default: - layout = new GeneralDeviceLayout(DeviceConfig); - break; - } + DeviceLayout layout = new DeviceLayout(DeviceConfig); return layout.LoadLayout(); } - private void UserControl_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - this.ReleaseMouseCapture(); - Window_DeviceConfig configWindow = new Window_DeviceConfig(DeviceConfig); - if(configWindow.ShowDialog() == true) - { - DeviceConfig = configWindow.Config; - Keys = LoadKeys(); - DeviceConfig.Save(); - } - - } - private void UserControl_MouseDown(object sender, MouseButtonEventArgs e) - { - if (e.ClickCount < 2 && IsLayoutMoveEnabled) - { - // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) - _positionInBlock = Mouse.GetPosition(this); - - // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) - this.CaptureMouse(); - } - - } - - private void UserControl_MouseMove(object sender, MouseEventArgs e) - { - // if the mouse is captured. you are moving it. (there is your 'real' boolean) - if (this.IsMouseCaptured) - { - // get the parent container - var container = VisualTreeHelper.GetParent(this) as UIElement; - - // get the position within the container - var mousePosition = e.GetPosition(container); - - // move the usercontrol. - this.RenderTransform = new TranslateTransform(mousePosition.X - _positionInBlock.X, mousePosition.Y - _positionInBlock.Y); - - } - } - - private void UserControl_MouseUp(object sender, MouseButtonEventArgs e) - { - // release this control. - this.ReleaseMouseCapture(); - - DeviceLayoutUpdated?.Invoke(this); - - SaveLayoutPosition(TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement)); - } - public Grid CreateUserControl(bool abstractKeycaps = false) + + public void CreateUserControl(Canvas deviceControl, bool abstractKeycaps = false) { KeyboardMap.Clear(); - - Grid deviceControl = new Grid(); + deviceControl.Children.Clear(); if (Keys.Count > 0) { string images_path = System.IO.Path.Combine(layoutsPath, "Images"); @@ -153,8 +113,15 @@ public Grid CreateUserControl(bool abstractKeycaps = false) Control_Keycap keycap = new Control_Keycap(key, image_path); + if (key.Tag == (int)Devices.DeviceKeys.ESC) + { + //var escKey = KeyboardMap[Devices.DeviceKeys.ESC]; + BaseOffset.X = key.Region.X; + BaseOffset.Y = key.Region.Y; - keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); + } + keycap.RenderTransform = new TranslateTransform(key.Region.X, key.Region.Y); + //keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); deviceControl.Children.Add(keycap); if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag) && keycap is IKeycap && !abstractKeycaps) @@ -167,6 +134,10 @@ public Grid CreateUserControl(bool abstractKeycaps = false) layout_height = key.Region.Height + key.Region.Y; } + foreach (Control_Keycap k in deviceControl.Children) + { + k.Offset = BaseOffset; + } //Update size deviceControl.Width = layout_width; deviceControl.Height = layout_height; @@ -187,33 +158,6 @@ public Grid CreateUserControl(bool abstractKeycaps = false) DockPanel.SetDock(info_message, Dock.Top); info_panel.Children.Add(info_message); - DockPanel info_instruction = new DockPanel(); - - info_instruction.Children.Add(new TextBlock() - { - Text = "Press (", - Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0)), - VerticalAlignment = VerticalAlignment.Center - }); - - info_instruction.Children.Add(new System.Windows.Controls.Image() - { - Source = new BitmapImage(new Uri(@"Resources/settings_icon.png", UriKind.Relative)), - Stretch = Stretch.Uniform, - Height = 40.0, - VerticalAlignment = VerticalAlignment.Center - }); - - info_instruction.Children.Add(new TextBlock() - { - Text = ") and go into \"Devices & Wrappers\" tab", - Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0)), - VerticalAlignment = VerticalAlignment.Center - }); - - DockPanel.SetDock(info_instruction, Dock.Bottom); - info_panel.Children.Add(info_instruction); - error_message.Content = info_panel; error_message.FontSize = 16.0; @@ -226,10 +170,6 @@ public Grid CreateUserControl(bool abstractKeycaps = false) deviceControl.Width = 450; deviceControl.Height = 200; } - - - - return deviceControl; } public static int PixelToByte(int pixel) { diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml index 6c473fd3b..32525b5aa 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml @@ -1,4 +1,4 @@ - + + + + + @@ -17,7 +23,14 @@ - diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs index e526eb8b8..b2d8f0caa 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml.cs @@ -1,6 +1,7 @@ using Aurora.Controls; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; @@ -23,13 +24,28 @@ namespace Aurora.Settings.Keycaps public partial class Control_DeviceLayoutPresenter : UserControl { List DeviceLayouts = new List(); + private System.Windows.Point _positionInBlock; public List Keycaps => DeviceLayouts.SelectMany(dl => dl.KeyboardMap.Values).ToList(); - public bool IsLayoutMoveEnabled { get; set; } + public static readonly DependencyProperty IsLayoutMoveEnabledProperty = DependencyProperty.Register("IsLayoutMoveEnabled", + typeof(bool), + typeof(Control_DeviceLayoutPresenter)); + + public bool IsLayoutMoveEnabled + { + get { return (bool)GetValue(IsLayoutMoveEnabledProperty); } + set { SetValue(IsLayoutMoveEnabledProperty, value); } + } + + private void enableEditLayout_Click(object sender, RoutedEventArgs e) + { + IsLayoutMoveEnabled = !IsLayoutMoveEnabled; + } public Control_DeviceLayoutPresenter() { InitializeComponent(); + DataContext = this; Global.devicesLayout.DeviceLayoutNumberChanged += DeviceLayoutNumberChanged; Global.Configuration.PropertyChanged += Configuration_PropertyChanged; this.keyboard_record_message.Visibility = Visibility.Hidden; @@ -60,6 +76,18 @@ private void Configuration_PropertyChanged(object sender, System.ComponentModel. CalculateBitmap(); } } + private void AddNewDeviceLayout(object sender, RoutedEventArgs e) + { + Global.devicesLayout.AddNewDevice(); + //DeviceLayoutNumberChanged(this); + } + + private void OpenEnableMenu(object sender, RoutedEventArgs e) + { + ContextMenu cm = this.FindResource("enableMenu") as ContextMenu; + cm.PlacementTarget = sender as Button; + cm.IsOpen = true; + } private void Layout_DeviceLayoutUpdated(object sender) { @@ -90,36 +118,40 @@ private void Layout_DeviceLayoutUpdated(object sender) if (offset.Y + layout.Height - baseline_y > current_height) current_height = offset.Y + layout.Height - baseline_y;*/ - //layout.RenderTransform = new TranslateTransform(offset - //layout.Margin = new Thickness(offset.X - baseline_x, offset.Y - baseline_y, 0, 0); - /* layout.RenderTransform = new TranslateTransform(offset.X - baseline_x, offset.Y - baseline_y); - if (layout is Control_DeviceLayout) - (layout as Control_DeviceLayout).SaveLayoutPosition(offset); - }*/ + //layout.RenderTransform = new TranslateTransform(offset + //layout.Margin = new Thickness(offset.X - baseline_x, offset.Y - baseline_y, 0, 0); + /* layout.RenderTransform = new TranslateTransform(offset.X - baseline_x, offset.Y - baseline_y); + if (layout is Control_DeviceLayout) + (layout as Control_DeviceLayout).SaveLayoutPosition(offset); + }*/ layouts_grid.Width = current_width - baseline_x; //this.Width = width + (keyboard_grid.Width - virtual_keyboard_width); layouts_grid.Height = current_height - baseline_y; - layouts_grid.RenderTransform = new TranslateTransform(-baseline_x, -baseline_y); - //keyboard_grid.Clip = new RectangleGeometry(new Rect(baseline_x, baseline_x, current_width - baseline_x, current_height - baseline_y)); - //this.Height = height + (keyboard_grid.Height - virtual_keyboard_height); - Effects.grid_baseline_x = 0; - Effects.grid_baseline_y = 0; - Effects.grid_width = (float)layouts_grid.Width; - Effects.grid_height = (float)layouts_grid.Height; - - - //keyboard_grid.Margin = new Thickness(-baseline_x, -baseline_y, 0, 0); - //layout2.LayoutTransform = new TranslateTransform(layout2.Region.X, layout2.Region.Y); - layouts_viewbox.MaxWidth = current_width; - layouts_viewbox.MaxHeight = current_height; - MaxWidth = current_width + 50;// + 50; - MaxHeight = current_height + 50;// + 50; - layouts_grid.UpdateLayout(); - layouts_viewbox.UpdateLayout(); - this.UpdateLayout(); - CalculateBitmap(); + foreach (UIElement layout in layouts_grid.Children) + { + Point offset = layout.TranslatePoint(new Point(0, 0), layouts_grid); + layout.RenderTransform = new TranslateTransform(offset.X - baseline_x, offset.Y - baseline_y); + layout.UpdateLayout(); + } + //layouts_grid.RenderTransform = new TranslateTransform(-baseline_x, -baseline_y); + //keyboard_grid.Clip = new RectangleGeometry(new Rect(baseline_x, baseline_x, current_width - baseline_x, current_height - baseline_y)); + //this.Height = height + (keyboard_grid.Height - virtual_keyboard_height); + Effects.grid_baseline_x = 0;// (float)-baseline_x; + Effects.grid_baseline_y = 0;// (float)-baseline_y; + Effects.grid_width = (float)layouts_grid.Width; + Effects.grid_height = (float)layouts_grid.Height; + + + //keyboard_grid.Margin = new Thickness(-baseline_x, -baseline_y, 0, 0); + //layout2.LayoutTransform = new TranslateTransform(layout2.Region.X, layout2.Region.Y); + layouts_viewbox.MaxWidth = layouts_grid.Width; + layouts_viewbox.MaxHeight = layouts_grid.Height; + layouts_grid.UpdateLayout(); + layouts_viewbox.UpdateLayout(); + this.UpdateLayout(); + CalculateBitmap(); } public void CalculateBitmap() @@ -138,12 +170,76 @@ private void DeviceLayoutNumberChanged(object sender) //keyboard_grid.ClipToBounds = true; layouts_grid.Children.Clear(); - DeviceLayouts.ForEach(d => layouts_grid.Children.Add(d)); - DeviceLayouts.ForEach(d => d.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated); + foreach (var layout in DeviceLayouts) + { + layouts_grid.Children.Add(layout); + layout.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated; + layout.MouseDoubleClick += DeviceLayout_MouseDoubleClick; + layout.MouseDown += DeviceLayout_MouseDown; + layout.MouseMove += DeviceLayout_MouseMove; + layout.MouseUp += DeviceLayout_MouseUp; + } layouts_grid.Children.Add(new LayerEditor(layouts_grid)); + } + private void DeviceLayout_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (IsLayoutMoveEnabled) + { + var layout = sender as Control_DeviceLayout; + layout.ReleaseMouseCapture(); + Window_DeviceConfig configWindow = new Window_DeviceConfig(layout.DeviceConfig); + configWindow.Show(); + } - DeviceLayouts.ForEach(l => l.IsLayoutMoveEnabled = IsLayoutMoveEnabled); + } + private void DeviceLayout_MouseDown(object sender, MouseButtonEventArgs e) + { + var layout = sender as Control_DeviceLayout; + if (e.ClickCount < 2 && IsLayoutMoveEnabled) + { + // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) + _positionInBlock = Mouse.GetPosition(layout); + + // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) + layout.CaptureMouse(); + } + + } + + private void DeviceLayout_MouseMove(object sender, MouseEventArgs e) + { + var layout = sender as Control_DeviceLayout; + // if the mouse is captured. you are moving it. (there is your 'real' boolean) + if (layout.IsMouseCaptured) + { + // get the parent container + var container = VisualTreeHelper.GetParent(layout) as UIElement; + + // get the position within the container + var mousePosition = e.GetPosition(container); + + // move the usercontrol. + layout.RenderTransform = new TranslateTransform(mousePosition.X - _positionInBlock.X, mousePosition.Y - _positionInBlock.Y); + + } + } + + private void DeviceLayout_MouseUp(object sender, MouseButtonEventArgs e) + { + var layout = sender as Control_DeviceLayout; + if (layout.IsMouseCaptured) + { + // release this control. + layout.ReleaseMouseCapture(); + + if (layout.RenderTransform is TranslateTransform) + { + layout.DeviceConfig.Offset.X = (layout.RenderTransform as TranslateTransform).X; + layout.DeviceConfig.Offset.Y = (layout.RenderTransform as TranslateTransform).Y; + layout.DeviceConfig.Save(); + } + } } } -} + } diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml index 6f85833b0..a96c9a4e2 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml @@ -5,6 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Aurora.Settings.Keycaps" mc:Ignorable="d" + MouseDown="keyBorder_MouseDown" MouseMove="keyBorder_MouseMove" MouseLeave="keyBorder_MouseLeave" MouseEnter="keyBorder_MouseEnter" d:DesignHeight="30" d:DesignWidth="30" HorizontalAlignment="Left" VerticalAlignment="Top"> @@ -12,7 +13,7 @@ - + diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs index e9f6d421f..836672a1b 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs @@ -22,9 +22,13 @@ namespace Aurora.Settings.Keycaps /// public partial class Control_Keycap : UserControl, IKeycap { - private Color current_color = Color.FromArgb(0, 0, 0, 0); - private DeviceKey associatedKey = DeviceKeys.NONE; - private bool isImage = false; + private Color currentColor = Color.FromArgb(0, 0, 0, 0); + private DeviceKey AssociatedKey = DeviceKeys.NONE; + private bool IsImage = false; + public bool IsKeyMoveEnabled = false; + private System.Windows.Point _positionInBlock; + private DeviceKeyConfiguration Config; + public System.Windows.Point Offset = new System.Windows.Point(); public Control_Keycap() { InitializeComponent(); @@ -34,7 +38,8 @@ public Control_Keycap(DeviceKeyConfiguration key, string image_path) { InitializeComponent(); - associatedKey = key.Key; + Config = key; + AssociatedKey = key.Key; this.Width = key.Region.Width; this.Height = key.Region.Height; @@ -54,7 +59,7 @@ public Control_Keycap(DeviceKeyConfiguration key, string image_path) if (string.IsNullOrWhiteSpace(key.Image)) { - keyCap.Text = associatedKey.VisualName; + keyCap.Text = AssociatedKey.VisualName; //keyCap.Tag = associatedKey.Tag; if (key.FontSize != null) keyCap.FontSize = key.FontSize.Value; @@ -82,7 +87,7 @@ public Control_Keycap(DeviceKeyConfiguration key, string image_path) keyBorder.OpacityMask = new ImageBrush(image); } - isImage = true; + IsImage = true; } } @@ -91,7 +96,7 @@ public Control_Keycap(DeviceKeyConfiguration key, string image_path) public DeviceKey GetKey() { - return associatedKey; + return AssociatedKey; } public void SetColor(Color key_color) @@ -99,7 +104,7 @@ public void SetColor(Color key_color) //key_color = Color.FromArgb(255, 255, 255, 255); //No colors allowed! if (keyBorder.IsEnabled) { - if (!isImage) + if (!IsImage) { switch (Global.Configuration.virtualkeyboard_keycap_type) { @@ -129,7 +134,7 @@ public void SetColor(Color key_color) } else { - if (associatedKey.Tag != (int)DeviceKeys.NONE) + if (AssociatedKey.Tag != (int)DeviceKeys.NONE) keyBorder.Background = new SolidColorBrush(key_color); } } @@ -140,7 +145,7 @@ public void SetColor(Color key_color) } - if (Global.key_recorder.HasRecorded(associatedKey)) + if (Global.key_recorder.HasRecorded(AssociatedKey)) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); if (Global.Configuration.virtualkeyboard_keycap_type == KeycapType.Colorized_blank) { @@ -171,7 +176,7 @@ public void SetColor(Color key_color) private void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) { if (sender is Border) - virtualkeyboard_key_selected(associatedKey); + virtualkeyboard_key_selected(AssociatedKey); } private void keyBorder_MouseMove(object sender, MouseEventArgs e) @@ -196,8 +201,9 @@ private void keyBorder_MouseLeave(object sender, MouseEventArgs e) private void keyBorder_MouseEnter(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed && sender is Border) - virtualkeyboard_key_selected(associatedKey); + virtualkeyboard_key_selected(AssociatedKey); } + public void UpdateText() { //if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration()) @@ -207,7 +213,7 @@ public void UpdateText() // return; StringBuilder sb = new StringBuilder(2); - var scan_code = KeyUtils.GetScanCode((DeviceKeys)associatedKey.Tag); + var scan_code = KeyUtils.GetScanCode((DeviceKeys)AssociatedKey.Tag); if (scan_code == -1) return; /*var key = KeyUtils.GetFormsKey((KeyboardKeys)associatedKey.LedID); @@ -217,5 +223,64 @@ public void UpdateText() keyCap.Text = sb.ToString().ToUpper(); } } + + private void UserControl_MouseDown(object sender, MouseButtonEventArgs e) + { + if (IsKeyMoveEnabled) + { + // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) + _positionInBlock = Mouse.GetPosition(this); + + // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) + this.CaptureMouse(); + } + + } + + private void UserControl_MouseMove(object sender, MouseEventArgs e) + { + // if the mouse is captured. you are moving it. (there is your 'real' boolean) + if (this.IsMouseCaptured) + { + // get the parent container + var container = VisualTreeHelper.GetParent(this) as UIElement; + + // get the position within the container + var mousePosition = e.GetPosition(container); + + // move the usercontrol. + this.RenderTransform = new TranslateTransform(mousePosition.X - _positionInBlock.X, mousePosition.Y - _positionInBlock.Y); + + } + } + + private void UserControl_MouseUp(object sender, MouseButtonEventArgs e) + { + // release this control. + this.ReleaseMouseCapture(); + + //DeviceLayoutUpdated?.Invoke(this); + + /*if (this.RenderTransform is TranslateTransform) + { + DeviceConfig.Offset.X = (this.RenderTransform as TranslateTransform).X; + DeviceConfig.Offset.Y = (this.RenderTransform as TranslateTransform).Y; + DeviceConfig.Save(); + }*/ + //SaveLayoutPosition(TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement)); + } + + internal DeviceKeyConfiguration GetConfiguration() + { + var offset = this.TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement) - Offset; + const int epsilon = 3; + if (Config.Region.X < offset.X - epsilon || Config.Region.X > offset.X + epsilon || Config.Region.Y < offset.Y - epsilon || Config.Region.Y > offset.Y + epsilon) + { + Config.Region.X = (int)offset.X;// - (int)Offset.X; + Config.Region.Y = (int)offset.Y;// - (int)Offset.Y; + } + + return Config; + } } } diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml new file mode 100644 index 000000000..4233d67e7 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs new file mode 100644 index 000000000..c7281142d --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; + +namespace Aurora.Settings.Keycaps +{ + /// + /// Interaction logic for Window_DeviceConfig.xaml + /// + public partial class Window_DeviceConfig : Window + { + private DeviceConfig _config; + public DeviceConfig Config + { + get { return _config; } + set + { + _config = value; + LoadDeviceLayout(); + } + } + public bool DeleteDevice = false; + private System.Windows.Point _positionInBlock; + public Control_Keycap SelectedKey; + public Window_DeviceConfig(DeviceConfig config) + { + InitializeComponent(); + Config = config; + LoadDeviceType(config.Type); + + this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; + this.device_layout.SelectedItem = Config.SelectedLayout; + if (config.SelectedKeyboardLayout != null) + this.keyboard_layout.SelectedItem = Config.SelectedKeyboardLayout; + } + private List GetBrandsName(string dicName) + { + string layoutsPath = Path.Combine(Global.ExecutingDirectory, "DeviceLayouts", dicName); + List FilesName = new List() { "None" }; + foreach (var name in Directory.GetFiles(layoutsPath)) + { + FilesName.Add(name.Split('\\').Last().Split('.').First()); + } + return FilesName; + } + private void LoadDeviceType(int type) + { + switch (type) + { + case 0: + this.device_layout.ItemsSource = GetBrandsName("Keyboard"); + this.keyboard_layout.ItemsSource = GetBrandsName("Keyboard\\Plain Keyboard"); + this.keyboard_layout.Visibility = Visibility.Visible; + this.keyboard_layout_tb.Visibility = Visibility.Visible; + break; + default: + this.device_layout.ItemsSource = GetBrandsName("Mouse"); + this.keyboard_layout.Visibility = Visibility.Collapsed; + this.keyboard_layout_tb.Visibility = Visibility.Collapsed; + break; + } + } + private void device_type_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + Config.Type = this.device_type.SelectedIndex; + this.device_layout.SelectedItem = "None"; + LoadDeviceType(Config.Type); + } + } + private void device_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + Config.SelectedLayout = this.device_layout.SelectedItem.ToString(); + LoadDeviceLayout(); + } + } + private void keyboard_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + Config.SelectedKeyboardLayout = this.keyboard_layout.SelectedItem.ToString(); + LoadDeviceLayout(); + } + } + private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) + { + if (IsLoaded && sender is CheckBox) + { + Config.LightingEnabled = ((sender as CheckBox).IsChecked.HasValue) ? !(sender as CheckBox).IsChecked.Value : true; + } + deviceLayout = new Control_DeviceLayout(Config); + } + + private void okButton_Click(object sender, RoutedEventArgs e) + { + Config.Save(); + Close(); + } + private void cancelButton_Click(object sender, RoutedEventArgs e) + { + Close(); + } + private void deviceDelete_Click(object sender, RoutedEventArgs e) + { + if (MessageBox.Show("Are you sure that remove the device layout?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) + { + Config.Delete(); + Close(); + } + + } + private void saveLayout_Click(object sender, RoutedEventArgs e) + { + if (MessageBox.Show("Are you sure that save the device layout?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) + { + new DeviceLayout(Config).SaveLayout(deviceLayout.KeyboardMap.Values.ToList()); + } + + } + private void KeyMouseDown(object sender, MouseButtonEventArgs e) + { + // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) + _positionInBlock = Mouse.GetPosition(sender as UIElement); + + // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) + (sender as UIElement).CaptureMouse(); + + } + + private void KeyMouseMove(object sender, MouseEventArgs e) + { + // if the mouse is captured. you are moving it. (there is your 'real' boolean) + if ((sender as UIElement).IsMouseCaptured) + { + // get the parent container + var container = VisualTreeHelper.GetParent(sender as UIElement) as UIElement; + + // get the position within the container + var mousePosition = e.GetPosition(container); + + // move the usercontrol. + (sender as UIElement).RenderTransform = new TranslateTransform((int)(mousePosition.X - _positionInBlock.X), (int)(mousePosition.Y - _positionInBlock.Y)); + + } + } + + private void KeyMouseUp(object sender, MouseButtonEventArgs e) + { + // release this control. + (sender as UIElement).ReleaseMouseCapture(); + + } + private void LoadDeviceLayout() + { + deviceLayout.DeviceConfig = new DeviceConfig(Config); + foreach (var key in deviceLayout.KeyboardMap.Values) + { + key.MouseDown += KeyMouseDown; + key.MouseMove += KeyMouseMove; + key.MouseUp += KeyMouseUp; + key.UpdateLayout(); + } + deviceLayout.UpdateLayout(); + this.Width = deviceLayout.Width + 340; + } + } +} From e5ff467fcd653fd264cde3f1208b1f13b78d2764 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 4 May 2020 23:32:15 +0200 Subject: [PATCH 05/42] enable loading old profiles, Keycap control refactor --- Project-Aurora/Project-Aurora/ConfigUI.xaml | 2 +- .../Project-Aurora/ConfigUI.xaml.cs | 1 - .../Controls/Control_AnimationEditor.xaml | 2 +- .../Controls/Control_AnimationEditor.xaml.cs | 10 +- .../Keyboard/Plain Keyboard/ansi_layout.json | 945 ++++++++++++------ .../CoolerMaster/CoolerMasterDevice.cs | 8 +- .../EffectsEngine/EffectLayer.cs | 54 +- .../Project-Aurora/EffectsEngine/Effects.cs | 7 - .../Project-Aurora/Project-Aurora.csproj | 66 +- .../Settings/Control_Settings.xaml.cs | 1 + .../Settings/DeviceLayoutManager.cs | 207 +++- .../Control_DeviceLayout.xaml | 4 +- .../Control_DeviceLayout.xaml.cs | 43 +- .../Control_DeviceLayoutPresenter.xaml | 4 +- .../Control_DeviceLayoutPresenter.xaml.cs | 7 +- .../DeviceLayoutViewer/Control_Keycap.xaml | 12 + .../DeviceLayoutViewer/Control_Keycap.xaml.cs | 184 ++++ .../Keycaps/Control_ColorizedKeycap.xaml | 13 + .../Keycaps/Control_ColorizedKeycap.xaml.cs | 81 ++ .../Keycaps/Control_ColorizedKeycapBlank.xaml | 13 + .../Control_ColorizedKeycapBlank.xaml.cs | 75 ++ .../Keycaps/Control_DefaultKeycap.xaml | 13 + .../Keycaps/Control_DefaultKeycap.xaml.cs | 85 ++ .../Control_DefaultKeycapBackglow.xaml} | 12 +- .../Control_DefaultKeycapBackglow.xaml.cs | 78 ++ .../Control_DefaultKeycapBackglowOnly.xaml | 18 + .../Control_DefaultKeycapBackglowOnly.xaml.cs | 79 ++ .../Keycaps/Control_GhostKeycap.xaml | 13 + .../Keycaps/Control_GhostKeycap.xaml.cs | 120 +++ .../Keycaps/Control_ImageKeycap.xaml | 11 + .../Keycaps/Control_ImageKeycap.xaml.cs | 83 ++ .../Keycaps/KeycapViewer.cs | 92 ++ .../DeviceLayoutViewer/ViewModelBase .cs | 28 + .../Window_DeviceConfig.xaml | 30 +- .../Window_DeviceConfig.xaml.cs | 62 +- .../Settings/KeyboardLayoutManager.cs | 4 +- .../Settings/Keycaps/Control_Keycap.xaml.cs | 285 ------ .../Settings/Keycaps/IKeycap.cs | 16 - .../Project-Aurora/Utils/JSONUtils.cs | 2 + 39 files changed, 1975 insertions(+), 795 deletions(-) rename Project-Aurora/Project-Aurora/Settings/{Keycaps => DeviceLayoutViewer}/Control_DeviceLayout.xaml (86%) rename Project-Aurora/Project-Aurora/Settings/{Keycaps => DeviceLayoutViewer}/Control_DeviceLayout.xaml.cs (79%) rename Project-Aurora/Project-Aurora/Settings/{Keycaps => DeviceLayoutViewer}/Control_DeviceLayoutPresenter.xaml (91%) rename Project-Aurora/Project-Aurora/Settings/{Keycaps => DeviceLayoutViewer}/Control_DeviceLayoutPresenter.xaml.cs (98%) create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs rename Project-Aurora/Project-Aurora/Settings/{Keycaps/Control_Keycap.xaml => DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml} (63%) create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/ViewModelBase .cs rename Project-Aurora/Project-Aurora/Settings/{Keycaps => DeviceLayoutViewer}/Window_DeviceConfig.xaml (53%) rename Project-Aurora/Project-Aurora/Settings/{Keycaps => DeviceLayoutViewer}/Window_DeviceConfig.xaml.cs (74%) delete mode 100644 Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs delete mode 100644 Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs diff --git a/Project-Aurora/Project-Aurora/ConfigUI.xaml b/Project-Aurora/Project-Aurora/ConfigUI.xaml index 230098f41..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" xmlns:DeviceLayout="clr-namespace:Aurora.Settings.Keycaps" 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"> diff --git a/Project-Aurora/Project-Aurora/ConfigUI.xaml.cs b/Project-Aurora/Project-Aurora/ConfigUI.xaml.cs index b972a9082..effec1c17 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; diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml index be530ad51..37ff25097 100644 --- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml +++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml @@ -4,7 +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.Keycaps" + xmlns:DeviceLayout="clr-namespace:Aurora.Settings.DeviceLayoutViewer" mc:Ignorable="d" d:DesignHeight="414" d:DesignWidth="535" Loaded="UserControl_Loaded" PreviewKeyDown="UserControl_PreviewKeyDown"> diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs index 2d344259e..db91eea5d 100644 --- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs @@ -71,7 +71,7 @@ private void Layout_DevicesNumberChanged(object sender) this.UpdateLayout(); //Generate a new mapping - foreach (Settings.Keycaps.Control_Keycap key in deviceLayerPresenter.Keycaps) + foreach (Settings.DeviceLayoutViewer.Control_Keycap key in deviceLayerPresenter.Keycaps) { if (key.GetKey() != DeviceKeys.NONE) { @@ -87,9 +87,9 @@ private void UserControl_Loaded(object sender, RoutedEventArgs e) 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(); } @@ -97,9 +97,9 @@ 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(); } 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 index 3e9c78dba..a7d63b135 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/ansi_layout.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/ansi_layout.json @@ -1,1148 +1,1459 @@ -{ - "layout_width":800, - "layout_height":400, - "key_conversion":null, - "keys":[ - { - "Key":{ +{ + "layout_width":0, + "layout_height":0, + "keys":[ + { + "Key":{ "visual_name":"ESC", "tag":1, "device_id":null }, - "Region":"0, 0, 30, 30", + "X":0, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F1", "tag":2, "device_id":null }, - "Region":"62, 0, 30, 30", + "X":62, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F2", "tag":3, "device_id":null }, - "Region":"99, 0, 30, 30", + "X":99, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F3", "tag":4, "device_id":null }, - "Region":"136, 0, 30, 30", + "X":136, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F4", "tag":5, "device_id":null }, - "Region":"173, 0, 30, 30", + "X":173, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F5", "tag":6, "device_id":null }, - "Region":"237, 0, 30, 30", + "X":237, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F6", "tag":7, "device_id":null }, - "Region":"274, 0, 30, 30", + "X":274, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F7", "tag":8, "device_id":null }, - "Region":"311, 0, 30, 30", + "X":311, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F8", "tag":9, "device_id":null }, - "Region":"348, 0, 30, 30", + "X":348, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F9", "tag":10, "device_id":null }, - "Region":"407, 0, 30, 30", + "X":407, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F10", "tag":11, "device_id":null }, - "Region":"444, 0, 30, 30", + "X":444, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F11", "tag":12, "device_id":null }, - "Region":"481, 0, 30, 30", + "X":481, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F12", "tag":13, "device_id":null }, - "Region":"518, 0, 30, 30", + "X":518, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"PRINT", "tag":14, "device_id":null }, - "Region":"563, 0, 30, 30", + "X":563, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"SCRL\r\nLOCK", "tag":15, "device_id":null }, - "Region":"600, 0, 30, 30", + "X":600, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"PAUSE", "tag":16, "device_id":null }, - "Region":"637, 0, 30, 30", + "X":637, + "Y":0, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"~", "tag":17, "device_id":null }, - "Region":"0, 37, 30, 30", + "X":0, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"1", "tag":18, "device_id":null }, - "Region":"37, 37, 30, 30", + "X":37, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"2", "tag":19, "device_id":null }, - "Region":"74, 37, 30, 30", + "X":74, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"3", "tag":20, "device_id":null }, - "Region":"111, 37, 30, 30", + "X":111, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"4", "tag":21, "device_id":null }, - "Region":"148, 37, 30, 30", + "X":148, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"5", "tag":22, "device_id":null }, - "Region":"185, 37, 30, 30", + "X":185, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"6", "tag":23, "device_id":null }, - "Region":"222, 37, 30, 30", + "X":222, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"7", "tag":24, "device_id":null }, - "Region":"259, 37, 30, 30", + "X":259, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"8", "tag":25, "device_id":null }, - "Region":"296, 37, 30, 30", + "X":296, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"9", "tag":26, "device_id":null }, - "Region":"333, 37, 30, 30", + "X":333, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"0", "tag":27, "device_id":null }, - "Region":"370, 37, 30, 30", + "X":370, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"-", "tag":28, "device_id":null }, - "Region":"407, 37, 30, 30", + "X":407, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"=", "tag":29, "device_id":null }, - "Region":"444, 37, 30, 30", + "X":444, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"BACKSPACE", "tag":30, "device_id":null }, - "Region":"481, 37, 67, 30", + "X":481, + "Y":37, + "Width":67, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"INSERT", "tag":31, "device_id":null }, - "Region":"563, 37, 30, 30", + "X":563, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"HOME", "tag":32, "device_id":null }, - "Region":"600, 37, 30, 30", + "X":600, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"PAGE\r\nUP", "tag":33, "device_id":null }, - "Region":"637, 37, 30, 30", + "X":637, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"NUM\r\nLOCK", "tag":34, "device_id":null }, - "Region":"682, 37, 30, 30", + "X":682, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"/", "tag":35, "device_id":null }, - "Region":"719, 37, 30, 30", + "X":719, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"*", "tag":36, "device_id":null }, - "Region":"756, 37, 30, 30", + "X":756, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"-", "tag":37, "device_id":null }, - "Region":"793, 37, 30, 30", + "X":793, + "Y":37, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"TAB", "tag":38, "device_id":null }, - "Region":"0, 74, 50, 30", + "X":0, + "Y":74, + "Width":50, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"Q", "tag":39, "device_id":null }, - "Region":"57, 74, 30, 30", + "X":57, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"W", "tag":40, "device_id":null }, - "Region":"94, 74, 30, 30", + "X":94, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"E", "tag":41, "device_id":null }, - "Region":"131, 74, 30, 30", + "X":131, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"R", "tag":42, "device_id":null }, - "Region":"168, 74, 30, 30", + "X":168, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"T", "tag":43, "device_id":null }, - "Region":"205, 74, 30, 30", + "X":205, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"Y", "tag":44, "device_id":null }, - "Region":"242, 74, 30, 30", + "X":242, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"U", "tag":45, "device_id":null }, - "Region":"279, 74, 30, 30", + "X":279, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"I", "tag":46, "device_id":null }, - "Region":"316, 74, 30, 30", + "X":316, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"O", "tag":47, "device_id":null }, - "Region":"353, 74, 30, 30", + "X":353, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"P", "tag":48, "device_id":null }, - "Region":"390, 74, 30, 30", + "X":390, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"{", "tag":49, "device_id":null }, - "Region":"427, 74, 30, 30", + "X":427, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"}", "tag":50, "device_id":null }, - "Region":"464, 74, 30, 30", + "X":464, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"\\", "tag":51, "device_id":null }, - "Region":"501, 74, 47, 30", + "X":501, + "Y":74, + "Width":47, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"DEL", "tag":52, "device_id":null }, - "Region":"563, 74, 30, 30", + "X":563, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"END", "tag":53, "device_id":null }, - "Region":"600, 74, 30, 30", + "X":600, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"PAGE\r\nDOWN", "tag":54, "device_id":null }, - "Region":"637, 74, 30, 30", + "X":637, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"7", "tag":55, "device_id":null }, - "Region":"682, 74, 30, 30", + "X":682, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"8", "tag":56, "device_id":null }, - "Region":"719, 74, 30, 30", + "X":719, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"9", "tag":57, "device_id":null }, - "Region":"756, 74, 30, 30", + "X":756, + "Y":74, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"+", "tag":58, "device_id":null }, - "Region":"793, 74, 30, 67", + "X":793, + "Y":74, + "Width":30, + "Height":67, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"CAPS\r\nLOCK", "tag":59, "device_id":null }, - "Region":"0, 111, 60, 30", + "X":0, + "Y":111, + "Width":60, + "Height":30, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"A", "tag":60, "device_id":null }, - "Region":"67, 111, 30, 30", + "X":67, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"S", "tag":61, "device_id":null }, - "Region":"104, 111, 30, 30", + "X":104, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"D", "tag":62, "device_id":null }, - "Region":"141, 111, 30, 30", + "X":141, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"F", "tag":63, "device_id":null }, - "Region":"178, 111, 30, 30", + "X":178, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"G", "tag":64, "device_id":null }, - "Region":"215, 111, 30, 30", + "X":215, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"H", "tag":65, "device_id":null }, - "Region":"252, 111, 30, 30", + "X":252, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"J", "tag":66, "device_id":null }, - "Region":"289, 111, 30, 30", + "X":289, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"K", "tag":67, "device_id":null }, - "Region":"326, 111, 30, 30", + "X":326, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"L", "tag":68, "device_id":null }, - "Region":"363, 111, 30, 30", + "X":363, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":":", "tag":69, "device_id":null }, - "Region":"400, 111, 30, 30", + "X":400, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"\"", "tag":70, "device_id":null }, - "Region":"437, 111, 30, 30", + "X":437, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"ENTER", "tag":72, "device_id":null }, - "Region":"474, 111, 74, 30", + "X":474, + "Y":111, + "Width":74, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"4", "tag":73, "device_id":null }, - "Region":"681, 111, 30, 30", + "X":681, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"5", "tag":74, "device_id":null }, - "Region":"718, 111, 30, 30", + "X":718, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"6", "tag":75, "device_id":null }, - "Region":"755, 111, 30, 30", + "X":755, + "Y":111, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"SHIFT", "tag":76, "device_id":null }, - "Region":"0, 148, 78, 30", + "X":0, + "Y":148, + "Width":78, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"Z", "tag":78, "device_id":null }, - "Region":"85, 148, 30, 30", + "X":85, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"X", "tag":79, "device_id":null }, - "Region":"122, 148, 30, 30", + "X":122, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"C", "tag":80, "device_id":null }, - "Region":"159, 148, 30, 30", + "X":159, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"V", "tag":81, "device_id":null }, - "Region":"196, 148, 30, 30", + "X":196, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"B", "tag":82, "device_id":null }, - "Region":"233, 148, 30, 30", + "X":233, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"N", "tag":83, "device_id":null }, - "Region":"270, 148, 30, 30", + "X":270, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"M", "tag":84, "device_id":null }, - "Region":"307, 148, 30, 30", + "X":307, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"<", "tag":85, "device_id":null }, - "Region":"344, 148, 30, 30", + "X":344, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":">", "tag":86, "device_id":null }, - "Region":"381, 148, 30, 30", + "X":381, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"?", "tag":87, "device_id":null }, - "Region":"418, 148, 30, 30", + "X":418, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"SHIFT", "tag":88, "device_id":null }, - "Region":"455, 148, 93, 30", + "X":455, + "Y":148, + "Width":93, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"↑", "tag":89, "device_id":null }, - "Region":"600, 148, 30, 30", + "X":600, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"1", "tag":90, "device_id":null }, - "Region":"681, 148, 30, 30", + "X":681, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"2", "tag":91, "device_id":null }, - "Region":"718, 148, 30, 30", + "X":718, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"3", "tag":92, "device_id":null }, - "Region":"755, 148, 30, 30", + "X":755, + "Y":148, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"ENTER", "tag":93, "device_id":null }, - "Region":"792, 148, 30, 67", + "X":792, + "Y":148, + "Width":30, + "Height":67, "Image":"", "FontSize":9.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"CTRL", "tag":94, "device_id":null }, - "Region":"0, 185, 51, 30", + "X":0, + "Y":185, + "Width":51, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"WIN", "tag":95, "device_id":null }, - "Region":"56, 185, 39, 30", + "X":56, + "Y":185, + "Width":39, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"ALT", "tag":96, "device_id":null }, - "Region":"100, 185, 42, 30", + "X":100, + "Y":185, + "Width":42, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"SPACE", "tag":97, "device_id":null }, - "Region":"149, 185, 208, 30", + "X":149, + "Y":185, + "Width":208, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"ALT", "tag":98, "device_id":null }, - "Region":"362, 185, 41, 30", + "X":362, + "Y":185, + "Width":41, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"WIN", "tag":99, "device_id":null }, - "Region":"408, 185, 41, 30", + "X":408, + "Y":185, + "Width":41, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"APP", "tag":100, "device_id":null }, - "Region":"454, 185, 41, 30", + "X":454, + "Y":185, + "Width":41, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"CTRL", "tag":101, "device_id":null }, - "Region":"500, 185, 48, 30", + "X":500, + "Y":185, + "Width":48, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"←", "tag":102, "device_id":null }, - "Region":"563, 185, 30, 30", + "X":563, + "Y":185, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"↓", "tag":103, "device_id":null }, - "Region":"600, 185, 30, 30", + "X":600, + "Y":185, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"→", "tag":104, "device_id":null }, - "Region":"637, 185, 30, 30", + "X":637, + "Y":185, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":"0", "tag":105, "device_id":null }, - "Region":"681, 185, 67, 30", + "X":681, + "Y":185, + "Width":67, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true }, - { - "Key":{ + { + "Key":{ "visual_name":".", "tag":106, "device_id":null }, - "Region":"755, 185, 30, 30", + "X":755, + "Y":185, + "Width":30, + "Height":30, "Image":"", "FontSize":12.0, "Enabled":true diff --git a/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs b/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs index a25cd1c34..dd898cddb 100755 --- a/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/CoolerMaster/CoolerMasterDevice.cs @@ -543,6 +543,12 @@ class CoolerMasterDevice : Device //private CoolerMasterSDK.KEY_COLOR[,] previous_key_colors = new CoolerMasterSDK.KEY_COLOR[CoolerMasterSDK.MAX_LED_ROW, CoolerMasterSDK.MAX_LED_COLUMN]; //private Color previous_peripheral_Color = Color.Black; + public static Devices.DeviceKeys[] possible_peripheral_keys = { + Devices.DeviceKeys.Peripheral, + Devices.DeviceKeys.Peripheral_FrontLight, + Devices.DeviceKeys.Peripheral_ScrollWheel, + Devices.DeviceKeys.Peripheral_Logo + }; public bool Initialize() { @@ -738,7 +744,7 @@ public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bo /*if (dev_key == DeviceKeys.ENTER && !Global.kbLayout.Loaded_Localization.IsANSI()) dev_key = DeviceKeys.BACKSLASH;*/ - if (Effects.possible_peripheral_keys.Contains(dev_key)) + if (possible_peripheral_keys.Contains(dev_key)) { //Temp until mice support is added continue; diff --git a/Project-Aurora/Project-Aurora/EffectsEngine/EffectLayer.cs b/Project-Aurora/Project-Aurora/EffectsEngine/EffectLayer.cs index 54706139c..01aa38847 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; @@ -584,40 +570,18 @@ private EffectLayer SetOneKey(DeviceKey key, Brush brush) { BitmapRectangle keymaping = Effects.GetBitmappingFromDeviceKey(key); - if (key.Tag == (int)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 (DeviceKey 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; } } @@ -717,8 +681,6 @@ public Bitmap GetBitmap() g.DrawImage(rhs.colormap, 0, 0); } - added.peripheral = Utils.ColorUtils.AddColors(lhs.peripheral, rhs.peripheral); - return added; } @@ -760,8 +722,6 @@ public Bitmap GetBitmap() layer.colormap.UnlockBits(srcData); - layer.peripheral = Utils.ColorUtils.MultiplyColorByScalar(layer.peripheral, value); - return layer; } diff --git a/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs b/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs index 171667ed6..8a34512a9 100755 --- a/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs +++ b/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs @@ -133,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; diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index eb8f632dc..5b3fb049d 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -778,16 +778,36 @@ Resources.resx - + + + Control_ColorizedKeycap.xaml + + + Control_ColorizedKeycapBlank.xaml + + + Control_DefaultKeycap.xaml + + + Control_DefaultKeycapBackglow.xaml + + + Control_DefaultKeycapBackglowOnly.xaml + + + Control_GhostKeycap.xaml + + + Window_DeviceConfig.xaml - + Control_DeviceLayout.xaml - + Control_DeviceLayoutPresenter.xaml - + Control_Keycap.xaml @@ -1225,7 +1245,7 @@ Control_LayerControlPresenter.xaml - + @@ -1923,19 +1943,47 @@ Designer MSBuild:Compile - + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + Designer MSBuild:Compile - + Designer MSBuild:Compile - + Designer MSBuild:Compile - + MSBuild:Compile Designer diff --git a/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml.cs index 3b8ee9022..8eedf8134 100755 --- a/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml.cs @@ -600,6 +600,7 @@ private void ComboBox_virtualkeyboard_keycap_type_SelectionChanged(object sender if (IsLoaded) { Global.Configuration.virtualkeyboard_keycap_type = (KeycapType)Enum.Parse(typeof(KeycapType), this.ComboBox_virtualkeyboard_keycap_type.SelectedItem.ToString()); + Global.devicesLayout.Load(); ConfigManager.Save(Global.Configuration); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 17582f9da..0f6be5610 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -1,7 +1,8 @@ -using Aurora.Settings.Keycaps; +using Aurora.Settings.DeviceLayoutViewer; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; using System.Text; @@ -78,36 +79,112 @@ public DeviceKey() Tag = -1; DeviceId = null; } + public DeviceKey(int key) + { + Tag = key; + DeviceId = null; + VisualName = ((Devices.DeviceKeys)key).ToString(); + } public DeviceKey(Devices.DeviceKeys key, int? deviceId = null, string visualName = null) { Tag = (int)key; DeviceId = deviceId; - VisualName = visualName; + if (visualName != null) + VisualName = visualName; + else + VisualName = key.ToString(); } public static implicit operator DeviceKey(Devices.DeviceKeys k) => new DeviceKey(k); + public static implicit operator DeviceKey(Int64 k) => new DeviceKey((int)k); + } - public class DeviceKeyConfiguration + public class DeviceKeyConfiguration : INotifyPropertyChanged { - public DeviceKey Key = null; - public System.Drawing.Rectangle Region = new System.Drawing.Rectangle(0, 0, 0, 0); - public string Image = ""; + public DeviceKey Key = Devices.DeviceKeys.NONE; + private int _x; + public int X + { + get { return _x; } + set + { + _x = value; + OnPropertyChanged(nameof(X)); + } + } + private int _y; + public int Y + { + get { return _y; } + set + { + _y = value; + OnPropertyChanged(nameof(Y)); + } + } + private int _width; + public int Width + { + get { return _width; } + set + { + _width = value; + OnPropertyChanged(nameof(Width)); + } + } + private int _height; + public int Height + { + get { return _height; } + set + { + _height = value; + OnPropertyChanged(nameof(Height)); + } + } + private string _image = ""; + public string Image + { + get { return _image; } + set + { + _image = value; + OnPropertyChanged(nameof(Image)); + OnPropertyChanged(nameof(IsImage)); + } + } + public bool IsImage => !String.IsNullOrWhiteSpace(Image); public double? FontSize; public bool? Enabled = true; + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + [JsonIgnore] - public int Tag => Key.Tag; + public int Tag + { + get { return Key.Tag; } + set + { + Key.Tag = value; + OnPropertyChanged(nameof(Tag)); + } + } public DeviceKeyConfiguration() { } public DeviceKeyConfiguration(KeyboardKey key, int? deviceId) { Key = new DeviceKey(key.tag, deviceId, key.visualName); - if (key.width != null) Region.Width = (int)key.width; - if (key.height != null) Region.Height = (int)key.height; + if (key.width != null) Width = (int)key.width; + if (key.height != null) Height = (int)key.height; if (key.font_size != null) FontSize = key.font_size; - if (key.margin_left != null) Region.X = (int)key.margin_left; - if (key.margin_top != null) Region.Y = (int)key.margin_top; + if (key.margin_left != null) X = (int)key.margin_left; + if (key.margin_top != null) Y = (int)key.margin_top; if (key.enabled != null) Enabled = key.enabled; if (key.image != null) Image = key.image; } @@ -119,11 +196,11 @@ public void UpdateFromOtherKey(KeyboardKey key) if (key.visualName != null) Key.VisualName = key.visualName; if ((int)key.tag != -1) Key.Tag = (int)key.tag; - if (key.width != null) Region.Width = (int)key.width; - if (key.height != null) Region.Height = (int)key.height; + if (key.width != null) Width = (int)key.width; + if (key.height != null) Height = (int)key.height; if (key.font_size != null) FontSize = key.font_size; - if (key.margin_left != null) Region.X = (int)key.margin_left; - if (key.margin_top != null) Region.Y = (int)key.margin_top; + if (key.margin_left != null) X = (int)key.margin_left; + if (key.margin_top != null) Y = (int)key.margin_top; if (key.enabled != null) Enabled = key.enabled; if (key.image != null) Image = key.image; } @@ -133,13 +210,10 @@ public void UpdateFromOtherKey(DeviceKeyConfiguration key) if (key.Key.VisualName != null) Key.VisualName = key.Key.VisualName; if ((int)key.Key.Tag != -1) Key.Tag = (int)key.Key.Tag; - if (key.Region != null) - { - Region.Width = (int)key.Region.Width; - Region.Height = (int)key.Region.Height; - Region.X = (int)key.Region.X; - Region.Y = (int)key.Region.Y; - } + X = key.X; + Y = key.Y; + Height = key.Height; + Width = key.Width; if (key.FontSize != null) FontSize = key.FontSize; if (key.Enabled != null) Enabled = key.Enabled; if (key.Image != null) Image = key.Image; @@ -147,8 +221,8 @@ public void UpdateFromOtherKey(DeviceKeyConfiguration key) public static bool operator ==(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) { const int epsilon = 3; - return key1.Tag == key2.Tag && key1.Image == key2.Image && key1.Enabled == key2.Enabled && key1.FontSize == key2.FontSize && key1.Region.Width == key2.Region.Width && key1.Region.Height == key2.Region.Height && - key1.Region.X > key2.Region.X - epsilon && key1.Region.X < key2.Region.X + epsilon && key1.Region.Y > key2.Region.Y - epsilon && key1.Region.Y < key2.Region.Y + epsilon; + return key1.Tag == key2.Tag && key1.Image == key2.Image && key1.Enabled == key2.Enabled && key1.FontSize == key2.FontSize && key1.Width == key2.Width && key1.Height == key2.Height && + key1.X > key2.X - epsilon && key1.X < key2.X + epsilon && key1.Y > key2.Y - epsilon && key1.Y < key2.Y + epsilon; } public static bool operator !=(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) { @@ -173,6 +247,14 @@ public class VirtualKeyboardConfiguration public string[] included_features = new string[] { }; } + public class KeyboardLayout + { + [JsonProperty("key_conversion")] + public Dictionary KeyConversion = null; + + [JsonProperty("keys")] + public KeyboardKey[] Keys = null; + } public class DeviceLayout { @@ -238,26 +320,22 @@ public List LoadLayout() Keys = keyboard.Keys.ToDictionary(k => k.Tag, k => k); Keys.Values.ToList().ForEach(k => k.Key.DeviceId = Config.Id); - /*Region.Width = keyboard.Width; - Region.Height = keyboard.Height;*/ } - /* - var fileName = "Plain Keyboard\\layout." + "ansi" + ".json"; + + /*var fileName = "Plain Keyboard\\layout." + "ansi" + ".json"; var layoutPath = Path.Combine(layoutsPath, "Keyboard", fileName); - string content = File.ReadAllText(layoutPath, Encoding.UTF8); - KeyboardLayout keyboard = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - - LoadFromKeys(keyboard.Keys.ToList()); + string keyboardContent = File.ReadAllText(layoutPath, Encoding.UTF8); + KeyboardLayout keyboard = JsonConvert.DeserializeObject(keyboardContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + LoadFromKeys(keyboard.Keys); NewKeyboardLayout saved = new NewKeyboardLayout(); - saved.KeyConversion = keyboard.KeyConversion; - saved.Keys = Keys.ToArray(); - content = JsonConvert.SerializeObject(saved); + saved.Keys = Keys.Values.ToArray(); + keyboardContent = JsonConvert.SerializeObject(saved); fileName = "Plain Keyboard\\" + "ansi" + "_layout.json"; - File.WriteAllText(Path.Combine(layoutsPath, "Keyboard", fileName), content, Encoding.UTF8);*/ + File.WriteAllText(Path.Combine(layoutsPath, "Keyboard", fileName), keyboardContent, Encoding.UTF8);*/ try { @@ -437,26 +515,63 @@ protected void NormalizeKeys() foreach (var key in Keys.Values) { - if (key.Region.X < x_correction) - x_correction = key.Region.X; + if (key.X < x_correction) + x_correction = key.X; - if (key.Region.Y < y_correction) - y_correction = key.Region.Y; + if (key.Y < y_correction) + y_correction = key.Y; } foreach (var key in Keys.Values) { - key.Region.Y -= y_correction; - key.Region.X -= x_correction; + key.Y -= y_correction; + key.X -= x_correction; - if (key.Region.Width + key.Region.X > layout_width) - layout_width = key.Region.Width + key.Region.X; + if (key.Width + key.X > layout_width) + layout_width = key.Width + key.X; - if (key.Region.Height + key.Region.Y > layout_height) - layout_height = key.Region.Height + key.Region.Y; + if (key.Height + key.Y > layout_height) + layout_height = key.Height + key.Y; } Region.Width = layout_width; Region.Height = layout_height; } + private void LoadFromKeys(KeyboardKey[] JsonKeys) + { + double layout_height = 0; + double layout_width = 0; + double current_height = 0; + double current_width = 0; + + foreach (var key in JsonKeys) + { + + if (key.width + key.margin_left > 0) + current_width += key.width.Value + key.margin_left.Value; + + if (key.margin_top > 0) + current_height += key.margin_top.Value; + + key.margin_left = current_width - key.width.Value; + key.margin_top = current_height + key.margin_top.Value; + + if (layout_width < current_width) + layout_width = current_width; + + if (key.line_break ?? false) + { + current_height += 37; + current_width = 0; + } + + if (layout_height < current_height) + layout_height = current_height; + + Keys.Add((int)key.tag ,new DeviceKeyConfiguration(key, null)); + } + + Region.Width = (int)layout_width; + Region.Height = (int)layout_height; + } } public class KeycapGroupConfiguration { diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml similarity index 86% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml rename to Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml index 5790cf10f..dd8fe794e 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml @@ -1,9 +1,9 @@ - diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs similarity index 79% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs rename to Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index f56ae3952..591427390 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -13,7 +13,7 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; -namespace Aurora.Settings.Keycaps +namespace Aurora.Settings.DeviceLayoutViewer { /// /// Interaction logic for Control_DeviceLayout.xaml @@ -24,7 +24,6 @@ public partial class Control_DeviceLayout : UserControl public event LayoutUpdatedEventHandler DeviceLayoutUpdated; public Dictionary KeyboardMap = new Dictionary(new DeviceKey.EqualityComparer()); - private Point BaseOffset = new Point(0,0); public static readonly DependencyProperty DeviceConfigProperty = DependencyProperty.Register("DeviceConfig", typeof(DeviceConfig), typeof(DeviceConfig)); @@ -38,9 +37,6 @@ public DeviceConfig DeviceConfig } } - - private string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); - public Control_DeviceLayout() { InitializeComponent(); @@ -100,44 +96,27 @@ public void CreateUserControl(Canvas deviceControl, bool abstractKeycaps = false deviceControl.Children.Clear(); if (Keys.Count > 0) { - string images_path = System.IO.Path.Combine(layoutsPath, "Images"); int layout_height = 0; int layout_width = 0; foreach (DeviceKeyConfiguration key in Keys) { - string image_path = ""; - - if (!String.IsNullOrWhiteSpace(key.Image)) - image_path = System.IO.Path.Combine(images_path, key.Image); - Control_Keycap keycap = new Control_Keycap(key, image_path); + Control_Keycap keycap = new Control_Keycap(key); - if (key.Tag == (int)Devices.DeviceKeys.ESC) - { - //var escKey = KeyboardMap[Devices.DeviceKeys.ESC]; - BaseOffset.X = key.Region.X; - BaseOffset.Y = key.Region.Y; - - } - keycap.RenderTransform = new TranslateTransform(key.Region.X, key.Region.Y); //keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); deviceControl.Children.Add(keycap); - if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag) && keycap is IKeycap && !abstractKeycaps) + if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag) && !abstractKeycaps) KeyboardMap.Add(key.Key, keycap); - if (key.Region.Width + key.Region.X > layout_width) - layout_width = key.Region.Width + key.Region.X; + if (key.Width + key.X > layout_width) + layout_width = key.Width + key.X; - if (key.Region.Height + key.Region.Y > layout_height) - layout_height = key.Region.Height + key.Region.Y; + if (key.Height + key.Y > layout_height) + layout_height = key.Height + key.Y; } - foreach (Control_Keycap k in deviceControl.Children) - { - k.Offset = BaseOffset; - } //Update size deviceControl.Width = layout_width; deviceControl.Height = layout_height; @@ -187,10 +166,10 @@ public Dictionary GetBitmap() foreach (var key in Keys) { - double width = key.Region.Width; - double height = key.Region.Height; - double x_offset = DeviceConfig.Offset.X + key.Region.X; - double y_offset = DeviceConfig.Offset.Y + key.Region.Y; + double width = key.Width; + double height = key.Height; + double x_offset = DeviceConfig.Offset.X + key.X; + double y_offset = DeviceConfig.Offset.Y + key.Y; bitmapMap[key.Key] = new BitmapRectangle(PixelToByte(x_offset), PixelToByte(y_offset), PixelToByte(width), PixelToByte(height)); diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml similarity index 91% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml rename to Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml index 32525b5aa..571405f9a 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_DeviceLayoutPresenter.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml @@ -1,9 +1,9 @@ - /// Interaction logic for Control_DeviceLayoutPresenter.xaml @@ -160,7 +160,10 @@ public void CalculateBitmap() { Global.effengine.SetCanvasSize(Control_DeviceLayout.PixelToByte(layouts_grid.Width) + 1, Control_DeviceLayout.PixelToByte(layouts_grid.Height) + 1); var bitmap = new Dictionary(new DeviceKey.EqualityComparer()); - DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => bitmap.Add(x.Key, x.Value))); + DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => { + if (!bitmap.ContainsKey(x.Key)) + bitmap.Add(x.Key, x.Value); + })); Global.effengine.SetBitmapping(bitmap); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml new file mode 100644 index 000000000..d1b52b4a3 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs new file mode 100644 index 000000000..931ebe503 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs @@ -0,0 +1,184 @@ +using Aurora.Devices; +using Aurora.Settings.DeviceLayoutViewer.Keycaps; +using Aurora.Utils; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer +{ + public class Control_KeycapModel : ViewModelBase + { + + private KeycapViewer _keycap; + public KeycapViewer Keycap + { + get { return _keycap; } + set + { + _keycap = value; + this.OnPropertyChanged(nameof(Keycap)); + //keycap.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); + //OnPropertyChanged(nameof(Config)); + } + } + } + + /// + /// Interaction logic for Control_Keycap.xaml + /// + public partial class Control_Keycap : UserControl + { + + private void PositionChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "X" || e.PropertyName == "Y") + { + RenderTransform = new TranslateTransform((sender as DeviceKeyConfiguration).X, (sender as DeviceKeyConfiguration).Y); + } + else if (e.PropertyName == "Image") + { + Keycap = GetKeycapViewer(sender as DeviceKeyConfiguration); + } + } + private KeycapViewer _keycap; + public KeycapViewer Keycap + { + get { return _keycap; } + set + { + + //this.RemoveLogicalChild(_keycap); + _keycap = value; + this.Content = _keycap; + RenderTransform = new TranslateTransform(_keycap.Config.X, _keycap.Config.Y); + _keycap.Config.PropertyChanged += PositionChanged; + //this.AddLogicalChild(_keycap); + //AddChild(_keycap); + //keycap = _keycap; + //keycap.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); + //OnPropertyChanged(nameof(Config)); + } + } + + public Control_Keycap() + { + InitializeComponent(); + DataContext = Keycap; + } + private KeycapViewer GetKeycapViewer(DeviceKeyConfiguration conf) + { + if (!string.IsNullOrWhiteSpace(conf.Image)) + return new Control_ImageKeycap(conf); + //Ghost keycap is used for abstract representation of keys + /*if (abstractKeycaps) + return new Control_GhostKeycap(conf, image_path); + else*/ + { + switch (Global.Configuration.virtualkeyboard_keycap_type) + { + case KeycapType.Default_backglow: + return new Control_DefaultKeycapBackglow(conf); + case KeycapType.Default_backglow_only: + return new Control_DefaultKeycapBackglowOnly(conf); + case KeycapType.Colorized: + return new Control_ColorizedKeycap(conf); + case KeycapType.Colorized_blank: + return new Control_ColorizedKeycapBlank(conf); + default: + return new Control_DefaultKeycap(conf); + } + } + } + + public Control_Keycap(DeviceKeyConfiguration key) + { + + InitializeComponent(); + Keycap = GetKeycapViewer(key); + DataContext = Keycap; + + } + private string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + + /*private void LoadImage() + { + if (string.IsNullOrWhiteSpace(Config.Image)) + { + keyCap.Visibility = Visibility.Visible; + keyCap.Text = Config.Key.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (Config.FontSize != null) + keyCap.FontSize = Config.FontSize.Value; + } + else + { + string image_path = System.IO.Path.Combine(layoutsPath, "Images", Config.Image); + + keyCap.Visibility = Visibility.Hidden; + + if (System.IO.File.Exists(image_path)) + { + var memStream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(image_path)); + BitmapImage image = new BitmapImage(); + image.BeginInit(); + image.StreamSource = memStream; + image.EndInit(); + + grid_backglow.Visibility = Visibility.Hidden; + if (Config.Tag == -1) + { + keyBorder.Background = new ImageBrush(image); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 0, 0, 0)); + keyBorder.OpacityMask = new ImageBrush(image); + } + + IsImage = true; + } + } + + }*/ + + public DeviceKey GetKey() + { + return Keycap.Config.Key; + } + + + public void SetColor(Color key_color) + { + Keycap.SetColor(key_color, Global.key_recorder.HasRecorded(GetKey())); + } + + + + internal DeviceKeyConfiguration GetConfiguration() + { + /*var offset = this.TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement) - Offset; + const int epsilon = 3; + /*if (Config.X < offset.X - epsilon || Config.X > offset.X + epsilon || Config.Y < offset.Y - epsilon || Config.Y > offset.Y + epsilon) + { + Config.X = (int)offset.X;// - (int)Offset.X; + Config.Y = (int)offset.Y;// - (int)Offset.Y; + }*/ + + return Keycap.Config; + } + + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml new file mode 100644 index 000000000..d18c21ad4 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs new file mode 100644 index 000000000..b23923dc1 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs @@ -0,0 +1,81 @@ +using Aurora.Devices; +using Aurora.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_ColorizedKeycap.xaml + /// + public partial class Control_ColorizedKeycap : KeycapViewer + { + private Color? current_color = null; + + public Control_ColorizedKeycap() + { + InitializeComponent(); + } + + public Control_ColorizedKeycap(DeviceKeyConfiguration key) : base(key) + { + InitializeComponent(); + + keyBorder.IsEnabled = key.Enabled.Value; + + if (!key.Enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + + + keyCap.Visibility = Visibility.Visible; + keyCap.Text = Config.Key.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (Config.FontSize != null) + keyCap.FontSize = Config.FontSize.Value; + + } + + public override void SetColor(Color key_color, bool isSelected) + { + if (!key_color.Equals(current_color)) + { + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + keyBorder.BorderBrush = new SolidColorBrush(key_color); + + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + else + { + if (keyBorder.IsEnabled) + { + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + } + UpdateText(); + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml new file mode 100644 index 000000000..480a54ddb --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs new file mode 100644 index 000000000..265227089 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs @@ -0,0 +1,75 @@ +using Aurora.Devices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_ColorizedKeycapBlank.xaml + /// + public partial class Control_ColorizedKeycapBlank : KeycapViewer + { + private Color current_color = Color.FromArgb(0, 0, 0, 0); + + public Control_ColorizedKeycapBlank() + { + InitializeComponent(); + } + + public Control_ColorizedKeycapBlank(DeviceKeyConfiguration key) : base(key) + { + InitializeComponent(); + + keyBorder.IsEnabled = key.Enabled.Value; + + if (!key.Enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + + keyCap.Text = Config.Key.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (Config.FontSize != null) + keyCap.FontSize = Config.FontSize.Value; + } + + public override void SetColor(Color key_color, bool isSelected) + { + if (!current_color.Equals(key_color)) + { + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + keyBorder.BorderBrush = new SolidColorBrush(key_color); + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + else + { + if (keyBorder.IsEnabled) + { + + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + } + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml new file mode 100644 index 000000000..29c1055d8 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs new file mode 100644 index 000000000..b2ac2f571 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs @@ -0,0 +1,85 @@ +using Aurora.Devices; +using Aurora.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_DefaultKeycap.xaml + /// + public partial class Control_DefaultKeycap : KeycapViewer + { + private Color current_color = Color.FromArgb(0, 0, 0, 0); + + public Control_DefaultKeycap() + { + InitializeComponent(); + } + + public Control_DefaultKeycap(DeviceKeyConfiguration key) : base(key) + { + InitializeComponent(); + + + keyBorder.IsEnabled = key.Enabled.Value; + + if (!key.Enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + keyCap.Visibility = Visibility.Visible; + keyCap.Text = Config.Key.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (Config.FontSize != null) + keyCap.FontSize = Config.FontSize.Value; + } + + public override void SetColor(Color key_color, bool isSelected) + { + if (!current_color.Equals(key_color)) + { + + if (string.IsNullOrWhiteSpace(keyCap.Text)) + keyBorder.BorderBrush = new SolidColorBrush(key_color); + else + keyCap.Foreground = new SolidColorBrush(key_color); + + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + else + { + if (keyBorder.IsEnabled) + { + if (string.IsNullOrWhiteSpace(keyCap.Text)) + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + else + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + } + UpdateText(); + } + + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml similarity index 63% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml rename to Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml index a96c9a4e2..5b358cc84 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml @@ -1,20 +1,18 @@ - + xmlns:local="clr-namespace:Aurora.Settings.DeviceLayoutViewer.Keycaps" + mc:Ignorable="d"> - + - \ No newline at end of file + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs new file mode 100644 index 000000000..e939a2423 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs @@ -0,0 +1,78 @@ +using Aurora.Devices; +using Aurora.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_DefaultKeycapBackglow.xaml + /// + public partial class Control_DefaultKeycapBackglow : KeycapViewer + { + private Color current_color = Color.FromArgb(0, 0, 0, 0); + + public Control_DefaultKeycapBackglow() + { + InitializeComponent(); + } + + public Control_DefaultKeycapBackglow(DeviceKeyConfiguration key) : base(key) + { + InitializeComponent(); + + keyBorder.IsEnabled = key.Enabled.Value; + + if (!key.Enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + + keyCap.Visibility = Visibility.Visible; + keyCap.Text = Config.Key.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (Config.FontSize != null) + keyCap.FontSize = Config.FontSize.Value; + } + + public override void SetColor(Color key_color, bool isSelected) + { + if (!current_color.Equals(key_color)) + { + keyCap.Foreground = new SolidColorBrush(key_color); + grid_backglow.Background = new SolidColorBrush(key_color); + + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + else + { + if (keyBorder.IsEnabled) + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + } + UpdateText(); + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml new file mode 100644 index 000000000..8a8547bee --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs new file mode 100644 index 000000000..4622a779d --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs @@ -0,0 +1,79 @@ +using Aurora.Devices; +using Aurora.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_DefaultKeycapBackglowOnly.xaml + /// + public partial class Control_DefaultKeycapBackglowOnly : KeycapViewer + { + private Color current_color = Color.FromArgb(0, 0, 0, 0); + + public Control_DefaultKeycapBackglowOnly() + { + InitializeComponent(); + } + + public Control_DefaultKeycapBackglowOnly(DeviceKeyConfiguration key) : base(key) + { + InitializeComponent(); + + + keyBorder.IsEnabled = key.Enabled.Value; + + if (!key.Enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + + keyCap.Text = Config.Key.VisualName; + //keyCap.Tag = associatedKey.Tag; + if (Config.FontSize != null) + keyCap.FontSize = Config.FontSize.Value; + + } + public override void SetColor(Color key_color, bool isSelected) + { + if (!current_color.Equals(key_color)) + { + grid_backglow.Background = new SolidColorBrush(key_color); + + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + else + { + if (keyBorder.IsEnabled) + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + } + UpdateText(); + } + + + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml new file mode 100644 index 000000000..86812e304 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs new file mode 100644 index 000000000..033e5945b --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs @@ -0,0 +1,120 @@ +using Aurora.Devices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_GhostKeycap.xaml + /// + public partial class Control_GhostKeycap : KeycapViewer + { + private Color current_color = Color.FromArgb(0, 0, 0, 0); + private Devices.DeviceKeys associatedKey = DeviceKeys.NONE; + private bool isImage = false; + + public Control_GhostKeycap() + { + InitializeComponent(); + } + + public Control_GhostKeycap(KeyboardKey key, string image_path) + { + InitializeComponent(); + + associatedKey = key.tag; + + this.Width = key.width.Value; + this.Height = key.height.Value; + + //Keycap adjustments + if (string.IsNullOrWhiteSpace(key.image)) + keyBorder.BorderThickness = new Thickness(1.5); + else + keyBorder.BorderThickness = new Thickness(0.0); + keyBorder.IsEnabled = key.enabled.Value; + + if (!key.enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + + if (string.IsNullOrWhiteSpace(key.image)) + { + keyCap.Text = key.visualName; + keyCap.Tag = key.tag; + if (key.font_size != null) + keyCap.FontSize = key.font_size.Value; + } + else + { + keyCap.Visibility = System.Windows.Visibility.Hidden; + + if (System.IO.File.Exists(image_path)) + { + var memStream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(image_path)); + BitmapImage image = new BitmapImage(); + image.BeginInit(); + image.StreamSource = memStream; + image.EndInit(); + + if (key.tag == DeviceKeys.NONE) + keyBorder.Background = new ImageBrush(image); + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 255, 255)); + keyBorder.OpacityMask = new ImageBrush(image); + } + + isImage = true; + } + } + } + + public override void SetColor(Color key_color, bool isSelected) + { + key_color = Color.FromArgb(255, 255, 255, 255); //No colors allowed! + + if (!current_color.Equals(key_color)) + { + if (isImage) + { + if (associatedKey != DeviceKeys.NONE) + keyBorder.Background = new SolidColorBrush(key_color); + } + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + else + { + if (keyBorder.IsEnabled) + { + if (isImage) + keyBorder.Background = new SolidColorBrush(key_color); + else + keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + } + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml new file mode 100644 index 000000000..5326dc919 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml @@ -0,0 +1,11 @@ + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs new file mode 100644 index 000000000..07a725277 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs @@ -0,0 +1,83 @@ +using Aurora.Devices; +using Aurora.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + /// + /// Interaction logic for Control_ColorizedKeycap.xaml + /// + public partial class Control_ImageKeycap : KeycapViewer + { + private Color? current_color = null; + private string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + + public Control_ImageKeycap() + { + InitializeComponent(); + } + + public Control_ImageKeycap(DeviceKeyConfiguration key) : base(key) + { + InitializeComponent(); + + string image_path = System.IO.Path.Combine(layoutsPath, "Images", Config.Image); + + keyBorder.IsEnabled = key.Enabled.Value; + + if (!key.Enabled.Value) + { + ToolTipService.SetShowOnDisabled(keyBorder, true); + keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; + } + + if (System.IO.File.Exists(image_path)) + { + var memStream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(image_path)); + BitmapImage image = new BitmapImage(); + image.BeginInit(); + image.StreamSource = memStream; + image.EndInit(); + + if (key.Tag == (int)DeviceKeys.NONE) + keyBorder.Background = new ImageBrush(image); + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 0, 0, 0)); + keyBorder.OpacityMask = new ImageBrush(image); + } + + } + } + + override public void SetColor(Color key_color, bool isSelected) + { + //Static image + if (GetKey() == DeviceKeys.NONE) + return; + + if (!key_color.Equals(current_color)) + { + keyBorder.Background = new SolidColorBrush(key_color); + current_color = key_color; + } + + if (isSelected) + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs new file mode 100644 index 000000000..d5956e812 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs @@ -0,0 +1,92 @@ +using Aurora.Utils; +using System; +using System.Collections.Generic; + +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; + +namespace Aurora.Settings.DeviceLayoutViewer.Keycaps +{ + public abstract class KeycapViewer : UserControl + { + + private DeviceKeyConfiguration _config = new DeviceKeyConfiguration(); + public DeviceKeyConfiguration Config + { + get { return _config; } + set + { + _config = value; + + //OnPropertyChanged(new DependencyPropertyChangedEventArgs(oldValue)); + //_config.PropertyChanged += PositionChanged; + + //OnPropertyChanged(nameof(Config)); + } + } + public KeycapViewer() + { + } + public KeycapViewer(DeviceKeyConfiguration conf) + { + Config = conf; + } + public abstract void SetColor(Color key_color, bool isSelected); + public virtual DeviceKey GetKey() { return Config.Key; } + public void UpdateText() + { + //if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration()) + { + + //if (keyCap.Text.Length > 1) + // return; + + StringBuilder sb = new StringBuilder(2); + var scan_code = KeyUtils.GetScanCode((Devices.DeviceKeys)Config.Key.Tag); + if (scan_code == -1) + return; + /*var key = KeyUtils.GetFormsKey((KeyboardKeys)associatedKey.LedID); + var scan_code = KeyUtils.MapVirtualKeyEx((uint)key, KeyUtils.MapVirtualKeyMapTypes.MapvkVkToVsc, (IntPtr)0x8090809);*/ + + int ret = KeyUtils.GetKeyNameTextW((uint)scan_code << 16, sb, 2); + //keyCap.Text = sb.ToString().ToUpper(); + } + } + protected void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) + { + if (sender is Border) + virtualkeyboard_key_selected(GetKey()); + } + + protected void keyBorder_MouseMove(object sender, MouseEventArgs e) + { + } + + protected void virtualkeyboard_key_selected(DeviceKey key) + { + if (key.Tag != (int)Devices.DeviceKeys.NONE) + { + if (Global.key_recorder.HasRecorded(key)) + Global.key_recorder.RemoveKey(key); + else + Global.key_recorder.AddKey(key); + } + } + + protected void keyBorder_MouseLeave(object sender, MouseEventArgs e) + { + } + + protected void keyBorder_MouseEnter(object sender, MouseEventArgs e) + { + if (e.LeftButton == MouseButtonState.Pressed && sender is Border) + virtualkeyboard_key_selected(GetKey()); + + + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/ViewModelBase .cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/ViewModelBase .cs new file mode 100644 index 000000000..048857230 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/ViewModelBase .cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Aurora.Settings.DeviceLayoutViewer +{ + public abstract class ViewModelBase : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged(string propertyName) + { + this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); + } + + protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) + { + var handler = this.PropertyChanged; + if (handler != null) + { + handler(this, e); + } + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml similarity index 53% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml rename to Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml index 4233d67e7..e89a0722f 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml @@ -1,7 +1,7 @@ - - + @@ -36,6 +36,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs similarity index 74% rename from Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs rename to Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index c7281142d..2e203a2cb 100644 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; @@ -13,12 +15,12 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; -namespace Aurora.Settings.Keycaps +namespace Aurora.Settings.DeviceLayoutViewer { /// /// Interaction logic for Window_DeviceConfig.xaml /// - public partial class Window_DeviceConfig : Window + public partial class Window_DeviceConfig : Window, INotifyPropertyChanged { private DeviceConfig _config; public DeviceConfig Config @@ -32,17 +34,33 @@ public DeviceConfig Config } public bool DeleteDevice = false; private System.Windows.Point _positionInBlock; - public Control_Keycap SelectedKey; + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + private Control_Keycap _selectedKey; + public Control_Keycap SelectedKey + { + get { return _selectedKey; } + set{ + _selectedKey = value; + OnPropertyChanged(nameof(SelectedKey)); + } + } public Window_DeviceConfig(DeviceConfig config) { InitializeComponent(); Config = config; LoadDeviceType(config.Type); - this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; this.device_layout.SelectedItem = Config.SelectedLayout; if (config.SelectedKeyboardLayout != null) this.keyboard_layout.SelectedItem = Config.SelectedKeyboardLayout; + DataContext = this; } private List GetBrandsName(string dicName) { @@ -133,18 +151,20 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) } private void KeyMouseDown(object sender, MouseButtonEventArgs e) { + SelectedKey = sender as Control_Keycap; + // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) _positionInBlock = Mouse.GetPosition(sender as UIElement); // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) - (sender as UIElement).CaptureMouse(); + (sender as Control_Keycap)?.CaptureMouse(); } private void KeyMouseMove(object sender, MouseEventArgs e) { // if the mouse is captured. you are moving it. (there is your 'real' boolean) - if ((sender as UIElement).IsMouseCaptured) + if ((sender as Control_Keycap).IsMouseCaptured) { // get the parent container var container = VisualTreeHelper.GetParent(sender as UIElement) as UIElement; @@ -153,15 +173,17 @@ private void KeyMouseMove(object sender, MouseEventArgs e) var mousePosition = e.GetPosition(container); // move the usercontrol. - (sender as UIElement).RenderTransform = new TranslateTransform((int)(mousePosition.X - _positionInBlock.X), (int)(mousePosition.Y - _positionInBlock.Y)); - + (sender as Control_Keycap).Keycap.Config.X = (int)(mousePosition.X - _positionInBlock.X); + (sender as Control_Keycap).Keycap.Config.Y = (int)(mousePosition.Y - _positionInBlock.Y); + //keycap_x.Text = ((int)(mousePosition.X - _positionInBlock.X)).ToString(); + //keycap_y.Text = ((int)(mousePosition.Y - _positionInBlock.Y)).ToString(); } } private void KeyMouseUp(object sender, MouseButtonEventArgs e) { // release this control. - (sender as UIElement).ReleaseMouseCapture(); + (sender as Control_Keycap)?.ReleaseMouseCapture(); } private void LoadDeviceLayout() @@ -176,6 +198,28 @@ private void LoadDeviceLayout() } deviceLayout.UpdateLayout(); this.Width = deviceLayout.Width + 340; + this.KeyDown += OnKeyDownHandler; + } + private void OnKeyDownHandler(object sender, KeyEventArgs e) + { + if (e.Key == Key.Z && Keyboard.Modifiers == ModifierKeys.Control) + { + MessageBox.Show("CTRL + C Pressed!"); + } + else if (e.Key == Key.Z && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) + { + MessageBox.Show("CTRL + Z Pressed!"); + } + if (e.Key == Key.Up) + { + MessageBox.Show("Up Pressed!"); + } + } + + private void NumberValidationTextBox(object sender, TextCompositionEventArgs e) + { + Regex regex = new Regex("[^0-9]+"); + e.Handled = regex.IsMatch(e.Text); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs index 1abe9db6e..5e8bcdf6e 100755 --- a/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs @@ -11,9 +11,9 @@ using Aurora.Devices; using System.Drawing; using System.Windows.Media.Imaging; -using Aurora.Settings.Keycaps; using System.Windows.Threading; using System.Globalization; +using Aurora.Settings.DeviceLayoutViewer.Keycaps; namespace Aurora.Settings { @@ -285,7 +285,7 @@ public class KeyboardLayoutManager private VirtualGroup virtualKeyboardGroup; - private Dictionary _virtualKeyboardMap = new Dictionary(); + private Dictionary _virtualKeyboardMap = new Dictionary(); private bool _virtualKBInvalid = true; diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs deleted file mode 100644 index 818462e35..000000000 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/Control_Keycap.xaml.cs +++ /dev/null @@ -1,285 +0,0 @@ -using Aurora.Devices; -using Aurora.Utils; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Aurora.Settings.Keycaps -{ - /// - /// Interaction logic for Control_Keycap.xaml - /// - public partial class Control_Keycap : UserControl, IKeycap - { - private Color currentColor = Color.FromArgb(0, 0, 0, 0); - private DeviceKey AssociatedKey = DeviceKeys.NONE; - private bool IsImage = false; - public bool IsKeyMoveEnabled = false; - private System.Windows.Point _positionInBlock; - private DeviceKeyConfiguration Config; - public System.Windows.Point Offset = new System.Windows.Point(); - public Control_Keycap() - { - InitializeComponent(); - } - - public Control_Keycap(DeviceKeyConfiguration key, string image_path) - { - InitializeComponent(); - - Config = key; - AssociatedKey = key.Key; - - this.Width = key.Region.Width; - this.Height = key.Region.Height; - - //Keycap adjustments - if (string.IsNullOrWhiteSpace(key.Image)) - keyBorder.BorderThickness = new Thickness(1.5); - else - keyBorder.BorderThickness = new Thickness(0.0); - keyBorder.IsEnabled = key.Enabled.Value; - - if (!key.Enabled.Value) - { - ToolTipService.SetShowOnDisabled(keyBorder, true); - keyBorder.ToolTip = new ToolTip { Content = "Changes to this key are not supported" }; - } - - if (string.IsNullOrWhiteSpace(key.Image)) - { - keyCap.Text = AssociatedKey.VisualName; - //keyCap.Tag = associatedKey.Tag; - if (key.FontSize != null) - keyCap.FontSize = key.FontSize.Value; - } - else - { - keyCap.Visibility = System.Windows.Visibility.Hidden; - - if (System.IO.File.Exists(image_path)) - { - var memStream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(image_path)); - BitmapImage image = new BitmapImage(); - image.BeginInit(); - image.StreamSource = memStream; - image.EndInit(); - - grid_backglow.Visibility = Visibility.Hidden; - if (key.Tag == -1) - { - keyBorder.Background = new ImageBrush(image); - } - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 0, 0, 0)); - keyBorder.OpacityMask = new ImageBrush(image); - } - - IsImage = true; - } - } - - - } - - public DeviceKey GetKey() - { - return AssociatedKey; - } - - public void SetColor(Color key_color) - { - //key_color = Color.FromArgb(255, 255, 255, 255); //No colors allowed! - if (keyBorder.IsEnabled) - { - if (!IsImage) - { - switch (Global.Configuration.virtualkeyboard_keycap_type) - { - case KeycapType.Default_backglow: - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 30, 30, 30)); - keyCap.Foreground = new SolidColorBrush(key_color); - grid_backglow.Background = new SolidColorBrush(key_color); - break; - case KeycapType.Default_backglow_only: - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 30, 30, 30)); - grid_backglow.Background = new SolidColorBrush(key_color); - break; - case KeycapType.Colorized: - case KeycapType.Colorized_blank: - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); - keyBorder.BorderBrush = new SolidColorBrush(key_color); - break; - default: - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 30, 30, 30)); - if (string.IsNullOrWhiteSpace(keyCap.Text)) - keyBorder.BorderBrush = new SolidColorBrush(key_color); - else - keyCap.Foreground = new SolidColorBrush(key_color); - break; - } - - } - else - { - if (AssociatedKey.Tag != (int)DeviceKeys.NONE) - keyBorder.Background = new SolidColorBrush(key_color); - } - } - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); - keyBorder.BorderThickness = new Thickness(0); - } - - - if (Global.key_recorder.HasRecorded(AssociatedKey)) - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - if (Global.Configuration.virtualkeyboard_keycap_type == KeycapType.Colorized_blank) - { - keyCap.Text = ""; - } - else - { - UpdateText(); - } - /*else - { - if (keyBorder.IsEnabled) - { - if (isImage) - keyBorder.Background = new SolidColorBrush(key_color); - else - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); - } - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); - keyBorder.BorderThickness = new Thickness(0); - } - }*/ - - } - - private void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) - { - virtualkeyboard_key_selected(AssociatedKey); - } - - private void keyBorder_MouseMove(object sender, MouseEventArgs e) - { - } - - private void virtualkeyboard_key_selected(DeviceKey key) - { - if (key != DeviceKeys.NONE) - { - if (Global.key_recorder.HasRecorded(key)) - Global.key_recorder.RemoveKey(key); - else - Global.key_recorder.AddKey(key); - } - } - - private void keyBorder_MouseLeave(object sender, MouseEventArgs e) - { - } - - private void keyBorder_MouseEnter(object sender, MouseEventArgs e) - { - if (e.LeftButton == MouseButtonState.Pressed) - virtualkeyboard_key_selected(AssociatedKey); - } - - public void UpdateText() - { - //if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration()) - { - - //if (keyCap.Text.Length > 1) - // return; - - StringBuilder sb = new StringBuilder(2); - var scan_code = KeyUtils.GetScanCode((DeviceKeys)AssociatedKey.Tag); - if (scan_code == -1) - return; - /*var key = KeyUtils.GetFormsKey((KeyboardKeys)associatedKey.LedID); - var scan_code = KeyUtils.MapVirtualKeyEx((uint)key, KeyUtils.MapVirtualKeyMapTypes.MapvkVkToVsc, (IntPtr)0x8090809);*/ - - int ret = KeyUtils.GetKeyNameTextW((uint)scan_code << 16, sb, 2); - keyCap.Text = sb.ToString().ToUpper(); - } - } - - private void UserControl_MouseDown(object sender, MouseButtonEventArgs e) - { - if (IsKeyMoveEnabled) - { - // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) - _positionInBlock = Mouse.GetPosition(this); - - // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) - this.CaptureMouse(); - } - - } - - private void UserControl_MouseMove(object sender, MouseEventArgs e) - { - // if the mouse is captured. you are moving it. (there is your 'real' boolean) - if (this.IsMouseCaptured) - { - // get the parent container - var container = VisualTreeHelper.GetParent(this) as UIElement; - - // get the position within the container - var mousePosition = e.GetPosition(container); - - // move the usercontrol. - this.RenderTransform = new TranslateTransform(mousePosition.X - _positionInBlock.X, mousePosition.Y - _positionInBlock.Y); - - } - } - - private void UserControl_MouseUp(object sender, MouseButtonEventArgs e) - { - // release this control. - this.ReleaseMouseCapture(); - - //DeviceLayoutUpdated?.Invoke(this); - - /*if (this.RenderTransform is TranslateTransform) - { - DeviceConfig.Offset.X = (this.RenderTransform as TranslateTransform).X; - DeviceConfig.Offset.Y = (this.RenderTransform as TranslateTransform).Y; - DeviceConfig.Save(); - }*/ - //SaveLayoutPosition(TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement)); - } - - internal DeviceKeyConfiguration GetConfiguration() - { - var offset = this.TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement) - Offset; - const int epsilon = 3; - if (Config.Region.X < offset.X - epsilon || Config.Region.X > offset.X + epsilon || Config.Region.Y < offset.Y - epsilon || Config.Region.Y > offset.Y + epsilon) - { - Config.Region.X = (int)offset.X;// - (int)Offset.X; - Config.Region.Y = (int)offset.Y;// - (int)Offset.Y; - } - - return Config; - } - } -} diff --git a/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs b/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs deleted file mode 100644 index ba24840b7..000000000 --- a/Project-Aurora/Project-Aurora/Settings/Keycaps/IKeycap.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; - -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Media; - -namespace Aurora.Settings.Keycaps -{ - public interface IKeycap - { - void SetColor(Color key_color); - DeviceKey GetKey(); - } -} diff --git a/Project-Aurora/Project-Aurora/Utils/JSONUtils.cs b/Project-Aurora/Project-Aurora/Utils/JSONUtils.cs index 5a2836f8a..066e8ce8e 100755 --- a/Project-Aurora/Project-Aurora/Utils/JSONUtils.cs +++ b/Project-Aurora/Project-Aurora/Utils/JSONUtils.cs @@ -22,6 +22,8 @@ public override Type BindToType(string assemblyName, string typeName) { switch (typeName) { + case "System.Collections.Generic.List`1[[Aurora.Devices.DeviceKeys, Aurora]]": + return typeof(List); case "System.Collections.Generic.List`1[[System.Drawing.Color, System.Drawing]]": return typeof(List); case "System.Collections.Generic.SortedDictionary`2[[System.Single, mscorlib],[System.Drawing.Color, System.Drawing]]": From 026602c491cf4844f4439bbdd8b0a526c41b3f28 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 6 May 2020 11:18:26 +0200 Subject: [PATCH 06/42] Add control to edit DeviceKeycapConf Save edited layouts --- .../Keyboard/Plain Keyboard/iso_layout.json | 1477 +++++++++------ .../Keyboard/Plain Keyboard/jpn_layout.json | 1626 ++++++++++++++++ .../Keyboard/Plain Keyboard/layout.abnt2.json | 1597 ---------------- .../Keyboard/Plain Keyboard/layout.ansi.json | 1564 ---------------- .../Keyboard/Plain Keyboard/layout.de.json | 1591 ---------------- .../Plain Keyboard/layout.dvorak.json | 1599 ---------------- .../Plain Keyboard/layout.dvorak_int.json | 1614 ---------------- .../Keyboard/Plain Keyboard/layout.es.json | 1589 ---------------- .../Keyboard/Plain Keyboard/layout.fr.json | 1597 ---------------- .../Keyboard/Plain Keyboard/layout.hu.json | 1588 ---------------- .../Keyboard/Plain Keyboard/layout.intl.json | 1582 ---------------- .../Keyboard/Plain Keyboard/layout.iso.json | 1581 ---------------- .../Keyboard/Plain Keyboard/layout.it.json | 1589 ---------------- .../Keyboard/Plain Keyboard/layout.jpn.json | 1630 ----------------- .../Keyboard/Plain Keyboard/layout.la.json | 1589 ---------------- .../Plain Keyboard/layout.nordic.json | 1589 ---------------- .../Keyboard/Plain Keyboard/layout.ru.json | 1567 ---------------- .../Keyboard/Plain Keyboard/layout.swiss.json | 1592 ---------------- .../Keyboard/Plain Keyboard/layout.tr.json | 1587 ---------------- .../Keyboard/Plain Keyboard/layout.uk.json | 1585 ---------------- .../Keyboard/Plain Keyboard/layout.us.json | 1564 ---------------- .../Keyboard/corsair_k95_platinum.json | 489 ++++- .../Keyboard/generic_laptop.json | 685 +++---- .../Keyboard/generic_laptop_numpad.json | 511 ++++-- .../Keyboard/masterkeys_pro_m.json | 313 ++-- .../DeviceLayouts/Keyboard/razer_blade.json | 686 +++---- .../DeviceLayouts/Mouse/Asus - Pugio.json | 122 +- .../DeviceLayouts/Mouse/Clevo - Touchpad.json | 40 +- .../DeviceLayouts/Mouse/Corsair - Katar.json | 66 +- .../DeviceLayouts/Mouse/Corsair - M65.json | 94 +- .../Mouse/Generic Peripheral.json | 61 +- .../DeviceLayouts/Mouse/Logitech - G502.json | 66 +- .../DeviceLayouts/Mouse/Logitech - G900.json | 66 +- .../Mouse/RazerICorsair Mousepad + Mouse.json | 435 +++-- ...elSeries - QcK Prism Mousepad + Mouse.json | 463 +++-- ...eelSeries - Rival 300 HP OMEN Edition.json | 94 +- .../Mouse/SteelSeries - Rival 300.json | 94 +- ...eries - Two-zone QcK Mousepad + Mouse.json | 157 +- .../Mouse/roccat_kone_pure_features.json | 66 +- .../Project-Aurora/Devices/DeviceManager.cs | 9 +- .../Project-Aurora/Project-Aurora.csproj | 12 +- .../Project-Aurora/Settings/DeviceKeyData.cs | 281 +++ .../Settings/DeviceLayoutManager.cs | 257 +-- .../Control_DeviceLayout.xaml.cs | 34 +- .../Control_EditKeycapData.xaml | 47 + .../Control_EditKeycapData.xaml.cs | 59 + .../DeviceLayoutViewer/Control_Keycap.xaml.cs | 8 +- .../Keycaps/Control_ColorizedKeycap.xaml.cs | 2 +- .../Keycaps/Control_DefaultKeycap.xaml.cs | 2 +- .../Control_DefaultKeycapBackglow.xaml.cs | 2 +- .../Control_DefaultKeycapBackglowOnly.xaml.cs | 2 +- .../Keycaps/KeycapViewer.cs | 6 +- .../Window_DeviceConfig.xaml | 51 +- .../Window_DeviceConfig.xaml.cs | 58 +- 54 files changed, 5603 insertions(+), 33032 deletions(-) create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/jpn_layout.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.abnt2.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ansi.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.de.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak_int.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.es.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.fr.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.hu.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.intl.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.iso.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.it.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.jpn.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.la.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.nordic.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ru.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.swiss.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.tr.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.uk.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.us.json create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml create mode 100644 Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml.cs 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 index a87375e11..08952f9fe 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json @@ -1,1164 +1,1581 @@ -{ +{ "layout_width":800, "layout_height":400, - "key_conversion":{ - - }, - "keys":[ - { - "Key":{ + "keys":[ + { + "Key":{ "visual_name":"ESC", "tag":1, "device_id":null }, - "Region":"0, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":0, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F1", "tag":2, "device_id":null }, - "Region":"62, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":62, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F2", "tag":3, "device_id":null }, - "Region":"99, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":99, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F3", "tag":4, "device_id":null }, - "Region":"136, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":136, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F4", "tag":5, "device_id":null }, - "Region":"173, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":173, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F5", "tag":6, "device_id":null }, - "Region":"237, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":237, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F6", "tag":7, "device_id":null }, - "Region":"274, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":274, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F7", "tag":8, "device_id":null }, - "Region":"311, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":311, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F8", "tag":9, "device_id":null }, - "Region":"348, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":348, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F9", "tag":10, "device_id":null }, - "Region":"407, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":407, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F10", "tag":11, "device_id":null }, - "Region":"444, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":444, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F11", "tag":12, "device_id":null }, - "Region":"481, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":481, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F12", "tag":13, "device_id":null }, - "Region":"518, 0, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":518, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"PRINT", "tag":14, "device_id":null }, - "Region":"562, 0, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":562, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"SCRL\r\nLOCK", "tag":15, "device_id":null }, - "Region":"599, 0, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":599, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"PAUSE", "tag":16, "device_id":null }, - "Region":"636, 0, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":636, + "Y":0, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"~", "tag":158, "device_id":null }, - "Region":"0, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":0, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"1", "tag":18, "device_id":null }, - "Region":"37, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":37, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"2", "tag":19, "device_id":null }, - "Region":"74, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":74, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"3", "tag":20, "device_id":null }, - "Region":"111, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":111, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"4", "tag":21, "device_id":null }, - "Region":"148, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":148, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"5", "tag":22, "device_id":null }, - "Region":"185, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":185, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"6", "tag":23, "device_id":null }, - "Region":"222, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":222, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"7", "tag":24, "device_id":null }, - "Region":"259, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":259, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"8", "tag":25, "device_id":null }, - "Region":"296, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":296, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"9", "tag":26, "device_id":null }, - "Region":"333, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":333, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"0", "tag":27, "device_id":null }, - "Region":"370, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":370, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"-", "tag":28, "device_id":null }, - "Region":"407, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":407, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"=", "tag":29, "device_id":null }, - "Region":"444, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":444, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"BACKSPACE", "tag":30, "device_id":null }, - "Region":"481, 37, 67, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":481, + "Y":37, + "Width":67, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"INSERT", "tag":31, "device_id":null }, - "Region":"562, 37, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":562, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"HOME", "tag":32, "device_id":null }, - "Region":"599, 37, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":599, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"PAGE\r\nUP", "tag":33, "device_id":null }, - "Region":"636, 37, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":636, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"NUM\r\nLOCK", "tag":34, "device_id":null }, - "Region":"680, 37, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":680, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"/", "tag":35, "device_id":null }, - "Region":"717, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":717, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"*", "tag":36, "device_id":null }, - "Region":"754, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":754, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"-", "tag":37, "device_id":null }, - "Region":"791, 37, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":791, + "Y":37, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"TAB", "tag":38, "device_id":null }, - "Region":"0, 74, 50, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":0, + "Y":74, + "Width":50, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"Q", "tag":39, "device_id":null }, - "Region":"57, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":57, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"W", "tag":40, "device_id":null }, - "Region":"94, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":94, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"E", "tag":41, "device_id":null }, - "Region":"131, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":131, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"R", "tag":42, "device_id":null }, - "Region":"168, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":168, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"T", "tag":43, "device_id":null }, - "Region":"205, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":205, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"Y", "tag":44, "device_id":null }, - "Region":"242, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":242, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"U", "tag":45, "device_id":null }, - "Region":"279, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":279, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"I", "tag":46, "device_id":null }, - "Region":"316, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":316, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"O", "tag":47, "device_id":null }, - "Region":"353, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":353, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"P", "tag":48, "device_id":null }, - "Region":"390, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":390, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"{", "tag":49, "device_id":null }, - "Region":"427, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":427, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"}", "tag":50, "device_id":null }, - "Region":"464, 74, 40, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":464, + "Y":74, + "Width":40, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"DEL", "tag":52, "device_id":null }, - "Region":"562, 74, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":562, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"END", "tag":53, "device_id":null }, - "Region":"599, 74, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":599, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"PAGE\r\nDOWN", "tag":54, "device_id":null }, - "Region":"636, 74, 30, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":636, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"7", "tag":55, "device_id":null }, - "Region":"680, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":680, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"8", "tag":56, "device_id":null }, - "Region":"717, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":717, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"9", "tag":57, "device_id":null }, - "Region":"754, 74, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":754, + "Y":74, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"+", "tag":58, "device_id":null }, - "Region":"791, 74, 30, 67", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":791, + "Y":74, + "Width":30, + "Height":67, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"CAPS\r\nLOCK", "tag":59, "device_id":null }, - "Region":"0, 111, 60, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":0, + "Y":111, + "Width":60, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"A", "tag":60, "device_id":null }, - "Region":"67, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":67, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"S", "tag":61, "device_id":null }, - "Region":"104, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":104, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"D", "tag":62, "device_id":null }, - "Region":"141, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":141, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"F", "tag":63, "device_id":null }, - "Region":"178, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":178, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"G", "tag":64, "device_id":null }, - "Region":"215, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":215, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"H", "tag":65, "device_id":null }, - "Region":"252, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":252, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"J", "tag":66, "device_id":null }, - "Region":"289, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":289, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"K", "tag":67, "device_id":null }, - "Region":"326, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":326, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"L", "tag":68, "device_id":null }, - "Region":"363, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":363, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":":", "tag":69, "device_id":null }, - "Region":"400, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":400, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"'", "tag":17, "device_id":null }, - "Region":"437, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":437, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"#", "tag":70, "device_id":null }, - "Region":"474, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":474, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"ENTER", "tag":72, "device_id":null }, - "Region":"511, 74, 38, 67", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":511, + "Y":74, + "Width":38, + "Height":67, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"4", "tag":73, "device_id":null }, - "Region":"680, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":680, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"5", "tag":74, "device_id":null }, - "Region":"717, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":717, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"6", "tag":75, "device_id":null }, - "Region":"754, 111, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":754, + "Y":111, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"SHIFT", "tag":76, "device_id":null }, - "Region":"0, 148, 48, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":0, + "Y":148, + "Width":48, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"\\", "tag":51, "device_id":null }, - "Region":"55, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":55, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"Z", "tag":78, "device_id":null }, - "Region":"92, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":92, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"X", "tag":79, "device_id":null }, - "Region":"129, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":129, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"C", "tag":80, "device_id":null }, - "Region":"166, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":166, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"V", "tag":81, "device_id":null }, - "Region":"203, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":203, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"B", "tag":82, "device_id":null }, - "Region":"240, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":240, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"N", "tag":83, "device_id":null }, - "Region":"277, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":277, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"M", "tag":84, "device_id":null }, - "Region":"314, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":314, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"<", "tag":85, "device_id":null }, - "Region":"351, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":351, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":">", "tag":86, "device_id":null }, - "Region":"388, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":388, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"?", "tag":87, "device_id":null }, - "Region":"425, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":425, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"SHIFT", "tag":88, "device_id":null }, - "Region":"462, 148, 87, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":462, + "Y":148, + "Width":87, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"↑", "tag":89, "device_id":null }, - "Region":"598, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":598, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"1", "tag":90, "device_id":null }, - "Region":"680, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":680, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"2", "tag":91, "device_id":null }, - "Region":"717, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":717, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"3", "tag":92, "device_id":null }, - "Region":"754, 148, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":754, + "Y":148, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"ENTER", "tag":93, "device_id":null }, - "Region":"791, 148, 30, 67", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":791, + "Y":148, + "Width":30, + "Height":67, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"CTRL", "tag":94, "device_id":null }, - "Region":"0, 185, 51, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":0, + "Y":185, + "Width":51, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"WIN", "tag":95, "device_id":null }, - "Region":"56, 185, 39, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":56, + "Y":185, + "Width":39, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"ALT", "tag":96, "device_id":null }, - "Region":"100, 185, 42, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":100, + "Y":185, + "Width":42, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"SPACE", "tag":97, "device_id":null }, - "Region":"149, 185, 208, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":149, + "Y":185, + "Width":208, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"ALT Gr", "tag":98, "device_id":null }, - "Region":"362, 185, 41, 30", - "Image":"", "FontSize":9.0, - "Enabled":true + "Enabled":true, + "X":362, + "Y":185, + "Width":41, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"WIN", "tag":99, "device_id":null }, - "Region":"408, 185, 41, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":408, + "Y":185, + "Width":41, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"APP", "tag":100, "device_id":null }, - "Region":"454, 185, 40, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":454, + "Y":185, + "Width":40, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"CTRL", "tag":101, "device_id":null }, - "Region":"499, 185, 50, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":499, + "Y":185, + "Width":50, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"←", "tag":102, "device_id":null }, - "Region":"561, 185, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":561, + "Y":185, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"↓", "tag":103, "device_id":null }, - "Region":"598, 185, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":598, + "Y":185, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"→", "tag":104, "device_id":null }, - "Region":"635, 185, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":635, + "Y":185, + "Width":30, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":"0", "tag":105, "device_id":null }, - "Region":"680, 185, 67, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "Enabled":true, + "X":680, + "Y":185, + "Width":67, + "Height":30, + "Image":"", + "IsImage":false }, - { - "Key":{ + { + "Key":{ "visual_name":".", "tag":106, "device_id":null }, - "Region":"754, 185, 30, 30", - "Image":"", "FontSize":12.0, - "Enabled":true + "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/Plain Keyboard/layout.abnt2.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.abnt2.json deleted file mode 100644 index 593501e79..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.abnt2.json +++ /dev/null @@ -1,1597 +0,0 @@ -{ - "key_conversion":{ - 51:71 - }, - "keys": [ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "´", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "[", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ç", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "]", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 159, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ansi.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ansi.json deleted file mode 100644 index a6dab1dec..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ansi.json +++ /dev/null @@ -1,1564 +0,0 @@ -{ - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 51, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 47.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\"", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 133.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 11, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 93.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.de.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.de.json deleted file mode 100644 index 1d755d80a..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.de.json +++ /dev/null @@ -1,1591 +0,0 @@ -{ - "key_conversion":{ - 51:17, - 78:44, - 69:49, - 17:69, - 44:78, - 29:50, - 28:87, - 87:71, - 49:28, - 50:29 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "^", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ß", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "´", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ü", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ö", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ä", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "#", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 50.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 13.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak.json deleted file mode 100644 index 481f596a4..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak.json +++ /dev/null @@ -1,1599 +0,0 @@ -{ - "key_conversion": { - 70: 39, - 85: 40, - 86: 41, - 48: 42, - 44: 43, - 63: 44, - 64: 45, - 80: 46, - 42: 47, - 68: 48, - 87: 49, - 29: 50, - 47: 61, - 41: 62, - 45: 63, - 46: 64, - 62: 65, - 65: 66, - 43: 67, - 83: 68, - 61: 69, - 28: 70, - 51: 71, - 69: 78, - 39: 79, - 66: 80, - 67: 81, - 79: 82, - 82: 83, - 84: 84, - 40: 85, - 81: 86, - 78: 87 - }, - "keys": [ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 51, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 47.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 133.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 11, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 93.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak_int.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak_int.json deleted file mode 100644 index 1ed60b3ec..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.dvorak_int.json +++ /dev/null @@ -1,1614 +0,0 @@ -{ - "key_conversion": { - 70: 39, - 85: 40, - 86: 41, - 48: 42, - 44: 43, - 63: 44, - 64: 45, - 80: 46, - 42: 47, - 68: 48, - 87: 49, - 29: 50, - 47: 61, - 41: 62, - 45: 63, - 46: 64, - 62: 65, - 65: 66, - 43: 67, - 83: 68, - 61: 69, - 28: 70, - 51: 71, - 69: 78, - 39: 79, - 66: 80, - 67: 81, - 79: 82, - 82: 83, - 84: 84, - 40: 85, - 81: 86, - 78: 87 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.es.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.es.json deleted file mode 100644 index 993169bc6..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.es.json +++ /dev/null @@ -1,1589 +0,0 @@ -{ -"key_conversion": { -51: 17, // º -49: 28, // ' -50: 29, // ¡ -69: 49, // ` -29: 50, // + -17: 69, // ñ -87: 71, // ´ -28: 87, // ç -}, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "º", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "¡", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BLOQ\r\nNUM", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "`", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BLOQ\r\nMAYÚS", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ñ", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "´", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ç", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALTGR", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.fr.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.fr.json deleted file mode 100644 index 5ed41c7c5..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.fr.json +++ /dev/null @@ -1,1597 +0,0 @@ -{ - "key_conversion":{ - 70:17, - 49:28, - 28:49, - 60:39, - 78:40, - 50:49, - 69:50, - 39:60, - 84:69, - 17:70, - 51:71, - 40:78, - 85:84, - 86:85, - 87:86, - 158:87 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "²", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "]", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "..", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "$", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "u", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "!", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 50.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 13.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.hu.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.hu.json deleted file mode 100644 index b5324a223..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.hu.json +++ /dev/null @@ -1,1588 +0,0 @@ -{ - "key_conversion":{ - "27": 17, - "44": 78, - "78": 44, - "28": 87, - "51": 71, - "87": 28, - "17": 27 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ö", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ü", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ó", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ő", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ú", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "É", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Á", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ű", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Í", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "FN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.intl.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.intl.json deleted file mode 100644 index 02554e1f7..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.intl.json +++ /dev/null @@ -1,1582 +0,0 @@ -{ - "key_conversion":{ - 51:71 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\"", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.iso.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.iso.json deleted file mode 100644 index f596d37b8..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.iso.json +++ /dev/null @@ -1,1581 +0,0 @@ -{ - "key_conversion":{ - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 158, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 17, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "#", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 51, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.it.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.it.json deleted file mode 100644 index 4c59a8eec..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.it.json +++ /dev/null @@ -1,1589 +0,0 @@ -{ - "key_conversion":{ - 51:17, - 69:49, - 17:69, - 29:50, - 28:87, - 87:71, - 49:28, - 50:29 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ì", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "È", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ò", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "À", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ù", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 50.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 13.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.jpn.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.jpn.json deleted file mode 100644 index 0f29b8b5b..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.jpn.json +++ /dev/null @@ -1,1630 +0,0 @@ -{ - "key_conversion":{ - 152:17, - 154:98, - 98:99, - 51:71 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "半角/\r\n全角", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "^", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "¥", - "tag": 156, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACK", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "@", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "[", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "]", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 85.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "無変換", - "tag": 153, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 133.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 11, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "変換", - "tag": 98, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "カタカナ/\r\nひらがな", - "tag": 155, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.la.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.la.json deleted file mode 100644 index 2a5bb35a1..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.la.json +++ /dev/null @@ -1,1589 +0,0 @@ -{ -"key_conversion": { -51: 17, // | -49: 28, // ' -50: 29, // ¿ -69: 49, // ´ -29: 50, // + -17: 69, // ñ -87: 71, // } -28: 87, // - -}, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "|", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "¿", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BLOQ\r\nNUM", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "´", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BLOQ\r\nMAYÚS", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ñ", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALTGR", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.nordic.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.nordic.json deleted file mode 100644 index ea35eaac2..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.nordic.json +++ /dev/null @@ -1,1589 +0,0 @@ -{ - "key_conversion":{ - 69:50, - 29:28, - 28:87, - 87:71, - 17:69, - 49:29, - 51:17, - 50:49 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "½", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "´", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Å", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "¨", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ø Ö\rÆ", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Æ Ä\rØ", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ru.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ru.json deleted file mode 100644 index d82bcc481..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.ru.json +++ /dev/null @@ -1,1567 +0,0 @@ -{ - "key_conversion":{ - 51:71 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\"", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 37.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 132.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 93.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.swiss.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.swiss.json deleted file mode 100644 index d939dc7a9..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.swiss.json +++ /dev/null @@ -1,1592 +0,0 @@ -{ - "key_conversion":{ - 87:17, - 49:28, - 50:29, - 78:44, - 69:49, - 17:50, - 70:69, - 51:70, - 158:71, - 44:78, - 28:87 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "§", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "^", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ü", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "¨", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ö", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ä", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "$", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 50.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 13.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ",", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.tr.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.tr.json deleted file mode 100644 index 07ab4554d..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.tr.json +++ /dev/null @@ -1,1587 +0,0 @@ -{ - "key_conversion":{ - 158:28, - 28:29, - 85:71, - 87:85, - 51:86, - 86:87 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "_", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ğ", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ü", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ş", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "İ", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ";", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ö", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Ç", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.uk.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.uk.json deleted file mode 100644 index cfc841418..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.uk.json +++ /dev/null @@ -1,1585 +0,0 @@ -{ - "key_conversion":{ - 17:70, - 51:77, - 70:71, - 158:17 - }, - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 58.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 5, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "'", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "#", - "tag": 71, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": -37.0, - "width": 38.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": -3, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 131.0, - "margin_top": 0.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 - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 77, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 87.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 49.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT Gr", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 40.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 12.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.us.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.us.json deleted file mode 100644 index a6dab1dec..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/layout.us.json +++ /dev/null @@ -1,1564 +0,0 @@ -{ - "keys":[ - { - "visualName": "ESC", - "tag": 1, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F1", - "tag": 2, - "line_break": false, - "margin_left": 32.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F2", - "tag": 3, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F3", - "tag": 4, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F4", - "tag": 5, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F5", - "tag": 6, - "line_break": false, - "margin_left": 34.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F6", - "tag": 7, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F7", - "tag": 8, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F8", - "tag": 9, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F9", - "tag": 10, - "line_break": false, - "margin_left": 29.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 2, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F10", - "tag": 11, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F11", - "tag": 12, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F12", - "tag": 13, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PRINT", - "tag": 14, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SCRL\r\nLOCK", - "tag": 15, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "~", - "tag": 17, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 18, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 19, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 20, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 21, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 22, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 23, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 24, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 25, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 26, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 27, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 28, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "=", - "tag": 29, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "BACKSPACE", - "tag": 30, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "INSERT", - "tag": 31, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "HOME", - "tag": 32, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nUP", - "tag": 33, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "NUM\r\nLOCK", - "tag": 34, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "/", - "tag": 35, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "*", - "tag": 36, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "-", - "tag": 37, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "TAB", - "tag": 38, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 50.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Q", - "tag": 39, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "W", - "tag": 40, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "E", - "tag": 41, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "R", - "tag": 42, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "T", - "tag": 43, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Y", - "tag": 44, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "U", - "tag": 45, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "I", - "tag": 46, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "O", - "tag": 47, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "P", - "tag": 48, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "{", - "tag": 49, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "}", - "tag": 50, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\\", - "tag": 51, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 47.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "DEL", - "tag": 52, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "END", - "tag": 53, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "PAGE\r\nDOWN", - "tag": 54, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "7", - "tag": 55, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "8", - "tag": 56, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "9", - "tag": 57, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "+", - "tag": 58, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CAPS\r\nLOCK", - "tag": 59, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 60.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "A", - "tag": 60, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "S", - "tag": 61, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "D", - "tag": 62, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "F", - "tag": 63, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "G", - "tag": 64, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "H", - "tag": 65, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "J", - "tag": 66, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "K", - "tag": 67, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "L", - "tag": 68, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ":", - "tag": 69, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "\"", - "tag": 70, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 72, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "4", - "tag": 73, - "line_break": false, - "margin_left": 133.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 11, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "5", - "tag": 74, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "6", - "tag": 75, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 76, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "Z", - "tag": 78, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "X", - "tag": 79, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "C", - "tag": 80, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "V", - "tag": 81, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "B", - "tag": 82, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "N", - "tag": 83, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "M", - "tag": 84, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "<", - "tag": 85, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ">", - "tag": 86, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "?", - "tag": 87, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SHIFT", - "tag": 88, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 93.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 8, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↑", - "tag": 89, - "line_break": false, - "margin_left": 52.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "1", - "tag": 90, - "line_break": false, - "margin_left": 51.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "2", - "tag": 91, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "3", - "tag": 92, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ENTER", - "tag": 93, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 67.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 6, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 94, - "line_break": false, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 51.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 95, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 39.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 96, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 42.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "SPACE", - "tag": 97, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "ALT", - "tag": 98, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "WIN", - "tag": 99, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "APP", - "tag": 100, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "CTRL", - "tag": 101, - "line_break": false, - "margin_left": 5.0, - "margin_top": 0.0, - "width": 48.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 4, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "←", - "tag": 102, - "line_break": false, - "margin_left": 15.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "↓", - "tag": 103, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "→", - "tag": 104, - "line_break": false, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": "0", - "tag": 105, - "line_break": false, - "margin_left": 14.0, - "margin_top": 0.0, - "width": 67.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 6, - "height_bits": 3, - "margin_left_bits": 1, - "margin_top_bits": 0, - "enabled": true - }, - { - "visualName": ".", - "tag": 106, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": true - } - ] -} \ 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 index d9ef6f31f..25615a03d 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/corsair_k95_platinum.json @@ -1,8 +1,487 @@ -{ +{ + "IsNewFormat": true, "keys_to_remove": [], "key_modifications": {}, - "included_features": [ - "corsair_k95_platinum_right_features.json", - "corsair_k95_platinum_left_features.json" - ] + "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/DeviceLayouts/Keyboard/generic_laptop.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json index 25c770f8f..1c6f25ef0 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json @@ -1,520 +1,315 @@ { + "IsNewFormat": true, "keys_to_remove": [ - 14, - 15, 16, + 31, 32, 33, - 53, - 54, 34, 35, 36, 37, - 51, + 52, + 53, + 54, 55, 56, 57, 58, - 71, 73, 74, 75, - 77, 90, 91, 92, 93, + 99, 100, - 103, 105, 106 ], "key_modifications": { "2": { - "visualName": null, - "tag": 2, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 37, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "3": { - "visualName": null, - "tag": 3, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 74, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "4": { - "visualName": null, - "tag": 4, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 111, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "5": { - "visualName": null, - "tag": 5, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 148, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "6": { - "visualName": null, - "tag": 6, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 185, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "7": { - "visualName": null, - "tag": 7, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 222, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "8": { - "visualName": null, - "tag": 8, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 259, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "9": { - "visualName": null, - "tag": 9, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 296, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "10": { - "visualName": null, - "tag": 10, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 333, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "11": { - "visualName": null, - "tag": 11, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 370, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "12": { - "visualName": null, - "tag": 12, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 407, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "13": { - "visualName": null, - "tag": 13, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "31": { - "visualName": null, - "tag": 14, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 444, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "14": { - "visualName": "INSERT", - "tag": 31, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "52": { - "visualName": null, - "tag": 15, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 481, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "15": { - "visualName": "DEL", - "tag": 52, - "line_break": true, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "30": { - "visualName": null, - "tag": 30, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null - }, - "50": { - "visualName": null, - "tag": 50, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 518, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, - "72": { - "visualName": null, - "tag": 72, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": null + "51": { + "VisualName": null, + "X": null, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": 9.0, + "Enabled": null }, - "76": { - "visualName": null, - "tag": 76, - "line_break": null, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": null - }, - "88": { - "visualName": null, - "tag": 88, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": 93, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "89": { + "VisualName": null, + "X": 486, + "Y": 185, + "Width": null, + "Height": 13, + "Image": null, + "FontSize": null, + "Enabled": null }, "94": { - "visualName": null, - "tag": 94, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": 41, - "height": null, - "font_size": null, - "width_bits": 4, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": null, + "Y": null, + "Width": 41, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "95": { - "visualName": null, - "tag": 95, - "line_break": null, - "margin_left": 44, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": 3, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 85, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "96": { - "visualName": null, - "tag": 96, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 122, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "97": { - "visualName": null, - "tag": 97, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": 178, - "height": null, - "font_size": null, - "width_bits": 15, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 159, + "Y": null, + "Width": 178, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "98": { - "visualName": null, - "tag": 98, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null - }, - "99": { - "visualName": "FN", - "tag": 107, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 344, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "101": { - "visualName": null, - "tag": 101, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 418, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "102": { - "visualName": null, - "tag": 102, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": 24.5, - "height": null, - "font_size": null, - "width_bits": 2, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "89": { - "visualName": null, - "tag": 103, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 455, + "Y": null, + "Width": 24, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "103": { - "visualName": "↑", - "tag": 89, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": null, - "height": 14, - "font_size": 9, - "width_bits": null, - "height_bits": 1, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 486, + "Y": 202, + "Width": null, + "Height": 13, + "Image": null, + "FontSize": null, + "Enabled": null }, "104": { - "visualName": null, - "tag": 104, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": 24.5, - "height": null, - "font_size": null, - "width_bits": 2, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 523, + "Y": null, + "Width": 24, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null } }, - "included_features": [ - "generic_laptop_left_bottom_features.json", - "generic_laptop_right_bottom_features.json", - "generic_laptop_right_features.json" - ] + "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 index 41cab9c50..93960253f 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json @@ -1,199 +1,468 @@ { + "IsNewFormat": true, "keys_to_remove": [ - 14, - 15, 16, + 31, 32, 33, + 52, 53, 54, - 51, - 71, - 77, - 100, - 103 + 99, + 100 ], "key_modifications": { "2": { - "tag": 2, - "margin_left": 7.0 + "VisualName": null, + "X": 37, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "3": { - "tag": 3, - "margin_left": 7.0 + "VisualName": null, + "X": 74, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "4": { - "tag": 4, - "margin_left": 7.0 + "VisualName": null, + "X": 111, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "5": { - "tag": 5, - "margin_left": 7.0 + "VisualName": null, + "X": 148, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "6": { - "tag": 6, - "margin_left": 7.0 + "VisualName": null, + "X": 185, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "7": { - "tag": 7, - "margin_left": 7.0 + "VisualName": null, + "X": 222, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "8": { - "tag": 8, - "margin_left": 7.0 + "VisualName": null, + "X": 259, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "9": { - "tag": 9, - "margin_left": 7.0 + "VisualName": null, + "X": 296, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "10": { - "tag": 10, - "margin_left": 7.0 + "VisualName": null, + "X": 333, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "11": { - "tag": 11, - "margin_left": 7.0 + "VisualName": null, + "X": 370, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "12": { - "tag": 12, - "margin_left": 7.0 + "VisualName": null, + "X": 407, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "13": { - "tag": 13, - "margin_left": 7.0 - }, - "31": { - "tag": 14, - "margin_left": 7.0 + "VisualName": null, + "X": 444, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "14": { - "visualName": "INSERT", - "tag": 31, - "margin_left": 7.0 - }, - "52": { - "tag": 15, - "margin_left": 7.0 + "VisualName": null, + "X": 481, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "15": { - "visualName": "DEL", - "tag": 52, - "line_break": true, - "margin_left": 7.0 + "VisualName": null, + "X": 518, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "34": { - "margin_left": 7.0 + "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": { - "line_break": true - }, - "50": { - "line_break": null, - "width": 30 + "VisualName": null, + "X": 666, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "55": { - "margin_left": 60 + "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": { - "line_break": true - }, - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0 + "VisualName": null, + "X": 666, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "73": { - "margin_left": 7 + "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": { - "line_break": true - }, - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0 + "VisualName": null, + "X": 629, + "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 }, - "88": { - "tag": 88, - "line_break": null, - "width": 93 + "89": { + "VisualName": null, + "X": 486, + "Y": 185, + "Width": null, + "Height": 13, + "Image": null, + "FontSize": null, + "Enabled": null }, "90": { - "margin_left": 7.0 + "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": { - "line_break": true + "VisualName": null, + "X": 666, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "94": { - "tag": 94, - "width": 41 + "VisualName": null, + "X": null, + "Y": null, + "Width": 41, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "95": { - "tag": 95, - "margin_left": 44, - "width": 30 + "VisualName": null, + "X": 85, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "96": { - "tag": 96, - "margin_left": 7, - "width": 30 + "VisualName": null, + "X": 122, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "97": { - "tag": 97, - "width": 178 + "VisualName": null, + "X": 159, + "Y": null, + "Width": 178, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "99": { - "visualName": "FN", - "tag": 107, - "margin_left": 7, - "width": 30 + "VisualName": null, + "X": 344, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "101": { - "tag": 101, - "margin_left": 7, - "width": 30 + "VisualName": null, + "X": 418, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "102": { - "tag": 102, - "margin_left": 7.0, - "width": 24.5 - }, - "89": { - "tag": 103 + "VisualName": null, + "X": 455, + "Y": null, + "Width": 24, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "103": { - "visualName": "↑", - "tag": 89, - "height": 14, - "font_size": 9 + "VisualName": null, + "X": 486, + "Y": 202, + "Width": null, + "Height": 13, + "Image": null, + "FontSize": null, + "Enabled": null }, "104": { - "tag": 104, - "line_break": null, - "width": 24.5 + "VisualName": null, + "X": 523, + "Y": null, + "Width": 24, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "105": { - "margin_left": 7.0 + "VisualName": null, + "X": 555, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "106": { - "line_break": true + "VisualName": null, + "X": 629, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null } }, - "included_features": [ - "generic_laptop_numpad_left_bottom_features.json", - "generic_laptop_numpad_right_bottom_features.json", - "generic_laptop_numpad_right_features.json" - ] + "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/DeviceLayouts/Keyboard/masterkeys_pro_m.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json index 575469c7f..8f1bc8568 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/masterkeys_pro_m.json @@ -1,4 +1,5 @@ -{ +{ + "IsNewFormat": true, "keys_to_remove": [ 14, 15, @@ -14,163 +15,193 @@ 103, 104 ], - "key_conversion": { - 14: 35, - 15: 36, - 16: 37, - - - 31: 55, - 32: 56, - 33: 57, - - 52: 73, - 53: 74, - 54: 75, - - 89: 91, - 102: 105, - 103: 169, - 104: 106 - }, "key_modifications": { - "13": { - "visualName": null, - "tag": 13, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "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, - "tag": 37, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "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, - "tag": 58, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 674, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "73": { - "visualName": null, - "tag": 73, - "line_break": null, - "margin_left": 15, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 1, - "margin_top_bits": null, - "enabled": null + "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, - "tag": 75, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 637, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "90": { - "visualName": null, - "tag": 90, - "line_break": null, - "margin_left": 15, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 1, - "margin_top_bits": null, - "enabled": null + "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, - "tag": 93, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 674, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "105": { - "visualName": null, - "tag": 105, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": 30.0, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 563, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "106": { - "visualName": null, - "tag": 106, - "line_break": null, - "margin_left": 44.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 637, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null } }, - "included_features": [ - "masterkeys_pro_m_features.json" - ] + "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/DeviceLayouts/Keyboard/razer_blade.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json index 494a6900f..1c6f25ef0 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json @@ -1,519 +1,315 @@ { + "IsNewFormat": true, "keys_to_remove": [ - 14, - 15, 16, + 31, 32, 33, - 53, - 54, 34, 35, 36, 37, + 52, + 53, + 54, 55, 56, 57, 58, - 71, 73, 74, 75, - 77, 90, 91, 92, 93, + 99, 100, - 103, 105, 106 ], "key_modifications": { "2": { - "visualName": null, - "tag": 2, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 37, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "3": { - "visualName": null, - "tag": 3, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 74, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "4": { - "visualName": null, - "tag": 4, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 111, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "5": { - "visualName": null, - "tag": 5, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 148, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "6": { - "visualName": null, - "tag": 6, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 185, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "7": { - "visualName": null, - "tag": 7, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 222, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "8": { - "visualName": null, - "tag": 8, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 259, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "9": { - "visualName": null, - "tag": 9, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 296, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "10": { - "visualName": null, - "tag": 10, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 333, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "11": { - "visualName": null, - "tag": 11, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 370, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "12": { - "visualName": null, - "tag": 12, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 407, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "13": { - "visualName": null, - "tag": 13, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "31": { - "visualName": null, - "tag": 14, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 444, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "14": { - "visualName": "INSERT", - "tag": 31, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "52": { - "visualName": null, - "tag": 15, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 481, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "15": { - "visualName": "DEL", - "tag": 52, - "line_break": true, - "margin_left": 7.0, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "30": { - "visualName": null, - "tag": 30, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null - }, - "50": { - "visualName": null, - "tag": 50, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 518, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, - "72": { - "visualName": null, - "tag": 72, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": null + "51": { + "VisualName": null, + "X": null, + "Y": null, + "Width": null, + "Height": null, + "Image": null, + "FontSize": 9.0, + "Enabled": null }, - "76": { - "visualName": null, - "tag": 76, - "line_break": null, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 7, - "height_bits": 3, - "margin_left_bits": 0, - "margin_top_bits": 0, - "enabled": null - }, - "88": { - "visualName": null, - "tag": 88, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": 93, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "89": { + "VisualName": null, + "X": 486, + "Y": 185, + "Width": null, + "Height": 13, + "Image": null, + "FontSize": null, + "Enabled": null }, "94": { - "visualName": null, - "tag": 94, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": 41, - "height": null, - "font_size": null, - "width_bits": 4, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": null, + "Y": null, + "Width": 41, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "95": { - "visualName": null, - "tag": 95, - "line_break": null, - "margin_left": 44, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": 3, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 85, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "96": { - "visualName": null, - "tag": 96, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 122, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "97": { - "visualName": null, - "tag": 97, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": 178, - "height": null, - "font_size": null, - "width_bits": 15, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 159, + "Y": null, + "Width": 178, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "98": { - "visualName": null, - "tag": 98, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null - }, - "99": { - "visualName": "FN", - "tag": 107, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 344, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "101": { - "visualName": null, - "tag": 101, - "line_break": null, - "margin_left": 7, - "margin_top": null, - "width": 30, - "height": null, - "font_size": null, - "width_bits": 3, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 418, + "Y": null, + "Width": 30, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "102": { - "visualName": null, - "tag": 102, - "line_break": null, - "margin_left": 7.0, - "margin_top": null, - "width": 24.5, - "height": null, - "font_size": null, - "width_bits": 2, - "height_bits": null, - "margin_left_bits": 0, - "margin_top_bits": null, - "enabled": null - }, - "89": { - "visualName": null, - "tag": 103, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": null, - "height": null, - "font_size": null, - "width_bits": null, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 455, + "Y": null, + "Width": 24, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null }, "103": { - "visualName": "↑", - "tag": 89, - "line_break": null, - "margin_left": null, - "margin_top": null, - "width": null, - "height": 14, - "font_size": 9, - "width_bits": null, - "height_bits": 1, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 486, + "Y": 202, + "Width": null, + "Height": 13, + "Image": null, + "FontSize": null, + "Enabled": null }, "104": { - "visualName": null, - "tag": 104, - "line_break": true, - "margin_left": null, - "margin_top": null, - "width": 24.5, - "height": null, - "font_size": null, - "width_bits": 2, - "height_bits": null, - "margin_left_bits": null, - "margin_top_bits": null, - "enabled": null + "VisualName": null, + "X": 523, + "Y": null, + "Width": 24, + "Height": null, + "Image": null, + "FontSize": null, + "Enabled": null } }, - "included_features": [ - "razer_blade_left_bottom_features.json", - "razer_blade_right_bottom_features.json", - "razer_blade_right_features.json" - ] -} + "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/Mouse/Asus - Pugio.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json index 338f9e795..9526bbcac 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Asus - Pugio.json @@ -1,65 +1,67 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 20.0, - "margin_top": -232.0, - "width": 128.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 13, - "height_bits": 19, - "image": "Asus_Pugio_body.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Scroll Wheel", - "tag": 161, - "margin_left": 76.0, - "margin_top": -210.0, - "width": 14.0, - "height": 41.0, - "width_bits": 2, - "height_bits": 3, - "margin_left_bits": 7, - "margin_top_bits": -16, - "image": "Asus_Pugio_wheel.png", - "enabled": true, - "absolute_location": 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 }, - { - "visualName": "Bottom Light", - "tag": 162, - "margin_left": 19.5, - "margin_top": -102.5, - "width": 128.5, - "height": 103, - "width_bits": 2, - "height_bits": 3, - "margin_left_bits": 7, - "margin_top_bits": -16, - "image": "Asus_Pugio_backlights.png", - "enabled": true, - "absolute_location": 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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 61.0, - "margin_top": -45.0, - "width": 46, - "height": 24, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 6, - "margin_top_bits": -5, - "image": "Asus_Pugio_logo.png", - "enabled": true, - "absolute_location": 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 index 837bcc6ee..402cfebd1 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Clevo - Touchpad.json @@ -1,22 +1,22 @@ -{ - "group_tag": "mouse", - "origin_region": 3, - "grouped_keys": [ - { - "visualName": "TOUCHPAD", +{ + "IsNewFormat": true, + "keys_to_remove": [], + "key_modifications": {}, + "key_to_add": { + "0": { + "Key": { + "visual_name": "TOUCHPAD", "tag": 0, - "line_break": false, - "margin_left": 149.0, - "margin_top": 0.0, - "width": 208.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 17, - "height_bits": 3, - "margin_left_bits": 12, - "margin_top_bits": 0, - "enabled": true, - "absolute_location": true - } - ] + "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 index 641ca6a4e..8c99e3f12 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - Katar.json @@ -1,35 +1,37 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 10.0, - "margin_top": -232.0, - "width": 153.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 13, - "height_bits": 19, - "image": "Corsair_Katar_outline.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 68.0, - "margin_top": -45.0, - "width": 35.0, - "height": 22.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": 6, - "margin_top_bits": -4, - "image": "Corsair_Katar_logo.png", - "enabled": true, - "absolute_location": 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 index 1d588488d..ae34fa393 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Corsair - M65.json @@ -1,50 +1,52 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 10.0, - "margin_top": -232.0, - "width": 158.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 13, - "height_bits": 19, - "image": "Corsair_M65_outline.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 80.0, - "margin_top": -76.0, - "width": 27.0, - "height": 27.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 7, - "margin_top_bits": -6, - "image": "Corsair_M65_logo.png", - "enabled": true, - "absolute_location": 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 }, - { - "visualName": "Scroll Wheel", - "tag": 161, - "margin_left": 84.0, - "margin_top": -222.0, - "width": 21.0, - "height": 60.0, - "width_bits": 2, - "height_bits": 5, - "margin_left_bits": 7, - "margin_top_bits": -18, - "image": "Corsair_M65_scrollwheel.png", - "enabled": true, - "absolute_location": 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/DeviceLayouts/Mouse/Generic Peripheral.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json index 7028d6fe8..63470335b 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Generic Peripheral.json @@ -1,34 +1,37 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { +{ + "IsNewFormat": true, + "keys_to_remove": [], + "key_modifications": {}, + "key_to_add": { + "-1": { + "Key": { + "visual_name": "NONE", "tag": -1, - "margin_left": 20.0, - "margin_top": -90.0, - "width": 90.0, - "height": 90.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true + "device_id": null + }, + "FontSize": null, + "Enabled": true, + "X": 0, + "Y": 0, + "Width": 90, + "Height": 90, + "Image": "", + "IsImage": false }, - { - "visualName": "Mouse/\r\nHeadset", + "0": { + "Key": { + "visual_name": "Mouse/\r\nHeadset", "tag": 0, - "font_size": 12, - "margin_left": 20.0, - "margin_top": -90.0, - "width": 90.0, - "height": 90.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true + "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 index b57790075..4a7fdc53d 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G502.json @@ -1,35 +1,37 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 10.0, - "margin_top": -232.0, - "width": 143.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 10, - "height_bits": 19, - "image": "Logi_G502_outline.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 40.0, - "margin_top": -125.0, - "width": 45.0, - "height": 65.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 5, - "margin_top_bits": -5, - "image": "Logi_G502_logo.png", - "enabled": true, - "absolute_location": 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 index 5dd8a59a3..a40cf792a 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Logitech - G900.json @@ -1,35 +1,37 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 10.0, - "margin_top": -232.0, - "width": 123.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 10, - "height_bits": 19, - "image": "Logi_G900_outline.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 60.0, - "margin_top": -69.0, - "width": 22.0, - "height": 24.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 5, - "margin_top_bits": -5, - "image": "Logi_G900_logo.png", - "enabled": true, - "absolute_location": 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/RazerICorsair Mousepad + Mouse.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json index 81fa9f2d9..b3dc78318 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/RazerICorsair Mousepad + Mouse.json @@ -1,175 +1,262 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 25.0, - "margin_top": -185.0, - "width": 200.0, - "height": 168.0, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "Mouse Logo", - "tag": 160, - "margin_left": 100.0, - "margin_top": -125.0, - "width": 50.0, - "height": 50.0, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 201, - "margin_left": 15.0, - "margin_top": -185.0, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 202, - "margin_left": 15.0, - "margin_top": -151.4, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 203, - "margin_left": 15.0, - "margin_top": -117.8, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 204, - "margin_left": 15.0, - "margin_top": -84.2, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 205, - "margin_left": 15.0, - "margin_top": -50.6, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "tag": 206, - "visualName": "", - "margin_left": 25.0, - "margin_top": -17.0, - "width": 40.0, - "height": 10.0, - "enabled": true, - "absolute_location": true - }, - { - "tag": 207, - "visualName": "", - "margin_left": 65.0, - "margin_top": -17.0, - "width": 40.0, - "height": 10.0, - "enabled": true, - "absolute_location": true - }, - { - "tag": 208, - "visualName": "", - "margin_left": 105.0, - "margin_top": -17.0, - "width": 40.0, - "height": 10.0, - "enabled": true, - "absolute_location": true - }, - { - "tag": 209, - "visualName": "", - "margin_left": 145.0, - "margin_top": -17.0, - "width": 40.0, - "height": 10.0, - "enabled": true, - "absolute_location": true - }, - { - "tag": 210, - "visualName": "", - "margin_left": 185.0, - "margin_top": -17.0, - "width": 40.0, - "height": 10.0, - "enabled": true, - "absolute_location": true - }, - { - "tag": 211, - "visualName": "", - "margin_left": 225.0, - "margin_top": -50.5, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "tag": 212, - "visualName": "", - "margin_left": 225.0, - "margin_top": -84.2, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "tag": 213, - "visualName": "", - "margin_left": 225.0, - "margin_top": -117.8, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "tag": 214, - "visualName": "", - "margin_left": 225.0, - "margin_top": -151.4, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - }, - { - "tag": 215, - "visualName": "", - "margin_left": 225.0, - "margin_top": -185.0, - "width": 10.0, - "height": 33.6, - "enabled": true, - "absolute_location": true - } - ] +{ + "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/SteelSeries - QcK Prism Mousepad + Mouse.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - QcK Prism Mousepad + Mouse.json index bab45fe22..fe3db83c4 100644 --- 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 @@ -1,233 +1,232 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 15.0, - "margin_top": -200.0, - "width": 200.0, - "height": 168.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "Mouse Logo", - "tag": 160, - "margin_left": 90.0, - "margin_top": -111.0, - "width": 50.0, - "height": 50.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "Scroll Wheel", - "tag": 161, - "margin_left": 90.0, - "margin_top": -171.0, - "width": 50.0, - "height": 50.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 201, - "margin_left": 15.0, - "margin_top": -144.0, - "width": 16.0, - "height": 56.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 202, - "margin_left": 15.0, - "margin_top": -88.0, - "width": 16.0, - "height": 56.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 203, - "margin_left": 31.5, - "margin_top": -48.0, - "width": 56.0, - "height": 16.0, - "width_bits": 6, - "height_bits": 6, - - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 204, - "margin_left": 87.5, - "margin_top": -48.0, - "width": 56.0, - "height": 16.0, - "width_bits": 6, - "height_bits": 6, - - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "tag": 205, - "visualName": "", - "margin_left": 143.5, - "margin_top": -48.0, - "width": 56.0, - "height": 16.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - - "tag": 206, - "visualName": "", - "margin_left": 200.0, - "margin_top": -88.0, - "width": 16.0, - "height": 56.0, - - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - - "tag": 207, - "visualName": "", - "margin_left": 200.0, - "margin_top": -144.0, - - "width": 16.0, - "height": 56.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - - "tag": 208, - "visualName": "", - "margin_left": 200.0, - "margin_top": -200.0, - "width": 16.0, - "height": 56.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - - "tag": 209, - "visualName": "", - "margin_left": 143.5, - "margin_top": -200.0, - "width": 56.0, - "height": 16.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - - "tag": 210, - "visualName": "", - "margin_left": 87.5, - "margin_top": -200.0, - "width": 56.0, - "height": 16.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - - "tag": 211, - "visualName": "", - "margin_left": 31.5, - "margin_top": -200.0, - "width": 56.0, - - "height": 16.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 212, - "margin_left": 15.0, - "margin_top": -200.0, - "width": 16.0, - "height": 56.0, - "width_bits": 2, - "height_bits": 2, - - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - } - ] +{ + "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 index e627fda91..f59266f61 100644 --- 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 @@ -1,50 +1,52 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 20.0, - "margin_top": -232.0, - "width": 128.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 13, - "height_bits": 19, - "image": "SteelSeries_Rival_300_outline.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 61.0, - "margin_top": -55.0, - "width": 40.0, - "height": 40.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 6, - "margin_top_bits": -5, - "image": "Omen_logo.png", - "enabled": true, - "absolute_location": 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 }, - { - "visualName": "Scroll Wheel", - "tag": 161, - "margin_left": 73.0, - "margin_top": -189.0, - "width": 16.0, - "height": 31.0, - "width_bits": 2, - "height_bits": 3, - "margin_left_bits": 7, - "margin_top_bits": -16, - "image": "SteelSeries_Rival_300_scrollwheel.png", - "enabled": true, - "absolute_location": 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 index 016667b68..853945e2f 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/SteelSeries - Rival 300.json @@ -1,50 +1,52 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 20.0, - "margin_top": -232.0, - "width": 128.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 13, - "height_bits": 19, - "image": "SteelSeries_Rival_300_outline.png", - "enabled": true, - "absolute_location": true +{ + "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 }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 61.0, - "margin_top": -55.0, - "width": 40.0, - "height": 40.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 6, - "margin_top_bits": -5, - "image": "SteelSeries_Rival_300_logo.png", - "enabled": true, - "absolute_location": 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 }, - { - "visualName": "Scroll Wheel", - "tag": 161, - "margin_left": 73.0, - "margin_top": -189.0, - "width": 16.0, - "height": 31.0, - "width_bits": 2, - "height_bits": 3, - "margin_left_bits": 7, - "margin_top_bits": -16, - "image": "SteelSeries_Rival_300_scrollwheel.png", - "enabled": true, - "absolute_location": 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 index d8bb45ec1..086463bb9 100644 --- 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 @@ -1,77 +1,82 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 15.0, - "margin_top": -200.0, - "width": 200.0, - "height": 168.0, - "width_bits": 6, - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "Mouse Logo", - "tag": 160, - "margin_left": 90.0, - "margin_top": -111.0, - "width": 50.0, - "height": 50.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "Scroll Wheel", - "tag": 161, - "margin_left": 90.0, - "margin_top": -171.0, - "width": 50.0, - "height": 50.0, - "width_bits": 2, - "height_bits": 2, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 201, - "margin_left": 15.0, - "margin_top": -200.0, - "width": 16.0, - "height": 168.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 202, - "margin_left": 200.0, - "margin_top": -200.0, - "width": 16.0, - "height": 168.0, - "width_bits": 6, - - "height_bits": 6, - "margin_left_bits": 2, - "margin_top_bits": -6, - "enabled": true, - "absolute_location": true - } - ] +{ + "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/roccat_kone_pure_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/roccat_kone_pure_features.json index e17b2a004..c2799aad9 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/roccat_kone_pure_features.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/roccat_kone_pure_features.json @@ -1,35 +1,37 @@ -{ - "group_tag": "mouse", - "origin_region": 4, - "grouped_keys": [ - { - "tag": -1, - "margin_left": 10.0, - "margin_top": -232.0, - "width": 153.0, - "height": 232.0, - "margin_left_bits": 1, - "margin_top_bits": -19, - "width_bits": 13, - "height_bits": 19, - "image": "Roccat_Kone_Pure_outline.png", - "enabled": true, - "absolute_location": true +{ + "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": "Roccat_Kone_Pure_outline.png", + "IsImage": true }, - { - "visualName": "Logo", - "tag": 160, - "margin_left": 64.0, - "margin_top": -66.0, - "width": 66.0, - "height": 59.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": 6, - "margin_top_bits": -4, - "image": "Roccat_Kone_Pure_logo.png", - "enabled": true, - "absolute_location": true + "160": { + "Key": { + "visual_name": "Logo", + "tag": 160, + "device_id": null + }, + "FontSize": null, + "Enabled": true, + "X": 54, + "Y": 166, + "Width": 66, + "Height": 59, + "Image": "Roccat_Kone_Pure_logo.png", + "IsImage": true } - ] + } } \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs index a643401cb..75bb3f40c 100644 --- a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs +++ b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs @@ -336,7 +336,7 @@ public void ResetDevices() } } - public void UpdateDevices(Dictionary composition, bool forced = false) + public void UpdateDevices(Dictionary compositionList, bool forced = false) { foreach (DeviceContainer device in devices) { @@ -348,8 +348,11 @@ public void UpdateDevices(Dictionary composition, b device.Device.Shutdown(); continue; } - //if (composition.Count != 0) - // device.UpdateDevice(composition[-1], forced); + foreach (var composition in compositionList.Values) + { + device.UpdateDevice(composition, forced); + } + } } } diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index 5b3fb049d..998e782fa 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -777,8 +777,14 @@ True Resources.resx + - + + Control_EditKeycapData.xaml + + + Control_ImageKeycap.xaml + Control_ColorizedKeycap.xaml @@ -1943,6 +1949,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + MSBuild:Compile Designer diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs new file mode 100644 index 000000000..598638988 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs @@ -0,0 +1,281 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Aurora.Settings +{ + public class DeviceKey + { + [JsonProperty("visual_name")] + public string VisualName { get; set; } + [JsonProperty("tag")] + public int Tag { get; set; } + [JsonProperty("device_id")] + public int? DeviceId { get; set; } + + /*public bool Equals(DeviceKey otherKey) + { + return Tag == otherKey.Tag && DeviceId == otherKey.DeviceId; + } + + public override bool Equals(object obj) + { + // Again just optimization + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + + // Actually check the type, should not throw exception from Equals override + if (obj.GetType() != this.GetType()) return false; + + // Call the implementation from IEquatable + return Equals((DeviceKey)obj); + }*/ + + public bool Equals(DeviceKey key1, DeviceKey key2) + { + return key1.Tag == key2.Tag && key1.DeviceId == key2.DeviceId; + } + + + public int GetHashCode(DeviceKey obj) + { + return obj.Tag; + } + public class EqualityComparer : IEqualityComparer + { + public bool Equals(DeviceKey key1, DeviceKey key2) + { + return key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId); + } + + + public int GetHashCode(DeviceKey obj) + { + return obj.Tag; + } + + } + public static bool operator ==(DeviceKey key1, DeviceKey key2) + { + return key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId); + } + public static bool operator !=(DeviceKey key1, DeviceKey key2) + { + return !(key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId)); + } + public DeviceKey() + { + Tag = -1; + DeviceId = null; + } + public DeviceKey(int key) + { + Tag = key; + DeviceId = null; + VisualName = ((Devices.DeviceKeys)key).ToString(); + } + public DeviceKey(Devices.DeviceKeys key, int? deviceId = null, string visualName = null) + { + Tag = (int)key; + DeviceId = deviceId; + if (visualName != null) + VisualName = visualName; + else + VisualName = key.ToString(); + } + public static implicit operator DeviceKey(Devices.DeviceKeys k) => new DeviceKey(k); + + public static implicit operator DeviceKey(Int64 k) => new DeviceKey((int)k); + + } + public class DeviceKeyModifier + { + public string VisualName; + + public int? X; + public int? Y; + + public int? Width; + public int? Height; + + public string Image; + public double? FontSize; + public bool? Enabled; + + public DeviceKeyModifier() { } + + public DeviceKeyModifier(DeviceKeyConfiguration conf) + { + VisualName = conf.Key.VisualName; + X = conf.X; + Y = conf.Y; + Height = conf.Height; + Width = conf.Width; + FontSize = conf.FontSize; + Enabled = conf.Enabled; + Image = conf.Image; + } + public DeviceKeyModifier(DeviceKeyConfiguration baseConf, DeviceKeyConfiguration updateConf) + { + if (baseConf.Key == updateConf.Key) + { + if (updateConf.Key.VisualName != baseConf.Key.VisualName) VisualName = updateConf.Key.VisualName; + if (updateConf.X != baseConf.X) X = updateConf.X; + if (updateConf.Y != baseConf.Y) Y = updateConf.Y; + if (updateConf.Height != baseConf.Height) Height = updateConf.Height; + if (updateConf.Width != baseConf.Width) Width = updateConf.Width; + if (updateConf.FontSize != baseConf.FontSize) FontSize = updateConf.FontSize; + if (updateConf.Enabled != baseConf.Enabled) Enabled = updateConf.Enabled; + if (updateConf.Image != baseConf.Image) Image = updateConf.Image; + } + } + } + public class DeviceKeyConfiguration : INotifyPropertyChanged + { + public DeviceKey Key = Devices.DeviceKeys.NONE; + private int _x; + public int X + { + get { return _x; } + set + { + _x = value; + OnPropertyChanged(nameof(X)); + } + } + private int _y; + public int Y + { + get { return _y; } + set + { + _y = value; + OnPropertyChanged(nameof(Y)); + } + } + private int _width; + public int Width + { + get { return _width; } + set + { + _width = value; + OnPropertyChanged(nameof(Width)); + } + } + private int _height; + public int Height + { + get { return _height; } + set + { + _height = value; + OnPropertyChanged(nameof(Height)); + } + } + private string _image = ""; + public string Image + { + get { return _image; } + set + { + _image = value; + OnPropertyChanged(nameof(Image)); + OnPropertyChanged(nameof(IsImage)); + } + } + public bool IsImage => !String.IsNullOrWhiteSpace(Image); + public double? FontSize; + public bool? Enabled = true; + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + [JsonIgnore] + public int Tag + { + get { return Key.Tag; } + set + { + Key.Tag = value; + OnPropertyChanged(nameof(Tag)); + } + } + + [JsonIgnore] + public bool VisualNameUpdateEnabled = true; + [JsonIgnore] + public string VisualName + { + get { return Key.VisualName; } + set + { + Key.VisualName = value; + OnPropertyChanged(nameof(VisualName)); + } + } + public DeviceKeyConfiguration() + { + } + public DeviceKeyConfiguration(KeyboardKey key, int? deviceId) + { + Key = new DeviceKey(key.tag, deviceId, key.visualName); + if (key.width != null) Width = (int)key.width; + if (key.height != null) Height = (int)key.height; + if (key.font_size != null) FontSize = key.font_size; + if (key.margin_left != null) X = (int)key.margin_left; + if (key.margin_top != null) Y = (int)key.margin_top; + if (key.enabled != null) Enabled = key.enabled; + if (key.image != null) Image = key.image; + } + public void UpdateFromOtherKey(KeyboardKey key) + { + if (key != null) + { + + if (key.visualName != null) Key.VisualName = key.visualName; + if ((int)key.tag != -1) + Key.Tag = (int)key.tag; + if (key.width != null) Width = (int)key.width; + if (key.height != null) Height = (int)key.height; + if (key.font_size != null) FontSize = key.font_size; + if (key.margin_left != null) X = (int)key.margin_left; + if (key.margin_top != null) Y = (int)key.margin_top; + if (key.enabled != null) Enabled = key.enabled; + if (key.image != null) Image = key.image; + } + } + public void ApplyModifier(DeviceKeyModifier modifier) + { + if (modifier.VisualName != null) + { + VisualName = modifier.VisualName; + VisualNameUpdateEnabled = false; + } + if (modifier.X != null) X = modifier.X.Value; + if (modifier.Y != null) Y = modifier.Y.Value; + if (modifier.Height != null) Height = modifier.Height.Value; + if (modifier.Width != null) Width = modifier.Width.Value; + if (modifier.FontSize != null) FontSize = modifier.FontSize; + if (modifier.Enabled != null) Enabled = modifier.Enabled; + if (modifier.Image != null) Image = modifier.Image; + } + public static bool operator ==(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) + { + return key1.Tag == key2.Tag && key1.VisualName == key2.VisualName && key1.Image == key2.Image && key1.Enabled == key2.Enabled && key1.FontSize == key2.FontSize && + key1.Width == key2.Width && key1.Height == key2.Height && key1.X == key2.X && key1.Y == key2.Y; + } + public static bool operator !=(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) + { + return !(key1 == key2); + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 0f6be5610..e16cc993c 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -15,220 +15,6 @@ namespace Aurora.Settings { - public class DeviceKey - { - [JsonProperty("visual_name")] - public string VisualName { get; set; } - [JsonProperty("tag")] - public int Tag { get; set; } - [JsonProperty("device_id")] - public int? DeviceId { get; set; } - - /*public bool Equals(DeviceKey otherKey) - { - return Tag == otherKey.Tag && DeviceId == otherKey.DeviceId; - } - - public override bool Equals(object obj) - { - // Again just optimization - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - - // Actually check the type, should not throw exception from Equals override - if (obj.GetType() != this.GetType()) return false; - - // Call the implementation from IEquatable - return Equals((DeviceKey)obj); - }*/ - - public bool Equals(DeviceKey key1, DeviceKey key2) - { - return key1.Tag == key2.Tag && key1.DeviceId == key2.DeviceId; - } - - - public int GetHashCode(DeviceKey obj) - { - return obj.Tag; - } - public class EqualityComparer : IEqualityComparer - { - public bool Equals(DeviceKey key1, DeviceKey key2) - { - return key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId); - } - - - public int GetHashCode(DeviceKey obj) - { - return obj.Tag; - } - - } - public static bool operator==(DeviceKey key1, DeviceKey key2) - { - return key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId); - } - public static bool operator !=(DeviceKey key1, DeviceKey key2) - { - return !(key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId)); - } - public DeviceKey() - { - Tag = -1; - DeviceId = null; - } - public DeviceKey(int key) - { - Tag = key; - DeviceId = null; - VisualName = ((Devices.DeviceKeys)key).ToString(); - } - public DeviceKey(Devices.DeviceKeys key, int? deviceId = null, string visualName = null) - { - Tag = (int)key; - DeviceId = deviceId; - if (visualName != null) - VisualName = visualName; - else - VisualName = key.ToString(); - } - public static implicit operator DeviceKey(Devices.DeviceKeys k) => new DeviceKey(k); - - public static implicit operator DeviceKey(Int64 k) => new DeviceKey((int)k); - - } - public class DeviceKeyConfiguration : INotifyPropertyChanged - { - public DeviceKey Key = Devices.DeviceKeys.NONE; - private int _x; - public int X - { - get { return _x; } - set - { - _x = value; - OnPropertyChanged(nameof(X)); - } - } - private int _y; - public int Y - { - get { return _y; } - set - { - _y = value; - OnPropertyChanged(nameof(Y)); - } - } - private int _width; - public int Width - { - get { return _width; } - set - { - _width = value; - OnPropertyChanged(nameof(Width)); - } - } - private int _height; - public int Height - { - get { return _height; } - set - { - _height = value; - OnPropertyChanged(nameof(Height)); - } - } - private string _image = ""; - public string Image - { - get { return _image; } - set - { - _image = value; - OnPropertyChanged(nameof(Image)); - OnPropertyChanged(nameof(IsImage)); - } - } - public bool IsImage => !String.IsNullOrWhiteSpace(Image); - public double? FontSize; - public bool? Enabled = true; - - public event PropertyChangedEventHandler PropertyChanged; - - private void OnPropertyChanged(string propertyName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - [JsonIgnore] - public int Tag - { - get { return Key.Tag; } - set - { - Key.Tag = value; - OnPropertyChanged(nameof(Tag)); - } - } - public DeviceKeyConfiguration() - { - } - public DeviceKeyConfiguration(KeyboardKey key, int? deviceId) - { - Key = new DeviceKey(key.tag, deviceId, key.visualName); - if (key.width != null) Width = (int)key.width; - if (key.height != null) Height = (int)key.height; - if (key.font_size != null) FontSize = key.font_size; - if (key.margin_left != null) X = (int)key.margin_left; - if (key.margin_top != null) Y = (int)key.margin_top; - if (key.enabled != null) Enabled = key.enabled; - if (key.image != null) Image = key.image; - } - public void UpdateFromOtherKey(KeyboardKey key) - { - if (key != null) - { - - if (key.visualName != null) Key.VisualName = key.visualName; - if ((int)key.tag != -1) - Key.Tag = (int)key.tag; - if (key.width != null) Width = (int)key.width; - if (key.height != null) Height = (int)key.height; - if (key.font_size != null) FontSize = key.font_size; - if (key.margin_left != null) X = (int)key.margin_left; - if (key.margin_top != null) Y = (int)key.margin_top; - if (key.enabled != null) Enabled = key.enabled; - if (key.image != null) Image = key.image; - } - } - public void UpdateFromOtherKey(DeviceKeyConfiguration key) - { - if (key.Key.VisualName != null) Key.VisualName = key.Key.VisualName; - if ((int)key.Key.Tag != -1) - Key.Tag = (int)key.Key.Tag; - X = key.X; - Y = key.Y; - Height = key.Height; - Width = key.Width; - if (key.FontSize != null) FontSize = key.FontSize; - if (key.Enabled != null) Enabled = key.Enabled; - if (key.Image != null) Image = key.Image; - } - public static bool operator ==(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) - { - const int epsilon = 3; - return key1.Tag == key2.Tag && key1.Image == key2.Image && key1.Enabled == key2.Enabled && key1.FontSize == key2.FontSize && key1.Width == key2.Width && key1.Height == key2.Height && - key1.X > key2.X - epsilon && key1.X < key2.X + epsilon && key1.Y > key2.Y - epsilon && key1.Y < key2.Y + epsilon; - } - public static bool operator !=(DeviceKeyConfiguration key1, DeviceKeyConfiguration key2) - { - return !(key1 == key2); - } - } public class VirtualKeyboardConfiguration { @@ -323,8 +109,8 @@ public List LoadLayout() } - - /*var fileName = "Plain Keyboard\\layout." + "ansi" + ".json"; + /*var layoutType = "jpn"; + var fileName = "Plain Keyboard\\layout." + layoutType + ".json"; var layoutPath = Path.Combine(layoutsPath, "Keyboard", fileName); string keyboardContent = File.ReadAllText(layoutPath, Encoding.UTF8); KeyboardLayout keyboard = JsonConvert.DeserializeObject(keyboardContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); @@ -332,9 +118,9 @@ public List LoadLayout() NewKeyboardLayout saved = new NewKeyboardLayout(); saved.Keys = Keys.Values.ToArray(); - keyboardContent = JsonConvert.SerializeObject(saved); + keyboardContent = JsonConvert.SerializeObject(saved, Formatting.Indented); - fileName = "Plain Keyboard\\" + "ansi" + "_layout.json"; + fileName = "Plain Keyboard\\" + layoutType + "_layout.json"; File.WriteAllText(Path.Combine(layoutsPath, "Keyboard", fileName), keyboardContent, Encoding.UTF8);*/ try @@ -400,13 +186,13 @@ public List LoadLayout() { if (Keys.ContainsKey(key.Key)) { - Keys[key.Key].UpdateFromOtherKey(key.Value); - } - else - { - Keys[key.Key] = key.Value; + Keys[key.Key].ApplyModifier(key.Value); } } + foreach (var key in layoutConfig.key_to_add) + { + Keys[key.Key] = key.Value; + } NormalizeKeys(); } @@ -415,10 +201,17 @@ public List LoadLayout() return Keys.Values.ToList(); } - public void SaveLayout(List layoutKey) + public void SaveLayout(List layoutKey, Point offset) { List saveKeys = new List(); - layoutKey.ForEach(key => saveKeys.Add(key.GetConfiguration())); + foreach (var key in layoutKey) + { + var conf = key.GetConfiguration(); + conf.Key.DeviceId = null; + conf.X += (int)offset.X; + conf.Y += (int)offset.Y; + saveKeys.Add(conf); + } KeycapGroupConfiguration config = new KeycapGroupConfiguration(); Dictionary defaultLayout = new Dictionary(); @@ -429,7 +222,7 @@ public void SaveLayout(List layoutKey) if (File.Exists(layoutPath)) { string c = File.ReadAllText(layoutPath, Encoding.UTF8); - NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace, Formatting = Formatting.Indented }); defaultLayout = keyboard.Keys.ToDictionary(k => k.Tag, k => k); //defaultLayout.Values.ToList().ForEach(k => k.Key.DeviceId = DeviceId); @@ -441,17 +234,17 @@ public void SaveLayout(List layoutKey) { if (defaultLayout[key.Tag] != key) { - config.key_modifications[key.Tag] = key; + config.key_modifications[key.Tag] = new DeviceKeyModifier(defaultLayout[key.Tag], key); } defaultLayout.Remove(key.Tag); } else { - config.key_modifications[key.Tag] = key; + config.key_to_add[key.Tag] = key; } } config.keys_to_remove = defaultLayout.Keys.ToArray(); - var content = JsonConvert.SerializeObject(config); + var content = JsonConvert.SerializeObject(config, Formatting.Indented); File.WriteAllText(Path.Combine(layoutsPath, GetFolder(), Config.SelectedLayout + ".json"), content, Encoding.UTF8); } @@ -579,7 +372,7 @@ public class KeycapGroupConfiguration public int[] keys_to_remove = new int[] { }; [JsonProperty("key_modifications")] - public Dictionary key_modifications = new Dictionary(); + public Dictionary key_modifications = new Dictionary(); [JsonProperty("key_to_add")] public Dictionary key_to_add = new Dictionary(); @@ -702,7 +495,7 @@ private void SaveConfiguration(DeviceConfig config) //if (DevicesConfig.SelectMany(dc => dc.Id )) var fileName = "DevicesConfig.json"; var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); - var content = JsonConvert.SerializeObject(this); + var content = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); } private void DeleteConfiguration(DeviceConfig config) @@ -711,7 +504,7 @@ private void DeleteConfiguration(DeviceConfig config) var fileName = "DevicesConfig.json"; var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); - var content = JsonConvert.SerializeObject(this); + var content = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); DeviceLayoutNumberChanged?.Invoke(this); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 591427390..ab38e0c98 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -71,7 +71,7 @@ public List Keys CreateUserControl(device_grid); - this.Width = device_grid.Width; + this.Width = device_grid.Width + 5; this.Height = device_grid.Height; RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); @@ -102,13 +102,7 @@ public void CreateUserControl(Canvas deviceControl, bool abstractKeycaps = false foreach (DeviceKeyConfiguration key in Keys) { - Control_Keycap keycap = new Control_Keycap(key); - - //keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); - deviceControl.Children.Add(keycap); - - if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag) && !abstractKeycaps) - KeyboardMap.Add(key.Key, keycap); + AddDeviceKey(key); if (key.Width + key.X > layout_width) layout_width = key.Width + key.X; @@ -193,5 +187,29 @@ public void SetKeyboardColors(Dictionary keylig } } } + public void AddDeviceKey(DeviceKeyConfiguration key) + { + Control_Keycap keycap = new Control_Keycap(key); + + //keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); + device_grid.Children.Add(keycap); + + if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag))// && !abstractKeycaps) + KeyboardMap.Add(key.Key, keycap); + } + public void RemoveDeviceKey(DeviceKeyConfiguration key) + { + foreach (var child in device_grid.Children) + { + if (child is Control_Keycap keycap) + { + if (keycap.GetConfiguration() == key) + { + device_grid.Children.Remove(keycap); + return; + } + } + } + } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml new file mode 100644 index 000000000..4bf5733be --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml.cs new file mode 100644 index 000000000..2093bcc02 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_EditKeycapData.xaml.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Aurora.Settings.DeviceLayoutViewer +{ + /// + /// Interaction logic for Control_EditKeycapData.xaml + /// + public partial class Control_EditKeycapData : UserControl + { + private bool _isCollapsed; + public bool IsCollapsed + { + get { return _isCollapsed; } + set + { + _isCollapsed = value; + if (_isCollapsed) + keycapData.Visibility = Visibility.Collapsed; + else + keycapData.Visibility = Visibility.Visible; + //LoadDeviceLayout(); + } + } + public Control_EditKeycapData() + { + InitializeComponent(); + IsCollapsed = true; + } + public Control_EditKeycapData(DeviceKeyConfiguration configuration) + { + InitializeComponent(); + DataContext = configuration; + IsCollapsed = true; + } + private void collapseButton_Click(object sender, RoutedEventArgs e) + { + IsCollapsed = !IsCollapsed; + } + private void NumberValidationTextBox(object sender, TextCompositionEventArgs e) + { + Regex regex = new Regex("[^0-9]+"); + e.Handled = regex.IsMatch(e.Text); + } + } +} diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs index 931ebe503..0ae71def9 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs @@ -41,7 +41,7 @@ public KeycapViewer Keycap /// public partial class Control_Keycap : UserControl { - + private bool IsSelected = false; private void PositionChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "X" || e.PropertyName == "Y") @@ -164,7 +164,11 @@ public void SetColor(Color key_color) { Keycap.SetColor(key_color, Global.key_recorder.HasRecorded(GetKey())); } - + public void SelectionChanged() + { + IsSelected = !IsSelected; + Keycap.SetColor(IsSelected ? new Color() { A = 255, R = 10, G = 255, B = 10 } : new Color(), false); + } internal DeviceKeyConfiguration GetConfiguration() diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs index b23923dc1..c9b777d19 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs @@ -75,7 +75,7 @@ public override void SetColor(Color key_color, bool isSelected) keyBorder.BorderThickness = new Thickness(0); } } - UpdateText(); + UpdateText(keyCap); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs index b2ac2f571..bb852d222 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs @@ -78,7 +78,7 @@ public override void SetColor(Color key_color, bool isSelected) keyBorder.BorderThickness = new Thickness(0); } } - UpdateText(); + UpdateText(keyCap); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs index e939a2423..1e2e7b4d0 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs @@ -72,7 +72,7 @@ public override void SetColor(Color key_color, bool isSelected) keyBorder.BorderThickness = new Thickness(0); } } - UpdateText(); + UpdateText(keyCap); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs index 4622a779d..fa09f73fb 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs @@ -71,7 +71,7 @@ public override void SetColor(Color key_color, bool isSelected) keyBorder.BorderThickness = new Thickness(0); } } - UpdateText(); + UpdateText(keyCap); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs index d5956e812..5963cbe29 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs @@ -37,9 +37,9 @@ public KeycapViewer(DeviceKeyConfiguration conf) } public abstract void SetColor(Color key_color, bool isSelected); public virtual DeviceKey GetKey() { return Config.Key; } - public void UpdateText() + public void UpdateText(TextBlock keycapName) { - //if (Global.kbLayout.Loaded_Localization.IsAutomaticGeneration()) + if (Config.VisualNameUpdateEnabled) { //if (keyCap.Text.Length > 1) @@ -53,7 +53,7 @@ public void UpdateText() var scan_code = KeyUtils.MapVirtualKeyEx((uint)key, KeyUtils.MapVirtualKeyMapTypes.MapvkVkToVsc, (IntPtr)0x8090809);*/ int ret = KeyUtils.GetKeyNameTextW((uint)scan_code << 16, sb, 2); - //keyCap.Text = sb.ToString().ToUpper(); + keycapName.Text = sb.ToString().ToUpper(); } } protected void keyBorder_MouseDown(object sender, MouseButtonEventArgs e) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml index e89a0722f..74ead80b2 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml @@ -15,10 +15,10 @@ - + - + @@ -36,37 +36,32 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - + + + + - + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 2e203a2cb..a243a56f5 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -20,7 +20,7 @@ namespace Aurora.Settings.DeviceLayoutViewer /// /// Interaction logic for Window_DeviceConfig.xaml /// - public partial class Window_DeviceConfig : Window, INotifyPropertyChanged + public partial class Window_DeviceConfig : Window { private DeviceConfig _config; public DeviceConfig Config @@ -35,20 +35,14 @@ public DeviceConfig Config public bool DeleteDevice = false; private System.Windows.Point _positionInBlock; - public event PropertyChangedEventHandler PropertyChanged; - - private void OnPropertyChanged(string propertyName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - private Control_Keycap _selectedKey; public Control_Keycap SelectedKey { get { return _selectedKey; } set{ + _selectedKey?.SelectionChanged(); _selectedKey = value; - OnPropertyChanged(nameof(SelectedKey)); + _selectedKey.SelectionChanged(); } } public Window_DeviceConfig(DeviceConfig config) @@ -58,6 +52,7 @@ public Window_DeviceConfig(DeviceConfig config) LoadDeviceType(config.Type); this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; this.device_layout.SelectedItem = Config.SelectedLayout; + layoutName.Text = Config.SelectedLayout; if (config.SelectedKeyboardLayout != null) this.keyboard_layout.SelectedItem = Config.SelectedKeyboardLayout; DataContext = this; @@ -77,12 +72,14 @@ private void LoadDeviceType(int type) switch (type) { case 0: + this.device_type.SelectedItem = "Keyboard"; this.device_layout.ItemsSource = GetBrandsName("Keyboard"); this.keyboard_layout.ItemsSource = GetBrandsName("Keyboard\\Plain Keyboard"); this.keyboard_layout.Visibility = Visibility.Visible; this.keyboard_layout_tb.Visibility = Visibility.Visible; break; default: + this.device_type.SelectedItem = "Other Devices"; this.device_layout.ItemsSource = GetBrandsName("Mouse"); this.keyboard_layout.Visibility = Visibility.Collapsed; this.keyboard_layout_tb.Visibility = Visibility.Collapsed; @@ -104,6 +101,7 @@ private void device_layout_SelectionChanged(object sender, SelectionChangedEvent { Config.SelectedLayout = this.device_layout.SelectedItem.ToString(); LoadDeviceLayout(); + layoutName.Text = this.device_layout.SelectedItem.ToString(); } } private void keyboard_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) @@ -121,6 +119,7 @@ private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) Config.LightingEnabled = ((sender as CheckBox).IsChecked.HasValue) ? !(sender as CheckBox).IsChecked.Value : true; } deviceLayout = new Control_DeviceLayout(Config); + } private void okButton_Click(object sender, RoutedEventArgs e) @@ -145,7 +144,15 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) { if (MessageBox.Show("Are you sure that save the device layout?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) { - new DeviceLayout(Config).SaveLayout(deviceLayout.KeyboardMap.Values.ToList()); + Config.SelectedLayout = layoutName.Text; + var offset = new Point(); + if(Config.Type == 0 && deviceLayout.KeyboardMap.ContainsKey(Devices.DeviceKeys.ESC)) + { + var escConfig = deviceLayout.KeyboardMap[Devices.DeviceKeys.ESC].GetConfiguration(); + offset.X = -escConfig.X; + offset.Y = -escConfig.Y; + } + new DeviceLayout(Config).SaveLayout(deviceLayout.KeyboardMap.Values.ToList(), offset); } } @@ -188,6 +195,7 @@ private void KeyMouseUp(object sender, MouseButtonEventArgs e) } private void LoadDeviceLayout() { + deviceLayout.DeviceConfig = new DeviceConfig(Config); foreach (var key in deviceLayout.KeyboardMap.Values) { @@ -197,9 +205,16 @@ private void LoadDeviceLayout() key.UpdateLayout(); } deviceLayout.UpdateLayout(); + InitKeycapList(); this.Width = deviceLayout.Width + 340; this.KeyDown += OnKeyDownHandler; } + private void InitKeycapList() + { + //keycap_list.ItemsSource = deviceLayout.KeyboardMap.Keys.ToList().ConvertAll(k => k.VisualName); + keycap_list.ItemsSource = deviceLayout.KeyboardMap.Values.ToList().ConvertAll(k => k.GetConfiguration()); + keycap_list.UpdateLayout(); + } private void OnKeyDownHandler(object sender, KeyEventArgs e) { if (e.Key == Key.Z && Keyboard.Modifiers == ModifierKeys.Control) @@ -216,10 +231,27 @@ private void OnKeyDownHandler(object sender, KeyEventArgs e) } } - private void NumberValidationTextBox(object sender, TextCompositionEventArgs e) + private void keycap_list_SelectionChanged(object sender, SelectionChangedEventArgs e) { - Regex regex = new Regex("[^0-9]+"); - e.Handled = regex.IsMatch(e.Text); + if(sender is ListView listView) + { + if (listView.SelectedItem is DeviceKeyConfiguration conf) + { + SelectedKey = deviceLayout.KeyboardMap.Values.ToList().Where(k => k.GetConfiguration() == conf).First(); + } + } + } + private void addKey_Click(object sender, RoutedEventArgs e) + { + var keyConf = new DeviceKeyConfiguration(); + deviceLayout.AddDeviceKey(keyConf); + InitKeycapList(); } + private void removeKey_Click(object sender, RoutedEventArgs e) + { + deviceLayout.RemoveDeviceKey(SelectedKey.GetConfiguration()); + InitKeycapList(); + } + } } From dd663329e5e85c8852eb7593594df234047ef8ea Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 12 May 2020 07:52:01 +0200 Subject: [PATCH 07/42] Copy json if it newer, delete unnecessary ones --- .../corsair_k95_platinum_left_features.json | 411 ------------------ .../corsair_k95_platinum_right_features.json | 81 ---- .../generic_laptop_left_bottom_features.json | 21 - ...ic_laptop_numpad_left_bottom_features.json | 21 - ...c_laptop_numpad_right_bottom_features.json | 17 - .../generic_laptop_numpad_right_features.json | 20 - .../generic_laptop_right_bottom_features.json | 21 - .../generic_laptop_right_features.json | 24 - .../razer_blade_left_bottom_features.json | 21 - .../razer_blade_right_bottom_features.json | 21 - .../razer_blade_right_features.json | 24 - .../Project-Aurora/Project-Aurora.csproj | 390 ++++++++++++++++- 12 files changed, 387 insertions(+), 685 deletions(-) delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_left_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_features.json diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_left_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_left_features.json deleted file mode 100644 index aafe44a32..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_left_features.json +++ /dev/null @@ -1,411 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 1, - "grouped_keys": [ - { - "visualName": "", - "tag": 142, - "margin_left": -47.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": -4, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 143, - "margin_left": -1.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 0, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 144, - "margin_left": 45.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 4, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 145, - "margin_left": 91.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 8, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 146, - "margin_left": 137.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 11, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 147, - "margin_left": 183.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 15, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 148, - "margin_left": 229.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 19, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 149, - "margin_left": 275.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 23, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 150, - "margin_left": 321.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 27, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 151, - "margin_left": 367.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 31, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 172, - "margin_left": 413.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 34, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 173, - "margin_left": 459.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 38, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 174, - "margin_left": 505.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 42, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 175, - "margin_left": 551.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 46, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 176, - "margin_left": 597.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 50, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 177, - "margin_left": 643.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 53, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 178, - "margin_left": 689.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 57, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 179, - "margin_left": 735.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 61, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "", - "tag": 180, - "margin_left": 781.0, - "margin_top": -54.0, - "width": 46.0, - "height": 10.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": 65, - "margin_top_bits": -4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "LIGHTS", - "tag": 131, - "margin_left": 104.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 9, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "LOCK", - "tag": 132, - "margin_left": 141.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 12, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "G1", - "tag": 108, - "margin_left": -43.0, - "margin_top": 0.0, - "width": 30.0, - "height": 30.0, - "font_size": 12.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": -4, - "margin_top_bits": 0, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "G2", - "tag": 109, - "margin_left": -43.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": "G3", - "tag": 110, - "margin_left": -43.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": "G4", - "tag": 111, - "margin_left": -43.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": "G5", - "tag": 112, - "margin_left": -43.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": "G6", - "tag": 113, - "margin_left": -43.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 - } - ] -} diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_right_features.json deleted file mode 100644 index c4cc1916c..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/corsair_k95_platinum_right_features.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "MUTE", - "tag": 139, - "margin_left": -104.0, - "margin_top": 17, - "width": 30.0, - "height": 24.66, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": -9, - "margin_top_bits": 1, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "STOP", - "tag": 136, - "margin_left": -141.0, - "margin_top": 54.0, - "width": 30.0, - "height": 24.66, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": -12, - "margin_top_bits": 4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PREV", - "tag": 137, - "margin_left": -104.0, - "margin_top": 54.0, - "width": 30.0, - "height": 24.66, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": -9, - "margin_top_bits": 4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PLAY", - "tag": 133, - "margin_left": -67.0, - "margin_top": 54.0, - "width": 30.0, - "height": 24.66, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": -6, - "margin_top_bits": 4, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "NEXT", - "tag": 138, - "margin_left": -30.0, - "margin_top": 54.0, - "width": 30.0, - "height": 24.66, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 2, - "margin_left_bits": -3, - "margin_top_bits": 4, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_left_bottom_features.json deleted file mode 100644 index b8e080292..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_left_bottom_features.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - { - "visualName": "FN", - "tag": 171, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_left_bottom_features.json deleted file mode 100644 index b8e080292..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_left_bottom_features.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - { - "visualName": "FN", - "tag": 171, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_bottom_features.json deleted file mode 100644 index afff09e6f..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_bottom_features.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 4, - "grouped_keys": [ - { - "visualName": "↓", - "tag": 103, - "margin_left": -209.5, - "margin_top": -21.0, - "width": 30.0, - "height": 14.0, - "font_size": 9.0, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_features.json deleted file mode 100644 index a9387e7e1..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_numpad_right_features.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -195, - "margin_top": 74, - "width": 47.0, - "height": 30.0, - "font_size": 9.0, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_bottom_features.json deleted file mode 100644 index bfe18af39..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_bottom_features.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 4, - "grouped_keys": [ - { - "visualName": "↓", - "tag": 103, - "margin_left": -61.5, - "margin_top": -21.0, - "width": 30.0, - "height": 14.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": -6, - "margin_top_bits": -2, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_features.json deleted file mode 100644 index cc38e2fbb..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/generic_laptop_right_features.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -47, - "margin_top": 74, - "width": 47.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": -5, - "margin_top_bits": 6, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_left_bottom_features.json deleted file mode 100644 index b8e080292..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_left_bottom_features.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - { - "visualName": "FN", - "tag": 171, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_bottom_features.json deleted file mode 100644 index bfe18af39..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_bottom_features.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 4, - "grouped_keys": [ - { - "visualName": "↓", - "tag": 103, - "margin_left": -61.5, - "margin_top": -21.0, - "width": 30.0, - "height": 14.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 1, - "margin_left_bits": -6, - "margin_top_bits": -2, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_features.json deleted file mode 100644 index cc38e2fbb..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/razer_blade_right_features.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -47, - "margin_top": 74, - "width": 47.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 5, - "height_bits": 3, - "margin_left_bits": -5, - "margin_top_bits": 6, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index 662641afc..7b2459e88 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -855,9 +855,396 @@ + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + @@ -2030,9 +2417,6 @@ - - - From 0e81fa2ab0d52a44599c055e71947746087f98f3 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 14 May 2020 22:28:46 +0200 Subject: [PATCH 08/42] Not found directory fix --- .../DeviceLayoutViewer/Window_DeviceConfig.xaml.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index a243a56f5..edc71ea34 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -61,9 +61,16 @@ private List GetBrandsName(string dicName) { string layoutsPath = Path.Combine(Global.ExecutingDirectory, "DeviceLayouts", dicName); List FilesName = new List() { "None" }; - foreach (var name in Directory.GetFiles(layoutsPath)) + if (Directory.Exists(layoutsPath)) { - FilesName.Add(name.Split('\\').Last().Split('.').First()); + foreach (var name in Directory.GetFiles(layoutsPath)) + { + FilesName.Add(name.Split('\\').Last().Split('.').First()); + } + } + else + { + Directory.CreateDirectory(layoutsPath); } return FilesName; } From c9ef9dc7c9bf9409cb0aed00dda0a40237370a51 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 18 May 2020 14:14:28 +0200 Subject: [PATCH 09/42] Enable separate japan layout editing, convert physical layout Types to enum --- .../keyboard101_numpad_right_features.json | 20 - .../keyboard102_numpad_right_features.json | 20 - ...eyboard21_numpad_left_bottom_features.json | 134 ----- ...board21br_numpad_left_bottom_features.json | 148 ------ ...board21jp_numpad_left_bottom_features.json | 134 ----- .../keyboard21us_numpad_right_features.json | 20 - ...board22br_numpad_left_bottom_features.json | 118 ----- ...board22jp_numpad_left_bottom_features.json | 118 ----- .../keyboard22us_numpad_right_features.json | 20 - ...ard22usuk_numpad_left_bottom_features.json | 116 ----- .../keyboard_numpad_left_bottom_features.json | 115 ----- .../Keyboard/Uniwill2ND_35X.json | 18 +- .../Keyboard/Uniwill2ND_35X_1.json | 244 --------- .../Keyboard/Uniwill2ND_35X_2.json | 258 ---------- .../Keyboard/Uniwill2P1_550.json | 365 ++++++++++++++ .../Keyboard/Uniwill2P1_550_BR.json | 239 --------- .../Keyboard/Uniwill2P1_550_JP.json | 223 --------- .../Keyboard/Uniwill2P1_550_UK.json | 219 -------- .../Keyboard/Uniwill2P1_550_US.json | 227 --------- .../Keyboard/Uniwill2P2_650.json | 473 ++++++++++++++++++ .../Keyboard/Uniwill2P2_650_BR.json | 270 ---------- .../Keyboard/Uniwill2P2_650_JP.json | 257 ---------- .../Keyboard/Uniwill2P2_650_UK.json | 270 ---------- .../Keyboard/Uniwill2P2_650_US.json | 255 ---------- .../Keyboard/generic_laptop.json | 20 +- .../Keyboard/generic_laptop_numpad.json | 40 +- .../DeviceLayouts/Keyboard/razer_blade.json | 20 +- .../Project-Aurora/Project-Aurora.csproj | 61 +-- .../Project-Aurora/Settings/DeviceKeyData.cs | 8 +- .../Settings/DeviceLayoutManager.cs | 305 +++++++---- .../Control_DeviceLayout.xaml.cs | 2 +- .../Control_DeviceLayoutPresenter.xaml.cs | 2 +- .../Window_DeviceConfig.xaml | 17 +- .../Window_DeviceConfig.xaml.cs | 29 +- .../Project-Aurora/Utils/EnumUtils.cs | 14 +- 35 files changed, 1137 insertions(+), 3662 deletions(-) delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard101_numpad_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard102_numpad_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21br_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21jp_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21us_numpad_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22br_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22jp_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22us_numpad_right_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22usuk_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard_numpad_left_bottom_features.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_1.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_2.json create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_BR.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_JP.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_UK.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_US.json create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_BR.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_JP.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_UK.json delete mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_US.json diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard101_numpad_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard101_numpad_right_features.json deleted file mode 100644 index 20077ce5b..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard101_numpad_right_features.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -196, - "margin_top": 74, - "width": 47.0, - "height": 30.0, - "font_size": 9.0, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard102_numpad_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard102_numpad_right_features.json deleted file mode 100644 index 5c7ae4240..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard102_numpad_right_features.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -640, - "margin_top": 160, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21_numpad_left_bottom_features.json deleted file mode 100644 index c78c8fca1..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21_numpad_left_bottom_features.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "INSERT", - "tag": 31, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "PRTSC", - "tag": 14, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "Home", - "tag": 32, - "margin_left": 555.0, - "margin_top": -187.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - - { - "visualName": "PGUP", - "tag": 33, - "margin_left": 556.0, - "margin_top": -150.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PGDN", - "tag": 54, - "margin_left": 556.0, - "margin_top": -112.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "END", - "tag": 53, - "margin_left": 556.0, - "margin_top": -74.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21br_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21br_numpad_left_bottom_features.json deleted file mode 100644 index 0549c7f59..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21br_numpad_left_bottom_features.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "INSERT", - "tag": 31, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "PRTSC", - "tag": 14, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "Home", - "tag": 32, - "margin_left": 556.0, - "margin_top": -187.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - - { - "visualName": "PGUP", - "tag": 33, - "margin_left": 556.0, - "margin_top": -150.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PGDN", - "tag": 54, - "margin_left": 556.0, - "margin_top": -112.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "END", - "tag": 53, - "margin_left": 556.0, - "margin_top": -74.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "margin_left": 481.0, - "margin_top": -187.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21jp_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21jp_numpad_left_bottom_features.json deleted file mode 100644 index 3e42b5e34..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21jp_numpad_left_bottom_features.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "INSERT", - "tag": 31, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "PRTSC", - "tag": 14, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "Home", - "tag": 32, - "margin_left": 556.0, - "margin_top": -187.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - - { - "visualName": "PGUP", - "tag": 33, - "margin_left": 556.0, - "margin_top": -150.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PGDN", - "tag": 54, - "margin_left": 556.0, - "margin_top": -112.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "END", - "tag": 53, - "margin_left": 556.0, - "margin_top": -74.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21us_numpad_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21us_numpad_right_features.json deleted file mode 100644 index f5364e009..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard21us_numpad_right_features.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -85, - "margin_top": 73, - "width": 45.0, - "height": 30.0, - "font_size": 9.0, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22br_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22br_numpad_left_bottom_features.json deleted file mode 100644 index 8021e0ece..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22br_numpad_left_bottom_features.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "INERT", - "tag": 31, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "PRTSC", - "tag": 14, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "-", - "tag": 37, - "margin_left": 592.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "+", - "tag": 58, - "margin_left": 629.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PAUSE", - "tag": 16, - "margin_left": 481.0, - "margin_top": -185.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22jp_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22jp_numpad_left_bottom_features.json deleted file mode 100644 index 7d341a73d..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22jp_numpad_left_bottom_features.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "INERT", - "tag": 31, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "PRTSC", - "tag": 14, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "-", - "tag": 37, - "margin_left": 592.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "+", - "tag": 58, - "margin_left": 629.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - //, - - //{ - // "visualName": "\\", - // "tag": 54, - // "margin_left": 452.0, - // "margin_top": -74.0, - // "width": 30.0, - // "height": 30.0, - // "font_size": 9.0, - // "width_bits": 3, - // "height_bits": 3, - // "margin_left_bits": 4, - // "margin_top_bits": -3, - // "enabled": true, - // "absolute_location": true - //} - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22us_numpad_right_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22us_numpad_right_features.json deleted file mode 100644 index d6c2cb037..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22us_numpad_right_features.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 2, - "grouped_keys": [ - { - "visualName": "\\", - "tag": 51, - "margin_left": -160, - "margin_top": 75, - "width": 47.0, - "height": 30.0, - "font_size": 9.0, - "enabled": true, - "absolute_location": true - } - ], - "key_conversion": { - 77: 51 - } -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22usuk_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22usuk_numpad_left_bottom_features.json deleted file mode 100644 index fefc9249c..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard22usuk_numpad_left_bottom_features.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "PAUSE", - "tag": 16, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "PRTSC", - "tag": 14, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "-", - "tag": 37, - "margin_left": 592.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "+", - "tag": 58, - "margin_left": 629.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - //{ - // "visualName": "+", - // "tag": 54, - // "margin_left": 666.0, - // "margin_top": -222.0, - // "width": 30.0, - // "height": 30.0, - // "font_size": 9.0, - // "width_bits": 3, - // "height_bits": 3, - // "margin_left_bits": 4, - // "margin_top_bits": -3, - // "enabled": true, - // "absolute_location": true - //}, - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard_numpad_left_bottom_features.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard_numpad_left_bottom_features.json deleted file mode 100644 index 376c55458..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Extra Features/keyboard_numpad_left_bottom_features.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "group_tag": "keyboard", - "origin_region": 3, - "grouped_keys": [ - - { - "visualName": "INSERT", - "tag": 31, - "margin_left": 481.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "DEL", - "tag": 52, - "margin_left": 518.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "Home", - "tag": 32, - "margin_left": 555.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - - { - "visualName": "END", - "tag": 53, - "margin_left": 592.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PGUP", - "tag": 33, - "margin_left": 629.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "PGDN", - "tag": 54, - "margin_left": 666.0, - "margin_top": -222.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - }, - { - "visualName": "FN", - "tag": 107, - "margin_left": 48.0, - "margin_top": -37.0, - "width": 30.0, - "height": 30.0, - "font_size": 9.0, - "width_bits": 3, - "height_bits": 3, - "margin_left_bits": 4, - "margin_top_bits": -3, - "enabled": true, - "absolute_location": true - } - ] -} \ 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 index cfb7d5dd3..21b755c2d 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X.json @@ -311,7 +311,7 @@ "VisualName": null, "X": null, "Y": null, - "Width": 56, + "Width": -37, "Height": null, "Image": null, "FontSize": null, @@ -371,7 +371,7 @@ "VisualName": null, "X": null, "Y": null, - "Width": 41, + "Width": -10, "Height": null, "Image": null, "FontSize": null, @@ -381,7 +381,7 @@ "VisualName": null, "X": 85, "Y": null, - "Width": 30, + "Width": -9, "Height": null, "Image": null, "FontSize": null, @@ -391,7 +391,7 @@ "VisualName": null, "X": 122, "Y": null, - "Width": 30, + "Width": -12, "Height": null, "Image": null, "FontSize": null, @@ -401,7 +401,7 @@ "VisualName": null, "X": 159, "Y": null, - "Width": 178, + "Width": -30, "Height": null, "Image": null, "FontSize": null, @@ -411,7 +411,7 @@ "VisualName": null, "X": 344, "Y": null, - "Width": 30, + "Width": -11, "Height": null, "Image": null, "FontSize": null, @@ -421,7 +421,7 @@ "VisualName": "App", "X": 381, "Y": null, - "Width": 30, + "Width": -11, "Height": null, "Image": null, "FontSize": null, @@ -431,7 +431,7 @@ "VisualName": null, "X": 418, "Y": null, - "Width": 56, + "Width": 8, "Height": null, "Image": null, "FontSize": null, @@ -471,7 +471,7 @@ "VisualName": null, "X": 592, "Y": null, - "Width": 30, + "Width": -37, "Height": null, "Image": null, "FontSize": null, diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_1.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_1.json deleted file mode 100644 index 27efbab2b..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_1.json +++ /dev/null @@ -1,244 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 51, - 52, - 53, - 54, - 71, - 77, - 99 - - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - - "30": { - "tag": 30, - - "margin_left": 7.0 - }, - //home - //"32": { - // "tag": 32, - - // "margin_left": 7.0 - //}, - - //Number lock - "34": { - "tag": 34, - "margin_left": 7 - }, - "35": { - "tag": 35, - "margin_left": 7 - }, - "36": { - "tag": 36, - "margin_left": 7 - }, - "37": { - "tag": 37, - "margin_left": 7, - "line_break": true - }, - - - - "50": { - "line_break": null, - "width": 30 - }, - "51": { - "margin_left": 7, - "width": 30 - }, - //number 7 - "55": { - "tag": 55, - "margin_left": 62 - }, - //number 8 - "56": { - "tag": 56, - "margin_left": 7 - }, - - //number 9 - "57": { - "tag": 57, - "margin_left": 7 - }, - - //+ - "58": { - "margin_left": 7, - "line_break": true - - - }, - - - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0 - }, - "73": { - "margin_left": 7 - }, - //number 6 - "75": { - "line_break": true - }, - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0 - }, - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 57 - }, - - //"↑" - "89": { - "tag": 89, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - //Number enter - "93": { - "line_break": true - }, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": null - - }, - "105": { - "margin_left": 7.0, - "width": 30 - }, - "106": { - "line_break": true - } - - - }, - - "included_features": [ - "keyboard_numpad_left_bottom_features.json", - //"generic_laptop_numpad_right_bottom_features.json", - "keyboard101_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_2.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_2.json deleted file mode 100644 index c9abbe256..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2ND_35X_2.json +++ /dev/null @@ -1,258 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 51, - 52, - 53, - 54, - - - 99 - - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - - "30": { - "tag": 30, - - "margin_left": 7.0 - }, - //home - //"32": { - // "tag": 32, - - // "margin_left": 7.0 - //}, - - //Number lock - "34": { - "tag": 34, - "margin_left": 7 - }, - "35": { - "tag": 35, - "margin_left": 7 - }, - "36": { - "tag": 36, - "margin_left": 7 - }, - "37": { - "tag": 37, - "margin_left": 7, - "line_break": true - }, - - - - "50": { - "line_break": null, - "width": 30 - }, - "51": { - "margin_left": 7, - "width": 30 - }, - //number 7 - "55": { - "tag": 55, - "margin_left": 62 - }, - //number 8 - "56": { - "tag": 56, - "margin_left": 7 - }, - - //number 9 - "57": { - "tag": 57, - "margin_left": 7 - }, - - //+ - "58": { - "margin_left": 7, - "line_break": true - - - }, - - //key ~ - "71": { - "visualName": "~", - "tag": 71 - - }, - //ENTER - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - "73": { - "margin_left": 7 - }, - //number 6 - "75": { - "line_break": true - }, - //left shift - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0 - }, - // \ - "77": { - "tag": 77, - "line_break": null - - }, - - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 57 - }, - - //"↑" - "89": { - "tag": 89, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - //Number enter - "93": { - "line_break": true - }, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": null - - }, - "105": { - "margin_left": 7.0, - "width": 30 - }, - "106": { - "line_break": true - } - - - }, - - "included_features": [ - "keyboard_numpad_left_bottom_features.json" - - //"keyboard102_numpad_right_features.json" - - ] -} \ 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/Uniwill2P1_550_BR.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_BR.json deleted file mode 100644 index 715890462..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_BR.json +++ /dev/null @@ -1,239 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 73,74,75, - 90,91,92,93, - 99, - 105,106 - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - "30": { - "visualName": "←", - "tag": 30, - "width": 30, - "line_break": true, - "margin_left": 44.0 - }, - - - - "50": { - "line_break": true, - "width": 30 - }, - "51": { - "margin_left": 7, - - "width": 30 - }, - - //key ~ - "71": { - "visualName": "]", - - "tag": 71 - - }, - //ENTER - "72": { - "tag": 72, - "line_break": true, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - //"73": { - // "margin_left": 7 - //}, - ////number 6 - //"75": { - // "line_break": true - //}, - //left shift - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0 - }, - // \ - "77": { - "tag": 77, - "line_break": null - - }, - - "85": { - "tag": 85, - - "width": 28 - }, - - "86": { - "tag": 86, - - "width": 28 - }, - "87": { - "tag": 87, - - "width": 28 - }, - - //right shift - "88": { - "font_size": 10.0, - "tag": 88, - "line_break": null, - "width": 28 - }, - - //"↑" - "89": { - "tag": 89, - "line_break": true, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": true - - } - //"105": { - // "margin_left": 7.0, - // "width": 30 - //}, - //"106": { - // "line_break": true - //} - - - }, - - "included_features": [ - "keyboard21br_numpad_left_bottom_features.json" , - //"keyboard102_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_JP.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_JP.json deleted file mode 100644 index b90998420..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_JP.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 73,74,75, - 90,91,92,93, - 99, - 100, - 105, - 106, - 153 - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - "30": { - "tag": 30, - "width": 30, - "line_break": true, - "margin_left": 7.0 - }, - - - - "50": { - "line_break": true, - "width": 30 - }, - "51": { - "margin_left": 7, - - "width": 30 - }, - - //key ~ - "71": { - "visualName": "]", - - "tag": 71 - - }, - //ENTER - "72": { - "tag": 72, - "line_break": true, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - //"73": { - // "margin_left": 7 - //}, - ////number 6 - //"75": { - // "line_break": true - //}, - //left shift - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 68.0, - "height": 30.0, - "font_size": 12.0 - }, - // \ - "77": { - "tag": 77, - "line_break": null - - }, - - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 30 - }, - - //"↑" - "89": { - "tag": 89, - "line_break": true, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": true - - } - //"105": { - // "margin_left": 7.0, - // "width": 30 - //}, - //"106": { - // "line_break": true - //} - - - }, - - "included_features": [ - "keyboard21jp_numpad_left_bottom_features.json" , - //"keyboard102_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_UK.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_UK.json deleted file mode 100644 index cefbb846e..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_UK.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 73,74,75, - 90,91,92,93, - 99, - 105,106 - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - "30": { - "tag": 30, - "line_break": true, - "margin_left": 7.0 - }, - - - - "50": { - "line_break": true, - "width": 30 - }, - "51": { - "margin_left": 7, - - "width": 30 - }, - - //key ~ - "71": { - "visualName": "~", - - "tag": 71 - - }, - //ENTER - "72": { - "tag": 72, - "line_break": true, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - //"73": { - // "margin_left": 7 - //}, - ////number 6 - //"75": { - // "line_break": true - //}, - //left shift - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0 - }, - // \ - "77": { - "tag": 77, - "line_break": null - - }, - - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 57 - }, - - //"↑" - "89": { - "tag": 89, - "line_break": true, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": true - - }, - //"105": { - // "margin_left": 7.0, - // "width": 30 - //}, - //"106": { - // "line_break": true - //} - - - }, - - "included_features": [ - "keyboard21_numpad_left_bottom_features.json" , - //"keyboard102_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_US.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_US.json deleted file mode 100644 index ae6e72223..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P1_550_US.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 71, - 73, - 74, - 75, - 77, - 90, - 91, - 92, - 93, - 99, - 105, - 106 - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - "30": { - "tag": 30, - "line_break": true, - "margin_left": 7.0 - }, - - - - "50": { - "line_break": true, - "width": 30 - }, - "51": { - "margin_left": 7, - - "width": 30 - }, - - //key ~ - "71": { - "visualName": "~", - - "tag": 71 - - }, - //ENTER - "72": { - "tag": 72, - "line_break": true, - "margin_left": 7.0, - "margin_top": 0, - "width": 76.0, - "height": 30.0, - "font_size": 12.0 - }, - //"73": { - // "margin_left": 7 - //}, - ////number 6 - //"75": { - // "line_break": true - //}, - //left shift - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 77.0, - "height": 30.0, - "font_size": 12.0 - }, - // \ - "77": { - "tag": 77, - "line_break": null - - }, - - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 57 - }, - - //"↑" - "89": { - "tag": 89, - "line_break": true, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": true - - } - //"105": { - // "margin_left": 7.0, - // "width": 30 - //}, - //"106": { - // "line_break": true - //} - - - }, - - "included_features": [ - "keyboard21_numpad_left_bottom_features.json", - "keyboard21us_numpad_right_features.json" - - ] -} \ 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/DeviceLayouts/Keyboard/Uniwill2P2_650_BR.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_BR.json deleted file mode 100644 index 7632afa66..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_BR.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 37, - 51, - 52, - 53, - - 54, - 58, - - - 93, - 99 - - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - //black space - "30": { - "visualName": "←", - "tag": 30, - "width": 30, - "margin_left": 44.0 - }, - - - //Number lock - "34": { - "tag": 34, - "margin_left": 7 - }, - "35": { - "tag": 35, - "margin_left": 7 - }, - "36": { - "tag": 36, - "line_break": true, - "margin_left": 7 - }, - // - - //"37": { - // "tag": 37, - // "margin_left": 7, - // "line_break": true - //}, - - - - "50": { - "line_break": null, - "width": 30 - }, - "51": { - "margin_left": 7, - "width": 30 - }, - //number 7 - "55": { - "tag": 55, - "margin_left": 62 - }, - //number 8 - "56": { - "tag": 56, - "margin_left": 7 - }, - - //number 9 - "57": { - "tag": 57, - "line_break": true, - "margin_left": 7 - }, - - ////+ - //"58": { - // "margin_left": 7, - // "line_break": true - - - //}, - - - //ENTER - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - "73": { - "margin_left": 7 - }, - //number 6 - "75": { - "line_break": true - }, - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0 - }, - - "85": { - "tag": 85, - - "width": 28 - }, - - "86": { - "tag": 86, - - "width": 28 - }, - - "87": { - "tag": 87, - - "width": 28 - }, - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 28, - "margin_left": 7 - }, - - //"↑" - "89": { - "tag": 89, - "margin_left": 5 - }, - "90": { - "margin_left": 7.0 - }, - "92": { - "line_break": true - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": null - - }, - "105": { - "margin_left": 7.0, - "width": 30 - }, - "106": { - "line_break": true - } - - - }, - - "included_features": [ - "keyboard22br_numpad_left_bottom_features.json" - //"generic_laptop_numpad_right_bottom_features.json", - //"keyboard101_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_JP.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_JP.json deleted file mode 100644 index c2179def9..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_JP.json +++ /dev/null @@ -1,257 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 37, - - 52, - 53, - 54, - - 58, - - - 93, - 99, - 100, - 153 - - - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - //black space - "30": { - "visualName": "←", - "tag": 30, - "width": 30, - "margin_left": 7.0 - }, - - - //Number lock - "34": { - "tag": 34, - "margin_left": 7 - }, - "35": { - "tag": 35, - "margin_left": 7 - }, - "36": { - "tag": 36, - "line_break": true, - "margin_left": 7 - }, - // - - //"37": { - // "tag": 37, - // "margin_left": 7, - // "line_break": true - //}, - - - - "50": { - "line_break": null, - "width": 30 - }, - "51": { - "margin_left": 7, - "width": 30 - }, - //number 7 - "55": { - "tag": 55, - "margin_left": 62 - }, - //number 8 - "56": { - "tag": 56, - "margin_left": 7 - }, - - //number 9 - "57": { - "tag": 57, - "line_break": true, - "margin_left": 7 - }, - - ////+ - //"58": { - // "margin_left": 7, - // "line_break": true - - - //}, - - - //ENTER - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - "73": { - "margin_left": 7 - }, - //number 6 - "75": { - "line_break": true - }, - - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 70.0, - "height": 30.0, - "font_size": 12.0 - }, - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 30, - "margin_left": 7 - }, - - //"↑" - "89": { - "tag": 89, - "margin_left": 5 - }, - "90": { - "margin_left": 7.0 - }, - "92": { - "line_break": true - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - //"100": { - // "visualName": "App", - // "tag": 100, - // "margin_left": 7, - // "width": 30 - //}, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": null - - }, - "105": { - "margin_left": 7.0, - "width": 30 - }, - "106": { - "line_break": true - } - - - }, - - "included_features": [ - "keyboard22jp_numpad_left_bottom_features.json", - - //"generic_laptop_numpad_right_bottom_features.json", - //"keyboard101_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_UK.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_UK.json deleted file mode 100644 index 2ee7cbcf4..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_UK.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 37, - 51, - 52, - 53, - - 54, - 58, - - - 93, - 99 - - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - - "30": { - "tag": 30, - - "margin_left": 7.0 - }, - //home - //"32": { - // "tag": 32, - - // "margin_left": 7.0 - //}, - - //Number lock - "34": { - "tag": 34, - "margin_left": 7 - }, - "35": { - "tag": 35, - "margin_left": 7 - }, - "36": { - "tag": 36, - "line_break": true, - "margin_left": 7 - }, - "37": { - "tag": 37, - "margin_left": 7, - "line_break": true - }, - - - - "50": { - "line_break": null, - "width": 30 - }, - "51": { - "margin_left": 7, - "width": 30 - }, - //number 7 - "55": { - "tag": 55, - "margin_left": 62 - }, - //number 8 - "56": { - "tag": 56, - "margin_left": 7 - }, - - //number 9 - "57": { - "tag": 57, - "line_break": true, - "margin_left": 7 - }, - - //+ - "58": { - "margin_left": 7, - "line_break": true - - - }, - - //key ~ - "71": { - "visualName": "~", - "tag": 71 - - }, - //ENTER - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": -40.0, - "width": 37.0, - "height": 70.0, - "font_size": 12.0 - }, - "73": { - "margin_left": 7 - }, - //number 6 - "75": { - "line_break": true - }, - //left shift - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 41.0, - "height": 30.0, - "font_size": 12.0 - }, - // \ - "77": { - "tag": 77, - "line_break": null - - }, - - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 57 - }, - - //"↑" - "89": { - "tag": 89, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - "92": { - "line_break": true, - "margin_left": 7.0 - }, - - - //Number enter - "93": { - "line_break": true - }, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": null - - }, - "105": { - "margin_left": 7.0, - "width": 30 - }, - "106": { - "line_break": true - } - - - }, - - "included_features": [ - "keyboard22usuk_numpad_left_bottom_features.json", - - //"keyboard102_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_US.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_US.json deleted file mode 100644 index 4eaeff035..000000000 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Uniwill2P2_650_US.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "keys_to_remove": [ - 14, - 15, - 16, - 31, - 32, - 33, - 37, - 51, - 52, - 53, - - 54, - 58, - 71, - 77, - 93, - 99 - - - ], - "key_modifications": { - "2": { - "tag": 2, - "margin_left": 7.0 - }, - "3": { - "tag": 3, - "margin_left": 7.0 - }, - "4": { - "tag": 4, - "margin_left": 7.0 - }, - "5": { - "tag": 5, - "margin_left": 7.0 - }, - "6": { - "tag": 6, - "margin_left": 7.0 - }, - "7": { - "tag": 7, - "margin_left": 7.0 - }, - "8": { - "tag": 8, - "margin_left": 7.0 - }, - "9": { - "tag": 9, - "margin_left": 7.0 - }, - "10": { - "tag": 10, - "margin_left": 7.0 - }, - "11": { - "tag": 11, - "margin_left": 7.0 - }, - "12": { - "tag": 12, - "margin_left": 7.0 - }, - "13": { - "tag": 13, - "line_break": true, - "margin_left": 7.0 - }, - - - "30": { - "tag": 30, - - "margin_left": 7.0 - }, - //home - //"32": { - // "tag": 32, - - // "margin_left": 7.0 - //}, - - //Number lock - "34": { - "tag": 34, - "margin_left": 7 - }, - "35": { - "tag": 35, - "margin_left": 7 - }, - "36": { - "tag": 36, - "line_break": true, - "margin_left": 7 - }, - // - - //"37": { - // "tag": 37, - // "margin_left": 7, - // "line_break": true - //}, - - - - "50": { - "line_break": null, - "width": 30 - }, - "51": { - "margin_left": 7, - "width": 30 - }, - //number 7 - "55": { - "tag": 55, - "margin_left": 62 - }, - //number 8 - "56": { - "tag": 56, - "margin_left": 7 - }, - - //number 9 - "57": { - "tag": 57, - "line_break": true, - "margin_left": 7 - }, - - ////+ - //"58": { - // "margin_left": 7, - // "line_break": true - - - //}, - - - "72": { - "tag": 72, - "line_break": null, - "margin_left": 7.0, - "margin_top": 0.0, - "width": 74.0, - "height": 30.0, - "font_size": 12.0 - }, - "73": { - "margin_left": 7 - }, - //number 6 - "75": { - "line_break": true - }, - "76": { - "tag": 76, - "margin_left": 0.0, - "margin_top": 0.0, - "width": 78.0, - "height": 30.0, - "font_size": 12.0 - }, - //right shift - "88": { - "tag": 88, - "line_break": null, - "width": 57 - }, - - //"↑" - "89": { - "tag": 89, - "margin_left": 7 - }, - "90": { - "margin_left": 7.0 - }, - "92": { - "line_break": true - }, - ////Number enter - //"93": { - // "line_break": true - //}, - //LeftControl - "94": { - "tag": 94, - "width": 41 - }, - "95": { - "tag": 95, - "margin_left": 44, - "width": 30 - }, - "96": { - "tag": 96, - "margin_left": 7, - "width": 30 - }, - "97": { - "tag": 97, - "width": 178 - }, - "98": { - "tag": 98, - "margin_left": 7, - "width": 30 - }, - "100": { - "visualName": "App", - "tag": 100, - "margin_left": 7, - "width": 30 - }, - //Rith control - "101": { - "tag": 101, - "margin_left": 7, - "width": 58 - }, - "102": { - "tag": 102, - "margin_left": 7.0 - - }, - "104": { - "tag": 104, - "line_break": null - - }, - "105": { - "margin_left": 7.0, - "width": 30 - }, - "106": { - "line_break": true - } - - - }, - - "included_features": [ - "keyboard22usuk_numpad_left_bottom_features.json", - "keyboard22us_numpad_right_features.json", - //"generic_laptop_numpad_right_bottom_features.json", - //"keyboard101_numpad_right_features.json" - - ] -} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json index 1c6f25ef0..4adb42d18 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop.json @@ -184,7 +184,7 @@ "X": 486, "Y": 185, "Width": null, - "Height": 13, + "Height": -17, "Image": null, "FontSize": null, "Enabled": null @@ -193,7 +193,7 @@ "VisualName": null, "X": null, "Y": null, - "Width": 41, + "Width": -10, "Height": null, "Image": null, "FontSize": null, @@ -203,7 +203,7 @@ "VisualName": null, "X": 85, "Y": null, - "Width": 30, + "Width": -9, "Height": null, "Image": null, "FontSize": null, @@ -213,7 +213,7 @@ "VisualName": null, "X": 122, "Y": null, - "Width": 30, + "Width": -12, "Height": null, "Image": null, "FontSize": null, @@ -223,7 +223,7 @@ "VisualName": null, "X": 159, "Y": null, - "Width": 178, + "Width": -30, "Height": null, "Image": null, "FontSize": null, @@ -233,7 +233,7 @@ "VisualName": null, "X": 344, "Y": null, - "Width": 30, + "Width": -11, "Height": null, "Image": null, "FontSize": null, @@ -243,7 +243,7 @@ "VisualName": null, "X": 418, "Y": null, - "Width": 30, + "Width": -18, "Height": null, "Image": null, "FontSize": null, @@ -253,7 +253,7 @@ "VisualName": null, "X": 455, "Y": null, - "Width": 24, + "Width": -6, "Height": null, "Image": null, "FontSize": null, @@ -264,7 +264,7 @@ "X": 486, "Y": 202, "Width": null, - "Height": 13, + "Height": -17, "Image": null, "FontSize": null, "Enabled": null @@ -273,7 +273,7 @@ "VisualName": null, "X": 523, "Y": null, - "Width": 24, + "Width": -6, "Height": null, "Image": null, "FontSize": null, diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json index 93960253f..dbed1a2bc 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/generic_laptop_numpad.json @@ -192,6 +192,16 @@ "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, @@ -262,22 +272,12 @@ "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": 13, + "Height": -17, "Image": null, "FontSize": null, "Enabled": null @@ -326,7 +326,7 @@ "VisualName": null, "X": null, "Y": null, - "Width": 41, + "Width": -10, "Height": null, "Image": null, "FontSize": null, @@ -336,7 +336,7 @@ "VisualName": null, "X": 85, "Y": null, - "Width": 30, + "Width": -9, "Height": null, "Image": null, "FontSize": null, @@ -346,7 +346,7 @@ "VisualName": null, "X": 122, "Y": null, - "Width": 30, + "Width": -12, "Height": null, "Image": null, "FontSize": null, @@ -356,7 +356,7 @@ "VisualName": null, "X": 159, "Y": null, - "Width": 178, + "Width": -30, "Height": null, "Image": null, "FontSize": null, @@ -366,7 +366,7 @@ "VisualName": null, "X": 344, "Y": null, - "Width": 30, + "Width": -11, "Height": null, "Image": null, "FontSize": null, @@ -376,7 +376,7 @@ "VisualName": null, "X": 418, "Y": null, - "Width": 30, + "Width": -18, "Height": null, "Image": null, "FontSize": null, @@ -386,7 +386,7 @@ "VisualName": null, "X": 455, "Y": null, - "Width": 24, + "Width": -6, "Height": null, "Image": null, "FontSize": null, @@ -397,7 +397,7 @@ "X": 486, "Y": 202, "Width": null, - "Height": 13, + "Height": -17, "Image": null, "FontSize": null, "Enabled": null @@ -406,7 +406,7 @@ "VisualName": null, "X": 523, "Y": null, - "Width": 24, + "Width": -6, "Height": null, "Image": null, "FontSize": null, diff --git a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json index 1c6f25ef0..4adb42d18 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/razer_blade.json @@ -184,7 +184,7 @@ "X": 486, "Y": 185, "Width": null, - "Height": 13, + "Height": -17, "Image": null, "FontSize": null, "Enabled": null @@ -193,7 +193,7 @@ "VisualName": null, "X": null, "Y": null, - "Width": 41, + "Width": -10, "Height": null, "Image": null, "FontSize": null, @@ -203,7 +203,7 @@ "VisualName": null, "X": 85, "Y": null, - "Width": 30, + "Width": -9, "Height": null, "Image": null, "FontSize": null, @@ -213,7 +213,7 @@ "VisualName": null, "X": 122, "Y": null, - "Width": 30, + "Width": -12, "Height": null, "Image": null, "FontSize": null, @@ -223,7 +223,7 @@ "VisualName": null, "X": 159, "Y": null, - "Width": 178, + "Width": -30, "Height": null, "Image": null, "FontSize": null, @@ -233,7 +233,7 @@ "VisualName": null, "X": 344, "Y": null, - "Width": 30, + "Width": -11, "Height": null, "Image": null, "FontSize": null, @@ -243,7 +243,7 @@ "VisualName": null, "X": 418, "Y": null, - "Width": 30, + "Width": -18, "Height": null, "Image": null, "FontSize": null, @@ -253,7 +253,7 @@ "VisualName": null, "X": 455, "Y": null, - "Width": 24, + "Width": -6, "Height": null, "Image": null, "FontSize": null, @@ -264,7 +264,7 @@ "X": 486, "Y": 202, "Width": null, - "Height": 13, + "Height": -17, "Image": null, "FontSize": null, "Enabled": null @@ -273,7 +273,7 @@ "VisualName": null, "X": 523, "Y": null, - "Width": 24, + "Width": -6, "Height": null, "Image": null, "FontSize": null, diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index cf15e2c0e..c0d5ed8af 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -1064,39 +1064,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -1238,34 +1205,10 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + PreserveNewest - + PreserveNewest diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs index 598638988..11358ec90 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs @@ -126,8 +126,8 @@ public DeviceKeyModifier(DeviceKeyConfiguration baseConf, DeviceKeyConfiguration if (updateConf.Key.VisualName != baseConf.Key.VisualName) VisualName = updateConf.Key.VisualName; if (updateConf.X != baseConf.X) X = updateConf.X; if (updateConf.Y != baseConf.Y) Y = updateConf.Y; - if (updateConf.Height != baseConf.Height) Height = updateConf.Height; - if (updateConf.Width != baseConf.Width) Width = updateConf.Width; + if (updateConf.Height != baseConf.Height) Height = updateConf.Height - baseConf.Height; + if (updateConf.Width != baseConf.Width) Width = updateConf.Width - baseConf.Width; if (updateConf.FontSize != baseConf.FontSize) FontSize = updateConf.FontSize; if (updateConf.Enabled != baseConf.Enabled) Enabled = updateConf.Enabled; if (updateConf.Image != baseConf.Image) Image = updateConf.Image; @@ -262,8 +262,8 @@ public void ApplyModifier(DeviceKeyModifier modifier) } if (modifier.X != null) X = modifier.X.Value; if (modifier.Y != null) Y = modifier.Y.Value; - if (modifier.Height != null) Height = modifier.Height.Value; - if (modifier.Width != null) Width = modifier.Width.Value; + if (modifier.Height != null) Height += modifier.Height.Value; + if (modifier.Width != null) Width += modifier.Width.Value; if (modifier.FontSize != null) FontSize = modifier.FontSize; if (modifier.Enabled != null) Enabled = modifier.Enabled; if (modifier.Image != null) Image = modifier.Image; diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index e16cc993c..981a6db63 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -15,7 +15,13 @@ namespace Aurora.Settings { - + public enum KeyboardPhysicalLayout + { + //[Description("ANSI")] + ANSI, + ISO, + JIS + } public class VirtualKeyboardConfiguration { public bool IsNewFormat = false; @@ -96,17 +102,7 @@ public List LoadLayout() //TODO //if (!File.Exists(layoutPath)) // LoadDefault(); - var fileName = "Plain Keyboard\\" + Config.SelectedKeyboardLayout + ".json"; - var layoutPath = Path.Combine(layoutsPath, GetFolder(), fileName); - if (File.Exists(layoutPath)) - { - string c = File.ReadAllText(layoutPath, Encoding.UTF8); - NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - Keys = keyboard.Keys.ToDictionary(k => k.Tag, k => k); - Keys.Values.ToList().ForEach(k => k.Key.DeviceId = Config.Id); - - } /*var layoutType = "jpn"; @@ -123,84 +119,137 @@ public List LoadLayout() fileName = "Plain Keyboard\\" + layoutType + "_layout.json"; File.WriteAllText(Path.Combine(layoutsPath, "Keyboard", fileName), keyboardContent, Encoding.UTF8);*/ - try + if (Config.Type == 0) { - if (Config.Type == 0) + var keyboardConfig = new KeyboardConfig(Config); + string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); + VirtualKeyboardConfiguration layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + if (layoutConfig.IsNewFormat == true) { - string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); - VirtualKeyboardConfiguration layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - if (layoutConfig.IsNewFormat == true) - throw new Exception(); - - //AdjustKeys - var adjustKeys = layoutConfig.key_modifications; - Keys.Values.ToList().FindAll(key => adjustKeys.ContainsKey((int)key.Tag)).ForEach(k => k.UpdateFromOtherKey(adjustKeys[k.Tag])); - foreach (var keyTag in layoutConfig.keys_to_remove) - { - Keys.Remove(keyTag); - } - + var keys = LoadKeyboardPhysicalLayout(keyboardConfig.PhysicalLayoutPath); - NormalizeKeys(); + var keyboardLayout = LoadDeviceLayout(keyboardConfig.LayoutPath); + keyboardLayout.ApplyConfig(keys); - foreach (string feature in layoutConfig.included_features) + if (keyboardConfig.SelectedKeyboardLayout == KeyboardPhysicalLayout.JIS) { - string feature_path = Path.Combine(layoutsPath, GetFolder(), "Extra Features", feature); - - if (File.Exists(feature_path)) + foreach (var key in keyboardLayout.jis_key_modifications) { - string feature_content = File.ReadAllText(feature_path, Encoding.UTF8); - VirtualGroup feature_config = JsonConvert.DeserializeObject(feature_content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - - AddFeature(feature_config.grouped_keys.ToArray(), feature_config.origin_region); - + if (keys.ContainsKey(key.Key)) + { + keys[key.Key].ApplyModifier(key.Value); + } } } - NormalizeKeys(); + NormalizeKeys(keys); + return keys.Values.ToList(); } - else - { - if (!string.IsNullOrWhiteSpace(layoutConfigPath) && File.Exists(layoutConfigPath)) - { - string mouseConfigContent = File.ReadAllText(layoutConfigPath, Encoding.UTF8); - VirtualGroup mouseConfig = JsonConvert.DeserializeObject(mouseConfigContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - if (mouseConfig.origin_region == null) - throw new Exception(); - AddFeature(mouseConfig.grouped_keys.ToArray(), mouseConfig.origin_region); - NormalizeKeys(); - } - } - } - catch (Exception) - { - string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); - KeycapGroupConfiguration layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + + Keys = LoadKeyboardPhysicalLayout(keyboardConfig.PhysicalLayoutPath); //AdjustKeys + var adjustKeys = layoutConfig.key_modifications; + Keys.Values.ToList().FindAll(key => adjustKeys.ContainsKey((int)key.Tag)).ForEach(k => k.UpdateFromOtherKey(adjustKeys[k.Tag])); foreach (var keyTag in layoutConfig.keys_to_remove) { Keys.Remove(keyTag); } - foreach (var key in layoutConfig.key_modifications) + + + NormalizeKeys(Keys); + + foreach (string feature in layoutConfig.included_features) { - if (Keys.ContainsKey(key.Key)) + string feature_path = Path.Combine(layoutsPath, GetFolder(), "Extra Features", feature); + + if (File.Exists(feature_path)) { - Keys[key.Key].ApplyModifier(key.Value); + string feature_content = File.ReadAllText(feature_path, Encoding.UTF8); + VirtualGroup feature_config = JsonConvert.DeserializeObject(feature_content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + + AddFeature(feature_config.grouped_keys.ToArray(), feature_config.origin_region); + } } - foreach (var key in layoutConfig.key_to_add) + + NormalizeKeys(Keys); + } + else + { + if (!string.IsNullOrWhiteSpace(layoutConfigPath) && File.Exists(layoutConfigPath)) { - Keys[key.Key] = key.Value; + string mouseConfigContent = File.ReadAllText(layoutConfigPath, Encoding.UTF8); + VirtualGroup mouseConfig = JsonConvert.DeserializeObject(mouseConfigContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + if (mouseConfig.origin_region == null) + { + Dictionary keys = new Dictionary(); + var deviceConfig = LoadDeviceLayout(Config.LayoutPath); + deviceConfig.ApplyConfig(keys); + return keys.Values.ToList(); + } + AddFeature(mouseConfig.grouped_keys.ToArray(), mouseConfig.origin_region); + NormalizeKeys(Keys); } - - NormalizeKeys(); } + } return Keys.Values.ToList(); } + + private Dictionary LoadKeyboardPhysicalLayout(string physicalLayoutPath) + { + Dictionary keys = new Dictionary(); + if (File.Exists(physicalLayoutPath)) + { + string c = File.ReadAllText(physicalLayoutPath, Encoding.UTF8); + NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + + keys = keyboard.Keys.ToDictionary(k => k.Tag, k => k); + } + return keys; + } + private KeycapGroupConfiguration LoadDeviceLayout(string layoutConfigPath) + { + if (File.Exists(layoutConfigPath)) + { + string content = File.ReadAllText(layoutConfigPath, Encoding.UTF8); + var layoutConfig = JsonConvert.DeserializeObject(content, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); + if (layoutConfig.IsNewFormat == true) + return layoutConfig; + } + return new KeycapGroupConfiguration(); + } + + private KeycapGroupConfiguration CalcKeyboardKeyConfiguration(List saveKeys) + { + + KeycapGroupConfiguration config = LoadDeviceLayout(Config.LayoutPath); + var keyboardConfig = Config as KeyboardConfig; + var defaultLayout = LoadKeyboardPhysicalLayout(keyboardConfig.PhysicalLayoutPath); + + if (keyboardConfig.SelectedKeyboardLayout != KeyboardPhysicalLayout.JIS) + { + config.UpdateConfig(saveKeys, defaultLayout); + } + else + { + config.ApplyConfig(defaultLayout); + config.jis_key_modifications.Clear(); + foreach (var key in saveKeys) + { + if (defaultLayout[key.Tag] != key) + { + config.jis_key_modifications[key.Tag] = new DeviceKeyModifier(defaultLayout[key.Tag], key); + } + } + + } + + return config; + } public void SaveLayout(List layoutKey, Point offset) { List saveKeys = new List(); @@ -212,44 +261,20 @@ public void SaveLayout(List layoutKey, Point offset) conf.Y += (int)offset.Y; saveKeys.Add(conf); } - KeycapGroupConfiguration config = new KeycapGroupConfiguration(); - Dictionary defaultLayout = new Dictionary(); - if (!String.IsNullOrWhiteSpace(Config.SelectedKeyboardLayout)) + if (Config.Type == 0) { - var fileName = "Plain Keyboard\\" + Config.SelectedKeyboardLayout + ".json"; - var layoutPath = Path.Combine(layoutsPath, GetFolder(), fileName); - if (File.Exists(layoutPath)) - { - string c = File.ReadAllText(layoutPath, Encoding.UTF8); - NewKeyboardLayout keyboard = JsonConvert.DeserializeObject(c, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace, Formatting = Formatting.Indented }); - - defaultLayout = keyboard.Keys.ToDictionary(k => k.Tag, k => k); - //defaultLayout.Values.ToList().ForEach(k => k.Key.DeviceId = DeviceId); - } + config = CalcKeyboardKeyConfiguration(saveKeys); } - foreach (var key in saveKeys) + else { - if (defaultLayout.ContainsKey(key.Tag)) - { - if (defaultLayout[key.Tag] != key) - { - config.key_modifications[key.Tag] = new DeviceKeyModifier(defaultLayout[key.Tag], key); - } - defaultLayout.Remove(key.Tag); - } - else - { - config.key_to_add[key.Tag] = key; - } + config.key_to_add = saveKeys.ToDictionary(k => k.Tag, k => k); } - config.keys_to_remove = defaultLayout.Keys.ToArray(); + var content = JsonConvert.SerializeObject(config, Formatting.Indented); File.WriteAllText(Path.Combine(layoutsPath, GetFolder(), Config.SelectedLayout + ".json"), content, Encoding.UTF8); } - - public void AddFeature(KeyboardKey[] keys, KeyboardRegion? insertion_region = KeyboardRegion.TopLeft) { double location_x = 0.0D; @@ -299,14 +324,14 @@ public void AddFeature(KeyboardKey[] keys, KeyboardRegion? insertion_region = Ke Region.Height += added_height; //NormalizeKeys(); } - protected void NormalizeKeys() + protected void NormalizeKeys(Dictionary keys) { int x_correction = 0; int y_correction = 0; int layout_height = 0; int layout_width = 0; - foreach (var key in Keys.Values) + foreach (var key in keys.Values) { if (key.X < x_correction) x_correction = key.X; @@ -314,7 +339,7 @@ protected void NormalizeKeys() if (key.Y < y_correction) y_correction = key.Y; } - foreach (var key in Keys.Values) + foreach (var key in keys.Values) { key.Y -= y_correction; key.X -= x_correction; @@ -377,29 +402,74 @@ public class KeycapGroupConfiguration [JsonProperty("key_to_add")] public Dictionary key_to_add = new Dictionary(); + [JsonProperty("jis_key_modifications")] + public Dictionary jis_key_modifications = new Dictionary(); + public KeycapGroupConfiguration() { } + public void UpdateConfig(List saveKeys, Dictionary baseKeys) + { + key_modifications.Clear(); + key_to_add.Clear(); + foreach (var key in saveKeys) + { + if (baseKeys.ContainsKey(key.Tag)) + { + if (baseKeys[key.Tag] != key) + { + key_modifications[key.Tag] = new DeviceKeyModifier(baseKeys[key.Tag], key); + } + baseKeys.Remove(key.Tag); + } + else + { + key_to_add[key.Tag] = key; + } + } + keys_to_remove = baseKeys.Keys.ToArray(); + } + public void ApplyConfig(Dictionary keys) + { + //AdjustKeys + foreach (var keyTag in keys_to_remove) + { + keys.Remove(keyTag); + } + foreach (var key in key_modifications) + { + if (keys.ContainsKey(key.Key)) + { + keys[key.Key].ApplyModifier(key.Value); + } + } + foreach (var key in key_to_add) + { + keys[key.Key] = key.Value; + } + } } - - public class DeviceConfig { public int Id; public string SelectedLayout = ""; - public string SelectedKeyboardLayout = null; public int Type; public Point Offset = new Point(0, 0); public bool LightingEnabled = true; + [JsonIgnore] + protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + public DeviceConfig(DeviceConfig config) { Id = config.Id; SelectedLayout = config.SelectedLayout; - SelectedKeyboardLayout = config.SelectedKeyboardLayout; Type = config.Type; + ConfigurationChanged = config.ConfigurationChanged; + SaveConfiguration = config.SaveConfiguration; + DeleteConfiguration = config.DeleteConfiguration; } public DeviceConfig() @@ -423,6 +493,47 @@ public void Delete() { DeleteConfiguration?.Invoke(this); } + public void RefreshConfig() + { + ConfigurationChanged?.Invoke(); + } + + public virtual string LayoutPath => Path.Combine(layoutsPath, "Mouse", SelectedLayout + ".json"); + + } + + public class KeyboardConfig : DeviceConfig + { + public KeyboardPhysicalLayout SelectedKeyboardLayout = KeyboardPhysicalLayout.ANSI; + + public KeyboardConfig(DeviceConfig config) : base(config) + { + if(config is KeyboardConfig keyboardConfig) + SelectedKeyboardLayout = keyboardConfig.SelectedKeyboardLayout; + Type = 0; + } + + public KeyboardConfig() + { + Type = 0; + } + private string ConvertEnumToFileName() + { + switch (SelectedKeyboardLayout) + { + case KeyboardPhysicalLayout.ANSI: + return "ansi_layout"; + case KeyboardPhysicalLayout.ISO: + return "iso_layout"; + case KeyboardPhysicalLayout.JIS: + return "jpn_layout"; + default: + return ""; + } + } + public string PhysicalLayoutPath => Path.Combine(layoutsPath, "Keyboard\\Plain Keyboard\\" + ConvertEnumToFileName() + ".json"); + public override string LayoutPath => Path.Combine(layoutsPath, "Keyboard", SelectedLayout + ".json"); + } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index ab38e0c98..bbe5e981d 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -51,7 +51,7 @@ public Control_DeviceLayout(DeviceConfig config) } - private void ConfigChanged() + public void ConfigChanged() { Keys = LoadKeys(); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs index 312a6bf32..e2d27c343 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs @@ -190,7 +190,7 @@ private void DeviceLayout_MouseDoubleClick(object sender, MouseButtonEventArgs e { var layout = sender as Control_DeviceLayout; layout.ReleaseMouseCapture(); - Window_DeviceConfig configWindow = new Window_DeviceConfig(layout.DeviceConfig); + Window_DeviceConfig configWindow = new Window_DeviceConfig(layout); configWindow.Show(); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml index 74ead80b2..37c8bb1f3 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml @@ -1,7 +1,10 @@  + + + + + + + + + + + + @@ -30,7 +45,7 @@ - + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index c92dd4129..a973eb16a 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -22,13 +22,13 @@ namespace Aurora.Settings.DeviceLayoutViewer /// public partial class Window_DeviceConfig : Window { - private DeviceConfig _config; + private Control_DeviceLayout originalDeviceLayout; public DeviceConfig Config { - get { return _config; } + get { return deviceLayout.DeviceConfig; } set { - _config = value; + deviceLayout.DeviceConfig = value; LoadDeviceLayout(); } } @@ -45,16 +45,18 @@ public Control_Keycap SelectedKey _selectedKey.SelectionChanged(); } } - public Window_DeviceConfig(DeviceConfig config) + public Window_DeviceConfig(Control_DeviceLayout config) { InitializeComponent(); - Config = config; - LoadDeviceType(config.Type); + originalDeviceLayout = config; + deviceLayout.DeviceConfig = config.DeviceConfig; + deviceLayout.ConfigChanged(); + LoadDeviceType(Config.Type); this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; this.device_layout.SelectedItem = Config.SelectedLayout; layoutName.Text = Config.SelectedLayout; - if (config.SelectedKeyboardLayout != null) - this.keyboard_layout.SelectedItem = Config.SelectedKeyboardLayout; + if (Config is KeyboardConfig keyboardConfig) + this.keyboard_layout.SelectedItem = keyboardConfig.SelectedKeyboardLayout; DataContext = this; } private List GetBrandsName(string dicName) @@ -81,15 +83,16 @@ private void LoadDeviceType(int type) case 0: this.device_type.SelectedItem = "Keyboard"; this.device_layout.ItemsSource = GetBrandsName("Keyboard"); - this.keyboard_layout.ItemsSource = GetBrandsName("Keyboard\\Plain Keyboard"); this.keyboard_layout.Visibility = Visibility.Visible; this.keyboard_layout_tb.Visibility = Visibility.Visible; + Config = new KeyboardConfig(Config); break; default: this.device_type.SelectedItem = "Other Devices"; this.device_layout.ItemsSource = GetBrandsName("Mouse"); this.keyboard_layout.Visibility = Visibility.Collapsed; this.keyboard_layout_tb.Visibility = Visibility.Collapsed; + Config = new DeviceConfig(Config); break; } } @@ -113,9 +116,9 @@ private void device_layout_SelectionChanged(object sender, SelectionChangedEvent } private void keyboard_layout_SelectionChanged(object sender, SelectionChangedEventArgs e) { - if (IsLoaded) + if (IsLoaded && Config is KeyboardConfig keyboardConfig) { - Config.SelectedKeyboardLayout = this.keyboard_layout.SelectedItem.ToString(); + keyboardConfig.SelectedKeyboardLayout = (KeyboardPhysicalLayout)Enum.Parse(typeof(KeyboardPhysicalLayout), this.keyboard_layout.SelectedItem.ToString()); LoadDeviceLayout(); } } @@ -132,6 +135,7 @@ private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) private void okButton_Click(object sender, RoutedEventArgs e) { Config.Save(); + originalDeviceLayout.DeviceConfig = Config; Close(); } private void cancelButton_Click(object sender, RoutedEventArgs e) @@ -202,8 +206,7 @@ private void KeyMouseUp(object sender, MouseButtonEventArgs e) } private void LoadDeviceLayout() { - - deviceLayout.DeviceConfig = new DeviceConfig(Config); + Config.RefreshConfig(); foreach (var key in deviceLayout.KeyboardMap.Values) { key.MouseDown += KeyMouseDown; diff --git a/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs b/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs index 59d030e21..1e8461d3b 100755 --- a/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs +++ b/Project-Aurora/Project-Aurora/Utils/EnumUtils.cs @@ -333,19 +333,9 @@ public class IdleEffectsToStringVC : EnumToStringVC public IdleEffectsToStringVC() : base(IdleEffects.None) { } } - public class KbLayoutToStringVC : EnumToStringVC + public class KeyboardPhysicalLayoutToStringVC : EnumToStringVC { - public KbLayoutToStringVC() : base(PreferredKeyboardLocalization.None) { } - } - - public class KbBrandToStringVC : EnumToStringVC - { - public KbBrandToStringVC() : base(PreferredKeyboard.None) { } - } - - public class MouseBrandToStringVC : EnumToStringVC - { - public MouseBrandToStringVC() : base(PreferredMouse.None) { } + public KeyboardPhysicalLayoutToStringVC() : base(KeyboardPhysicalLayout.ANSI) { } } public class BitmapAccuracyToStringVC : EnumToStringVC From dfeb64e3ae549574eb12457af27f0a544882b6b6 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 19 May 2020 03:17:39 +0200 Subject: [PATCH 10/42] small fix --- .../Control_DeviceLayout.xaml.cs | 10 +++---- .../Window_DeviceConfig.xaml | 5 ++-- .../Window_DeviceConfig.xaml.cs | 27 ++++++++++--------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 5416077e1..1a4fa0463 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -54,16 +54,12 @@ public Control_DeviceLayout(DeviceConfig config) public void ConfigChanged() { - ConfigChanged(DeviceConfig); - } - public void ConfigChanged(DeviceConfig config) - { - DeviceLayout layout = new DeviceLayout(config); + DeviceLayout layout = new DeviceLayout(DeviceConfig); Keys = layout.LoadLayout(); - /*foreach(var key in Keys) + foreach(var key in Keys) { key.Key.DeviceId = DeviceConfig.Id; - }*/ + } } private void UserControl_Loaded(object sender, RoutedEventArgs e) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml index 37c8bb1f3..a2ad6aa1a 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml @@ -6,9 +6,8 @@ xmlns:enum="clr-namespace:Aurora.Settings" xmlns:EnumValueConverters="clr-namespace:Aurora.Utils" Title="Device Config" - MinHeight="100" - Height="500" - MinWidth="300" + MinHeight="100" MinWidth="300" + Height="500" Width="600" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False" WindowStartupLocation="CenterOwner"> diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index de42a9e90..a65998cd8 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -207,22 +207,23 @@ private void KeyMouseUp(object sender, MouseButtonEventArgs e) private void LoadDeviceLayout() { //Config.RefreshConfig(); - var config = Config; Task.Run(() => { - Dispatcher.Invoke(() => { deviceLayout.ConfigChanged(config); + Dispatcher.Invoke(() => { + deviceLayout.ConfigChanged(); - foreach (var key in deviceLayout.KeyboardMap.Values) - { - key.MouseDown += KeyMouseDown; - key.MouseMove += KeyMouseMove; - key.MouseUp += KeyMouseUp; - key.UpdateLayout(); - } - //deviceLayout.UpdateLayout(); - InitKeycapList(); - this.Width = deviceLayout.Width + 340; - this.KeyDown += OnKeyDownHandler; }); + foreach (var key in deviceLayout.KeyboardMap.Values) + { + key.MouseDown += KeyMouseDown; + key.MouseMove += KeyMouseMove; + key.MouseUp += KeyMouseUp; + key.UpdateLayout(); + } + //deviceLayout.UpdateLayout(); + InitKeycapList(); + this.Width = deviceLayout.Width + 340; + this.KeyDown += OnKeyDownHandler; + }); }); } private void InitKeycapList() From 1a3825f2ba0b9b986909aacd8f2257d1fb3db89d Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 20 May 2020 00:24:34 +0200 Subject: [PATCH 11/42] Fix exception when device layout offset was negative --- .../Settings/DeviceLayoutManager.cs | 16 +++ .../Control_DeviceLayoutPresenter.xaml.cs | 112 +++++++----------- .../Window_DeviceConfig.xaml.cs | 1 + 3 files changed, 58 insertions(+), 71 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 02e68e317..924894ff9 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -600,8 +600,24 @@ public void Load() } public void SaveConfiguration(DeviceConfig config) { + //if (DevicesConfig.SelectMany(dc => dc.Id )) DevicesConfig[config.Id] = config; + double baseline_x = double.MaxValue; + double baseline_y = double.MaxValue; + foreach (DeviceConfig dc in DevicesConfig.Values) + { + if (dc.Offset.X < baseline_x) + baseline_x = dc.Offset.X; + + if (dc.Offset.Y < baseline_y) + baseline_y = dc.Offset.Y; + } + foreach (DeviceConfig dc in DevicesConfig.Values) + { + dc.Offset = new Point((int)(dc.Offset.X - baseline_x), (int)(dc.Offset.Y - baseline_y)); + } + var fileName = "DevicesConfig.json"; var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); var content = JsonConvert.SerializeObject(this, Formatting.Indented); diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs index 5fb61f166..999adbcc0 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Timers; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; @@ -38,11 +39,6 @@ public bool IsLayoutMoveEnabled get { return (bool)GetValue(IsLayoutMoveEnabledProperty); } set { SetValue(IsLayoutMoveEnabledProperty, value); } } - - private void enableEditLayout_Click(object sender, RoutedEventArgs e) - { - //IsLayoutMoveEnabled = !IsLayoutMoveEnabled; - } public Control_DeviceLayoutPresenter() { @@ -97,81 +93,53 @@ private void OpenEnableMenu(object sender, RoutedEventArgs e) } private void Layout_DeviceLayoutUpdated(object sender) { - - double baseline_x = double.MaxValue; - double baseline_y = double.MaxValue; - double current_width = 800; - double current_height = 200; + double current_width = double.MinValue; + double current_height = double.MinValue; foreach (FrameworkElement layout in DeviceLayouts) { Point offset = layout.TranslatePoint(new Point(0, 0), layouts_grid); if (offset.X + layout.Width > current_width) current_width = offset.X + layout.Width; - if (offset.X < baseline_x) - baseline_x = offset.X; if (offset.Y + layout.Height > current_height) current_height = offset.Y + layout.Height; - if (offset.Y < baseline_y) - baseline_y = offset.Y; - //layout as Control_DeviceLayout).SaveLayoutPosition(offset); - } - /*foreach (UIElement layout in layouts_grid.Children) - { - Point offset = layout.TranslatePoint(new Point(0, 0), layouts_grid); - /*if (offset.X + layout.Width - baseline_x > current_width) - current_width = offset.X + layout.Width- baseline_x; - - if (offset.Y + layout.Height - baseline_y > current_height) - current_height = offset.Y + layout.Height - baseline_y;*/ - //layout.RenderTransform = new TranslateTransform(offset - //layout.Margin = new Thickness(offset.X - baseline_x, offset.Y - baseline_y, 0, 0); - /* layout.RenderTransform = new TranslateTransform(offset.X - baseline_x, offset.Y - baseline_y); - if (layout is Control_DeviceLayout) - (layout as Control_DeviceLayout).SaveLayoutPosition(offset); - }*/ - - layouts_grid.Width = current_width - baseline_x; - //this.Width = width + (keyboard_grid.Width - virtual_keyboard_width); - - layouts_grid.Height = current_height - baseline_y; - foreach (UIElement layout in layouts_grid.Children) - { - Point offset = layout.TranslatePoint(new Point(0, 0), layouts_grid); - layout.RenderTransform = new TranslateTransform(offset.X - baseline_x, offset.Y - baseline_y); - layout.UpdateLayout(); + + //layout as Control_DeviceLayout).SaveLayoutPosition(offset); } - //layouts_grid.RenderTransform = new TranslateTransform(-baseline_x, -baseline_y); - //keyboard_grid.Clip = new RectangleGeometry(new Rect(baseline_x, baseline_x, current_width - baseline_x, current_height - baseline_y)); - //this.Height = height + (keyboard_grid.Height - virtual_keyboard_height); - Effects.grid_baseline_x = 0;// (float)-baseline_x; - Effects.grid_baseline_y = 0;// (float)-baseline_y; - Effects.grid_width = (float)layouts_grid.Width; - Effects.grid_height = (float)layouts_grid.Height; - - - //keyboard_grid.Margin = new Thickness(-baseline_x, -baseline_y, 0, 0); - //layout2.LayoutTransform = new TranslateTransform(layout2.Region.X, layout2.Region.Y); - layouts_viewbox.MaxWidth = layouts_grid.Width; - layouts_viewbox.MaxHeight = layouts_grid.Height; - layouts_grid.UpdateLayout(); - layouts_viewbox.UpdateLayout(); - this.UpdateLayout(); - CalculateBitmap(); + + layouts_grid.Width = current_width; + layouts_grid.Height = current_height; + Effects.grid_baseline_x = 0; + Effects.grid_baseline_y = 0; + Effects.grid_width = (float)layouts_grid.Width; + Effects.grid_height = (float)layouts_grid.Height; + + layouts_viewbox.MaxWidth = layouts_grid.Width; + layouts_viewbox.MaxHeight = layouts_grid.Height; + layouts_grid.UpdateLayout(); + layouts_viewbox.UpdateLayout(); + this.UpdateLayout(); + CalculateBitmap(); } public void CalculateBitmap() { if (IsLayoutMoveEnabled) { - Global.effengine.SetCanvasSize(Control_DeviceLayout.PixelToByte(layouts_grid.Width) + 1, Control_DeviceLayout.PixelToByte(layouts_grid.Height) + 1); - var bitmap = new Dictionary(new DeviceKey.EqualityComparer()); - DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => { - if (!bitmap.ContainsKey(x.Key)) - bitmap.Add(x.Key, x.Value); - })); - Global.effengine.SetBitmapping(bitmap); + Task.Run(() => + { + Dispatcher.Invoke(() => { + Global.effengine.SetCanvasSize(Control_DeviceLayout.PixelToByte(layouts_grid.Width) + 1, Control_DeviceLayout.PixelToByte(layouts_grid.Height) + 1); + var bitmap = new Dictionary(new DeviceKey.EqualityComparer()); + DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => + { + if (!bitmap.ContainsKey(x.Key)) + bitmap.Add(x.Key, x.Value); + })); + Global.effengine.SetBitmapping(bitmap); + }); + }); } } private void DeviceLayoutNumberChanged(object sender) @@ -225,6 +193,8 @@ private void DeviceLayoutNumberChanged(object sender) //Update size layouts_grid.Width = 450; layouts_grid.Height = 200; + layouts_viewbox.MaxWidth = 800; + layouts_viewbox.MaxHeight = 300; } } private void DeviceLayout_MouseDoubleClick(object sender, MouseButtonEventArgs e) @@ -272,17 +242,17 @@ private void DeviceLayout_MouseMove(object sender, MouseEventArgs e) private void DeviceLayout_MouseUp(object sender, MouseButtonEventArgs e) { - var layout = sender as Control_DeviceLayout; - if (layout.IsMouseCaptured) + var senderLayout = sender as Control_DeviceLayout; + if (senderLayout.IsMouseCaptured) { // release this control. - layout.ReleaseMouseCapture(); + senderLayout.ReleaseMouseCapture(); - if (layout.RenderTransform is TranslateTransform) + if (senderLayout.RenderTransform is TranslateTransform layoutTranslate) { - layout.DeviceConfig.Offset.X = (int)(layout.RenderTransform as TranslateTransform).X; - layout.DeviceConfig.Offset.Y = (int)(layout.RenderTransform as TranslateTransform).Y; - Global.devicesLayout.SaveConfiguration(layout.DeviceConfig); + senderLayout.DeviceConfig.Offset.X = layoutTranslate.X; + senderLayout.DeviceConfig.Offset.Y = layoutTranslate.Y; + Global.devicesLayout.SaveConfiguration(senderLayout.DeviceConfig); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index a65998cd8..c9ee76eed 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -134,6 +134,7 @@ private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) private void okButton_Click(object sender, RoutedEventArgs e) { + Config.Offset = originalDeviceLayout.DeviceConfig.Offset; originalDeviceLayout.DeviceConfig = Config; Global.devicesLayout.SaveConfiguration(Config); Close(); From 8baa6dee663dcdbdb7ddb6364f2eb8937ab5890d Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 20 May 2020 18:24:58 +0200 Subject: [PATCH 12/42] Update no device selected box --- .../Control_DeviceLayout.xaml | 49 +++--- .../Control_DeviceLayout.xaml.cs | 165 ++---------------- 2 files changed, 38 insertions(+), 176 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml index 2d784ed5a..806f03be3 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml @@ -5,39 +5,44 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Aurora.Settings.DeviceLayoutViewer" mc:Ignorable="d" + ItemsSource="{Binding}" Loaded="UserControl_Loaded"> - - + - + - - + + - + + + + + + No Device selected + Please doubleclick on this box + - - - - - + + + + + + + - diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 4092b5222..9d0897c1f 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -23,10 +23,9 @@ namespace Aurora.Settings.DeviceLayoutViewer /// /// Interaction logic for Control_DeviceLayout.xaml /// - public partial class Control_DeviceLayout : ItemsControl, INotifyPropertyChanged + public partial class Control_DeviceLayout : ItemsControl { public delegate void LayoutUpdatedEventHandler(object sender); - public event PropertyChangedEventHandler PropertyChanged; //private FrameworkElement device_layout = new FrameworkElement(); public event LayoutUpdatedEventHandler DeviceLayoutUpdated; @@ -45,51 +44,12 @@ public int DeviceWidth set { SetValue(DeviceWidthProperty, value); } } - //public static readonly DependencyProperty KeycapLayoutsProperty = DependencyProperty.Register("KeycapLayouts", typeof(ObservableCollection), typeof(Control_DeviceLayout), new PropertyMetadata(new ObservableCollection())); - //private Canvas device_grid; private ObservableCollection _keycapLayouts = new ObservableCollection(); - public ObservableCollection KeycapLayouts// = new ObservableCollection(); - { - get { return _keycapLayouts; } - /*set { - SetValue(KeycapLayoutsProperty, value); - int layout_height = 0; - int layout_width = 0; - foreach (Control_Keycap key in KeycapLayouts) - { - var keyConfig = key.GetConfiguration(); - if (keyConfig.Width + keyConfig.X > layout_width) - layout_width = (int)keyConfig.Width + keyConfig.X; - - if (keyConfig.Height + keyConfig.Y > layout_height) - layout_height = (int)keyConfig.Height + keyConfig.Y; - - } - //var myContentPresenter = container.Template; - - //device_layout = container.Template.FindName("device_layout", this) as Canvas; - //Update size - //Width = layout_width; - //Height = layout_height; - //this.Width = device_layout.Width + 5; - //this.Height = device_layout.Height; - - new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); - - //device_layout.UpdateLayout(); - //device_viewbox.UpdateLayout(); - this.UpdateLayout(); - DeviceConfig.ConfigurationChanged += ConfigChanged; - OnPropertyChanged(); - //(GetValue(KeycapLayoutsProperty) as ObservableCollection).p - DeviceLayoutUpdated?.Invoke(this); - - }*/ - } + public ObservableCollection KeycapLayouts => _keycapLayouts; private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) { - int layout_height = 0; - int layout_width = 0; + int layout_height = 20; + int layout_width = 20; foreach (Control_Keycap key in KeycapLayouts) { var keyConfig = key.Config; @@ -100,15 +60,17 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) layout_height = (int)keyConfig.Height + keyConfig.Y; } - //var myContentPresenter = container.Template; - //device_layout = container.Template.FindName("device_layout", this) as Canvas; //Update size DeviceWidth = layout_width; DeviceHeight = layout_height; this.Width = DeviceWidth + 5; this.Height = DeviceHeight; - + if (KeycapLayouts.Count == 0) + { + this.Width = 450; + this.Height = 200; + } RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); //ItemsSource = KeycapLayouts; //var device_viewbox = this.Template.FindVisualChild(this); //FindName("device_viewbox") as Viewbox; @@ -118,7 +80,6 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) //device_viewbox.UpdateLayout(); //this.UpdateLayout(); DeviceConfig.ConfigurationChanged += ConfigChanged; - OnPropertyChanged(); //(GetValue(KeycapLayoutsProperty) as ObservableCollection).p DeviceLayoutUpdated?.Invoke(this); } @@ -140,7 +101,7 @@ public Control_DeviceLayout() InitializeComponent(); DeviceConfig = new DeviceConfig(); KeycapLayouts.CollectionChanged += HandleChange; - ItemsSource = KeycapLayouts; + DataContext = KeycapLayouts; //DataContext = KeycapLayouts; } @@ -151,7 +112,7 @@ public Control_DeviceLayout(DeviceConfig config) DeviceConfig = config; KeycapLayouts.CollectionChanged += HandleChange; //DataContext = KeycapLayouts; - ItemsSource = KeycapLayouts; + DataContext = KeycapLayouts; //device_layout = contentPresenter.ContentTemplate; ConfigChanged(); @@ -185,83 +146,10 @@ public List Keys KeycapLayouts.Clear(); Keys.ForEach(k => KeycapLayouts.Add(new Control_Keycap(k))); - //this.Width = device_layout.Width + 5; - //this.Height = device_layout.Height; - - //new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); - - //device_grid.UpdateLayout(); - //device_viewbox.UpdateLayout(); - //this.UpdateLayout(); DeviceLayoutUpdated?.Invoke(this); } } - public void CreateUserControl(Canvas deviceControl, bool abstractKeycaps = false) - { - KeyboardMap.Clear(); - deviceControl.Children.Clear(); - if (Keys.Count > 0) - { - - int layout_height = 0; - int layout_width = 0; - foreach (DeviceKeyConfiguration key in Keys) - { - KeycapLayouts.Add(new Control_Keycap(key)); - //AddDeviceKey(key); - - if (key.Width + key.X > layout_width) - layout_width = key.Width + key.X; - - if (key.Height + key.Y > layout_height) - layout_height = key.Height + key.Y; - - } - //Update size - Width = layout_width; - Height = layout_height; - //this.Width = device_layout.Width + 5; - //this.Height = device_layout.Height; - - new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); - - //device_grid.UpdateLayout(); - //device_viewbox.UpdateLayout(); - //this.UpdateLayout(); - DeviceConfig.ConfigurationChanged += ConfigChanged; - OnPropertyChanged(); - DeviceLayoutUpdated?.Invoke(this); - } - else - { - Label error_message = new Label(); - - DockPanel info_panel = new DockPanel(); - - TextBlock info_message = new TextBlock() - { - Text = "No Device selected\r\nPlease doubleclick on this box", - TextAlignment = TextAlignment.Center, - Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0)), - }; - - DockPanel.SetDock(info_message, Dock.Top); - info_panel.Children.Add(info_message); - - error_message.Content = info_panel; - - error_message.FontSize = 16.0; - error_message.FontWeight = FontWeights.Bold; - error_message.HorizontalContentAlignment = HorizontalAlignment.Center; - error_message.VerticalContentAlignment = VerticalAlignment.Center; - - deviceControl.Children.Add(error_message); - //Update size - deviceControl.Width = 450; - deviceControl.Height = 200; - } - } public static int PixelToByte(int pixel) { return PixelToByte((double)pixel); @@ -300,37 +188,6 @@ public void SetKeyboardColors(Dictionary keylig } } } - public Control_Keycap AddDeviceKey(DeviceKeyConfiguration key) - { - Control_Keycap keycap = new Control_Keycap(key); - - //keycap.Margin = new Thickness(key.Region.X, key.Region.Y, 0, 0); - //device_grid.Children.Add(keycap); - if (!KeyboardMap.ContainsKey((Devices.DeviceKeys)key.Tag))// && !abstractKeycaps) - KeyboardMap.Add(key.Key, keycap); - - return keycap; - } - public void RemoveDeviceKey(DeviceKeyConfiguration key) - { - /*foreach (var child in device_grid.Children) - { - if (child is Control_Keycap keycap) - { - if (keycap.GetConfiguration() == key) - { - device_grid.Children.Remove(keycap); - return; - } - } - }*/ - } - // Create the OnPropertyChanged method to raise the event - // The calling member's name will be used as the parameter. - protected void OnPropertyChanged([CallerMemberName] string name = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); - } } } From 79fcb6248930aee3f5ee21a54aad6b3c933248fd Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 20 May 2020 18:54:00 +0200 Subject: [PATCH 13/42] Fix layout not applying the colors --- .../Control_DeviceLayout.xaml.cs | 2 +- .../Control_DeviceLayoutPresenter.xaml.cs | 28 +++++++++---------- .../Window_DeviceConfig.xaml.cs | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 9d0897c1f..e9f26ae53 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -29,7 +29,7 @@ public partial class Control_DeviceLayout : ItemsControl //private FrameworkElement device_layout = new FrameworkElement(); public event LayoutUpdatedEventHandler DeviceLayoutUpdated; - public Dictionary KeyboardMap = new Dictionary(new DeviceKey.EqualityComparer()); + public Dictionary KeyboardMap => KeycapLayouts.ToDictionary(k => k.GetKey(), k => k, new DeviceKey.EqualityComparer()); public static readonly DependencyProperty DeviceHeightProperty = DependencyProperty.Register("DeviceHeight", typeof(int), typeof(Control_DeviceLayout), new PropertyMetadata(0)); public int DeviceHeight diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs index d3dadd210..bda4cee7d 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs @@ -28,7 +28,7 @@ public partial class Control_DeviceLayoutPresenter : UserControl List DeviceLayouts = new List(); private System.Windows.Point _positionInBlock; - public List Keycaps => DeviceLayouts.SelectMany(dl => dl.KeyboardMap.Values).ToList(); + public List Keycaps => DeviceLayouts.SelectMany(dl => dl.KeycapLayouts).ToList(); public static readonly DependencyProperty IsLayoutMoveEnabledProperty = DependencyProperty.Register("IsLayoutMoveEnabled", typeof(bool), @@ -125,22 +125,19 @@ private void Layout_DeviceLayoutUpdated(object sender) } public void CalculateBitmap() { - if (IsLayoutMoveEnabled) + Task.Run(() => { - Task.Run(() => - { - Dispatcher.Invoke(() => { - Global.effengine.SetCanvasSize(Control_DeviceLayout.PixelToByte(layouts_grid.Width) + 1, Control_DeviceLayout.PixelToByte(layouts_grid.Height) + 1); - var bitmap = new Dictionary(new DeviceKey.EqualityComparer()); - DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => - { - if (!bitmap.ContainsKey(x.Key)) - bitmap.Add(x.Key, x.Value); - })); - Global.effengine.SetBitmapping(bitmap); - }); + Dispatcher.Invoke(() => { + Global.effengine.SetCanvasSize(Control_DeviceLayout.PixelToByte(layouts_grid.Width) + 1, Control_DeviceLayout.PixelToByte(layouts_grid.Height) + 1); + var bitmap = new Dictionary(new DeviceKey.EqualityComparer()); + DeviceLayouts.ForEach(item => item.GetBitmap().ToList().ForEach(x => + { + if (!bitmap.ContainsKey(x.Key)) + bitmap.Add(x.Key, x.Value); + })); + Global.effengine.SetBitmapping(bitmap); }); - } + }); } private void DeviceLayoutNumberChanged(object sender) { @@ -161,6 +158,7 @@ private void DeviceLayoutNumberChanged(object sender) //layout.RenderTransform = new TranslateTransform(layout.DeviceConfig.Offset.X, layout.DeviceConfig.Offset.Y); } layouts_grid.Children.Add(new LayerEditor(layouts_grid)); + Layout_DeviceLayoutUpdated(this); } else { Label error_message = new Label(); diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 0d2afa27a..478048f1a 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -171,7 +171,7 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) offset.X = -escConfig.X; offset.Y = -escConfig.Y; } - new DeviceLayout(Config).SaveLayout(deviceLayout.KeyboardMap.Values.ToList(), offset); + new DeviceLayout(Config).SaveLayout(deviceLayout.KeycapLayouts.ToList(), offset); } } From ed93d2870c95929d7190f26010f14f422e78ed41 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 21 May 2020 15:38:53 +0200 Subject: [PATCH 14/42] Fix keyselection selection --- .../Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs index d69218fe5..0d0af3de5 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs @@ -119,7 +119,7 @@ public DeviceKey GetKey() public void SetColor(Color key_color, bool isSelected = false) { - //Keycap.SelectKey(isSelected || Global.key_recorder.HasRecorded(GetKey())); + Keycap.SelectKey(Global.key_recorder.HasRecorded(GetKey())); Keycap.SetColor(key_color); } From 35dcb6bfd57c253f9c39a23cb47be395dd154f23 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 21 May 2020 21:16:22 +0200 Subject: [PATCH 15/42] Optimizing the DevicePresenter, fix other bugs --- .../Controls/Control_AnimationEditor.xaml.cs | 17 +-- .../Settings/DeviceLayoutManager.cs | 142 +++++++---------- .../Control_DeviceLayout.xaml.cs | 50 ++++-- .../Control_DeviceLayoutPresenter.xaml | 35 ++++- .../Control_DeviceLayoutPresenter.xaml.cs | 144 ++++++++---------- .../DeviceLayoutViewer/Control_Keycap.xaml.cs | 7 +- .../Keycaps/Control_ImageKeycap.xaml.cs | 6 +- .../Window_DeviceConfig.xaml | 12 +- .../Window_DeviceConfig.xaml.cs | 96 ++++++------ 9 files changed, 252 insertions(+), 257 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs index db91eea5d..0a1413b84 100644 --- a/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/Control_AnimationEditor.xaml.cs @@ -58,19 +58,10 @@ public Control_AnimationEditor() { InitializeComponent(); - Global.devicesLayout.DeviceLayoutNumberChanged += Layout_DevicesNumberChanged; - } - private void Layout_DevicesNumberChanged(object sender) - { - deviceLayerPresenter.UpdateLayout(); - //deviceLayerPresenter.MaxWidth = deviceLayerPresenter.MaxWidth + 15; - //deviceLayerPresenter.MaxHeight = deviceLayerPresenter.MaxHeight + 15; - //viewbxAnimationView.UpdateLayout(); - - this.UpdateLayout(); - //Generate a new mapping + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { foreach (Settings.DeviceLayoutViewer.Control_Keycap key in deviceLayerPresenter.Keycaps) { if (key.GetKey() != DeviceKeys.NONE) @@ -81,10 +72,6 @@ private void Layout_DevicesNumberChanged(object sender) } } - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - } - private void KeyboardKey_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (_selectedFrameItem != null && (_selectedFrameItem as Control_AnimationFrameItem).ContextFrame is AnimationManualColorFrame && sender is Settings.DeviceLayoutViewer.Keycaps.KeycapViewer keycapViewer) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 5e5c38f85..0c020d811 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -2,7 +2,10 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.ComponentModel; +using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; @@ -627,16 +630,40 @@ public class DeviceLayoutManager { public Dictionary DevicesConfig = new Dictionary(); - public delegate void LayoutUpdatedEventHandler(object sender); - - public event LayoutUpdatedEventHandler DeviceLayoutNumberChanged; - public double Height = 0; public double Width = 0; + [JsonIgnore] + public ObservableCollection DeviceLayouts { get; } = new ObservableCollection(); public DeviceLayoutManager() { + DeviceLayouts.CollectionChanged += HandleChange; + } + private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Replace) + { + throw new Exception("The device layouts shouldn't been replaced"); + } + if (e.Action == NotifyCollectionChangedAction.Add) + { + foreach (Control_DeviceLayout item in e.NewItems) + { + item.DeviceConfig.Id = DevicesConfig.Count; + DevicesConfig[item.DeviceConfig.Id] = item.DeviceConfig; + } + Save(); + } + if (e.Action == NotifyCollectionChangedAction.Remove) + { + foreach (Control_DeviceLayout item in e.OldItems) + { + DevicesConfig.Remove(item.DeviceConfig.Id); + } + Save(); + } + } public void Load() { @@ -647,50 +674,35 @@ public void Load() string devicesConfigContent = File.ReadAllText(layoutConfigPath, Encoding.UTF8); DeviceLayoutManager manager = JsonConvert.DeserializeObject(devicesConfigContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - DevicesConfig = manager?.DevicesConfig ?? new Dictionary(); - } - /*DevicesConfig.Add(new DeviceConfig()); - DevicesConfig[0].Id = 0; - DevicesConfig[0].Type = 0; - DevicesConfig[0].SelectedKeyboardLayout = "ansi"; - DevicesConfig[0].SelectedLayout = "asus_strix_flare"; - DevicesConfig.Add(new DeviceConfig()); - DevicesConfig[1].Id = 1; - DevicesConfig[1].Type = 1; - DevicesConfig[1].SelectedLayout = "Corsair - Katar"; - Save();*/ - /*DevicesConfig.Add(new DeviceConfig()); - DevicesConfig[0].Id = 0; - DevicesConfig[0].Type = 0; - DevicesConfig[0].SelectedKeyboardLayout = "ansi_layout"; - DevicesConfig[0].SelectedLayout = "asus_strix_flare"; - DevicesConfig[2].Id = 2; - DevicesConfig[2].Type = 0;*/ - //DevicesLayout[1].Region.X = 825; - - foreach (var layout in DevicesConfig.Values) - { - if (layout.Offset.X < 0 || layout.Offset.Y < 0) - layout.Offset = new Point(0, 0); - /* - if (layout.Offset.X + layout.Region.Width > current_width) - current_width = layout.Region.X + layout.Region.Width; - else if (layout.Region.X < baseline_x) - baseline_x = layout.Region.X; - - if (layout.Region.Y + layout.Region.Height > current_height) - current_height = layout.Region.Y + layout.Region.Height; - else if (layout.Region.Y < baseline_y) - baseline_y = layout.Region.Y;*/ - } + var devicesConfig = manager?.DevicesConfig ?? new Dictionary(); + + DeviceLayouts.Clear(); + + foreach (var config in devicesConfig.Values) + { + if (config.Offset.X < 0 || config.Offset.Y < 0) + config.Offset = new Point(0, 0); + + var layout = new Control_DeviceLayout(config); - DeviceLayoutNumberChanged?.Invoke(this); + DeviceLayouts.Add(layout); + + } + } + } + private void Save() + { + var fileName = "DevicesConfig.json"; + var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); + var content = JsonConvert.SerializeObject(this, Formatting.Indented); + File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); } public void SaveConfiguration(DeviceConfig config) { //if (DevicesConfig.SelectMany(dc => dc.Id )) DevicesConfig[config.Id] = config; + DeviceLayouts.Where(dl => dl.DeviceConfig.Id == config.Id).FirstOrDefault().DeviceConfig = config; double baseline_x = double.MaxValue; double baseline_y = double.MaxValue; foreach (DeviceConfig dc in DevicesConfig.Values) @@ -710,54 +722,6 @@ public void SaveConfiguration(DeviceConfig config) var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); var content = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); - DeviceLayoutNumberChanged?.Invoke(this); - } - public void DeleteConfiguration(DeviceConfig config) - { - DevicesConfig.Remove(config.Id); - - var fileName = "DevicesConfig.json"; - var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); - var content = JsonConvert.SerializeObject(this, Formatting.Indented); - File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); - DeviceLayoutNumberChanged?.Invoke(this); - } - public void AddNewDevice() - { - var config = new DeviceConfig(); - config.Id = DevicesConfig.Count; - DevicesConfig[config.Id] = config; - DeviceLayoutNumberChanged?.Invoke(this); - } - private void Layout_DeviceLayoutUpdated(object sender) - { - /*var layout = (sender as Control_DeviceLayout); - DeviceConfig config = DevicesConfig.Where(c => c == layout.DeviceConfig).First(); - - var offset = layout.TranslatePoint(new System.Windows.Point(0, 0), (UIElement)VisualTreeHelper.GetParent(layout)); - - - Save();*/ - } - public List GetDeviceLayouts(bool abstractKeycaps = false) - { - List deviceLayouts = new List(); - foreach (var item in DevicesConfig.Values) - { - /*Grid deviceControl = item.CreateUserControl(); - deviceControl.VerticalAlignment = VerticalAlignment.Top; - deviceControl.HorizontalAlignment = HorizontalAlignment.Left;*/ - //item.Margin = new Thickness(item.Region.Left, item.Region.Top, 0, 0); - var layout = new Control_DeviceLayout(item); - //layout.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated; - deviceLayouts.Add(layout); - - - } - - return deviceLayouts; - - } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 7f997e4d6..825288e9e 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -44,12 +44,31 @@ public int DeviceWidth set { SetValue(DeviceWidthProperty, value); } } - private ObservableCollection _keycapLayouts = new ObservableCollection(); - public ObservableCollection KeycapLayouts => _keycapLayouts; + public ObservableCollection KeycapLayouts { get; } = new ObservableCollection(); private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) { - int layout_height = 100; - int layout_width = 100; + if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.Replace) + { + foreach (Control_Keycap item in e?.NewItems) + { + item.Config.PropertyChanged += KeycapPositionChanged; + } + } + + RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); + ResizeLayout(); + } + private void KeycapPositionChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "X" || e.PropertyName == "Y" || e.PropertyName == "Width" || e.PropertyName == "Height") + { + ResizeLayout(); + } + } + public void ResizeLayout() + { + int layout_height = 10; + int layout_width = 10; foreach (Control_Keycap key in KeycapLayouts) { var keyConfig = key.Config; @@ -62,7 +81,7 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) } //Update size - DeviceWidth = layout_width +5; + DeviceWidth = layout_width; DeviceHeight = layout_height; this.Width = DeviceWidth; this.Height = DeviceHeight; @@ -71,8 +90,7 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) this.Width = 450; this.Height = 200; } - RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); - + UpdateLayout(); DeviceLayoutUpdated?.Invoke(this); } @@ -85,7 +103,7 @@ public DeviceConfig DeviceConfig { SetValue(DeviceConfigProperty, value); DeviceConfig.ConfigurationChanged += ConfigChanged; - //ConfigChanged(); + ConfigChanged(); } } public Control_DeviceLayout() @@ -114,12 +132,18 @@ public Control_DeviceLayout(DeviceConfig config) public void ConfigChanged() { - DeviceLayout layout = new DeviceLayout(DeviceConfig); - Keys = layout.LoadLayout(); - foreach(var key in Keys) + Task.Run(() => { - key.Key.DeviceId = DeviceConfig.Id; - } + Dispatcher.Invoke(() => + { + DeviceLayout layout = new DeviceLayout(DeviceConfig); + Keys = layout.LoadLayout(); + foreach (var key in Keys) + { + key.Key.DeviceId = DeviceConfig.Id; + } + }); + }); } private void UserControl_Loaded(object sender, RoutedEventArgs e) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml index 31679ba0a..4541827a8 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml @@ -12,10 +12,37 @@ - - - - + + + + + + + + + + + To enable/disable layout editor right click on this box + + + + + + + + + + + + + + + + + + From fa95f4b9b3efa2be3407edd3de5dd62041a23f62 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 12 Jun 2021 04:10:00 +0200 Subject: [PATCH 17/42] Add OpenRGB multi device support --- .../Project-Aurora/Devices/AuroraDevice.cs | 197 ++++++++++++++ .../Devices/AuroraDeviceConnector.cs | 178 +++++++++++++ .../Project-Aurora/Devices/DeviceManager.cs | 36 ++- .../Devices/OpenRGB/OpenRGBDevice.cs | 241 +++++++++--------- .../Settings/DeviceLayoutManager.cs | 15 +- .../Control_DeviceLayout.xaml.cs | 2 +- .../Window_DeviceConfig.xaml | 2 + .../Window_DeviceConfig.xaml.cs | 27 ++ 8 files changed, 567 insertions(+), 131 deletions(-) create mode 100644 Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs create mode 100644 Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs new file mode 100644 index 000000000..abf18b82f --- /dev/null +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs @@ -0,0 +1,197 @@ +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; + +namespace Aurora.Devices +{ + public enum AuroraDeviceType + { + Unkown, + Keyboard, + Mouse, + Headset + } + public class UniqueDeviceId + { + public string ConnectorName = ""; + public string DeviceName { get; set; } = "Non OpenRGB Device"; + public int Index = 0; + 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 + && obj1.ConnectorName == obj2.ConnectorName + && 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; + + 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; + + + 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() + { + } + + 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 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..58565179d --- /dev/null +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs @@ -0,0 +1,178 @@ +using Aurora.Settings; +using SharpDX.Direct3D11; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Aurora.Devices +{ + public abstract class AuroraDeviceConnector + { + //private Dictionary Devices = new Dictionary(); + protected 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++; + } + dev.id = id; + } + + /// + /// 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; + foreach (var device in Devices) + { + Global.Configuration.VarRegistry.Combine(device.GetRegisteredVariables()); + device.ConnectionHandler += ConnectionHandling; + device.UpdateFinished += DeviceUpdated; + RegisterDeviceId(device); + device.Connect(); + } + 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); + } + 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/DeviceManager.cs b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs index 4c5a4affd..cd71a25a2 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; @@ -168,6 +168,8 @@ orderby inst.DeviceName { DeviceContainers.Add(new DeviceContainer(inst)); } + + DeviceConnectors.Add(new OpenRGB.OpenRGBDeviceConnector()); } private void AddDevicesFromDlls() @@ -262,6 +264,7 @@ public void InitializeDevices() Global.logger.Info(s); } + DeviceConnectors.ForEach(dc => dc.Initialize()); if (devicesToRetry > 0) Task.Run(RetryAll); @@ -277,6 +280,7 @@ public void ShutdownDevices() dc.Device.Shutdown(); Global.logger.Info($"[Device][{dc.Device.DeviceName}] Shutdown"); } + DeviceConnectors.ForEach(dc => dc.Shutdown()); } public void ResetDevices() @@ -286,21 +290,43 @@ public void ResetDevices() lock (dc.actionLock) dc.Device.Reset(); } + DeviceConnectors.ForEach(dc => dc.Reset()); } + 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) { - foreach (var composition in compositionList.Values) - { - 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 dc in IndividualDevices.Where(d => d.IsConnected())) + { + if (dc.id?.ViewPort != null) + dc.UpdateDevice(compositionList[(int)dc.id.ViewPort]); + } } #region SystemEvents diff --git a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs index be371a066..f653d3f67 100644 --- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs @@ -18,166 +18,140 @@ 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], this, i); + devices.Add(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; } - public override void Shutdown() + protected override void ShutdownImpl() { - if (!IsInitialized) - return; - - for (var i = 0; i < _devices.Length; i++) - { - try - { - _openRgb.UpdateLeds(i, _devices[i].Colors); - } - catch - { - //we tried. - } - } - _openRgb?.Dispose(); _openRgb = null; - IsInitialized = false; } - - public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) + public void UpdateLeds(int deviceIndex, OpenRGBColor[] colors) { - if (!IsInitialized) - return false; + _openRgb.UpdateLeds(deviceIndex, colors); + } + } + public class OpenRGBAuroraDevice : AuroraDevice + { + private OpenRGBDevice Device; + private OpenRGBColor[] DeviceColors; + private List KeyMapping; + private int DeviceIndex; - 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; + private OpenRGBDeviceConnector Connector; + + protected Dictionary LedMap = new Dictionary(); + + protected override string DeviceName => Device.Name; - for (int ledIdx = 0; ledIdx < _devices[i].Leds.Length; ledIdx++) + protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceTypeConverter(Device.Type); + + public int Id { get; set; } + + public OpenRGBAuroraDevice(OpenRGBDevice device, OpenRGBDeviceConnector connector, int deviceIndex) + { + Device = device; + Connector = connector; + DeviceIndex = deviceIndex; + DeviceColors = new OpenRGBColor[Device.Leds.Length]; + for (var ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++) + DeviceColors[ledIdx] = new OpenRGBColor(); + + if (Device.Type == OpenRGBDeviceType.Keyboard) + { + KeyMapping = new List(); + for (int j = 0; j < Device.Leds.Length; j++) { - if (keyColors.TryGetValue((int)_keyMappings[i][ledIdx], out var keyColor)) + if (OpenRGBKeyNames.Keyboard.TryGetValue(Device.Leds[j].Name, out var dk)) + { + KeyMapping.Add(dk); + } + else { - _deviceColors[i][ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B); + KeyMapping.Add(DK.NONE); } } + } + } + protected override void DisconnectImpl() + { + try + { + Connector.UpdateLeds(DeviceIndex, DeviceColors); + } + catch + { + //we tried. + } + } + protected override bool UpdateDeviceImpl(DeviceColorComposition composition) + { + + //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; - try + for (int ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++) + { + if (Device.Type == OpenRGBDeviceType.Keyboard) { - _openRgb.UpdateLeds(i, _deviceColors[i]); + if (composition.keyColors.TryGetValue((int)KeyMapping[ledIdx], out var keyColor)) + { + DeviceColors[ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B); + } } - catch (Exception exc) + else { - LogError($"Failed to update OpenRGB device {_devices[i].Name}: " + exc); - Reset(); + if (composition.keyColors.TryGetValue(ledIdx, out var keyColor)) + { + DeviceColors[ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B); + } } } - var sleep = Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_sleep"); + try + { + Connector.UpdateLeds(DeviceIndex, DeviceColors); + } + catch (Exception exc) + { + LogError($"Failed to update OpenRGB device {DeviceName}: " + exc); + return false; + } + + /*var sleep = Global.Configuration.VarRegistry.GetVariable($"{DeviceName}_sleep"); if (sleep > 0) - Thread.Sleep(sleep); + Thread.Sleep(sleep);*/ return true; } @@ -186,5 +160,36 @@ 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; + } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 93fe95030..ba841a1e9 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -315,7 +315,7 @@ public void AddFeature(KeyboardKey[] keys, KeyboardRegion? insertion_region = Ke key.margin_left += location_x; key.margin_top += location_y; - Keys[(int)key.tag] = new DeviceKeyConfiguration(key, Config.Id); + Keys[(int)key.tag] = new DeviceKeyConfiguration(key, Config.Id.ViewPort); if (key.width + key.margin_left > Region.Width) Region.Width = (int)(key.width + key.margin_left); @@ -465,7 +465,7 @@ public void ApplyConfig(Dictionary keys) public class DeviceConfig { - public int Id; + public Devices.UniqueDeviceId Id; public string SelectedLayout = ""; public int Type; public Point Offset = new Point(0, 0); @@ -653,8 +653,9 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) { foreach (Control_DeviceLayout item in e.NewItems) { - item.DeviceConfig.Id = DevicesConfig.Count; - DevicesConfig[item.DeviceConfig.Id] = item.DeviceConfig; + item.DeviceConfig.Id = new Devices.UniqueDeviceId(); + item.DeviceConfig.Id.ViewPort = DevicesConfig.Count; + DevicesConfig[DevicesConfig.Count] = item.DeviceConfig; } Save(); } @@ -662,7 +663,7 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) { foreach (Control_DeviceLayout item in e.OldItems) { - DevicesConfig.Remove(item.DeviceConfig.Id); + DevicesConfig.Remove((int)item.DeviceConfig.Id.ViewPort); } Save(); } @@ -704,8 +705,8 @@ public void SaveConfiguration(DeviceConfig config) { //if (DevicesConfig.SelectMany(dc => dc.Id )) - DevicesConfig[config.Id] = config; - DeviceLayouts.Where(dl => dl.DeviceConfig.Id == config.Id).FirstOrDefault().DeviceConfig = config; + DevicesConfig[(int)config.Id.ViewPort] = config; + DeviceLayouts.Where(dl => dl.DeviceConfig.Id.ViewPort == config.Id.ViewPort).FirstOrDefault().DeviceConfig = config; double baseline_x = double.MaxValue; double baseline_y = double.MaxValue; foreach (DeviceConfig dc in DevicesConfig.Values) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 825288e9e..87e81f904 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -140,7 +140,7 @@ public void ConfigChanged() Keys = layout.LoadLayout(); foreach (var key in Keys) { - key.Key.DeviceId = DeviceConfig.Id; + key.Key.DeviceId = DeviceConfig.Id.ViewPort; } }); }); diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml index 222b8dd3a..4ef172943 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml @@ -30,11 +30,13 @@ + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 3bf74495b..d23b9f20c 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -42,6 +42,22 @@ public Window_DeviceConfig(Control_DeviceLayout config) LoadDeviceType(Config.Type); + var deviceIdList = Global.dev_manager.IndividualDevices.Select(d => d.id).ToList(); + deviceIdList.Insert(0, new Devices.UniqueDeviceId()); + int selectedIndex = int.MaxValue; + for (int i = 0; i < deviceIdList.Count; i++) + { + if (deviceIdList[i] == Config.Id) + selectedIndex = i; + } + if (selectedIndex == int.MaxValue) + { + deviceIdList.Insert(0, Config.Id); + selectedIndex = 0; + } + + this.device_view.ItemsSource = deviceIdList; + this.device_view.SelectedIndex = selectedIndex; this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; this.device_layout.SelectedItem = Config.SelectedLayout; @@ -124,6 +140,17 @@ private void LoadDeviceType(int type) break; } } + + private void device_view_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (IsLoaded) + { + var selectedDeviceId = (Devices.UniqueDeviceId)this.device_view.SelectedItem; + Global.dev_manager.RegisterViewPort(ref selectedDeviceId, (int)Config.Id.ViewPort); + Config.Id = selectedDeviceId; + deviceLayout.ConfigChanged(); + } + } private void device_type_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (IsLoaded) From 1575f43fc3eb14f12c939303fc2270ca0814cc28 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 12 Jun 2021 14:50:17 +0200 Subject: [PATCH 18/42] Add Cointainer Wrapper, Fix 0 index for Keyboard, and other bug fixes --- .../Controls/KeySequence.xaml.cs | 2 + .../Project-Aurora/Devices/AuroraDevice.cs | 6 +- .../Devices/AuroraDeviceConnector.cs | 61 +++++++++++++- .../Project-Aurora/Devices/DeviceManager.cs | 8 +- .../Project-Aurora/EffectsEngine/Effects.cs | 2 +- .../Settings/DeviceLayoutManager.cs | 82 ++++++++----------- .../Control_DeviceLayout.xaml.cs | 4 +- .../Control_DeviceLayoutPresenter.xaml.cs | 36 ++++---- .../Window_DeviceConfig.xaml.cs | 4 +- 9 files changed, 134 insertions(+), 71 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs index 59bb08675..f74478159 100644 --- a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs @@ -183,9 +183,11 @@ private void btnReverseOrder_Click(object sender, RoutedEventArgs e) int totalCount = SelectedDeviceKeyList.Count; for (int i = totalCount - 1; i > 0; i--) { + allowListRefresh = false; DeviceKey key = SelectedDeviceKeyList[totalCount - 1]; SelectedDeviceKeyList.RemoveAt(totalCount - 1); SelectedDeviceKeyList.Insert((totalCount - 1) - i, key); + allowListRefresh = true; } } diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs index abf18b82f..c4623d034 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs @@ -34,9 +34,9 @@ public UniqueDeviceId(AuroraDeviceConnector connector, AuroraDevice device) } public static bool operator ==(UniqueDeviceId obj1, UniqueDeviceId obj2) { - return (obj1 is null && obj2 is null - && obj1.ConnectorName == obj2.ConnectorName - && obj1.DeviceName == obj2.DeviceName + return (!(obj1 is null) && !(obj2 is null) + && string.Equals(obj1.ConnectorName, obj2.ConnectorName) + && string.Equals(obj1.DeviceName, obj2.DeviceName) && obj1.Index == obj2.Index); } diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs index 58565179d..b64f59d36 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs @@ -2,6 +2,8 @@ using SharpDX.Direct3D11; using System; using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; using System.Linq; using System.Text; using System.Threading; @@ -9,6 +11,50 @@ 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(); @@ -34,7 +80,16 @@ private void RegisterDeviceId (AuroraDevice dev) { id.Index++; } - dev.id = id; + var usedIdConfig = Global.devicesLayout.DevicesConfig.Values.Where(c => c.Id == id); + if(!usedIdConfig.Any()) + { + dev.id = id; + } + else + { + dev.id = usedIdConfig.First().Id; + } + } /// @@ -162,6 +217,10 @@ public virtual VariableRegistry GetRegisteredVariables() { variableRegistry = new VariableRegistry(); RegisterVariables(variableRegistry); + foreach (var dev in Devices) + { + variableRegistry.Combine(dev.GetRegisteredVariables()); + } } return variableRegistry; } diff --git a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs index cd71a25a2..ceceadc90 100644 --- a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs +++ b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs @@ -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,8 +169,9 @@ orderby inst.DeviceName { DeviceContainers.Add(new DeviceContainer(inst)); } - - DeviceConnectors.Add(new OpenRGB.OpenRGBDeviceConnector()); + var OpenRGBConnector = new OpenRGB.OpenRGBDeviceConnector(); + DeviceContainers.Add(new DeviceContainer(new OldAuroraDeviceWrapper(OpenRGBConnector))); + DeviceConnectors.Add(OpenRGBConnector); } private void AddDevicesFromDlls() @@ -324,7 +326,7 @@ public void UpdateDevices(Dictionary compositionLis } foreach (var dc in IndividualDevices.Where(d => d.IsConnected())) { - if (dc.id?.ViewPort != null) + if (dc.id?.ViewPort != null && compositionList.ContainsKey((int)dc.id.ViewPort)) dc.UpdateDevice(compositionList[(int)dc.id.ViewPort]); } } diff --git a/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs b/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs index a7019aab9..3cdaf955f 100755 --- a/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs +++ b/Project-Aurora/Project-Aurora/EffectsEngine/Effects.cs @@ -270,7 +270,7 @@ public void SetCanvasSize(int width, int height) public static BitmapRectangle GetBitmappingFromDeviceKey(DeviceKey key) { if (bitmap_map.ContainsKey(key)) - return bitmap_map[key]; + return bitmap_map[bitmap_map.Keys.First(k => k == key)]; return new BitmapRectangle(); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index ba841a1e9..21098f779 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -470,6 +470,7 @@ public class DeviceConfig public int Type; public Point Offset = new Point(0, 0); public bool LightingEnabled = true; + public bool TypeChangeEnabled = true; [JsonIgnore] protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); @@ -481,10 +482,17 @@ public DeviceConfig(DeviceConfig config) Type = config.Type; ConfigurationChanged = config.ConfigurationChanged; LightingEnabled = config.LightingEnabled; + TypeChangeEnabled = config.TypeChangeEnabled; } - public DeviceConfig() + public DeviceConfig(int viewPort) { + Id = new Devices.UniqueDeviceId(); + Id.ViewPort = viewPort; + } + private DeviceConfig() + { + // Private parameterless constructor. Leave private so that it forces everyone to use the Mandate parameter but allows serialization to work. } public delegate void ConfigChangedEventHandler(); @@ -521,7 +529,7 @@ public KeyboardConfig(DeviceConfig config) : base(config) Type = 0; } - public KeyboardConfig() + public KeyboardConfig(int viewPort) : base(viewPort) { Type = 0; SelectedKeyboardLayout = GetSystemKeyboardCulture(); @@ -637,38 +645,28 @@ public class DeviceLayoutManager public double Width = 0; - [JsonIgnore] - public ObservableCollection DeviceLayouts { get; } = new ObservableCollection(); - public DeviceLayoutManager() - { - DeviceLayouts.CollectionChanged += HandleChange; - } - private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) + public delegate void ConfigChangedEventHandler(DeviceConfig changedConf); + + public event ConfigChangedEventHandler DevicesConfigChanged; + public void AddNewDeviceLayout() { - if (e.Action == NotifyCollectionChangedAction.Replace) + var devConf = new DeviceConfig(DevicesConfig.Count); + if (devConf.Id.ViewPort == 0) { - throw new Exception("The device layouts shouldn't been replaced"); + devConf.Type = 0; + devConf.TypeChangeEnabled = false; } - if (e.Action == NotifyCollectionChangedAction.Add) - { - foreach (Control_DeviceLayout item in e.NewItems) - { - item.DeviceConfig.Id = new Devices.UniqueDeviceId(); - item.DeviceConfig.Id.ViewPort = DevicesConfig.Count; - DevicesConfig[DevicesConfig.Count] = item.DeviceConfig; - } - Save(); - } - if (e.Action == NotifyCollectionChangedAction.Remove) - { - foreach (Control_DeviceLayout item in e.OldItems) - { - DevicesConfig.Remove((int)item.DeviceConfig.Id.ViewPort); - } - Save(); - } - + DevicesConfig[DevicesConfig.Count] = devConf; + DevicesConfigChanged.Invoke(devConf); + Save(); + } + public void RemoveDeviceLayout(DeviceConfig conf) + { + DevicesConfig.Remove((int)conf.Id.ViewPort); + DevicesConfigChanged.Invoke(conf); + Save(); } + public void Load() { var fileName = "DevicesConfig.json"; @@ -678,20 +676,13 @@ public void Load() string devicesConfigContent = File.ReadAllText(layoutConfigPath, Encoding.UTF8); DeviceLayoutManager manager = JsonConvert.DeserializeObject(devicesConfigContent, new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }); - var devicesConfig = manager?.DevicesConfig ?? new Dictionary(); - - DeviceLayouts.Clear(); + DevicesConfig = manager?.DevicesConfig ?? new Dictionary(); - foreach (var config in devicesConfig.Values) + foreach ( var conf in DevicesConfig.Values) { - if (config.Offset.X < 0 || config.Offset.Y < 0) - config.Offset = new Point(0, 0); - - var layout = new Control_DeviceLayout(config); - - DeviceLayouts.Add(layout); - + DevicesConfigChanged.Invoke(conf); } + } } private void Save() @@ -706,7 +697,8 @@ public void SaveConfiguration(DeviceConfig config) //if (DevicesConfig.SelectMany(dc => dc.Id )) DevicesConfig[(int)config.Id.ViewPort] = config; - DeviceLayouts.Where(dl => dl.DeviceConfig.Id.ViewPort == config.Id.ViewPort).FirstOrDefault().DeviceConfig = config; + //DeviceLayouts.Where(dl => dl.DeviceConfig.Id.ViewPort == config.Id.ViewPort).FirstOrDefault().DeviceConfig = config; + double baseline_x = double.MaxValue; double baseline_y = double.MaxValue; foreach (DeviceConfig dc in DevicesConfig.Values) @@ -722,10 +714,8 @@ public void SaveConfiguration(DeviceConfig config) dc.Offset = new Point((int)(dc.Offset.X - baseline_x), (int)(dc.Offset.Y - baseline_y)); } - var fileName = "DevicesConfig.json"; - var layoutConfigPath = Path.Combine(Global.AppDataDirectory, fileName); - var content = JsonConvert.SerializeObject(this, Formatting.Indented); - File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); + DevicesConfigChanged.Invoke(config); + Save(); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 87e81f904..2ec5070bb 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -109,7 +109,7 @@ public DeviceConfig DeviceConfig public Control_DeviceLayout() { InitializeComponent(); - DeviceConfig = new DeviceConfig(); + //DeviceConfig = new DeviceConfig(); KeycapLayouts.CollectionChanged += HandleChange; DataContext = KeycapLayouts; //DataContext = KeycapLayouts; @@ -119,6 +119,8 @@ public Control_DeviceLayout(DeviceConfig config) { InitializeComponent(); //device_grid = FindName("device_grid") as Canvas; + if (config.Offset.X < 0 || config.Offset.Y < 0) + config.Offset = new Point(0, 0); DeviceConfig = config; KeycapLayouts.CollectionChanged += HandleChange; //DataContext = KeycapLayouts; diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs index 74c4cd23c..a635d1c02 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs @@ -36,7 +36,11 @@ public partial class Control_DeviceLayoutPresenter : UserControl typeof(bool), typeof(Control_DeviceLayoutPresenter), new PropertyMetadata(false)); - public ObservableCollection DeviceLayouts => Global.devicesLayout.DeviceLayouts; + public ObservableCollection DeviceLayouts + { + get; + private set; + } = new ObservableCollection(); public bool IsLayoutMoveEnabled { get { return (bool)GetValue(IsLayoutMoveEnabledProperty); } @@ -50,7 +54,8 @@ public Control_DeviceLayoutPresenter() Global.Configuration.PropertyChanged += Configuration_PropertyChanged; this.keyboard_record_message.Visibility = Visibility.Hidden; - DeviceLayouts.CollectionChanged += HandleChange; + Global.devicesLayout.DevicesConfigChanged += DevicesConfigChanged; + editor_canvas.Children.Add(new LayerEditor(editor_canvas)); //DeviceLayoutNumberChanged(this); } @@ -59,29 +64,30 @@ private void UserControl_Loaded(object sender, RoutedEventArgs e) { Global.devicesLayout.Load(); } - private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) + private void DevicesConfigChanged(DeviceConfig changedConf) { - if (e.Action == NotifyCollectionChangedAction.Replace) - { - throw new Exception("The device layouts shouldn't been replaced"); - } - else if (e.Action == NotifyCollectionChangedAction.Add) - { - foreach (Control_DeviceLayout layout in e.NewItems) + var layoutQuery = DeviceLayouts.Where(l => l.DeviceConfig == changedConf); + if (Global.devicesLayout.DevicesConfig.Values.Contains(changedConf)){ + if (layoutQuery.Any()) { + Layout_DeviceLayoutUpdated(layoutQuery.First()); + } + else + { + Control_DeviceLayout layout = new Control_DeviceLayout(changedConf); layout.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated; ///layout.DeviceConfig.ConfigurationChanged += Layout_DeviceConfigUpdated; layout.MouseDoubleClick += DeviceLayout_MouseDoubleClick; layout.MouseDown += DeviceLayout_MouseDown; layout.MouseMove += DeviceLayout_MouseMove; layout.MouseUp += DeviceLayout_MouseUp; + DeviceLayouts.Add(layout); } } - else if (e.Action == NotifyCollectionChangedAction.Remove) + else { - Layout_DeviceLayoutUpdated(this); + DeviceLayouts.Remove(layoutQuery.First()); } - } @@ -107,7 +113,7 @@ private void Configuration_PropertyChanged(object sender, System.ComponentModel. } private void AddNewDeviceLayout(object sender, RoutedEventArgs e) { - Global.devicesLayout.DeviceLayouts.Add(new Control_DeviceLayout(new DeviceConfig())); + Global.devicesLayout.AddNewDeviceLayout(); } private void OpenEnableMenu(object sender, RoutedEventArgs e) @@ -147,7 +153,7 @@ private void Layout_DeviceLayoutUpdated(object sender) } foreach (Control_DeviceLayout layout in DeviceLayouts) { - layout.DeviceConfig.Offset = new Point((int)(layout.DeviceConfig.Offset.X - baseline_x), (int)(layout.DeviceConfig.Offset.Y - baseline_y)); + //layout.DeviceConfig.Offset = new Point((int)(layout.DeviceConfig.Offset.X - baseline_x), (int)(layout.DeviceConfig.Offset.Y - baseline_y)); layout.RenderTransform = new TranslateTransform(layout.DeviceConfig.Offset.X, layout.DeviceConfig.Offset.Y); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index d23b9f20c..881ec01df 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -60,6 +60,8 @@ public Window_DeviceConfig(Control_DeviceLayout config) this.device_view.SelectedIndex = selectedIndex; this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; + this.device_type.IsEnabled = Config.TypeChangeEnabled; + this.device_layout.SelectedItem = Config.SelectedLayout; layoutName.Text = Config.SelectedLayout; @@ -205,7 +207,7 @@ private void deviceDelete_Click(object sender, RoutedEventArgs e) { if (MessageBox.Show("Are you sure that remove the device layout?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) { - Global.devicesLayout.DeviceLayouts.Remove(originalDeviceLayout); + Global.devicesLayout.RemoveDeviceLayout(originalDeviceLayout.DeviceConfig); tokenSource.Cancel(); Close(); } From cf5b47855bace9433f610b4005d1c976f192944a Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 12 Jun 2021 16:21:53 +0200 Subject: [PATCH 19/42] Fix async not working proberly, One openRGB device just one layout --- Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs | 4 +++- Project-Aurora/Project-Aurora/Devices/DeviceManager.cs | 9 ++++++--- .../Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs | 7 +++++-- .../Project-Aurora/Settings/DeviceLayoutManager.cs | 5 +++-- .../DeviceLayoutViewer/Window_DeviceConfig.xaml.cs | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs index c4623d034..18c6f7c5c 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading.Tasks; using Aurora.Settings; +using Newtonsoft.Json; namespace Aurora.Devices { @@ -21,8 +22,9 @@ public enum AuroraDeviceType public class UniqueDeviceId { public string ConnectorName = ""; - public string DeviceName { get; set; } = "Non OpenRGB Device"; + public string DeviceName { get; set; } = "Generic SDK device"; public int Index = 0; + [JsonIgnore] public int? ViewPort = null; public UniqueDeviceId() { diff --git a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs index ceceadc90..f3f18a0d2 100644 --- a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs +++ b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs @@ -324,10 +324,13 @@ public void UpdateDevices(Dictionary compositionLis } } - foreach (var dc in IndividualDevices.Where(d => d.IsConnected())) + foreach (var item in compositionList) { - if (dc.id?.ViewPort != null && compositionList.ContainsKey((int)dc.id.ViewPort)) - dc.UpdateDevice(compositionList[(int)dc.id.ViewPort]); + 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/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs index f653d3f67..0c2a6fdd2 100644 --- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs @@ -66,7 +66,7 @@ public class OpenRGBAuroraDevice : AuroraDevice private OpenRGBColor[] DeviceColors; private List KeyMapping; private int DeviceIndex; - + static object update_lock = new object(); private OpenRGBDeviceConnector Connector; protected Dictionary LedMap = new Dictionary(); @@ -141,7 +141,10 @@ protected override bool UpdateDeviceImpl(DeviceColorComposition composition) try { - Connector.UpdateLeds(DeviceIndex, DeviceColors); + lock (update_lock) + { + Connector.UpdateLeds(DeviceIndex, DeviceColors); + } } catch (Exception exc) { diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 21098f779..09ea5eb0e 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -678,9 +678,10 @@ public void Load() DevicesConfig = manager?.DevicesConfig ?? new Dictionary(); - foreach ( var conf in DevicesConfig.Values) + foreach ( var conf in DevicesConfig) { - DevicesConfigChanged.Invoke(conf); + conf.Value.Id.ViewPort = conf.Key; + DevicesConfigChanged.Invoke(conf.Value); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 881ec01df..bab3f9dfd 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -42,7 +42,7 @@ public Window_DeviceConfig(Control_DeviceLayout config) LoadDeviceType(Config.Type); - var deviceIdList = Global.dev_manager.IndividualDevices.Select(d => d.id).ToList(); + var deviceIdList = Global.dev_manager.IndividualDevices.Where(d => d.id.ViewPort == null).Select(d => d.id).ToList(); deviceIdList.Insert(0, new Devices.UniqueDeviceId()); int selectedIndex = int.MaxValue; for (int i = 0; i < deviceIdList.Count; i++) From 052c007aec40712afd198da86adad4f549666d38 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 18 Jun 2021 07:06:28 +0200 Subject: [PATCH 20/42] Add invisible background json flag and some performance optimalization --- .../Keyboard/Plain Keyboard/iso_layout.json | 4 +- .../Settings/Control_Settings.xaml | 4 -- .../Settings/DeviceLayoutManager.cs | 32 +++++++++- .../Control_DeviceLayout.xaml | 21 +++++-- .../Control_DeviceLayout.xaml.cs | 62 ++++++++++++------- .../Control_DeviceLayoutPresenter.xaml | 2 +- .../Control_DeviceLayoutPresenter.xaml.cs | 37 ++++++++--- .../DeviceLayoutViewer/Control_Keycap.xaml.cs | 1 + .../Keycaps/Control_ColorizedKeycap.xaml.cs | 10 ++- .../Control_ColorizedKeycapBlank.xaml.cs | 9 ++- .../Keycaps/Control_DefaultKeycap.xaml.cs | 8 ++- .../Control_DefaultKeycapBackglow.xaml.cs | 24 ++++--- .../Control_DefaultKeycapBackglowOnly.xaml.cs | 8 ++- .../Keycaps/Control_GhostKeycap.xaml.cs | 6 +- .../Keycaps/Control_ImageKeycap.xaml.cs | 1 + .../Keycaps/KeycapViewer.cs | 4 +- .../Window_DeviceConfig.xaml.cs | 7 ++- 17 files changed, 172 insertions(+), 68 deletions(-) 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 index 08952f9fe..388d868cb 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json @@ -1040,7 +1040,7 @@ { "Key":{ "visual_name":"#", - "tag":70, + "tag":71, "device_id":null }, "FontSize":12.0, @@ -1130,7 +1130,7 @@ { "Key":{ "visual_name":"\\", - "tag":51, + "tag":77, "device_id":null }, "FontSize":12.0, diff --git a/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml b/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml index faa9ef2c0..3b506d9a4 100755 --- a/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml +++ b/Project-Aurora/Project-Aurora/Settings/Control_Settings.xaml @@ -141,11 +141,7 @@ - - - - diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 09ea5eb0e..71d1bd206 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -471,6 +471,7 @@ public class DeviceConfig public Point Offset = new Point(0, 0); public bool LightingEnabled = true; public bool TypeChangeEnabled = true; + public bool InvisibleBackgroundEnabled = false; [JsonIgnore] protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); @@ -490,7 +491,7 @@ public DeviceConfig(int viewPort) Id = new Devices.UniqueDeviceId(); Id.ViewPort = viewPort; } - private DeviceConfig() + protected DeviceConfig() { // Private parameterless constructor. Leave private so that it forces everyone to use the Mandate parameter but allows serialization to work. } @@ -512,6 +513,7 @@ public void RefreshConfig() ConfigurationChanged?.Invoke(); } + [JsonIgnore] public virtual string LayoutPath => Path.Combine(layoutsPath, "Mouse", SelectedLayout + ".json"); } @@ -533,6 +535,10 @@ public KeyboardConfig(int viewPort) : base(viewPort) { Type = 0; SelectedKeyboardLayout = GetSystemKeyboardCulture(); + } + private KeyboardConfig() + { + } private string ConvertEnumToFileName() { @@ -693,10 +699,34 @@ private void Save() var content = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(layoutConfigPath, content, Encoding.UTF8); } + public void LayoutPositionChanged(DeviceConfig config) + { + double baseline_x = double.MaxValue; + double baseline_y = double.MaxValue; + foreach (DeviceConfig dc in DevicesConfig.Values) + { + if (dc.Offset.X < baseline_x) + baseline_x = dc.Offset.X; + + if (dc.Offset.Y < baseline_y) + baseline_y = dc.Offset.Y; + } + foreach (DeviceConfig dc in DevicesConfig.Values) + { + dc.Offset = new Point((int)(dc.Offset.X - baseline_x), (int)(dc.Offset.Y - baseline_y)); + } + + DevicesConfigChanged.Invoke(config); + Save(); + } + public void SaveConfiguration(DeviceConfig config) { //if (DevicesConfig.SelectMany(dc => dc.Id )) + if (config.Id == null) + + return; DevicesConfig[(int)config.Id.ViewPort] = config; //DeviceLayouts.Where(dl => dl.DeviceConfig.Id.ViewPort == config.Id.ViewPort).FirstOrDefault().DeviceConfig = config; diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml index 806f03be3..2213ed4b4 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml @@ -4,15 +4,16 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Aurora.Settings.DeviceLayoutViewer" - mc:Ignorable="d" - ItemsSource="{Binding}" - Loaded="UserControl_Loaded"> - + mc:Ignorable="d" + ItemsSource="{Binding Path=KeycapLayouts}"> + - + @@ -37,9 +38,17 @@ + + + + + + + + - + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 2ec5070bb..7b48f0637 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -20,22 +20,34 @@ namespace Aurora.Settings.DeviceLayoutViewer { + /// /// Interaction logic for Control_DeviceLayout.xaml /// public partial class Control_DeviceLayout : ItemsControl { + /*public class Wrap where T : struct + { + public T Value; + + public static implicit operator Wrap(T v) { return new Wrap { Value = v }; } + public static implicit operator T(Wrap w) { return w.Value; } + + public override string ToString() { return Value.ToString(); } + public override int GetHashCode() { return Value.GetHashCode(); } + // TODO other delegating operators/overloads + }*/ + public bool IsUpdateEnabled { get; set; } + public delegate void LayoutUpdatedEventHandler(object sender); - //private FrameworkElement device_layout = new FrameworkElement(); - public event LayoutUpdatedEventHandler DeviceLayoutUpdated; - public Dictionary KeyboardMap => KeycapLayouts.ToDictionary(k => k.GetKey(), k => k, new DeviceKey.EqualityComparer()); + public Dictionary KeyboardMap = new Dictionary(); public static readonly DependencyProperty DeviceHeightProperty = DependencyProperty.Register("DeviceHeight", typeof(int), typeof(Control_DeviceLayout), new PropertyMetadata(0)); public int DeviceHeight { get { return (int)GetValue(DeviceHeightProperty); } - set{ SetValue(DeviceHeightProperty, value); } + set { SetValue(DeviceHeightProperty, value); } } public static readonly DependencyProperty DeviceWidthProperty = DependencyProperty.Register("DeviceWidth", typeof(int), typeof(Control_DeviceLayout), new PropertyMetadata(0)); public int DeviceWidth @@ -54,7 +66,6 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) item.Config.PropertyChanged += KeycapPositionChanged; } } - RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); ResizeLayout(); } @@ -65,8 +76,17 @@ private void KeycapPositionChanged(object sender, PropertyChangedEventArgs e) ResizeLayout(); } } + public static readonly DependencyProperty BackgroundVisibilityProperty = DependencyProperty.Register("BackgroundVisibility", typeof(bool), typeof(Control_DeviceLayout), new PropertyMetadata(false)); + public bool BackgroundVisibility + { + get { return (bool)GetValue(BackgroundVisibilityProperty); } + set { SetValue(BackgroundVisibilityProperty, value); } + } + public void ResizeLayout() { + int i = 0; + KeyboardMap = KeycapLayouts.ToDictionary(k => k.GetKey(), k => i++, new DeviceKey.EqualityComparer()); int layout_height = 10; int layout_width = 10; foreach (Control_Keycap key in KeycapLayouts) @@ -91,7 +111,6 @@ public void ResizeLayout() this.Height = 200; } UpdateLayout(); - DeviceLayoutUpdated?.Invoke(this); } public static readonly DependencyProperty DeviceConfigProperty = DependencyProperty.Register("DeviceConfig", typeof(DeviceConfig), typeof(Control_DeviceLayout)); @@ -102,17 +121,15 @@ public DeviceConfig DeviceConfig set { SetValue(DeviceConfigProperty, value); - DeviceConfig.ConfigurationChanged += ConfigChanged; + //DeviceConfig.ConfigurationChanged += ConfigChanged; ConfigChanged(); + } } public Control_DeviceLayout() { InitializeComponent(); - //DeviceConfig = new DeviceConfig(); - KeycapLayouts.CollectionChanged += HandleChange; - DataContext = KeycapLayouts; - //DataContext = KeycapLayouts; + DataContext = this; } public Control_DeviceLayout(DeviceConfig config) @@ -122,41 +139,38 @@ public Control_DeviceLayout(DeviceConfig config) if (config.Offset.X < 0 || config.Offset.Y < 0) config.Offset = new Point(0, 0); DeviceConfig = config; - KeycapLayouts.CollectionChanged += HandleChange; - //DataContext = KeycapLayouts; - DataContext = KeycapLayouts; + + DataContext = this; //device_layout = contentPresenter.ContentTemplate; - ConfigChanged(); } public void ConfigChanged() { + BackgroundVisibility = DeviceConfig.InvisibleBackgroundEnabled; Task.Run(() => { Dispatcher.Invoke(() => { + KeycapLayouts.CollectionChanged -= HandleChange; DeviceLayout layout = new DeviceLayout(DeviceConfig); Keys = layout.LoadLayout(); foreach (var key in Keys) { key.Key.DeviceId = DeviceConfig.Id.ViewPort; } + ResizeLayout(); + KeycapLayouts.CollectionChanged += HandleChange; }); }); } - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - DeviceLayoutUpdated?.Invoke(this); - } - private List _Keys = new List(); - public List Keys + public List Keys { - get { return _Keys;} + get { return _Keys; } set { _Keys = value; @@ -166,7 +180,7 @@ public List Keys //DeviceLayoutUpdated?.Invoke(this); - } + } } public static int PixelToByte(int pixel) { @@ -204,7 +218,7 @@ public void SetKeyboardColors(Dictionary keylig if (KeyboardMap.ContainsKey(kvp.Key)) { System.Drawing.Color key_color = kvp.Value; - KeyboardMap[kvp.Key].SetColor(Utils.ColorUtils.DrawingColorToMediaColor(System.Drawing.Color.FromArgb(255, Utils.ColorUtils.MultiplyColorByScalar(key_color, key_color.A / 255.0D)))); + KeycapLayouts[KeyboardMap[kvp.Key]].SetColor(Utils.ColorUtils.DrawingColorToMediaColor(System.Drawing.Color.FromArgb(255, Utils.ColorUtils.MultiplyColorByScalar(key_color, key_color.A / 255.0D)))); } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml index 354f5a05e..ee3b50de6 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml @@ -7,7 +7,7 @@ xmlns:Controls="clr-namespace:Aurora.Controls" mc:Ignorable="d" VerticalAlignment="Top" HorizontalAlignment="Left" - Loaded="UserControl_Loaded" MouseRightButtonDown="OpenEnableMenu" + MouseRightButtonDown="OpenEnableMenu" d:DesignHeight="450" d:DesignWidth="800"> diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs index a635d1c02..72308c1e9 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml.cs @@ -57,25 +57,39 @@ public Control_DeviceLayoutPresenter() Global.devicesLayout.DevicesConfigChanged += DevicesConfigChanged; editor_canvas.Children.Add(new LayerEditor(editor_canvas)); - //DeviceLayoutNumberChanged(this); - } - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { Global.devicesLayout.Load(); + //DeviceLayoutNumberChanged(this); } + private void DevicesConfigChanged(DeviceConfig changedConf) { var layoutQuery = DeviceLayouts.Where(l => l.DeviceConfig == changedConf); if (Global.devicesLayout.DevicesConfig.Values.Contains(changedConf)){ if (layoutQuery.Any()) { - Layout_DeviceLayoutUpdated(layoutQuery.First()); + Control_DeviceLayout layout = layoutQuery.First(); + layout.DeviceConfig = changedConf; + + //Layout_DeviceLayoutUpdated(layout); + UpdateLayoutsPosition(); } else { Control_DeviceLayout layout = new Control_DeviceLayout(changedConf); - layout.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated; + //layout.DeviceLayoutUpdated += Layout_DeviceLayoutUpdated; + //layout.LayoutUpdated += (object sender, EventArgs e) => { UpdateLayoutsPosition(); }; + // el not loaded yet. Attach a wrapper handler that can be removed upon execution. + EventHandler wrapperHandler = null; + wrapperHandler = delegate + { + if (layout.KeycapLayouts.Count == 0) + return; + layout.LayoutUpdated -= wrapperHandler; + UpdateLayoutsPosition(); + }; + layout.LayoutUpdated += wrapperHandler; + layout.LayoutUpdated += wrapperHandler; ///layout.DeviceConfig.ConfigurationChanged += Layout_DeviceConfigUpdated; layout.MouseDoubleClick += DeviceLayout_MouseDoubleClick; layout.MouseDown += DeviceLayout_MouseDown; @@ -110,6 +124,11 @@ private void Configuration_PropertyChanged(object sender, System.ComponentModel. { CalculateBitmap(); } + else if (e.PropertyName.Equals(nameof(Configuration.VirtualkeyboardKeycapType))) + { + DeviceLayouts.Clear(); + Global.devicesLayout.Load(); + } } private void AddNewDeviceLayout(object sender, RoutedEventArgs e) { @@ -126,7 +145,7 @@ private void OpenEnableMenu(object sender, RoutedEventArgs e) ContextMenu cm = new ContextMenu() { PlacementTarget = sender as Button, IsOpen = true }; cm.Items.Add(menuItem); } - private void Layout_DeviceLayoutUpdated(object sender) + private void UpdateLayoutsPosition() { double current_width = 800; double current_height = 200; @@ -166,8 +185,6 @@ private void Layout_DeviceLayoutUpdated(object sender) layouts_viewbox.MaxWidth = layout_container.Width; layouts_viewbox.MaxHeight = layout_container.Height; - layouts_viewbox.UpdateLayout(); - this.UpdateLayout(); CalculateBitmap(); } @@ -247,7 +264,7 @@ private void DeviceLayout_MouseUp(object sender, MouseButtonEventArgs e) if (senderLayout.RenderTransform is TranslateTransform layoutTranslate) { senderLayout.DeviceConfig.Offset = new Point(layoutTranslate.X, layoutTranslate.Y); - Global.devicesLayout.SaveConfiguration(senderLayout.DeviceConfig); + Global.devicesLayout.LayoutPositionChanged(senderLayout.DeviceConfig); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs index b80c2bd21..fbcc666ec 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_Keycap.xaml.cs @@ -108,6 +108,7 @@ public Control_Keycap(DeviceKeyConfiguration key) InitializeComponent(); Keycap = GetKeycapViewer(key); + Keycap.UpdateText(); DataContext = Keycap; } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs index ced9a2ed9..6aa849ae1 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs @@ -24,6 +24,7 @@ namespace Aurora.Settings.DeviceLayoutViewer.Keycaps public partial class Control_ColorizedKeycap : KeycapViewer { private Color? current_color = null; + private bool state_was_selected = false; public Control_ColorizedKeycap() { @@ -63,7 +64,8 @@ public override void SetColor(Color key_color) if (IsSelected) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else + + if (!current_color.Equals(key_color) || IsSelected != state_was_selected) { if (keyBorder.IsEnabled) { @@ -74,7 +76,13 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } + state_was_selected = !IsSelected; } + + } + + public override void UpdateText() + { UpdateText(keyCap); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs index 15fdd637c..ddfae8af8 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs @@ -22,6 +22,7 @@ namespace Aurora.Settings.DeviceLayoutViewer.Keycaps public partial class Control_ColorizedKeycapBlank : KeycapViewer { private Color current_color = Color.FromArgb(0, 0, 0, 0); + private bool state_was_selected = false; public Control_ColorizedKeycapBlank() { @@ -57,11 +58,11 @@ public override void SetColor(Color key_color) if (IsSelected) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else + + if (!current_color.Equals(key_color) || IsSelected != state_was_selected) { if (keyBorder.IsEnabled) { - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); } else @@ -69,7 +70,11 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } + state_was_selected = !IsSelected; } + } + public override void UpdateText() { } + } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs index 56b77f399..3762d4697 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs @@ -23,6 +23,7 @@ namespace Aurora.Settings.DeviceLayoutViewer.Keycaps public partial class Control_DefaultKeycap : KeycapViewer { private Color current_color = Color.FromArgb(0, 0, 0, 0); + private bool state_was_selected = false; public Control_DefaultKeycap() { @@ -63,7 +64,8 @@ public override void SetColor(Color key_color) if (IsSelected) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else + + if (!current_color.Equals(key_color) || IsSelected != state_was_selected) { if (keyBorder.IsEnabled) { @@ -77,7 +79,11 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } + state_was_selected = !IsSelected; } + } + public override void UpdateText() + { UpdateText(keyCap); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs index 095156b30..1cc486bd0 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs @@ -23,6 +23,7 @@ namespace Aurora.Settings.DeviceLayoutViewer.Keycaps public partial class Control_DefaultKeycapBackglow : KeycapViewer { private Color current_color = Color.FromArgb(0, 0, 0, 0); + private bool state_was_selected = false; public Control_DefaultKeycapBackglow() { @@ -62,16 +63,23 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); else { - if (keyBorder.IsEnabled) - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); - } - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); - keyBorder.BorderThickness = new Thickness(0); + if (IsSelected != state_was_selected) + { + if (keyBorder.IsEnabled) + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); + } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + state_was_selected = !IsSelected; } } + } + public override void UpdateText() + { UpdateText(keyCap); } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs index 8d1157b8a..accb79c2a 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs @@ -23,6 +23,7 @@ namespace Aurora.Settings.DeviceLayoutViewer.Keycaps public partial class Control_DefaultKeycapBackglowOnly : KeycapViewer { private Color current_color = Color.FromArgb(0, 0, 0, 0); + private bool state_was_selected = false; public Control_DefaultKeycapBackglowOnly() { @@ -59,7 +60,7 @@ public override void SetColor(Color key_color) if (IsSelected) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else + if (IsSelected != state_was_selected) { if (keyBorder.IsEnabled) { @@ -70,10 +71,13 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } + state_was_selected = !IsSelected; } + } + public override void UpdateText() + { UpdateText(keyCap); } - } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs index 5c17b40c0..5c3ee501d 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs @@ -24,6 +24,7 @@ public partial class Control_GhostKeycap : KeycapViewer private Color current_color = Color.FromArgb(0, 0, 0, 0); private Devices.DeviceKeys associatedKey = DeviceKeys.NONE; private bool isImage = false; + private bool state_was_selected = false; public Control_GhostKeycap() { @@ -100,7 +101,8 @@ public override void SetColor(Color key_color) if (IsSelected) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else + + if (!current_color.Equals(key_color) || IsSelected != state_was_selected) { if (keyBorder.IsEnabled) { @@ -114,7 +116,9 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } + state_was_selected = !IsSelected; } } + public override void UpdateText() { } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs index 7591de32f..bbb95d1c8 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs @@ -83,5 +83,6 @@ override public void SetColor(Color key_color) } } + public override void UpdateText() {} } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs index 98a1cfe31..237decbfa 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/KeycapViewer.cs @@ -44,8 +44,8 @@ public void SelectKey(bool isSelected) { IsSelected = isSelected; } - - public void UpdateText(TextBlock keycapName) + public abstract void UpdateText(); + protected void UpdateText(TextBlock keycapName) { if (Config.VisualNameUpdateEnabled) { diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index bab3f9dfd..5d424760d 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -66,7 +66,7 @@ public Window_DeviceConfig(Control_DeviceLayout config) layoutName.Text = Config.SelectedLayout; if (Config is KeyboardConfig keyboardConfig) - this.keyboard_layout.SelectedItem = keyboardConfig.SelectedKeyboardLayout; + this.keyboard_layout.SelectedValue = keyboardConfig.SelectedKeyboardLayout; this.devices_disable_lighting.IsChecked = !Config.LightingEnabled; DataContext = this; @@ -219,9 +219,10 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) { Config.SelectedLayout = layoutName.Text; var offset = new Point(); - if(Config.Type == 0 && deviceLayout.KeyboardMap.ContainsKey(Devices.DeviceKeys.ESC)) + var escIndex= deviceLayout.KeyboardMap.Where(lp => lp.Key == Devices.DeviceKeys.ESC); + if (Config.Type == 0 && escIndex.Any()) { - var escConfig = deviceLayout.KeyboardMap[Devices.DeviceKeys.ESC].Config; + var escConfig = deviceLayout.KeycapLayouts[escIndex.First().Value].Config; offset.X = -escConfig.X; offset.Y = -escConfig.Y; } From 9bc31350f237456af3353cf640df131edce758f7 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 19 Jun 2021 15:54:07 +0200 Subject: [PATCH 21/42] Fix selection Key Layout, finalizing the Control_Keys --- .../Controls/ColorZones.xaml.cs | 2 +- .../Project-Aurora/Controls/KeySequence.xaml | 3 +- .../Controls/KeySequence.xaml.cs | 151 ++++++++++-------- .../Keyboard/Plain Keyboard/iso_layout.json | 6 +- .../Keycaps/Control_ColorizedKeycap.xaml.cs | 20 +-- .../Control_ColorizedKeycapBlank.xaml.cs | 19 +-- .../Keycaps/Control_DefaultKeycap.xaml.cs | 26 ++- .../Control_DefaultKeycapBackglow.xaml.cs | 37 ++--- .../Control_DefaultKeycapBackglowOnly.xaml.cs | 18 +-- .../Keycaps/Control_GhostKeycap.xaml.cs | 18 +-- 10 files changed, 150 insertions(+), 150 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Controls/ColorZones.xaml.cs b/Project-Aurora/Project-Aurora/Controls/ColorZones.xaml.cs index 485889c4f..56fbc7fb1 100644 --- a/Project-Aurora/Project-Aurora/Controls/ColorZones.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/ColorZones.xaml.cs @@ -145,7 +145,7 @@ private void ks_ListUpdated(object sender, EventArgs e) { if (cz_list.SelectedItem != null) { - ((ColorZone)cz_list.SelectedItem).keysequence.keys = ks.SelectedDeviceKeys; + ((ColorZone)cz_list.SelectedItem).keysequence.keys = ks.List; ConfigManager.Save(Global.Configuration); } } diff --git a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml index bea8b194b..0ca0b0687 100644 --- a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml +++ b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml @@ -3,12 +3,11 @@ 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 f74478159..d8b3641d9 100644 --- a/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/KeySequence.xaml.cs @@ -1,7 +1,6 @@ using Aurora.Settings; using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Windows; @@ -42,20 +41,43 @@ public string RecordingTag } } + public List List + { + get + { + if (Sequence == null) + Sequence = new Settings.KeySequence(); + + return Sequence.keys; + } + set + { + if (Sequence == null) + Sequence = new Settings.KeySequence(value.ToArray()); + else + { + Sequence.keys = value; + } + SequenceKeysChange?.Invoke(this, new EventArgs()); + } + } private bool allowListRefresh = true; #region Sequence Dependency Property [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; } @@ -67,17 +89,14 @@ private static void SequencePropertyChanged(DependencyObject sender, DependencyP // Handle the new sequence. If a region, this will add it to the editor source.sequence_updateToLayerEditor(); - //SelectedDeviceKeyList // Manually update the keysequence list. Gross - if (source.allowListRefresh) { - source.SelectedDeviceKeyList.Clear(); - //source.keys_keysequence.Items.Clear(); + if (source.allowListRefresh) + { + source.keys_keysequence.Items.Clear(); foreach (var key in @new.keys) - source.SelectedDeviceKeyList.Add(key); - // source.keys_keysequence.Items.Add(key); + source.keys_keysequence.Items.Add(key); } - // Manually update the "Use freestyle instead" checkbox state source.sequence_freestyle_checkbox.IsChecked = @new.type == Settings.KeySequenceType.FreeForm; @@ -86,9 +105,7 @@ private static void SequencePropertyChanged(DependencyObject sender, DependencyP } #endregion - public IEnumerable SelectedItems => keys_keysequence.SelectedItems.Cast(); - - private int SelectedItemIndex => keys_keysequence.SelectedIndex; + public IEnumerable SelectedItems => keys_keysequence.SelectedItems.Cast(); [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public static readonly DependencyProperty FreestyleEnabledProperty = DependencyProperty.Register("FreestyleEnabled", typeof(bool), typeof(UserControl)); @@ -105,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); } @@ -129,17 +147,11 @@ private static void ShowOnCanvasPropertyChanged(DependencyObject target, Depende /// Fired whenever keys are changed. public event EventHandler SequenceKeysChange; public event SelectionChangedEventHandler SelectionChanged; - public ObservableCollection SelectedDeviceKeyList { get; set; } - - public List SelectedDeviceKeys => SelectedDeviceKeyList.ToList(); - public KeySequence() { InitializeComponent(); - SelectedDeviceKeyList = new ObservableCollection(); - /* BAD BAD BAD!!! Don't do this! Doing this overrides the DataContext of the control, so if you were to use a binding on this control * from another control, the binding would try access 'this' instead. E.G., in the following example, the binding is attempting to * access KeySequence.SomeProperty, which is not what is expected. By looking at this code (and if it were a proper control), the @@ -147,79 +159,86 @@ public KeySequence() * * * */ - this.DataContext = this; + //this.DataContext = this; } private void sequence_remove_keys_Click(object sender, RoutedEventArgs e) { - var selectedKeys = SelectedItems.ToList(); - foreach (var item in selectedKeys) + if (Utils.UIUtils.ListBoxRemoveSelected(this.keys_keysequence)) { - if(SelectedDeviceKeyList.Contains(item)) - SelectedDeviceKeyList.Remove(item); + allowListRefresh = false; + List = Utils.UIUtils.SequenceToList(this.keys_keysequence.Items); + allowListRefresh = true; } } private void sequence_up_keys_Click(object sender, RoutedEventArgs e) { - var selectedKey = SelectedDeviceKeyList[SelectedItemIndex]; - var selectedIndex = SelectedItemIndex; - SelectedDeviceKeyList[selectedIndex] = SelectedDeviceKeyList[selectedIndex - 1]; - SelectedDeviceKeyList[selectedIndex - 1] = selectedKey; - keys_keysequence.SelectedItem = selectedKey; + if (Utils.UIUtils.ListBoxMoveSelectedUp(this.keys_keysequence)) + { + allowListRefresh = false; + List = Utils.UIUtils.SequenceToList(this.keys_keysequence.Items); + allowListRefresh = true; + } } private void sequence_down_keys_Click(object sender, RoutedEventArgs e) { - var selectedKey = SelectedDeviceKeyList[SelectedItemIndex]; - var selectedIndex = SelectedItemIndex; - SelectedDeviceKeyList[selectedIndex] = SelectedDeviceKeyList[selectedIndex + 1]; - SelectedDeviceKeyList[selectedIndex + 1] = selectedKey; - keys_keysequence.SelectedItem = selectedKey; + if (Utils.UIUtils.ListBoxMoveSelectedDown(this.keys_keysequence)) + { + allowListRefresh = false; + List = Utils.UIUtils.SequenceToList(this.keys_keysequence.Items); + allowListRefresh = true; + } } private void btnReverseOrder_Click(object sender, RoutedEventArgs e) { - int totalCount = SelectedDeviceKeyList.Count; - for (int i = totalCount - 1; i > 0; i--) + if (Utils.UIUtils.ListBoxReverseOrder(this.keys_keysequence)) { allowListRefresh = false; - DeviceKey key = SelectedDeviceKeyList[totalCount - 1]; - SelectedDeviceKeyList.RemoveAt(totalCount - 1); - SelectedDeviceKeyList.Insert((totalCount - 1) - i, key); + List = Utils.UIUtils.SequenceToList(this.keys_keysequence.Items); allowListRefresh = true; } + } private void sequence_record_keys_Click(object sender, RoutedEventArgs e) + { + RecordKeySequence(RecordingTag, (sender as Button), this.keys_keysequence); + allowListRefresh = false; + List = Utils.UIUtils.SequenceToList(this.keys_keysequence.Items); + allowListRefresh = true; + } + + private void RecordKeySequence(string whoisrecording, Button button, ListBox sequence_listbox) { if (Global.key_recorder.IsRecording()) { - if (Global.key_recorder.GetRecordingType().Equals(RecordingTag)) + if (Global.key_recorder.GetRecordingType().Equals(whoisrecording)) { Global.key_recorder.StopRecording(); - (sender as Button).Content = "Assign Keys"; + button.Content = "Assign Keys"; DeviceKey[] recorded_keys = Global.key_recorder.GetKeys(); - if (SelectedItemIndex > 0 && SelectedItemIndex < (SelectedDeviceKeyList.Count - 1)) + if (sequence_listbox.SelectedIndex > 0 && sequence_listbox.SelectedIndex < (sequence_listbox.Items.Count - 1)) { - int insertpos = SelectedItemIndex; + int insertpos = sequence_listbox.SelectedIndex; foreach (var key in recorded_keys) { - SelectedDeviceKeyList.Insert(insertpos, key); + sequence_listbox.Items.Insert(insertpos, key); insertpos++; } } else { foreach (var key in recorded_keys) - SelectedDeviceKeyList.Add(key); + sequence_listbox.Items.Add(key); } + Global.key_recorder.Reset(); - Sequence.keys = SelectedDeviceKeyList.ToList(); - //SequenceKeysChange.Invoke(this, e); } else { @@ -228,8 +247,8 @@ private void sequence_record_keys_Click(object sender, RoutedEventArgs e) } else { - Global.key_recorder.StartRecording(RecordingTag); - (sender as Button).Content = "Stop Assigning"; + Global.key_recorder.StartRecording(whoisrecording); + button.Content = "Stop Assigning"; } } @@ -264,7 +283,7 @@ public void sequence_updateToLayerEditor() private void freeform_updated(Settings.FreeFormObject newfreeform) { - if(newfreeform != null) + if (newfreeform != null) { Sequence.freeform = newfreeform; @@ -297,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; @@ -316,15 +335,15 @@ private void UserControl_IsEnabledChanged(object sender, DependencyPropertyChang private void keys_keysequence_SelectionChanged(object sender, SelectionChangedEventArgs e) { - this.sequence_up.IsEnabled = false; - this.sequence_down.IsEnabled = false; - - if (SelectedItems.Count() == 1) + if (keys_keysequence.SelectedItems.Count <= 1) { - if (SelectedItemIndex != 0) - this.sequence_up.IsEnabled = IsEnabled && true; - if (SelectedItemIndex != SelectedDeviceKeyList.Count() - 1) - this.sequence_down.IsEnabled = IsEnabled && true; + this.sequence_up.IsEnabled = IsEnabled && true; + this.sequence_down.IsEnabled = IsEnabled && true; + } + else + { + this.sequence_up.IsEnabled = IsEnabled && false; + this.sequence_down.IsEnabled = IsEnabled && false; } // Bubble the selection changed event @@ -341,15 +360,15 @@ private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChang if (Sequence != null) { //this.keys_keysequence.InvalidateVisual(); - SelectedDeviceKeyList.Clear(); + this.keys_keysequence.Items.Clear(); foreach (var key in Sequence.keys) - SelectedDeviceKeyList.Add(key); + this.keys_keysequence.Items.Add(key); } } else sequence_removeFromLayerEditor(); } - + } } -} +} \ 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 index 388d868cb..8d00a4633 100644 --- a/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json +++ b/Project-Aurora/Project-Aurora/DeviceLayouts/Keyboard/Plain Keyboard/iso_layout.json @@ -244,8 +244,8 @@ }, { "Key":{ - "visual_name":"~", - "tag":158, + "visual_name":"`", + "tag":17, "device_id":null }, "FontSize":12.0, @@ -1025,7 +1025,7 @@ { "Key":{ "visual_name":"'", - "tag":17, + "tag":70, "device_id":null }, "FontSize":12.0, diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs index 6aa849ae1..60a6e02e6 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycap.xaml.cs @@ -54,19 +54,15 @@ public Control_ColorizedKeycap(DeviceKeyConfiguration key) : base(key) public override void SetColor(Color key_color) { - if (!key_color.Equals(current_color)) - { - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); - keyBorder.BorderBrush = new SolidColorBrush(key_color); - - current_color = key_color; - } - if (IsSelected) + { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - - if (!current_color.Equals(key_color) || IsSelected != state_was_selected) + state_was_selected = true; + } + else if (!current_color.Equals(key_color) || state_was_selected) { + //keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + keyBorder.BorderBrush = new SolidColorBrush(key_color); if (keyBorder.IsEnabled) { keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); @@ -76,9 +72,9 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } - state_was_selected = !IsSelected; + current_color = key_color; + state_was_selected = false; } - } public override void UpdateText() diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs index ddfae8af8..bf26c5a32 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ColorizedKeycapBlank.xaml.cs @@ -49,18 +49,15 @@ public Control_ColorizedKeycapBlank(DeviceKeyConfiguration key) : base(key) public override void SetColor(Color key_color) { - if (!current_color.Equals(key_color)) - { - keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); - keyBorder.BorderBrush = new SolidColorBrush(key_color); - current_color = key_color; - } - if (IsSelected) + { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - - if (!current_color.Equals(key_color) || IsSelected != state_was_selected) + state_was_selected = true; + } + else if (!current_color.Equals(key_color) || state_was_selected) { + //keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + keyBorder.BorderBrush = new SolidColorBrush(key_color); if (keyBorder.IsEnabled) { keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); @@ -70,9 +67,9 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } - state_was_selected = !IsSelected; + current_color = key_color; + state_was_selected = false; } - } public override void UpdateText() { } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs index 3762d4697..982fa2814 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycap.xaml.cs @@ -51,35 +51,33 @@ public Control_DefaultKeycap(DeviceKeyConfiguration key) : base(key) public override void SetColor(Color key_color) { - if (!current_color.Equals(key_color)) - { - - if (string.IsNullOrWhiteSpace(keyCap.Text)) - keyBorder.BorderBrush = new SolidColorBrush(key_color); - else - keyCap.Foreground = new SolidColorBrush(key_color); - - current_color = key_color; - } - if (IsSelected) + { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - - if (!current_color.Equals(key_color) || IsSelected != state_was_selected) + state_was_selected = true; + } + else if (!current_color.Equals(key_color) || state_was_selected) { if (keyBorder.IsEnabled) { if (string.IsNullOrWhiteSpace(keyCap.Text)) + { keyBorder.Background = new SolidColorBrush(Utils.ColorUtils.MultiplyColorByScalar(key_color, 0.6)); + keyBorder.BorderBrush = new SolidColorBrush(key_color); + } else + { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); + keyCap.Foreground = new SolidColorBrush(key_color); + } } else { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } - state_was_selected = !IsSelected; + current_color = key_color; + state_was_selected = false; } } public override void UpdateText() diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs index 1cc486bd0..eda2373b2 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglow.xaml.cs @@ -51,31 +51,26 @@ public Control_DefaultKeycapBackglow(DeviceKeyConfiguration key) : base(key) public override void SetColor(Color key_color) { - if (!current_color.Equals(key_color)) - { - keyCap.Foreground = new SolidColorBrush(key_color); - grid_backglow.Background = new SolidColorBrush(key_color); - - current_color = key_color; - } - if (IsSelected) + { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - else + state_was_selected = true; + } + else if (!current_color.Equals(key_color) || state_was_selected) { - if (IsSelected != state_was_selected) - { - if (keyBorder.IsEnabled) - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); - } - else - { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); - keyBorder.BorderThickness = new Thickness(0); - } - state_was_selected = !IsSelected; + keyCap.Foreground = new SolidColorBrush(key_color); + grid_backglow.Background = new SolidColorBrush(key_color); + if (keyBorder.IsEnabled) + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); } + else + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); + keyBorder.BorderThickness = new Thickness(0); + } + current_color = key_color; + state_was_selected = false; } } public override void UpdateText() diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs index accb79c2a..70e0b3ac4 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_DefaultKeycapBackglowOnly.xaml.cs @@ -51,27 +51,25 @@ public Control_DefaultKeycapBackglowOnly(DeviceKeyConfiguration key) : base(key) } public override void SetColor(Color key_color) { - if (!current_color.Equals(key_color)) - { - grid_backglow.Background = new SolidColorBrush(key_color); - - current_color = key_color; - } - if (IsSelected) + { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - if (IsSelected != state_was_selected) + state_was_selected = true; + } + else if (!current_color.Equals(key_color) || state_was_selected) { + grid_backglow.Background = new SolidColorBrush(key_color); if (keyBorder.IsEnabled) { - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)30, (byte)30, (byte)30)); } else { keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } - state_was_selected = !IsSelected; + current_color = key_color; + state_was_selected = false; } } public override void UpdateText() diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs index 5c3ee501d..e1c4ad0bd 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_GhostKeycap.xaml.cs @@ -89,21 +89,18 @@ public override void SetColor(Color key_color) { key_color = Color.FromArgb(255, 255, 255, 255); //No colors allowed! - if (!current_color.Equals(key_color)) + if (IsSelected) + { + keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); + state_was_selected = true; + } + else if (!current_color.Equals(key_color) || state_was_selected) { if (isImage) { if (associatedKey != DeviceKeys.NONE) keyBorder.Background = new SolidColorBrush(key_color); } - current_color = key_color; - } - - if (IsSelected) - keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb((byte)255, (byte)0, (byte)(Math.Min(Math.Pow(Math.Cos((double)(Utils.Time.GetMilliSeconds() / 1000.0) * Math.PI) + 0.05, 2.0), 1.0) * 255), (byte)0)); - - if (!current_color.Equals(key_color) || IsSelected != state_was_selected) - { if (keyBorder.IsEnabled) { if (isImage) @@ -116,7 +113,8 @@ public override void SetColor(Color key_color) keyBorder.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 100, 100, 100)); keyBorder.BorderThickness = new Thickness(0); } - state_was_selected = !IsSelected; + current_color = key_color; + state_was_selected = false; } } public override void UpdateText() { } From bd4b41051d71c8dbee86c27c0c11b8c8bcde79b7 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 20 Jun 2021 19:26:47 +0200 Subject: [PATCH 22/42] Small editor improvement --- .../Project-Aurora/Settings/DeviceKeyData.cs | 2 +- .../Settings/DeviceLayoutManager.cs | 16 +- .../Control_DeviceLayout.xaml.cs | 5 +- .../Control_DeviceLayoutPresenter.xaml | 14 +- .../Control_DeviceLayoutPresenter.xaml.cs | 8 +- .../Control_EditKeycapData.xaml | 41 ++-- .../Control_EditKeycapData.xaml.cs | 15 +- .../Window_DeviceConfig.xaml | 55 ++++-- .../Window_DeviceConfig.xaml.cs | 183 ++++++++++++++---- 9 files changed, 255 insertions(+), 84 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs index 0ff3c86dd..b28101db1 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs @@ -51,7 +51,7 @@ public class EqualityComparer : IEqualityComparer { public bool Equals(DeviceKey key1, DeviceKey key2) { - return key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId); + return key1.Tag != -1 && key1.Tag == key2.Tag && (key2.DeviceId == null || key1.DeviceId == key2.DeviceId); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 71d1bd206..b62cad314 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -79,8 +79,10 @@ private string GetFolder() { case 0: return "Keyboard"; - default: + case 1: return "Mouse"; + default: + return "OtherDevices"; } } protected class NewKeyboardLayout @@ -484,6 +486,7 @@ public DeviceConfig(DeviceConfig config) ConfigurationChanged = config.ConfigurationChanged; LightingEnabled = config.LightingEnabled; TypeChangeEnabled = config.TypeChangeEnabled; + InvisibleBackgroundEnabled = config.InvisibleBackgroundEnabled; } public DeviceConfig(int viewPort) @@ -514,9 +517,18 @@ public void RefreshConfig() } [JsonIgnore] - public virtual string LayoutPath => Path.Combine(layoutsPath, "Mouse", SelectedLayout + ".json"); + public virtual string LayoutPath => Path.Combine(layoutsPath, "OtherDevices", SelectedLayout + ".json"); } + public class MouseConfig : DeviceConfig + { + public override string LayoutPath => Path.Combine(layoutsPath, "Mouse", SelectedLayout + ".json"); + + public MouseConfig(DeviceConfig config) : base(config) + { + Type = 1; + } + } public class KeyboardConfig : DeviceConfig { diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs index 7b48f0637..1ca24933c 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml.cs @@ -67,7 +67,6 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) } } RenderTransform = new TranslateTransform(DeviceConfig.Offset.X, DeviceConfig.Offset.Y); - ResizeLayout(); } private void KeycapPositionChanged(object sender, PropertyChangedEventArgs e) { @@ -130,6 +129,7 @@ public Control_DeviceLayout() { InitializeComponent(); DataContext = this; + KeycapLayouts.CollectionChanged += HandleChange; } public Control_DeviceLayout(DeviceConfig config) @@ -141,6 +141,7 @@ public Control_DeviceLayout(DeviceConfig config) DeviceConfig = config; DataContext = this; + KeycapLayouts.CollectionChanged += HandleChange; //device_layout = contentPresenter.ContentTemplate; @@ -154,7 +155,6 @@ public void ConfigChanged() { Dispatcher.Invoke(() => { - KeycapLayouts.CollectionChanged -= HandleChange; DeviceLayout layout = new DeviceLayout(DeviceConfig); Keys = layout.LoadLayout(); foreach (var key in Keys) @@ -162,7 +162,6 @@ public void ConfigChanged() key.Key.DeviceId = DeviceConfig.Id.ViewPort; } ResizeLayout(); - KeycapLayouts.CollectionChanged += HandleChange; }); }); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml index ee3b50de6..62501c32d 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayoutPresenter.xaml @@ -18,9 +18,9 @@ - - - - - + + To enable/disable layout editor right click on this box - + @@ -52,7 +52,7 @@ etc. --> - + + + + + @@ -88,12 +113,12 @@ - + - + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 5d424760d..34048c541 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.IO; @@ -31,15 +32,56 @@ public partial class Window_DeviceConfig : Window public bool DeleteDevice = false; private System.Windows.Point _positionInBlock; - private Control_Keycap SelectedKey; + private bool isHorizontal = true; + + // private Control_Keycap SelectedKey; + + public ObservableCollection KeycapCollection + { + get => (ObservableCollection)GetValue(KeycapCollectionProperty); + set => SetValue(KeycapCollectionProperty, value); + } + + public static readonly DependencyProperty KeycapCollectionProperty = + DependencyProperty.Register("KeycapCollection", typeof(ObservableCollection), typeof(Control_LayerList), new PropertyMetadata(null)); + + public Control_Keycap SelectedKeycap + { + get => (Control_Keycap)GetValue(SelectedKeycapProperty); + set => SetValue(SelectedKeycapProperty, value); + } + + public static readonly DependencyProperty SelectedKeycapProperty = + DependencyProperty.Register("SelectedKeycap", typeof(Control_Keycap), typeof(Control_LayerList), new PropertyMetadata(null, SelectedKeycapPropertyChanged)); + + private static void SelectedKeycapPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) + { + + // if (e.NewValue is Control_Keycap layer) + // layer.SetProfile(((Control_LayerList)sender).FocusedApplication); + if (sender is ListBox listView) + { + if (listView.SelectedItem is Control_Keycap key) + { + + } + } + } public Window_DeviceConfig(Control_DeviceLayout config) { InitializeComponent(); originalDeviceLayout = config; deviceLayout.DeviceConfig = config.DeviceConfig; - deviceLayout.KeycapLayouts.CollectionChanged += HandleChange; - deviceLayout.ConfigChanged(); + KeycapCollection = deviceLayout.KeycapLayouts;//.CollectionChanged += HandleChange; + KeycapCollection.CollectionChanged += HandleChange; + deviceLayout.ConfigChanged(); + /* foreach (var keycap in KeycapCollection) + { + keycap.MouseDown += KeyMouseDown; + keycap.MouseMove += KeyMouseMove; + keycap.MouseUp += KeyMouseUp; + }*/ LoadDeviceType(Config.Type); var deviceIdList = Global.dev_manager.IndividualDevices.Where(d => d.id.ViewPort == null).Select(d => d.id).ToList(); @@ -59,7 +101,7 @@ public Window_DeviceConfig(Control_DeviceLayout config) this.device_view.ItemsSource = deviceIdList; this.device_view.SelectedIndex = selectedIndex; - this.device_type.ItemsSource = new string[2]{"Keyboard", "Other Devices"}; + this.device_type.ItemsSource = new string[3]{"Keyboard", "Mouse", "Other Devices"}; this.device_type.IsEnabled = Config.TypeChangeEnabled; this.device_layout.SelectedItem = Config.SelectedLayout; @@ -68,6 +110,7 @@ public Window_DeviceConfig(Control_DeviceLayout config) if (Config is KeyboardConfig keyboardConfig) this.keyboard_layout.SelectedValue = keyboardConfig.SelectedKeyboardLayout; this.devices_disable_lighting.IsChecked = !Config.LightingEnabled; + this.device_invisible_background.IsChecked = Config.InvisibleBackgroundEnabled; DataContext = this; this.KeyDown += OnKeyDownHandler; @@ -83,26 +126,9 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) key.MouseDown += KeyMouseDown; key.MouseMove += KeyMouseMove; key.MouseUp += KeyMouseUp; - key.UpdateLayout(); - keycap_list.Items.Add(key); - - //keycap_list.InvalidateProperty(ListView.ItemsSourceProperty); - keycap_list.InvalidateVisual(); - keycap_list.UpdateLayout(); - } - } - else if (e.Action == NotifyCollectionChangedAction.Remove) - { - foreach (Control_Keycap layout in e.OldItems) - { - keycap_list.Items.Remove(layout); + } } - else if (e.Action == NotifyCollectionChangedAction.Reset) - { - keycap_list.Items.Clear(); - } - } private List GetBrandsName(string dicName) { @@ -133,9 +159,18 @@ private void LoadDeviceType(int type) deviceLayout.DeviceConfig = new KeyboardConfig(Config); this.keyboard_layout.SelectedItem = (Config as KeyboardConfig).SelectedKeyboardLayout; break; + case 1: + this.device_type.SelectedItem = "Mouse"; + this.device_layout.ItemsSource = GetBrandsName("Mouse"); + this.keyboard_layout.Visibility = Visibility.Collapsed; + this.keyboard_layout_tb.Visibility = Visibility.Collapsed; + Config.Type = 1; + deviceLayout.DeviceConfig = new MouseConfig(Config); + break; default: + Config.Type = 2; this.device_type.SelectedItem = "Other Devices"; - this.device_layout.ItemsSource = GetBrandsName("Mouse"); + this.device_layout.ItemsSource = GetBrandsName("OtherDevices"); this.keyboard_layout.Visibility = Visibility.Collapsed; this.keyboard_layout_tb.Visibility = Visibility.Collapsed; deviceLayout.DeviceConfig = new DeviceConfig(Config); @@ -187,7 +222,13 @@ private void device_disable_lighting_Checked(object sender, RoutedEventArgs e) Config.LightingEnabled = (checkBox.IsChecked.HasValue) ? !checkBox.IsChecked.Value : true; } //deviceLayout = new Control_DeviceLayout(Config); - + } + private void device_invisible_background_Checked(object sender, RoutedEventArgs e) + { + if (IsLoaded && sender is CheckBox checkBox) + { + Config.InvisibleBackgroundEnabled = (checkBox.IsChecked.HasValue) ? checkBox.IsChecked.Value : true; + } } private void okButton_Click(object sender, RoutedEventArgs e) @@ -232,13 +273,14 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) } private void KeyMouseDown(object sender, MouseButtonEventArgs e) { - SelectedKey = sender as Control_Keycap; + SelectedKeycap = sender as Control_Keycap; + keycap_list.SelectedItem = SelectedKeycap; // when the mouse is down, get the position within the current control. (so the control top/left doesn't move to the mouse position) _positionInBlock = Mouse.GetPosition(sender as UIElement); // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) - (sender as Control_Keycap)?.CaptureMouse(); + SelectedKeycap?.CaptureMouse(); } @@ -281,6 +323,10 @@ private void OnKeyDownHandler(object sender, KeyEventArgs e) { MessageBox.Show("Up Pressed!"); }*/ + if (e.Key == Key.Delete && SelectedKeycap != null) + { + KeycapCollection.Remove(SelectedKeycap); + } } private void keycap_list_SelectionChanged(object sender, SelectionChangedEventArgs e) @@ -289,37 +335,102 @@ private void keycap_list_SelectionChanged(object sender, SelectionChangedEventAr { if (listView.SelectedItem is Control_Keycap key) { - SelectedKey = key; + SelectedKeycap = key; } } } + private int getValidTag(int tag) + { + if(KeycapCollection.Where(l => l.Config.Tag == tag).Any()) + { + return getValidTag(tag + 1); + } + return tag; + } private void addKey_Click(object sender, RoutedEventArgs e) { var keyConf = new DeviceKeyConfiguration(); keyConf.Height = 30; keyConf.Width = 30; - if(SelectedKey != null) + keyConf.Tag = 0; + keyConf.VisualName = ""; + if (SelectedKeycap != null) { - keyConf.X = SelectedKey.Config.X + SelectedKey.Config.Width + 7; - keyConf.Y = SelectedKey.Config.Y; - keyConf.Tag = SelectedKey.Config.Tag + 1; + if (isHorizontal) + { + keyConf.X = SelectedKeycap.Config.X + SelectedKeycap.Config.Width + 7; + keyConf.Y = SelectedKeycap.Config.Y; + } + else + { + keyConf.X = SelectedKeycap.Config.X; + keyConf.Y = SelectedKeycap.Config.Y + SelectedKeycap.Config.Height + 7; + } + keyConf.Height = (int)SelectedKeycap.Height; + keyConf.Width = (int)SelectedKeycap.Width; ; + keyConf.Tag = SelectedKeycap.Config.Tag + 1; + keyConf.VisualName = SelectedKeycap.Config.VisualName; } + keyConf.Tag = getValidTag(keyConf.Tag); + var keycap = new Control_Keycap(keyConf); keycap.MouseDown += KeyMouseDown; keycap.MouseMove += KeyMouseMove; keycap.MouseUp += KeyMouseUp; keycap.UpdateLayout(); - SelectedKey = keycap; + SelectedKeycap = keycap; + deviceLayout.KeycapLayouts.Add(keycap); + } + private void addGhostKey_Click(object sender, RoutedEventArgs e) + { + var keyConf = new DeviceKeyConfiguration(); + keyConf.Height = 30; + keyConf.Width = 30; + keyConf.VisualName = ""; + if (SelectedKeycap != null) + { + if (isHorizontal) + { + keyConf.X = SelectedKeycap.Config.X + SelectedKeycap.Config.Width + 7; + keyConf.Y = SelectedKeycap.Config.Y; + } + else + { + keyConf.X = SelectedKeycap.Config.X; + keyConf.Y = SelectedKeycap.Config.Y + SelectedKeycap.Config.Height + 7; + } + keyConf.VisualName = SelectedKeycap.Config.VisualName; + } + keyConf.Tag = -1; + var keycap = new Control_Keycap(keyConf); + keycap.MouseDown += KeyMouseDown; + keycap.MouseMove += KeyMouseMove; + keycap.MouseUp += KeyMouseUp; + keycap.UpdateLayout(); + SelectedKeycap = keycap; deviceLayout.KeycapLayouts.Add(keycap); } private void removeKey_Click(object sender, RoutedEventArgs e) { - if (SelectedKey != null) + if (SelectedKeycap != null) { - deviceLayout.KeycapLayouts.Remove(SelectedKey); - SelectedKey = null; + deviceLayout.KeycapLayouts.Remove(SelectedKeycap); + SelectedKeycap = null; } } + private void changeNewKey_Click(object sender, RoutedEventArgs e) + { + isHorizontal = !isHorizontal; + if (isHorizontal) + { + (sender as Button).Content = "Horizontal"; + } + else + { + (sender as Button).Content = "Vertical"; + } + } + private void UpdateKeysThread(CancellationToken token) { while (!token.IsCancellationRequested) @@ -328,7 +439,7 @@ private void UpdateKeysThread(CancellationToken token) { for (int i = 0; i < deviceLayout.KeycapLayouts.Count; i++) { - deviceLayout.KeycapLayouts[i].SetColor(Color.FromRgb(200, 200, 200), deviceLayout.KeycapLayouts[i] == SelectedKey); + deviceLayout.KeycapLayouts[i].SetColor(Color.FromRgb(200, 200, 200), deviceLayout.KeycapLayouts[i] == SelectedKeycap); } }); Thread.Sleep(100); From d0b496d4ee69f748a4cb15d5f64d66b2ff3d30e1 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 20 Jun 2021 19:33:08 +0200 Subject: [PATCH 23/42] Add Steelseries rival 650 layout and disable keycap dragging --- .../Images/SteelSeries_Rival_650_L1.png | Bin 0 -> 1927 bytes .../Images/SteelSeries_Rival_650_L2.png | Bin 0 -> 1806 bytes .../Images/SteelSeries_Rival_650_L3.png | Bin 0 -> 1771 bytes .../Images/SteelSeries_Rival_650_R1.png | Bin 0 -> 1919 bytes .../Images/SteelSeries_Rival_650_R2.png | Bin 0 -> 1793 bytes .../Images/SteelSeries_Rival_650_R3.png | Bin 0 -> 1763 bytes .../Images/SteelSeries_Rival_650_outline.png | Bin 0 -> 8313 bytes .../Images/SteelSeries_Rival_650_wheel.png | Bin 0 -> 2468 bytes .../Mouse/Steelseries - Rival 650.json | 125 ++++++++++++++++++ .../DeviceLayouts/OtherDevices/Ram.json | 68 ++++++++++ .../Window_DeviceConfig.xaml.cs | 2 +- 11 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L1.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L2.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_L3.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R1.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R2.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_R3.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_outline.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Images/SteelSeries_Rival_650_wheel.png create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/Mouse/Steelseries - Rival 650.json create mode 100644 Project-Aurora/Project-Aurora/DeviceLayouts/OtherDevices/Ram.json 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 0000000000000000000000000000000000000000..ac4dfc79a6882e6d05924eedf9014642f95a1c95 GIT binary patch literal 1927 zcmbVN4QSj{9M9ak^{$)l14`|1O;ZcnnoDv?uXpLr(cX3K>8|!mTak^vdwF*kdY5EL z+Pl`FTRFxi;tF$E$7EF|;zuX@K*u(yD=iZXT~#Q9$*3DR%M?2iWW!BguGh1Z?gIl! zUf%n?-~adjc>nBeY^YmhFSHW`u_{pSZ^rMH_%6*|j-TCAxsT(QO{;&|Ac(wm*1d!{ zc&LCNa(wkjZ#VF~p>oO7n_%Y)vy1nTD91UaHzM zNVW$XNuR1C(&b=j$g(c7(&Lao2*6P28Pdr*IffM&PM}#<lp1SuTH^7n3B#=I#%^Q+vMAbU?a>g^j109)hp4t2%Pg_H(L|q) zfT`-Osv4WmRO7s4(&=;v;2*ADGBXSy`i57tQglP9CRB2tBX@f)Jt+a=PeB7Zw!actCrg2e?Cg7(x$c zm3_LB#CqAlIqu0Eq!zS2Gm6P%x_CqYtwZ6Zpj8b>qB7I+BJp@A%bER&D8i)osggPC zh8i{#Ku6UP9J>crA#*SB2I#)O^oL93oTf#kFRa@CBRvxq7zIiM;TFqKmNSgii{_HT z{5N0ewFP}^9*&!#HO#hQ{E=4eZjuF zAg`)v&AO86ys?o)eQ|z|aCpRZUVLQz;PU3l6|WZCQ&04-`QrT7mp<*_X9qe)3J2DX^xLjipMUS0 z!7ICL7|x>Mnr6Q50LsrBW_ zR}LOqX>@GPy)Zpx-*)?*>2Z5kotv4ueK@D(T=~qKw#)CY8tUJf!`nz6UB<1`|Rw_&^4Fcv{~rHm@GDeLe89Xc6Z3`oN;E7 z-K3&4qDDl}Cn5OYgCf2N1%-fOgDhxK=#$`s41u0t4eG<>?Zq`)N3l1|oXU_S~ z_kaK8{QK6-^w}f*$NM>sJCd8q&a(G0_8dKQfc;+i?XS<->##rde8_PR48>0uxADO+ z$MyZ;=I5h%`<#VnMTD3-M66YOhUU1_qctC*MG^sr6kRXP-~9424_ut)&nIlz_A{j9 zPOS!HZgo13Ru_?p`O&Ar>6*m|DkOrSRw;X-RZH_tUW<+6X^96-NVJ&d$76$F-kt#& z8W3QJvVdgS07+BC(1FNtP61U`6-m}5MHgh*(o9R&LHpvFxd0ce+3cCNG4_?_OHt%o zl2ol$#i}OKpeQM(X-cvxsj9#bLb&2ZuqJrn$Sy;cgeY+R$fX{L8KFa$qBPH>wtT4g z9a=AJ$B9KuszF~;L^<}U3B;&_^Ou5h(>O*FDU%BEqL5*g4%RQxh=wJ42kOr9Z3b9u zZM$P*UoDkN$3z%SE;BdU0ofNF=2v_o&61EV1&B;8Gnpf?H@=k#2#jcur?kAAshM5L zKvhK@oILM(m{!9l_iP|p7?Cs|XHAd|LDBOpYwS)Wo|08IXhCg?-NMSgP|Z?qhq9W% zFoO34V`LR*P=U;0w*req^1UJtI$^Xjv`hnLn5onD&gU|jnSd7DGFu2|&rX2cWX4cT z!w^(aY09;2E9Zp~^bpBq(>x1~=(^a#4%CxKPYJ4t6~TnMETo8H3aVo!6@}=sL0ayz z{aK2Z;u47Ww~hm*h;jTYPtg)YR+3OKoRlFXRb3a%6fy*q)Kbt%>IPECu9{~8mz_vh z-pd-R!i>?>bVVjI5>gnef~M<^;2me;fRTz-*B8%NUt5CX=_z*7N zUHbi{vZZNX>3gg8|446#1(l#zB&@|seC&)A_o7x(r2potxwfZo?ZR0zjE9{z%sx7e zoOp~nU~PKywHG#7i~lB<9nYV94`I}}I@W!y&*=eQch_&iwR4XRZ}r#T{IFpRUhQ&* z-t8SZESg8_56#zKTwl8K=!pYA^laZ60PhcOUAWj7J^uH>`loWDp=({gkDog5^Fe10 zf3Z1mt#|vE`GKDf)xX-gap@7zTfcs3c;@Zzf86PI#$N8RZ#@D2{Ptn*yAuSwvR>Gl z1kXMGU_*YRZ}8PIZ6PtJ4IR6%klDW2kT$yPdg+YuE5Fh8>_@|#mhD}?K7s0M`JS<1 Z?j5>w`Nqeue-i&=R{R3h5Kw|&^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..539900b8825409742ff5009f25875c40c5a9aa54 GIT binary patch literal 1771 zcmbVNTWB0r7@m+?*OUabKFC^On3NK0=YGk~khMv6)9#9sF6m+;_~4my&g>4^nKPZ4 zWH&)*6s-E77=%_sr7F^wLg`aML~137f}rS&Pd*eW`lJ;f`rz%%-b`eB!GW1MbIy0Z z|NAfJpVun$M@L7pBMifgmP^Hj^iA)v%x?Pp{nVLn>Fa^8^lZ#9d-kUH5VLvi5r(<% zH?O*wEZR?7koW>X#KA(#4=I{qrVh740GDvWI=JQqdG42wuX3!1^4tmCmh7;A>t1Os z!pGON0*XFh8IGq+bwhc*^^4v^nkX^JZY=K0W zH3W%=l4P)xrhtG0pyM236-kjrNfTv_mn2IyElp#)7e~!S$h8)VN4m!7SDvdUNoa{; zv)L4ysz9QeD4V7!N{Xl`JVo&FYLI{yAH?H5h9Zt(QfttU>_GQM~${|1V!AyJ`R$YV&y(ItdoSqb#fc({_+k3G`6k8j(6iy*;yF3lP*8N94k6_uvUlC>u!#ge2B)F#MtR|i3L)sl=IP+Btx zB;c-K1TB|DKA;YJKB!?a3~C(P52IBe4H8kqRGqqgzFa6&BI0@tx)3iMon^~&1w%Fs zgI5H(E!VcKau6pVfVf=Db2K=D=ON3~6~}RP$RnUQyn!{D&q+C#cTGcqk|XJc>Gbv& z30zJ~Al=_N4v0X?@vl7HktUI$03I3`@|vtEyyF6uhd>7!mVx4;PVlIjW06NsBxr1B zO;sVvs2Q3&Nly{4BPYiznx^uOVgeq(oMtGBMkPvV*|#gnDtR%@@oM)V9mglTqlU+} zi^l>mJrsEkrqzHE*PZqT#N(bUclS5zn3CS1N;=kK;wDWH;h7qZ-Ce6tyq)+MtlU}p zy`{3FX^`|CRr`OWcf$hfAgE#5Vnr@>MofEACn@58^VMG4*0*|a+6>cSzYWumej~>L zrH*KuzVhy$AJGsRLb()1shuZBHt{Va3y6#LiM)?4d~?`*8w z7uRzS+lNNZk3Lp;^v#n)-#@f3``P9C7cYMazk4sU_4ha0kK-4wUHCb>d3q|*f65;C zz?-;s;|27__~z+@&%L+{ULL-=XaA^w>-yN|Z@=;(IQV|%{s(_3WzX#0nEiC~(yYF3 u|B>O0s;b)5?gOtMn?A>EU46Cu3G+;2>+FrEt_-EWqw?H*@zU(`FZ}}~J~j3L literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d26fb1841a1c6521b1d819768de3fb21dfd9746a GIT binary patch literal 1919 zcmbVNTWl0n7@oRT$`S&J1r(8t14J#%&ShsWGhu;tccBZNvb5WDQ54UfIlDV_cV?WK z?rwnxB*6eNK8O+|Vp}xEn3hn)7Zfd#M59JAvECvE5@R+of|tfuJ+n89DVI3O%$zyr zJKz8Pm-Ek|c=x9H?xk*mAm+z9BR$R=->X{g!Oxdl;lubf*XZ1C5yZTEox6!R{>ps> z(fo&+NZLucOM-gd0~9@lJf*yW(FCz}eaQfD0NG>;WmGLhU4Qojid2;l)$fy8*$AVo z+PT|Ay}P>;aQ6Td6>9xDa&1Y%1bJiwvXswhmQ)H+6(E@g(7LZxdR$|CNOb@d3K@*~A0n1$Bcwh^w4Zj zpI_pAH$ZXCD8L4{1uIZW>t-Hcht)jDAjZ%#6xj%)6xMUPi49|Q-kI~Ua5!%2X*Guz zte#CBWGou?bE4l*^B%4uSC*xiX4yc4C>9A(I5-|vRV0=V@QPRP(SU^l4ZH$R2h(hd z7DO?a4y1f(miO29M|3#olz_9pdK?rTVvc|1@jiuP1290dA`obQS_sl9Ux1?nLI46T z=;b*jP-oj}s`x~L+)P$Sm4X>lhyy_-DAH_D;b@;v2w)xs(opoL6etGq`SLntU#TRi zQ?+o8hiV6@7d>4Y{B(Tk{ASm-h0k97Ci?u`?=NnQ z-^Go!v@PEMPO14v`PzlYf1}3MM7KoqLiXx{jjOgrCQi4U{OQ}=#Mqzm(JPZeX6V?7 z>yy`#o?6PqrNL=P-qc6KEGQM-KL)n$qPH|Onj ze?`1OPyhVG)Jirp3V^Wa+=I=RUp#;1%#o#kAHH^`b?TQsdfK&Pp77G}(bnZp9*vzo zcUe7Z EKY5;aDF6Tf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..24a889721e1a224e61a089c2316a0140730aa531 GIT binary patch literal 1793 zcmbVN+iM(E9G+}zNZM>!73vy_OectG&Foxu_A+DEY_b!(TikR_78*q%XU?429kVlM zoS9@d!H3m=#DW(TMB7po1nG+)S`ZCbBn1mf^}&C@2Ypeb`d|bfJhL~qvc2FivvcO0 z?|i@ScR9a(xwLR1d|>d zN>O+HZkCt*<>KQC#8wRGSVOUfidquarJsVR*%Q9Tj2y*mN{PJM3E&3*4was&|qzEqRXHn54xt~o7koUMxfy}Kf@5I zZ67SBM{9eXIFX2P4d8G>j1PQj0d?5JIcsjMWn70Gsv!&6zDKY^59?I1kG(3s33YGz z1_LCv#bVFKKrNQlGvWF3>%@&tKn9|{@`i)BMdaZ%7oz!fB6A|}#!+%E0zP)j7}vU) zDs?5(q8O9t$b71BX=V4FfWop8(PG=X>1IHCKNt( z1C-Q^4t#K1unrXiyA~i0n--`b&ao>D-3z0V!!_&@!$e)Yf4-2*m0WC?HL~C>o|vNx z^SPuTCzGrg6IybMMWtYSKCmGws2PR?CuW+uV#skZp(i9(7vd>4g(Qsyk|eVNM9@IU zkkdxnU9w-ra4jf-V1N5K=ok`?f8_~DO^{P@gOwqlV$%sJ#R3gUtiY!M6hukZP_nD$ zlxva`32ObUfhwIars4@*NXRKRt|vs6hb>idn&o8!#bFAhp_mNHzEw#|-tt)l9loJPLrpp~x^Ws0O4nooRDGJnqPHXMeql2$-|E6iGYp2k zHcUQxjU3s8+9hq;dgtrENQ=KzP-n}N*Pssfu2K6>W{>ROy^#HTe0w6Ar>3$yq3wMy zyd5r_4?jEkM00femG8z@n&Y3pUj4ASvu}5)xi@ooCwly~`zE}5ntPl){Qkjc=z4f+ zn0@d{B=S?}$4kp&Pn|k*lz)2b%6rdbzfsQ|rGFXSefRq@WoUQ$gJ|fhliBAV_?9kx zR(Mkz8Tn-B`f+LN!qCTuj=gl*dE_nUjfZ}SL>5$W<#6N=aV}0@ynN&=dUY#JWkNq+ Uy#HL~YVapjm|svonp=7CA02%*`v3p{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cd8a2edc4c8119b73ff55c3b8fcf962e67742856 GIT binary patch literal 1763 zcmbVNO^6#+9G_*oaa(EGrRbLS;A1MXTIVy9OlD}>O_Q_9gGcqBRl&n>1WM&;S0#mppKBo?p&bvK16b)2(cV z-fA%tkdk6~Bvqmx615{Xdg2C++hkT61Kg%(Y9ylV5RvjalX)`nCNPU3fiVs1l(vSMS{h0Qsw!$= ze%bXg?L;r`IY3G7=CJF*29W~4!Glp4%_42lkQrv`(tFpd#o|&(9k<0cqS}RXpjs|w6(gG! zR8i^4wJfvhM=|sfsh09Q3y$cz*i@nJbb*2-ctgp_&zRTQ_t)ZR?tC49}M+ zY9}R-obO);OcCSwS6QwXmz}h#I5=Ztn3R35lFW)5u^ev}Z@=TTA(1oMMscT7B<$nxNPr%4#;BdVltJ)%zBfgve0SnM8Kh0?>sM{xbo(w{7q zeNE$}@2lGXBYhAS)P#P6uof%vi8E5ti~32C{+qAf-k!cSgtKOtOh;{)y^I<;@fmf< z+BA9n#y70Re^f0M>ht%|W%TDgZl|{J)6~v`E4gQ0+M0WJ`Xc!I{jC$*yYo-&ymh;I z>-kS-w;tHL*B7pypZVl!`Oc(ryl{8U`c?m|GyTSapVzhTmbZVL{<__~Hh1*q?0YwN zwHvc+Jn@6}TQYw9p>`%^PdLt2D#d^GHn=}!p91$M?blvN{ZcqMBVGCYuhnCf$=eIx d9@)7#v2ft~5ALi!JCl5ds^!Jft#g;(`3LWmEtLQO literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..57ac12af736a2cd2206069d28208a08f982c7af2 GIT binary patch literal 8313 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

lz=WXGHmd9pOZIFlc*-W|g-4EuIL4 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 Date: Sun, 20 Jun 2021 21:35:52 +0200 Subject: [PATCH 24/42] The custom layout stores in the appdata --- .../Settings/DeviceLayoutManager.cs | 77 +++++++++++++------ .../Keycaps/Control_ImageKeycap.xaml.cs | 3 +- 2 files changed, 53 insertions(+), 27 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index b62cad314..8464ebe5c 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -62,8 +62,6 @@ public class DeviceLayout public Dictionary Keys = new Dictionary(); - protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); - private System.Drawing.Rectangle Region = new System.Drawing.Rectangle(0, 0, 0, 0); private DeviceConfig Config; @@ -73,18 +71,6 @@ public DeviceLayout(DeviceConfig config) Config = config; } - private string GetFolder() - { - switch (Config.Type) - { - case 0: - return "Keyboard"; - case 1: - return "Mouse"; - default: - return "OtherDevices"; - } - } protected class NewKeyboardLayout { /*[JsonProperty("layout_width")] @@ -96,13 +82,26 @@ protected class NewKeyboardLayout [JsonProperty("keys")] public DeviceKeyConfiguration[] Keys = null; } + private DeviceConfig convertDeviceConfig(DeviceConfig config) + { + switch (config.Type) + { + case 0: + return new KeyboardConfig(config); + case 1: + return new MouseConfig(config); + default: + return config; + } + } public List LoadLayout() { var layoutConfigPath = ""; string keyboard_preference = Config.SelectedLayout; + Config = convertDeviceConfig(Config); if (keyboard_preference != "" && keyboard_preference != "None") { - layoutConfigPath = Path.Combine(layoutsPath, GetFolder(), keyboard_preference + ".json"); + layoutConfigPath = Config.LayoutPath; } if (!String.IsNullOrWhiteSpace(layoutConfigPath) && File.Exists(layoutConfigPath)) @@ -171,8 +170,9 @@ public List LoadLayout() NormalizeKeys(Keys); - - foreach (string feature in layoutConfig.included_features) + + //Old way of serializing the deviceLayouts + /*foreach (string feature in layoutConfig.included_features) { string feature_path = Path.Combine(layoutsPath, GetFolder(), "Extra Features", feature); @@ -184,7 +184,7 @@ public List LoadLayout() AddFeature(feature_config.grouped_keys.ToArray(), feature_config.origin_region); } - } + }*/ NormalizeKeys(Keys); } @@ -287,7 +287,7 @@ public void SaveLayout(List layoutKey, Point offset) var content = JsonConvert.SerializeObject(config, Formatting.Indented); - File.WriteAllText(Path.Combine(layoutsPath, GetFolder(), Config.SelectedLayout + ".json"), content, Encoding.UTF8); + File.WriteAllText(Config.CustomLayoutPath, content, Encoding.UTF8); } public void AddFeature(KeyboardKey[] keys, KeyboardRegion? insertion_region = KeyboardRegion.TopLeft) { @@ -476,7 +476,7 @@ public class DeviceConfig public bool InvisibleBackgroundEnabled = false; [JsonIgnore] - protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + public virtual string LayoutTypeDir => "OtherDevices"; public DeviceConfig(DeviceConfig config) { @@ -517,12 +517,15 @@ public void RefreshConfig() } [JsonIgnore] - public virtual string LayoutPath => Path.Combine(layoutsPath, "OtherDevices", SelectedLayout + ".json"); + public string LayoutPath => Global.devicesLayout.calcLayoutPath(LayoutTypeDir, SelectedLayout + ".json"); + + [JsonIgnore] + public string CustomLayoutPath => Path.Combine(Global.devicesLayout.customLayoutsPath, LayoutTypeDir, SelectedLayout + ".json"); } public class MouseConfig : DeviceConfig { - public override string LayoutPath => Path.Combine(layoutsPath, "Mouse", SelectedLayout + ".json"); + public override string LayoutTypeDir => "Mouse"; public MouseConfig(DeviceConfig config) : base(config) { @@ -534,6 +537,7 @@ public class KeyboardConfig : DeviceConfig { public KeyboardPhysicalLayout SelectedKeyboardLayout = KeyboardPhysicalLayout.ANSI; + public override string LayoutTypeDir => "Keyboard"; public KeyboardConfig(DeviceConfig config) : base(config) { if (config is KeyboardConfig keyboardConfig) @@ -568,9 +572,7 @@ private string ConvertEnumToFileName() return ""; } } - public string PhysicalLayoutPath => Path.Combine(layoutsPath, "Keyboard\\Plain Keyboard\\" + ConvertEnumToFileName() + ".json"); - public override string LayoutPath => Path.Combine(layoutsPath, "Keyboard", SelectedLayout + ".json"); - + public string PhysicalLayoutPath => Global.devicesLayout.calcLayoutPath("Keyboard\\Plain Keyboard", ConvertEnumToFileName() + ".json"); [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr proccess); [DllImport("user32.dll")] static extern IntPtr GetKeyboardLayout(uint thread); @@ -666,6 +668,31 @@ public class DeviceLayoutManager public delegate void ConfigChangedEventHandler(DeviceConfig changedConf); public event ConfigChangedEventHandler DevicesConfigChanged; + [JsonIgnore] + protected string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); + [JsonIgnore] + public string customLayoutsPath = System.IO.Path.Combine(Global.AppDataDirectory, "DeviceLayouts"); + + private string[] deviceDirs = {"Images","Keyboard", "Mouse", "OtherDevices"}; + + public string calcLayoutPath(string LayoutTypeDir, string file) + { + if (File.Exists(Path.Combine(Global.devicesLayout.customLayoutsPath, LayoutTypeDir, file))) + { + return Path.Combine(Global.devicesLayout.customLayoutsPath, LayoutTypeDir, file); + } + return Path.Combine(layoutsPath, LayoutTypeDir, file); + } + + public DeviceLayoutManager() + { + foreach (var item in deviceDirs) + { + var dict = new DirectoryInfo(Path.Combine(customLayoutsPath, item)); + if (!dict.Exists) + dict.Create(); + } + } public void AddNewDeviceLayout() { var devConf = new DeviceConfig(DevicesConfig.Count); diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs index bbb95d1c8..2993bfe26 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Keycaps/Control_ImageKeycap.xaml.cs @@ -24,7 +24,6 @@ namespace Aurora.Settings.DeviceLayoutViewer.Keycaps public partial class Control_ImageKeycap : KeycapViewer { private Color? current_color = null; - private string layoutsPath = System.IO.Path.Combine(Global.ExecutingDirectory, "DeviceLayouts"); public Control_ImageKeycap() { @@ -35,7 +34,7 @@ public Control_ImageKeycap(DeviceKeyConfiguration key) : base(key) { InitializeComponent(); - string image_path = System.IO.Path.Combine(layoutsPath, "Images", Config.Image); + string image_path = Global.devicesLayout.calcLayoutPath("Images", Config.Image); keyBorder.IsEnabled = key.Enabled.Value; From 8ad7e6c9ec84d8b255abe4a4c205f911d3fcf385 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 20 Jun 2021 21:38:53 +0200 Subject: [PATCH 25/42] Enable Keycap dragging --- .../Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 6d1db411d..34048c541 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -280,7 +280,7 @@ private void KeyMouseDown(object sender, MouseButtonEventArgs e) _positionInBlock = Mouse.GetPosition(sender as UIElement); // capture the mouse (so the mouse move events are still triggered (even when the mouse is not above the control) - //SelectedKeycap?.CaptureMouse(); + SelectedKeycap?.CaptureMouse(); } From b28227316c79457af3b7e58a26e74e45a5f91fb2 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 21 Jun 2021 02:49:15 +0200 Subject: [PATCH 26/42] Replace corsair sdk support --- .../Devices/Corsair/CorsairDevice.cs | 271 +++++++------ .../Project-Aurora/Devices/Corsair/LedMaps.cs | 356 +++++++++--------- .../Project-Aurora/Devices/DeviceManager.cs | 3 + .../Project-Aurora/Project-Aurora.csproj | 3 +- 4 files changed, 340 insertions(+), 293 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs index 5771f2e9f..675944514 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,202 @@ 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; +//using CUESDK = CorsairRGB.NET.CUE; 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 List mutices = new List(); + 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; } - for (int i = 0; i < CUESDK.GetDeviceCount(); i++) - deviceInfos.Add(CUESDK.GetDeviceInfo(i)); + for (int i = 0; i < CUESDK.CorsairGetDeviceCount(); i++) + { + devices.Add(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) + { + mutices.Add(new Mutex()); + switch (info.type) + { + case CorsairDeviceType.CDT_Keyboard: + return new CorsairKeyboard(info, index, this, mutices.Last()); + case CorsairDeviceType.CDT_Mouse: + case CorsairDeviceType.CDT_MouseMat: + return new CorsairDevice(info, index, this, mutices.Last(), AuroraDeviceType.Mouse); + case CorsairDeviceType.CDT_Headset: + case CorsairDeviceType.CDT_HeadsetStand: + return new CorsairDevice(info, index, this, mutices.Last(), 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, this, mutices.Last()); + } } - 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); + mutices.ForEach(m => m.ReleaseMutex()); } - public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) + internal bool LedBufferFinished() { - if (deviceInfos.Count != CUESDK.GetDeviceCount()) + if (devices.Count != CUESDK.CorsairGetDeviceCount()) + { this.Reset(); - - for (int i = 0; i < deviceInfos.Count; i++) + return false; + } + + deviceWaitCounter++; + if(deviceWaitCounter != devices.Count) { - var deviceInfo = deviceInfos[i]; - if (deviceInfo.Type == CorsairDeviceType.Keyboard && Global.Configuration.DevicesDisableKeyboard) - continue; + return false; + } + CUESDK.CorsairSetLedsColorsFlushBuffer(); + mutices.ForEach(m => m.ReleaseMutex()); + return true; + + } + 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 override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.model)); + protected CorsairLedColor[] colors; + private AuroraDeviceType type; + protected override AuroraDeviceType AuroraDeviceType => type; - if (LedMaps.MapsMap.TryGetValue(deviceInfo.Type, out var dict) && dict.Count != 0) - { - foreach (var (key, clr) in keyColors) - { - if (dict.TryGetValue((DeviceKeys)key, out var ledid)) - { - colors.Add(new CorsairLedColor() - { - LedId = ledid, - R = clr.R, - G = clr.G, - B = clr.B - }); - } - } - } - else + protected CorsairDeviceInfo deviceInfo; + protected int deviceIndex; + protected CorsairDeviceConnector connector; + protected Mutex mutex; + + public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConnector con, Mutex mutex, AuroraDeviceType type = AuroraDeviceType.Unkown) + { + this.deviceInfo = deviceInfo; + deviceIndex = index; + connector = con; + this.mutex = mutex; + this.type = type; + colors = new CorsairLedColor[deviceInfo.ledsCount]; + if (CUESDK.CorsairGetLedsColorsByDeviceIndex(index, deviceInfo.ledsCount, colors) != true) + { + LogError("Did not get device led list"); + } + } + protected override bool UpdateDeviceImpl(DeviceColorComposition composition) + { + for (int i = 0; i < deviceInfo.ledsCount; i++) + { + if (composition.keyColors.TryGetValue(i, out Color clr)) { - if (keyColors.TryGetValue((int)DeviceKeys.Peripheral_Logo, out var clr)) + colors[i] = new CorsairLedColor() { - 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 - }); - } - } - } + ledId = colors[i].ledId, + r = clr.R, + g = clr.G, + b = clr.B + }; } - - if (colors.Count == 0) - continue; - - CUESDK.SetDeviceColors(i, colors.ToArray()); } - - return CUESDK.Update(); + CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, deviceInfo.ledsCount, colors); + mutex.WaitOne(); + if(!connector.LedBufferFinished()) + { + mutex.WaitOne(); + mutex.ReleaseMutex(); + } + return true; } private CorsairLedId GetInitialLedIdForDeviceType(CorsairDeviceType type) { return type switch { - 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 + CorsairDeviceType.CDT_Headset => CorsairLedId.CLH_LeftLogo, + CorsairDeviceType.CDT_MemoryModule => CorsairLedId.CLDRAM_1, + CorsairDeviceType.CDT_Cooler => CorsairLedId.CLLC_C1_1, + CorsairDeviceType.CDT_Motherboard => CorsairLedId.CLMB_Zone1, + CorsairDeviceType.CDT_GraphicsCard => CorsairLedId.CLGPU_Zone1, + _ => CorsairLedId.CLI_Invalid }; } - protected override void RegisterVariables(VariableRegistry variableRegistry) + + } + public class CorsairKeyboard : CorsairDevice + { + protected override string DeviceName => deviceInfo.model; + + // protected override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.model)); + protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceType.Keyboard; + + public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConnector con, Mutex mutex) :base(deviceInfo, index, con, mutex) + { + } + + protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { - variableRegistry.Register($"{DeviceName}_exclusive", false, "Request exclusive control"); + int i = 0; + foreach (var (key, clr) in composition.keyColors) + { + if (LedMaps.KeyboardLedMap.TryGetValue((DeviceKeys)key, out var ledid)) + { + colors[i] = new CorsairLedColor() + { + ledId = ledid, + r = clr.R, + g = clr.G, + b = clr.B + }; + i++; + } + } + CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, deviceInfo.ledsCount, colors); + mutex.WaitOne(); + connector.LedBufferFinished(); + mutex.WaitOne(); + mutex.ReleaseMutex(); + return true; } } } diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs index 5229f910f..fcb81d4a2 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs @@ -4,8 +4,7 @@ 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 { @@ -13,179 +12,180 @@ internal static class LedMaps { 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 + [DeviceKeys.ESC] = CorsairLedId.CLK_Escape, + [DeviceKeys.F1] = CorsairLedId.CLK_F1, + [DeviceKeys.F2] = CorsairLedId.CLK_F2, + [DeviceKeys.F3] = CorsairLedId.CLK_F3, + [DeviceKeys.F4] = CorsairLedId.CLK_F4, + [DeviceKeys.F5] = CorsairLedId.CLK_F5, + [DeviceKeys.F6] = CorsairLedId.CLK_F6, + [DeviceKeys.F7] = CorsairLedId.CLK_F7, + [DeviceKeys.F8] = CorsairLedId.CLK_F8, + [DeviceKeys.F9] = CorsairLedId.CLK_F9, + [DeviceKeys.F10] = CorsairLedId.CLK_F10, + [DeviceKeys.F11] = CorsairLedId.CLK_F11, + [DeviceKeys.TILDE] = CorsairLedId.CLK_GraveAccentAndTilde, + [DeviceKeys.ONE] = CorsairLedId.CLK_1, + [DeviceKeys.TWO] = CorsairLedId.CLK_2, + [DeviceKeys.THREE] = CorsairLedId.CLK_3, + [DeviceKeys.FOUR] = CorsairLedId.CLK_4, + [DeviceKeys.FIVE] = CorsairLedId.CLK_5, + [DeviceKeys.SIX] = CorsairLedId.CLK_6, + [DeviceKeys.SEVEN] = CorsairLedId.CLK_7, + [DeviceKeys.EIGHT] = CorsairLedId.CLK_8, + [DeviceKeys.NINE] = CorsairLedId.CLK_9, + [DeviceKeys.ZERO] = CorsairLedId.CLK_0, + [DeviceKeys.MINUS] = CorsairLedId.CLK_MinusAndUnderscore, + [DeviceKeys.TAB] = CorsairLedId.CLK_Tab, + [DeviceKeys.Q] = CorsairLedId.CLK_Q, + [DeviceKeys.W] = CorsairLedId.CLK_W, + [DeviceKeys.E] = CorsairLedId.CLK_E, + [DeviceKeys.R] = CorsairLedId.CLK_R, + [DeviceKeys.T] = CorsairLedId.CLK_T, + [DeviceKeys.Y] = CorsairLedId.CLK_Y, + [DeviceKeys.U] = CorsairLedId.CLK_U, + [DeviceKeys.I] = CorsairLedId.CLK_I, + [DeviceKeys.O] = CorsairLedId.CLK_O, + [DeviceKeys.P] = CorsairLedId.CLK_P, + [DeviceKeys.OPEN_BRACKET] = CorsairLedId.CLK_BracketLeft, + [DeviceKeys.CAPS_LOCK] = CorsairLedId.CLK_CapsLock, + [DeviceKeys.A] = CorsairLedId.CLK_A, + [DeviceKeys.S] = CorsairLedId.CLK_S, + [DeviceKeys.D] = CorsairLedId.CLK_D, + [DeviceKeys.F] = CorsairLedId.CLK_F, + [DeviceKeys.G] = CorsairLedId.CLK_G, + [DeviceKeys.H] = CorsairLedId.CLK_H, + [DeviceKeys.J] = CorsairLedId.CLK_J, + [DeviceKeys.K] = CorsairLedId.CLK_K, + [DeviceKeys.L] = CorsairLedId.CLK_L, + [DeviceKeys.SEMICOLON] = CorsairLedId.CLK_SemicolonAndColon, + [DeviceKeys.APOSTROPHE] = CorsairLedId.CLK_ApostropheAndDoubleQuote, + [DeviceKeys.LEFT_SHIFT] = CorsairLedId.CLK_LeftShift, + [DeviceKeys.BACKSLASH_UK] = CorsairLedId.CLK_NonUsBackslash, + [DeviceKeys.Z] = CorsairLedId.CLK_Z, + [DeviceKeys.X] = CorsairLedId.CLK_X, + [DeviceKeys.C] = CorsairLedId.CLK_C, + [DeviceKeys.V] = CorsairLedId.CLK_V, + [DeviceKeys.B] = CorsairLedId.CLK_B, + [DeviceKeys.N] = CorsairLedId.CLK_N, + [DeviceKeys.M] = CorsairLedId.CLK_M, + [DeviceKeys.COMMA] = CorsairLedId.CLK_CommaAndLessThan, + [DeviceKeys.PERIOD] = CorsairLedId.CLK_PeriodAndBiggerThan, + [DeviceKeys.FORWARD_SLASH] = CorsairLedId.CLK_SlashAndQuestionMark, + [DeviceKeys.LEFT_CONTROL] = CorsairLedId.CLK_LeftCtrl, + [DeviceKeys.LEFT_WINDOWS] = CorsairLedId.CLK_LeftGui, + [DeviceKeys.LEFT_ALT] = CorsairLedId.CLK_LeftAlt, + //[DeviceKeys.Lang2] = CorsairLedId.CLK_Lang2, + [DeviceKeys.SPACE] = CorsairLedId.CLK_Space, + //[DeviceKeys.Lang1] = CorsairLedId.CLK_Lang1, + //[DeviceKeys.International2] = CorsairLedId.CLK_International2, + [DeviceKeys.RIGHT_ALT] = CorsairLedId.CLK_RightAlt, + [DeviceKeys.RIGHT_WINDOWS] = CorsairLedId.CLK_RightGui, + [DeviceKeys.APPLICATION_SELECT] = CorsairLedId.CLK_Application, + //[DeviceKeys.LedProgramming] = CorsairLedId.CLK_LedProgramming, + [DeviceKeys.BRIGHTNESS_SWITCH] = CorsairLedId.CLK_Brightness, + [DeviceKeys.F12] = CorsairLedId.CLK_F12, + [DeviceKeys.PRINT_SCREEN] = CorsairLedId.CLK_PrintScreen, + [DeviceKeys.SCROLL_LOCK] = CorsairLedId.CLK_ScrollLock, + [DeviceKeys.PAUSE_BREAK] = CorsairLedId.CLK_PauseBreak, + [DeviceKeys.INSERT] = CorsairLedId.CLK_Insert, + [DeviceKeys.HOME] = CorsairLedId.CLK_Home, + [DeviceKeys.PAGE_UP] = CorsairLedId.CLK_PageUp, + [DeviceKeys.CLOSE_BRACKET] = CorsairLedId.CLK_BracketRight, + [DeviceKeys.BACKSLASH] = CorsairLedId.CLK_Backslash, + [DeviceKeys.HASHTAG] = CorsairLedId.CLK_NonUsTilde, + [DeviceKeys.ENTER] = CorsairLedId.CLK_Enter, + //[DeviceKeys.International1] = CorsairLedId.CLK_International1, + [DeviceKeys.EQUALS] = CorsairLedId.CLK_EqualsAndPlus, + //[DeviceKeys.International3] = CorsairLedId.CLK_International3, + [DeviceKeys.BACKSPACE] = CorsairLedId.CLK_Backspace, + [DeviceKeys.DELETE] = CorsairLedId.CLK_Delete, + [DeviceKeys.END] = CorsairLedId.CLK_End, + [DeviceKeys.PAGE_DOWN] = CorsairLedId.CLK_PageDown, + [DeviceKeys.RIGHT_SHIFT] = CorsairLedId.CLK_RightShift, + [DeviceKeys.RIGHT_CONTROL] = CorsairLedId.CLK_RightCtrl, + [DeviceKeys.ARROW_UP] = CorsairLedId.CLK_UpArrow, + [DeviceKeys.ARROW_LEFT] = CorsairLedId.CLK_LeftArrow, + [DeviceKeys.ARROW_DOWN] = CorsairLedId.CLK_DownArrow, + [DeviceKeys.ARROW_RIGHT] = CorsairLedId.CLK_RightArrow, + [DeviceKeys.LOCK_SWITCH] = CorsairLedId.CLK_WinLock, + [DeviceKeys.VOLUME_MUTE] = CorsairLedId.CLK_Mute, + [DeviceKeys.MEDIA_STOP] = CorsairLedId.CLK_Stop, + [DeviceKeys.MEDIA_PREVIOUS] = CorsairLedId.CLK_ScanPreviousTrack, + [DeviceKeys.MEDIA_PLAY_PAUSE] = CorsairLedId.CLK_PlayPause, + [DeviceKeys.MEDIA_NEXT] = CorsairLedId.CLK_ScanNextTrack, + [DeviceKeys.NUM_LOCK] = CorsairLedId.CLK_NumLock, + [DeviceKeys.NUM_SLASH] = CorsairLedId.CLK_KeypadSlash, + [DeviceKeys.NUM_ASTERISK] = CorsairLedId.CLK_KeypadAsterisk, + [DeviceKeys.NUM_MINUS] = CorsairLedId.CLK_KeypadMinus, + [DeviceKeys.NUM_PLUS] = CorsairLedId.CLK_KeypadPlus, + [DeviceKeys.NUM_ENTER] = CorsairLedId.CLK_KeypadEnter, + [DeviceKeys.NUM_SEVEN] = CorsairLedId.CLK_Keypad7, + [DeviceKeys.NUM_EIGHT] = CorsairLedId.CLK_Keypad8, + [DeviceKeys.NUM_NINE] = CorsairLedId.CLK_Keypad9, + [DeviceKeys.NUM_ZEROZERO] = CorsairLedId.CLK_KeypadComma, + [DeviceKeys.NUM_FOUR] = CorsairLedId.CLK_Keypad4, + [DeviceKeys.NUM_FIVE] = CorsairLedId.CLK_Keypad5, + [DeviceKeys.NUM_SIX] = CorsairLedId.CLK_Keypad6, + [DeviceKeys.NUM_ONE] = CorsairLedId.CLK_Keypad1, + [DeviceKeys.NUM_TWO] = CorsairLedId.CLK_Keypad2, + [DeviceKeys.NUM_THREE] = CorsairLedId.CLK_Keypad3, + [DeviceKeys.NUM_ZERO] = CorsairLedId.CLK_Keypad0, + [DeviceKeys.NUM_PERIOD] = CorsairLedId.CLK_KeypadPeriodAndDelete, + [DeviceKeys.G1] = CorsairLedId.CLK_G1, + [DeviceKeys.G2] = CorsairLedId.CLK_G2, + [DeviceKeys.G3] = CorsairLedId.CLK_G3, + [DeviceKeys.G4] = CorsairLedId.CLK_G4, + [DeviceKeys.G5] = CorsairLedId.CLK_G5, + [DeviceKeys.G6] = CorsairLedId.CLK_G6, + [DeviceKeys.G7] = CorsairLedId.CLK_G7, + [DeviceKeys.G8] = CorsairLedId.CLK_G8, + [DeviceKeys.G9] = CorsairLedId.CLK_G9, + [DeviceKeys.G10] = CorsairLedId.CLK_G10, + [DeviceKeys.VOLUME_UP] = CorsairLedId.CLK_VolumeUp, + [DeviceKeys.VOLUME_DOWN] = CorsairLedId.CLK_VolumeDown, + //[DeviceKeys.MR] = CorsairLedId.CLK_MR, + //[DeviceKeys.M1] = CorsairLedId.CLK_M1, + //[DeviceKeys.M2] = CorsairLedId.CLK_M2, + //[DeviceKeys.M3] = CorsairLedId.CLK_M3, + [DeviceKeys.G11] = CorsairLedId.CLK_G11, + [DeviceKeys.G12] = CorsairLedId.CLK_G12, + [DeviceKeys.G13] = CorsairLedId.CLK_G13, + [DeviceKeys.G14] = CorsairLedId.CLK_G14, + [DeviceKeys.G15] = CorsairLedId.CLK_G15, + [DeviceKeys.G16] = CorsairLedId.CLK_G16, + [DeviceKeys.G17] = CorsairLedId.CLK_G17, + [DeviceKeys.G18] = CorsairLedId.CLK_G18, + //[DeviceKeys.International5] = CorsairLedId.CLK_International5, + //[DeviceKeys.International4] = CorsairLedId.CLK_International4, + [DeviceKeys.FN_Key] = CorsairLedId.CLK_Fn, + [DeviceKeys.LOCK_SWITCH] = CorsairLedId.CLK_WinLock, + [DeviceKeys.BRIGHTNESS_SWITCH] = CorsairLedId.CLK_Brightness, + [DeviceKeys.LOGO] = CorsairLedId.CLK_Logo, + [DeviceKeys.ADDITIONALLIGHT1] = CorsairLedId.CLKLP_Zone1, + [DeviceKeys.ADDITIONALLIGHT2] = CorsairLedId.CLKLP_Zone2, + [DeviceKeys.ADDITIONALLIGHT3] = CorsairLedId.CLKLP_Zone3, + [DeviceKeys.ADDITIONALLIGHT4] = CorsairLedId.CLKLP_Zone4, + [DeviceKeys.ADDITIONALLIGHT5] = CorsairLedId.CLKLP_Zone5, + [DeviceKeys.ADDITIONALLIGHT6] = CorsairLedId.CLKLP_Zone6, + [DeviceKeys.ADDITIONALLIGHT7] = CorsairLedId.CLKLP_Zone7, + [DeviceKeys.ADDITIONALLIGHT8] = CorsairLedId.CLKLP_Zone8, + [DeviceKeys.ADDITIONALLIGHT9] = CorsairLedId.CLKLP_Zone9, + [DeviceKeys.ADDITIONALLIGHT10] = CorsairLedId.CLKLP_Zone10, + [DeviceKeys.ADDITIONALLIGHT11] = CorsairLedId.CLKLP_Zone11, + [DeviceKeys.ADDITIONALLIGHT12] = CorsairLedId.CLKLP_Zone12, + [DeviceKeys.ADDITIONALLIGHT13] = CorsairLedId.CLKLP_Zone13, + [DeviceKeys.ADDITIONALLIGHT14] = CorsairLedId.CLKLP_Zone14, + [DeviceKeys.ADDITIONALLIGHT15] = CorsairLedId.CLKLP_Zone15, + [DeviceKeys.ADDITIONALLIGHT16] = CorsairLedId.CLKLP_Zone16, + [DeviceKeys.ADDITIONALLIGHT17] = CorsairLedId.CLKLP_Zone17, + [DeviceKeys.ADDITIONALLIGHT18] = CorsairLedId.CLKLP_Zone18, + [DeviceKeys.ADDITIONALLIGHT19] = CorsairLedId.CLKLP_Zone19 }; - 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>() { - [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/DeviceManager.cs b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs index f3f18a0d2..cb7f3a9f9 100644 --- a/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs +++ b/Project-Aurora/Project-Aurora/Devices/DeviceManager.cs @@ -169,6 +169,9 @@ 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); diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index 642b48a73..1027964b0 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -1,4 +1,4 @@ - + net48 @@ -63,6 +63,7 @@ + From 4a080f48e54ed83d678ca2398ffd3efdaad0f8ad Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 22 Jun 2021 07:29:29 +0200 Subject: [PATCH 27/42] Add not existing keyboard keys --- .../Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs index 0c2a6fdd2..d4a2e9cd0 100644 --- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs @@ -64,7 +64,7 @@ public class OpenRGBAuroraDevice : AuroraDevice { private OpenRGBDevice Device; private OpenRGBColor[] DeviceColors; - private List KeyMapping; + private List KeyMapping; private int DeviceIndex; static object update_lock = new object(); private OpenRGBDeviceConnector Connector; @@ -86,18 +86,19 @@ public OpenRGBAuroraDevice(OpenRGBDevice device, OpenRGBDeviceConnector connecto for (var ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++) DeviceColors[ledIdx] = new OpenRGBColor(); + int overIndex = 0; if (Device.Type == OpenRGBDeviceType.Keyboard) { - KeyMapping = new List(); + KeyMapping = new List(); for (int j = 0; j < Device.Leds.Length; j++) { if (OpenRGBKeyNames.Keyboard.TryGetValue(Device.Leds[j].Name, out var dk)) { - KeyMapping.Add(dk); + KeyMapping.Add((int)dk); } else { - KeyMapping.Add(DK.NONE); + KeyMapping.Add(500 + overIndex); } } } From e2919c684a4b1fa00a32693ed6ad6cd5e34de1ec Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 22 Jun 2021 07:55:39 +0200 Subject: [PATCH 28/42] Fix Razer Sdk init fail, missed index --- .../Devices/OpenRGB/OpenRGBDevice.cs | 2 +- .../Project-Aurora/Devices/Razer/RazerDevice.cs | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs index d4a2e9cd0..22e67c653 100644 --- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs @@ -98,7 +98,7 @@ public OpenRGBAuroraDevice(OpenRGBDevice device, OpenRGBDeviceConnector connecto } else { - KeyMapping.Add(500 + overIndex); + KeyMapping.Add(500 + overIndex++); } } } diff --git a/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs b/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs index 541d7f730..af26ad7e5 100755 --- a/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Razer/RazerDevice.cs @@ -39,14 +39,14 @@ public class RazerDevice : DefaultDevice public override bool Initialize() { - if (!Chroma.SdkAvailable) - { - LogError("SDK not available. Install Razer synapse"); - return IsInitialized = false; - } - try { + if (!Chroma.SdkAvailable) + { + LogError("SDK not available. Install Razer synapse"); + return IsInitialized = false; + } + Chroma.Instance.Initialize(); } catch (Corale.Colore.Razer.NativeCallException e) @@ -54,6 +54,10 @@ public override bool Initialize() LogError("Error initializing:" + e.Message); return IsInitialized = false; } + catch (Exception e) + { + return IsInitialized = false; + } if (!Chroma.Instance.Initialized) { From 60da8babc21f69d8b3be6d8b62364ba7206cb879 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 23 Jun 2021 02:11:20 +0200 Subject: [PATCH 29/42] Fix custom device layouts are not displayed in the drop down --- .../Project-Aurora/Devices/AuroraDevice.cs | 8 ++--- .../Settings/DeviceLayoutManager.cs | 30 ++++++++++++++++++- .../Window_DeviceConfig.xaml.cs | 30 +++++-------------- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs index 18c6f7c5c..4dd0ded20 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs @@ -14,10 +14,10 @@ namespace Aurora.Devices { public enum AuroraDeviceType { - Unkown, - Keyboard, - Mouse, - Headset + Keyboard = 0, + Mouse = 1, + Unkown = 2, + Headset = 3, } public class UniqueDeviceId { diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 8464ebe5c..6465b19df 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -1,4 +1,5 @@ -using Aurora.Settings.DeviceLayoutViewer; +using Aurora.Devices; +using Aurora.Settings.DeviceLayoutViewer; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -787,5 +788,32 @@ public void SaveConfiguration(DeviceConfig config) DevicesConfigChanged.Invoke(config); Save(); } + public List GetLayoutsForType(AuroraDeviceType type) + { + string customLayouts = Path.Combine(customLayoutsPath, deviceDirs[(int)type+1]); + List FilesName = new List() { "None" }; + if (Directory.Exists(customLayouts)) + { + foreach (var name in Directory.GetFiles(customLayouts)) + { + FilesName.Add(name.Split('\\').Last().Split('.').First()); + } + } + else + { + Directory.CreateDirectory(customLayouts); + } + string layouts = Path.Combine(layoutsPath, deviceDirs[(int)type + 1]); + if (Directory.Exists(layouts)) + { + foreach (var name in Directory.GetFiles(layouts)) + { + string lname = name.Split('\\').Last().Split('.').First(); + if (!FilesName.Where(n => n.Equals(lname)).Any()) + FilesName.Add(lname); + } + } + return FilesName; + } } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 34048c541..256968a20 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -130,30 +130,14 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) } } } - private List GetBrandsName(string dicName) - { - string layoutsPath = Path.Combine(Global.ExecutingDirectory, "DeviceLayouts", dicName); - List FilesName = new List() { "None" }; - if (Directory.Exists(layoutsPath)) - { - foreach (var name in Directory.GetFiles(layoutsPath)) - { - FilesName.Add(name.Split('\\').Last().Split('.').First()); - } - } - else - { - Directory.CreateDirectory(layoutsPath); - } - return FilesName; - } private void LoadDeviceType(int type) { + this.device_layout.SelectedValue = "None"; switch (type) { case 0: this.device_type.SelectedItem = "Keyboard"; - this.device_layout.ItemsSource = GetBrandsName("Keyboard"); + this.device_layout.ItemsSource = Global.devicesLayout.GetLayoutsForType(Devices.AuroraDeviceType.Keyboard); this.keyboard_layout.Visibility = Visibility.Visible; this.keyboard_layout_tb.Visibility = Visibility.Visible; deviceLayout.DeviceConfig = new KeyboardConfig(Config); @@ -161,7 +145,7 @@ private void LoadDeviceType(int type) break; case 1: this.device_type.SelectedItem = "Mouse"; - this.device_layout.ItemsSource = GetBrandsName("Mouse"); + this.device_layout.ItemsSource = Global.devicesLayout.GetLayoutsForType(Devices.AuroraDeviceType.Mouse); this.keyboard_layout.Visibility = Visibility.Collapsed; this.keyboard_layout_tb.Visibility = Visibility.Collapsed; Config.Type = 1; @@ -170,12 +154,13 @@ private void LoadDeviceType(int type) default: Config.Type = 2; this.device_type.SelectedItem = "Other Devices"; - this.device_layout.ItemsSource = GetBrandsName("OtherDevices"); + this.device_layout.ItemsSource = Global.devicesLayout.GetLayoutsForType(Devices.AuroraDeviceType.Unkown); this.keyboard_layout.Visibility = Visibility.Collapsed; this.keyboard_layout_tb.Visibility = Visibility.Collapsed; deviceLayout.DeviceConfig = new DeviceConfig(Config); break; } + this.device_layout.SelectedValue = "None"; } private void device_view_SelectionChanged(object sender, SelectionChangedEventArgs e) @@ -193,7 +178,6 @@ private void device_type_SelectionChanged(object sender, SelectionChangedEventAr if (IsLoaded) { Config.Type = this.device_type.SelectedIndex; - this.device_layout.SelectedItem = "None"; LoadDeviceType(Config.Type); } } @@ -268,6 +252,8 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) offset.Y = -escConfig.Y; } new DeviceLayout(Config).SaveLayout(deviceLayout.KeycapLayouts.ToList(), offset); + LoadDeviceType(Config.Type); + this.device_layout.SelectedItem = Config.SelectedLayout; } } @@ -372,7 +358,7 @@ private void addKey_Click(object sender, RoutedEventArgs e) keyConf.VisualName = SelectedKeycap.Config.VisualName; } keyConf.Tag = getValidTag(keyConf.Tag); - + //if var keycap = new Control_Keycap(keyConf); keycap.MouseDown += KeyMouseDown; keycap.MouseMove += KeyMouseMove; From 538e16101edfd9322e2cd3c198b7d1ffb9304cb0 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 23 Jun 2021 08:58:46 +0200 Subject: [PATCH 30/42] Fix old way of serrializate keyboard --- .../Project-Aurora/Settings/DeviceLayoutManager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 6465b19df..e97151647 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -173,9 +173,9 @@ public List LoadLayout() NormalizeKeys(Keys); //Old way of serializing the deviceLayouts - /*foreach (string feature in layoutConfig.included_features) + foreach (string feature in layoutConfig.included_features) { - string feature_path = Path.Combine(layoutsPath, GetFolder(), "Extra Features", feature); + string feature_path = Path.Combine(Global.ExecutingDirectory, "DeviceLayouts", "Keyboard", "Extra Features", feature); if (File.Exists(feature_path)) { @@ -185,7 +185,7 @@ public List LoadLayout() AddFeature(feature_config.grouped_keys.ToArray(), feature_config.origin_region); } - }*/ + } NormalizeKeys(Keys); } From c36b6e91eb5eb2973a30757d415cc6218c0b8160 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 23 Jun 2021 10:24:16 +0200 Subject: [PATCH 31/42] Add +/- and auto devicename discovery --- .../Project-Aurora/Devices/AuroraDevice.cs | 2 + .../Devices/Corsair/CorsairDevice.cs | 19 ++++- .../Devices/OpenRGB/OpenRGBDevice.cs | 32 ++++--- .../Project-Aurora/Settings/DeviceKeyData.cs | 6 ++ .../Window_DeviceConfig.xaml | 3 +- .../Window_DeviceConfig.xaml.cs | 84 ++++++++++++------- 6 files changed, 95 insertions(+), 51 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs index 4dd0ded20..fb0d3b2b7 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs @@ -155,6 +155,8 @@ protected virtual void DisconnectImpl() { } + public abstract List GetAllDeviceKey(); + protected abstract string DeviceName { get; } public string GetDeviceName() => DeviceName; diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs index 675944514..87770c288 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs @@ -115,6 +115,7 @@ public class CorsairDevice : AuroraDevice protected int deviceIndex; protected CorsairDeviceConnector connector; protected Mutex mutex; + protected List KeyMapping = new List(); public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConnector con, Mutex mutex, AuroraDeviceType type = AuroraDeviceType.Unkown) { @@ -128,6 +129,14 @@ public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConne { LogError("Did not get device led list"); } + /*if (deviceInfo.type == CorsairDeviceType.CDT_Keyboard) + { + + } + else + { + KeyMapping.Add(new DeviceKey(j, Device.Leds[j].Name)); + }*/ } protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { @@ -167,7 +176,7 @@ private CorsairLedId GetInitialLedIdForDeviceType(CorsairDeviceType type) }; } - + public override List GetAllDeviceKey() => KeyMapping; } public class CorsairKeyboard : CorsairDevice { @@ -178,6 +187,14 @@ public class CorsairKeyboard : CorsairDevice public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConnector con, Mutex mutex) :base(deviceInfo, index, con, mutex) { + /* if (LedMaps.KeyboardLedMap.TryGetValue(Device.Leds[j].Name, out var dk)) + { + KeyMapping.Add(new DeviceKey(dk)); + } + else + { + KeyMapping.Add(new DeviceKey(500 + overIndex++, Device.Leds[j].Name)); + }*/ } protected override bool UpdateDeviceImpl(DeviceColorComposition composition) diff --git a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs index 22e67c653..49724a9f6 100644 --- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs @@ -64,7 +64,7 @@ public class OpenRGBAuroraDevice : AuroraDevice { private OpenRGBDevice Device; private OpenRGBColor[] DeviceColors; - private List KeyMapping; + private List KeyMapping = new List(); private int DeviceIndex; static object update_lock = new object(); private OpenRGBDeviceConnector Connector; @@ -87,20 +87,24 @@ public OpenRGBAuroraDevice(OpenRGBDevice device, OpenRGBDeviceConnector connecto DeviceColors[ledIdx] = new OpenRGBColor(); int overIndex = 0; - if (Device.Type == OpenRGBDeviceType.Keyboard) + + for (int j = 0; j < Device.Leds.Length; j++) { - KeyMapping = new List(); - for (int j = 0; j < Device.Leds.Length; j++) + if (Device.Type == OpenRGBDeviceType.Keyboard) { if (OpenRGBKeyNames.Keyboard.TryGetValue(Device.Leds[j].Name, out var dk)) { - KeyMapping.Add((int)dk); + KeyMapping.Add(new DeviceKey(dk)); } else { - KeyMapping.Add(500 + overIndex++); + KeyMapping.Add(new DeviceKey(500 + overIndex++, Device.Leds[j].Name)); } } + else + { + KeyMapping.Add(new DeviceKey(j, Device.Leds[j].Name)); + } } } protected override void DisconnectImpl() @@ -124,19 +128,9 @@ protected override bool UpdateDeviceImpl(DeviceColorComposition composition) for (int ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++) { - if (Device.Type == OpenRGBDeviceType.Keyboard) - { - if (composition.keyColors.TryGetValue((int)KeyMapping[ledIdx], out var keyColor)) - { - DeviceColors[ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B); - } - } - else + if (composition.keyColors.TryGetValue(KeyMapping[ledIdx].Tag, out var keyColor)) { - if (composition.keyColors.TryGetValue(ledIdx, out var keyColor)) - { - DeviceColors[ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B); - } + DeviceColors[ledIdx] = new OpenRGBColor(keyColor.R, keyColor.G, keyColor.B); } } @@ -195,5 +189,7 @@ private AuroraDeviceType AuroraDeviceTypeConverter(OpenRGBDeviceType type) } return AuroraDeviceType.Unkown; } + + public override List GetAllDeviceKey() => KeyMapping; } } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs index b28101db1..95e08c96b 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceKeyData.cs @@ -89,6 +89,12 @@ public DeviceKey(Devices.DeviceKeys key, int? deviceId = null, string visualName else VisualName = key.ToString(); } + public DeviceKey(int key, string visualName, int? deviceId = null) + { + Tag = key; + DeviceId = deviceId; + VisualName = visualName; + } public static implicit operator DeviceKey(Devices.DeviceKeys k) => new DeviceKey(k); public static implicit operator DeviceKey(Int64 k) => new DeviceKey((int)k); diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml index 28d755382..f84df04ad 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml @@ -87,7 +87,8 @@ etc. --> - + + diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 256968a20..6d1b6a966 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -33,8 +33,9 @@ public partial class Window_DeviceConfig : Window private System.Windows.Point _positionInBlock; private bool isHorizontal = true; + private bool isPlus = true; - // private Control_Keycap SelectedKey; + // private Control_Keycap SelectedKey; public ObservableCollection KeycapCollection { @@ -325,40 +326,67 @@ private void keycap_list_SelectionChanged(object sender, SelectionChangedEventAr } } } - private int getValidTag(int tag) + private DeviceKey getValidKey(DeviceKey key) { - if(KeycapCollection.Where(l => l.Config.Tag == tag).Any()) + var deviceQuery = Global.dev_manager.IndividualDevices.Where(d => d.id == (Devices.UniqueDeviceId)device_view.SelectedItem); + if (deviceQuery.Any()) { - return getValidTag(tag + 1); + var deviceKeys = deviceQuery.First().GetAllDeviceKey(); + foreach (var deviceKey in deviceKeys) + { + if (!KeycapCollection.Where(l => l.Config.Tag == deviceKey.Tag).Any()) + { + return deviceKey; + } + } } - return tag; + if (KeycapCollection.Where(l => l.Config.Tag == key.Tag).Any()) + { + key.Tag += 1; + return getValidKey(key); + } + return key; } - private void addKey_Click(object sender, RoutedEventArgs e) + private DeviceKeyConfiguration newKeyConfigBase() { var keyConf = new DeviceKeyConfiguration(); keyConf.Height = 30; keyConf.Width = 30; keyConf.Tag = 0; keyConf.VisualName = ""; + int addValue = 7; + if (!isPlus) + addValue = -7; if (SelectedKeycap != null) { + keyConf.X = SelectedKeycap.Config.X; + keyConf.Y = SelectedKeycap.Config.Y; if (isHorizontal) { - keyConf.X = SelectedKeycap.Config.X + SelectedKeycap.Config.Width + 7; - keyConf.Y = SelectedKeycap.Config.Y; + if(isPlus) + keyConf.X += SelectedKeycap.Config.Width + 7; + else + keyConf.X -= SelectedKeycap.Config.Width + 7; } else { - keyConf.X = SelectedKeycap.Config.X; - keyConf.Y = SelectedKeycap.Config.Y + SelectedKeycap.Config.Height + 7; + if (isPlus) + keyConf.Y += SelectedKeycap.Config.Height + 7; + else + keyConf.Y -= SelectedKeycap.Config.Height + 7; + } keyConf.Height = (int)SelectedKeycap.Height; keyConf.Width = (int)SelectedKeycap.Width; ; keyConf.Tag = SelectedKeycap.Config.Tag + 1; keyConf.VisualName = SelectedKeycap.Config.VisualName; } - keyConf.Tag = getValidTag(keyConf.Tag); - //if + return keyConf; + } + private void addKey_Click(object sender, RoutedEventArgs e) + { + var keyConf = newKeyConfigBase(); + keyConf.Key = getValidKey(keyConf.Key); var keycap = new Control_Keycap(keyConf); keycap.MouseDown += KeyMouseDown; keycap.MouseMove += KeyMouseMove; @@ -369,24 +397,7 @@ private void addKey_Click(object sender, RoutedEventArgs e) } private void addGhostKey_Click(object sender, RoutedEventArgs e) { - var keyConf = new DeviceKeyConfiguration(); - keyConf.Height = 30; - keyConf.Width = 30; - keyConf.VisualName = ""; - if (SelectedKeycap != null) - { - if (isHorizontal) - { - keyConf.X = SelectedKeycap.Config.X + SelectedKeycap.Config.Width + 7; - keyConf.Y = SelectedKeycap.Config.Y; - } - else - { - keyConf.X = SelectedKeycap.Config.X; - keyConf.Y = SelectedKeycap.Config.Y + SelectedKeycap.Config.Height + 7; - } - keyConf.VisualName = SelectedKeycap.Config.VisualName; - } + var keyConf = newKeyConfigBase(); keyConf.Tag = -1; var keycap = new Control_Keycap(keyConf); keycap.MouseDown += KeyMouseDown; @@ -416,7 +427,18 @@ private void changeNewKey_Click(object sender, RoutedEventArgs e) (sender as Button).Content = "Vertical"; } } - + private void changeNewKeyPosition_Click(object sender, RoutedEventArgs e) + { + isPlus = !isPlus; + if (isPlus) + { + (sender as Button).Content = "Plus"; + } + else + { + (sender as Button).Content = "Minus"; + } + } private void UpdateKeysThread(CancellationToken token) { while (!token.IsCancellationRequested) From 4f461bcf6a8a4747cb71cbffcd1c80949a4b9d2b Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 25 Jun 2021 07:59:04 +0200 Subject: [PATCH 32/42] Set active layoutname after you save it --- .../DeviceLayoutViewer/Window_DeviceConfig.xaml.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs index 6d1b6a966..82c7fa57a 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Window_DeviceConfig.xaml.cs @@ -133,7 +133,6 @@ private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) } private void LoadDeviceType(int type) { - this.device_layout.SelectedValue = "None"; switch (type) { case 0: @@ -161,7 +160,6 @@ private void LoadDeviceType(int type) deviceLayout.DeviceConfig = new DeviceConfig(Config); break; } - this.device_layout.SelectedValue = "None"; } private void device_view_SelectionChanged(object sender, SelectionChangedEventArgs e) @@ -186,9 +184,10 @@ private void device_layout_SelectionChanged(object sender, SelectionChangedEvent { if (IsLoaded) { - Config.SelectedLayout = this.device_layout.SelectedItem.ToString(); + if (device_layout.SelectedItem is null) device_layout.SelectedItem = "None"; + Config.SelectedLayout = device_layout.SelectedItem?.ToString(); deviceLayout.ConfigChanged(); - layoutName.Text = this.device_layout.SelectedItem.ToString(); + layoutName.Text = device_layout.SelectedItem.ToString(); } } @@ -254,7 +253,7 @@ private void saveLayout_Click(object sender, RoutedEventArgs e) } new DeviceLayout(Config).SaveLayout(deviceLayout.KeycapLayouts.ToList(), offset); LoadDeviceType(Config.Type); - this.device_layout.SelectedItem = Config.SelectedLayout; + this.device_layout.SelectedValue = Config.SelectedLayout; } } From 02c3cf73cf34f3bb480562fe94143b0453833b56 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 13 Jun 2021 19:23:26 +0200 Subject: [PATCH 33/42] Fix for #2320 --- .../Project-Aurora/LibreHardwareMonitorLib.dll | Bin 0 -> 447488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Project-Aurora/Project-Aurora/LibreHardwareMonitorLib.dll diff --git a/Project-Aurora/Project-Aurora/LibreHardwareMonitorLib.dll b/Project-Aurora/Project-Aurora/LibreHardwareMonitorLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..590aabb7dce995524bc4fe31c95f9e91e3383cb0 GIT binary patch literal 447488 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 F{{TJrAB_M2 literal 0 HcmV?d00001 From 9c7dae384b886e8c8e853087b2994d6d8cf6d68e Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 25 Jun 2021 12:26:04 +0200 Subject: [PATCH 34/42] Add corsair sdk suppport --- .../Project-Aurora/Devices/AuroraDevice.cs | 12 +- .../Devices/AuroraDeviceConnector.cs | 23 ++-- .../Devices/Corsair/CorsairDevice.cs | 128 ++++++++++-------- .../Devices/OpenRGB/OpenRGBDevice.cs | 27 +--- .../Settings/DeviceLayoutManager.cs | 3 +- 5 files changed, 101 insertions(+), 92 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs index fb0d3b2b7..307ea598e 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDevice.cs @@ -58,6 +58,7 @@ public abstract class AuroraDevice private long LastUpdateTime = 0; private bool UpdateIsOngoing = false; private bool DeviceIsConnected = false; + private AuroraDeviceConnector connector; public UniqueDeviceId id = null; private VariableRegistry variableRegistry; @@ -100,7 +101,7 @@ public async void UpdateDevice(DeviceColorComposition composition) Watch.Stop(); LastUpdateTime = Watch.ElapsedMilliseconds; - + await Task.Run(() => connector?.DeviceLedUpdateFinished()); UpdateFinished.Invoke(this, new EventArgs()); UpdateIsOngoing = false; } @@ -115,13 +116,13 @@ public string GetDeviceUpdatePerformance() } public async void Connect() { - if (GetDeviceType() == AuroraDeviceType.Keyboard && Global.Configuration.DevicesDisableKeyboard || + /*if (GetDeviceType() == AuroraDeviceType.Keyboard && Global.Configuration.DevicesDisableKeyboard || GetDeviceType() == AuroraDeviceType.Mouse && Global.Configuration.DevicesDisableMouse || GetDeviceType() == AuroraDeviceType.Headset && Global.Configuration.DevicesDisableHeadset) { Disconnect(); } - else + else*/ { try { @@ -191,6 +192,11 @@ protected virtual void RegisterVariables(VariableRegistry local) 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 diff --git a/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs index b64f59d36..7b884b18b 100644 --- a/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs +++ b/Project-Aurora/Project-Aurora/Devices/AuroraDeviceConnector.cs @@ -58,7 +58,7 @@ public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArg public abstract class AuroraDeviceConnector { //private Dictionary Devices = new Dictionary(); - protected List devices = new List(); + private List devices = new List(); public IReadOnlyList Devices => devices.AsReadOnly(); private bool isInitialized; public event EventHandler NewSuccessfulInitiation; @@ -91,7 +91,20 @@ private void RegisterDeviceId (AuroraDevice dev) } } + 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 /// @@ -112,14 +125,6 @@ public async void Initialize() if (await Task.Run(() => InitializeImpl())) { DisconnectedDeviceCount = 0; - foreach (var device in Devices) - { - Global.Configuration.VarRegistry.Combine(device.GetRegisteredVariables()); - device.ConnectionHandler += ConnectionHandling; - device.UpdateFinished += DeviceUpdated; - RegisterDeviceId(device); - device.Connect(); - } if (Devices.Any()) { isInitialized = true; diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs index 87770c288..80e9293f2 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs @@ -13,13 +13,12 @@ using System.Threading; using Aurora.Profiles.Discord.GSI.Nodes; using NLog.Fluent; -//using CUESDK = CorsairRGB.NET.CUE; namespace Aurora.Devices.Corsair { public class CorsairDeviceConnector : AuroraDeviceConnector { - private List mutices = new List(); + private SemaphoreSlim allDeviceUpdated; protected override string ConnectorName => "Corsair"; private int deviceWaitCounter = 0; protected override bool InitializeImpl() @@ -32,10 +31,11 @@ protected override bool InitializeImpl() LogError("Error: " + error); return false; } + allDeviceUpdated = new SemaphoreSlim(0, 1); for (int i = 0; i < CUESDK.CorsairGetDeviceCount(); i++) { - devices.Add(CreateDevice(CUESDK.CorsairGetDeviceInfo(i), i)); + RegisterDevice(CreateDevice(CUESDK.CorsairGetDeviceInfo(i), i)); } if (Global.Configuration.VarRegistry.GetVariable($"{ConnectorName}_exclusive") && !CUESDK.CorsairRequestControl(CorsairAccessMode.CAM_ExclusiveLightingControl)) @@ -48,17 +48,16 @@ protected override bool InitializeImpl() } private CorsairDevice CreateDevice(CorsairDeviceInfo info, int index) { - mutices.Add(new Mutex()); switch (info.type) { case CorsairDeviceType.CDT_Keyboard: - return new CorsairKeyboard(info, index, this, mutices.Last()); + return new CorsairKeyboard(info, index); case CorsairDeviceType.CDT_Mouse: case CorsairDeviceType.CDT_MouseMat: - return new CorsairDevice(info, index, this, mutices.Last(), AuroraDeviceType.Mouse); + return new CorsairDevice(info, index, AuroraDeviceType.Mouse); case CorsairDeviceType.CDT_Headset: case CorsairDeviceType.CDT_HeadsetStand: - return new CorsairDevice(info, index, this, mutices.Last(), AuroraDeviceType.Headset); + return new CorsairDevice(info, index, AuroraDeviceType.Headset); case CorsairDeviceType.CDT_CommanderPro: case CorsairDeviceType.CDT_LightingNodePro: case CorsairDeviceType.CDT_MemoryModule: @@ -66,7 +65,7 @@ private CorsairDevice CreateDevice(CorsairDeviceInfo info, int index) case CorsairDeviceType.CDT_Motherboard: case CorsairDeviceType.CDT_GraphicsCard: default: - return new CorsairDevice(info, index, this, mutices.Last()); + return new CorsairDevice(info, index); } } @@ -74,27 +73,45 @@ protected override void ShutdownImpl() { CUESDK.CorsairSetLayerPriority(0); CUESDK.CorsairReleaseControl(CorsairAccessMode.CAM_ExclusiveLightingControl); - mutices.ForEach(m => m.ReleaseMutex()); + allDeviceUpdated.Dispose(); } - internal bool LedBufferFinished() + internal bool LedBufferFinished(Mutex mutex) { - if (devices.Count != CUESDK.CorsairGetDeviceCount()) + if (Devices.Count != CUESDK.CorsairGetDeviceCount()) { this.Reset(); return false; } - + deviceWaitCounter++; - if(deviceWaitCounter != devices.Count) + if(deviceWaitCounter != Devices.Count) { return false; } CUESDK.CorsairSetLedsColorsFlushBuffer(); - mutices.ForEach(m => m.ReleaseMutex()); return true; } + public override void DeviceLedUpdateFinished() + { + if (Devices.Count != CUESDK.CorsairGetDeviceCount()) + { + this.Reset(); + return; + } + + deviceWaitCounter++; + if (deviceWaitCounter != Devices.Count) + { + 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"); @@ -107,36 +124,40 @@ public class CorsairDevice : AuroraDevice protected override string DeviceName => deviceInfo.model; // protected override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.model)); - protected CorsairLedColor[] colors; + protected List colors = new List(); private AuroraDeviceType type; protected override AuroraDeviceType AuroraDeviceType => type; protected CorsairDeviceInfo deviceInfo; protected int deviceIndex; - protected CorsairDeviceConnector connector; - protected Mutex mutex; - protected List KeyMapping = new List(); + protected Dictionary KeyMapping = new Dictionary(); - public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConnector con, Mutex mutex, AuroraDeviceType type = AuroraDeviceType.Unkown) + public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, AuroraDeviceType type = AuroraDeviceType.Unkown) { this.deviceInfo = deviceInfo; deviceIndex = index; - connector = con; - this.mutex = mutex; this.type = type; - colors = new CorsairLedColor[deviceInfo.ledsCount]; - if (CUESDK.CorsairGetLedsColorsByDeviceIndex(index, deviceInfo.ledsCount, colors) != true) + var possibleLedId = System.Enum.GetValues(typeof(CorsairLedId)).Cast() + .Where(l => l != CorsairLedId.CLI_Last) + .Select(l => new CorsairLedColor { ledId = l }).ToArray(); + + if (CUESDK.CorsairGetLedsColorsByDeviceIndex(index, possibleLedId.Length, possibleLedId) != true) { LogError("Did not get device led list"); } - /*if (deviceInfo.type == CorsairDeviceType.CDT_Keyboard) + int deviceKeyIndex = 0; + foreach (var item in possibleLedId) { - + if (item.r != 0 || item.g != 0 || item.b != 0) + { + colors.Add(item); + KeyMapping[new DeviceKey(deviceKeyIndex++)] = item.ledId; + } } - else + if (KeyMapping.Count != deviceInfo.ledsCount) { - KeyMapping.Add(new DeviceKey(j, Device.Leds[j].Name)); - }*/ + LogError("Not all of the led was discover"); + } } protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { @@ -144,22 +165,12 @@ protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { if (composition.keyColors.TryGetValue(i, out Color clr)) { - colors[i] = new CorsairLedColor() - { - ledId = colors[i].ledId, - r = clr.R, - g = clr.G, - b = clr.B - }; + colors[i].r = clr.R; + colors[i].g = clr.G; + colors[i].b = clr.B; } } - CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, deviceInfo.ledsCount, colors); - mutex.WaitOne(); - if(!connector.LedBufferFinished()) - { - mutex.WaitOne(); - mutex.ReleaseMutex(); - } + CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, colors.Count, colors.ToArray()); return true; } @@ -176,7 +187,7 @@ private CorsairLedId GetInitialLedIdForDeviceType(CorsairDeviceType type) }; } - public override List GetAllDeviceKey() => KeyMapping; + public override List GetAllDeviceKey() => colors.Select((c, index) => new DeviceKey( index, c.ledId.ToString() )).ToList(); } public class CorsairKeyboard : CorsairDevice { @@ -185,7 +196,7 @@ public class CorsairKeyboard : CorsairDevice // protected override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.model)); protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceType.Keyboard; - public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceConnector con, Mutex mutex) :base(deviceInfo, index, con, mutex) + public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index) :base(deviceInfo, index) { /* if (LedMaps.KeyboardLedMap.TryGetValue(Device.Leds[j].Name, out var dk)) { @@ -196,29 +207,28 @@ public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index, CorsairDeviceCon KeyMapping.Add(new DeviceKey(500 + overIndex++, Device.Leds[j].Name)); }*/ } - + private int ledIdIndex(CorsairLedId id) + { + for (int i = 0; i < colors.Count; i++) + { + if (colors[i].ledId == id) + return i; + } + return colors.Count - 1; + } protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { - int i = 0; foreach (var (key, clr) in composition.keyColors) { if (LedMaps.KeyboardLedMap.TryGetValue((DeviceKeys)key, out var ledid)) { - colors[i] = new CorsairLedColor() - { - ledId = ledid, - r = clr.R, - g = clr.G, - b = clr.B - }; - i++; + int index = ledIdIndex(ledid); + colors[index].r = clr.R; + colors[index].g = clr.G; + colors[index].b = clr.B; } } - CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, deviceInfo.ledsCount, colors); - mutex.WaitOne(); - connector.LedBufferFinished(); - mutex.WaitOne(); - mutex.ReleaseMutex(); + CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, colors.Count, colors.ToArray()); return true; } } diff --git a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs index 49724a9f6..0a582c2e6 100644 --- a/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/OpenRGB/OpenRGBDevice.cs @@ -37,8 +37,8 @@ protected override bool InitializeImpl() for (var i = 0; i < _devices.Length; i++) { - OpenRGBAuroraDevice device = new OpenRGBAuroraDevice(_devices[i], this, i); - devices.Add(device); + OpenRGBAuroraDevice device = new OpenRGBAuroraDevice(_devices[i], i, _openRgb); + RegisterDevice(device); } } catch (Exception e) @@ -67,20 +67,17 @@ public class OpenRGBAuroraDevice : AuroraDevice private List KeyMapping = new List(); private int DeviceIndex; static object update_lock = new object(); - private OpenRGBDeviceConnector Connector; - - protected Dictionary LedMap = new Dictionary(); - + private OpenRGBClient _openRgb; protected override string DeviceName => Device.Name; protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceTypeConverter(Device.Type); public int Id { get; set; } - public OpenRGBAuroraDevice(OpenRGBDevice device, OpenRGBDeviceConnector connector, int deviceIndex) + public OpenRGBAuroraDevice(OpenRGBDevice device, int deviceIndex, OpenRGBClient openRgb) { Device = device; - Connector = connector; + _openRgb = openRgb; DeviceIndex = deviceIndex; DeviceColors = new OpenRGBColor[Device.Leds.Length]; for (var ledIdx = 0; ledIdx < Device.Leds.Length; ledIdx++) @@ -107,17 +104,7 @@ public OpenRGBAuroraDevice(OpenRGBDevice device, OpenRGBDeviceConnector connecto } } } - protected override void DisconnectImpl() - { - try - { - Connector.UpdateLeds(DeviceIndex, DeviceColors); - } - catch - { - //we tried. - } - } + protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { @@ -138,7 +125,7 @@ protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { lock (update_lock) { - Connector.UpdateLeds(DeviceIndex, DeviceColors); + _openRgb.UpdateLeds(DeviceIndex, DeviceColors); } } catch (Exception exc) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index e97151647..1b41aca35 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -726,7 +726,8 @@ public void Load() foreach ( var conf in DevicesConfig) { - conf.Value.Id.ViewPort = conf.Key; + //conf.Value.Id.ViewPort = conf.Key; + Global.dev_manager.RegisterViewPort(ref conf.Value.Id, conf.Key); DevicesConfigChanged.Invoke(conf.Value); } From bcee7fd3b99600cf96f701f4e09fe1c8b083a58a Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 25 Jun 2021 12:43:54 +0200 Subject: [PATCH 35/42] Remove CorairRGB.NET dependency --- .../Project-Aurora/Project-Aurora.csproj | 1 - .../Settings/ProfileImporter.cs | 302 +++++++++--------- 2 files changed, 151 insertions(+), 152 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index 1027964b0..cc0a56b38 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -61,7 +61,6 @@ - diff --git a/Project-Aurora/Project-Aurora/Settings/ProfileImporter.cs b/Project-Aurora/Project-Aurora/Settings/ProfileImporter.cs index 61cd09c38..3fb3d2d1f 100644 --- a/Project-Aurora/Project-Aurora/Settings/ProfileImporter.cs +++ b/Project-Aurora/Project-Aurora/Settings/ProfileImporter.cs @@ -2,7 +2,7 @@ using Aurora.EffectsEngine.Animations; using Aurora.Profiles; using Aurora.Settings.Layers; -using CorsairRGB.NET.Enums; +using Corsair.CUE.SDK; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -101,50 +101,50 @@ private static void ImportCueprofile(this Application app, string filepath) { try { - CorsairRGB.NET.Enums.CorsairLedId? keyValue = null; + CorsairLedId? keyValue = null; switch (key.Value) { case "0": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_0; + keyValue = CorsairLedId.CLK_0; break; case "1": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_1; + keyValue = CorsairLedId.CLK_1; break; case "2": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_2; + keyValue = CorsairLedId.CLK_2; break; case "3": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_3; + keyValue = CorsairLedId.CLK_3; break; case "4": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_4; + keyValue = CorsairLedId.CLK_4; break; case "5": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_5; + keyValue = CorsairLedId.CLK_5; break; case "6": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_6; + keyValue = CorsairLedId.CLK_6; break; case "7": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_7; + keyValue = CorsairLedId.CLK_7; break; case "8": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_8; + keyValue = CorsairLedId.CLK_8; break; case "9": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_9; + keyValue = CorsairLedId.CLK_9; break; case "Led_KeyboardLogo": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_Logo; + keyValue = CorsairLedId.CLK_Logo; break; case "Led_KeyboardTopLogo2": - keyValue = CorsairRGB.NET.Enums.CorsairLedId.K_Logo; + keyValue = CorsairLedId.CLK_Logo; break; default: if (key.Value.StartsWith("Led_Top")) key.Value = "G18"; - if(Enum.TryParse("K_" + key.Value, out var corsairLedId)){ + if(Enum.TryParse("CLK_" + key.Value, out var corsairLedId)){ keyValue = corsairLedId; } else @@ -763,283 +763,283 @@ void ImportLayers(ObservableCollection source, ObservableCollection /// The CorsairLedId to be converted /// The resulting Devices.DeviceKeys - public static DeviceKeys ToDeviceKeys(CorsairRGB.NET.Enums.CorsairLedId CorsairKey) + public static DeviceKeys ToDeviceKeys(CorsairLedId CorsairKey) { switch (CorsairKey) { - case (CorsairLedId.K_Logo): + case (CorsairLedId.CLK_Logo): return DeviceKeys.LOGO; - case (CorsairLedId.K_Brightness): + case (CorsairLedId.CLK_Brightness): return DeviceKeys.BRIGHTNESS_SWITCH; - case (CorsairLedId.K_WinLock): + case (CorsairLedId.CLK_WinLock): return DeviceKeys.LOCK_SWITCH; - case (CorsairLedId.K_Mute): + case (CorsairLedId.CLK_Mute): return DeviceKeys.VOLUME_MUTE; - case (CorsairLedId.K_VolumeUp): + case (CorsairLedId.CLK_VolumeUp): return DeviceKeys.VOLUME_UP; - case (CorsairLedId.K_VolumeDown): + case (CorsairLedId.CLK_VolumeDown): return DeviceKeys.VOLUME_DOWN; - case (CorsairLedId.K_Stop): + case (CorsairLedId.CLK_Stop): return DeviceKeys.MEDIA_STOP; - case (CorsairLedId.K_PlayPause): + case (CorsairLedId.CLK_PlayPause): return DeviceKeys.MEDIA_PLAY_PAUSE; - case (CorsairLedId.K_ScanPreviousTrack): + case (CorsairLedId.CLK_ScanPreviousTrack): return DeviceKeys.MEDIA_PREVIOUS; - case (CorsairLedId.K_ScanNextTrack): + case (CorsairLedId.CLK_ScanNextTrack): return DeviceKeys.MEDIA_NEXT; - case (CorsairLedId.K_Escape): + case (CorsairLedId.CLK_Escape): return DeviceKeys.ESC; - case (CorsairLedId.K_F1): + case (CorsairLedId.CLK_F1): return DeviceKeys.F1; - case (CorsairLedId.K_F2): + case (CorsairLedId.CLK_F2): return DeviceKeys.F2; - case (CorsairLedId.K_F3): + case (CorsairLedId.CLK_F3): return DeviceKeys.F3; - case (CorsairLedId.K_F4): + case (CorsairLedId.CLK_F4): return DeviceKeys.F4; - case (CorsairLedId.K_F5): + case (CorsairLedId.CLK_F5): return DeviceKeys.F5; - case (CorsairLedId.K_F6): + case (CorsairLedId.CLK_F6): return DeviceKeys.F6; - case (CorsairLedId.K_F7): + case (CorsairLedId.CLK_F7): return DeviceKeys.F7; - case (CorsairLedId.K_F8): + case (CorsairLedId.CLK_F8): return DeviceKeys.F8; - case (CorsairLedId.K_F9): + case (CorsairLedId.CLK_F9): return DeviceKeys.F9; - case (CorsairLedId.K_F10): + case (CorsairLedId.CLK_F10): return DeviceKeys.F10; - case (CorsairLedId.K_F11): + case (CorsairLedId.CLK_F11): return DeviceKeys.F11; - case (CorsairLedId.K_F12): + case (CorsairLedId.CLK_F12): return DeviceKeys.F12; - case (CorsairLedId.K_PrintScreen): + case (CorsairLedId.CLK_PrintScreen): return DeviceKeys.PRINT_SCREEN; - case (CorsairLedId.K_ScrollLock): + case (CorsairLedId.CLK_ScrollLock): return DeviceKeys.SCROLL_LOCK; - case (CorsairLedId.K_PauseBreak): + case (CorsairLedId.CLK_PauseBreak): return DeviceKeys.PAUSE_BREAK; - case (CorsairLedId.K_GraveAccentAndTilde): + case (CorsairLedId.CLK_GraveAccentAndTilde): return DeviceKeys.TILDE; - case (CorsairLedId.K_1): + case (CorsairLedId.CLK_1): return DeviceKeys.ONE; - case (CorsairLedId.K_2): + case (CorsairLedId.CLK_2): return DeviceKeys.TWO; - case (CorsairLedId.K_3): + case (CorsairLedId.CLK_3): return DeviceKeys.THREE; - case (CorsairLedId.K_4): + case (CorsairLedId.CLK_4): return DeviceKeys.FOUR; - case (CorsairLedId.K_5): + case (CorsairLedId.CLK_5): return DeviceKeys.FIVE; - case (CorsairLedId.K_6): + case (CorsairLedId.CLK_6): return DeviceKeys.SIX; - case (CorsairLedId.K_7): + case (CorsairLedId.CLK_7): return DeviceKeys.SEVEN; - case (CorsairLedId.K_8): + case (CorsairLedId.CLK_8): return DeviceKeys.EIGHT; - case (CorsairLedId.K_9): + case (CorsairLedId.CLK_9): return DeviceKeys.NINE; - case (CorsairLedId.K_0): + case (CorsairLedId.CLK_0): return DeviceKeys.ZERO; - case (CorsairLedId.K_MinusAndUnderscore): + case (CorsairLedId.CLK_MinusAndUnderscore): return DeviceKeys.MINUS; - case (CorsairLedId.K_EqualsAndPlus): + case (CorsairLedId.CLK_EqualsAndPlus): return DeviceKeys.EQUALS; - case (CorsairLedId.K_Backspace): + case (CorsairLedId.CLK_Backspace): return DeviceKeys.BACKSPACE; - case (CorsairLedId.K_Insert): + case (CorsairLedId.CLK_Insert): return DeviceKeys.INSERT; - case (CorsairLedId.K_Home): + case (CorsairLedId.CLK_Home): return DeviceKeys.HOME; - case (CorsairLedId.K_PageUp): + case (CorsairLedId.CLK_PageUp): return DeviceKeys.PAGE_UP; - case (CorsairLedId.K_NumLock): + case (CorsairLedId.CLK_NumLock): return DeviceKeys.NUM_LOCK; - case (CorsairLedId.K_KeypadSlash): + case (CorsairLedId.CLK_KeypadSlash): return DeviceKeys.NUM_SLASH; - case (CorsairLedId.K_KeypadAsterisk): + case (CorsairLedId.CLK_KeypadAsterisk): return DeviceKeys.NUM_ASTERISK; - case (CorsairLedId.K_KeypadMinus): + case (CorsairLedId.CLK_KeypadMinus): return DeviceKeys.NUM_MINUS; - case (CorsairLedId.K_Tab): + case (CorsairLedId.CLK_Tab): return DeviceKeys.TAB; - case (CorsairLedId.K_Q): + case (CorsairLedId.CLK_Q): return DeviceKeys.Q; - case (CorsairLedId.K_W): + case (CorsairLedId.CLK_W): return DeviceKeys.W; - case (CorsairLedId.K_E): + case (CorsairLedId.CLK_E): return DeviceKeys.E; - case (CorsairLedId.K_R): + case (CorsairLedId.CLK_R): return DeviceKeys.R; - case (CorsairLedId.K_T): + case (CorsairLedId.CLK_T): return DeviceKeys.T; - case (CorsairLedId.K_Y): + case (CorsairLedId.CLK_Y): return DeviceKeys.Y; - case (CorsairLedId.K_U): + case (CorsairLedId.CLK_U): return DeviceKeys.U; - case (CorsairLedId.K_I): + case (CorsairLedId.CLK_I): return DeviceKeys.I; - case (CorsairLedId.K_O): + case (CorsairLedId.CLK_O): return DeviceKeys.O; - case (CorsairLedId.K_P): + case (CorsairLedId.CLK_P): return DeviceKeys.P; - case (CorsairLedId.K_BracketLeft): + case (CorsairLedId.CLK_BracketLeft): return DeviceKeys.OPEN_BRACKET; - case (CorsairLedId.K_BracketRight): + case (CorsairLedId.CLK_BracketRight): return DeviceKeys.CLOSE_BRACKET; - case (CorsairLedId.K_Backslash): + case (CorsairLedId.CLK_Backslash): return DeviceKeys.BACKSLASH; - case (CorsairLedId.K_Delete): + case (CorsairLedId.CLK_Delete): return DeviceKeys.DELETE; - case (CorsairLedId.K_End): + case (CorsairLedId.CLK_End): return DeviceKeys.END; - case (CorsairLedId.K_PageDown): + case (CorsairLedId.CLK_PageDown): return DeviceKeys.PAGE_DOWN; - case (CorsairLedId.K_Keypad7): + case (CorsairLedId.CLK_Keypad7): return DeviceKeys.NUM_SEVEN; - case (CorsairLedId.K_Keypad8): + case (CorsairLedId.CLK_Keypad8): return DeviceKeys.NUM_EIGHT; - case (CorsairLedId.K_Keypad9): + case (CorsairLedId.CLK_Keypad9): return DeviceKeys.NUM_NINE; - case (CorsairLedId.K_KeypadPlus): + case (CorsairLedId.CLK_KeypadPlus): return DeviceKeys.NUM_PLUS; - case (CorsairLedId.K_CapsLock): + case (CorsairLedId.CLK_CapsLock): return DeviceKeys.CAPS_LOCK; - case (CorsairLedId.K_A): + case (CorsairLedId.CLK_A): return DeviceKeys.A; - case (CorsairLedId.K_S): + case (CorsairLedId.CLK_S): return DeviceKeys.S; - case (CorsairLedId.K_D): + case (CorsairLedId.CLK_D): return DeviceKeys.D; - case (CorsairLedId.K_F): + case (CorsairLedId.CLK_F): return DeviceKeys.F; - case (CorsairLedId.K_G): + case (CorsairLedId.CLK_G): return DeviceKeys.G; - case (CorsairLedId.K_H): + case (CorsairLedId.CLK_H): return DeviceKeys.H; - case (CorsairLedId.K_J): + case (CorsairLedId.CLK_J): return DeviceKeys.J; - case (CorsairLedId.K_K): + case (CorsairLedId.CLK_K): return DeviceKeys.K; - case (CorsairLedId.K_L): + case (CorsairLedId.CLK_L): return DeviceKeys.L; - case (CorsairLedId.K_SemicolonAndColon): + case (CorsairLedId.CLK_SemicolonAndColon): return DeviceKeys.SEMICOLON; - case (CorsairLedId.K_ApostropheAndDoubleQuote): + case (CorsairLedId.CLK_ApostropheAndDoubleQuote): return DeviceKeys.APOSTROPHE; - case (CorsairLedId.K_NonUsTilde): + case (CorsairLedId.CLK_NonUsTilde): return DeviceKeys.HASHTAG; - case (CorsairLedId.K_Enter): + case (CorsairLedId.CLK_Enter): return DeviceKeys.ENTER; - case (CorsairLedId.K_Keypad4): + case (CorsairLedId.CLK_Keypad4): return DeviceKeys.NUM_FOUR; - case (CorsairLedId.K_Keypad5): + case (CorsairLedId.CLK_Keypad5): return DeviceKeys.NUM_FIVE; - case (CorsairLedId.K_Keypad6): + case (CorsairLedId.CLK_Keypad6): return DeviceKeys.NUM_SIX; - case (CorsairLedId.K_LeftShift): + case (CorsairLedId.CLK_LeftShift): return DeviceKeys.LEFT_SHIFT; - case (CorsairLedId.K_NonUsBackslash): + case (CorsairLedId.CLK_NonUsBackslash): return DeviceKeys.BACKSLASH_UK; - case (CorsairLedId.K_Z): + case (CorsairLedId.CLK_Z): return DeviceKeys.Z; - case (CorsairLedId.K_X): + case (CorsairLedId.CLK_X): return DeviceKeys.X; - case (CorsairLedId.K_C): + case (CorsairLedId.CLK_C): return DeviceKeys.C; - case (CorsairLedId.K_V): + case (CorsairLedId.CLK_V): return DeviceKeys.V; - case (CorsairLedId.K_B): + case (CorsairLedId.CLK_B): return DeviceKeys.B; - case (CorsairLedId.K_N): + case (CorsairLedId.CLK_N): return DeviceKeys.N; - case (CorsairLedId.K_M): + case (CorsairLedId.CLK_M): return DeviceKeys.M; - case (CorsairLedId.K_CommaAndLessThan): + case (CorsairLedId.CLK_CommaAndLessThan): return DeviceKeys.COMMA; - case (CorsairLedId.K_PeriodAndBiggerThan): + case (CorsairLedId.CLK_PeriodAndBiggerThan): return DeviceKeys.PERIOD; - case (CorsairLedId.K_SlashAndQuestionMark): + case (CorsairLedId.CLK_SlashAndQuestionMark): return DeviceKeys.FORWARD_SLASH; - case (CorsairLedId.K_RightShift): + case (CorsairLedId.CLK_RightShift): return DeviceKeys.RIGHT_SHIFT; - case (CorsairLedId.K_UpArrow): + case (CorsairLedId.CLK_UpArrow): return DeviceKeys.ARROW_UP; - case (CorsairLedId.K_Keypad1): + case (CorsairLedId.CLK_Keypad1): return DeviceKeys.NUM_ONE; - case (CorsairLedId.K_Keypad2): + case (CorsairLedId.CLK_Keypad2): return DeviceKeys.NUM_TWO; - case (CorsairLedId.K_Keypad3): + case (CorsairLedId.CLK_Keypad3): return DeviceKeys.NUM_THREE; - case (CorsairLedId.K_KeypadEnter): + case (CorsairLedId.CLK_KeypadEnter): return DeviceKeys.NUM_ENTER; - case (CorsairLedId.K_LeftCtrl): + case (CorsairLedId.CLK_LeftCtrl): return DeviceKeys.LEFT_CONTROL; - case (CorsairLedId.K_LeftGui): + case (CorsairLedId.CLK_LeftGui): return DeviceKeys.LEFT_WINDOWS; - case (CorsairLedId.K_LeftAlt): + case (CorsairLedId.CLK_LeftAlt): return DeviceKeys.LEFT_ALT; - case (CorsairLedId.K_Space): + case (CorsairLedId.CLK_Space): return DeviceKeys.SPACE; - case (CorsairLedId.K_RightAlt): + case (CorsairLedId.CLK_RightAlt): return DeviceKeys.RIGHT_ALT; - case (CorsairLedId.K_RightGui): + case (CorsairLedId.CLK_RightGui): return DeviceKeys.RIGHT_WINDOWS; - case (CorsairLedId.K_Application): + case (CorsairLedId.CLK_Application): return DeviceKeys.APPLICATION_SELECT; - case (CorsairLedId.K_RightCtrl): + case (CorsairLedId.CLK_RightCtrl): return DeviceKeys.RIGHT_CONTROL; - case (CorsairLedId.K_LeftArrow): + case (CorsairLedId.CLK_LeftArrow): return DeviceKeys.ARROW_LEFT; - case (CorsairLedId.K_DownArrow): + case (CorsairLedId.CLK_DownArrow): return DeviceKeys.ARROW_DOWN; - case (CorsairLedId.K_RightArrow): + case (CorsairLedId.CLK_RightArrow): return DeviceKeys.ARROW_RIGHT; - case (CorsairLedId.K_Keypad0): + case (CorsairLedId.CLK_Keypad0): return DeviceKeys.NUM_ZERO; - case (CorsairLedId.K_KeypadPeriodAndDelete): + case (CorsairLedId.CLK_KeypadPeriodAndDelete): return DeviceKeys.NUM_PERIOD; - case (CorsairLedId.K_Fn): + case (CorsairLedId.CLK_Fn): return DeviceKeys.FN_Key; - case (CorsairLedId.K_G1): + case (CorsairLedId.CLK_G1): return DeviceKeys.G1; - case (CorsairLedId.K_G2): + case (CorsairLedId.CLK_G2): return DeviceKeys.G2; - case (CorsairLedId.K_G3): + case (CorsairLedId.CLK_G3): return DeviceKeys.G3; - case (CorsairLedId.K_G4): + case (CorsairLedId.CLK_G4): return DeviceKeys.G4; - case (CorsairLedId.K_G5): + case (CorsairLedId.CLK_G5): return DeviceKeys.G5; - case (CorsairLedId.K_G6): + case (CorsairLedId.CLK_G6): return DeviceKeys.G6; - case (CorsairLedId.K_G7): + case (CorsairLedId.CLK_G7): return DeviceKeys.G7; - case (CorsairLedId.K_G8): + case (CorsairLedId.CLK_G8): return DeviceKeys.G8; - case (CorsairLedId.K_G9): + case (CorsairLedId.CLK_G9): return DeviceKeys.G9; - case (CorsairLedId.K_G10): + case (CorsairLedId.CLK_G10): return DeviceKeys.G10; - case (CorsairLedId.K_G11): + case (CorsairLedId.CLK_G11): return DeviceKeys.G11; - case (CorsairLedId.K_G12): + case (CorsairLedId.CLK_G12): return DeviceKeys.G12; - case (CorsairLedId.K_G13): + case (CorsairLedId.CLK_G13): return DeviceKeys.G13; - case (CorsairLedId.K_G14): + case (CorsairLedId.CLK_G14): return DeviceKeys.G14; - case (CorsairLedId.K_G15): + case (CorsairLedId.CLK_G15): return DeviceKeys.G15; - case (CorsairLedId.K_G16): + case (CorsairLedId.CLK_G16): return DeviceKeys.G16; - case (CorsairLedId.K_G17): + case (CorsairLedId.CLK_G17): return DeviceKeys.G17; - case (CorsairLedId.K_G18): + case (CorsairLedId.CLK_G18): return DeviceKeys.G18; default: From 35fe7b1616fc86965ca57feea1528c39160a6175 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 26 Jun 2021 01:25:33 +0200 Subject: [PATCH 36/42] Fix update flash not happening --- .../Devices/Corsair/CorsairDevice.cs | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs index 80e9293f2..7cb9cc594 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs @@ -76,23 +76,6 @@ protected override void ShutdownImpl() allDeviceUpdated.Dispose(); } - internal bool LedBufferFinished(Mutex mutex) - { - if (Devices.Count != CUESDK.CorsairGetDeviceCount()) - { - this.Reset(); - return false; - } - - deviceWaitCounter++; - if(deviceWaitCounter != Devices.Count) - { - return false; - } - CUESDK.CorsairSetLedsColorsFlushBuffer(); - return true; - - } public override void DeviceLedUpdateFinished() { if (Devices.Count != CUESDK.CorsairGetDeviceCount()) @@ -102,7 +85,7 @@ public override void DeviceLedUpdateFinished() } deviceWaitCounter++; - if (deviceWaitCounter != Devices.Count) + if (deviceWaitCounter != Devices.Where(d => d.id.ViewPort != null).ToList().Count) { allDeviceUpdated.Wait(); return; From 3c6663205a4954a391e780082ed51c7b3ce2cb43 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 26 Jun 2021 03:45:39 +0200 Subject: [PATCH 37/42] Fix corsair detection --- .../Devices/Corsair/CorsairDevice.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs index 7cb9cc594..23a036ca9 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs @@ -113,14 +113,20 @@ public class CorsairDevice : AuroraDevice protected CorsairDeviceInfo deviceInfo; protected int deviceIndex; - protected Dictionary KeyMapping = new Dictionary(); + //protected Dictionary KeyMapping = new Dictionary(); public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, AuroraDeviceType type = AuroraDeviceType.Unkown) { this.deviceInfo = deviceInfo; deviceIndex = index; this.type = type; - var possibleLedId = System.Enum.GetValues(typeof(CorsairLedId)).Cast() + var ledPositions = CUESDK.CorsairGetLedPositionsByDeviceIndex(deviceIndex); + + foreach (var pos in ledPositions.pLedPosition) + { + colors.Add(new CorsairLedColor { ledId = pos.ledId}); + } + /*var possibleLedId = System.Enum.GetValues(typeof(CorsairLedId)).Cast() .Where(l => l != CorsairLedId.CLI_Last) .Select(l => new CorsairLedColor { ledId = l }).ToArray(); @@ -140,11 +146,11 @@ public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, AuroraDeviceType t if (KeyMapping.Count != deviceInfo.ledsCount) { LogError("Not all of the led was discover"); - } + }*/ } protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { - for (int i = 0; i < deviceInfo.ledsCount; i++) + for (int i = 0; i < colors.Count; i++) { if (composition.keyColors.TryGetValue(i, out Color clr)) { From fae2c2d192c22027aac06bdd63ba64ebf32c049b Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 27 Jun 2021 00:57:17 +0200 Subject: [PATCH 38/42] Fix ghosting device layout bug --- .../Project-Aurora/Settings/DeviceLayoutManager.cs | 13 +++++++++++-- .../DeviceLayoutViewer/Control_DeviceLayout.xaml | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs index 1b41aca35..125ea8d70 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutManager.cs @@ -694,15 +694,24 @@ public DeviceLayoutManager() dict.Create(); } } + private int FindUnusedViewPort(int viewPort = 0) + { + if (DevicesConfig.Where(c => c.Value.Id.ViewPort == viewPort).Any()) + { + return FindUnusedViewPort(viewPort + 1); + } + return viewPort; + } public void AddNewDeviceLayout() { - var devConf = new DeviceConfig(DevicesConfig.Count); + int viewPort = FindUnusedViewPort(); + var devConf = new DeviceConfig(viewPort); if (devConf.Id.ViewPort == 0) { devConf.Type = 0; devConf.TypeChangeEnabled = false; } - DevicesConfig[DevicesConfig.Count] = devConf; + DevicesConfig[viewPort] = devConf; DevicesConfigChanged.Invoke(devConf); Save(); } diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml index 2213ed4b4..31582cd9c 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml @@ -13,7 +13,7 @@ - + From faae7730b74ad9fb578aecaa3fb9ac3fb5e01268 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 27 Jun 2021 00:58:34 +0200 Subject: [PATCH 39/42] Fix Corsair key mapping --- .../Devices/Corsair/CorsairDevice.cs | 104 ++---- .../Project-Aurora/Devices/Corsair/LedMaps.cs | 342 +++++++++--------- 2 files changed, 201 insertions(+), 245 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs index 23a036ca9..83cd3f879 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/CorsairDevice.cs @@ -106,15 +106,15 @@ public class CorsairDevice : AuroraDevice { protected override string DeviceName => deviceInfo.model; - // protected override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.model)); protected List colors = new List(); private AuroraDeviceType type; protected override AuroraDeviceType AuroraDeviceType => type; protected CorsairDeviceInfo deviceInfo; protected int deviceIndex; - //protected Dictionary KeyMapping = new Dictionary(); + protected Dictionary KeyMapping = new Dictionary(new DeviceKey.EqualityComparer()); + protected CorsairDevice() {} public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, AuroraDeviceType type = AuroraDeviceType.Unkown) { this.deviceInfo = deviceInfo; @@ -122,103 +122,59 @@ public CorsairDevice(CorsairDeviceInfo deviceInfo, int index, AuroraDeviceType t this.type = type; var ledPositions = CUESDK.CorsairGetLedPositionsByDeviceIndex(deviceIndex); + int overIndex = 0; foreach (var pos in ledPositions.pLedPosition) { - colors.Add(new CorsairLedColor { ledId = pos.ledId}); + KeyMapping[new DeviceKey(overIndex++, pos.ledId.ToString())] = pos.ledId; + colors.Add(new CorsairLedColor { ledId = pos.ledId }); } - /*var possibleLedId = System.Enum.GetValues(typeof(CorsairLedId)).Cast() - .Where(l => l != CorsairLedId.CLI_Last) - .Select(l => new CorsairLedColor { ledId = l }).ToArray(); - - if (CUESDK.CorsairGetLedsColorsByDeviceIndex(index, possibleLedId.Length, possibleLedId) != true) - { - LogError("Did not get device led list"); - } - int deviceKeyIndex = 0; - foreach (var item in possibleLedId) - { - if (item.r != 0 || item.g != 0 || item.b != 0) - { - colors.Add(item); - KeyMapping[new DeviceKey(deviceKeyIndex++)] = item.ledId; - } - } - if (KeyMapping.Count != deviceInfo.ledsCount) - { - LogError("Not all of the led was discover"); - }*/ } protected override bool UpdateDeviceImpl(DeviceColorComposition composition) { - for (int i = 0; i < colors.Count; i++) + List colors = new List(); + foreach (var (key, clr) in composition.keyColors) { - if (composition.keyColors.TryGetValue(i, out Color clr)) + if (KeyMapping.TryGetValue(key, out var ledid)) { - colors[i].r = clr.R; - colors[i].g = clr.G; - colors[i].b = clr.B; + colors.Add(new CorsairLedColor() + { + ledId = ledid, + r = clr.R, + g = clr.G, + b = clr.B + }); } } CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, colors.Count, colors.ToArray()); return true; } - private CorsairLedId GetInitialLedIdForDeviceType(CorsairDeviceType type) - { - return type switch - { - CorsairDeviceType.CDT_Headset => CorsairLedId.CLH_LeftLogo, - CorsairDeviceType.CDT_MemoryModule => CorsairLedId.CLDRAM_1, - CorsairDeviceType.CDT_Cooler => CorsairLedId.CLLC_C1_1, - CorsairDeviceType.CDT_Motherboard => CorsairLedId.CLMB_Zone1, - CorsairDeviceType.CDT_GraphicsCard => CorsairLedId.CLGPU_Zone1, - _ => CorsairLedId.CLI_Invalid - }; - } - public override List GetAllDeviceKey() => colors.Select((c, index) => new DeviceKey( index, c.ledId.ToString() )).ToList(); + public override List GetAllDeviceKey() => KeyMapping.Keys.ToList(); } public class CorsairKeyboard : CorsairDevice { - protected override string DeviceName => deviceInfo.model; - - // protected override string DeviceInfo => string.Join(", ", deviceInfos.Select(d => d.model)); protected override AuroraDeviceType AuroraDeviceType => AuroraDeviceType.Keyboard; - public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index) :base(deviceInfo, index) - { - /* if (LedMaps.KeyboardLedMap.TryGetValue(Device.Leds[j].Name, out var dk)) - { - KeyMapping.Add(new DeviceKey(dk)); - } - else - { - KeyMapping.Add(new DeviceKey(500 + overIndex++, Device.Leds[j].Name)); - }*/ - } - private int ledIdIndex(CorsairLedId id) + public CorsairKeyboard(CorsairDeviceInfo deviceInfo, int index) { - for (int i = 0; i < colors.Count; i++) - { - if (colors[i].ledId == id) - return i; - } - return colors.Count - 1; - } - protected override bool UpdateDeviceImpl(DeviceColorComposition composition) - { - foreach (var (key, clr) in composition.keyColors) + this.deviceInfo = deviceInfo; + deviceIndex = index; + var ledPositions = CUESDK.CorsairGetLedPositionsByDeviceIndex(deviceIndex); + int overIndex = 0; + foreach (var pos in ledPositions.pLedPosition) { - if (LedMaps.KeyboardLedMap.TryGetValue((DeviceKeys)key, out var ledid)) + if (LedMaps.KeyboardLedMap.TryGetValue(pos.ledId, out var dk)) + { + KeyMapping[new DeviceKey(dk)] = pos.ledId; + } + else { - int index = ledIdIndex(ledid); - colors[index].r = clr.R; - colors[index].g = clr.G; - colors[index].b = clr.B; + KeyMapping[new DeviceKey(500 + overIndex++, pos.ledId.ToString())] = pos.ledId; } + colors.Add(new CorsairLedColor { ledId = pos.ledId }); } - CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(deviceIndex, colors.Count, colors.ToArray()); - return true; + } } } diff --git a/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs b/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs index fcb81d4a2..6f7e98195 100644 --- a/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs +++ b/Project-Aurora/Project-Aurora/Devices/Corsair/LedMaps.cs @@ -10,177 +10,177 @@ 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.CLK_Escape, - [DeviceKeys.F1] = CorsairLedId.CLK_F1, - [DeviceKeys.F2] = CorsairLedId.CLK_F2, - [DeviceKeys.F3] = CorsairLedId.CLK_F3, - [DeviceKeys.F4] = CorsairLedId.CLK_F4, - [DeviceKeys.F5] = CorsairLedId.CLK_F5, - [DeviceKeys.F6] = CorsairLedId.CLK_F6, - [DeviceKeys.F7] = CorsairLedId.CLK_F7, - [DeviceKeys.F8] = CorsairLedId.CLK_F8, - [DeviceKeys.F9] = CorsairLedId.CLK_F9, - [DeviceKeys.F10] = CorsairLedId.CLK_F10, - [DeviceKeys.F11] = CorsairLedId.CLK_F11, - [DeviceKeys.TILDE] = CorsairLedId.CLK_GraveAccentAndTilde, - [DeviceKeys.ONE] = CorsairLedId.CLK_1, - [DeviceKeys.TWO] = CorsairLedId.CLK_2, - [DeviceKeys.THREE] = CorsairLedId.CLK_3, - [DeviceKeys.FOUR] = CorsairLedId.CLK_4, - [DeviceKeys.FIVE] = CorsairLedId.CLK_5, - [DeviceKeys.SIX] = CorsairLedId.CLK_6, - [DeviceKeys.SEVEN] = CorsairLedId.CLK_7, - [DeviceKeys.EIGHT] = CorsairLedId.CLK_8, - [DeviceKeys.NINE] = CorsairLedId.CLK_9, - [DeviceKeys.ZERO] = CorsairLedId.CLK_0, - [DeviceKeys.MINUS] = CorsairLedId.CLK_MinusAndUnderscore, - [DeviceKeys.TAB] = CorsairLedId.CLK_Tab, - [DeviceKeys.Q] = CorsairLedId.CLK_Q, - [DeviceKeys.W] = CorsairLedId.CLK_W, - [DeviceKeys.E] = CorsairLedId.CLK_E, - [DeviceKeys.R] = CorsairLedId.CLK_R, - [DeviceKeys.T] = CorsairLedId.CLK_T, - [DeviceKeys.Y] = CorsairLedId.CLK_Y, - [DeviceKeys.U] = CorsairLedId.CLK_U, - [DeviceKeys.I] = CorsairLedId.CLK_I, - [DeviceKeys.O] = CorsairLedId.CLK_O, - [DeviceKeys.P] = CorsairLedId.CLK_P, - [DeviceKeys.OPEN_BRACKET] = CorsairLedId.CLK_BracketLeft, - [DeviceKeys.CAPS_LOCK] = CorsairLedId.CLK_CapsLock, - [DeviceKeys.A] = CorsairLedId.CLK_A, - [DeviceKeys.S] = CorsairLedId.CLK_S, - [DeviceKeys.D] = CorsairLedId.CLK_D, - [DeviceKeys.F] = CorsairLedId.CLK_F, - [DeviceKeys.G] = CorsairLedId.CLK_G, - [DeviceKeys.H] = CorsairLedId.CLK_H, - [DeviceKeys.J] = CorsairLedId.CLK_J, - [DeviceKeys.K] = CorsairLedId.CLK_K, - [DeviceKeys.L] = CorsairLedId.CLK_L, - [DeviceKeys.SEMICOLON] = CorsairLedId.CLK_SemicolonAndColon, - [DeviceKeys.APOSTROPHE] = CorsairLedId.CLK_ApostropheAndDoubleQuote, - [DeviceKeys.LEFT_SHIFT] = CorsairLedId.CLK_LeftShift, - [DeviceKeys.BACKSLASH_UK] = CorsairLedId.CLK_NonUsBackslash, - [DeviceKeys.Z] = CorsairLedId.CLK_Z, - [DeviceKeys.X] = CorsairLedId.CLK_X, - [DeviceKeys.C] = CorsairLedId.CLK_C, - [DeviceKeys.V] = CorsairLedId.CLK_V, - [DeviceKeys.B] = CorsairLedId.CLK_B, - [DeviceKeys.N] = CorsairLedId.CLK_N, - [DeviceKeys.M] = CorsairLedId.CLK_M, - [DeviceKeys.COMMA] = CorsairLedId.CLK_CommaAndLessThan, - [DeviceKeys.PERIOD] = CorsairLedId.CLK_PeriodAndBiggerThan, - [DeviceKeys.FORWARD_SLASH] = CorsairLedId.CLK_SlashAndQuestionMark, - [DeviceKeys.LEFT_CONTROL] = CorsairLedId.CLK_LeftCtrl, - [DeviceKeys.LEFT_WINDOWS] = CorsairLedId.CLK_LeftGui, - [DeviceKeys.LEFT_ALT] = CorsairLedId.CLK_LeftAlt, - //[DeviceKeys.Lang2] = CorsairLedId.CLK_Lang2, - [DeviceKeys.SPACE] = CorsairLedId.CLK_Space, - //[DeviceKeys.Lang1] = CorsairLedId.CLK_Lang1, - //[DeviceKeys.International2] = CorsairLedId.CLK_International2, - [DeviceKeys.RIGHT_ALT] = CorsairLedId.CLK_RightAlt, - [DeviceKeys.RIGHT_WINDOWS] = CorsairLedId.CLK_RightGui, - [DeviceKeys.APPLICATION_SELECT] = CorsairLedId.CLK_Application, - //[DeviceKeys.LedProgramming] = CorsairLedId.CLK_LedProgramming, - [DeviceKeys.BRIGHTNESS_SWITCH] = CorsairLedId.CLK_Brightness, - [DeviceKeys.F12] = CorsairLedId.CLK_F12, - [DeviceKeys.PRINT_SCREEN] = CorsairLedId.CLK_PrintScreen, - [DeviceKeys.SCROLL_LOCK] = CorsairLedId.CLK_ScrollLock, - [DeviceKeys.PAUSE_BREAK] = CorsairLedId.CLK_PauseBreak, - [DeviceKeys.INSERT] = CorsairLedId.CLK_Insert, - [DeviceKeys.HOME] = CorsairLedId.CLK_Home, - [DeviceKeys.PAGE_UP] = CorsairLedId.CLK_PageUp, - [DeviceKeys.CLOSE_BRACKET] = CorsairLedId.CLK_BracketRight, - [DeviceKeys.BACKSLASH] = CorsairLedId.CLK_Backslash, - [DeviceKeys.HASHTAG] = CorsairLedId.CLK_NonUsTilde, - [DeviceKeys.ENTER] = CorsairLedId.CLK_Enter, - //[DeviceKeys.International1] = CorsairLedId.CLK_International1, - [DeviceKeys.EQUALS] = CorsairLedId.CLK_EqualsAndPlus, - //[DeviceKeys.International3] = CorsairLedId.CLK_International3, - [DeviceKeys.BACKSPACE] = CorsairLedId.CLK_Backspace, - [DeviceKeys.DELETE] = CorsairLedId.CLK_Delete, - [DeviceKeys.END] = CorsairLedId.CLK_End, - [DeviceKeys.PAGE_DOWN] = CorsairLedId.CLK_PageDown, - [DeviceKeys.RIGHT_SHIFT] = CorsairLedId.CLK_RightShift, - [DeviceKeys.RIGHT_CONTROL] = CorsairLedId.CLK_RightCtrl, - [DeviceKeys.ARROW_UP] = CorsairLedId.CLK_UpArrow, - [DeviceKeys.ARROW_LEFT] = CorsairLedId.CLK_LeftArrow, - [DeviceKeys.ARROW_DOWN] = CorsairLedId.CLK_DownArrow, - [DeviceKeys.ARROW_RIGHT] = CorsairLedId.CLK_RightArrow, - [DeviceKeys.LOCK_SWITCH] = CorsairLedId.CLK_WinLock, - [DeviceKeys.VOLUME_MUTE] = CorsairLedId.CLK_Mute, - [DeviceKeys.MEDIA_STOP] = CorsairLedId.CLK_Stop, - [DeviceKeys.MEDIA_PREVIOUS] = CorsairLedId.CLK_ScanPreviousTrack, - [DeviceKeys.MEDIA_PLAY_PAUSE] = CorsairLedId.CLK_PlayPause, - [DeviceKeys.MEDIA_NEXT] = CorsairLedId.CLK_ScanNextTrack, - [DeviceKeys.NUM_LOCK] = CorsairLedId.CLK_NumLock, - [DeviceKeys.NUM_SLASH] = CorsairLedId.CLK_KeypadSlash, - [DeviceKeys.NUM_ASTERISK] = CorsairLedId.CLK_KeypadAsterisk, - [DeviceKeys.NUM_MINUS] = CorsairLedId.CLK_KeypadMinus, - [DeviceKeys.NUM_PLUS] = CorsairLedId.CLK_KeypadPlus, - [DeviceKeys.NUM_ENTER] = CorsairLedId.CLK_KeypadEnter, - [DeviceKeys.NUM_SEVEN] = CorsairLedId.CLK_Keypad7, - [DeviceKeys.NUM_EIGHT] = CorsairLedId.CLK_Keypad8, - [DeviceKeys.NUM_NINE] = CorsairLedId.CLK_Keypad9, - [DeviceKeys.NUM_ZEROZERO] = CorsairLedId.CLK_KeypadComma, - [DeviceKeys.NUM_FOUR] = CorsairLedId.CLK_Keypad4, - [DeviceKeys.NUM_FIVE] = CorsairLedId.CLK_Keypad5, - [DeviceKeys.NUM_SIX] = CorsairLedId.CLK_Keypad6, - [DeviceKeys.NUM_ONE] = CorsairLedId.CLK_Keypad1, - [DeviceKeys.NUM_TWO] = CorsairLedId.CLK_Keypad2, - [DeviceKeys.NUM_THREE] = CorsairLedId.CLK_Keypad3, - [DeviceKeys.NUM_ZERO] = CorsairLedId.CLK_Keypad0, - [DeviceKeys.NUM_PERIOD] = CorsairLedId.CLK_KeypadPeriodAndDelete, - [DeviceKeys.G1] = CorsairLedId.CLK_G1, - [DeviceKeys.G2] = CorsairLedId.CLK_G2, - [DeviceKeys.G3] = CorsairLedId.CLK_G3, - [DeviceKeys.G4] = CorsairLedId.CLK_G4, - [DeviceKeys.G5] = CorsairLedId.CLK_G5, - [DeviceKeys.G6] = CorsairLedId.CLK_G6, - [DeviceKeys.G7] = CorsairLedId.CLK_G7, - [DeviceKeys.G8] = CorsairLedId.CLK_G8, - [DeviceKeys.G9] = CorsairLedId.CLK_G9, - [DeviceKeys.G10] = CorsairLedId.CLK_G10, - [DeviceKeys.VOLUME_UP] = CorsairLedId.CLK_VolumeUp, - [DeviceKeys.VOLUME_DOWN] = CorsairLedId.CLK_VolumeDown, - //[DeviceKeys.MR] = CorsairLedId.CLK_MR, - //[DeviceKeys.M1] = CorsairLedId.CLK_M1, - //[DeviceKeys.M2] = CorsairLedId.CLK_M2, - //[DeviceKeys.M3] = CorsairLedId.CLK_M3, - [DeviceKeys.G11] = CorsairLedId.CLK_G11, - [DeviceKeys.G12] = CorsairLedId.CLK_G12, - [DeviceKeys.G13] = CorsairLedId.CLK_G13, - [DeviceKeys.G14] = CorsairLedId.CLK_G14, - [DeviceKeys.G15] = CorsairLedId.CLK_G15, - [DeviceKeys.G16] = CorsairLedId.CLK_G16, - [DeviceKeys.G17] = CorsairLedId.CLK_G17, - [DeviceKeys.G18] = CorsairLedId.CLK_G18, - //[DeviceKeys.International5] = CorsairLedId.CLK_International5, - //[DeviceKeys.International4] = CorsairLedId.CLK_International4, - [DeviceKeys.FN_Key] = CorsairLedId.CLK_Fn, - [DeviceKeys.LOCK_SWITCH] = CorsairLedId.CLK_WinLock, - [DeviceKeys.BRIGHTNESS_SWITCH] = CorsairLedId.CLK_Brightness, - [DeviceKeys.LOGO] = CorsairLedId.CLK_Logo, - [DeviceKeys.ADDITIONALLIGHT1] = CorsairLedId.CLKLP_Zone1, - [DeviceKeys.ADDITIONALLIGHT2] = CorsairLedId.CLKLP_Zone2, - [DeviceKeys.ADDITIONALLIGHT3] = CorsairLedId.CLKLP_Zone3, - [DeviceKeys.ADDITIONALLIGHT4] = CorsairLedId.CLKLP_Zone4, - [DeviceKeys.ADDITIONALLIGHT5] = CorsairLedId.CLKLP_Zone5, - [DeviceKeys.ADDITIONALLIGHT6] = CorsairLedId.CLKLP_Zone6, - [DeviceKeys.ADDITIONALLIGHT7] = CorsairLedId.CLKLP_Zone7, - [DeviceKeys.ADDITIONALLIGHT8] = CorsairLedId.CLKLP_Zone8, - [DeviceKeys.ADDITIONALLIGHT9] = CorsairLedId.CLKLP_Zone9, - [DeviceKeys.ADDITIONALLIGHT10] = CorsairLedId.CLKLP_Zone10, - [DeviceKeys.ADDITIONALLIGHT11] = CorsairLedId.CLKLP_Zone11, - [DeviceKeys.ADDITIONALLIGHT12] = CorsairLedId.CLKLP_Zone12, - [DeviceKeys.ADDITIONALLIGHT13] = CorsairLedId.CLKLP_Zone13, - [DeviceKeys.ADDITIONALLIGHT14] = CorsairLedId.CLKLP_Zone14, - [DeviceKeys.ADDITIONALLIGHT15] = CorsairLedId.CLKLP_Zone15, - [DeviceKeys.ADDITIONALLIGHT16] = CorsairLedId.CLKLP_Zone16, - [DeviceKeys.ADDITIONALLIGHT17] = CorsairLedId.CLKLP_Zone17, - [DeviceKeys.ADDITIONALLIGHT18] = CorsairLedId.CLKLP_Zone18, - [DeviceKeys.ADDITIONALLIGHT19] = CorsairLedId.CLKLP_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() @@ -225,7 +225,7 @@ internal static class LedMaps [DeviceKeys.ADDITIONALLIGHT3] = CorsairLedId.M_6 };*/ - internal static readonly Dictionary> MapsMap = new Dictionary>() + internal static readonly Dictionary> MapsMap = new Dictionary>() { [CorsairDeviceType.CDT_Keyboard] = KeyboardLedMap, /*[CorsairDeviceType.CDT_Mouse] = MouseLedMap, From d03a8a75e790725acaa855ddf766ef20a026e345 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 28 Jun 2021 09:44:24 +0200 Subject: [PATCH 40/42] Fix some device layout bugs --- .../Control_DeviceLayout.xaml | 6 +-- .../Control_DeviceLayout.xaml.cs | 48 +++++++++++-------- .../Control_DeviceLayoutPresenter.xaml.cs | 21 +++----- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml index 31582cd9c..901b0a942 100644 --- a/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml +++ b/Project-Aurora/Project-Aurora/Settings/DeviceLayoutViewer/Control_DeviceLayout.xaml @@ -12,12 +12,12 @@ - - + + - + - + No Device selected Please doubleclick on this box