aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/gui
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/platform/gui')
-rw-r--r--include/cru/platform/gui/xcb/InputMethod.h5
-rw-r--r--include/cru/platform/gui/xcb/Keyboard.h28
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h3
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