aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/gui/xcb
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/platform/gui/xcb')
-rw-r--r--include/cru/platform/gui/xcb/InputMethod.h8
-rw-r--r--include/cru/platform/gui/xcb/Keyboard.h26
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h3
-rw-r--r--include/cru/platform/gui/xcb/Window.h3
4 files changed, 37 insertions, 3 deletions
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_;