From 035af7218d52f323caadff36dc19671f0de65f21 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Tue, 29 Aug 2023 10:42:33 +0800 Subject: [PATCH] add wayland socket Signed-off-by: abc12133 --- build/configs/system_deps.toml | 1 + wayland_adapter/BUILD.gn | 8 +++- .../{ => utils}/wayland_adapter_hilog.h | 0 wayland_adapter/wayland_server.cpp | 46 +++++++++++++++++++ wayland_adapter/wayland_server.h | 10 ++++ 5 files changed, 64 insertions(+), 1 deletion(-) rename wayland_adapter/{ => utils}/wayland_adapter_hilog.h (100%) diff --git a/build/configs/system_deps.toml b/build/configs/system_deps.toml index 1c78f53..0da4ad0 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 231148d..cbd9849 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 4c35b7e..febdc82 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 5c362f9..c7e62f2 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 -- Gitee