81 lines
3.0 KiB
C#
81 lines
3.0 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|