diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/platform/gui/Window.h | 2 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/InputMethod.h | 8 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/Keyboard.h | 26 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/UiApplication.h | 3 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/Window.h | 3 |
5 files changed, 38 insertions, 4 deletions
diff --git a/include/cru/platform/gui/Window.h b/include/cru/platform/gui/Window.h index 885c1250..06fbdb65 100644 --- a/include/cru/platform/gui/Window.h +++ b/include/cru/platform/gui/Window.h @@ -43,7 +43,7 @@ struct NativeKeyEventArgs { // Represents a native window, which exposes some low-level events and // operations. -struct INativeWindow : virtual IPlatformResource { +struct CRU_PLATFORM_GUI_API INativeWindow : virtual IPlatformResource { virtual bool IsCreated(); virtual void Close() = 0; diff --git a/include/cru/platform/gui/xcb/InputMethod.h b/include/cru/platform/gui/xcb/InputMethod.h index 286f3158..0c928b24 100644 --- a/include/cru/platform/gui/xcb/InputMethod.h +++ b/include/cru/platform/gui/xcb/InputMethod.h @@ -1,5 +1,6 @@ #pragma once +#include <cru/base/Base.h> #include "../InputMethod.h" #include "Base.h" @@ -12,6 +13,8 @@ class XcbUiApplication; class XcbWindow; class XcbXimInputMethodManager : public XcbResource { + CRU_DEFINE_CLASS_LOG_TAG("cru::platform::gui::xcb::XcbXimInputMethodManager") + friend XcbUiApplication; public: @@ -25,14 +28,19 @@ 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, public virtual IInputMethodContext { + CRU_DEFINE_CLASS_LOG_TAG("cru::platform::gui::xcb::XcbXimInputMethodContext") + friend XcbXimInputMethodManager; public: diff --git a/include/cru/platform/gui/xcb/Keyboard.h b/include/cru/platform/gui/xcb/Keyboard.h index 41b4abee..e1fc7fec 100644 --- a/include/cru/platform/gui/xcb/Keyboard.h +++ b/include/cru/platform/gui/xcb/Keyboard.h @@ -3,13 +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); -KeyCode XorgKeycodeToCruKeyCode(XcbUiApplication* application, xcb_keycode_t keycode); -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 diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h index e330ba7c..d9bef0c3 100644 --- a/include/cru/platform/gui/xcb/Window.h +++ b/include/cru/platform/gui/xcb/Window.h @@ -2,6 +2,7 @@ #pragma once #include "../../GraphicsBase.h" #include "../Window.h" +#include "../TimerHelper.h" #include "Base.h" #include <cairo.h> @@ -117,6 +118,8 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { XcbWindow* parent_; XcbXimInputMethodContext* input_method_; + TimerAutoCanceler repaint_canceler_; + Event<std::nullptr_t> create_event_; Event<std::nullptr_t> destroy_event_; Event<std::nullptr_t> paint_event_; |