aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/xcb
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 /src/platform/gui/xcb
parent70e9404912e0047f14861abc8d4e3982c23685fd (diff)
downloadcru-3e8b388f022816344cfc9df40656741a4c597c9f.tar.gz
cru-3e8b388f022816344cfc9df40656741a4c597c9f.tar.bz2
cru-3e8b388f022816344cfc9df40656741a4c597c9f.zip
Impl GetMousePosition Capture/ReleaseMouse of xcb window.
Diffstat (limited to 'src/platform/gui/xcb')
-rw-r--r--src/platform/gui/xcb/Window.cpp22
1 files changed, 22 insertions, 0 deletions
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_);