From 3528b5e8cad879c1ad247879673d1935ad416a22 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 30 Jun 2023 10:14:16 +0800 Subject: [PATCH 1/4] enable pointer draw Signed-off-by: abc12133 --- window_manager/pointer_draw/pointer_draw.cpp | 176 ++++++++++++++++++ window_manager/pointer_draw/pointer_draw.h | 55 ++++++ window_manager/wmserver/ft_build/BUILD.gn | 7 +- .../wmserver/src/window_inner_manager.cpp | 12 ++ 4 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 window_manager/pointer_draw/pointer_draw.cpp create mode 100644 window_manager/pointer_draw/pointer_draw.h diff --git a/window_manager/pointer_draw/pointer_draw.cpp b/window_manager/pointer_draw/pointer_draw.cpp new file mode 100644 index 0000000..f31f877 --- /dev/null +++ b/window_manager/pointer_draw/pointer_draw.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "pointer_draw.h" + +#include "unistd.h" +#include + +#include "window_manager_hilog.h" +#include "display_manager_service_inner.h" +#include "ui/rs_surface_extractor.h" +#include "transaction/rs_transaction.h" + +namespace OHOS { +namespace Rosen { +namespace { + constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "PointerDraw"}; + constexpr int32_t ICON_WIDTH = 30; + constexpr int32_t ICON_HEIGHT = 30; +} +WM_IMPLEMENT_SINGLE_INSTANCE(PointerDraw) + +WMError PointerDraw::Init() +{ + if (InitDisplayInfo() != WMError::WM_OK) { + WLOGFE("InitDisplayInfo fail"); + return WMError::WM_ERROR_INNER; + } + + if (InitLayerNode() != WMError::WM_OK) { + WLOGFE("InitLayerNode fail"); + return WMError::WM_ERROR_INNER; + } + + if (InitDisplayNode() != WMError::WM_OK) { + WLOGFE("InitDisplayNode fail"); + return WMError::WM_ERROR_INNER; + } + + runner_ = AppExecFwk::EventRunner::Create("PointerDraw"); + handler_ = std::make_shared(runner_); + + return WMError::WM_OK; +} + +void PointerDraw::AsyncMove(int32_t x, int32_t y) +{ + int32_t posx = x; + if (posx < 0) { + posx = 0; + } + if (posx > displayWidth_) { + posx = displayWidth_; + } + + int32_t posy = y; + if (posy < 0) { + posy = 0; + } + if (posy > displayHeight_) { + posy = displayHeight_; + } + + PostAsyncTask([this, posx, posy]() { + MoveTo(posx, posy); + }); +} + +WMError PointerDraw::InitDisplayInfo() +{ + auto displayInfo = DisplayManagerServiceInner::GetInstance().GetDefaultDisplay(); + if (displayInfo == nullptr) { + WLOGFE("GetDefaultDisplay fail"); + return WMError::WM_ERROR_NULLPTR; + } + displayWidth_ = displayInfo->GetWidth(); + displayHeight_ = displayInfo->GetHeight(); + displayId_ = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId(); + + if (displayWidth_ <=0 || displayHeight_ <= 0) { + WLOGFE("Invalid display info"); + return WMError::WM_ERROR_INVALID_PARAM; + } + + return WMError::WM_OK; +} + +WMError PointerDraw::InitLayerNode() +{ + RSSurfaceNodeConfig config; + surfaceNode_ = RSSurfaceNode::Create(config); + if (surfaceNode_ == nullptr) { + WLOGFE("RSSurfaceNode::Create fail"); + return WMError::WM_ERROR_NULLPTR; + } + + surfaceNode_->SetBounds(displayWidth_ / 2, displayHeight_ / 2, ICON_WIDTH, ICON_HEIGHT); + rsSurface_ = RSSurfaceExtractor::ExtractRSSurface(surfaceNode_); + if (rsSurface_ == nullptr) { + WLOGFE("ExtractRSSurface fail"); + return WMError::WM_ERROR_NULLPTR; + } + + auto framePtr = rsSurface_->RequestFrame(ICON_WIDTH, ICON_HEIGHT); + if (framePtr == nullptr) { + WLOGFE("RequestFrame fail"); + return WMError::WM_ERROR_NULLPTR; + } + + auto canvas = framePtr->GetCanvas(); + canvas->clear(SK_ColorTRANSPARENT); + SkPaint paint; + paint.setAntiAlias(true); + paint.setStyle(SkPaint::kFill_Style); + paint.setStrokeWidth(20); + paint.setStrokeJoin(SkPaint::kRound_Join); + paint.setColor(SK_ColorBLUE); + canvas->drawRect(SkRect::MakeXYWH(0, 0, ICON_WIDTH, ICON_HEIGHT), paint); + framePtr->SetDamageRegion(0, 0, ICON_WIDTH, ICON_HEIGHT); + rsSurface_->FlushFrame(framePtr); + + return WMError::WM_OK; +} + +WMError PointerDraw::InitDisplayNode() +{ + RSDisplayNodeConfig config; + displayNode_ = RSDisplayNode::Create(config); + if (displayNode_ == nullptr) { + WLOGFE("RSDisplayNode::Create fail"); + return WMError::WM_ERROR_NULLPTR; + } + + displayNode_->SetScreenId(displayId_); + displayNode_->SetBounds(0, 0, displayWidth_, displayHeight_); + displayNode_->AddChild(surfaceNode_, -1); + RSTransaction::FlushImplicitTransaction(); + + return WMError::WM_OK; +} + +WMError PointerDraw::MoveTo(int32_t x, int32_t y) +{ + if (surfaceNode_ == nullptr) { + WLOGFE("surfaceNode_ is nullptr"); + return WMError::WM_ERROR_NULLPTR; + } + + surfaceNode_->SetBounds(x, y, ICON_WIDTH, ICON_HEIGHT); + RSTransaction::FlushImplicitTransaction(); + + return WMError::WM_OK; +} + +void PointerDraw::PostAsyncTask(Task task) +{ + if (handler_ != nullptr) { + bool ret = handler_->PostTask(task, AppExecFwk::EventQueue::Priority::IMMEDIATE); + if (!ret) { + WLOGFE("EventHandler PostTask Failed"); + } + } +} +} // Rosen +} // OHOS diff --git a/window_manager/pointer_draw/pointer_draw.h b/window_manager/pointer_draw/pointer_draw.h new file mode 100644 index 0000000..5dbf302 --- /dev/null +++ b/window_manager/pointer_draw/pointer_draw.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 Huawei Technologies Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef POINTER_DRAW_H +#define POINTER_DRAW_H + +#include "graphic_common.h" +#include "wm_single_instance.h" +#include "ui/rs_display_node.h" +#include "ui/rs_surface_node.h" +#include "event_handler.h" + +namespace OHOS { +namespace Rosen { +class PointerDraw { +WM_DECLARE_SINGLE_INSTANCE_BASE(PointerDraw); +public: + WMError Init(); + void AsyncMove(int32_t x, int32_t y); + +private: + PointerDraw() = default; + virtual ~PointerDraw() = default; + using Task = std::function; + + WMError InitDisplayInfo(); + WMError InitLayerNode(); + WMError InitDisplayNode(); + WMError MoveTo(int32_t x, int32_t y); + void PostAsyncTask(Task task); + + int32_t displayWidth_ = 0; + int32_t displayHeight_ = 0; + uint64_t displayId_ = 0; + RSDisplayNode::SharedPtr displayNode_ = nullptr; + RSSurfaceNode::SharedPtr surfaceNode_ = nullptr; + std::shared_ptr rsSurface_ = nullptr; + std::shared_ptr runner_ = nullptr; + std::shared_ptr handler_ = nullptr; +}; +} // namespace Rosen +} // namespace OHOS +#endif // POINTER_DRAW_H diff --git a/window_manager/wmserver/ft_build/BUILD.gn b/window_manager/wmserver/ft_build/BUILD.gn index 5eed6d5..6f1cf2f 100644 --- a/window_manager/wmserver/ft_build/BUILD.gn +++ b/window_manager/wmserver/ft_build/BUILD.gn @@ -25,6 +25,7 @@ config("libwms_config") { "$window_manager_path/interfaces/innerkits/wm", "$window_manager_path/interfaces/innerkits/dm", "$window_manager_path/ft_adapter", + "$window_manager_path/pointer_draw", "$window_manager_path/wm/include", "$window_manager_path/utils/include", "$window_manager_path/dm/include", @@ -40,6 +41,7 @@ ft_shared_library("libwms") { defines = ft_defines sources = [ + "$window_manager_path/pointer_draw/pointer_draw.cpp", "$window_manager_path/wm/src/zidl/window_manager_agent_proxy.cpp", "$window_manager_path/wm/src/zidl/window_proxy.cpp", "$window_manager_path/wmserver/src/accessibility_connection.cpp", @@ -92,11 +94,10 @@ ft_shared_library("libwms") { "$window_manager_path/dmserver/ft_build:libdms", "$window_manager_path/utils/ft_build:libwmutil", "$window_manager_path/wm/ft_build:libwm", - - "//build/gn/configs/system_libs:safwk", "//build/gn/configs/system_libs:eventhandler", - "//build/gn/configs/system_libs:skia", "//build/gn/configs/system_libs:image", "//build/gn/configs/system_libs:mmi", + "//build/gn/configs/system_libs:safwk", + "//build/gn/configs/system_libs:skia", ] } diff --git a/window_manager/wmserver/src/window_inner_manager.cpp b/window_manager/wmserver/src/window_inner_manager.cpp index 7471358..f54b7c8 100644 --- a/window_manager/wmserver/src/window_inner_manager.cpp +++ b/window_manager/wmserver/src/window_inner_manager.cpp @@ -17,6 +17,7 @@ #include "ability_manager_client.h" #include "memory_guard.h" +#include "pointer_draw.h" #include "window.h" #include "window_manager_hilog.h" @@ -56,6 +57,8 @@ bool WindowInnerManager::Init() return false; } + PointerDraw::GetInstance().Init(); + WLOGFI("init window inner manager service success."); return true; } @@ -304,6 +307,15 @@ void WindowInnerManager::NotifyWindowRemovedOrDestroyed(uint32_t windowId) void WindowInnerManager::ConsumePointerEvent(const std::shared_ptr& pointerEvent) { + if (pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_MOVE && + pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_MOUSE) { + MMI::PointerEvent::PointerItem pointerItem; + int32_t pointId = pointerEvent->GetPointerId(); + if (pointerEvent->GetPointerItem(pointId, pointerItem)) { + PointerDraw::GetInstance().AsyncMove(pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); + } + } + uint32_t windowId = static_cast(pointerEvent->GetAgentWindowId()); if (moveDragController_->GetActiveWindowId() != windowId || moveDragController_->GetActiveWindowId() == INVALID_WINDOW_ID) { -- Gitee From 93f711154baad0b810d73c61965378b276bf880d Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 30 Jun 2023 10:16:01 +0800 Subject: [PATCH 2/4] remove useless code Signed-off-by: abc12133 --- window_manager/pointer_draw/pointer_draw.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/window_manager/pointer_draw/pointer_draw.cpp b/window_manager/pointer_draw/pointer_draw.cpp index f31f877..342e479 100644 --- a/window_manager/pointer_draw/pointer_draw.cpp +++ b/window_manager/pointer_draw/pointer_draw.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2023 Huawei Technologies Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -12,10 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "pointer_draw.h" -#include "unistd.h" -#include +#include "pointer_draw.h" #include "window_manager_hilog.h" #include "display_manager_service_inner.h" -- Gitee From 416b0d22e7c55bbd6c86583a4e2268370fbb794d Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 30 Jun 2023 10:20:27 +0800 Subject: [PATCH 3/4] use lambda Signed-off-by: abc12133 --- window_manager/pointer_draw/pointer_draw.cpp | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/window_manager/pointer_draw/pointer_draw.cpp b/window_manager/pointer_draw/pointer_draw.cpp index 342e479..509eae4 100644 --- a/window_manager/pointer_draw/pointer_draw.cpp +++ b/window_manager/pointer_draw/pointer_draw.cpp @@ -54,21 +54,11 @@ WMError PointerDraw::Init() void PointerDraw::AsyncMove(int32_t x, int32_t y) { - int32_t posx = x; - if (posx < 0) { - posx = 0; - } - if (posx > displayWidth_) { - posx = displayWidth_; - } + int32_t posx = (x >= 0) ? x : 0; + posx = (posx <= displayWidth_) ? posx : displayWidth_; - int32_t posy = y; - if (posy < 0) { - posy = 0; - } - if (posy > displayHeight_) { - posy = displayHeight_; - } + int32_t posy = (y >= 0) ? y : 0; + posy = (posy <= displayHeight_) ? posy : displayHeight_; PostAsyncTask([this, posx, posy]() { MoveTo(posx, posy); -- Gitee From 1f6749f680e1a51dc595e4181ae1f2c4950c4089 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 30 Jun 2023 14:28:14 +0800 Subject: [PATCH 4/4] fix comments Signed-off-by: abc12133 --- window_manager/wmserver/ft_build/BUILD.gn | 4 +-- .../ft_build}/pointer_draw/pointer_draw.cpp | 14 +++++----- .../ft_build}/pointer_draw/pointer_draw.h | 26 +++++++++---------- .../wmserver/src/window_inner_manager.cpp | 4 +-- 4 files changed, 23 insertions(+), 25 deletions(-) rename window_manager/{ => wmserver/ft_build}/pointer_draw/pointer_draw.cpp (95%) rename window_manager/{ => wmserver/ft_build}/pointer_draw/pointer_draw.h (68%) diff --git a/window_manager/wmserver/ft_build/BUILD.gn b/window_manager/wmserver/ft_build/BUILD.gn index 6f1cf2f..cb94cc5 100644 --- a/window_manager/wmserver/ft_build/BUILD.gn +++ b/window_manager/wmserver/ft_build/BUILD.gn @@ -25,7 +25,7 @@ config("libwms_config") { "$window_manager_path/interfaces/innerkits/wm", "$window_manager_path/interfaces/innerkits/dm", "$window_manager_path/ft_adapter", - "$window_manager_path/pointer_draw", + "pointer_draw", "$window_manager_path/wm/include", "$window_manager_path/utils/include", "$window_manager_path/dm/include", @@ -41,7 +41,6 @@ ft_shared_library("libwms") { defines = ft_defines sources = [ - "$window_manager_path/pointer_draw/pointer_draw.cpp", "$window_manager_path/wm/src/zidl/window_manager_agent_proxy.cpp", "$window_manager_path/wm/src/zidl/window_proxy.cpp", "$window_manager_path/wmserver/src/accessibility_connection.cpp", @@ -78,6 +77,7 @@ ft_shared_library("libwms") { "$window_manager_path/wmserver/src/window_zorder_policy.cpp", "$window_manager_path/wmserver/src/zidl/ressched_report.cpp", "$window_manager_path/wmserver/src/zidl/window_manager_stub.cpp", + "pointer_draw/pointer_draw.cpp", ] configs = [ diff --git a/window_manager/pointer_draw/pointer_draw.cpp b/window_manager/wmserver/ft_build/pointer_draw/pointer_draw.cpp similarity index 95% rename from window_manager/pointer_draw/pointer_draw.cpp rename to window_manager/wmserver/ft_build/pointer_draw/pointer_draw.cpp index 509eae4..79eea75 100644 --- a/window_manager/pointer_draw/pointer_draw.cpp +++ b/window_manager/wmserver/ft_build/pointer_draw/pointer_draw.cpp @@ -20,8 +20,10 @@ #include "ui/rs_surface_extractor.h" #include "transaction/rs_transaction.h" -namespace OHOS { -namespace Rosen { +using namespace OHOS; +using namespace OHOS::Rosen; + +namespace FangTian { namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "PointerDraw"}; constexpr int32_t ICON_WIDTH = 30; @@ -76,7 +78,7 @@ WMError PointerDraw::InitDisplayInfo() displayHeight_ = displayInfo->GetHeight(); displayId_ = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId(); - if (displayWidth_ <=0 || displayHeight_ <= 0) { + if (displayWidth_ <= 0 || displayHeight_ <= 0) { WLOGFE("Invalid display info"); return WMError::WM_ERROR_INVALID_PARAM; } @@ -93,7 +95,7 @@ WMError PointerDraw::InitLayerNode() return WMError::WM_ERROR_NULLPTR; } - surfaceNode_->SetBounds(displayWidth_ / 2, displayHeight_ / 2, ICON_WIDTH, ICON_HEIGHT); + surfaceNode_->SetBounds(0, 0, ICON_WIDTH, ICON_HEIGHT); rsSurface_ = RSSurfaceExtractor::ExtractRSSurface(surfaceNode_); if (rsSurface_ == nullptr) { WLOGFE("ExtractRSSurface fail"); @@ -111,7 +113,6 @@ WMError PointerDraw::InitLayerNode() SkPaint paint; paint.setAntiAlias(true); paint.setStyle(SkPaint::kFill_Style); - paint.setStrokeWidth(20); paint.setStrokeJoin(SkPaint::kRound_Join); paint.setColor(SK_ColorBLUE); canvas->drawRect(SkRect::MakeXYWH(0, 0, ICON_WIDTH, ICON_HEIGHT), paint); @@ -160,5 +161,4 @@ void PointerDraw::PostAsyncTask(Task task) } } } -} // Rosen -} // OHOS +} // FangTian diff --git a/window_manager/pointer_draw/pointer_draw.h b/window_manager/wmserver/ft_build/pointer_draw/pointer_draw.h similarity index 68% rename from window_manager/pointer_draw/pointer_draw.h rename to window_manager/wmserver/ft_build/pointer_draw/pointer_draw.h index 5dbf302..5ded3dc 100644 --- a/window_manager/pointer_draw/pointer_draw.h +++ b/window_manager/wmserver/ft_build/pointer_draw/pointer_draw.h @@ -22,12 +22,11 @@ #include "ui/rs_surface_node.h" #include "event_handler.h" -namespace OHOS { -namespace Rosen { +namespace FangTian { class PointerDraw { WM_DECLARE_SINGLE_INSTANCE_BASE(PointerDraw); public: - WMError Init(); + OHOS::WMError Init(); void AsyncMove(int32_t x, int32_t y); private: @@ -35,21 +34,20 @@ private: virtual ~PointerDraw() = default; using Task = std::function; - WMError InitDisplayInfo(); - WMError InitLayerNode(); - WMError InitDisplayNode(); - WMError MoveTo(int32_t x, int32_t y); + OHOS::WMError InitDisplayInfo(); + OHOS::WMError InitLayerNode(); + OHOS::WMError InitDisplayNode(); + OHOS::WMError MoveTo(int32_t x, int32_t y); void PostAsyncTask(Task task); int32_t displayWidth_ = 0; int32_t displayHeight_ = 0; uint64_t displayId_ = 0; - RSDisplayNode::SharedPtr displayNode_ = nullptr; - RSSurfaceNode::SharedPtr surfaceNode_ = nullptr; - std::shared_ptr rsSurface_ = nullptr; - std::shared_ptr runner_ = nullptr; - std::shared_ptr handler_ = nullptr; + OHOS::Rosen::RSDisplayNode::SharedPtr displayNode_ = nullptr; + OHOS::Rosen::RSSurfaceNode::SharedPtr surfaceNode_ = nullptr; + std::shared_ptr rsSurface_ = nullptr; + std::shared_ptr runner_ = nullptr; + std::shared_ptr handler_ = nullptr; }; -} // namespace Rosen -} // namespace OHOS +} // namespace FangTian #endif // POINTER_DRAW_H diff --git a/window_manager/wmserver/src/window_inner_manager.cpp b/window_manager/wmserver/src/window_inner_manager.cpp index f54b7c8..46dc0b9 100644 --- a/window_manager/wmserver/src/window_inner_manager.cpp +++ b/window_manager/wmserver/src/window_inner_manager.cpp @@ -57,7 +57,7 @@ bool WindowInnerManager::Init() return false; } - PointerDraw::GetInstance().Init(); + FangTian::PointerDraw::GetInstance().Init(); WLOGFI("init window inner manager service success."); return true; @@ -312,7 +312,7 @@ void WindowInnerManager::ConsumePointerEvent(const std::shared_ptrGetPointerId(); if (pointerEvent->GetPointerItem(pointId, pointerItem)) { - PointerDraw::GetInstance().AsyncMove(pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); + FangTian::PointerDraw::GetInstance().AsyncMove(pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); } } -- Gitee