aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-22 14:58:02 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-22 21:40:13 +0800
commit3e8b388f022816344cfc9df40656741a4c597c9f (patch)
treef80dbe7bb8621ddcca524cf8bd119b904659b86e
parent70e9404912e0047f14861abc8d4e3982c23685fd (diff)
downloadcru-3e8b388f022816344cfc9df40656741a4c597c9f.tar.gz
cru-3e8b388f022816344cfc9df40656741a4c597c9f.tar.bz2
cru-3e8b388f022816344cfc9df40656741a4c597c9f.zip
Impl GetMousePosition Capture/ReleaseMouse of xcb window.
-rw-r--r--include/cru/platform/gui/xcb/Window.h7
-rw-r--r--src/platform/gui/xcb/Window.cpp22
2 files changed, 25 insertions, 4 deletions
diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h
index 346cbd55..d9c2e8da 100644
--- a/include/cru/platform/gui/xcb/Window.h
+++ b/include/cru/platform/gui/xcb/Window.h
@@ -44,11 +44,10 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
bool RequestFocus() override;
- // Relative to client lefttop.
- virtual Point GetMousePosition() = 0;
+ Point GetMousePosition() override;
- virtual bool CaptureMouse() = 0;
- virtual bool ReleaseMouse() = 0;
+ bool CaptureMouse() override;
+ bool ReleaseMouse() override;
virtual void SetCursor(std::shared_ptr<ICursor> cursor) = 0;
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index 3e5c7f7b..4d28e6e6 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -238,6 +238,28 @@ bool XcbWindow::RequestFocus() {
return true;
}
+Point XcbWindow::GetMousePosition() {
+ auto window = xcb_window_.value_or(application_->GetFirstXcbScreen()->root);
+ auto cookie = xcb_query_pointer(application_->GetXcbConnection(), window);
+ auto reply = xcb_query_pointer_reply(application_->GetXcbConnection(), cookie,
+ nullptr);
+ return Point(reply->win_x, reply->win_y);
+}
+
+bool XcbWindow::CaptureMouse() {
+ if (!xcb_window_) return false;
+ xcb_grab_pointer(application_->GetXcbConnection(), FALSE, *xcb_window_, 0,
+ XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE,
+ XCB_CURSOR_NONE, XCB_CURRENT_TIME);
+ return true;
+}
+
+bool XcbWindow::ReleaseMouse() {
+ if (!xcb_window_) return false;
+ xcb_ungrab_pointer(application_->xcb_connection_, XCB_CURRENT_TIME);
+ return true;
+}
+
std::unique_ptr<graphics::IPainter> XcbWindow::BeginPaint() {
assert(cairo_surface_);