aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/xcb/Window.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-11 22:19:32 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-11 22:19:32 +0800
commit4122cffc95a05ecc2a136ce30bf64f3492812443 (patch)
tree4f26067f8b7303447dcc1506c45fdc99f8489d72 /src/platform/gui/xcb/Window.cpp
parentfe6e1686ce484cb0dd9a69f130e82f647c30016f (diff)
downloadcru-4122cffc95a05ecc2a136ce30bf64f3492812443.tar.gz
cru-4122cffc95a05ecc2a136ce30bf64f3492812443.tar.bz2
cru-4122cffc95a05ecc2a136ce30bf64f3492812443.zip
xcb window style flag.
Diffstat (limited to 'src/platform/gui/xcb/Window.cpp')
-rw-r--r--src/platform/gui/xcb/Window.cpp45
1 files changed, 38 insertions, 7 deletions
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index 9dd510e9..9b72789b 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -76,13 +76,16 @@ INativeWindow *XcbWindow::GetParent() { return parent_; }
void XcbWindow::SetParent(INativeWindow *parent) {
parent_ = CheckPlatform<XcbWindow>(parent, GetPlatformIdUtf8());
if (xcb_window_) {
- auto real_parent = application_->GetFirstXcbScreen()->root;
- if (parent_ && parent_->xcb_window_) {
- real_parent = *parent_->xcb_window_;
- }
- xcb_reparent_window(application_->GetXcbConnection(), *xcb_window_,
- real_parent, 0, 0);
- // TODO: Maybe restore position?
+ DoSetParent(*xcb_window_);
+ }
+}
+
+WindowStyleFlag XcbWindow::GetStyleFlag() { return style_; }
+
+void XcbWindow::SetStyleFlag(WindowStyleFlag flag) {
+ style_ = flag;
+ if (xcb_window_) {
+ DoSetStyleFlags(*xcb_window_);
}
}
@@ -160,6 +163,9 @@ xcb_window_t XcbWindow::DoCreateWindow() {
screen->root_visual, mask, values);
current_size_ = Size(width, height);
+ DoSetStyleFlags(window);
+ DoSetParent(window);
+
xcb_visualtype_t *visual_type;
for (xcb_depth_iterator_t depth_iter =
@@ -361,4 +367,29 @@ std::optional<xcb_window_t> XcbWindow::GetEventWindow(
return std::nullopt;
}
}
+
+void XcbWindow::DoSetParent(xcb_window_t window) {
+ auto real_parent =
+ application_->GetFirstXcbScreen()->root; // init to desktop
+ if (parent_ && parent_->xcb_window_) {
+ real_parent = *parent_->xcb_window_;
+ }
+ xcb_reparent_window(application_->GetXcbConnection(), window, real_parent, 0,
+ 0);
+ // TODO: Maybe restore position?
+}
+
+void XcbWindow::DoSetStyleFlags(xcb_window_t window) {
+ std::vector<xcb_atom_t> atoms;
+ if (style_.Has(WindowStyleFlags::NoCaptionAndBorder)) {
+ atoms = {application_->GetXcbAtom_NET_WM_WINDOW_TYPE_UTILITY()};
+ } else {
+ atoms = {application_->GetXcbAtom_NET_WM_WINDOW_TYPE_NORMAL()};
+ }
+
+ xcb_change_property(application_->GetXcbConnection(), XCB_PROP_MODE_REPLACE,
+ window, application_->GetXcbAtom_NET_WM_WINDOW_TYPE(),
+ XCB_ATOM_ATOM, 32, atoms.size(), atoms.data());
+}
+
} // namespace cru::platform::gui::xcb