Skip to content

Commit 1803b60

Browse files
committed
Fixed an issue where using the subscript operator for IMESelected (obsolete key) would result in null KeyControl being returned.
1 parent a3d8078 commit 1803b60

File tree

3 files changed

+186
-21
lines changed

3 files changed

+186
-21
lines changed

Assets/Tests/InputSystem/CoreTests_Devices_Keyboard.cs

Lines changed: 144 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,150 @@
88

99
partial class CoreTests
1010
{
11+
private static readonly Key[] sKeys = Enum.GetValues(typeof(Key)).Cast<Key>().ToArray();
12+
1113
[Test]
1214
[Category("Devices")]
1315
public void Devices_Keyboard_CanGetKeyCodeFromKeyboardKey()
1416
{
1517
var keyboard = InputSystem.AddDevice<Keyboard>();
1618

19+
Assert.That(keyboard.spaceKey.keyCode, Is.EqualTo(Key.Space));
20+
Assert.That(keyboard.enterKey.keyCode, Is.EqualTo(Key.Enter));
21+
Assert.That(keyboard.tabKey.keyCode, Is.EqualTo(Key.Tab));
22+
Assert.That(keyboard.backquoteKey.keyCode, Is.EqualTo(Key.Backquote));
23+
Assert.That(keyboard.quoteKey.keyCode, Is.EqualTo(Key.Quote));
24+
Assert.That(keyboard.semicolonKey.keyCode, Is.EqualTo(Key.Semicolon));
25+
Assert.That(keyboard.commaKey.keyCode, Is.EqualTo(Key.Comma));
26+
Assert.That(keyboard.periodKey.keyCode, Is.EqualTo(Key.Period));
27+
Assert.That(keyboard.slashKey.keyCode, Is.EqualTo(Key.Slash));
28+
Assert.That(keyboard.backslashKey.keyCode, Is.EqualTo(Key.Backslash));
29+
Assert.That(keyboard.leftBracketKey.keyCode, Is.EqualTo(Key.LeftBracket));
30+
Assert.That(keyboard.rightBracketKey.keyCode, Is.EqualTo(Key.RightBracket));
31+
Assert.That(keyboard.minusKey.keyCode, Is.EqualTo(Key.Minus));
32+
Assert.That(keyboard.equalsKey.keyCode, Is.EqualTo(Key.Equals));
33+
1734
Assert.That(keyboard.aKey.keyCode, Is.EqualTo(Key.A));
1835
Assert.That(keyboard.bKey.keyCode, Is.EqualTo(Key.B));
1936
Assert.That(keyboard.cKey.keyCode, Is.EqualTo(Key.C));
2037
Assert.That(keyboard.dKey.keyCode, Is.EqualTo(Key.D));
2138
Assert.That(keyboard.eKey.keyCode, Is.EqualTo(Key.E));
2239
Assert.That(keyboard.fKey.keyCode, Is.EqualTo(Key.F));
2340
Assert.That(keyboard.gKey.keyCode, Is.EqualTo(Key.G));
24-
// TODO Make this complete
41+
Assert.That(keyboard.hKey.keyCode, Is.EqualTo(Key.H));
42+
Assert.That(keyboard.iKey.keyCode, Is.EqualTo(Key.I));
43+
Assert.That(keyboard.jKey.keyCode, Is.EqualTo(Key.J));
44+
Assert.That(keyboard.kKey.keyCode, Is.EqualTo(Key.K));
45+
Assert.That(keyboard.lKey.keyCode, Is.EqualTo(Key.L));
46+
Assert.That(keyboard.mKey.keyCode, Is.EqualTo(Key.M));
47+
Assert.That(keyboard.nKey.keyCode, Is.EqualTo(Key.N));
48+
Assert.That(keyboard.oKey.keyCode, Is.EqualTo(Key.O));
49+
Assert.That(keyboard.pKey.keyCode, Is.EqualTo(Key.P));
50+
Assert.That(keyboard.qKey.keyCode, Is.EqualTo(Key.Q));
51+
Assert.That(keyboard.rKey.keyCode, Is.EqualTo(Key.R));
52+
Assert.That(keyboard.sKey.keyCode, Is.EqualTo(Key.S));
53+
Assert.That(keyboard.tKey.keyCode, Is.EqualTo(Key.T));
54+
Assert.That(keyboard.uKey.keyCode, Is.EqualTo(Key.U));
55+
Assert.That(keyboard.vKey.keyCode, Is.EqualTo(Key.V));
56+
Assert.That(keyboard.wKey.keyCode, Is.EqualTo(Key.W));
57+
Assert.That(keyboard.xKey.keyCode, Is.EqualTo(Key.X));
58+
Assert.That(keyboard.yKey.keyCode, Is.EqualTo(Key.Y));
59+
Assert.That(keyboard.zKey.keyCode, Is.EqualTo(Key.Z));
60+
61+
Assert.That(keyboard.digit1Key.keyCode, Is.EqualTo(Key.Digit1));
62+
Assert.That(keyboard.digit2Key.keyCode, Is.EqualTo(Key.Digit2));
63+
Assert.That(keyboard.digit3Key.keyCode, Is.EqualTo(Key.Digit3));
64+
Assert.That(keyboard.digit4Key.keyCode, Is.EqualTo(Key.Digit4));
65+
Assert.That(keyboard.digit5Key.keyCode, Is.EqualTo(Key.Digit5));
66+
Assert.That(keyboard.digit6Key.keyCode, Is.EqualTo(Key.Digit6));
67+
Assert.That(keyboard.digit7Key.keyCode, Is.EqualTo(Key.Digit7));
68+
Assert.That(keyboard.digit8Key.keyCode, Is.EqualTo(Key.Digit8));
69+
Assert.That(keyboard.digit9Key.keyCode, Is.EqualTo(Key.Digit9));
70+
Assert.That(keyboard.digit0Key.keyCode, Is.EqualTo(Key.Digit0));
71+
72+
Assert.That(keyboard.leftShiftKey.keyCode, Is.EqualTo(Key.LeftShift));
73+
Assert.That(keyboard.rightShiftKey.keyCode, Is.EqualTo(Key.RightShift));
74+
Assert.That(keyboard.leftAltKey.keyCode, Is.EqualTo(Key.LeftAlt));
75+
Assert.That(keyboard.rightAltKey.keyCode, Is.EqualTo(Key.RightAlt));
76+
Assert.That(keyboard.leftCtrlKey.keyCode, Is.EqualTo(Key.LeftCtrl));
77+
Assert.That(keyboard.rightCtrlKey.keyCode, Is.EqualTo(Key.RightCtrl));
78+
Assert.That(keyboard.leftMetaKey.keyCode, Is.EqualTo(Key.LeftMeta));
79+
Assert.That(keyboard.rightMetaKey.keyCode, Is.EqualTo(Key.RightMeta));
80+
Assert.That(keyboard.leftWindowsKey.keyCode, Is.EqualTo(Key.LeftWindows));
81+
Assert.That(keyboard.rightWindowsKey.keyCode, Is.EqualTo(Key.RightWindows));
82+
Assert.That(keyboard.leftAppleKey.keyCode, Is.EqualTo(Key.LeftApple));
83+
Assert.That(keyboard.rightAppleKey.keyCode, Is.EqualTo(Key.RightApple));
84+
Assert.That(keyboard.leftCommandKey.keyCode, Is.EqualTo(Key.LeftCommand));
85+
Assert.That(keyboard.rightCommandKey.keyCode, Is.EqualTo(Key.RightCommand));
86+
Assert.That(keyboard.contextMenuKey.keyCode, Is.EqualTo(Key.ContextMenu));
87+
Assert.That(keyboard.escapeKey.keyCode, Is.EqualTo(Key.Escape));
88+
Assert.That(keyboard.leftArrowKey.keyCode, Is.EqualTo(Key.LeftArrow));
89+
Assert.That(keyboard.rightArrowKey.keyCode, Is.EqualTo(Key.RightArrow));
90+
Assert.That(keyboard.upArrowKey.keyCode, Is.EqualTo(Key.UpArrow));
91+
Assert.That(keyboard.downArrowKey.keyCode, Is.EqualTo(Key.DownArrow));
92+
Assert.That(keyboard.backspaceKey.keyCode, Is.EqualTo(Key.Backspace));
93+
Assert.That(keyboard.pageDownKey.keyCode, Is.EqualTo(Key.PageDown));
94+
Assert.That(keyboard.pageUpKey.keyCode, Is.EqualTo(Key.PageUp));
95+
Assert.That(keyboard.homeKey.keyCode, Is.EqualTo(Key.Home));
96+
Assert.That(keyboard.endKey.keyCode, Is.EqualTo(Key.End));
97+
Assert.That(keyboard.insertKey.keyCode, Is.EqualTo(Key.Insert));
98+
Assert.That(keyboard.deleteKey.keyCode, Is.EqualTo(Key.Delete));
99+
Assert.That(keyboard.capsLockKey.keyCode, Is.EqualTo(Key.CapsLock));
100+
Assert.That(keyboard.scrollLockKey.keyCode, Is.EqualTo(Key.ScrollLock));
101+
Assert.That(keyboard.numLockKey.keyCode, Is.EqualTo(Key.NumLock));
102+
Assert.That(keyboard.printScreenKey.keyCode, Is.EqualTo(Key.PrintScreen));
103+
Assert.That(keyboard.pauseKey.keyCode, Is.EqualTo(Key.Pause));
104+
Assert.That(keyboard.numpadEnterKey.keyCode, Is.EqualTo(Key.NumpadEnter));
105+
Assert.That(keyboard.numpadDivideKey.keyCode, Is.EqualTo(Key.NumpadDivide));
106+
Assert.That(keyboard.numpadMultiplyKey.keyCode, Is.EqualTo(Key.NumpadMultiply));
107+
Assert.That(keyboard.numpadMinusKey.keyCode, Is.EqualTo(Key.NumpadMinus));
108+
Assert.That(keyboard.numpadPlusKey.keyCode, Is.EqualTo(Key.NumpadPlus));
109+
Assert.That(keyboard.numpadPeriodKey.keyCode, Is.EqualTo(Key.NumpadPeriod));
110+
Assert.That(keyboard.numpadEqualsKey.keyCode, Is.EqualTo(Key.NumpadEquals));
111+
Assert.That(keyboard.numpad0Key.keyCode, Is.EqualTo(Key.Numpad0));
112+
Assert.That(keyboard.numpad1Key.keyCode, Is.EqualTo(Key.Numpad1));
113+
Assert.That(keyboard.numpad2Key.keyCode, Is.EqualTo(Key.Numpad2));
114+
Assert.That(keyboard.numpad3Key.keyCode, Is.EqualTo(Key.Numpad3));
115+
Assert.That(keyboard.numpad4Key.keyCode, Is.EqualTo(Key.Numpad4));
116+
Assert.That(keyboard.numpad5Key.keyCode, Is.EqualTo(Key.Numpad5));
117+
Assert.That(keyboard.numpad6Key.keyCode, Is.EqualTo(Key.Numpad6));
118+
Assert.That(keyboard.numpad7Key.keyCode, Is.EqualTo(Key.Numpad7));
119+
Assert.That(keyboard.numpad8Key.keyCode, Is.EqualTo(Key.Numpad8));
120+
Assert.That(keyboard.numpad9Key.keyCode, Is.EqualTo(Key.Numpad9));
121+
Assert.That(keyboard.f1Key.keyCode, Is.EqualTo(Key.F1));
122+
Assert.That(keyboard.f2Key.keyCode, Is.EqualTo(Key.F2));
123+
Assert.That(keyboard.f3Key.keyCode, Is.EqualTo(Key.F3));
124+
Assert.That(keyboard.f4Key.keyCode, Is.EqualTo(Key.F4));
125+
Assert.That(keyboard.f5Key.keyCode, Is.EqualTo(Key.F5));
126+
Assert.That(keyboard.f6Key.keyCode, Is.EqualTo(Key.F6));
127+
Assert.That(keyboard.f7Key.keyCode, Is.EqualTo(Key.F7));
128+
Assert.That(keyboard.f8Key.keyCode, Is.EqualTo(Key.F8));
129+
Assert.That(keyboard.f9Key.keyCode, Is.EqualTo(Key.F9));
130+
Assert.That(keyboard.f10Key.keyCode, Is.EqualTo(Key.F10));
131+
Assert.That(keyboard.f11Key.keyCode, Is.EqualTo(Key.F11));
132+
Assert.That(keyboard.f12Key.keyCode, Is.EqualTo(Key.F12));
133+
Assert.That(keyboard.oem1Key.keyCode, Is.EqualTo(Key.OEM1));
134+
Assert.That(keyboard.oem2Key.keyCode, Is.EqualTo(Key.OEM2));
135+
Assert.That(keyboard.oem3Key.keyCode, Is.EqualTo(Key.OEM3));
136+
Assert.That(keyboard.oem4Key.keyCode, Is.EqualTo(Key.OEM4));
137+
Assert.That(keyboard.oem5Key.keyCode, Is.EqualTo(Key.OEM5));
138+
Assert.That(keyboard.f13Key.keyCode, Is.EqualTo(Key.F13));
139+
Assert.That(keyboard.f14Key.keyCode, Is.EqualTo(Key.F14));
140+
Assert.That(keyboard.f15Key.keyCode, Is.EqualTo(Key.F15));
141+
Assert.That(keyboard.f16Key.keyCode, Is.EqualTo(Key.F16));
142+
Assert.That(keyboard.f17Key.keyCode, Is.EqualTo(Key.F17));
143+
Assert.That(keyboard.f18Key.keyCode, Is.EqualTo(Key.F18));
144+
Assert.That(keyboard.f19Key.keyCode, Is.EqualTo(Key.F19));
145+
Assert.That(keyboard.f20Key.keyCode, Is.EqualTo(Key.F20));
146+
Assert.That(keyboard.f21Key.keyCode, Is.EqualTo(Key.F21));
147+
Assert.That(keyboard.f22Key.keyCode, Is.EqualTo(Key.F22));
148+
Assert.That(keyboard.f23Key.keyCode, Is.EqualTo(Key.F23));
149+
Assert.That(keyboard.f24Key.keyCode, Is.EqualTo(Key.F24));
150+
Assert.That(keyboard.mediaPlayPause.keyCode, Is.EqualTo(Key.MediaPlayPause));
151+
Assert.That(keyboard.mediaRewind.keyCode, Is.EqualTo(Key.MediaRewind));
152+
Assert.That(keyboard.mediaForward.keyCode, Is.EqualTo(Key.MediaForward));
25153
}
26-
154+
27155
[Test, Description("https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1541")]
28156
[Category("Devices")]
29157
public void Devices_Keyboard_AllKeysEnumeratesAllKeyControls()
@@ -37,16 +165,21 @@ public void Devices_Keyboard_AllKeysEnumeratesAllKeyControls()
37165
Assert.NotNull(key, $"Key at index {index++} was null");
38166
}
39167
}
40-
168+
41169
[Test]
42170
[Category("Devices")]
43171
public void Devices_Keyboard_AllKeysShouldContainKeyControlsCorrespondingToAllKeys()
44172
{
45173
var keyboard = InputSystem.AddDevice<Keyboard>();
46174
var allKeys = keyboard.allKeys;
47-
foreach (var key in Enum.GetValues(typeof(Key)).Cast<Key>())
175+
foreach (var key in sKeys)
48176
{
49-
Assert.That(allKeys.Contains(keyboard.spaceKey), Is.True);
177+
// Key.None is documented as an invalid key so skip it in this test.
178+
// Sub-script operator is documented to through for invalid key.
179+
if (key == Key.None)
180+
continue;
181+
182+
Assert.That(allKeys.Contains(keyboard[key]), Is.True);
50183
}
51184
}
52185

