aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/xcb/UiApplication.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-10-10 16:57:16 +0800
committerYuqian Yang <crupest@crupest.life>2025-10-10 16:57:16 +0800
commitdb26d6e0785f9e1a8420130f9441c72c6a842df5 (patch)
treeb861819c6e68b6e1bf10963de314cf3c6b9f09f3 /src/platform/gui/xcb/UiApplication.cpp
parent79d77619281607f9b189de21493736c61fbcac7c (diff)
downloadcru-db26d6e0785f9e1a8420130f9441c72c6a842df5.tar.gz
cru-db26d6e0785f9e1a8420130f9441c72c6a842df5.tar.bz2
cru-db26d6e0785f9e1a8420130f9441c72c6a842df5.zip
Fix text box on Linux.
Diffstat (limited to 'src/platform/gui/xcb/UiApplication.cpp')
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index 07fd5a36..a0a949b7 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -32,7 +32,7 @@ XcbUiApplication::XcbUiApplication(
this->CheckXcbConnectionError();
event_loop_.SetPoll(xcb_get_file_descriptor(connection), POLLIN,
- [this](auto) { HandleXEvents(); });
+ [this](auto) { PollAllXEvents(); });
const xcb_setup_t *setup = xcb_get_setup(connection);
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
@@ -40,6 +40,11 @@ XcbUiApplication::XcbUiApplication(
cursor_manager_ = new XcbCursorManager(this);
input_method_manager_ = new XcbXimInputMethodManager(this);
+ input_method_manager_->SetXimServerUnprocessedXEventCallback(
+ [this](xcb_key_press_event_t *event) {
+ DispatchXEventToWindows((xcb_generic_event_t *)event);
+ });
+
keyboard_manager_ = new XcbKeyboardManager(this);
clipboard_ = new XcbClipboard(this);
}
@@ -142,17 +147,21 @@ void XcbUiApplication::CancelTimer(long long id) {
return event_loop_.CancelTimer(static_cast<int>(id));
}
-void XcbUiApplication::HandleXEvents() {
+void XcbUiApplication::DispatchXEventToWindows(xcb_generic_event_t *event) {
+ auto event_xcb_window = XcbWindow::GetEventWindow(event);
+ for (auto window : windows_) {
+ if (window->GetXcbWindow() == event_xcb_window) {
+ window->HandleEvent(event);
+ break;
+ }
+ }
+}
+
+void XcbUiApplication::PollAllXEvents() {
xcb_generic_event_t *event;
while ((event = xcb_poll_for_event(xcb_connection_))) {
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;
- }
- }
+ DispatchXEventToWindows(event);
}
::free(event);
}