| using System.Globalization; | |
| using UnityEngine.InputSystem.LowLevel; | |
| using UnityEngine.Scripting; | |
| namespace UnityEngine.InputSystem.Controls | |
| { | |
| /// <summary> | |
| /// A key on a <see cref="Keyboard"/>. | |
| /// </summary> | |
| /// <remarks> | |
| /// This is an extended button control which adds various features to account for the fact that keys | |
| /// have symbols associated with them which may change depending on keyboard layout as well as in combination | |
| /// with other keys. | |
| /// | |
| /// Note that there is no text input associated with individual keys as text composition is highly | |
| /// layout specific and does not need to be key-by-key. For general text input, see <see cref="Keyboard.onTextInput"/>. | |
| /// To find the text displayed on a key, use <see cref="InputControl.displayName"/>. | |
| /// </remarks> | |
| public class KeyControl : ButtonControl | |
| { | |
| /// <summary> | |
| /// The code used in Unity to identify the key. | |
| /// </summary> | |
| /// <remarks> | |
| /// This property must be initialized by <see cref="InputControl.FinishSetup"/> of | |
| /// the device owning the control. | |
| /// </remarks> | |
| public Key keyCode { get; set; } | |
| ////REVIEW: rename this to something like platformKeyCode? We're not really dealing with scan code here. | |
| /// <summary> | |
| /// The code that the underlying platform uses to identify the key. | |
| /// </summary> | |
| public int scanCode | |
| { | |
| get | |
| { | |
| RefreshConfigurationIfNeeded(); | |
| return m_ScanCode; | |
| } | |
| } | |
| protected override void RefreshConfiguration() | |
| { | |
| // Wipe our last cached set of data (if any). | |
| displayName = null; | |
| m_ScanCode = 0; | |
| var command = QueryKeyNameCommand.Create(keyCode); | |
| if (device.ExecuteCommand(ref command) > 0) | |
| { | |
| m_ScanCode = command.scanOrKeyCode; | |
| var rawKeyName = command.ReadKeyName(); | |
| if (string.IsNullOrEmpty(rawKeyName)) | |
| { | |
| displayName = rawKeyName; | |
| return; | |
| } | |
| var textInfo = CultureInfo.InvariantCulture.TextInfo; | |
| // We need to lower case first because ToTitleCase preserves upper casing. | |
| // For example on Swedish Windows layout right shift display name is "HÖGER SKIFT". | |
| // Just passing it to ToTitleCase won't change anything. But passing "höger skift" will return "Höger Skift". | |
| var keyNameLowerCase = textInfo.ToLower(rawKeyName); | |
| if (string.IsNullOrEmpty(keyNameLowerCase)) | |
| { | |
| displayName = rawKeyName; | |
| return; | |
| } | |
| displayName = textInfo.ToTitleCase(keyNameLowerCase); | |
| } | |
| } | |
| // Cached configuration data for the key. We fetch this from the | |
| // device on demand. | |
| private int m_ScanCode; | |
| } | |
| } | |