diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-30 00:16:13 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-10-03 00:13:54 +0800 |
commit | e903083732b0d4638ac066fc85b030b121d8e7e6 (patch) | |
tree | e9a871e71705fa83242e75cca6d9431390b8f755 /src/platform/gui/xcb/Keyboard.cpp | |
parent | 44487b61e5c2b89318f9a4a85c67df9aad7884e1 (diff) | |
download | cru-e903083732b0d4638ac066fc85b030b121d8e7e6.tar.gz cru-e903083732b0d4638ac066fc85b030b121d8e7e6.tar.bz2 cru-e903083732b0d4638ac066fc85b030b121d8e7e6.zip |
Impl input method for xim 2.
Diffstat (limited to 'src/platform/gui/xcb/Keyboard.cpp')
-rw-r--r-- | src/platform/gui/xcb/Keyboard.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/src/platform/gui/xcb/Keyboard.cpp b/src/platform/gui/xcb/Keyboard.cpp index e5f6da8e..c52f7cc1 100644 --- a/src/platform/gui/xcb/Keyboard.cpp +++ b/src/platform/gui/xcb/Keyboard.cpp @@ -1,9 +1,11 @@ #include "cru/platform/gui/xcb/Keyboard.h" #include "cru/base/Guard.h" +#include "cru/base/StringUtil.h" #include "cru/platform/gui/Keyboard.h" #include "cru/platform/gui/xcb/UiApplication.h" #include <xcb/xcb.h> +#include <xcb/xproto.h> #include <bitset> #include <climits> #include <unordered_map> @@ -74,8 +76,8 @@ KeyCode XorgKeysymToKeyCode(xcb_keysym_t keysym) { } } -KeyCode XorgKeycodeToCruKeyCode(XcbUiApplication *application, - xcb_keycode_t keycode) { +std::vector<xcb_keysym_t> XorgKeycodeToKeysyms(XcbUiApplication *application, + xcb_keycode_t keycode) { auto connection = application->GetXcbConnection(); auto setup = xcb_get_setup(connection); auto min_keycode = setup->min_keycode; @@ -93,14 +95,41 @@ KeyCode XorgKeycodeToCruKeyCode(XcbUiApplication *application, auto keysyms_per_keycode = mapping_reply->keysyms_per_keycode; auto *keysyms = xcb_get_keyboard_mapping_keysyms(mapping_reply); + std::vector<xcb_keysym_t> result; for (int i = 0; i < keysyms_per_keycode; i++) { - auto result = XorgKeysymToKeyCode(keysyms[i]); + result.push_back(keysyms[i]); + } + return result; +} + +KeyCode XorgKeycodeToCruKeyCode(XcbUiApplication *application, + xcb_keycode_t keycode) { + auto keysyms = XorgKeycodeToKeysyms(application, keycode); + + for (auto keysym : keysyms) { + auto result = XorgKeysymToKeyCode(keysym); if (result != KeyCode::Unknown) return result; } return KeyCode::Unknown; } +std::string XorgKeysymToUtf8(xcb_keysym_t keysym) { + if (0x20 <= keysym && keysym <= 0x7e || 0xa0 <= keysym && keysym <= 0xff) { + return std::string{static_cast<char>(keysym)}; + } + + if (0x01000100 <= keysym && keysym <= 0x0110FFFF) { + auto code_point = keysym - 0x01000000; + std::string result; + Utf8EncodeCodePointAppend(keysym, + [&result](char c) { result.push_back(c); }); + return result; + } + + return {}; +} + namespace { using KeymapBitset = std::bitset<sizeof(std::declval<xcb_query_keymap_reply_t>().keys) * |