diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-22 14:58:02 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-22 21:40:13 +0800 |
commit | 3e8b388f022816344cfc9df40656741a4c597c9f (patch) | |
tree | f80dbe7bb8621ddcca524cf8bd119b904659b86e /src/platform/gui/xcb | |
parent | 70e9404912e0047f14861abc8d4e3982c23685fd (diff) | |
download | cru-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.cpp | 22 |
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_); |