// Copyright 2020 The Chromium 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 COMPONENTS_EXO_XKB_TRACKER_H_ #define COMPONENTS_EXO_XKB_TRACKER_H_ #include #include #include "ui/base/buildflags.h" #if BUILDFLAG(USE_XKBCOMMON) #include #include "base/memory/free_deleter.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/scoped_xkb.h" // nogncheck #include "ui/events/ozone/layout/xkb/xkb_modifier_converter.h" #endif namespace exo { struct KeyboardModifiers; // Tracks the state of XKB. If Chrome is configured not to link against // libxkbcommon this class is empty. // TODO(hidehiko): Share the state between wl_keyboard and zwp_text_input. class XkbTracker { public: XkbTracker(); XkbTracker(const XkbTracker&) = delete; XkbTracker& operator=(const XkbTracker&) = delete; ~XkbTracker(); #if BUILDFLAG(USE_XKBCOMMON) // Updates the XKB keymap based on the given keyboard layout name. void UpdateKeyboardLayout(const std::string& name); // Updates the XKB modifier state. |modifier_flags| is a bitset of // ui::EventFlags. void UpdateKeyboardModifiers(int modifier_flags); // Returns the keysym for the given XKB keycode, based on the current // keymap and its modifier state. uint32_t GetKeysym(uint32_t xkb_keycode) const; // Returns the XKB keymap data. std::unique_ptr GetKeymap() const; // Returns the current keyboard modifiers. KeyboardModifiers GetModifiers() const; private: void UpdateKeyboardLayoutInternal(const xkb_rule_names* names); void UpdateKeyboardModifiersInternal(); // Keeps the modifiers, so that modifiers can be recalculated // on keyboard layout update. // For CrOS we treat numlock as always on. int modifier_flags_ = ui::EF_NUM_LOCK_ON; // The XKB state used for the keyboard. std::unique_ptr xkb_context_{ xkb_context_new(XKB_CONTEXT_NO_FLAGS)}; std::unique_ptr xkb_keymap_; std::unique_ptr xkb_state_; ui::XkbModifierConverter xkb_modifier_converter_{{}}; #endif // BUILDFLAG(USE_XKBCOMMON) }; } // namespace exo #endif // COMPONENTS_EXO_XKB_TRACKER_H_