diff options
Diffstat (limited to 'include/cru/platform/gui')
-rw-r--r-- | include/cru/platform/gui/xcb/InputMethod.h | 5 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/Keyboard.h | 28 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/UiApplication.h | 3 |
3 files changed, 30 insertions, 6 deletions
diff --git a/include/cru/platform/gui/xcb/InputMethod.h b/include/cru/platform/gui/xcb/InputMethod.h index a325c1da..0c928b24 100644 --- a/include/cru/platform/gui/xcb/InputMethod.h +++ b/include/cru/platform/gui/xcb/InputMethod.h @@ -1,8 +1,8 @@ #pragma once +#include <cru/base/Base.h> #include "../InputMethod.h" #include "Base.h" -#include <cru/base/Base.h> #include <xcb-imdkit/imclient.h> #include <xcb/xcb.h> @@ -28,10 +28,13 @@ class XcbXimInputMethodManager : public XcbResource { void DispatchComposition(xcb_xim_t* im, xcb_xic_t ic, CompositionText text); bool HandleXEvent(xcb_generic_event_t* event); + void SetXimServerUnprocessedXEventCallback( + std::function<void(xcb_key_press_event_t* event)> callback); private: XcbUiApplication* application_; xcb_xim_t* im_; + std::function<void(xcb_key_press_event_t* event)> forward_event_callback_; }; class XcbXimInputMethodContext : public XcbResource, diff --git a/include/cru/platform/gui/xcb/Keyboard.h b/include/cru/platform/gui/xcb/Keyboard.h index a3e66e2b..e1fc7fec 100644 --- a/include/cru/platform/gui/xcb/Keyboard.h +++ b/include/cru/platform/gui/xcb/Keyboard.h @@ -3,15 +3,33 @@ #include <cru/platform/gui/Keyboard.h> #include <xcb/xcb.h> +#include <xkbcommon/xkbcommon.h> #include <unordered_map> namespace cru::platform::gui::xcb { struct XcbUiApplication; -KeyCode XorgKeysymToKeyCode(xcb_keysym_t keysym); -std::vector<xcb_keysym_t> XorgKeycodeToKeysyms(XcbUiApplication* application, xcb_keycode_t keycode); -KeyCode XorgKeycodeToCruKeyCode(XcbUiApplication* application, xcb_keycode_t keycode); -std::string XorgKeysymToUtf8(xcb_keysym_t keysym, bool upper = false); -std::unordered_map<KeyCode, bool> GetKeyboardState(XcbUiApplication* application); +KeyCode XorgKeysymToCruKeyCode(xcb_keysym_t keysym); +std::vector<xcb_keysym_t> XorgKeycodeToKeysyms(XcbUiApplication* application, + xcb_keycode_t keycode); +KeyCode XorgKeycodeToCruKeyCode(XcbUiApplication* application, + xcb_keycode_t keycode); +std::unordered_map<KeyCode, bool> GetKeyboardState( + XcbUiApplication* application); KeyModifier GetCurrentKeyModifiers(XcbUiApplication* application); + +class XcbKeyboardManager { + public: + explicit XcbKeyboardManager(XcbUiApplication* application); + ~XcbKeyboardManager(); + + std::string KeysymToUtf8(xcb_keysym_t keysym); + std::string KeycodeToUtf8(xcb_keycode_t keycode); + + private: + XcbUiApplication* application_; + xkb_context* xkb_context_; + xkb_keymap* xkb_keymap_; + xkb_state* xkb_state_; +}; } // namespace cru::platform::gui::xcb diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index d6971099..72dd542a 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -14,6 +14,7 @@ namespace cru::platform::gui::xcb { class XcbWindow; class XcbCursorManager; class XcbXimInputMethodManager; +class XcbKeyboardManager; class XcbUiApplication : public XcbResource, public virtual IUiApplication { friend XcbWindow; @@ -51,6 +52,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { #undef CRU_XCB_UI_APPLICATION_DEFINE_XCB_ATOM XcbXimInputMethodManager* GetXcbXimInputMethodManager(); + XcbKeyboardManager* GetXcbKeyboardManager(); public: int Run() override; @@ -104,5 +106,6 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { XcbCursorManager* cursor_manager_; XcbXimInputMethodManager* input_method_manager_; + XcbKeyboardManager* keyboard_manager_; }; } // namespace cru::platform::gui::xcb |