blob: 61a0b96a38062f0927e41c2eb9f5a018227f8a27 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_KEY_CODE_MAP_INTERNAL_H_
#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_KEY_CODE_MAP_INTERNAL_H_
#import <UIKit/UIKit.h>
#include <map>
#include <set>
/**
* Maps iOS-specific key code values representing |PhysicalKeyboardKey|.
*
* MacOS doesn't provide a scan code, but a virtual keycode to represent a
* physical key.
*/
extern const std::map<uint32_t, uint64_t> keyCodeToPhysicalKey;
/**
* A map from iOS key codes to Flutter's logical key values.
*
* This is used to derive logical keys that can't or shouldn't be derived from
* |charactersIgnoringModifiers|.
*/
extern const std::map<uint32_t, uint64_t> keyCodeToLogicalKey;
// Several mask constants. See KeyCodeMap.mm for their descriptions.
extern const uint64_t kValueMask;
extern const uint64_t kUnicodePlane;
extern const uint64_t kIosPlane;
/**
* The physical key for CapsLock, which needs special handling.
*/
extern const uint64_t kCapsLockPhysicalKey;
/**
* The logical key for CapsLock, which needs special handling.
*/
extern const uint64_t kCapsLockLogicalKey;
/**
* Bits in |UIKey.modifierFlags| indicating whether a modifier key is pressed.
*/
typedef enum {
// These sided flags are not in any official Apple docs, they are derived from
// experiments.
kModifierFlagControlLeft = 0x1,
kModifierFlagShiftLeft = 0x2,
kModifierFlagShiftRight = 0x4,
kModifierFlagMetaLeft = 0x8,
kModifierFlagMetaRight = 0x10,
kModifierFlagAltLeft = 0x20,
kModifierFlagAltRight = 0x40,
kModifierFlagControlRight = 0x2000,
// These are equivalent to non-sided iOS values.
kModifierFlagCapsLock = UIKeyModifierAlphaShift, // 0x010000
kModifierFlagShiftAny = UIKeyModifierShift, // 0x020000
kModifierFlagControlAny = UIKeyModifierControl, // 0x040000
kModifierFlagAltAny = UIKeyModifierAlternate, // 0x080000
kModifierFlagMetaAny = UIKeyModifierCommand, // 0x100000
kModifierFlagNumPadKey = UIKeyModifierNumericPad // 0x200000
} ModifierFlag;
/**
* A mask of all the modifier flags that represent a modifier being pressed, but
* not whether it is the left or right modifier.
*/
constexpr uint32_t kModifierFlagAnyMask =
kModifierFlagShiftAny | kModifierFlagControlAny | kModifierFlagAltAny |
kModifierFlagMetaAny;
/**
* A mask of the modifier flags that represent only left or right modifier
* keys, and not the generic "Any" mask.
*/
constexpr uint32_t kModifierFlagSidedMask =
kModifierFlagControlLeft | kModifierFlagShiftLeft |
kModifierFlagShiftRight | kModifierFlagMetaLeft | kModifierFlagMetaRight |
kModifierFlagAltLeft | kModifierFlagAltRight | kModifierFlagControlRight;
/**
* Map |UIKey.keyCode| to the matching sided modifier in UIEventModifierFlags.
*/
extern const std::map<uint32_t, ModifierFlag> keyCodeToModifierFlag;
/**
* Map a bit of bitmask of sided modifiers in UIEventModifierFlags to their
* corresponding |UIKey.keyCode|.
*/
extern const std::map<ModifierFlag, uint32_t> modifierFlagToKeyCode;
/**
* Maps a sided modifier key to the corresponding flag matching either side of
* that type of modifier.
*/
extern const std::map<ModifierFlag, ModifierFlag> sidedModifierToAny;
/**
* Maps a non-sided modifier key to the corresponding flag matching the left key
* of that type of modifier.
*/
extern const std::map<ModifierFlag, ModifierFlag> anyModifierToLeft;
/**
* A set of keycodes corresponding to function keys.
*/
extern const std::set<uint32_t> functionKeyCodes;
#endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_KEY_CODE_MAP_INTERNAL_H_