aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h1
-rw-r--r--include/cru/platform/gui/xcb/Window.h6
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp4
-rw-r--r--src/platform/gui/xcb/Window.cpp18
4 files changed, 27 insertions, 2 deletions
diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h
index 87fd1063..cc38b3ed 100644
--- a/include/cru/platform/gui/xcb/UiApplication.h
+++ b/include/cru/platform/gui/xcb/UiApplication.h
@@ -31,6 +31,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication {
xcb_screen_t* GetFirstXcbScreen();
xcb_atom_t GetOrCreateXcbAtom(std::string name);
+ xcb_atom_t GetXcbAtom_NET_WM_NAME();
xcb_atom_t GetXcbAtom_NET_WM_WINDOW_TYPE();
xcb_atom_t GetXcbAtom_NET_WM_WINDOW_TYPE_NORMAL();
xcb_atom_t GetXcbAtom_NET_WM_WINDOW_TYPE_UTILITY();
diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h
index 43cd3b53..f118ed66 100644
--- a/include/cru/platform/gui/xcb/Window.h
+++ b/include/cru/platform/gui/xcb/Window.h
@@ -26,8 +26,8 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
WindowStyleFlag GetStyleFlag() override;
void SetStyleFlag(WindowStyleFlag flag) override;
- virtual String GetTitle() = 0;
- virtual void SetTitle(String title) = 0;
+ String GetTitle() override;
+ void SetTitle(String title) override;
virtual WindowVisibilityType GetVisibility() = 0;
virtual void SetVisibility(WindowVisibilityType visibility) = 0;
@@ -90,6 +90,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
void DoSetParent(xcb_window_t window);
void DoSetStyleFlags(xcb_window_t window);
+ void DoSetTitle(xcb_window_t window);
private:
XcbUiApplication* application_;
@@ -97,6 +98,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
cairo_surface_t* cairo_surface_;
Size current_size_;
WindowStyleFlag style_;
+ std::string title_;
XcbWindow* parent_;
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index 2fceac30..e5cab19f 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -63,6 +63,10 @@ xcb_atom_t XcbUiApplication::GetOrCreateXcbAtom(std::string name) {
return atom;
}
+xcb_atom_t XcbUiApplication::GetXcbAtom_NET_WM_NAME() {
+ return GetOrCreateXcbAtom("_NET_WM_NAME");
+}
+
xcb_atom_t XcbUiApplication::GetXcbAtom_NET_WM_WINDOW_TYPE() {
return GetOrCreateXcbAtom("_NET_WM_WINDOW_TYPE");
}
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index 9b72789b..b56b8fa9 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -89,6 +89,15 @@ void XcbWindow::SetStyleFlag(WindowStyleFlag flag) {
}
}
+String XcbWindow::GetTitle() { return String::FromUtf8(title_); }
+
+void XcbWindow::SetTitle(String title) {
+ title_ = title.ToUtf8();
+ if (xcb_window_) {
+ DoSetTitle(*xcb_window_);
+ }
+}
+
std::unique_ptr<graphics::IPainter> XcbWindow::BeginPaint() {
assert(cairo_surface_);
@@ -392,4 +401,13 @@ void XcbWindow::DoSetStyleFlags(xcb_window_t window) {
XCB_ATOM_ATOM, 32, atoms.size(), atoms.data());
}
+void XcbWindow::DoSetTitle(xcb_window_t window) {
+ for (auto atom : {static_cast<xcb_atom_t>(XCB_ATOM_WM_NAME),
+ application_->GetXcbAtom_NET_WM_NAME()}) {
+ xcb_change_property(application_->GetXcbConnection(), XCB_PROP_MODE_REPLACE,
+ window, atom, XCB_ATOM_STRING, 8, title_.size(),
+ title_.data());
+ }
+}
+
} // namespace cru::platform::gui::xcb