aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/xcb/UiApplication.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-30 00:16:13 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-30 00:16:13 +0800
commit35ba6a2f719327e2ee3f31d5baa04f0ec5a0a09e (patch)
tree92db6b8b40d409a4faf06c3600111eec200f4775 /src/platform/gui/xcb/UiApplication.cpp
parent5862307366f4b7db492f1630bdf21ce240d8dd6c (diff)
downloadcru-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.cpp19
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);