diff --git a/README.md b/README.md
index 9a8868c6e..0b8789f37 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,7 @@ A few people have already started working on plugins! If you want your plugins t
- https://github.com/diogotr7/Artemis.Plugins
- https://github.com/Wibble199/Artemis.Plugins
- https://github.com/F-Lehmann/MyArtemisPlugins
+- https://github.com/Cheerpipe/Artemis.Plugins.Public
## Work in progress screenshots
**Note:** Video tutorials and written guides on many of the features displayed below are planned for when Artemis 2 nears feature-completion.
diff --git a/src/Artemis.Core/Artemis.Core.csproj b/src/Artemis.Core/Artemis.Core.csproj
index 8b5c4bc83..17b364307 100644
--- a/src/Artemis.Core/Artemis.Core.csproj
+++ b/src/Artemis.Core/Artemis.Core.csproj
@@ -80,4 +80,10 @@
PreserveNewest
+
+
+
+ PreserveNewest
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 1 LED headset.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 1 LED headset.xml
new file mode 100644
index 000000000..bc0ebc8ef
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 1 LED headset.xml
@@ -0,0 +1,25 @@
+
+
+ 1 LEDs headset
+ The default layout for headsets with 1 LED
+ SpoinkyNL & Aureshion
+ Headset
+ Artemis
+ Artemis 1 LED headset
+ 242
+ 233
+ 1
+ 1
+
+
+ M0.073,0.002 L0.073,0.015 L0.293,0.937 L0.3,0.946 L0.275,0.969 L0.048,0.025z M0.925,0.001 L0.925,0.012 L0.706,0.938 L0.697,0.941 L0.729,0.97 L0.95,0.021z
+ 15
+ 125
+ 212
+ 108
+
+
+
+ Headset.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 2 LEDs headset.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 2 LEDs headset.xml
new file mode 100644
index 000000000..00a153c9b
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 2 LEDs headset.xml
@@ -0,0 +1,32 @@
+
+
+ 2 LEDs headset
+ The default layout for headsets with 2 LEDs
+ SpoinkyNL & Aureshion
+ Headset
+ Artemis
+ Artemis 2 LEDs headset
+ 242
+ 233
+ 1
+ 1
+
+
+ M0.246,0 L0.24,0.02 L0.974,0.938 L0.999,0.941 L0.916,0.965 L0.17,0.023z
+ 15
+ 125
+ 64
+ 108
+
+
+ M0.741,-0.003 L0.755,0.012 L0.026,0.937 L0.003,0.939 L0.084,0.965 L0.833,0.027z
+ 163
+ ~
+ 64
+ 108
+
+
+
+ Headset.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 4 LEDs headset.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 4 LEDs headset.xml
new file mode 100644
index 000000000..7764b9abc
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Artemis 4 LEDs headset.xml
@@ -0,0 +1,46 @@
+
+
+ 4 LEDs headset
+ The default layout for headsets with 4 LEDs
+ SpoinkyNL & Aureshion
+ Headset
+ Artemis
+ Artemis 4 LEDs headset
+ 242
+ 233
+ 1
+ 1
+
+
+ M0.241,0.001 L0.231,0.021 L0.62,1 L0.523,1 L0.153,0.056z
+ 15
+ 125
+ 64
+ 54
+
+
+ M0.62,0 L0.968,0.87 L0.992,0.886 L0.903,0.943 L0.523,0z
+ ~
+ +
+ 64
+ 54
+
+
+ M0.748,0 L0.752,0.027 L0.377,1 L0.468,1 L0.837,0.053z
+ 163
+ 125
+ 64
+ 54
+
+
+ M0.377,0 L0.468,0 L0.09,0.935 L0,0.88 L0.032,0.863z
+ ~
+ +
+ 64
+ 54
+
+
+
+ Headset.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Headset.png b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Headset.png
new file mode 100644
index 000000000..2925ef002
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Headset/Headset.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis L keyboard-ANSI.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis L keyboard-ANSI.xml
new file mode 100644
index 000000000..8c61a0f4d
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis L keyboard-ANSI.xml
@@ -0,0 +1,956 @@
+
+
+ Artemis large keyboard layout
+ The default layout for full sized keyboards
+ SpoinkyNL
+ Keyboard
+ Artemis
+ Artemis L keyboard
+ 441
+ 144
+
+
+ 7
+ 18
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ 39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+ 1
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 7
+ ~
+ 1.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.25
+
+
+
+
+
+
+
+ +67
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 2.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.75
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 7
+ ~
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+ 6.5
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 0
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 2
+ 139
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ M0.8314498662948608,0.14738866686820984 L0.9718837738037109,0.14738866686820984 C0.9818984270095825,0.14737924933433533 0.9911608695983887,0.15217334032058716 0.9961943626403809,0.1599714159965515 1.0012279748916626,0.1677694320678711 1.0012708902359009,0.17739155888557434 0.9963071346282959,0.18522578477859497 L0.9271892309188843,0.2952173352241516 C0.9220999479293823,0.303014874458313,0.9128080606460571,0.30780303478240967,0.9027659893035889,0.30780303478240967 C0.892723798751831,0.30780303478240967,0.8834319114685059,0.303014874458313,0.8783426284790039,0.2952173352241516 L0.8644212484359741,0.2732190191745758 0.8512327671051025,0.2802584767341614 C0.8458596467971802,0.2705792188644409 0.8399980068206787,0.26089999079704285 0.8338921070098877,0.25144070386886597 0.8277863264083862,0.2419814169406891 0.8177727460861206,0.22724255919456482 0.8094688653945923,0.2155834138393402 L0.8224133253097534,0.20898395776748657 0.8070266246795654,0.18566575646400452 C0.8019757270812988,0.17778605222702026,0.8019649982452393,0.16808003187179565,0.8069984912872314,0.16019132733345032 C0.8120319843292236,0.15230253338813782,0.8213481903076172,0.1474246382713318,0.8314498662948608,0.14738866686820984z M0.10265883803367615,0.2802584767341614 C0.11096274852752686,0.2850980758666992 0.11951091885566711,0.28993773460388184 0.12708213925361633,0.2943373918533325 0.14149188995361328,0.3020368218421936 0.15663433074951172,0.3090762495994568 0.1715325117111206,0.31633567810058594 0.21944981813430786,0.33654189109802246 0.2699943780899048,0.35124915838241577 0.32197999954223633,0.3601123094558716 L0.20377129316329956,0.4168679714202881 0.1908269226551056,0.42302751541137695 C0.14440736174583435,0.4102410674095154 0.09916770458221436,0.3942067623138428 0.05552190542221069,0.3750711679458618 -0.05462715029716492,0.3422936797142029 0.01937541365623474,0.22108301520347595 0.10265883803367615,0.2802584767341614z M0.4714505672454834,0.5930745005607605 C0.46778708696365356,0.602533757686615 0.4646120071411133,0.6119930148124695 0.4614369869232178,0.6214522123336792 0.4521523118019104,0.6509119868278503 0.4455362558364868,0.6810019016265869 0.44165414571762085,0.7114253044128418 0.4388039708137512,0.7340653538703918 0.4374176263809204,0.7568352818489075 0.4375022053718567,0.7796201109886169 0.4375022053718567,0.7877594828605652 0.4375022053718567,0.7961188554763794 0.4375022053718567,0.8042582273483276 C0.444272518157959,0.8297898769378662,0.42963647842407227,0.8560013771057129,0.40284329652786255,0.8663284778594971 C0.37605005502700806,0.8766556978225708 0.3448934555053711,0.8680944442749023 0.3290627598762512,0.8460550308227539 0.31538575887680054,0.8240567445755005 0.32368963956832886,0.8020584583282471 0.3246665596961975,0.7783002257347107 0.32564353942871094,0.7545420527458191 0.3297954797744751,0.7343035936355591 0.33419162034988403,0.7123052477836609 0.33712244033813477,0.6960265636444092 0.3407859206199646,0.6799677610397339 0.344693660736084,0.6639089584350586 L0.35763800144195557,0.6566495895385742 0.44629454612731934,0.6069333553314209 0.4714505672454834,0.5930745005607605z M0.5317760705947876,0.3625321388244629 C0.5405619740486145,0.3735124468803406 0.5487139821052551,0.384893536567688 0.5561993718147278,0.39662957191467285 0.5627936720848083,0.40674877166748047 0.5688995122909546,0.41730791330337524 0.5732957124710083,0.4278671145439148 L0.551070511341095,0.4404062032699585 0.4829294681549072,0.47824329137802124 0.30463945865631104,0.5792155265808105 0.1959558129310608,0.640370786190033 0.14173611998558044,0.6705085635185242 C0.13235116004943848,0.675317645072937,0.12175974249839783,0.6778919100761414,0.11096274852752686,0.6779879927635193 C0.08286315202713013,0.6767981648445129,0.05947789549827576,0.6581392884254456,0.054777029901742935,0.6331580281257629 C0.05007615685462952,0.6081767678260803,0.06532919406890869,0.583619236946106,0.0914241373538971,0.5741559267044067 L0.10558965802192688,0.56733638048172 0.13733991980552673,0.5521575808525085 0.25139671564102173,0.4971618056297302 0.43701374530792236,0.4080686569213867 0.5088182091712952,0.3735312819480896 0.5317760705947876,0.3625321388244629z M0.1580997109413147,0 L0.17324218153953552,0 C0.1837441623210907,0,0.19424617290496826,0,0.20450395345687866,0 L0.22892725467681885,0.001539871096611023 0.25506019592285156,0.003959685564041138 C0.2677602767944336,0.005499586462974548 0.279483437538147,0.007039457559585571 0.29242783784866333,0.009239301085472107 0.29804515838623047,0.009239301085472107 0.3036625385284424,0.010999158024787903 0.30952417850494385,0.012099072337150574 L0.31294339895248413,0.012099072337150574 C0.321491539478302,0.013858944177627563 0.3297954797744751,0.015398815274238586 0.3373667001724243,0.017598658800125122 0.35522812604904175,0.02149401605129242 0.37283915281295776,0.02626737952232361 0.3901209831237793,0.031897544860839844 0.4018441438674927,0.03541727364063263 0.4130789041519165,0.03915698826313019 0.42431360483169556,0.0433366596698761 0.4323732852935791,0.04641643166542053 0.4406772255897522,0.049496203660964966 0.44873690605163574,0.05301591753959656 0.4567965865135193,0.05653566122055054 0.46290236711502075,0.05895546078681946 0.46974092721939087,0.06225523352622986 L0.47633522748947144,0.06511500477790833 C0.4831737279891968,0.06819474697113037 0.4900122880935669,0.07149451971054077 0.4963623285293579,0.07501423358917236 0.5027123689651489,0.07853397727012634 0.5119932889938354,0.08293363451957703 0.5207855701446533,0.08711332082748413 0.532753050327301,0.09393277764320374 0.5452088713645935,0.10075226426124573 0.5561993718147278,0.10911163687705994 L0.5598629117012024,0.11153143644332886 C0.5674340724945068,0.11637106537818909,0.575005292892456,0.12165066599845886,0.58257657289505,0.12693023681640625 L0.5852631330490112,0.12869009375572205 C0.5940554738044739,0.1348496377468109 0.6026036739349365,0.14144912362098694 0.6111517548561096,0.14826861023902893 0.6192114949226379,0.1544281542301178 0.6267826557159424,0.16080763936042786 0.6355750560760498,0.16762709617614746 0.6443674564361572,0.17444661259651184 0.6512059569358826,0.18126606941223145 0.6585330367088318,0.18852552771568298 0.6609752774238586,0.19072535634040833 0.6631733775138855,0.19314518570899963 0.6656156778335571,0.19556495547294617 0.6719657778739929,0.201944500207901 0.6783158183097839,0.20832398533821106 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21602341532707214 0.6858870983123779,0.21690335869789124 0.6927255392074585,0.22438275814056396 0.6993198394775391,0.23186218738555908 0.7056698799133301,0.23890167474746704 0.7120199799537659,0.2459411323070526 0.7191027402877808,0.2554003894329071 0.7256970405578613,0.26419970393180847 L0.7325356006622314,0.27387893199920654 C0.7376644611358643,0.28113842010498047 0.7427933216094971,0.2886178195476532 0.7476779222488403,0.29587724804878235 0.887993574142456,0.5147373676300049 0.8601140975952148,0.7894638180732727 0.6780716180801392,0.9817845821380615 0.6709265112876892,0.989209771156311 0.6617487668991089,0.9948219060897827 0.6514502167701721,0.998063325881958 L0.6431463360786438,0.9998232126235962 C0.6424370408058167,1.000058889389038 0.6416575908660889,1.000058889389038 0.6409482359886169,0.9998232126235962 0.6382670402526855,1.0000406503677368 0.6355696320533752,1.0000406503677368 0.6328884959220886,0.9998232126235962 C0.6096473932266235,1.0000758171081543,0.5884177088737488,0.9879860877990723,0.5787044167518616,0.9689667224884033 C0.5689911842346191,0.9499474763870239 0.5726134181022644,0.9275609254837036 0.5879496335983276,0.911829948425293 0.6916045546531677,0.8017895221710205 0.7362658977508545,0.6562486886978149 0.7100660800933838,0.5138804912567139 0.7100660800933838,0.5086009502410889 0.7081122398376465,0.5033213496208191 0.7068911194801331,0.4980417490005493 0.7056698799133301,0.49276214838027954 0.7044487595558167,0.48748254776000977 0.7029833793640137,0.4819830060005188 0.7015179395675659,0.47648340463638306 0.7002968192100525,0.47142380475997925 0.69858717918396,0.4661442041397095 0.6968775987625122,0.4608646035194397 0.6956563591957092,0.45624494552612305 0.6937025189399719,0.45118534564971924 0.6888028383255005,0.4367102384567261 0.6830968260765076,0.42246657609939575 0.6766061782836914,0.4085085988044739 0.6751407384872437,0.4045489430427551 0.6731869578361511,0.40102916955947876 0.6714773178100586,0.3972894549369812 0.6635856032371521,0.381019651889801 0.6546980738639832,0.3651564121246338 0.6448559165000916,0.349773108959198 0.6414366960525513,0.34493350982666016 0.638261616230011,0.3398738503456116 0.6350865960121155,0.3352542519569397 0.6289807558059692,0.32645493745803833 0.622630774974823,0.3180955648422241 0.6162806153297424,0.3097361922264099 0.6099306344985962,0.3013768196105957 0.600894033908844,0.2910376489162445 0.591857373714447,0.2820183336734772 L0.5801341533660889,0.2696993052959442 C0.5715860724449158,0.26089999079704285 0.5625494718551636,0.25254058837890625 0.5535128116607666,0.2446211874485016 0.5493572354316711,0.24065852165222168 0.5449538826942444,0.23691263794898987 0.5403242707252502,0.2334021031856537 L0.529333770275116,0.22460272908210754 C0.5064655542373657,0.20664280652999878 0.48195523023605347,0.19045335054397583 0.4560639262199402,0.17620646953582764 0.45191192626953125,0.17378664016723633 0.44727152585983276,0.171586811542511 0.44287532567977905,0.16938698291778564 0.43847912549972534,0.1671871840953827 0.43261754512786865,0.16410738229751587 0.42748862504959106,0.16168758273124695 L0.416253924369812,0.15662795305252075 C0.39798784255981445,0.14821934700012207,0.37914353609085083,0.14087164402008057,0.3598361015319824,0.13462966680526733 L0.3490898609161377,0.13132989406585693 0.3466475009918213,0.13132989406585693 C0.3337032198905945,0.1273702085018158,0.32051461935043335,0.1238504946231842,0.3068375587463379,0.12077072262763977 L0.3007317781448364,0.11945080757141113 C0.284625768661499,0.11583057045936584 0.26832127571105957,0.1129668653011322 0.25188517570495605,0.11087149381637573 0.2433369755744934,0.1095515787601471 0.23478883504867554,0.108671635389328 0.22746187448501587,0.10801169276237488 0.2201349139213562,0.10735175013542175 0.2079232633113861,0.10647183656692505 0.19815391302108765,0.10625183582305908 0.18838459253311157,0.1060318648815155 0.18227878212928772,0.10625183582305908 0.17373061180114746,0.10625183582305908 0.14096742868423462,0.10622519254684448 0.1082688570022583,0.10887587070465088 0.0760374665260315,0.11417123675346375 0.07254058122634888,0.11437812447547913 0.06903234124183655,0.11437812447547913 0.06553545594215393,0.11417123675346375 C0.03505754470825195,0.11396905779838562,0.00974804162979126,0.09292516112327576,0.007091343402862549,0.06557714939117432 C0.0044345855712890625,0.03822912275791168 0.02530190348625183,0.013545975089073181 0.05527767539024353,0.008579328656196594 0.08923646807670593,0.0032099932432174683 0.12362384796142578,0.00034074485301971436 0.1580997109413147,0z
+ 214
+ 5
+ 0.65
+ 0.7
+
+
+ 361
+ 10
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+
+ L.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis L keyboard-ISO.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis L keyboard-ISO.xml
new file mode 100644
index 000000000..fe5f59f05
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis L keyboard-ISO.xml
@@ -0,0 +1,964 @@
+
+
+ Artemis large keyboard layout
+ The default layout for full sized keyboards
+ SpoinkyNL
+ Keyboard
+ Artemis
+ Artemis L keyboard
+ 441
+ 144
+
+
+ 7
+ 18
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ 39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ M0,0 L0,0.5 L0.16666666666,0.5 L0.16666666666,1 L1,1 L1,0 Z
+ 1.5
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 7
+ ~
+ 1.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+ +90.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.75
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 7
+ ~
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+ 6.5
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 0
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 2
+ 139
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ M0.8314498662948608,0.14738866686820984 L0.9718837738037109,0.14738866686820984 C0.9818984270095825,0.14737924933433533 0.9911608695983887,0.15217334032058716 0.9961943626403809,0.1599714159965515 1.0012279748916626,0.1677694320678711 1.0012708902359009,0.17739155888557434 0.9963071346282959,0.18522578477859497 L0.9271892309188843,0.2952173352241516 C0.9220999479293823,0.303014874458313,0.9128080606460571,0.30780303478240967,0.9027659893035889,0.30780303478240967 C0.892723798751831,0.30780303478240967,0.8834319114685059,0.303014874458313,0.8783426284790039,0.2952173352241516 L0.8644212484359741,0.2732190191745758 0.8512327671051025,0.2802584767341614 C0.8458596467971802,0.2705792188644409 0.8399980068206787,0.26089999079704285 0.8338921070098877,0.25144070386886597 0.8277863264083862,0.2419814169406891 0.8177727460861206,0.22724255919456482 0.8094688653945923,0.2155834138393402 L0.8224133253097534,0.20898395776748657 0.8070266246795654,0.18566575646400452 C0.8019757270812988,0.17778605222702026,0.8019649982452393,0.16808003187179565,0.8069984912872314,0.16019132733345032 C0.8120319843292236,0.15230253338813782,0.8213481903076172,0.1474246382713318,0.8314498662948608,0.14738866686820984z M0.10265883803367615,0.2802584767341614 C0.11096274852752686,0.2850980758666992 0.11951091885566711,0.28993773460388184 0.12708213925361633,0.2943373918533325 0.14149188995361328,0.3020368218421936 0.15663433074951172,0.3090762495994568 0.1715325117111206,0.31633567810058594 0.21944981813430786,0.33654189109802246 0.2699943780899048,0.35124915838241577 0.32197999954223633,0.3601123094558716 L0.20377129316329956,0.4168679714202881 0.1908269226551056,0.42302751541137695 C0.14440736174583435,0.4102410674095154 0.09916770458221436,0.3942067623138428 0.05552190542221069,0.3750711679458618 -0.05462715029716492,0.3422936797142029 0.01937541365623474,0.22108301520347595 0.10265883803367615,0.2802584767341614z M0.4714505672454834,0.5930745005607605 C0.46778708696365356,0.602533757686615 0.4646120071411133,0.6119930148124695 0.4614369869232178,0.6214522123336792 0.4521523118019104,0.6509119868278503 0.4455362558364868,0.6810019016265869 0.44165414571762085,0.7114253044128418 0.4388039708137512,0.7340653538703918 0.4374176263809204,0.7568352818489075 0.4375022053718567,0.7796201109886169 0.4375022053718567,0.7877594828605652 0.4375022053718567,0.7961188554763794 0.4375022053718567,0.8042582273483276 C0.444272518157959,0.8297898769378662,0.42963647842407227,0.8560013771057129,0.40284329652786255,0.8663284778594971 C0.37605005502700806,0.8766556978225708 0.3448934555053711,0.8680944442749023 0.3290627598762512,0.8460550308227539 0.31538575887680054,0.8240567445755005 0.32368963956832886,0.8020584583282471 0.3246665596961975,0.7783002257347107 0.32564353942871094,0.7545420527458191 0.3297954797744751,0.7343035936355591 0.33419162034988403,0.7123052477836609 0.33712244033813477,0.6960265636444092 0.3407859206199646,0.6799677610397339 0.344693660736084,0.6639089584350586 L0.35763800144195557,0.6566495895385742 0.44629454612731934,0.6069333553314209 0.4714505672454834,0.5930745005607605z M0.5317760705947876,0.3625321388244629 C0.5405619740486145,0.3735124468803406 0.5487139821052551,0.384893536567688 0.5561993718147278,0.39662957191467285 0.5627936720848083,0.40674877166748047 0.5688995122909546,0.41730791330337524 0.5732957124710083,0.4278671145439148 L0.551070511341095,0.4404062032699585 0.4829294681549072,0.47824329137802124 0.30463945865631104,0.5792155265808105 0.1959558129310608,0.640370786190033 0.14173611998558044,0.6705085635185242 C0.13235116004943848,0.675317645072937,0.12175974249839783,0.6778919100761414,0.11096274852752686,0.6779879927635193 C0.08286315202713013,0.6767981648445129,0.05947789549827576,0.6581392884254456,0.054777029901742935,0.6331580281257629 C0.05007615685462952,0.6081767678260803,0.06532919406890869,0.583619236946106,0.0914241373538971,0.5741559267044067 L0.10558965802192688,0.56733638048172 0.13733991980552673,0.5521575808525085 0.25139671564102173,0.4971618056297302 0.43701374530792236,0.4080686569213867 0.5088182091712952,0.3735312819480896 0.5317760705947876,0.3625321388244629z M0.1580997109413147,0 L0.17324218153953552,0 C0.1837441623210907,0,0.19424617290496826,0,0.20450395345687866,0 L0.22892725467681885,0.001539871096611023 0.25506019592285156,0.003959685564041138 C0.2677602767944336,0.005499586462974548 0.279483437538147,0.007039457559585571 0.29242783784866333,0.009239301085472107 0.29804515838623047,0.009239301085472107 0.3036625385284424,0.010999158024787903 0.30952417850494385,0.012099072337150574 L0.31294339895248413,0.012099072337150574 C0.321491539478302,0.013858944177627563 0.3297954797744751,0.015398815274238586 0.3373667001724243,0.017598658800125122 0.35522812604904175,0.02149401605129242 0.37283915281295776,0.02626737952232361 0.3901209831237793,0.031897544860839844 0.4018441438674927,0.03541727364063263 0.4130789041519165,0.03915698826313019 0.42431360483169556,0.0433366596698761 0.4323732852935791,0.04641643166542053 0.4406772255897522,0.049496203660964966 0.44873690605163574,0.05301591753959656 0.4567965865135193,0.05653566122055054 0.46290236711502075,0.05895546078681946 0.46974092721939087,0.06225523352622986 L0.47633522748947144,0.06511500477790833 C0.4831737279891968,0.06819474697113037 0.4900122880935669,0.07149451971054077 0.4963623285293579,0.07501423358917236 0.5027123689651489,0.07853397727012634 0.5119932889938354,0.08293363451957703 0.5207855701446533,0.08711332082748413 0.532753050327301,0.09393277764320374 0.5452088713645935,0.10075226426124573 0.5561993718147278,0.10911163687705994 L0.5598629117012024,0.11153143644332886 C0.5674340724945068,0.11637106537818909,0.575005292892456,0.12165066599845886,0.58257657289505,0.12693023681640625 L0.5852631330490112,0.12869009375572205 C0.5940554738044739,0.1348496377468109 0.6026036739349365,0.14144912362098694 0.6111517548561096,0.14826861023902893 0.6192114949226379,0.1544281542301178 0.6267826557159424,0.16080763936042786 0.6355750560760498,0.16762709617614746 0.6443674564361572,0.17444661259651184 0.6512059569358826,0.18126606941223145 0.6585330367088318,0.18852552771568298 0.6609752774238586,0.19072535634040833 0.6631733775138855,0.19314518570899963 0.6656156778335571,0.19556495547294617 0.6719657778739929,0.201944500207901 0.6783158183097839,0.20832398533821106 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21602341532707214 0.6858870983123779,0.21690335869789124 0.6927255392074585,0.22438275814056396 0.6993198394775391,0.23186218738555908 0.7056698799133301,0.23890167474746704 0.7120199799537659,0.2459411323070526 0.7191027402877808,0.2554003894329071 0.7256970405578613,0.26419970393180847 L0.7325356006622314,0.27387893199920654 C0.7376644611358643,0.28113842010498047 0.7427933216094971,0.2886178195476532 0.7476779222488403,0.29587724804878235 0.887993574142456,0.5147373676300049 0.8601140975952148,0.7894638180732727 0.6780716180801392,0.9817845821380615 0.6709265112876892,0.989209771156311 0.6617487668991089,0.9948219060897827 0.6514502167701721,0.998063325881958 L0.6431463360786438,0.9998232126235962 C0.6424370408058167,1.000058889389038 0.6416575908660889,1.000058889389038 0.6409482359886169,0.9998232126235962 0.6382670402526855,1.0000406503677368 0.6355696320533752,1.0000406503677368 0.6328884959220886,0.9998232126235962 C0.6096473932266235,1.0000758171081543,0.5884177088737488,0.9879860877990723,0.5787044167518616,0.9689667224884033 C0.5689911842346191,0.9499474763870239 0.5726134181022644,0.9275609254837036 0.5879496335983276,0.911829948425293 0.6916045546531677,0.8017895221710205 0.7362658977508545,0.6562486886978149 0.7100660800933838,0.5138804912567139 0.7100660800933838,0.5086009502410889 0.7081122398376465,0.5033213496208191 0.7068911194801331,0.4980417490005493 0.7056698799133301,0.49276214838027954 0.7044487595558167,0.48748254776000977 0.7029833793640137,0.4819830060005188 0.7015179395675659,0.47648340463638306 0.7002968192100525,0.47142380475997925 0.69858717918396,0.4661442041397095 0.6968775987625122,0.4608646035194397 0.6956563591957092,0.45624494552612305 0.6937025189399719,0.45118534564971924 0.6888028383255005,0.4367102384567261 0.6830968260765076,0.42246657609939575 0.6766061782836914,0.4085085988044739 0.6751407384872437,0.4045489430427551 0.6731869578361511,0.40102916955947876 0.6714773178100586,0.3972894549369812 0.6635856032371521,0.381019651889801 0.6546980738639832,0.3651564121246338 0.6448559165000916,0.349773108959198 0.6414366960525513,0.34493350982666016 0.638261616230011,0.3398738503456116 0.6350865960121155,0.3352542519569397 0.6289807558059692,0.32645493745803833 0.622630774974823,0.3180955648422241 0.6162806153297424,0.3097361922264099 0.6099306344985962,0.3013768196105957 0.600894033908844,0.2910376489162445 0.591857373714447,0.2820183336734772 L0.5801341533660889,0.2696993052959442 C0.5715860724449158,0.26089999079704285 0.5625494718551636,0.25254058837890625 0.5535128116607666,0.2446211874485016 0.5493572354316711,0.24065852165222168 0.5449538826942444,0.23691263794898987 0.5403242707252502,0.2334021031856537 L0.529333770275116,0.22460272908210754 C0.5064655542373657,0.20664280652999878 0.48195523023605347,0.19045335054397583 0.4560639262199402,0.17620646953582764 0.45191192626953125,0.17378664016723633 0.44727152585983276,0.171586811542511 0.44287532567977905,0.16938698291778564 0.43847912549972534,0.1671871840953827 0.43261754512786865,0.16410738229751587 0.42748862504959106,0.16168758273124695 L0.416253924369812,0.15662795305252075 C0.39798784255981445,0.14821934700012207,0.37914353609085083,0.14087164402008057,0.3598361015319824,0.13462966680526733 L0.3490898609161377,0.13132989406585693 0.3466475009918213,0.13132989406585693 C0.3337032198905945,0.1273702085018158,0.32051461935043335,0.1238504946231842,0.3068375587463379,0.12077072262763977 L0.3007317781448364,0.11945080757141113 C0.284625768661499,0.11583057045936584 0.26832127571105957,0.1129668653011322 0.25188517570495605,0.11087149381637573 0.2433369755744934,0.1095515787601471 0.23478883504867554,0.108671635389328 0.22746187448501587,0.10801169276237488 0.2201349139213562,0.10735175013542175 0.2079232633113861,0.10647183656692505 0.19815391302108765,0.10625183582305908 0.18838459253311157,0.1060318648815155 0.18227878212928772,0.10625183582305908 0.17373061180114746,0.10625183582305908 0.14096742868423462,0.10622519254684448 0.1082688570022583,0.10887587070465088 0.0760374665260315,0.11417123675346375 0.07254058122634888,0.11437812447547913 0.06903234124183655,0.11437812447547913 0.06553545594215393,0.11417123675346375 C0.03505754470825195,0.11396905779838562,0.00974804162979126,0.09292516112327576,0.007091343402862549,0.06557714939117432 C0.0044345855712890625,0.03822912275791168 0.02530190348625183,0.013545975089073181 0.05527767539024353,0.008579328656196594 0.08923646807670593,0.0032099932432174683 0.12362384796142578,0.00034074485301971436 0.1580997109413147,0z
+ 214
+ 5
+ 0.65
+ 0.7
+
+
+ 361
+ 10
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+
+ L.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis TKL keyboard-ANSI.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis TKL keyboard-ANSI.xml
new file mode 100644
index 000000000..fd0683ee6
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis TKL keyboard-ANSI.xml
@@ -0,0 +1,800 @@
+
+
+ Artemis tenkeyless keyboard layout
+ The default layout for tenkeyless keyboards
+ SpoinkyNL
+ Keyboard
+ Artemis
+ Artemis TKL keyboard
+ 360
+ 144
+
+
+ 7
+ 19
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+ 1
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.25
+
+
+
+
+
+
+
+ 7
+ +
+ 2.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.75
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+ 7
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+ 6.5
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+ 0
+ 1
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 9
+ 139
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ M0.8314498662948608,0.14738866686820984 L0.9718837738037109,0.14738866686820984 C0.9818984270095825,0.14737924933433533 0.9911608695983887,0.15217334032058716 0.9961943626403809,0.1599714159965515 1.0012279748916626,0.1677694320678711 1.0012708902359009,0.17739155888557434 0.9963071346282959,0.18522578477859497 L0.9271892309188843,0.2952173352241516 C0.9220999479293823,0.303014874458313,0.9128080606460571,0.30780303478240967,0.9027659893035889,0.30780303478240967 C0.892723798751831,0.30780303478240967,0.8834319114685059,0.303014874458313,0.8783426284790039,0.2952173352241516 L0.8644212484359741,0.2732190191745758 0.8512327671051025,0.2802584767341614 C0.8458596467971802,0.2705792188644409 0.8399980068206787,0.26089999079704285 0.8338921070098877,0.25144070386886597 0.8277863264083862,0.2419814169406891 0.8177727460861206,0.22724255919456482 0.8094688653945923,0.2155834138393402 L0.8224133253097534,0.20898395776748657 0.8070266246795654,0.18566575646400452 C0.8019757270812988,0.17778605222702026,0.8019649982452393,0.16808003187179565,0.8069984912872314,0.16019132733345032 C0.8120319843292236,0.15230253338813782,0.8213481903076172,0.1474246382713318,0.8314498662948608,0.14738866686820984z M0.10265883803367615,0.2802584767341614 C0.11096274852752686,0.2850980758666992 0.11951091885566711,0.28993773460388184 0.12708213925361633,0.2943373918533325 0.14149188995361328,0.3020368218421936 0.15663433074951172,0.3090762495994568 0.1715325117111206,0.31633567810058594 0.21944981813430786,0.33654189109802246 0.2699943780899048,0.35124915838241577 0.32197999954223633,0.3601123094558716 L0.20377129316329956,0.4168679714202881 0.1908269226551056,0.42302751541137695 C0.14440736174583435,0.4102410674095154 0.09916770458221436,0.3942067623138428 0.05552190542221069,0.3750711679458618 -0.05462715029716492,0.3422936797142029 0.01937541365623474,0.22108301520347595 0.10265883803367615,0.2802584767341614z M0.4714505672454834,0.5930745005607605 C0.46778708696365356,0.602533757686615 0.4646120071411133,0.6119930148124695 0.4614369869232178,0.6214522123336792 0.4521523118019104,0.6509119868278503 0.4455362558364868,0.6810019016265869 0.44165414571762085,0.7114253044128418 0.4388039708137512,0.7340653538703918 0.4374176263809204,0.7568352818489075 0.4375022053718567,0.7796201109886169 0.4375022053718567,0.7877594828605652 0.4375022053718567,0.7961188554763794 0.4375022053718567,0.8042582273483276 C0.444272518157959,0.8297898769378662,0.42963647842407227,0.8560013771057129,0.40284329652786255,0.8663284778594971 C0.37605005502700806,0.8766556978225708 0.3448934555053711,0.8680944442749023 0.3290627598762512,0.8460550308227539 0.31538575887680054,0.8240567445755005 0.32368963956832886,0.8020584583282471 0.3246665596961975,0.7783002257347107 0.32564353942871094,0.7545420527458191 0.3297954797744751,0.7343035936355591 0.33419162034988403,0.7123052477836609 0.33712244033813477,0.6960265636444092 0.3407859206199646,0.6799677610397339 0.344693660736084,0.6639089584350586 L0.35763800144195557,0.6566495895385742 0.44629454612731934,0.6069333553314209 0.4714505672454834,0.5930745005607605z M0.5317760705947876,0.3625321388244629 C0.5405619740486145,0.3735124468803406 0.5487139821052551,0.384893536567688 0.5561993718147278,0.39662957191467285 0.5627936720848083,0.40674877166748047 0.5688995122909546,0.41730791330337524 0.5732957124710083,0.4278671145439148 L0.551070511341095,0.4404062032699585 0.4829294681549072,0.47824329137802124 0.30463945865631104,0.5792155265808105 0.1959558129310608,0.640370786190033 0.14173611998558044,0.6705085635185242 C0.13235116004943848,0.675317645072937,0.12175974249839783,0.6778919100761414,0.11096274852752686,0.6779879927635193 C0.08286315202713013,0.6767981648445129,0.05947789549827576,0.6581392884254456,0.054777029901742935,0.6331580281257629 C0.05007615685462952,0.6081767678260803,0.06532919406890869,0.583619236946106,0.0914241373538971,0.5741559267044067 L0.10558965802192688,0.56733638048172 0.13733991980552673,0.5521575808525085 0.25139671564102173,0.4971618056297302 0.43701374530792236,0.4080686569213867 0.5088182091712952,0.3735312819480896 0.5317760705947876,0.3625321388244629z M0.1580997109413147,0 L0.17324218153953552,0 C0.1837441623210907,0,0.19424617290496826,0,0.20450395345687866,0 L0.22892725467681885,0.001539871096611023 0.25506019592285156,0.003959685564041138 C0.2677602767944336,0.005499586462974548 0.279483437538147,0.007039457559585571 0.29242783784866333,0.009239301085472107 0.29804515838623047,0.009239301085472107 0.3036625385284424,0.010999158024787903 0.30952417850494385,0.012099072337150574 L0.31294339895248413,0.012099072337150574 C0.321491539478302,0.013858944177627563 0.3297954797744751,0.015398815274238586 0.3373667001724243,0.017598658800125122 0.35522812604904175,0.02149401605129242 0.37283915281295776,0.02626737952232361 0.3901209831237793,0.031897544860839844 0.4018441438674927,0.03541727364063263 0.4130789041519165,0.03915698826313019 0.42431360483169556,0.0433366596698761 0.4323732852935791,0.04641643166542053 0.4406772255897522,0.049496203660964966 0.44873690605163574,0.05301591753959656 0.4567965865135193,0.05653566122055054 0.46290236711502075,0.05895546078681946 0.46974092721939087,0.06225523352622986 L0.47633522748947144,0.06511500477790833 C0.4831737279891968,0.06819474697113037 0.4900122880935669,0.07149451971054077 0.4963623285293579,0.07501423358917236 0.5027123689651489,0.07853397727012634 0.5119932889938354,0.08293363451957703 0.5207855701446533,0.08711332082748413 0.532753050327301,0.09393277764320374 0.5452088713645935,0.10075226426124573 0.5561993718147278,0.10911163687705994 L0.5598629117012024,0.11153143644332886 C0.5674340724945068,0.11637106537818909,0.575005292892456,0.12165066599845886,0.58257657289505,0.12693023681640625 L0.5852631330490112,0.12869009375572205 C0.5940554738044739,0.1348496377468109 0.6026036739349365,0.14144912362098694 0.6111517548561096,0.14826861023902893 0.6192114949226379,0.1544281542301178 0.6267826557159424,0.16080763936042786 0.6355750560760498,0.16762709617614746 0.6443674564361572,0.17444661259651184 0.6512059569358826,0.18126606941223145 0.6585330367088318,0.18852552771568298 0.6609752774238586,0.19072535634040833 0.6631733775138855,0.19314518570899963 0.6656156778335571,0.19556495547294617 0.6719657778739929,0.201944500207901 0.6783158183097839,0.20832398533821106 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21602341532707214 0.6858870983123779,0.21690335869789124 0.6927255392074585,0.22438275814056396 0.6993198394775391,0.23186218738555908 0.7056698799133301,0.23890167474746704 0.7120199799537659,0.2459411323070526 0.7191027402877808,0.2554003894329071 0.7256970405578613,0.26419970393180847 L0.7325356006622314,0.27387893199920654 C0.7376644611358643,0.28113842010498047 0.7427933216094971,0.2886178195476532 0.7476779222488403,0.29587724804878235 0.887993574142456,0.5147373676300049 0.8601140975952148,0.7894638180732727 0.6780716180801392,0.9817845821380615 0.6709265112876892,0.989209771156311 0.6617487668991089,0.9948219060897827 0.6514502167701721,0.998063325881958 L0.6431463360786438,0.9998232126235962 C0.6424370408058167,1.000058889389038 0.6416575908660889,1.000058889389038 0.6409482359886169,0.9998232126235962 0.6382670402526855,1.0000406503677368 0.6355696320533752,1.0000406503677368 0.6328884959220886,0.9998232126235962 C0.6096473932266235,1.0000758171081543,0.5884177088737488,0.9879860877990723,0.5787044167518616,0.9689667224884033 C0.5689911842346191,0.9499474763870239 0.5726134181022644,0.9275609254837036 0.5879496335983276,0.911829948425293 0.6916045546531677,0.8017895221710205 0.7362658977508545,0.6562486886978149 0.7100660800933838,0.5138804912567139 0.7100660800933838,0.5086009502410889 0.7081122398376465,0.5033213496208191 0.7068911194801331,0.4980417490005493 0.7056698799133301,0.49276214838027954 0.7044487595558167,0.48748254776000977 0.7029833793640137,0.4819830060005188 0.7015179395675659,0.47648340463638306 0.7002968192100525,0.47142380475997925 0.69858717918396,0.4661442041397095 0.6968775987625122,0.4608646035194397 0.6956563591957092,0.45624494552612305 0.6937025189399719,0.45118534564971924 0.6888028383255005,0.4367102384567261 0.6830968260765076,0.42246657609939575 0.6766061782836914,0.4085085988044739 0.6751407384872437,0.4045489430427551 0.6731869578361511,0.40102916955947876 0.6714773178100586,0.3972894549369812 0.6635856032371521,0.381019651889801 0.6546980738639832,0.3651564121246338 0.6448559165000916,0.349773108959198 0.6414366960525513,0.34493350982666016 0.638261616230011,0.3398738503456116 0.6350865960121155,0.3352542519569397 0.6289807558059692,0.32645493745803833 0.622630774974823,0.3180955648422241 0.6162806153297424,0.3097361922264099 0.6099306344985962,0.3013768196105957 0.600894033908844,0.2910376489162445 0.591857373714447,0.2820183336734772 L0.5801341533660889,0.2696993052959442 C0.5715860724449158,0.26089999079704285 0.5625494718551636,0.25254058837890625 0.5535128116607666,0.2446211874485016 0.5493572354316711,0.24065852165222168 0.5449538826942444,0.23691263794898987 0.5403242707252502,0.2334021031856537 L0.529333770275116,0.22460272908210754 C0.5064655542373657,0.20664280652999878 0.48195523023605347,0.19045335054397583 0.4560639262199402,0.17620646953582764 0.45191192626953125,0.17378664016723633 0.44727152585983276,0.171586811542511 0.44287532567977905,0.16938698291778564 0.43847912549972534,0.1671871840953827 0.43261754512786865,0.16410738229751587 0.42748862504959106,0.16168758273124695 L0.416253924369812,0.15662795305252075 C0.39798784255981445,0.14821934700012207,0.37914353609085083,0.14087164402008057,0.3598361015319824,0.13462966680526733 L0.3490898609161377,0.13132989406585693 0.3466475009918213,0.13132989406585693 C0.3337032198905945,0.1273702085018158,0.32051461935043335,0.1238504946231842,0.3068375587463379,0.12077072262763977 L0.3007317781448364,0.11945080757141113 C0.284625768661499,0.11583057045936584 0.26832127571105957,0.1129668653011322 0.25188517570495605,0.11087149381637573 0.2433369755744934,0.1095515787601471 0.23478883504867554,0.108671635389328 0.22746187448501587,0.10801169276237488 0.2201349139213562,0.10735175013542175 0.2079232633113861,0.10647183656692505 0.19815391302108765,0.10625183582305908 0.18838459253311157,0.1060318648815155 0.18227878212928772,0.10625183582305908 0.17373061180114746,0.10625183582305908 0.14096742868423462,0.10622519254684448 0.1082688570022583,0.10887587070465088 0.0760374665260315,0.11417123675346375 0.07254058122634888,0.11437812447547913 0.06903234124183655,0.11437812447547913 0.06553545594215393,0.11417123675346375 C0.03505754470825195,0.11396905779838562,0.00974804162979126,0.09292516112327576,0.007091343402862549,0.06557714939117432 C0.0044345855712890625,0.03822912275791168 0.02530190348625183,0.013545975089073181 0.05527767539024353,0.008579328656196594 0.08923646807670593,0.0032099932432174683 0.12362384796142578,0.00034074485301971436 0.1580997109413147,0z
+ 174
+ 5
+ 0.65
+ 0.7
+
+
+ 221
+ 7
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+
+ TKL.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis TKL keyboard-ISO.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis TKL keyboard-ISO.xml
new file mode 100644
index 000000000..ef4f1d732
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis TKL keyboard-ISO.xml
@@ -0,0 +1,808 @@
+
+
+ Artemis tenkeyless keyboard layout
+ The default layout for tenkeyless keyboards
+ SpoinkyNL
+ Keyboard
+ Artemis
+ Artemis TKL keyboard
+ 360
+ 144
+
+
+ 7
+ 19
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ M0,0 L0,0.5 L0.16666666666,0.5 L0.16666666666,1 L1,1 L1,0 Z
+ 1.5
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ +
+ 1.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+ 7
+ +
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.75
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+ 7
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+ 6.5
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+ 0
+ 1
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 9
+ 139
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ M0.8314498662948608,0.14738866686820984 L0.9718837738037109,0.14738866686820984 C0.9818984270095825,0.14737924933433533 0.9911608695983887,0.15217334032058716 0.9961943626403809,0.1599714159965515 1.0012279748916626,0.1677694320678711 1.0012708902359009,0.17739155888557434 0.9963071346282959,0.18522578477859497 L0.9271892309188843,0.2952173352241516 C0.9220999479293823,0.303014874458313,0.9128080606460571,0.30780303478240967,0.9027659893035889,0.30780303478240967 C0.892723798751831,0.30780303478240967,0.8834319114685059,0.303014874458313,0.8783426284790039,0.2952173352241516 L0.8644212484359741,0.2732190191745758 0.8512327671051025,0.2802584767341614 C0.8458596467971802,0.2705792188644409 0.8399980068206787,0.26089999079704285 0.8338921070098877,0.25144070386886597 0.8277863264083862,0.2419814169406891 0.8177727460861206,0.22724255919456482 0.8094688653945923,0.2155834138393402 L0.8224133253097534,0.20898395776748657 0.8070266246795654,0.18566575646400452 C0.8019757270812988,0.17778605222702026,0.8019649982452393,0.16808003187179565,0.8069984912872314,0.16019132733345032 C0.8120319843292236,0.15230253338813782,0.8213481903076172,0.1474246382713318,0.8314498662948608,0.14738866686820984z M0.10265883803367615,0.2802584767341614 C0.11096274852752686,0.2850980758666992 0.11951091885566711,0.28993773460388184 0.12708213925361633,0.2943373918533325 0.14149188995361328,0.3020368218421936 0.15663433074951172,0.3090762495994568 0.1715325117111206,0.31633567810058594 0.21944981813430786,0.33654189109802246 0.2699943780899048,0.35124915838241577 0.32197999954223633,0.3601123094558716 L0.20377129316329956,0.4168679714202881 0.1908269226551056,0.42302751541137695 C0.14440736174583435,0.4102410674095154 0.09916770458221436,0.3942067623138428 0.05552190542221069,0.3750711679458618 -0.05462715029716492,0.3422936797142029 0.01937541365623474,0.22108301520347595 0.10265883803367615,0.2802584767341614z M0.4714505672454834,0.5930745005607605 C0.46778708696365356,0.602533757686615 0.4646120071411133,0.6119930148124695 0.4614369869232178,0.6214522123336792 0.4521523118019104,0.6509119868278503 0.4455362558364868,0.6810019016265869 0.44165414571762085,0.7114253044128418 0.4388039708137512,0.7340653538703918 0.4374176263809204,0.7568352818489075 0.4375022053718567,0.7796201109886169 0.4375022053718567,0.7877594828605652 0.4375022053718567,0.7961188554763794 0.4375022053718567,0.8042582273483276 C0.444272518157959,0.8297898769378662,0.42963647842407227,0.8560013771057129,0.40284329652786255,0.8663284778594971 C0.37605005502700806,0.8766556978225708 0.3448934555053711,0.8680944442749023 0.3290627598762512,0.8460550308227539 0.31538575887680054,0.8240567445755005 0.32368963956832886,0.8020584583282471 0.3246665596961975,0.7783002257347107 0.32564353942871094,0.7545420527458191 0.3297954797744751,0.7343035936355591 0.33419162034988403,0.7123052477836609 0.33712244033813477,0.6960265636444092 0.3407859206199646,0.6799677610397339 0.344693660736084,0.6639089584350586 L0.35763800144195557,0.6566495895385742 0.44629454612731934,0.6069333553314209 0.4714505672454834,0.5930745005607605z M0.5317760705947876,0.3625321388244629 C0.5405619740486145,0.3735124468803406 0.5487139821052551,0.384893536567688 0.5561993718147278,0.39662957191467285 0.5627936720848083,0.40674877166748047 0.5688995122909546,0.41730791330337524 0.5732957124710083,0.4278671145439148 L0.551070511341095,0.4404062032699585 0.4829294681549072,0.47824329137802124 0.30463945865631104,0.5792155265808105 0.1959558129310608,0.640370786190033 0.14173611998558044,0.6705085635185242 C0.13235116004943848,0.675317645072937,0.12175974249839783,0.6778919100761414,0.11096274852752686,0.6779879927635193 C0.08286315202713013,0.6767981648445129,0.05947789549827576,0.6581392884254456,0.054777029901742935,0.6331580281257629 C0.05007615685462952,0.6081767678260803,0.06532919406890869,0.583619236946106,0.0914241373538971,0.5741559267044067 L0.10558965802192688,0.56733638048172 0.13733991980552673,0.5521575808525085 0.25139671564102173,0.4971618056297302 0.43701374530792236,0.4080686569213867 0.5088182091712952,0.3735312819480896 0.5317760705947876,0.3625321388244629z M0.1580997109413147,0 L0.17324218153953552,0 C0.1837441623210907,0,0.19424617290496826,0,0.20450395345687866,0 L0.22892725467681885,0.001539871096611023 0.25506019592285156,0.003959685564041138 C0.2677602767944336,0.005499586462974548 0.279483437538147,0.007039457559585571 0.29242783784866333,0.009239301085472107 0.29804515838623047,0.009239301085472107 0.3036625385284424,0.010999158024787903 0.30952417850494385,0.012099072337150574 L0.31294339895248413,0.012099072337150574 C0.321491539478302,0.013858944177627563 0.3297954797744751,0.015398815274238586 0.3373667001724243,0.017598658800125122 0.35522812604904175,0.02149401605129242 0.37283915281295776,0.02626737952232361 0.3901209831237793,0.031897544860839844 0.4018441438674927,0.03541727364063263 0.4130789041519165,0.03915698826313019 0.42431360483169556,0.0433366596698761 0.4323732852935791,0.04641643166542053 0.4406772255897522,0.049496203660964966 0.44873690605163574,0.05301591753959656 0.4567965865135193,0.05653566122055054 0.46290236711502075,0.05895546078681946 0.46974092721939087,0.06225523352622986 L0.47633522748947144,0.06511500477790833 C0.4831737279891968,0.06819474697113037 0.4900122880935669,0.07149451971054077 0.4963623285293579,0.07501423358917236 0.5027123689651489,0.07853397727012634 0.5119932889938354,0.08293363451957703 0.5207855701446533,0.08711332082748413 0.532753050327301,0.09393277764320374 0.5452088713645935,0.10075226426124573 0.5561993718147278,0.10911163687705994 L0.5598629117012024,0.11153143644332886 C0.5674340724945068,0.11637106537818909,0.575005292892456,0.12165066599845886,0.58257657289505,0.12693023681640625 L0.5852631330490112,0.12869009375572205 C0.5940554738044739,0.1348496377468109 0.6026036739349365,0.14144912362098694 0.6111517548561096,0.14826861023902893 0.6192114949226379,0.1544281542301178 0.6267826557159424,0.16080763936042786 0.6355750560760498,0.16762709617614746 0.6443674564361572,0.17444661259651184 0.6512059569358826,0.18126606941223145 0.6585330367088318,0.18852552771568298 0.6609752774238586,0.19072535634040833 0.6631733775138855,0.19314518570899963 0.6656156778335571,0.19556495547294617 0.6719657778739929,0.201944500207901 0.6783158183097839,0.20832398533821106 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21602341532707214 0.6858870983123779,0.21690335869789124 0.6927255392074585,0.22438275814056396 0.6993198394775391,0.23186218738555908 0.7056698799133301,0.23890167474746704 0.7120199799537659,0.2459411323070526 0.7191027402877808,0.2554003894329071 0.7256970405578613,0.26419970393180847 L0.7325356006622314,0.27387893199920654 C0.7376644611358643,0.28113842010498047 0.7427933216094971,0.2886178195476532 0.7476779222488403,0.29587724804878235 0.887993574142456,0.5147373676300049 0.8601140975952148,0.7894638180732727 0.6780716180801392,0.9817845821380615 0.6709265112876892,0.989209771156311 0.6617487668991089,0.9948219060897827 0.6514502167701721,0.998063325881958 L0.6431463360786438,0.9998232126235962 C0.6424370408058167,1.000058889389038 0.6416575908660889,1.000058889389038 0.6409482359886169,0.9998232126235962 0.6382670402526855,1.0000406503677368 0.6355696320533752,1.0000406503677368 0.6328884959220886,0.9998232126235962 C0.6096473932266235,1.0000758171081543,0.5884177088737488,0.9879860877990723,0.5787044167518616,0.9689667224884033 C0.5689911842346191,0.9499474763870239 0.5726134181022644,0.9275609254837036 0.5879496335983276,0.911829948425293 0.6916045546531677,0.8017895221710205 0.7362658977508545,0.6562486886978149 0.7100660800933838,0.5138804912567139 0.7100660800933838,0.5086009502410889 0.7081122398376465,0.5033213496208191 0.7068911194801331,0.4980417490005493 0.7056698799133301,0.49276214838027954 0.7044487595558167,0.48748254776000977 0.7029833793640137,0.4819830060005188 0.7015179395675659,0.47648340463638306 0.7002968192100525,0.47142380475997925 0.69858717918396,0.4661442041397095 0.6968775987625122,0.4608646035194397 0.6956563591957092,0.45624494552612305 0.6937025189399719,0.45118534564971924 0.6888028383255005,0.4367102384567261 0.6830968260765076,0.42246657609939575 0.6766061782836914,0.4085085988044739 0.6751407384872437,0.4045489430427551 0.6731869578361511,0.40102916955947876 0.6714773178100586,0.3972894549369812 0.6635856032371521,0.381019651889801 0.6546980738639832,0.3651564121246338 0.6448559165000916,0.349773108959198 0.6414366960525513,0.34493350982666016 0.638261616230011,0.3398738503456116 0.6350865960121155,0.3352542519569397 0.6289807558059692,0.32645493745803833 0.622630774974823,0.3180955648422241 0.6162806153297424,0.3097361922264099 0.6099306344985962,0.3013768196105957 0.600894033908844,0.2910376489162445 0.591857373714447,0.2820183336734772 L0.5801341533660889,0.2696993052959442 C0.5715860724449158,0.26089999079704285 0.5625494718551636,0.25254058837890625 0.5535128116607666,0.2446211874485016 0.5493572354316711,0.24065852165222168 0.5449538826942444,0.23691263794898987 0.5403242707252502,0.2334021031856537 L0.529333770275116,0.22460272908210754 C0.5064655542373657,0.20664280652999878 0.48195523023605347,0.19045335054397583 0.4560639262199402,0.17620646953582764 0.45191192626953125,0.17378664016723633 0.44727152585983276,0.171586811542511 0.44287532567977905,0.16938698291778564 0.43847912549972534,0.1671871840953827 0.43261754512786865,0.16410738229751587 0.42748862504959106,0.16168758273124695 L0.416253924369812,0.15662795305252075 C0.39798784255981445,0.14821934700012207,0.37914353609085083,0.14087164402008057,0.3598361015319824,0.13462966680526733 L0.3490898609161377,0.13132989406585693 0.3466475009918213,0.13132989406585693 C0.3337032198905945,0.1273702085018158,0.32051461935043335,0.1238504946231842,0.3068375587463379,0.12077072262763977 L0.3007317781448364,0.11945080757141113 C0.284625768661499,0.11583057045936584 0.26832127571105957,0.1129668653011322 0.25188517570495605,0.11087149381637573 0.2433369755744934,0.1095515787601471 0.23478883504867554,0.108671635389328 0.22746187448501587,0.10801169276237488 0.2201349139213562,0.10735175013542175 0.2079232633113861,0.10647183656692505 0.19815391302108765,0.10625183582305908 0.18838459253311157,0.1060318648815155 0.18227878212928772,0.10625183582305908 0.17373061180114746,0.10625183582305908 0.14096742868423462,0.10622519254684448 0.1082688570022583,0.10887587070465088 0.0760374665260315,0.11417123675346375 0.07254058122634888,0.11437812447547913 0.06903234124183655,0.11437812447547913 0.06553545594215393,0.11417123675346375 C0.03505754470825195,0.11396905779838562,0.00974804162979126,0.09292516112327576,0.007091343402862549,0.06557714939117432 C0.0044345855712890625,0.03822912275791168 0.02530190348625183,0.013545975089073181 0.05527767539024353,0.008579328656196594 0.08923646807670593,0.0032099932432174683 0.12362384796142578,0.00034074485301971436 0.1580997109413147,0z
+ 174
+ 5
+ 0.65
+ 0.7
+
+
+ 221
+ 7
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+
+ TKL.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis XL keyboard-ANSI.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis XL keyboard-ANSI.xml
new file mode 100644
index 000000000..21e0f8bfb
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis XL keyboard-ANSI.xml
@@ -0,0 +1,1016 @@
+
+
+ Artemis XL keyboard layout
+ The default layout for keyboards with programmable keys
+ SpoinkyNL
+ Keyboard
+ Artemis
+ Artemis XL keyboard
+ 464
+ 144
+
+
+ 30
+ 16
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+ 1
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 30
+ ~
+ 1.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.25
+
+
+
+
+
+
+
+ +67
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ +
+ 2.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.75
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 30
+ ~
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+ 6.5
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ 16
+
+
+
+
+
+
+
+ 7
+ +
+
+
+
+
+
+
+
+ 7
+ +2
+
+
+
+
+
+
+
+ 7
+ +
+
+
+
+
+
+
+
+ 7
+ +2
+
+
+
+
+
+
+
+ 7
+ +
+
+
+
+
+
+
+
+ 5
+ 0
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 5
+ 139
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ M0.8314498662948608,0.14738866686820984 L0.9718837738037109,0.14738866686820984 C0.9818984270095825,0.14737924933433533 0.9911608695983887,0.15217334032058716 0.9961943626403809,0.1599714159965515 1.0012279748916626,0.1677694320678711 1.0012708902359009,0.17739155888557434 0.9963071346282959,0.18522578477859497 L0.9271892309188843,0.2952173352241516 C0.9220999479293823,0.303014874458313,0.9128080606460571,0.30780303478240967,0.9027659893035889,0.30780303478240967 C0.892723798751831,0.30780303478240967,0.8834319114685059,0.303014874458313,0.8783426284790039,0.2952173352241516 L0.8644212484359741,0.2732190191745758 0.8512327671051025,0.2802584767341614 C0.8458596467971802,0.2705792188644409 0.8399980068206787,0.26089999079704285 0.8338921070098877,0.25144070386886597 0.8277863264083862,0.2419814169406891 0.8177727460861206,0.22724255919456482 0.8094688653945923,0.2155834138393402 L0.8224133253097534,0.20898395776748657 0.8070266246795654,0.18566575646400452 C0.8019757270812988,0.17778605222702026,0.8019649982452393,0.16808003187179565,0.8069984912872314,0.16019132733345032 C0.8120319843292236,0.15230253338813782,0.8213481903076172,0.1474246382713318,0.8314498662948608,0.14738866686820984z M0.10265883803367615,0.2802584767341614 C0.11096274852752686,0.2850980758666992 0.11951091885566711,0.28993773460388184 0.12708213925361633,0.2943373918533325 0.14149188995361328,0.3020368218421936 0.15663433074951172,0.3090762495994568 0.1715325117111206,0.31633567810058594 0.21944981813430786,0.33654189109802246 0.2699943780899048,0.35124915838241577 0.32197999954223633,0.3601123094558716 L0.20377129316329956,0.4168679714202881 0.1908269226551056,0.42302751541137695 C0.14440736174583435,0.4102410674095154 0.09916770458221436,0.3942067623138428 0.05552190542221069,0.3750711679458618 -0.05462715029716492,0.3422936797142029 0.01937541365623474,0.22108301520347595 0.10265883803367615,0.2802584767341614z M0.4714505672454834,0.5930745005607605 C0.46778708696365356,0.602533757686615 0.4646120071411133,0.6119930148124695 0.4614369869232178,0.6214522123336792 0.4521523118019104,0.6509119868278503 0.4455362558364868,0.6810019016265869 0.44165414571762085,0.7114253044128418 0.4388039708137512,0.7340653538703918 0.4374176263809204,0.7568352818489075 0.4375022053718567,0.7796201109886169 0.4375022053718567,0.7877594828605652 0.4375022053718567,0.7961188554763794 0.4375022053718567,0.8042582273483276 C0.444272518157959,0.8297898769378662,0.42963647842407227,0.8560013771057129,0.40284329652786255,0.8663284778594971 C0.37605005502700806,0.8766556978225708 0.3448934555053711,0.8680944442749023 0.3290627598762512,0.8460550308227539 0.31538575887680054,0.8240567445755005 0.32368963956832886,0.8020584583282471 0.3246665596961975,0.7783002257347107 0.32564353942871094,0.7545420527458191 0.3297954797744751,0.7343035936355591 0.33419162034988403,0.7123052477836609 0.33712244033813477,0.6960265636444092 0.3407859206199646,0.6799677610397339 0.344693660736084,0.6639089584350586 L0.35763800144195557,0.6566495895385742 0.44629454612731934,0.6069333553314209 0.4714505672454834,0.5930745005607605z M0.5317760705947876,0.3625321388244629 C0.5405619740486145,0.3735124468803406 0.5487139821052551,0.384893536567688 0.5561993718147278,0.39662957191467285 0.5627936720848083,0.40674877166748047 0.5688995122909546,0.41730791330337524 0.5732957124710083,0.4278671145439148 L0.551070511341095,0.4404062032699585 0.4829294681549072,0.47824329137802124 0.30463945865631104,0.5792155265808105 0.1959558129310608,0.640370786190033 0.14173611998558044,0.6705085635185242 C0.13235116004943848,0.675317645072937,0.12175974249839783,0.6778919100761414,0.11096274852752686,0.6779879927635193 C0.08286315202713013,0.6767981648445129,0.05947789549827576,0.6581392884254456,0.054777029901742935,0.6331580281257629 C0.05007615685462952,0.6081767678260803,0.06532919406890869,0.583619236946106,0.0914241373538971,0.5741559267044067 L0.10558965802192688,0.56733638048172 0.13733991980552673,0.5521575808525085 0.25139671564102173,0.4971618056297302 0.43701374530792236,0.4080686569213867 0.5088182091712952,0.3735312819480896 0.5317760705947876,0.3625321388244629z M0.1580997109413147,0 L0.17324218153953552,0 C0.1837441623210907,0,0.19424617290496826,0,0.20450395345687866,0 L0.22892725467681885,0.001539871096611023 0.25506019592285156,0.003959685564041138 C0.2677602767944336,0.005499586462974548 0.279483437538147,0.007039457559585571 0.29242783784866333,0.009239301085472107 0.29804515838623047,0.009239301085472107 0.3036625385284424,0.010999158024787903 0.30952417850494385,0.012099072337150574 L0.31294339895248413,0.012099072337150574 C0.321491539478302,0.013858944177627563 0.3297954797744751,0.015398815274238586 0.3373667001724243,0.017598658800125122 0.35522812604904175,0.02149401605129242 0.37283915281295776,0.02626737952232361 0.3901209831237793,0.031897544860839844 0.4018441438674927,0.03541727364063263 0.4130789041519165,0.03915698826313019 0.42431360483169556,0.0433366596698761 0.4323732852935791,0.04641643166542053 0.4406772255897522,0.049496203660964966 0.44873690605163574,0.05301591753959656 0.4567965865135193,0.05653566122055054 0.46290236711502075,0.05895546078681946 0.46974092721939087,0.06225523352622986 L0.47633522748947144,0.06511500477790833 C0.4831737279891968,0.06819474697113037 0.4900122880935669,0.07149451971054077 0.4963623285293579,0.07501423358917236 0.5027123689651489,0.07853397727012634 0.5119932889938354,0.08293363451957703 0.5207855701446533,0.08711332082748413 0.532753050327301,0.09393277764320374 0.5452088713645935,0.10075226426124573 0.5561993718147278,0.10911163687705994 L0.5598629117012024,0.11153143644332886 C0.5674340724945068,0.11637106537818909,0.575005292892456,0.12165066599845886,0.58257657289505,0.12693023681640625 L0.5852631330490112,0.12869009375572205 C0.5940554738044739,0.1348496377468109 0.6026036739349365,0.14144912362098694 0.6111517548561096,0.14826861023902893 0.6192114949226379,0.1544281542301178 0.6267826557159424,0.16080763936042786 0.6355750560760498,0.16762709617614746 0.6443674564361572,0.17444661259651184 0.6512059569358826,0.18126606941223145 0.6585330367088318,0.18852552771568298 0.6609752774238586,0.19072535634040833 0.6631733775138855,0.19314518570899963 0.6656156778335571,0.19556495547294617 0.6719657778739929,0.201944500207901 0.6783158183097839,0.20832398533821106 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21602341532707214 0.6858870983123779,0.21690335869789124 0.6927255392074585,0.22438275814056396 0.6993198394775391,0.23186218738555908 0.7056698799133301,0.23890167474746704 0.7120199799537659,0.2459411323070526 0.7191027402877808,0.2554003894329071 0.7256970405578613,0.26419970393180847 L0.7325356006622314,0.27387893199920654 C0.7376644611358643,0.28113842010498047 0.7427933216094971,0.2886178195476532 0.7476779222488403,0.29587724804878235 0.887993574142456,0.5147373676300049 0.8601140975952148,0.7894638180732727 0.6780716180801392,0.9817845821380615 0.6709265112876892,0.989209771156311 0.6617487668991089,0.9948219060897827 0.6514502167701721,0.998063325881958 L0.6431463360786438,0.9998232126235962 C0.6424370408058167,1.000058889389038 0.6416575908660889,1.000058889389038 0.6409482359886169,0.9998232126235962 0.6382670402526855,1.0000406503677368 0.6355696320533752,1.0000406503677368 0.6328884959220886,0.9998232126235962 C0.6096473932266235,1.0000758171081543,0.5884177088737488,0.9879860877990723,0.5787044167518616,0.9689667224884033 C0.5689911842346191,0.9499474763870239 0.5726134181022644,0.9275609254837036 0.5879496335983276,0.911829948425293 0.6916045546531677,0.8017895221710205 0.7362658977508545,0.6562486886978149 0.7100660800933838,0.5138804912567139 0.7100660800933838,0.5086009502410889 0.7081122398376465,0.5033213496208191 0.7068911194801331,0.4980417490005493 0.7056698799133301,0.49276214838027954 0.7044487595558167,0.48748254776000977 0.7029833793640137,0.4819830060005188 0.7015179395675659,0.47648340463638306 0.7002968192100525,0.47142380475997925 0.69858717918396,0.4661442041397095 0.6968775987625122,0.4608646035194397 0.6956563591957092,0.45624494552612305 0.6937025189399719,0.45118534564971924 0.6888028383255005,0.4367102384567261 0.6830968260765076,0.42246657609939575 0.6766061782836914,0.4085085988044739 0.6751407384872437,0.4045489430427551 0.6731869578361511,0.40102916955947876 0.6714773178100586,0.3972894549369812 0.6635856032371521,0.381019651889801 0.6546980738639832,0.3651564121246338 0.6448559165000916,0.349773108959198 0.6414366960525513,0.34493350982666016 0.638261616230011,0.3398738503456116 0.6350865960121155,0.3352542519569397 0.6289807558059692,0.32645493745803833 0.622630774974823,0.3180955648422241 0.6162806153297424,0.3097361922264099 0.6099306344985962,0.3013768196105957 0.600894033908844,0.2910376489162445 0.591857373714447,0.2820183336734772 L0.5801341533660889,0.2696993052959442 C0.5715860724449158,0.26089999079704285 0.5625494718551636,0.25254058837890625 0.5535128116607666,0.2446211874485016 0.5493572354316711,0.24065852165222168 0.5449538826942444,0.23691263794898987 0.5403242707252502,0.2334021031856537 L0.529333770275116,0.22460272908210754 C0.5064655542373657,0.20664280652999878 0.48195523023605347,0.19045335054397583 0.4560639262199402,0.17620646953582764 0.45191192626953125,0.17378664016723633 0.44727152585983276,0.171586811542511 0.44287532567977905,0.16938698291778564 0.43847912549972534,0.1671871840953827 0.43261754512786865,0.16410738229751587 0.42748862504959106,0.16168758273124695 L0.416253924369812,0.15662795305252075 C0.39798784255981445,0.14821934700012207,0.37914353609085083,0.14087164402008057,0.3598361015319824,0.13462966680526733 L0.3490898609161377,0.13132989406585693 0.3466475009918213,0.13132989406585693 C0.3337032198905945,0.1273702085018158,0.32051461935043335,0.1238504946231842,0.3068375587463379,0.12077072262763977 L0.3007317781448364,0.11945080757141113 C0.284625768661499,0.11583057045936584 0.26832127571105957,0.1129668653011322 0.25188517570495605,0.11087149381637573 0.2433369755744934,0.1095515787601471 0.23478883504867554,0.108671635389328 0.22746187448501587,0.10801169276237488 0.2201349139213562,0.10735175013542175 0.2079232633113861,0.10647183656692505 0.19815391302108765,0.10625183582305908 0.18838459253311157,0.1060318648815155 0.18227878212928772,0.10625183582305908 0.17373061180114746,0.10625183582305908 0.14096742868423462,0.10622519254684448 0.1082688570022583,0.10887587070465088 0.0760374665260315,0.11417123675346375 0.07254058122634888,0.11437812447547913 0.06903234124183655,0.11437812447547913 0.06553545594215393,0.11417123675346375 C0.03505754470825195,0.11396905779838562,0.00974804162979126,0.09292516112327576,0.007091343402862549,0.06557714939117432 C0.0044345855712890625,0.03822912275791168 0.02530190348625183,0.013545975089073181 0.05527767539024353,0.008579328656196594 0.08923646807670593,0.0032099932432174683 0.12362384796142578,0.00034074485301971436 0.1580997109413147,0z
+ 226
+ 5
+ 0.65
+ 0.7
+
+
+ 384
+ 10
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+
+ XL.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis XL keyboard-ISO.xml b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis XL keyboard-ISO.xml
new file mode 100644
index 000000000..4da97caa7
--- /dev/null
+++ b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Artemis XL keyboard-ISO.xml
@@ -0,0 +1,1024 @@
+
+
+ Artemis XL keyboard layout
+ The default layout for keyboards with programmable keys
+ SpoinkyNL
+ Keyboard
+ Artemis
+ Artemis XL keyboard
+ 464
+ 144
+
+
+ 30
+ 16
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +12.667
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ 39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ +
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ M0,0 L0,0.5 L0.16666666666,0.5 L0.16666666666,1 L1,1 L1,0 Z
+ 1.5
+ 2
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 30
+ ~
+ 1.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+ +90.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+ +
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.75
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+ +24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 30
+ ~
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+ 6.5
+
+
+
+
+
+
+
+ 1.25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+
+
+
+
+
+
+
+ +5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +5
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ 16
+
+
+
+
+
+
+
+ 7
+ +
+
+
+
+
+
+
+
+ 7
+ +2
+
+
+
+
+
+
+
+ 7
+ +
+
+
+
+
+
+
+
+ 7
+ +2
+
+
+
+
+
+
+
+ 7
+ +
+
+
+
+
+
+
+
+ 5
+ 0
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 5
+ 139
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ 0.25
+
+
+ M0.8314498662948608,0.14738866686820984 L0.9718837738037109,0.14738866686820984 C0.9818984270095825,0.14737924933433533 0.9911608695983887,0.15217334032058716 0.9961943626403809,0.1599714159965515 1.0012279748916626,0.1677694320678711 1.0012708902359009,0.17739155888557434 0.9963071346282959,0.18522578477859497 L0.9271892309188843,0.2952173352241516 C0.9220999479293823,0.303014874458313,0.9128080606460571,0.30780303478240967,0.9027659893035889,0.30780303478240967 C0.892723798751831,0.30780303478240967,0.8834319114685059,0.303014874458313,0.8783426284790039,0.2952173352241516 L0.8644212484359741,0.2732190191745758 0.8512327671051025,0.2802584767341614 C0.8458596467971802,0.2705792188644409 0.8399980068206787,0.26089999079704285 0.8338921070098877,0.25144070386886597 0.8277863264083862,0.2419814169406891 0.8177727460861206,0.22724255919456482 0.8094688653945923,0.2155834138393402 L0.8224133253097534,0.20898395776748657 0.8070266246795654,0.18566575646400452 C0.8019757270812988,0.17778605222702026,0.8019649982452393,0.16808003187179565,0.8069984912872314,0.16019132733345032 C0.8120319843292236,0.15230253338813782,0.8213481903076172,0.1474246382713318,0.8314498662948608,0.14738866686820984z M0.10265883803367615,0.2802584767341614 C0.11096274852752686,0.2850980758666992 0.11951091885566711,0.28993773460388184 0.12708213925361633,0.2943373918533325 0.14149188995361328,0.3020368218421936 0.15663433074951172,0.3090762495994568 0.1715325117111206,0.31633567810058594 0.21944981813430786,0.33654189109802246 0.2699943780899048,0.35124915838241577 0.32197999954223633,0.3601123094558716 L0.20377129316329956,0.4168679714202881 0.1908269226551056,0.42302751541137695 C0.14440736174583435,0.4102410674095154 0.09916770458221436,0.3942067623138428 0.05552190542221069,0.3750711679458618 -0.05462715029716492,0.3422936797142029 0.01937541365623474,0.22108301520347595 0.10265883803367615,0.2802584767341614z M0.4714505672454834,0.5930745005607605 C0.46778708696365356,0.602533757686615 0.4646120071411133,0.6119930148124695 0.4614369869232178,0.6214522123336792 0.4521523118019104,0.6509119868278503 0.4455362558364868,0.6810019016265869 0.44165414571762085,0.7114253044128418 0.4388039708137512,0.7340653538703918 0.4374176263809204,0.7568352818489075 0.4375022053718567,0.7796201109886169 0.4375022053718567,0.7877594828605652 0.4375022053718567,0.7961188554763794 0.4375022053718567,0.8042582273483276 C0.444272518157959,0.8297898769378662,0.42963647842407227,0.8560013771057129,0.40284329652786255,0.8663284778594971 C0.37605005502700806,0.8766556978225708 0.3448934555053711,0.8680944442749023 0.3290627598762512,0.8460550308227539 0.31538575887680054,0.8240567445755005 0.32368963956832886,0.8020584583282471 0.3246665596961975,0.7783002257347107 0.32564353942871094,0.7545420527458191 0.3297954797744751,0.7343035936355591 0.33419162034988403,0.7123052477836609 0.33712244033813477,0.6960265636444092 0.3407859206199646,0.6799677610397339 0.344693660736084,0.6639089584350586 L0.35763800144195557,0.6566495895385742 0.44629454612731934,0.6069333553314209 0.4714505672454834,0.5930745005607605z M0.5317760705947876,0.3625321388244629 C0.5405619740486145,0.3735124468803406 0.5487139821052551,0.384893536567688 0.5561993718147278,0.39662957191467285 0.5627936720848083,0.40674877166748047 0.5688995122909546,0.41730791330337524 0.5732957124710083,0.4278671145439148 L0.551070511341095,0.4404062032699585 0.4829294681549072,0.47824329137802124 0.30463945865631104,0.5792155265808105 0.1959558129310608,0.640370786190033 0.14173611998558044,0.6705085635185242 C0.13235116004943848,0.675317645072937,0.12175974249839783,0.6778919100761414,0.11096274852752686,0.6779879927635193 C0.08286315202713013,0.6767981648445129,0.05947789549827576,0.6581392884254456,0.054777029901742935,0.6331580281257629 C0.05007615685462952,0.6081767678260803,0.06532919406890869,0.583619236946106,0.0914241373538971,0.5741559267044067 L0.10558965802192688,0.56733638048172 0.13733991980552673,0.5521575808525085 0.25139671564102173,0.4971618056297302 0.43701374530792236,0.4080686569213867 0.5088182091712952,0.3735312819480896 0.5317760705947876,0.3625321388244629z M0.1580997109413147,0 L0.17324218153953552,0 C0.1837441623210907,0,0.19424617290496826,0,0.20450395345687866,0 L0.22892725467681885,0.001539871096611023 0.25506019592285156,0.003959685564041138 C0.2677602767944336,0.005499586462974548 0.279483437538147,0.007039457559585571 0.29242783784866333,0.009239301085472107 0.29804515838623047,0.009239301085472107 0.3036625385284424,0.010999158024787903 0.30952417850494385,0.012099072337150574 L0.31294339895248413,0.012099072337150574 C0.321491539478302,0.013858944177627563 0.3297954797744751,0.015398815274238586 0.3373667001724243,0.017598658800125122 0.35522812604904175,0.02149401605129242 0.37283915281295776,0.02626737952232361 0.3901209831237793,0.031897544860839844 0.4018441438674927,0.03541727364063263 0.4130789041519165,0.03915698826313019 0.42431360483169556,0.0433366596698761 0.4323732852935791,0.04641643166542053 0.4406772255897522,0.049496203660964966 0.44873690605163574,0.05301591753959656 0.4567965865135193,0.05653566122055054 0.46290236711502075,0.05895546078681946 0.46974092721939087,0.06225523352622986 L0.47633522748947144,0.06511500477790833 C0.4831737279891968,0.06819474697113037 0.4900122880935669,0.07149451971054077 0.4963623285293579,0.07501423358917236 0.5027123689651489,0.07853397727012634 0.5119932889938354,0.08293363451957703 0.5207855701446533,0.08711332082748413 0.532753050327301,0.09393277764320374 0.5452088713645935,0.10075226426124573 0.5561993718147278,0.10911163687705994 L0.5598629117012024,0.11153143644332886 C0.5674340724945068,0.11637106537818909,0.575005292892456,0.12165066599845886,0.58257657289505,0.12693023681640625 L0.5852631330490112,0.12869009375572205 C0.5940554738044739,0.1348496377468109 0.6026036739349365,0.14144912362098694 0.6111517548561096,0.14826861023902893 0.6192114949226379,0.1544281542301178 0.6267826557159424,0.16080763936042786 0.6355750560760498,0.16762709617614746 0.6443674564361572,0.17444661259651184 0.6512059569358826,0.18126606941223145 0.6585330367088318,0.18852552771568298 0.6609752774238586,0.19072535634040833 0.6631733775138855,0.19314518570899963 0.6656156778335571,0.19556495547294617 0.6719657778739929,0.201944500207901 0.6783158183097839,0.20832398533821106 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21492350101470947 0.6844216585159302,0.21602341532707214 0.6858870983123779,0.21690335869789124 0.6927255392074585,0.22438275814056396 0.6993198394775391,0.23186218738555908 0.7056698799133301,0.23890167474746704 0.7120199799537659,0.2459411323070526 0.7191027402877808,0.2554003894329071 0.7256970405578613,0.26419970393180847 L0.7325356006622314,0.27387893199920654 C0.7376644611358643,0.28113842010498047 0.7427933216094971,0.2886178195476532 0.7476779222488403,0.29587724804878235 0.887993574142456,0.5147373676300049 0.8601140975952148,0.7894638180732727 0.6780716180801392,0.9817845821380615 0.6709265112876892,0.989209771156311 0.6617487668991089,0.9948219060897827 0.6514502167701721,0.998063325881958 L0.6431463360786438,0.9998232126235962 C0.6424370408058167,1.000058889389038 0.6416575908660889,1.000058889389038 0.6409482359886169,0.9998232126235962 0.6382670402526855,1.0000406503677368 0.6355696320533752,1.0000406503677368 0.6328884959220886,0.9998232126235962 C0.6096473932266235,1.0000758171081543,0.5884177088737488,0.9879860877990723,0.5787044167518616,0.9689667224884033 C0.5689911842346191,0.9499474763870239 0.5726134181022644,0.9275609254837036 0.5879496335983276,0.911829948425293 0.6916045546531677,0.8017895221710205 0.7362658977508545,0.6562486886978149 0.7100660800933838,0.5138804912567139 0.7100660800933838,0.5086009502410889 0.7081122398376465,0.5033213496208191 0.7068911194801331,0.4980417490005493 0.7056698799133301,0.49276214838027954 0.7044487595558167,0.48748254776000977 0.7029833793640137,0.4819830060005188 0.7015179395675659,0.47648340463638306 0.7002968192100525,0.47142380475997925 0.69858717918396,0.4661442041397095 0.6968775987625122,0.4608646035194397 0.6956563591957092,0.45624494552612305 0.6937025189399719,0.45118534564971924 0.6888028383255005,0.4367102384567261 0.6830968260765076,0.42246657609939575 0.6766061782836914,0.4085085988044739 0.6751407384872437,0.4045489430427551 0.6731869578361511,0.40102916955947876 0.6714773178100586,0.3972894549369812 0.6635856032371521,0.381019651889801 0.6546980738639832,0.3651564121246338 0.6448559165000916,0.349773108959198 0.6414366960525513,0.34493350982666016 0.638261616230011,0.3398738503456116 0.6350865960121155,0.3352542519569397 0.6289807558059692,0.32645493745803833 0.622630774974823,0.3180955648422241 0.6162806153297424,0.3097361922264099 0.6099306344985962,0.3013768196105957 0.600894033908844,0.2910376489162445 0.591857373714447,0.2820183336734772 L0.5801341533660889,0.2696993052959442 C0.5715860724449158,0.26089999079704285 0.5625494718551636,0.25254058837890625 0.5535128116607666,0.2446211874485016 0.5493572354316711,0.24065852165222168 0.5449538826942444,0.23691263794898987 0.5403242707252502,0.2334021031856537 L0.529333770275116,0.22460272908210754 C0.5064655542373657,0.20664280652999878 0.48195523023605347,0.19045335054397583 0.4560639262199402,0.17620646953582764 0.45191192626953125,0.17378664016723633 0.44727152585983276,0.171586811542511 0.44287532567977905,0.16938698291778564 0.43847912549972534,0.1671871840953827 0.43261754512786865,0.16410738229751587 0.42748862504959106,0.16168758273124695 L0.416253924369812,0.15662795305252075 C0.39798784255981445,0.14821934700012207,0.37914353609085083,0.14087164402008057,0.3598361015319824,0.13462966680526733 L0.3490898609161377,0.13132989406585693 0.3466475009918213,0.13132989406585693 C0.3337032198905945,0.1273702085018158,0.32051461935043335,0.1238504946231842,0.3068375587463379,0.12077072262763977 L0.3007317781448364,0.11945080757141113 C0.284625768661499,0.11583057045936584 0.26832127571105957,0.1129668653011322 0.25188517570495605,0.11087149381637573 0.2433369755744934,0.1095515787601471 0.23478883504867554,0.108671635389328 0.22746187448501587,0.10801169276237488 0.2201349139213562,0.10735175013542175 0.2079232633113861,0.10647183656692505 0.19815391302108765,0.10625183582305908 0.18838459253311157,0.1060318648815155 0.18227878212928772,0.10625183582305908 0.17373061180114746,0.10625183582305908 0.14096742868423462,0.10622519254684448 0.1082688570022583,0.10887587070465088 0.0760374665260315,0.11417123675346375 0.07254058122634888,0.11437812447547913 0.06903234124183655,0.11437812447547913 0.06553545594215393,0.11417123675346375 C0.03505754470825195,0.11396905779838562,0.00974804162979126,0.09292516112327576,0.007091343402862549,0.06557714939117432 C0.0044345855712890625,0.03822912275791168 0.02530190348625183,0.013545975089073181 0.05527767539024353,0.008579328656196594 0.08923646807670593,0.0032099932432174683 0.12362384796142578,0.00034074485301971436 0.1580997109413147,0z
+ 226
+ 5
+ 0.65
+ 0.7
+
+
+ 384
+ 10
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+ 0.75
+ 0.5
+
+
+
+ XL.png
+
+
\ No newline at end of file
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/0_BracketRight.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/0_BracketRight.png
new file mode 100644
index 000000000..48a040795
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/0_BracketRight.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/1_ExclamationMark.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/1_ExclamationMark.png
new file mode 100644
index 000000000..b9d6c96ec
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/1_ExclamationMark.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/2_At.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/2_At.png
new file mode 100644
index 000000000..c00bfbe80
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/2_At.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/3_Hash.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/3_Hash.png
new file mode 100644
index 000000000..e0bb1468e
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/3_Hash.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/4_Dollar.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/4_Dollar.png
new file mode 100644
index 000000000..a65a4071d
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/4_Dollar.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/5_Percent.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/5_Percent.png
new file mode 100644
index 000000000..3065eb11d
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/5_Percent.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/6_Circumflex.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/6_Circumflex.png
new file mode 100644
index 000000000..3a9b2bb3a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/6_Circumflex.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/7_Ampersand.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/7_Ampersand.png
new file mode 100644
index 000000000..137f74aa7
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/7_Ampersand.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/8_Asterisk.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/8_Asterisk.png
new file mode 100644
index 000000000..f8b6b2331
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/8_Asterisk.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/9_BracketRight.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/9_BracketRight.png
new file mode 100644
index 000000000..b97abfbf7
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/9_BracketRight.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/A.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/A.png
new file mode 100644
index 000000000..7ecd4d362
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/A.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/AccentGrave_Tilde.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/AccentGrave_Tilde.png
new file mode 100644
index 000000000..83f3d7dfb
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/AccentGrave_Tilde.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Alt.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Alt.png
new file mode 100644
index 000000000..bbc50eda3
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Alt.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Apostrophe_QuotationMark.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Apostrophe_QuotationMark.png
new file mode 100644
index 000000000..c3e77a855
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Apostrophe_QuotationMark.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Asterisk.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Asterisk.png
new file mode 100644
index 000000000..df3c69164
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Asterisk.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/B.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/B.png
new file mode 100644
index 000000000..e9fb32356
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/B.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Backspace.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Backspace.png
new file mode 100644
index 000000000..8b5c8f6ec
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Backspace.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/BlackslashIso.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/BlackslashIso.png
new file mode 100644
index 000000000..7d0af6756
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/BlackslashIso.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Blackslash_Pipe_Wide.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Blackslash_Pipe_Wide.png
new file mode 100644
index 000000000..9759ff65f
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Blackslash_Pipe_Wide.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/C.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/C.png
new file mode 100644
index 000000000..38d4e98fc
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/C.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CapsLock.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CapsLock.png
new file mode 100644
index 000000000..cf2bc9435
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CapsLock.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretDown.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretDown.png
new file mode 100644
index 000000000..1b340b639
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretDown.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretLeft.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretLeft.png
new file mode 100644
index 000000000..63cdba35f
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretLeft.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretRight.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretRight.png
new file mode 100644
index 000000000..e0b8b4574
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretRight.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretUp.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretUp.png
new file mode 100644
index 000000000..d1852b4b0
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/CaretUp.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Ctrl.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Ctrl.png
new file mode 100644
index 000000000..3e41272b4
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Ctrl.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/D.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/D.png
new file mode 100644
index 000000000..fe58c8e9a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/D.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Delete.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Delete.png
new file mode 100644
index 000000000..588db4ad9
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Delete.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Dot_Del.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Dot_Del.png
new file mode 100644
index 000000000..a0f8191b7
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Dot_Del.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/E.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/E.png
new file mode 100644
index 000000000..b5eb03c71
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/E.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/End.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/End.png
new file mode 100644
index 000000000..cb970aa04
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/End.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/EnterAnsi.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/EnterAnsi.png
new file mode 100644
index 000000000..84ecded86
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/EnterAnsi.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/EnterIso.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/EnterIso.png
new file mode 100644
index 000000000..4b7b9da00
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/EnterIso.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Equals_Plus.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Equals_Plus.png
new file mode 100644
index 000000000..586c04aef
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Equals_Plus.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Escape.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Escape.png
new file mode 100644
index 000000000..1af00b8d2
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Escape.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F.png
new file mode 100644
index 000000000..eb1919efb
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F1.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F1.png
new file mode 100644
index 000000000..4baea9a7a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F1.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F10.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F10.png
new file mode 100644
index 000000000..6026250c7
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F10.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F11.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F11.png
new file mode 100644
index 000000000..f6a01502d
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F11.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F12.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F12.png
new file mode 100644
index 000000000..4c85ebb0b
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F12.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F2.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F2.png
new file mode 100644
index 000000000..d3ad5e562
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F2.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F3.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F3.png
new file mode 100644
index 000000000..d34d22ec3
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F3.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F4.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F4.png
new file mode 100644
index 000000000..bcbfb1814
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F4.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F5.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F5.png
new file mode 100644
index 000000000..80ad70b92
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F5.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F6.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F6.png
new file mode 100644
index 000000000..92636fca7
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F6.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F7.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F7.png
new file mode 100644
index 000000000..a154bad30
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F7.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F8.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F8.png
new file mode 100644
index 000000000..69538a0ee
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F8.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F9.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F9.png
new file mode 100644
index 000000000..f0724beef
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F9.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/G.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/G.png
new file mode 100644
index 000000000..7fcd7312f
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/G.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/GreaterThan_Dot.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/GreaterThan_Dot.png
new file mode 100644
index 000000000..6857bf6c0
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/GreaterThan_Dot.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Gui.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Gui.png
new file mode 100644
index 000000000..03129b609
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Gui.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/H.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/H.png
new file mode 100644
index 000000000..142fc4e58
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/H.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Home.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Home.png
new file mode 100644
index 000000000..f13d87472
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Home.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Hyphen_Underscore.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Hyphen_Underscore.png
new file mode 100644
index 000000000..9e0d04aa6
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Hyphen_Underscore.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/I.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/I.png
new file mode 100644
index 000000000..1ffd1a1ce
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/I.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Insert.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Insert.png
new file mode 100644
index 000000000..74d2da7d9
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Insert.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/J.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/J.png
new file mode 100644
index 000000000..e2cd8f150
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/J.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/K.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/K.png
new file mode 100644
index 000000000..6052850df
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/K.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/L.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/L.png
new file mode 100644
index 000000000..fe858d869
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/L.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/LessThan_Comma.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/LessThan_Comma.png
new file mode 100644
index 000000000..3c2cd0146
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/LessThan_Comma.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M.png
new file mode 100644
index 000000000..e446ae051
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M1.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M1.png
new file mode 100644
index 000000000..8b48a5f1e
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M1.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M2.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M2.png
new file mode 100644
index 000000000..3fd6ec16a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M2.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M3.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M3.png
new file mode 100644
index 000000000..3a7e68434
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M3.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M4.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M4.png
new file mode 100644
index 000000000..ea1c7989d
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M4.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M5.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M5.png
new file mode 100644
index 000000000..a626b0c6a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M5.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M6.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M6.png
new file mode 100644
index 000000000..7bf0dd173
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M6.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Menu.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Menu.png
new file mode 100644
index 000000000..e7277d409
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Menu.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Minus.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Minus.png
new file mode 100644
index 000000000..86cc37aea
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Minus.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/N.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/N.png
new file mode 100644
index 000000000..34bf833f1
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/N.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num0_Ins.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num0_Ins.png
new file mode 100644
index 000000000..4e97d7d7e
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num0_Ins.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num1.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num1.png
new file mode 100644
index 000000000..c14017561
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num1.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num2.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num2.png
new file mode 100644
index 000000000..29043d8d5
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num2.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num3.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num3.png
new file mode 100644
index 000000000..e0e2a4c3b
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num3.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num4.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num4.png
new file mode 100644
index 000000000..99ea9a204
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num4.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num5.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num5.png
new file mode 100644
index 000000000..d01b5d948
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num5.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num6.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num6.png
new file mode 100644
index 000000000..eee9cab3d
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num6.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num7.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num7.png
new file mode 100644
index 000000000..ba2ef84e1
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num7.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num8.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num8.png
new file mode 100644
index 000000000..2d3cbb3bf
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num8.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num9.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num9.png
new file mode 100644
index 000000000..6c108c649
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num9.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumEnter.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumEnter.png
new file mode 100644
index 000000000..505aa6275
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumEnter.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumLock.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumLock.png
new file mode 100644
index 000000000..70f7543f7
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumLock.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumPlus.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumPlus.png
new file mode 100644
index 000000000..268410cf2
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumPlus.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/O.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/O.png
new file mode 100644
index 000000000..31cdb61d0
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/O.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/P.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/P.png
new file mode 100644
index 000000000..b8549ee86
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/P.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageDown.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageDown.png
new file mode 100644
index 000000000..38d3473f1
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageDown.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageUp.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageUp.png
new file mode 100644
index 000000000..7165692b8
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageUp.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PauseBreak.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PauseBreak.png
new file mode 100644
index 000000000..012678088
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PauseBreak.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PrintScreen.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PrintScreen.png
new file mode 100644
index 000000000..172ff12c9
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PrintScreen.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Q.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Q.png
new file mode 100644
index 000000000..cacff5049
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Q.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/QuestionMark_Slash.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/QuestionMark_Slash.png
new file mode 100644
index 000000000..96bfa9058
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/QuestionMark_Slash.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/R.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/R.png
new file mode 100644
index 000000000..d7eb69e4d
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/R.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/S.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/S.png
new file mode 100644
index 000000000..54cf3b8c0
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/S.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ScrollLock.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ScrollLock.png
new file mode 100644
index 000000000..0bb90635b
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ScrollLock.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Semicolon_Colon.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Semicolon_Colon.png
new file mode 100644
index 000000000..2c478d313
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Semicolon_Colon.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Shift.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Shift.png
new file mode 100644
index 000000000..a36a93b0c
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Shift.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ShiftBig.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ShiftBig.png
new file mode 100644
index 000000000..66b8e0231
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ShiftBig.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Slash.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Slash.png
new file mode 100644
index 000000000..93a46e6c2
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Slash.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Space.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Space.png
new file mode 100644
index 000000000..3c5fab49a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Space.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketLeft_CurlyBracketLeft.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketLeft_CurlyBracketLeft.png
new file mode 100644
index 000000000..f242b6896
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketLeft_CurlyBracketLeft.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketRight_CurlyBracketRight.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketRight_CurlyBracketRight.png
new file mode 100644
index 000000000..2dd2e6053
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketRight_CurlyBracketRight.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/T.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/T.png
new file mode 100644
index 000000000..bf3abb57b
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/T.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Tab.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Tab.png
new file mode 100644
index 000000000..deb103414
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Tab.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/U.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/U.png
new file mode 100644
index 000000000..ebc2814c9
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/U.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/V.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/V.png
new file mode 100644
index 000000000..c4aded6a2
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/V.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/W.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/W.png
new file mode 100644
index 000000000..cb22657c6
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/W.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/X.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/X.png
new file mode 100644
index 000000000..d457eeb80
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/X.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Y.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Y.png
new file mode 100644
index 000000000..f12dd786c
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Y.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Z.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Z.png
new file mode 100644
index 000000000..4fff012f6
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Z.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/L.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/L.png
new file mode 100644
index 000000000..c6287290a
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/L.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/TKL.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/TKL.png
new file mode 100644
index 000000000..64797cd07
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/TKL.png differ
diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/XL.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/XL.png
new file mode 100644
index 000000000..9f999d407
Binary files /dev/null and b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/XL.png differ
diff --git a/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs b/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs
index 41f59e4f9..b51e68547 100644
--- a/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs
+++ b/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs
@@ -48,7 +48,7 @@ namespace Artemis.Core
public void Apply(Layer layer, List devices)
{
IEnumerable matches = devices
- .Where(d => DeviceType == RGBDeviceType.All || d.RgbDevice.DeviceInfo.DeviceType == DeviceType)
+ .Where(d => DeviceType == RGBDeviceType.All || d.DeviceType == DeviceType)
.OrderBy(d => d.Rectangle.Top)
.ThenBy(d => d.Rectangle.Left)
.Skip(Skip);
diff --git a/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs b/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs
index e8c6f09ba..2a68be352 100644
--- a/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs
+++ b/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs
@@ -38,7 +38,7 @@ namespace Artemis.Core
public void Apply(Layer layer, List devices)
{
// Only keyboards should have the LEDs we care about
- foreach (ArtemisDevice keyboard in devices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard))
+ foreach (ArtemisDevice keyboard in devices.Where(d => d.DeviceType == RGBDeviceType.Keyboard))
{
List ledIds = RegionLedIds[Section];
layer.AddLeds(keyboard.Leds.Where(l => ledIds.Contains(l.RgbLed.Id)));
diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs
index 5e910dfe9..01754e172 100644
--- a/src/Artemis.Core/Models/Profile/Layer.cs
+++ b/src/Artemis.Core/Models/Profile/Layer.cs
@@ -272,7 +272,7 @@ namespace Artemis.Core
{
DeviceIdentifier = artemisLed.Device.Identifier,
LedName = artemisLed.RgbLed.Id.ToString(),
- PhysicalLayout = artemisLed.Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard ? (int) artemisLed.Device.PhysicalLayout : null
+ PhysicalLayout = artemisLed.Device.DeviceType == RGBDeviceType.Keyboard ? (int) artemisLed.Device.PhysicalLayout : null
};
LayerEntity.Leds.Add(ledEntity);
}
diff --git a/src/Artemis.Core/Models/Profile/LayerAdapter.cs b/src/Artemis.Core/Models/Profile/LayerAdapter.cs
index 77717340f..b60d901f9 100644
--- a/src/Artemis.Core/Models/Profile/LayerAdapter.cs
+++ b/src/Artemis.Core/Models/Profile/LayerAdapter.cs
@@ -83,11 +83,11 @@ namespace Artemis.Core
{
ArtemisDevice device = deviceLeds.Key;
// If there is already an adaption hint for this type, don't add another
- if (AdaptionHints.Any(h => h is DeviceAdaptionHint d && d.DeviceType == device.RgbDevice.DeviceInfo.DeviceType))
+ if (AdaptionHints.Any(h => h is DeviceAdaptionHint d && d.DeviceType == device.DeviceType))
continue;
if (DoesLayerCoverDevice(device))
{
- DeviceAdaptionHint hint = new() {DeviceType = device.RgbDevice.DeviceInfo.DeviceType};
+ DeviceAdaptionHint hint = new() {DeviceType = device.DeviceType};
AdaptionHints.Add(hint);
newHints.Add(hint);
}
diff --git a/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs b/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs
index e5733c8e2..d9ad40690 100644
--- a/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs
+++ b/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs
@@ -15,7 +15,7 @@ namespace Artemis.Core
///
///
/// The type of property encapsulated in this layer property
- public class LayerProperty : ILayerProperty
+ public class LayerProperty : CorePropertyChanged, ILayerProperty
{
private bool _disposed;
@@ -265,6 +265,7 @@ namespace Artemis.Core
_baseValue = value;
ReapplyUpdate();
+ OnPropertyChanged(nameof(BaseValue));
}
}
diff --git a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs
index 488efdd8c..7f4e8dc3d 100644
--- a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs
+++ b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs
@@ -6,7 +6,6 @@ using Artemis.Core.DeviceProviders;
using Artemis.Core.Services;
using Artemis.Storage.Entities.Surface;
using RGB.NET.Core;
-using RGB.NET.Layout;
using SkiaSharp;
namespace Artemis.Core
@@ -91,6 +90,11 @@ namespace Artemis.Core
///
public IRGBDevice RgbDevice { get; }
+ ///
+ /// Gets the device type of the ArtemisDevice
+ ///
+ public RGBDeviceType DeviceType => RgbDevice.DeviceInfo.DeviceType;
+
///
/// Gets the device provider that provided this device
///
@@ -351,6 +355,46 @@ namespace Artemis.Core
///
public event EventHandler? DeviceUpdated;
+ ///
+ /// Applies the default categories for this device to the list
+ ///
+ public void ApplyDefaultCategories()
+ {
+ switch (RgbDevice.DeviceInfo.DeviceType)
+ {
+ case RGBDeviceType.Keyboard:
+ case RGBDeviceType.Mouse:
+ case RGBDeviceType.Headset:
+ case RGBDeviceType.Mousepad:
+ case RGBDeviceType.HeadsetStand:
+ case RGBDeviceType.Keypad:
+ if (!Categories.Contains(DeviceCategory.Peripherals))
+ Categories.Add(DeviceCategory.Peripherals);
+ break;
+ case RGBDeviceType.Mainboard:
+ case RGBDeviceType.GraphicsCard:
+ case RGBDeviceType.DRAM:
+ case RGBDeviceType.Fan:
+ case RGBDeviceType.LedStripe:
+ case RGBDeviceType.Cooler:
+ if (!Categories.Contains(DeviceCategory.Case))
+ Categories.Add(DeviceCategory.Case);
+ break;
+ case RGBDeviceType.Speaker:
+ if (!Categories.Contains(DeviceCategory.Desk))
+ Categories.Add(DeviceCategory.Desk);
+ break;
+ case RGBDeviceType.Monitor:
+ if (!Categories.Contains(DeviceCategory.Monitor))
+ Categories.Add(DeviceCategory.Monitor);
+ break;
+ case RGBDeviceType.LedMatrix:
+ if (!Categories.Contains(DeviceCategory.Room))
+ Categories.Add(DeviceCategory.Room);
+ break;
+ }
+ }
+
///
/// Invokes the event
///
@@ -392,46 +436,6 @@ namespace Artemis.Core
OnDeviceUpdated();
}
- ///
- /// Applies the default categories for this device to the list
- ///
- public void ApplyDefaultCategories()
- {
- switch (RgbDevice.DeviceInfo.DeviceType)
- {
- case RGBDeviceType.Keyboard:
- case RGBDeviceType.Mouse:
- case RGBDeviceType.Headset:
- case RGBDeviceType.Mousepad:
- case RGBDeviceType.HeadsetStand:
- case RGBDeviceType.Keypad:
- if (!Categories.Contains(DeviceCategory.Peripherals))
- Categories.Add(DeviceCategory.Peripherals);
- break;
- case RGBDeviceType.Mainboard:
- case RGBDeviceType.GraphicsCard:
- case RGBDeviceType.DRAM:
- case RGBDeviceType.Fan:
- case RGBDeviceType.LedStripe:
- case RGBDeviceType.Cooler:
- if (!Categories.Contains(DeviceCategory.Case))
- Categories.Add(DeviceCategory.Case);
- break;
- case RGBDeviceType.Speaker:
- if (!Categories.Contains(DeviceCategory.Desk))
- Categories.Add(DeviceCategory.Desk);
- break;
- case RGBDeviceType.Monitor:
- if (!Categories.Contains(DeviceCategory.Monitor))
- Categories.Add(DeviceCategory.Monitor);
- break;
- case RGBDeviceType.LedMatrix:
- if (!Categories.Contains(DeviceCategory.Room))
- Categories.Add(DeviceCategory.Room);
- break;
- }
- }
-
internal void ApplyToEntity()
{
// Other properties are computed
@@ -439,13 +443,11 @@ namespace Artemis.Core
DeviceEntity.InputIdentifiers.Clear();
foreach (ArtemisDeviceInputIdentifier identifier in InputIdentifiers)
- {
DeviceEntity.InputIdentifiers.Add(new DeviceInputIdentifierEntity
{
InputProvider = identifier.InputProvider,
Identifier = identifier.Identifier
});
- }
DeviceEntity.InputMappings.Clear();
foreach (var (original, mapped) in InputMappings)
@@ -472,9 +474,9 @@ namespace Artemis.Core
if (!RgbDevice.ColorCorrections.Any())
RgbDevice.ColorCorrections.Add(new ScaleColorCorrection(this));
-
+
Categories.Clear();
- foreach (int deviceEntityCategory in DeviceEntity.Categories)
+ foreach (int deviceEntityCategory in DeviceEntity.Categories)
Categories.Add((DeviceCategory) deviceEntityCategory);
if (!Categories.Any())
ApplyDefaultCategories();
@@ -532,12 +534,34 @@ namespace Artemis.Core
}
}
+ ///
+ /// Represents a device category
+ ///
public enum DeviceCategory
{
+ ///
+ /// A device used to light up (part of) the desk
+ ///
Desk,
+
+ ///
+ /// A device attached or embedded into the monitor
+ ///
Monitor,
+
+ ///
+ /// A device placed or embedded into the case
+ ///
Case,
+
+ ///
+ /// A device used to light up (part of) the room
+ ///
Room,
+
+ ///
+ /// A peripheral
+ ///
Peripherals
}
}
\ No newline at end of file
diff --git a/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs b/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs
index 130b8cba7..2df270e5b 100644
--- a/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs
+++ b/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs
@@ -146,6 +146,58 @@ namespace Artemis.Core
else
Image = null;
}
+
+ internal static ArtemisLayout? GetDefaultLayout(ArtemisDevice device)
+ {
+ string layoutFolder = Path.Combine(Constants.ApplicationFolder, "DefaultLayouts\\Artemis");
+ if (device.DeviceType == RGBDeviceType.Keyboard)
+ {
+ // XL layout is defined by its programmable macro keys
+ if (device.Leds.Any(l => l.RgbLed.Id >= LedId.Keyboard_Programmable1 && l.RgbLed.Id <= LedId.Keyboard_Programmable32))
+ {
+ if (device.PhysicalLayout == KeyboardLayoutType.ANSI)
+ return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis XL keyboard-ANSI.xml", LayoutSource.Default);
+ return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis XL keyboard-ISO.xml", LayoutSource.Default);
+ }
+
+ // L layout is defined by its numpad
+ if (device.Leds.Any(l => l.RgbLed.Id >= LedId.Keyboard_NumLock && l.RgbLed.Id <= LedId.Keyboard_NumPeriodAndDelete))
+ {
+ if (device.PhysicalLayout == KeyboardLayoutType.ANSI)
+ return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis L keyboard-ANSI.xml", LayoutSource.Default);
+ return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis L keyboard-ISO.xml", LayoutSource.Default);
+ }
+
+ // No numpad will result in TKL
+ if (device.PhysicalLayout == KeyboardLayoutType.ANSI)
+ return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis TKL keyboard-ANSI.xml", LayoutSource.Default);
+ return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis TKL keyboard-ISO.xml", LayoutSource.Default);
+ }
+
+ // if (device.DeviceType == RGBDeviceType.Mouse)
+ // {
+ // if (device.Leds.Count == 1)
+ // {
+ // if (device.Leds.Any(l => l.RgbLed.Id == LedId.Logo))
+ // return new ArtemisLayout(layoutFolder + "\\Mouse\\1 LED mouse logo.xml", LayoutSource.Default);
+ // return new ArtemisLayout(layoutFolder + "\\Mouse\\1 LED mouse.xml", LayoutSource.Default);
+ // }
+ // if (device.Leds.Any(l => l.RgbLed.Id == LedId.Logo))
+ // return new ArtemisLayout(layoutFolder + "\\Mouse\\4 LED mouse logo.xml", LayoutSource.Default);
+ // return new ArtemisLayout(layoutFolder + "\\Mouse\\4 LED mouse.xml", LayoutSource.Default);
+ // }
+
+ if (device.DeviceType == RGBDeviceType.Headset)
+ {
+ if (device.Leds.Count == 1)
+ return new ArtemisLayout(layoutFolder + "\\Headset\\Artemis 1 LED headset.xml", LayoutSource.Default);
+ if (device.Leds.Count == 2)
+ return new ArtemisLayout(layoutFolder + "\\Headset\\Artemis 2 LED headset.xml", LayoutSource.Default);
+ return new ArtemisLayout(layoutFolder + "\\Headset\\Artemis 4 LED headset.xml", LayoutSource.Default);
+ }
+
+ return null;
+ }
}
///
diff --git a/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs b/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs
index f41e9c145..fc540ff96 100644
--- a/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs
+++ b/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs
@@ -74,7 +74,7 @@ namespace Artemis.Core.DeviceProviders
string filePath = Path.Combine(
layoutDir,
device.RgbDevice.DeviceInfo.Manufacturer,
- device.RgbDevice.DeviceInfo.DeviceType.ToString(),
+ device.DeviceType.ToString(),
device.GetLayoutFileName()
);
return new ArtemisLayout(filePath, LayoutSource.Plugin);
@@ -91,7 +91,7 @@ namespace Artemis.Core.DeviceProviders
string filePath = Path.Combine(
layoutDir,
device.RgbDevice.DeviceInfo.Manufacturer,
- device.RgbDevice.DeviceInfo.DeviceType.ToString(),
+ device.DeviceType.ToString(),
device.GetLayoutFileName()
);
return new ArtemisLayout(filePath, LayoutSource.User);
diff --git a/src/Artemis.Core/Plugins/Plugin.cs b/src/Artemis.Core/Plugins/Plugin.cs
index bb6235ac0..ca8645a44 100644
--- a/src/Artemis.Core/Plugins/Plugin.cs
+++ b/src/Artemis.Core/Plugins/Plugin.cs
@@ -155,6 +155,19 @@ namespace Artemis.Core
_profilers.Remove(profiler);
}
+ ///
+ /// Gets an instance of the specified service using the plugins dependency injection container.
+ /// Note: To use parameters reference Ninject and use directly.
+ ///
+ /// The service to resolve.
+ /// An instance of the service.
+ public T Get()
+ {
+ if (Kernel == null)
+ throw new ArtemisPluginException("Cannot use Get before the plugin finished loading");
+ return Kernel.Get();
+ }
+
///
public override string ToString()
{
diff --git a/src/Artemis.Core/Plugins/PluginFeatureInfo.cs b/src/Artemis.Core/Plugins/PluginFeatureInfo.cs
index 6806db862..507abacfa 100644
--- a/src/Artemis.Core/Plugins/PluginFeatureInfo.cs
+++ b/src/Artemis.Core/Plugins/PluginFeatureInfo.cs
@@ -50,7 +50,7 @@ namespace Artemis.Core
else
Icon = "Plugin";
}
-
+
internal PluginFeatureInfo(Plugin plugin, PluginFeatureAttribute? attribute, PluginFeature instance)
{
if (instance == null) throw new ArgumentNullException(nameof(instance));
@@ -124,12 +124,13 @@ namespace Artemis.Core
public bool AlwaysEnabled { get; }
///
- /// Gets a boolean indicating whether the feature is enabled in persistent storage
+ /// Gets a boolean indicating whether the feature is enabled in persistent storage
///
public bool EnabledInStorage => Entity.IsEnabled;
///
/// Gets the feature this info is associated with
+ /// Note: if the associated is disabled
///
public PluginFeature? Instance
{
@@ -137,12 +138,6 @@ namespace Artemis.Core
internal set => SetAndNotify(ref _instance, value);
}
- ///
- public List Prerequisites { get; } = new();
-
- ///
- public bool ArePrerequisitesMet() => Prerequisites.All(p => p.IsMet());
-
internal PluginFeatureEntity Entity { get; }
///
@@ -150,5 +145,14 @@ namespace Artemis.Core
{
return Instance?.Id ?? "Uninitialized feature";
}
+
+ ///
+ public List Prerequisites { get; } = new();
+
+ ///
+ public bool ArePrerequisitesMet()
+ {
+ return Prerequisites.All(p => p.IsMet());
+ }
}
}
\ No newline at end of file
diff --git a/src/Artemis.Core/Plugins/PluginInfo.cs b/src/Artemis.Core/Plugins/PluginInfo.cs
index 2773a51c3..5037b186b 100644
--- a/src/Artemis.Core/Plugins/PluginInfo.cs
+++ b/src/Artemis.Core/Plugins/PluginInfo.cs
@@ -12,15 +12,19 @@ namespace Artemis.Core
[JsonObject(MemberSerialization.OptIn)]
public class PluginInfo : CorePropertyChanged, IPrerequisitesSubject
{
- private bool _autoEnableFeatures = true;
- private string? _description;
private Guid _guid;
+ private string? _description;
+ private string? _author;
+ private Uri? _website;
+ private Uri? _repository;
private string? _icon;
private string _main = null!;
+ private bool _autoEnableFeatures = true;
private string _name = null!;
private Plugin _plugin = null!;
- private bool _requiresAdmin;
private Version _version = null!;
+ private bool _requiresAdmin;
+
internal PluginInfo()
{
@@ -56,6 +60,36 @@ namespace Artemis.Core
set => SetAndNotify(ref _description, value);
}
+ ///
+ /// Gets or sets the author of this plugin
+ ///
+ [JsonProperty]
+ public string? Author
+ {
+ get => _author;
+ set => SetAndNotify(ref _author, value);
+ }
+
+ ///
+ /// Gets or sets the website of this plugin or its author
+ ///
+ [JsonProperty]
+ public Uri? Website
+ {
+ get => _website;
+ set => SetAndNotify(ref _website, value);
+ }
+
+ ///
+ /// Gets or sets the repository of this plugin
+ ///
+ [JsonProperty]
+ public Uri? Repository
+ {
+ get => _repository;
+ set => SetAndNotify(ref _repository, value);
+ }
+
///
/// The plugins display icon that's shown in the settings see for
/// available icons
@@ -108,7 +142,7 @@ namespace Artemis.Core
get => _requiresAdmin;
internal set => SetAndNotify(ref _requiresAdmin, value);
}
-
+
///
/// Gets the plugin this info is associated with
///
@@ -118,12 +152,6 @@ namespace Artemis.Core
internal set => SetAndNotify(ref _plugin, value);
}
- ///
- public List Prerequisites { get; } = new();
-
- ///
- public bool ArePrerequisitesMet() => Prerequisites.All(p => p.IsMet());
-
internal string PreferredPluginDirectory => $"{Main.Split(".dll")[0].Replace("/", "").Replace("\\", "")}-{Guid.ToString().Substring(0, 8)}";
///
@@ -131,5 +159,14 @@ namespace Artemis.Core
{
return $"{Name} v{Version} - {Guid}";
}
+
+ ///
+ public List Prerequisites { get; } = new();
+
+ ///
+ public bool ArePrerequisitesMet()
+ {
+ return Prerequisites.All(p => p.IsMet());
+ }
}
}
\ No newline at end of file
diff --git a/src/Artemis.Core/Plugins/TimedUpdateRegistration.cs b/src/Artemis.Core/Plugins/TimedUpdateRegistration.cs
index 65eede731..39d5ad8cb 100644
--- a/src/Artemis.Core/Plugins/TimedUpdateRegistration.cs
+++ b/src/Artemis.Core/Plugins/TimedUpdateRegistration.cs
@@ -194,6 +194,8 @@ namespace Artemis.Core
public void Dispose()
{
Dispose(true);
+ Feature.Profiler.ClearMeasurements(ToString());
+
GC.SuppressFinalize(this);
}
diff --git a/src/Artemis.Core/Services/Input/InputService.cs b/src/Artemis.Core/Services/Input/InputService.cs
index bed2d47de..abb7ef643 100644
--- a/src/Artemis.Core/Services/Input/InputService.cs
+++ b/src/Artemis.Core/Services/Input/InputService.cs
@@ -76,8 +76,8 @@ namespace Artemis.Core.Services
public void IdentifyDevice(ArtemisDevice device)
{
- if (device.RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Keyboard && device.RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Mouse)
- throw new ArtemisCoreException($"Cannot initialize input-identification for a device of type {device.RgbDevice.DeviceInfo.DeviceType}. \r\n" +
+ if (device.DeviceType != RGBDeviceType.Keyboard && device.DeviceType != RGBDeviceType.Mouse)
+ throw new ArtemisCoreException($"Cannot initialize input-identification for a device of type {device.DeviceType}. \r\n" +
"Only keyboard and mouse is supported.");
_identifyingDevice = device;
@@ -121,7 +121,7 @@ namespace Artemis.Core.Services
{
if (_cachedFallbackKeyboard != null)
return _cachedFallbackKeyboard;
- _cachedFallbackKeyboard = _rgbService.EnabledDevices.FirstOrDefault(d => d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard);
+ _cachedFallbackKeyboard = _rgbService.EnabledDevices.FirstOrDefault(d => d.DeviceType == RGBDeviceType.Keyboard);
return _cachedFallbackKeyboard;
}
@@ -129,7 +129,7 @@ namespace Artemis.Core.Services
{
if (_cachedFallbackMouse != null)
return _cachedFallbackMouse;
- _cachedFallbackMouse = _rgbService.EnabledDevices.FirstOrDefault(d => d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse);
+ _cachedFallbackMouse = _rgbService.EnabledDevices.FirstOrDefault(d => d.DeviceType == RGBDeviceType.Mouse);
return _cachedFallbackMouse;
}
@@ -165,8 +165,8 @@ namespace Artemis.Core.Services
{
// Don't match if there is no device or if the device type differs from the event device type
if (_identifyingDevice == null ||
- _identifyingDevice.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard && e.DeviceType == InputDeviceType.Mouse ||
- _identifyingDevice.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse && e.DeviceType == InputDeviceType.Keyboard)
+ _identifyingDevice.DeviceType == RGBDeviceType.Keyboard && e.DeviceType == InputDeviceType.Mouse ||
+ _identifyingDevice.DeviceType == RGBDeviceType.Mouse && e.DeviceType == InputDeviceType.Keyboard)
return;
if (!(sender is InputProvider inputProvider))
return;
diff --git a/src/Artemis.Core/Services/Interfaces/IRgbService.cs b/src/Artemis.Core/Services/Interfaces/IRgbService.cs
index cfcb5ffb0..10ec9fa1b 100644
--- a/src/Artemis.Core/Services/Interfaces/IRgbService.cs
+++ b/src/Artemis.Core/Services/Interfaces/IRgbService.cs
@@ -83,7 +83,7 @@ namespace Artemis.Core.Services
///
/// The device to apply the best available layout to
/// The layout that was applied to the device
- ArtemisLayout ApplyBestDeviceLayout(ArtemisDevice device);
+ ArtemisLayout? ApplyBestDeviceLayout(ArtemisDevice device);
///
/// Apples the provided to the provided
diff --git a/src/Artemis.Core/Services/RgbService.cs b/src/Artemis.Core/Services/RgbService.cs
index f5bb3fb5b..ae1ea1fc9 100644
--- a/src/Artemis.Core/Services/RgbService.cs
+++ b/src/Artemis.Core/Services/RgbService.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.IO;
using System.Linq;
using Artemis.Core.DeviceProviders;
using Artemis.Core.Services.Models;
@@ -149,6 +150,7 @@ namespace Artemis.Core.Services
RemoveDevice(device);
List providerExceptions = new();
+
void DeviceProviderOnException(object? sender, ExceptionEventArgs e)
{
if (e.IsCritical)
@@ -314,15 +316,15 @@ namespace Artemis.Core.Services
{
SurfaceArrangement surfaceArrangement = SurfaceArrangement.GetDefaultArrangement();
surfaceArrangement.Arrange(_devices);
- foreach (ArtemisDevice artemisDevice in _devices)
+ foreach (ArtemisDevice artemisDevice in _devices)
artemisDevice.ApplyDefaultCategories();
SaveDevices();
}
- public ArtemisLayout ApplyBestDeviceLayout(ArtemisDevice device)
+ public ArtemisLayout? ApplyBestDeviceLayout(ArtemisDevice device)
{
- ArtemisLayout layout;
+ ArtemisLayout? layout;
// Configured layout path takes precedence over all other options
if (device.CustomLayoutPath != null)
@@ -352,19 +354,19 @@ namespace Artemis.Core.Services
}
// Finally fall back to a default layout
- layout = LoadDefaultLayout(device);
- ApplyDeviceLayout(device, layout);
+ layout = ArtemisLayout.GetDefaultLayout(device);
+ if (layout != null)
+ ApplyDeviceLayout(device, layout);
return layout;
}
- private ArtemisLayout LoadDefaultLayout(ArtemisDevice device)
- {
- return new("NYI", LayoutSource.Default);
- }
-
public void ApplyDeviceLayout(ArtemisDevice device, ArtemisLayout layout)
{
- device.ApplyLayout(layout, device.DeviceProvider.CreateMissingLedsSupported, device.DeviceProvider.RemoveExcessiveLedsSupported);
+ if (layout.Source == LayoutSource.Default)
+ device.ApplyLayout(layout, false, false);
+ else
+ device.ApplyLayout(layout, device.DeviceProvider.CreateMissingLedsSupported, device.DeviceProvider.RemoveExcessiveLedsSupported);
+
UpdateLedGroup();
}
diff --git a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs
index 5f25fe5f2..146f89bc1 100644
--- a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs
+++ b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs
@@ -23,12 +23,12 @@ namespace Artemis.Core.Services.Models
public bool HasDevices(List devices)
{
- return devices.Any(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType);
+ return devices.Any(d => d.DeviceType == DeviceType);
}
public void Arrange(List devices)
{
- devices = devices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType).ToList();
+ devices = devices.Where(d => d.DeviceType == DeviceType).ToList();
if (!devices.Any())
return;
@@ -58,7 +58,7 @@ namespace Artemis.Core.Services.Models
public Point GetEdge(HorizontalArrangementPosition horizontalPosition, VerticalArrangementPosition verticalPosition)
{
- List devices = SurfaceArrangement.ArrangedDevices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType || DeviceType == RGBDeviceType.All).ToList();
+ List devices = SurfaceArrangement.ArrangedDevices.Where(d => d.DeviceType == DeviceType || DeviceType == RGBDeviceType.All).ToList();
if (!devices.Any())
return new Point();
diff --git a/src/Artemis.Core/Services/Storage/ProfileService.cs b/src/Artemis.Core/Services/Storage/ProfileService.cs
index e405cdfed..e75eec263 100644
--- a/src/Artemis.Core/Services/Storage/ProfileService.cs
+++ b/src/Artemis.Core/Services/Storage/ProfileService.cs
@@ -67,9 +67,12 @@ namespace Artemis.Core.Services
foreach (ProfileModule profileModule in profileModules)
{
// Avoid race condition, make the check here
- if (profileModule.ActiveProfile != null)
+ if (profileModule.ActiveProfile == null)
+ continue;
+
+ profileModule.ActiveProfile.PopulateLeds(_rgbService.EnabledDevices);
+ if (profileModule.ActiveProfile.IsFreshImport)
{
- profileModule.ActiveProfile.PopulateLeds(_rgbService.EnabledDevices);
_logger.Debug("Profile is a fresh import, adapting to surface - {profile}", profileModule.ActiveProfile);
AdaptProfile(profileModule.ActiveProfile);
}
@@ -152,7 +155,7 @@ namespace Artemis.Core.Services
Profile profile = new(profileDescriptor.ProfileModule, profileEntity);
InstantiateProfile(profile);
-
+
void ActivatingRgbServiceOnLedsChanged(object? sender, EventArgs e)
{
profile.PopulateLeds(_rgbService.EnabledDevices);
@@ -220,12 +223,8 @@ namespace Artemis.Core.Services
public void UpdateProfile(Profile profile, bool includeChildren)
{
- _logger.Debug("Updating profile " + profile);
string memento = JsonConvert.SerializeObject(profile.ProfileEntity, MementoSettings);
- profile.RedoStack.Clear();
- profile.UndoStack.Push(memento);
- profile.IsFreshImport = false;
profile.Save();
if (includeChildren)
{
@@ -235,6 +234,22 @@ namespace Artemis.Core.Services
layer.Save();
}
+ // If there are no changes, don't bother saving
+ string updatedMemento = JsonConvert.SerializeObject(profile.ProfileEntity, MementoSettings);
+ if (memento.Equals(updatedMemento))
+ {
+ _logger.Debug("Updating profile - Skipping save, no changes");
+ return;
+ }
+
+ _logger.Debug("Updating profile - Saving " + profile);
+ profile.RedoStack.Clear();
+ profile.UndoStack.Push(memento);
+
+ // At this point the user made actual changes, save that
+ profile.IsFreshImport = false;
+ profile.ProfileEntity.IsFreshImport = false;
+
_profileRepository.Save(profile.ProfileEntity);
}
@@ -321,9 +336,24 @@ namespace Artemis.Core.Services
///
public void AdaptProfile(Profile profile)
{
+ string memento = JsonConvert.SerializeObject(profile.ProfileEntity, MementoSettings);
+
List devices = _rgbService.EnabledDevices.ToList();
foreach (Layer layer in profile.GetAllLayers())
layer.Adapter.Adapt(devices);
+
+ profile.Save();
+
+ foreach (Folder folder in profile.GetAllFolders())
+ folder.Save();
+ foreach (Layer layer in profile.GetAllLayers())
+ layer.Save();
+
+ _logger.Debug("Adapt profile - Saving " + profile);
+ profile.RedoStack.Clear();
+ profile.UndoStack.Push(memento);
+
+ _profileRepository.Save(profile.ProfileEntity);
}
#region Event handlers
diff --git a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj
index 893ff97d3..52563d5ef 100644
--- a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj
+++ b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj
@@ -50,7 +50,6 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
diff --git a/src/Artemis.UI.Shared/packages.lock.json b/src/Artemis.UI.Shared/packages.lock.json
index 27b93fa8d..88e8b3b52 100644
--- a/src/Artemis.UI.Shared/packages.lock.json
+++ b/src/Artemis.UI.Shared/packages.lock.json
@@ -113,12 +113,6 @@
"resolved": "0.4.0",
"contentHash": "2Tzz6qoQNciyO4uT6wxByMiyvbve+u4eFIiDewDUbeHuxr/rKuba3/EhhXDsEH9WoKzYlpzqxDfQGPE/bIe5Rw=="
},
- "WriteableBitmapEx": {
- "type": "Direct",
- "requested": "[1.6.7, )",
- "resolved": "1.6.7",
- "contentHash": "GoPhIdYzG/DWJq/MADb8gFzRN5PsxM+1DSJFS8Jzupg4DXqFSnlejYEjJw4ffPEUyELL07O4XIGUZydE4jQK0Q=="
- },
"Castle.Core": {
"type": "Transitive",
"resolved": "4.2.0",
diff --git a/src/Artemis.UI/ApplicationStateManager.cs b/src/Artemis.UI/ApplicationStateManager.cs
index 1bc5d5c3a..2a08b4a3a 100644
--- a/src/Artemis.UI/ApplicationStateManager.cs
+++ b/src/Artemis.UI/ApplicationStateManager.cs
@@ -119,14 +119,17 @@ namespace Artemis.UI
private void UtilitiesOnShutdownRequested(object sender, EventArgs e)
{
// Use PowerShell to kill the process after 8 sec just in case
- ProcessStartInfo info = new()
+ if (!StartupArguments.Contains("--disable-forced-shutdown"))
{
- Arguments = "-Command \"& {Start-Sleep -s 8; (Get-Process 'Artemis.UI').kill()}",
- WindowStyle = ProcessWindowStyle.Hidden,
- CreateNoWindow = true,
- FileName = "PowerShell.exe"
- };
- Process.Start(info);
+ ProcessStartInfo info = new()
+ {
+ Arguments = "-Command \"& {Start-Sleep -s 8; (Get-Process -Id " + Process.GetCurrentProcess().Id + ").kill()}",
+ WindowStyle = ProcessWindowStyle.Hidden,
+ CreateNoWindow = true,
+ FileName = "PowerShell.exe"
+ };
+ Process.Start(info);
+ }
Execute.OnUIThread(() => Application.Current.Shutdown());
}
diff --git a/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs b/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs
index 2d30ae887..53277b426 100644
--- a/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs
+++ b/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs
@@ -115,7 +115,7 @@ namespace Artemis.UI.Behaviors
private static bool TextIsEmpty(string text)
{
- return text.Length == 0;
+ return string.IsNullOrEmpty(text);
}
private static bool TextIsNotContainingTermToBeHighlighted(string text, string termToBeHighlighted)
diff --git a/src/Artemis.UI/Properties/launchSettings.json b/src/Artemis.UI/Properties/launchSettings.json
index 1268340dc..ff7efa8ab 100644
--- a/src/Artemis.UI/Properties/launchSettings.json
+++ b/src/Artemis.UI/Properties/launchSettings.json
@@ -2,7 +2,7 @@
"profiles": {
"Artemis.UI": {
"commandName": "Project",
- "commandLineArgs": "--force-elevation --pcmr"
+ "commandLineArgs": "--force-elevation --disable-forced-shutdown --pcmr"
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml
index 7e67d06c8..4db9dc873 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml
@@ -4,44 +4,41 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:s="https://github.com/canton7/Stylet"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
-
-
-
-
-
-
-
-
- Export current profile
-
+
+
+
+
+
+
+
+ Export current profile
+
-
- Please note that exporting profiles like this is placeholder functionality. The idea is that this will eventually happen via the workshop.
-
+
+ It looks like you have not set up any profile adaption hints. This means Artemis can't do much to make your profile look good on a different surface other than try finding the same LEDs as you have.
+
+ To configure adaption hints, right-click on a layer and choose View Adaption Hints.
+
+ To learn more about profile adaption, check out
+
+ this wiki article
+ .
+
-
- The workshop will include tools to make profiles convert easily and look good on different layouts.
- That means right now when someone imports this export unless they have the exact same setup as
- you, they'll have to select LEDs for each layer in the profile.
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs
index 7ab085f39..7b6758ee9 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs
@@ -1,8 +1,8 @@
using System.Windows;
+using System.Windows.Navigation;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Shared.Services;
-using MaterialDesignThemes.Wpf;
namespace Artemis.UI.Screens.ProfileEditor.Dialogs
{
@@ -21,6 +21,22 @@ namespace Artemis.UI.Screens.ProfileEditor.Dialogs
public ProfileDescriptor ProfileDescriptor { get; }
+ #region Overrides of Screen
+
+ ///
+ protected override void OnActivate()
+ {
+ // TODO: If the profile has hints on all layers, call Accept
+ base.OnActivate();
+ }
+
+ #endregion
+
+ public void OpenHyperlink(object sender, RequestNavigateEventArgs e)
+ {
+ Core.Utilities.OpenUrl(e.Uri.AbsoluteUri);
+ }
+
public void Accept()
{
string encoded = _profileService.ExportProfile(ProfileDescriptor);
diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs
index f0cb27d88..84e28c8a3 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
using Artemis.Core;
using Artemis.UI.Ninject.Factories;
@@ -17,6 +18,7 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties
private bool _isVisible;
private TreeGroupViewModel _treeGroupViewModel;
private TimelineGroupViewModel _timelineGroupViewModel;
+ private bool _hasChildren;
public LayerPropertyGroupViewModel(LayerPropertyGroup layerPropertyGroup, IProfileEditorService profileEditorService, ILayerPropertyVmFactory layerPropertyVmFactory)
{
@@ -62,6 +64,11 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties
}
}
+ public bool HasChildren
+ {
+ get => _hasChildren;
+ set => SetAndNotify(ref _hasChildren, value);
+ }
protected override void OnInitialActivate()
{
@@ -169,6 +176,8 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties
Items.Add(_layerPropertyVmFactory.LayerPropertyGroupViewModel(value));
}
}
+
+ HasChildren = Items.Any(i => i is LayerPropertyViewModel {IsVisible: true} || i is LayerPropertyGroupViewModel {IsVisible: true});
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml
index e80ebe39e..2ab3fc453 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml
@@ -33,6 +33,7 @@
Foreground="{DynamicResource MaterialDesignBody}"
Style="{StaticResource MaterialDesignExpandCollapseToggleStyle}"
IsChecked="{Binding Path=LayerPropertyGroupViewModel.IsExpanded}"
+ Visibility="{Binding Path=LayerPropertyGroupViewModel.HasChildren, Converter={x:Static s:BoolToVisibilityConverter.Instance}, Mode=OneWay}"
ClickMode="Press" />
@@ -121,17 +122,39 @@
ToolTip="{Binding LayerPropertyGroup.LayerBrush.Descriptor.Description}"
Margin="0 5 0 0" />
-
+
+ Extra options available!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs
index 7e9662b5e..af4afaba1 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs
@@ -216,7 +216,7 @@ namespace Artemis.UI.Screens.ProfileEditor
if (!await DialogService.ShowConfirmDialog(
"Adapt profile",
"Are you sure you want to adapt the profile to your current surface? Layer assignments may change."
- ))
+ ))
return;
_profileService.AdaptProfile(_profileEditorService.SelectedProfile);
diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml
index c20cb440c..2e82fc085 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml
@@ -22,91 +22,104 @@
d:DesignHeight="800" d:DesignWidth="800"
d:DataContext="{d:DesignInstance dialogs:LayerHintsDialogViewModel}"
Icon="/Resources/Images/Logo/bow.ico">
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- Introduction
-
-
- In this window you can tell Artemis how this layer should be adapted when the profile is applied to a different set of devices by providing so-called adaption hints.
-
- When sharing your profile with other people good hints help them import your profile without the need for manual adjustments.
-
+
+
+
+
+
+
+
+
+
+ Introduction
+
+
+ In this window you can tell Artemis how this layer should be adapted when the profile is applied to a different set of devices by providing so-called adaption hints.
+ This is useful when sharing your profile with others, avoiding the need for manual adjustments.
+
+ To learn more about profile adaption, check out
+
+ this wiki article
+
+ .
+
-
- Adaption hints
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Adaption hints
+
+
+
+ You haven't set up any adaption hints
+ Artemis will attempt to directly map the LEDs of this layer to different surfaces but results may vary.
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogViewModel.cs
index 642baeb3d..0682e404f 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogViewModel.cs
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Navigation;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
@@ -28,6 +30,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs
}
public Layer Layer { get; }
+ public bool HasAdaptionHints => Items.Any();
public SnackbarMessageQueue LayerHintsMessageQueue
{
@@ -46,6 +49,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs
CategoryAdaptionHint hint = new();
Layer.Adapter.AdaptionHints.Add(hint);
Items.Add(_vmFactory.CategoryAdaptionHintViewModel(hint));
+ NotifyOfPropertyChange(nameof(HasAdaptionHints));
}
public void AddDeviceHint()
@@ -53,6 +57,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs
DeviceAdaptionHint hint = new();
Layer.Adapter.AdaptionHints.Add(hint);
Items.Add(_vmFactory.DeviceAdaptionHintViewModel(hint));
+ NotifyOfPropertyChange(nameof(HasAdaptionHints));
}
public void AddKeyboardSectionHint()
@@ -60,12 +65,19 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs
KeyboardSectionAdaptionHint hint = new();
Layer.Adapter.AdaptionHints.Add(hint);
Items.Add(_vmFactory.KeyboardSectionAdaptionHintViewModel(hint));
+ NotifyOfPropertyChange(nameof(HasAdaptionHints));
}
public void RemoveAdaptionHint(AdaptionHintViewModel adaptionHintViewModel)
{
Layer.Adapter.AdaptionHints.Remove(adaptionHintViewModel.AdaptionHint);
Items.Remove(adaptionHintViewModel);
+ NotifyOfPropertyChange(nameof(HasAdaptionHints));
+ }
+
+ public void OpenHyperlink(object sender, RequestNavigateEventArgs e)
+ {
+ Core.Utilities.OpenUrl(e.Uri.AbsoluteUri);
}
#region Overrides of Screen
@@ -109,6 +121,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs
break;
}
}
+ NotifyOfPropertyChange(nameof(HasAdaptionHints));
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs
index 62ec00072..0cd156be7 100644
--- a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs
@@ -46,7 +46,7 @@ namespace Artemis.UI.Screens.Settings.Device
SelectedLeds = new BindableCollection();
Items.Add(factory.DevicePropertiesTabViewModel(device));
- if (device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard)
+ if (device.DeviceType == RGBDeviceType.Keyboard)
Items.Add(factory.InputMappingsTabViewModel(device));
Items.Add(factory.DeviceInfoTabViewModel(device));
Items.Add(factory.DeviceLedsTabViewModel(device));
@@ -178,7 +178,7 @@ namespace Artemis.UI.Screens.Settings.Device
string directory = Path.Combine(
dialog.SelectedPath,
Device.RgbDevice.DeviceInfo.Manufacturer,
- Device.RgbDevice.DeviceInfo.DeviceType.ToString()
+ Device.DeviceType.ToString()
);
string filePath = Path.Combine(directory, Device.GetLayoutFileName());
Core.Utilities.CreateAccessibleDirectory(directory);
diff --git a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml
index 3f5047fb9..18362412e 100644
--- a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml
+++ b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml
@@ -40,7 +40,7 @@
+ Text="{Binding Device.DeviceType}" />
diff --git a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs
index bf97b4e21..1305a1d24 100644
--- a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs
@@ -15,7 +15,7 @@ namespace Artemis.UI.Screens.Settings.Device.Tabs
DisplayName = "INFO";
}
- public bool IsKeyboard => Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard;
+ public bool IsKeyboard => Device.DeviceType == RGBDeviceType.Keyboard;
public ArtemisDevice Device { get; }
public string DefaultLayoutPath
diff --git a/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs
index 9ffbe769b..2935bcfe6 100644
--- a/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs
@@ -17,7 +17,7 @@ namespace Artemis.UI.Screens.Settings.Device.Tabs
public InputMappingsTabViewModel(ArtemisDevice device, IRgbService rgbService, IInputService inputService)
{
- if (device.RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Keyboard)
+ if (device.DeviceType != RGBDeviceType.Keyboard)
throw new ArtemisUIException("The input mappings tab only supports keyboards");
_rgbService = rgbService;
_inputService = inputService;
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabView.xaml
index cdf393383..eb7427a8d 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabView.xaml
+++ b/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabView.xaml
@@ -7,54 +7,410 @@
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared"
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
+ xmlns:s="https://github.com/canton7/Stylet"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance local:AboutTabViewModel}">
-
-
-
-
-
- Artemis 2
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Artemis 2
+
-
-
-
-
-
- Lead developer
-
-
-
- - Spoinky (Robert Beekman)
-
-
-
-
-
- Main contributors
-
-
-
- - DarthAffe
- - DrMeteor (Diogo Trindade)
-
-
-
-
- Special thanks
-
-
-
- - All the people on Discord providing feedback and testing
- - Aureshion - Default device images
- - kaisax - Logo design
-
-
-
+
+
+
+
-
+
+
+
+
+ PolyForm Noncommercial License 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Robert 'Spoinky' Beekman
+
+
+ Project owner, main contributor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Darth Affe
+
+
+
+ RGB.NET
+ developer, main contributor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Diogo 'DrMeteor' Trindade
+
+
+ Main contributor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kai Werling
+
+
+ Graphics design
+
+
+
+
+
+
+
+
+
+
+
+ Special thanks
+
+
+
+ - The various people creating PRs to Artemis.Plugins and the main repository
+ - All the people on Discord providing feedback and testing
+
+
+
+
+
+ External libraries
+
+
+
+ - Ben.Demystifier
+
+ https://github.com/benaadams/Ben.Demystifier
+
+ - EmbedIO
+
+ https://unosquare.github.io/embedio/
+
+ - FluentValidation
+
+ https://fluentvalidation.net/
+
+ - Furl.Http
+
+ https://flurl.dev/
+
+ - gong-wpf-dragdrop
+
+ https://github.com/punker76/gong-wpf-dragdrop
+
+ - Hardcodet.NotifyIcon.Wpf.NetCore
+
+ https://github.com/HavenDV/H.NotifyIcon.WPF
+
+ - Humanizer
+
+ https://github.com/Humanizr/Humanizer
+
+ - LiteDB
+
+ https://www.litedb.org/
+
+ - MaterialDesignThemes
+
+ https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit
+
+ - MaterialDesignExtensions
+
+ https://spiegelp.github.io/MaterialDesignExtensions/
+
+ - McMaster.NETCore.Plugins
+
+ https://github.com/natemcmaster/DotNetCorePlugins
+
+ - Newtonsoft.Json
+
+ https://www.newtonsoft.com/json
+
+ - Ninject
+
+ http://www.ninject.org/
+
+ - Ookii.Dialogs.Wpf
+
+ https://github.com/ookii-dialogs/ookii-dialogs-wpf
+
+ - RawInput.Sharp
+
+ https://github.com/mfakane/rawinput-sharp
+
+ - RGB.NET
+
+ https://github.com/DarthAffe/RGB.NET
+
+ - Serilog
+
+ https://serilog.net/
+
+ - SkiaSharp
+
+ https://github.com/mono/SkiaSharp
+
+ - Stylet
+
+ https://github.com/canton7/Stylet
+
+ - Unclassified.NetRevisionTask
+
+ https://unclassified.software/en/apps/netrevisiontask
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs
index cbf2c00ae..0f03ebc7d 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs
@@ -1,4 +1,5 @@
using System.Reflection;
+using System.Windows.Navigation;
using Artemis.Core;
using Stylet;
@@ -19,6 +20,16 @@ namespace Artemis.UI.Screens.Settings.Tabs.About
set => SetAndNotify(ref _version, value);
}
+ public void OpenHyperlink(object sender, RequestNavigateEventArgs e)
+ {
+ Core.Utilities.OpenUrl(e.Uri.AbsoluteUri);
+ }
+
+ public void OpenUrl(string url)
+ {
+ Core.Utilities.OpenUrl(url);
+ }
+
#region Overrides of Screen
///
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml
index e3f3676bf..018ed9f28 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml
+++ b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml
@@ -50,7 +50,7 @@
-
-
+
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs
index 2005b6753..3b6616a35 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs
@@ -35,7 +35,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Devices
_rgbService = rgbService;
Device = device;
- Type = Device.RgbDevice.DeviceInfo.DeviceType.ToString().Humanize();
+ Type = Device.DeviceType.ToString().Humanize();
Name = Device.RgbDevice.DeviceInfo.Model;
Manufacturer = Device.RgbDevice.DeviceInfo.Manufacturer;
}
@@ -46,8 +46,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.Devices
public string Name { get; }
public string Manufacturer { get; }
- public bool CanDetectInput => Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard ||
- Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse;
+ public bool CanDetectInput => Device.DeviceType == RGBDeviceType.Keyboard ||
+ Device.DeviceType == RGBDeviceType.Mouse;
public bool IsDeviceEnabled
{
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml
index 85d0783ab..82cad706c 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml
+++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml
@@ -15,29 +15,29 @@
-
+
+
-
-
-
+
+
-
+
+
@@ -47,7 +47,7 @@
Height="48"
Margin="0 5 0 0"
Grid.Row="0"
- Grid.RowSpan="2"
+ Grid.RowSpan="3"
HorizontalAlignment="Center"
VerticalAlignment="Top" />
@@ -59,6 +59,12 @@
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
- Plugin enabled
-
+
-
-
+
+
+ Plugin enabled
+
+
+
-
+
+
+
+
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs
index cb4dcc8ab..f25606309 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs
@@ -219,6 +219,11 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
}
}
+ public void OpenUri(Uri uri)
+ {
+ Core.Utilities.OpenUrl(uri.ToString());
+ }
+
private void PluginManagementServiceOnPluginToggled(object? sender, PluginEventArgs e)
{
NotifyOfPropertyChange(nameof(IsEnabled));
diff --git a/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs
index cd35e79f1..13e02d9b9 100644
--- a/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs
+++ b/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs
@@ -19,7 +19,7 @@ namespace Artemis.UI.Screens.SurfaceEditor.Dialogs
{
Device = device;
Title = $"{Device.RgbDevice.DeviceInfo.DeviceName} - Detect input";
- IsMouse = Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse;
+ IsMouse = Device.DeviceType == RGBDeviceType.Mouse;
_inputService = inputService;
_messageService = messageService;
diff --git a/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs
index a1c31e961..50b3bcec1 100644
--- a/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs
+++ b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs
@@ -33,8 +33,8 @@ namespace Artemis.UI.Screens.SurfaceEditor.Visualization
set => SetAndNotify(ref _selectionStatus, value);
}
- public bool CanDetectInput => Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard ||
- Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse;
+ public bool CanDetectInput => Device.DeviceType == RGBDeviceType.Keyboard ||
+ Device.DeviceType == RGBDeviceType.Mouse;
public Cursor Cursor
{
diff --git a/src/Artemis.UI/Services/DeviceLayoutService.cs b/src/Artemis.UI/Services/DeviceLayoutService.cs
index d224ae36b..536763729 100644
--- a/src/Artemis.UI/Services/DeviceLayoutService.cs
+++ b/src/Artemis.UI/Services/DeviceLayoutService.cs
@@ -52,7 +52,7 @@ namespace Artemis.UI.Services
private bool DeviceNeedsLayout(ArtemisDevice d)
{
- return d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard &&
+ return d.DeviceType == RGBDeviceType.Keyboard &&
(d.LogicalLayout == null || d.PhysicalLayout == KeyboardLayoutType.Unknown) &&
(!d.DeviceProvider.CanDetectLogicalLayout || !d.DeviceProvider.CanDetectPhysicalLayout);
}
diff --git a/src/Artemis.UI/packages.lock.json b/src/Artemis.UI/packages.lock.json
index 9a607f014..6df570a98 100644
--- a/src/Artemis.UI/packages.lock.json
+++ b/src/Artemis.UI/packages.lock.json
@@ -1448,11 +1448,6 @@
"resolved": "3.0.0",
"contentHash": "noPwJJl1Q9uparXy1ogtkmyAPGNfSGb0BLT1292nFH1jdMKje6o2kvvrQUvF9Xklj+IoiAI0UzF6Aqxlvo10lw=="
},
- "WriteableBitmapEx": {
- "type": "Transitive",
- "resolved": "1.6.7",
- "contentHash": "GoPhIdYzG/DWJq/MADb8gFzRN5PsxM+1DSJFS8Jzupg4DXqFSnlejYEjJw4ffPEUyELL07O4XIGUZydE4jQK0Q=="
- },
"artemis.core": {
"type": "Project",
"dependencies": {
@@ -1503,8 +1498,7 @@
"SkiaSharp.Views.WPF": "2.80.2",
"Stylet": "1.3.6",
"System.Buffers": "4.5.1",
- "System.Numerics.Vectors": "4.5.0",
- "WriteableBitmapEx": "1.6.7"
+ "System.Numerics.Vectors": "4.5.0"
}
}
}