@@ -55,15 +188,13 @@ public void Devices_Keyboard_AllKeysShouldContainKeyControlsCorrespondingToAllKe
55188
public void Devices_Keyboard_SubscriptOperatorCanLookupKeyControlOfCorrespondingKey()
56189
{
57190
var keyboard = InputSystem.AddDevice<Keyboard>();
58-
foreach (var key in Enum.GetValues(typeof(Key)).Cast<Key>())
191+
foreach (var key in sKeys)
59192
{
60-
// Key.None is documented as an invalid key so skip it in this test and instead we verify in test below
61-
// that exception is thrown if attempting to lookup key-control using it.
193+
// Key.None is documented as an invalid key so skip it in this test.
194+
// Sub-script operator is documented to through for invalid key.
62195
if (key == Key.None)
63196
continue;
64-
if (key == Key.IMESelected)
65-
continue;
66-
197+
67198
var keyControl = keyboard[key];
68199
Assert.That(keyControl, Is.Not.Null);
69200
Assert.That(keyControl.keyCode, Is.EqualTo(key));
@@ -76,9 +207,9 @@ public void Devices_Keyboard_SubscriptOperatorThrowsForInvalidOrOutOfRangeKey()
76207
{
77208
var keyboard = InputSystem.AddDevice<Keyboard>();
78209
var minKey = Enum.GetValues(typeof(Key)).Cast<Key>().Min();
79-
var invalidMin = (Key)((int)minKey)-1;
210+
var invalidMin = (Key)((int)minKey) - 1;
80211
var maxKey = Enum.GetValues(typeof(Key)).Cast<Key>().Max();
81-
var invalidMax = (Key)((int)maxKey)+1;
212+
var invalidMax = (Key)((int)maxKey) + 1;
82213
Assert.Throws<ArgumentOutOfRangeException>(() => { _ = keyboard[Key.None]; });
83214
Assert.Throws<ArgumentOutOfRangeException>(() => { _ = keyboard[invalidMin]; });
84215
Assert.Throws<ArgumentOutOfRangeException>(() => { _ = keyboard[invalidMax]; });

Packages/com.unity.inputsystem/InputSystem/Devices/Keyboard.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public unsafe struct KeyboardState : IInputStateTypeInfo
156156
[InputControl(name = "f8", displayName = "F8", layout = "Key", bit = (int)Key.F8)]
157157
[InputControl(name = "f9", displayName = "F9", layout = "Key", bit = (int)Key.F9)]
158158
[InputControl(name = "f10", displayName = "F10", layout = "Key", bit = (int)Key.F10)]
159+
159160
[InputControl(name = "f11", displayName = "F11", layout = "Key", bit = (int)Key.F11)]
160161
[InputControl(name = "f12", displayName = "F12", layout = "Key", bit = (int)Key.F12)]
161162
[InputControl(name = "OEM1", layout = "Key", bit = (int)Key.OEM1)]
@@ -179,6 +180,10 @@ public unsafe struct KeyboardState : IInputStateTypeInfo
179180
[InputControl(name = "mediaRewind", displayName = "MediaRewind", layout = "Key", bit = (int)Key.MediaRewind)]
180181
[InputControl(name = "mediaForward", displayName = "MediaForward", layout = "Key", bit = (int)Key.MediaForward)]
181182
[InputControl(name = "IMESelected", layout = "Button", bit = (int)KeyEx.RemappedIMESelected, synthetic = true)] // Use the last bit to hold IME selected state.
183+
// Disable deprecation warning to not generate warnings in user project about internal use of deprecated key
184+
#pragma warning disable 0618
185+
[InputControl(name = "IMESelectedObsoleteKey", layout = "Key", bit = (int)KeyEx.RemappedIMESelected, synthetic = true)]
186+
#pragma warning restore 0618
182187
public fixed byte keys[kSizeInBytes];
183188

184189
// will be the default in new editor [InputControl(name = "IMESelected", layout = "Button", bit = 0, sizeInBits = 1, synthetic = true)]
@@ -2370,7 +2375,9 @@ public KeyControl this[Key key]
23702375
{
23712376
var index = (int)key - 1;
23722377
if (index < 0 || index >= m_Keys.Length)
2373-
throw new ArgumentOutOfRangeException(nameof(key));
2378+
{
2379+
throw new ArgumentOutOfRangeException($"{nameof(key)}: {key}");
2380+
}
23742381
return m_Keys[index];
23752382
}
23762383
}
@@ -2560,7 +2567,7 @@ protected override void FinishSetup()
25602567
"oem3",
25612568
"oem4",
25622569
"oem5",
2563-
null, // IMESelected
2570+
"IMESelectedObsoleteKey", // IMESelected
25642571
"f13",
25652572
"f14",
25662573
"f15",
@@ -2580,8 +2587,6 @@ protected override void FinishSetup()
25802587
m_Keys = new KeyControl[keyStrings.Length];
25812588
for (var i = 0; i < keyStrings.Length; ++i)
25822589
{
2583-
if (string.IsNullOrEmpty(keyStrings[i]))
2584-
continue;
25852590
m_Keys[i] = GetChildControl<KeyControl>(keyStrings[i]);
25862591

25872592
////REVIEW: Ideally, we'd have a way to do this through layouts; this way nested key controls could work, too,

0 commit comments

Comments
 (0)