diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-22 14:58:02 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-22 14:58:02 +0800 |
commit | 8bde78e1a008ba5ba95ea54ff03717baf53d4170 (patch) | |
tree | c131a074a2c842627d96f74abc8e7f18b23a4cf1 /src | |
parent | e31b0b8b37ae52e9402dc351e5fb0f361d30d0e0 (diff) | |
download | cru-8bde78e1a008ba5ba95ea54ff03717baf53d4170.tar.gz cru-8bde78e1a008ba5ba95ea54ff03717baf53d4170.tar.bz2 cru-8bde78e1a008ba5ba95ea54ff03717baf53d4170.zip |
Impl client rect of xcb window.
Diffstat (limited to 'src')
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index 188f62b8..1dbef489 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -177,6 +177,30 @@ void XcbWindow::SetVisibility(WindowVisibilityType visibility) { } } +Size XcbWindow::GetClientSize() { return GetClientRect().GetSize(); } + +void XcbWindow::SetClientSize(const Size &size) { + auto rect = GetClientRect(); + SetClientRect(Rect(rect.GetLeftTop(), size)); +} + +Rect XcbWindow::GetClientRect() { + if (!xcb_window_) { + return Rect{}; + } + auto cookie = + xcb_get_geometry(application_->GetXcbConnection(), *xcb_window_); + auto reply = + xcb_get_geometry_reply(application_->GetXcbConnection(), cookie, nullptr); + return Rect(reply->x + reply->border_width, reply->y + reply->border_width, + reply->width, reply->height); +} + +void XcbWindow::SetClientRect(const Rect &rect) { + if (!xcb_window_) return; + DoSetClientRect(*xcb_window_, rect); +} + std::unique_ptr<graphics::IPainter> XcbWindow::BeginPaint() { assert(cairo_surface_); @@ -493,6 +517,17 @@ void XcbWindow::DoSetTitle(xcb_window_t window) { } } +void XcbWindow::DoSetClientRect(xcb_window_t window, const Rect &rect) { + std::uint32_t values[4]{static_cast<std::uint32_t>(rect.left), + static_cast<std::uint32_t>(rect.top), + static_cast<std::uint32_t>(rect.width), + static_cast<std::uint32_t>(rect.height)}; + xcb_configure_window(application_->GetXcbConnection(), window, + XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | + XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, + values); +} + void *XcbWindow::XcbGetProperty(xcb_window_t window, xcb_atom_t property, xcb_atom_t type, std::uint32_t offset, std::uint32_t length, |