From d79c8842fac8ddea402e9dd411e55ea583f74f03 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Tue, 23 Sep 2025 22:54:09 +0800 Subject: Enable bootstrap of xcb. --- demos/CMakeLists.txt | 2 ++ include/cru/platform/gui/xcb/Base.h | 4 ++-- include/cru/platform/gui/xcb/UiApplication.h | 13 +------------ src/platform/bootstrap/Bootstrap.cpp | 6 ++++-- src/platform/bootstrap/CMakeLists.txt | 10 +++++----- src/platform/gui/xcb/UiApplication.cpp | 8 ++++++++ 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index b38bc7a8..665f359a 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -13,6 +13,8 @@ elseif(APPLE) add_subdirectory(ScrollView) add_subdirectory(InputMethod) elseif(UNIX) + add_subdirectory(main) + add_subdirectory(ScrollView) add_subdirectory(xcb) endif() diff --git a/include/cru/platform/gui/xcb/Base.h b/include/cru/platform/gui/xcb/Base.h index f3bcfd01..ad571a40 100644 --- a/include/cru/platform/gui/xcb/Base.h +++ b/include/cru/platform/gui/xcb/Base.h @@ -7,13 +7,13 @@ namespace cru::platform::gui::xcb { class XcbResource : public Object, public virtual IPlatformResource { public: - static String kPlatformId; + static constexpr const char16_t* kPlatformId = u"XCB"; protected: XcbResource() = default; public: - String GetPlatformId() const final { return kPlatformId; } + String GetPlatformId() const final { return String(kPlatformId); } }; class XcbException : public PlatformException { diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index 80995179..1797a303 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -71,22 +71,11 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { ICursorManager* GetCursorManager() override; - virtual IClipboard* GetClipboard() = 0; + IClipboard* GetClipboard() override; // If return nullptr, it means the menu is not supported. IMenu* GetApplicationMenu() override; - /** - * \todo Implement on Windows. - */ - virtual std::optional ShowSaveDialog(SaveDialogOptions options); - - /** - * \todo Implement on Windows. - */ - virtual std::optional> ShowOpenDialog( - OpenDialogOptions options); - private: void HandleXEvents(); diff --git a/src/platform/bootstrap/Bootstrap.cpp b/src/platform/bootstrap/Bootstrap.cpp index e9183550..bcf12613 100644 --- a/src/platform/bootstrap/Bootstrap.cpp +++ b/src/platform/bootstrap/Bootstrap.cpp @@ -1,10 +1,11 @@ #include "cru/platform/bootstrap/Bootstrap.h" -#include "cru/base/Base.h" #if defined(_WIN32) #include "cru/platform/gui/win/UiApplication.h" #elif defined(__APPLE__) #include "cru/platform/gui/osx/UiApplication.h" +#elif defined(__unix) +#include "cru/platform/gui/xcb/UiApplication.h" #else #endif @@ -15,7 +16,8 @@ cru::platform::gui::IUiApplication* CreateUiApplication() { #elif defined(__APPLE__) return new cru::platform::gui::osx::OsxUiApplication(); #else - NotImplemented(); + return new cru::platform::gui::xcb::XcbUiApplication(); #endif + NotImplemented(); } } // namespace cru::platform::bootstrap diff --git a/src/platform/bootstrap/CMakeLists.txt b/src/platform/bootstrap/CMakeLists.txt index 41f1e3d3..24cdff2b 100644 --- a/src/platform/bootstrap/CMakeLists.txt +++ b/src/platform/bootstrap/CMakeLists.txt @@ -17,10 +17,10 @@ if(WIN32) elseif(APPLE) target_link_libraries(CruPlatformGraphicsBootstrap PUBLIC CruPlatformGraphicsQuartz) target_link_libraries(CruPlatformBootstrap PUBLIC CruPlatformGuiOsx) -elseif(EMSCRIPTEN) - target_link_libraries(CruPlatformGraphicsBootstrap PUBLIC CruBase) - target_link_libraries(CruPlatformBootstrap PUBLIC CruBase) # TODO: Remember to change this. -else() +elseif(UNIX) target_link_libraries(CruPlatformGraphicsBootstrap PUBLIC CruPlatformGraphicsCairo) - target_link_libraries(CruPlatformBootstrap PUBLIC CruPlatformGraphicsCairo) + target_link_libraries(CruPlatformBootstrap PUBLIC CruPlatformGuiXcb) +else() + target_link_libraries(CruPlatformGraphicsBootstrap PUBLIC CruBase) + target_link_libraries(CruPlatformBootstrap PUBLIC CruBase) endif() diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp index b95e669a..9daac385 100644 --- a/src/platform/gui/xcb/UiApplication.cpp +++ b/src/platform/gui/xcb/UiApplication.cpp @@ -1,5 +1,6 @@ #include "cru/platform/gui/xcb/UiApplication.h" +#include "cru/base/Base.h" #include "cru/platform/graphics/cairo/CairoGraphicsFactory.h" #include "cru/platform/gui/Window.h" #include "cru/platform/gui/xcb/Cursor.h" @@ -23,6 +24,7 @@ XcbUiApplication::XcbUiApplication( int screen_num; xcb_connection_t *connection = xcb_connect(NULL, &screen_num); + xcb_connection_ = connection; this->CheckXcbConnectionError(); event_loop_.SetPoll(xcb_get_file_descriptor(connection), POLLIN, @@ -44,6 +46,10 @@ XcbUiApplication::~XcbUiApplication() { } } +graphics::cairo::CairoGraphicsFactory *XcbUiApplication::GetCairoFactory() { + return cairo_factory_; +} + void XcbUiApplication::CheckXcbConnectionError() { if (xcb_connection_has_error(this->xcb_connection_)) { throw XcbException("xcb_connection_has_error returned non-zero."); @@ -144,6 +150,8 @@ XcbUiApplication::GetGraphicsFactory() { ICursorManager *XcbUiApplication::GetCursorManager() { return cursor_manager_; } +IClipboard *XcbUiApplication::GetClipboard() { NotImplemented(); } + IMenu *XcbUiApplication::GetApplicationMenu() { return nullptr; } void XcbUiApplication::RegisterWindow(XcbWindow *window) { -- cgit v1.2.3