aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/xcb/Window.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/Window.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/Window.cpp')
-rw-r--r--src/platform/gui/xcb/Window.cpp24
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);