aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/CMakeLists.txt2
-rw-r--r--src/platform/Exception.cpp2
-rw-r--r--src/platform/ForDllExport.cpp2
-rw-r--r--src/platform/Resource.cpp7
-rw-r--r--src/platform/gui/xcb/Window.cpp25
5 files changed, 33 insertions, 5 deletions
diff --git a/src/platform/CMakeLists.txt b/src/platform/CMakeLists.txt
index 63ef9058..cfa9e74d 100644
--- a/src/platform/CMakeLists.txt
+++ b/src/platform/CMakeLists.txt
@@ -1,8 +1,8 @@
add_library(CruPlatformBase
- ForDllExport.cpp
Color.cpp
Exception.cpp
GraphicsBase.cpp
+ Resource.cpp
)
target_link_libraries(CruPlatformBase PUBLIC CruBase)
target_compile_definitions(CruPlatformBase PRIVATE CRU_PLATFORM_EXPORT_API)
diff --git a/src/platform/Exception.cpp b/src/platform/Exception.cpp
index d5ae4702..744404e0 100644
--- a/src/platform/Exception.cpp
+++ b/src/platform/Exception.cpp
@@ -8,7 +8,7 @@
namespace cru::platform {
PlatformNotMatchException::PlatformNotMatchException(
std::string resource_platform, std::string target_platform,
- std::optional<std::string> additional_message)
+ std::optional<std::string_view> additional_message)
: PlatformException(std::format(
"Resource platform '{}' does not match target platform '{}'.",
resource_platform_, target_platform_)),
diff --git a/src/platform/ForDllExport.cpp b/src/platform/ForDllExport.cpp
deleted file mode 100644
index a0421317..00000000
--- a/src/platform/ForDllExport.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "cru/platform/Exception.h"
-#include "cru/platform/Resource.h"
diff --git a/src/platform/Resource.cpp b/src/platform/Resource.cpp
new file mode 100644
index 00000000..d0dbf53b
--- /dev/null
+++ b/src/platform/Resource.cpp
@@ -0,0 +1,7 @@
+#include "cru/platform/Resource.h"
+
+namespace cru::platform {
+std::string IPlatformResource::GetPlatformIdUtf8() const {
+ return GetPlatformId().ToUtf8();
+}
+} // namespace cru::platform
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index 29c31527..9dd510e9 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -1,4 +1,5 @@
#include "cru/platform/gui/xcb/Window.h"
+#include "cru/platform/Check.h"
#include "cru/platform/graphics/Painter.h"
#include "cru/platform/graphics/cairo/CairoPainter.h"
#include "cru/platform/gui/Base.h"
@@ -57,12 +58,34 @@ KeyModifier ConvertModifiers(uint32_t mask) {
XcbWindow::XcbWindow(XcbUiApplication *application)
: application_(application),
xcb_window_(std::nullopt),
- cairo_surface_(nullptr) {
+ cairo_surface_(nullptr),
+ parent_(nullptr) {
application->RegisterWindow(this);
}
XcbWindow::~XcbWindow() { application_->UnregisterWindow(this); }
+void XcbWindow::Close() {
+ if (xcb_window_) {
+ xcb_destroy_window(application_->GetXcbConnection(), *xcb_window_);
+ }
+}
+
+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?
+ }
+}
+
std::unique_ptr<graphics::IPainter> XcbWindow::BeginPaint() {
assert(cairo_surface_);