diff options
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); |