Index: ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h |
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..44f678aca062f83201f7220c898d63fd921b93a1 |
--- /dev/null |
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h |
@@ -0,0 +1,86 @@ |
+// Copyright 2014 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 UI_EVENTS_OZONE_LAYOUT_XKB_XKB_KEYBOARD_LAYOUT_ENGINE_H_ |
+#define UI_EVENTS_OZONE_LAYOUT_XKB_XKB_KEYBOARD_LAYOUT_ENGINE_H_ |
+ |
+#include <xkbcommon/xkbcommon.h> |
+ |
+#include "base/containers/hash_tables.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/strings/string16.h" |
+#include "ui/events/ozone/layout/events_ozone_layout_export.h" |
+#include "ui/events/ozone/layout/keyboard_layout_engine.h" |
+ |
+namespace ui { |
+ |
+class EVENTS_OZONE_LAYOUT_EXPORT XkbKeyCodeConverter { |
spang
2014/12/08 22:47:29
move to separate header
kpschoedel
2014/12/15 19:48:46
Done.
|
+ public: |
+ XkbKeyCodeConverter(); |
+ virtual ~XkbKeyCodeConverter(); |
+ xkb_keycode_t InvalidXkbKeyCode() const { return invalid_xkb_keycode_; } |
+ virtual xkb_keycode_t DomCodeToXkbKeyCode(DomCode dom_code) const = 0; |
+ |
+ protected: |
+ xkb_keycode_t invalid_xkb_keycode_; |
+}; |
+ |
+class EVENTS_OZONE_LAYOUT_EXPORT XkbKeyboardLayoutEngine |
+ : public KeyboardLayoutEngine { |
+ public: |
+ XkbKeyboardLayoutEngine(const XkbKeyCodeConverter& converter); |
+ virtual ~XkbKeyboardLayoutEngine(); |
+ |
+ // KeyboardLayoutEngine: |
+ virtual bool CanSetCurrentLayout() const override; |
+ virtual bool SetCurrentLayoutByName(const std::string& layout_name) override; |
+ |
+ virtual bool UsesISOLevel5Shift() const override; |
+ virtual bool UsesAltGr() const override; |
+ |
+ virtual bool Lookup(DomCode dom_code, |
+ int flags, |
+ DomKey* dom_key, |
+ base::char16* character, |
+ KeyboardCode* key_code) const override; |
+ |
+ private: |
+ // Sets a new XKB keymap, updating object fields. |
+ void SetKeymap(xkb_keymap* keymap); |
+ |
+ // Returns the XKB modifiers flags corresponding to the given EventFlags. |
+ xkb_mod_mask_t EventFlagsToXkbFlags(int ui_flags) const; |
+ |
+ // Determines the XKB KeySym and character associated with a key. |
+ // Returns true on success. |
+ bool XkbLookup(xkb_keycode_t xkb_keycode, |
+ xkb_mod_mask_t xkb_flags, |
+ xkb_keysym_t* xkb_keysym, |
+ base::char16* character) const; |
+ |
+ // Maps DomCode to xkb_keycode_t. |
+ const XkbKeyCodeConverter& key_code_converter_; |
+ |
+ // libxkbcommon uses explicit reference counting for its structures, |
spang
2014/12/08 22:47:29
Can you move these general-purpose typedefs to a n
kpschoedel
2014/12/15 19:48:46
OK, though I wouldn't call them general-purpose —
|
+ // so we need to trigger its cleanup. |
+ struct XkbContextDeleter { |
+ void operator()(xkb_context* context) { xkb_context_unref(context); } |
+ }; |
+ scoped_ptr<xkb_context, XkbContextDeleter> xkb_context_; |
+ struct XkbstateDeleter { |
+ void operator()(xkb_state* state) { xkb_state_unref(state); } |
+ }; |
+ scoped_ptr<xkb_state, XkbstateDeleter> xkb_state_; |
+ |
+ // Table for EventFlagsToXkbFlags(). |
+ struct XkbFlagMapEntry { |
+ int ui_flag; |
+ xkb_mod_mask_t xkb_flag; |
+ }; |
+ std::vector<XkbFlagMapEntry> xkb_flag_map_; |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_EVENTS_OZONE_LAYOUT_XKB_XKB_KEYBOARD_LAYOUT_ENGINE_H_ |