diff --git a/build/prebuild.sh b/build/prebuild.sh index d06ed041b1e86f40c9eb9d0068c543bc9ed802e8..846b611791bb7d0fd6f589b0b0dd9a2069ba63c9 100755 --- a/build/prebuild.sh +++ b/build/prebuild.sh @@ -106,6 +106,7 @@ cd ${PROJECT_DIR} sudo mkdir -p /usr/local/share/ft sudo cp -fr ${PROJECT_DIR}/etc/ft.xml /usr/local/share/ft/ sudo cp -fr ${PROJECT_DIR}/etc/icon /usr/local/share/ft/ +sudo cp -fr ${PROJECT_DIR}/etc/desktop /usr/local/share/ft/ # copy config files to /usr/local/share/ft/window_manager sudo mkdir -p /usr/local/share/ft/window_manager diff --git a/etc/desktop/desktop.png b/etc/desktop/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8c0706291773d28e308c8d899edb360c5a1ad2 Binary files /dev/null and b/etc/desktop/desktop.png differ diff --git a/samples/BUILD.gn b/samples/BUILD.gn index a23f4642881c746015572775e549bbc5babff8e8..6c7ca2963eb29c7307bb1f09496567af0dfa829a 100644 --- a/samples/BUILD.gn +++ b/samples/BUILD.gn @@ -19,8 +19,10 @@ ft_executable("clock") { sources = [ "clock.cpp" ] cflags = [ "-Wno-c++11-narrowing" ] + + defines = [ "ENABLE_MMI" ] if (ds_enable_gpu) { - defines = [ "ENABLE_GPU" ] + defines += [ "ENABLE_GPU" ] libs = [ "EGL", "GLESv2" ] } @@ -42,5 +44,30 @@ ft_executable("clock") { "//build/gn/configs/system_libs:skia", "//build/gn/configs/system_libs:c_utils", "//build/gn/configs/system_libs:ipc_core", + "//build/gn/configs/system_libs:eventhandler", + "//build/gn/configs/system_libs:mmi", ] } + +ft_executable("desktop") { + sources = [ "desktop.cpp" ] + + cflags = [ "-Wno-c++11-narrowing" ] + if (ds_enable_gpu) { + defines = [ "ENABLE_GPU" ] + libs = [ "EGL", "GLESv2" ] + } + + include_dirs = [ + "$window_manager_path/interfaces/innerkits", + "$display_server_root/rosen/modules/2d_graphics/src", + ] + + deps = [ + "$display_server_root/rosen/modules/render_service_client/ft_build:librender_service_client", + "$window_manager_path/dm/ft_build:libdm", + "$window_manager_path/wm/ft_build:libwm", + "$window_manager_path/utils/ft_build:libwmutil", + "//build/gn/configs/system_libs:image", + ] +} \ No newline at end of file diff --git a/samples/clock.cpp b/samples/clock.cpp index fbc684ad411601b825602dabb98a2b3effcb06d4..2bc653a4134d19e1bab87603d055cb98ff3b5ed6 100644 --- a/samples/clock.cpp +++ b/samples/clock.cpp @@ -26,6 +26,10 @@ #include "ui/rs_surface_node.h" #include "wm/window.h" +#ifdef ENABLE_MMI +#include "input_manager.h" +#endif + using namespace OHOS::Rosen; enum HandType { HOUR_HAND, @@ -47,6 +51,93 @@ constexpr int MIN_IN_ONE_HOUR = 60; constexpr int DAIL_NUM_RADIUS = 165; // 表盘文字环绕半径 constexpr int HOUR_PROPORTION = 60 / HOUR_FORMAT; // 圆周分为60份,1小时表示占5小格 +#ifdef ENABLE_MMI +constexpr int INVALID_COORDINATE = -1; +class ClockDemoEventConsumer : public OHOS::MMI::IInputEventConsumer +{ +public: + ClockDemoEventConsumer(OHOS::sptr window); + void OnInputEvent(std::shared_ptr keyEvent) const override; + void OnInputEvent(std::shared_ptr axisEvent) const override; + void OnInputEvent(std::shared_ptr pointerEvent) const override; + +private: + void HandleMovePointerEvent(std::shared_ptr pointerEvent) const; + OHOS::sptr window_ = nullptr; + mutable bool enableMove = false; + mutable int lastWindowX = INVALID_COORDINATE; + mutable int lastWindowY = INVALID_COORDINATE; + mutable int lastPointerX = INVALID_COORDINATE; + mutable int lastPointerY = INVALID_COORDINATE; +}; + +ClockDemoEventConsumer::ClockDemoEventConsumer(OHOS::sptr window) +{ + window_ = window; +} + +void ClockDemoEventConsumer::HandleMovePointerEvent(std::shared_ptr pointerEvent) const +{ + if ((window_ == nullptr) || (pointerEvent->GetSourceType() != OHOS::MMI::PointerEvent::SOURCE_TYPE_MOUSE)) { + return; + } + + OHOS::MMI::PointerEvent::PointerItem pointerItem; + int32_t pointId = pointerEvent->GetPointerId(); + if (!pointerEvent->GetPointerItem(pointId, pointerItem)) { + return; + } + + // 计算鼠标移动距离 + int diffX = (lastPointerX != INVALID_COORDINATE ? pointerItem.GetDisplayX() - lastPointerX : 0); + int diffY = (lastPointerY != INVALID_COORDINATE ? pointerItem.GetDisplayY() - lastPointerY : 0); + + // 窗口的新位置 = 当前位置 + 鼠标移动距离 + if (lastWindowX == INVALID_COORDINATE && lastWindowY == INVALID_COORDINATE) { + lastWindowX = window_->GetRect().posX_; + lastWindowY = window_->GetRect().posY_; + } + int newX = lastWindowX + diffX; + int newY = lastWindowY + diffY; + + //移动窗口,并记录当前鼠标位置 + if (enableMove && lastPointerX != INVALID_COORDINATE && lastPointerY != INVALID_COORDINATE) { + window_->MoveTo(newX, newY); + lastWindowX = newX; + lastWindowY = newY; + } + lastPointerX = pointerItem.GetDisplayX(); + lastPointerY = pointerItem.GetDisplayY(); +} + +void ClockDemoEventConsumer::OnInputEvent(std::shared_ptr keyEvent) const +{ + keyEvent->MarkProcessed(); +} + +void ClockDemoEventConsumer::OnInputEvent(std::shared_ptr axisEvent) const +{ + axisEvent->MarkProcessed(); +} + +void ClockDemoEventConsumer::OnInputEvent(std::shared_ptr pointerEvent) const +{ + switch (pointerEvent->GetPointerAction()) { + case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN: + enableMove = true; // 鼠标按键按下,使能移动窗口 + break; + case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP: + enableMove = false; // 鼠标按键抬起,静止移动窗口 + break; + case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE: + HandleMovePointerEvent(pointerEvent); + break; + default: + break; + } + pointerEvent->MarkProcessed(); +} +#endif // ENABLE_MMI // we can make this demo and run it on the device, // to show a clock demo @@ -63,12 +154,20 @@ public: option->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE); option->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); option->SetWindowName("clock"); + option->SetMainHandlerAvailable(false); window_ = OHOS::Rosen::Window::Create(option->GetWindowName(), option); if (window_ != nullptr) { surfaceNode_ = window_->GetSurfaceNode(); surfaceNode_->SetBounds(0, 0, windowWidth, windowHeight); // surface bounds is window rect. RSTransaction::FlushImplicitTransaction(); window_->Show(); +#ifdef ENABLE_MMI + auto listener = std::make_shared(window_); + const std::string thread = "clockEventThread"; + auto runner = OHOS::AppExecFwk::EventRunner::Create(thread); + auto eventHandler = std::make_shared(runner); + OHOS::MMI::InputManager::GetInstance()->SetWindowInputEventConsumer(listener, eventHandler); +#endif // ENABLE_MMI } else { std::cout << "Failed to create window!" << std::endl; } diff --git a/samples/desktop.cpp b/samples/desktop.cpp new file mode 100644 index 0000000000000000000000000000000000000000..292fecc69af94ae34e9fc4fe5324834c8f836e56 --- /dev/null +++ b/samples/desktop.cpp @@ -0,0 +1,202 @@ +/* + * 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. + */ + +#include +#include +#include "property/rs_properties_def.h" +#include "render_context/render_context.h" +#include "transaction/rs_transaction.h" +#include "transaction/rs_interfaces.h" +#include "ui/rs_surface_extractor.h" +#include "ui/rs_surface_node.h" +#include "wm/window.h" +#include "pixel_map.h" +#include "image_source.h" + + +using namespace OHOS::Rosen; + +class DesktopDemo { +public: + DesktopDemo() + { + DrawDesktop(); + } + + ~DesktopDemo() noexcept + { + if (window_ != nullptr) { + window_->Hide(); + window_->Destroy(); + } + } + + std::unique_ptr DecodeImageToPixelMap() + { + OHOS::Media::SourceOptions opts; + opts.formatHint = "image/png"; + uint32_t ret = 0; + auto imageSource = OHOS::Media::ImageSource::CreateImageSource(desktopPath, opts, ret); + if (ret != 0) { + std::cout << "CreateImageSource fail" << std::endl; + return nullptr; + } + + std::set formats; + ret = imageSource->GetSupportedFormats(formats); + if (ret != 0) { + std::cout << "GetSupportedFormats fail" << std::endl; + return nullptr; + } + + OHOS::Media::DecodeOptions decodeOpts; + decodeOpts.desiredSize = { + .width = desktopW, + .height = desktopH + }; + std::unique_ptr pixelMap = imageSource->CreatePixelMap(decodeOpts, ret); + if (pixelMap == nullptr) { + std::cout << "CreatePixelMap fail" << std::endl; + return nullptr; + } + return pixelMap; + } + + SkColorType PixelFormatConvert(const OHOS::Media::PixelFormat& pixelFormat) + { + SkColorType colorType; + switch (pixelFormat) { + case OHOS::Media::PixelFormat::BGRA_8888: + colorType = SkColorType::kBGRA_8888_SkColorType; + break; + case OHOS::Media::PixelFormat::RGBA_8888: + colorType = SkColorType::kRGBA_8888_SkColorType; + break; + case OHOS::Media::PixelFormat::RGB_565: + colorType = SkColorType::kRGB_565_SkColorType; + break; + case OHOS::Media::PixelFormat::ALPHA_8: + colorType = SkColorType::kAlpha_8_SkColorType; + break; + default: + colorType = SkColorType::kUnknown_SkColorType; + break; + } + return colorType; + } + + void DrawDesktop() + { + int displayId = OHOS::Rosen::RSInterfaces::GetInstance().GetDefaultScreenId(); + auto activeModeInfo = OHOS::Rosen::RSInterfaces::GetInstance().GetScreenActiveMode(displayId); + desktopW = activeModeInfo.GetScreenWidth(); + desktopH = activeModeInfo.GetScreenHeight(); + printf("desktopW=%d, desktopH=%d\n", desktopW, desktopH); + +#ifdef ENABLE_GPU + InitContext(); +#endif + + OHOS::sptr option(new WindowOption()); + option->SetDisplayId(0); + option->SetWindowRect({0, 0, desktopW, desktopH}); + option->SetWindowType(WindowType::WINDOW_TYPE_DESKTOP); + option->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); + option->SetWindowName("desktop"); + window_ = OHOS::Rosen::Window::Create(option->GetWindowName(), option); + if (window_ != nullptr) { + SurfaceNode_ = window_->GetSurfaceNode(); + SurfaceNode_->SetBounds(0, 0, desktopW, desktopH); // surface bounds is window rect. + RSTransaction::FlushImplicitTransaction(); + window_->Show(); + } else { + std::cout << "Failed to window_ window!" << std::endl; + return; + } + + if (SurfaceNode_ == nullptr) { + return; + } + + rsSurface_ = RSSurfaceExtractor::ExtractRSSurface(SurfaceNode_); + if (rsSurface_ == nullptr) { + return; + } + +#ifdef ENABLE_GPU + if (renderContext_ != nullptr) { + rsSurface_->SetRenderContext(renderContext_.get()); + } +#endif + + auto frame = rsSurface_->RequestFrame(desktopW, desktopH); + if (frame == nullptr) { + std::cout << "Failed to create frame!" << std::endl; + return; + } + auto canvas = frame->GetCanvas(); + if (canvas == nullptr) { + std::cout << "Failed to create canvas!" << std::endl; + return; + } + + auto pixelmap = DecodeImageToPixelMap(); + if (pixelmap == nullptr) { + std::cout << "DecodeImageToPixelMap fail!" << std::endl; + return; + } + SkImageInfo imageInfo = SkImageInfo::Make(pixelmap->GetWidth(), pixelmap->GetHeight(), + PixelFormatConvert(pixelmap->GetPixelFormat()), + static_cast(pixelmap->GetAlphaType())); + SkPixmap srcPixmap(imageInfo, pixelmap->GetPixels(), pixelmap->GetRowBytes()); + SkBitmap srcBitmap; + srcBitmap.installPixels(srcPixmap); + canvas->drawBitmap(srcBitmap, 0, 0); + + frame->SetDamageRegion(0, 0, desktopW, desktopH); + rsSurface_->FlushFrame(frame); + } + +#ifdef ENABLE_GPU + void InitContext() + { + renderContext_ = std::make_unique(); + renderContext_->InitializeEglContext(); + } +#endif + +private: + OHOS::sptr window_ = nullptr; + std::shared_ptr SurfaceNode_ = nullptr; + std::shared_ptr rsSurface_ = nullptr; + int desktopW = 500; + int desktopH = 500; + std::string desktopPath = "/usr/local/share/ft/desktop/desktop.png"; +#ifdef ENABLE_GPU + std::unique_ptr renderContext_ = nullptr; +#endif +}; + +int main() +{ + std::cout << "desktop start!" << std::endl; + DesktopDemo desktop; + + while (true) { + sleep(10); + } + std::cout << "desktop end!" << std::endl; + return 0; +} diff --git a/window_manager/ft_pointer_draw/BUILD.gn b/window_manager/ft_pointer_draw/BUILD.gn index c4a28a1a79e1d03474a6635edaed8cebb5494dd5..0f2f7e54e387a3d1244d5f11138cebe8a580c8dc 100644 --- a/window_manager/ft_pointer_draw/BUILD.gn +++ b/window_manager/ft_pointer_draw/BUILD.gn @@ -28,8 +28,11 @@ config("pointer_draw_config") { } include_dirs = [ + "$window_manager_path/dm/include", + "$window_manager_path/interfaces/innerkits", "$window_manager_path/interfaces/innerkits/dm", "$display_server_root/rosen/modules/2d_graphics/src", + "$display_server_root/rosen/modules/2d_graphics/include", ] } @@ -47,6 +50,8 @@ ft_shared_library("libpointerdraw") { "$display_server_root/rosen/modules/render_service_base/ft_build:librender_service_base", "$display_server_root/rosen/modules/render_service_client/ft_build:librender_service_client", "$window_manager_path/dmserver/ft_build:libdms", + "$window_manager_path/wm/ft_build:libwm", + "$window_manager_path/utils/ft_build:libwmutil", "//build/gn/configs/system_libs:eventhandler", "//build/gn/configs/system_libs:image", "//build/gn/configs/system_libs:safwk", diff --git a/window_manager/ft_pointer_draw/pointer_draw_manager.cpp b/window_manager/ft_pointer_draw/pointer_draw_manager.cpp index 0d0df6c0fc62824541269d19a9ae4f72bb65e9f0..9bd653851f6cd36c3d2b78f9beb3bf733cfa3d22 100644 --- a/window_manager/ft_pointer_draw/pointer_draw_manager.cpp +++ b/window_manager/ft_pointer_draw/pointer_draw_manager.cpp @@ -22,6 +22,8 @@ #include "transaction/rs_transaction.h" #include "transaction/rs_interfaces.h" #include "image_source.h" +#include "display_manager_service_inner.h" + using namespace OHOS; @@ -32,6 +34,7 @@ namespace { constexpr int32_t FILE_SIZE_MAX = 0X5000; constexpr int32_t ICON_WIDTH = 40; constexpr int32_t ICON_HEIGHT = 40; + constexpr float PTR_SURFACE_NODE_Z_ORDER = 99999; } std::shared_ptr IPointerDrawingManager::GetInstance() @@ -65,11 +68,7 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in WLOGFE("InitLayerNode fail"); return; } - - if (InitDisplayNode() != WMError::WM_OK) { - WLOGFE("InitDisplayNode fail"); - return; - } + Rosen::DisplayManagerServiceInner::GetInstance().UpdateRSTree(0, 0, surfaceNode_, true, false); isDrawing_ = true; return; } @@ -113,13 +112,7 @@ void PointerDrawingManager::SetPointerLocation(int32_t pid, int32_t x, int32_t y void PointerDrawingManager::UpdateDisplayInfo(const ScreenDisplayInfo& displayInfo) { - displayWidth_ = displayInfo.width; - displayHeight_ = displayInfo.height; - displayId_ = displayInfo.id; - - if (displayWidth_ <= 0 || displayHeight_ <= 0) { - WLOGFE("Invalid ScreenDisplayInfo"); - } + (void) displayInfo; } WMError PointerDrawingManager::MoveTo(int32_t x, int32_t y) @@ -128,7 +121,6 @@ WMError PointerDrawingManager::MoveTo(int32_t x, int32_t y) WLOGFE("surfaceNode_ is nullptr"); return WMError::WM_ERROR_NULLPTR; } - surfaceNode_->SetBounds(x, y, ICON_WIDTH, ICON_HEIGHT); Rosen::RSTransaction::FlushImplicitTransaction(); @@ -145,6 +137,7 @@ WMError PointerDrawingManager::InitLayerNode(int32_t x, int32_t y) } surfaceNode_->SetBounds(x, y, ICON_WIDTH, ICON_HEIGHT); + surfaceNode_->SetPositionZ(PTR_SURFACE_NODE_Z_ORDER); rsSurface_ = Rosen::RSSurfaceExtractor::ExtractRSSurface(surfaceNode_); if (rsSurface_ == nullptr) { WLOGFE("ExtractRSSurface fail"); @@ -203,30 +196,6 @@ WMError PointerDrawingManager::InitLayerNode(int32_t x, int32_t y) return WMError::WM_OK; } -WMError PointerDrawingManager::InitDisplayNode() -{ - Rosen::RSDisplayNodeConfig config; - displayNode_ = Rosen::RSDisplayNode::Create(config); - if (displayNode_ == nullptr) { - WLOGFE("RSDisplayNode::Create fail"); - return WMError::WM_ERROR_NULLPTR; - } - - displayId_ = Rosen::RSInterfaces::GetInstance().GetDefaultScreenId(); - auto activeModeInfo = Rosen::RSInterfaces::GetInstance().GetScreenActiveMode(displayId_); - displayWidth_ = activeModeInfo.GetScreenWidth(); - displayHeight_ = activeModeInfo.GetScreenHeight(); - WLOGFD("Screen info: ScreenId=%{public}d, Width=%{public}d, Height=%{public}d", - displayId_, displayWidth_, displayHeight_); - - displayNode_->SetScreenId(displayId_); - displayNode_->SetBounds(0, 0, displayWidth_, displayHeight_); - displayNode_->AddChild(surfaceNode_, -1); - Rosen::RSTransaction::FlushImplicitTransaction(); - - return WMError::WM_OK; -} - WMError PointerDrawingManager::InitIconPixel() { #ifndef USE_IMITATE_POINTER diff --git a/window_manager/ft_pointer_draw/pointer_draw_manager.h b/window_manager/ft_pointer_draw/pointer_draw_manager.h index cc7081234b8cfe062643b29da468216a33e298d7..7c8e7d1c8deecfcf88bb0c01a3e4d52acc92ac43 100644 --- a/window_manager/ft_pointer_draw/pointer_draw_manager.h +++ b/window_manager/ft_pointer_draw/pointer_draw_manager.h @@ -146,7 +146,6 @@ private: }; OHOS::WMError InitLayerNode(int32_t x, int32_t y); - OHOS::WMError InitDisplayNode(); OHOS::WMError InitIconPixel(); OHOS::WMError CheckPixelFile(const std::string &filePath); OHOS::WMError MoveTo(int32_t x, int32_t y); @@ -154,11 +153,8 @@ private: SkColorType PixelFormatConvert(const OHOS::Media::PixelFormat& pixelFormat); bool isDrawing_ = false; - int32_t displayWidth_ = 0; - int32_t displayHeight_ = 0; int32_t displayId_ = 0; std::map mouseIcons_; - OHOS::Rosen::RSDisplayNode::SharedPtr displayNode_ = nullptr; OHOS::Rosen::RSSurfaceNode::SharedPtr surfaceNode_ = nullptr; std::shared_ptr rsSurface_ = nullptr; std::shared_ptr runner_ = nullptr;