diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-30 00:16:13 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-30 00:16:13 +0800 |
commit | 35ba6a2f719327e2ee3f31d5baa04f0ec5a0a09e (patch) | |
tree | 92db6b8b40d409a4faf06c3600111eec200f4775 /src/platform/gui/xcb/UiApplication.cpp | |
parent | 5862307366f4b7db492f1630bdf21ce240d8dd6c (diff) | |
download | cru-35ba6a2f719327e2ee3f31d5baa04f0ec5a0a09e.tar.gz cru-35ba6a2f719327e2ee3f31d5baa04f0ec5a0a09e.tar.bz2 cru-35ba6a2f719327e2ee3f31d5baa04f0ec5a0a09e.zip |
Impl input method for xim.
Diffstat (limited to 'src/platform/gui/xcb/UiApplication.cpp')
-rw-r--r-- | src/platform/gui/xcb/UiApplication.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp index 1e5613b4..03e39985 100644 --- a/src/platform/gui/xcb/UiApplication.cpp +++ b/src/platform/gui/xcb/UiApplication.cpp @@ -5,6 +5,7 @@ #include "cru/platform/graphics/cairo/CairoGraphicsFactory.h" #include "cru/platform/gui/Window.h" #include "cru/platform/gui/xcb/Cursor.h" +#include "cru/platform/gui/xcb/InputMethod.h" #include "cru/platform/gui/xcb/Window.h" #include <poll.h> @@ -36,9 +37,11 @@ XcbUiApplication::XcbUiApplication( this->screen_ = iter.data; cursor_manager_ = new XcbCursorManager(this); + input_method_manager_ = new XcbXimInputMethodManager(this); } XcbUiApplication::~XcbUiApplication() { + delete input_method_manager_; delete cursor_manager_; xcb_disconnect(this->xcb_connection_); @@ -80,6 +83,10 @@ xcb_atom_t XcbUiApplication::GetOrCreateXcbAtom(std::string name) { return atom; } +XcbXimInputMethodManager *XcbUiApplication::GetXcbXimInputMethodManager() { + return input_method_manager_; +} + int XcbUiApplication::Run() { auto exit_code = event_loop_.Run(); @@ -128,11 +135,13 @@ void XcbUiApplication::CancelTimer(long long id) { void XcbUiApplication::HandleXEvents() { xcb_generic_event_t *event; while ((event = xcb_poll_for_event(xcb_connection_))) { - auto event_xcb_window = XcbWindow::GetEventWindow(event); - for (auto window : windows_) { - if (window->GetXcbWindow() == event_xcb_window) { - window->HandleEvent(event); - break; + if (!input_method_manager_->HandleXEvent(event)) { + auto event_xcb_window = XcbWindow::GetEventWindow(event); + for (auto window : windows_) { + if (window->GetXcbWindow() == event_xcb_window) { + window->HandleEvent(event); + break; + } } } ::free(event); |