aboutsummaryrefslogtreecommitdiff
path: root/src
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 14:58:02 +0800
commit8bde78e1a008ba5ba95ea54ff03717baf53d4170 (patch)
treec131a074a2c842627d96f74abc8e7f18b23a4cf1 /src
parente31b0b8b37ae52e9402dc351e5fb0f361d30d0e0 (diff)
downloadcru-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.cpp35
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,