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/Window.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/Window.cpp')
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index d45d68b2..2b4d57d9 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -10,16 +10,15 @@ #include "cru/platform/gui/Keyboard.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/Keyboard.h" #include "cru/platform/gui/xcb/UiApplication.h" #include <cairo-xcb.h> #include <cairo.h> #include <xcb/xcb.h> -#include <xcb/xproto.h> #include <algorithm> #include <cassert> -#include <cinttypes> #include <cstdint> #include <memory> #include <optional> @@ -68,9 +67,14 @@ XcbWindow::XcbWindow(XcbUiApplication *application) cairo_surface_(nullptr), parent_(nullptr) { application->RegisterWindow(this); + input_method_ = new XcbXimInputMethodContext( + application->GetXcbXimInputMethodManager(), this); } -XcbWindow::~XcbWindow() { application_->UnregisterWindow(this); } +XcbWindow::~XcbWindow() { + delete input_method_; + application_->UnregisterWindow(this); +} bool XcbWindow::IsCreated() { return xcb_window_.has_value(); } @@ -351,10 +355,22 @@ IEvent<NativeKeyEventArgs> *XcbWindow::KeyDownEvent() { IEvent<NativeKeyEventArgs> *XcbWindow::KeyUpEvent() { return &key_up_event_; } -IInputMethodContext *XcbWindow::GetInputMethodContext() { return nullptr; } +IInputMethodContext *XcbWindow::GetInputMethodContext() { + return input_method_; +} std::optional<xcb_window_t> XcbWindow::GetXcbWindow() { return xcb_window_; } +XcbUiApplication *XcbWindow::GetXcbUiApplication() { return application_; } + +bool XcbWindow::HasFocus() { + if (!xcb_window_) return false; + auto cookie = xcb_get_input_focus(application_->GetXcbConnection()); + auto focus = xcb_get_input_focus_reply(application_->GetXcbConnection(), + cookie, nullptr); + return focus->focus == *xcb_window_; +} + xcb_window_t XcbWindow::DoCreateWindow() { assert(xcb_window_ == std::nullopt); assert(cairo_surface_ == nullptr); |