diff --git a/build/configs/system_deps.toml b/build/configs/system_deps.toml index 1c78f53562225ba878a39a18d4e3fa09f4f9303a..0da4ad0fa8afe1696d86478f80bf2546e47883a1 100755 --- a/build/configs/system_deps.toml +++ b/build/configs/system_deps.toml @@ -33,6 +33,7 @@ package_deps = [ "libxml2-devel", "libpng-devel", "libicu", + "wayland-devel", # DRM Backend "libdrm-devel", "systemd-pam", diff --git a/wayland_adapter/BUILD.gn b/wayland_adapter/BUILD.gn index 231148d23afdf1f2cce3a5c3039027b8399e092e..cbd984951c8e82a9e7324e88f0c9bc3489b826e4 100644 --- a/wayland_adapter/BUILD.gn +++ b/wayland_adapter/BUILD.gn @@ -19,7 +19,10 @@ config("libwayland_adapter_config") { cflags = [ "-Wno-c++11-narrowing" ] - include_dirs = [ "." ] + include_dirs = [ + "utils", + "/usr/include", + ] } ft_shared_library("libwayland_adapter") { @@ -29,8 +32,11 @@ ft_shared_library("libwayland_adapter") { configs = [ ":libwayland_adapter_config" ] + libs = [ "wayland-server" ] + deps = [ "//build/gn/configs/system_libs:hilog", "//build/gn/configs/system_libs:safwk", + "//display_server/drivers/hal/base:ft_event_loop", ] } diff --git a/wayland_adapter/wayland_adapter_hilog.h b/wayland_adapter/utils/wayland_adapter_hilog.h similarity index 100% rename from wayland_adapter/wayland_adapter_hilog.h rename to wayland_adapter/utils/wayland_adapter_hilog.h diff --git a/wayland_adapter/wayland_server.cpp b/wayland_adapter/wayland_server.cpp index 4c35b7e58f91d51c996da9a550339907584d22a9..febdc8210e12df4ada9f664bb78f5c885f8fcc1d 100644 --- a/wayland_adapter/wayland_server.cpp +++ b/wayland_adapter/wayland_server.cpp @@ -34,11 +34,57 @@ WaylandServer::~WaylandServer() noexcept {} void WaylandServer::OnStart() { LOG_INFO("OnStart"); + + display_ = wl_display_create(); + if (display_ == nullptr) { + LOG_ERROR("wl_display_create failed"); + return; + } + + wlDisplayLoop_ = wl_display_get_event_loop(display_); + if (wlDisplayLoop_ == nullptr) { + LOG_ERROR("wl_display_get_event_loop failed"); + wl_display_destroy(display_); + return; + } + + socketName_ = wl_display_add_socket_auto(display_); + if (socketName_.empty()) { + LOG_ERROR("wl_display_add_socket_auto failed"); + wl_display_destroy(display_); + return; + } + + loop_ = std::make_shared(); + wlDisplayChannel_ = std::make_unique(wl_event_loop_get_fd(wlDisplayLoop_), loop_.get()); + wlDisplayChannel_->SetReadCallback([this](TimeStamp timeStamp) { + wl_event_loop_dispatch(wlDisplayLoop_, -1); + wl_display_flush_clients(display_); + }); + wlDisplayChannel_->EnableReading(true); } void WaylandServer::OnStop() { LOG_INFO("OnStop"); + + if (display_ == nullptr || loop_ == nullptr) { + return; + } + + auto stopWlDisplay = loop_->Schedule([this]() { + wl_display_terminate(display_); + wl_display_destroy_clients(display_); + wl_display_destroy(display_); + if (wlDisplayChannel_ != nullptr) { + wlDisplayChannel_->DisableAll(true); + wlDisplayChannel_ = nullptr; + } + }); + stopWlDisplay.wait(); + + display_ = nullptr; + loop_ = nullptr; } void WaylandServer::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) diff --git a/wayland_adapter/wayland_server.h b/wayland_adapter/wayland_server.h index 5c362f9e8b641d32aa43b09f92269ff9f67faf40..c7e62f2ea7cab59dd38c6e60d970d6ed45bb8853 100644 --- a/wayland_adapter/wayland_server.h +++ b/wayland_adapter/wayland_server.h @@ -19,6 +19,9 @@ #include #include +#include "wayland-server-core.h" +#include "event_loop.h" + namespace FT { namespace Wayland { class WaylandServer : public OHOS::SystemAbility { @@ -34,6 +37,13 @@ public: void OnStop() override; void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override; std::string GetClassName() override; + +private: + struct wl_display *display_ = nullptr; + struct wl_event_loop *wlDisplayLoop_ = nullptr; + std::string socketName_; + std::unique_ptr wlDisplayChannel_; + std::shared_ptr loop_; }; } // namespace Wayland } // namespace FT