From d2f4452fc8f9aa7a24b72614184dfe20a66452f3 Mon Sep 17 00:00:00 2001 From: kimci86 Date: Sun, 17 Dec 2023 18:38:54 +0100 Subject: [PATCH] Use EnumArray for Key or Scancode-indexed arrays --- src/SFML/Window/DRM/InputImpl.cpp | 6 ++--- src/SFML/Window/Unix/KeyboardImpl.cpp | 32 +++++++++++------------ src/SFML/Window/Win32/InputImpl.cpp | 16 +++++------- src/SFML/Window/macOS/HIDInputManager.hpp | 8 +++--- src/SFML/Window/macOS/HIDInputManager.mm | 14 +++++----- 5 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/SFML/Window/DRM/InputImpl.cpp b/src/SFML/Window/DRM/InputImpl.cpp index 3e88dc816..603618179 100644 --- a/src/SFML/Window/DRM/InputImpl.cpp +++ b/src/SFML/Window/DRM/InputImpl.cpp @@ -63,7 +63,7 @@ sf::Vector2i mousePos; // current mouse position std::vector fileDescriptors; // list of open file descriptors for /dev/input sf::priv::EnumArray mouseMap{}; // track whether mouse buttons are down -std::vector keyMap(sf::Keyboard::KeyCount, false); // track whether keys are down +sf::priv::EnumArray keyMap{}; // track whether keys are down int touchFd = -1; // file descriptor we have seen MT events on; assumes only 1 std::vector touchSlots; // track the state of each touch "slot" @@ -427,7 +427,7 @@ bool eventProcess(sf::Event& event) event.key.shift = shiftDown(); event.key.system = systemDown(); - keyMap[static_cast(kb)] = inputEvent.value; + keyMap[kb] = inputEvent.value; if (special && inputEvent.value) doDeferredText = special; @@ -578,7 +578,7 @@ bool isKeyPressed(Keyboard::Key key) return false; update(); - return keyMap[static_cast(key)]; + return keyMap[key]; } diff --git a/src/SFML/Window/Unix/KeyboardImpl.cpp b/src/SFML/Window/Unix/KeyboardImpl.cpp index 8f2ae4add..53ecdbfcc 100644 --- a/src/SFML/Window/Unix/KeyboardImpl.cpp +++ b/src/SFML/Window/Unix/KeyboardImpl.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -37,6 +38,7 @@ #include #include +#include #include #include #include @@ -46,10 +48,10 @@ namespace { -const KeyCode nullKeyCode = 0; -const int maxKeyCode = 256; -KeyCode scancodeToKeycode[sf::Keyboard::ScancodeCount]; ///< Mapping of SFML scancode to X11 KeyCode -sf::Keyboard::Scancode keycodeToScancode[maxKeyCode]; ///< Mapping of X11 KeyCode to SFML scancode +const KeyCode nullKeyCode = 0; +const int maxKeyCode = 256; +sf::priv::EnumArray scancodeToKeycode; ///< Mapping of SFML scancode to X11 KeyCode +std::array keycodeToScancode; ///< Mapping of X11 KeyCode to SFML scancode //////////////////////////////////////////////////////////// bool isValidKeycode(KeyCode keycode) @@ -460,11 +462,8 @@ void ensureMapping() return; // Phase 1: Initialize mappings with default values - for (auto& keycode : scancodeToKeycode) - keycode = nullKeyCode; - - for (auto& scancode : keycodeToScancode) - scancode = sf::Keyboard::Scan::Unknown; + scancodeToKeycode.fill(nullKeyCode); + keycodeToScancode.fill(sf::Keyboard::Scan::Unknown); // Phase 2: Get XKB names with key code Display* display = sf::priv::openDisplay(); @@ -493,9 +492,9 @@ void ensureMapping() scancode = mappedScancode->second; if (scancode != sf::Keyboard::Scan::Unknown) - scancodeToKeycode[static_cast(scancode)] = static_cast(keycode); + scancodeToKeycode[scancode] = static_cast(keycode); - keycodeToScancode[keycode] = scancode; + keycodeToScancode[static_cast(keycode)] = scancode; } XkbFreeNames(descriptor, XkbKeyNamesMask, True); @@ -508,11 +507,10 @@ void ensureMapping() { scancode = translateKeyCode(display, static_cast(keycode)); - if (scancode != sf::Keyboard::Scan::Unknown && - scancodeToKeycode[static_cast(scancode)] == nullKeyCode) - scancodeToKeycode[static_cast(scancode)] = static_cast(keycode); + if (scancode != sf::Keyboard::Scan::Unknown && scancodeToKeycode[scancode] == nullKeyCode) + scancodeToKeycode[scancode] = static_cast(keycode); - keycodeToScancode[keycode] = scancode; + keycodeToScancode[static_cast(keycode)] = scancode; } } @@ -528,7 +526,7 @@ KeyCode scancodeToKeyCode(sf::Keyboard::Scancode code) ensureMapping(); if (code != sf::Keyboard::Scan::Unknown) - return scancodeToKeycode[static_cast(code)]; + return scancodeToKeycode[code]; return nullKeyCode; } @@ -563,7 +561,7 @@ KeyCode keyToKeyCode(sf::Keyboard::Key key) // Fallback for when XKeysymToKeycode cannot tell the KeyCode for XK_Alt_R if (key == sf::Keyboard::RAlt) - return scancodeToKeycode[static_cast(sf::Keyboard::Scan::RAlt)]; + return scancodeToKeycode[sf::Keyboard::Scan::RAlt]; return nullKeyCode; } diff --git a/src/SFML/Window/Win32/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index c8c9cb5fb..c4524fe12 100644 --- a/src/SFML/Window/Win32/InputImpl.cpp +++ b/src/SFML/Window/Win32/InputImpl.cpp @@ -28,13 +28,14 @@ #include #include +#include #include #include namespace { -sf::Keyboard::Scancode keyToScancodeMapping[sf::Keyboard::KeyCount]; ///< Mapping from Key to Scancode -sf::Keyboard::Key scancodeToKeyMapping[sf::Keyboard::ScancodeCount]; ///< Mapping from Scancode to Key +sf::priv::EnumArray keyToScancodeMapping; ///< Mapping from Key to Scancode +sf::priv::EnumArray scancodeToKeyMapping; ///< Mapping from Scancode to Key sf::Keyboard::Key virtualKeyToSfKey(UINT virtualKey) { @@ -520,11 +521,8 @@ void ensureMappings() return; // Phase 1: Initialize mappings with default values - for (auto& scancode : keyToScancodeMapping) - scancode = sf::Keyboard::Scan::Unknown; - - for (auto& key : scancodeToKeyMapping) - key = sf::Keyboard::Unknown; + keyToScancodeMapping.fill(sf::Keyboard::Scan::Unknown); + scancodeToKeyMapping.fill(sf::Keyboard::Key::Unknown); // Phase 2: Translate scancode to virtual code to key names for (unsigned int i = 0; i < sf::Keyboard::ScancodeCount; ++i) @@ -534,7 +532,7 @@ void ensureMappings() const sf::Keyboard::Key key = virtualKeyToSfKey(virtualKey); if (key != sf::Keyboard::Unknown && keyToScancodeMapping[key] == sf::Keyboard::Scan::Unknown) keyToScancodeMapping[key] = scan; - scancodeToKeyMapping[static_cast(scan)] = key; + scancodeToKeyMapping[scan] = key; } isMappingInitialized = true; @@ -578,7 +576,7 @@ Keyboard::Key localize(Keyboard::Scancode code) ensureMappings(); - return scancodeToKeyMapping[static_cast(code)]; + return scancodeToKeyMapping[code]; } diff --git a/src/SFML/Window/macOS/HIDInputManager.hpp b/src/SFML/Window/macOS/HIDInputManager.hpp index 5b70d902f..5b55dc474 100644 --- a/src/SFML/Window/macOS/HIDInputManager.hpp +++ b/src/SFML/Window/macOS/HIDInputManager.hpp @@ -286,10 +286,10 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - IOHIDManagerRef m_manager{}; ///< Underlying HID Manager - IOHIDElements m_keys[Keyboard::ScancodeCount]; ///< All the keys on any connected keyboard - Keyboard::Scancode m_keyToScancodeMapping[Keyboard::KeyCount]{}; ///< Mapping from Key to Scancode - Keyboard::Key m_scancodeToKeyMapping[Keyboard::ScancodeCount]{}; ///< Mapping from Scancode to Key + IOHIDManagerRef m_manager{}; ///< Underlying HID Manager + EnumArray m_keys; ///< All the keys on any connected keyboard + EnumArray m_keyToScancodeMapping{}; ///< Mapping from Key to Scancode + EnumArray m_scancodeToKeyMapping{}; ///< Mapping from Scancode to Key //////////////////////////////////////////////////////////// /// m_keys' index corresponds to sf::Keyboard::Scancode enum. diff --git a/src/SFML/Window/macOS/HIDInputManager.mm b/src/SFML/Window/macOS/HIDInputManager.mm index a3a425bbb..23b8bf9d1 100644 --- a/src/SFML/Window/macOS/HIDInputManager.mm +++ b/src/SFML/Window/macOS/HIDInputManager.mm @@ -562,7 +562,7 @@ bool HIDInputManager::isKeyPressed(Keyboard::Key key) //////////////////////////////////////////////////////////// bool HIDInputManager::isKeyPressed(Keyboard::Scancode code) { - return (code != Keyboard::Scan::Unknown) && isPressed(m_keys[static_cast(code)]); + return (code != Keyboard::Scan::Unknown) && isPressed(m_keys[code]); } @@ -572,7 +572,7 @@ Keyboard::Key HIDInputManager::localize(Keyboard::Scancode code) if (code == Keyboard::Scan::Unknown) return Keyboard::Unknown; - return m_scancodeToKeyMapping[static_cast(code)]; + return m_scancodeToKeyMapping[code]; } @@ -795,7 +795,7 @@ void HIDInputManager::loadKey(IOHIDElementRef key) if (code != Keyboard::Scan::Unknown) { CFRetain(key); - m_keys[static_cast(code)].push_back(key); + m_keys[code].push_back(key); } } @@ -804,10 +804,8 @@ void HIDInputManager::loadKey(IOHIDElementRef key) void HIDInputManager::buildMappings() { // Reset the mappings - for (auto& scancode : m_keyToScancodeMapping) - scancode = Keyboard::Scan::Unknown; - for (auto& key : m_scancodeToKeyMapping) - key = Keyboard::Unknown; + m_keyToScancodeMapping.fill(Keyboard::Scan::Unknown); + m_scancodeToKeyMapping.fill(Keyboard::Key::Unknown); // Get the current keyboard layout TISInputSourceRef tis = TISCopyCurrentKeyboardLayoutInputSource(); @@ -899,7 +897,7 @@ void HIDInputManager::buildMappings() // Register the bi-mapping if (m_keyToScancodeMapping[code] == Keyboard::Scan::Unknown) m_keyToScancodeMapping[code] = scan; - m_scancodeToKeyMapping[static_cast(scan)] = code; + m_scancodeToKeyMapping[scan] = code; } CFRelease(tis);