From 8bfe7f6a66fda2157e46fc13a4a3025321a7ebed Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Fri, 29 Jul 2022 03:38:12 +0000 Subject: [PATCH 01/21] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=BC=A0=E6=A0=87?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xing-jiangpan Change-Id: If3dd49e81e97b23f63676f9f3e1adedf1feee648 --- .../include/input_manager_impl.h | 2 + .../event_handler/src/input_manager_impl.cpp | 21 +++ frameworks/proxy/events/src/input_manager.cpp | 12 ++ .../innerkits/proxy/include/input_manager.h | 2 + service/BUILD.gn | 133 ++++++++++++++- .../include/i_multimodal_input_connect.h | 4 + .../multimodal_input_connect_manager.h | 2 + .../include/multimodal_input_connect_proxy.h | 2 + .../include/multimodal_input_connect_stub.h | 2 + .../src/multimodal_input_connect_manager.cpp | 14 ++ .../src/multimodal_input_connect_proxy.cpp | 50 ++++++ .../src/multimodal_input_connect_stub.cpp | 45 +++++ service/module_loader/include/mmi_service.h | 2 + service/module_loader/src/mmi_service.cpp | 26 +++ .../include/i_pointer_drawing_manager.h | 17 +- .../include/input_windows_manager.h | 7 + .../include/pointer_drawing_manager.h | 20 ++- .../src/input_windows_manager.cpp | 161 +++++++++++++++++- .../src/pointer_drawing_manager.cpp | 147 +++++++++++++--- util/common/include/struct_multimodal.h | 20 +++ 20 files changed, 654 insertions(+), 35 deletions(-) diff --git a/frameworks/proxy/event_handler/include/input_manager_impl.h b/frameworks/proxy/event_handler/include/input_manager_impl.h index 6018844438..58cd721a54 100755 --- a/frameworks/proxy/event_handler/include/input_manager_impl.h +++ b/frameworks/proxy/event_handler/include/input_manager_impl.h @@ -96,6 +96,8 @@ public: int32_t GetKeyboardType(int32_t deviceId, std::function callback); int32_t SetPointerVisible(bool visible); + int32_t SetPointerStyle(int32_t windowId, int32_t iconId); + int32_t GetPointerStyle(int32_t windowId, int32_t &iconId); bool IsPointerVisible(); void SetAnrObserver(std::shared_ptr observer); diff --git a/frameworks/proxy/event_handler/src/input_manager_impl.cpp b/frameworks/proxy/event_handler/src/input_manager_impl.cpp index b95cab4894..4cccf83013 100755 --- a/frameworks/proxy/event_handler/src/input_manager_impl.cpp +++ b/frameworks/proxy/event_handler/src/input_manager_impl.cpp @@ -550,6 +550,27 @@ int32_t InputManagerImpl::SetPointerVisible(bool visible) #endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING } +int32_t InputManagerImpl::SetPointerStyle(int32_t windowId, int32_t iconId) +{ + CALL_DEBUG_ENTER; + int32_t ret = MultimodalInputConnMgr->SetPointerStyle(windowId, iconId); + if (ret != RET_OK) { + MMI_HILOGE("send to server fail, ret:%{public}d", ret); + } + return ret; +} + +int32_t InputManagerImpl::GetPointerStyle(int32_t windowId, int32_t &iconId) +{ + CALL_DEBUG_ENTER; + int32_t ret = MultimodalInputConnMgr->GetPointerStyle(windowId, iconId); + if (ret != RET_OK) { + MMI_HILOGE("send to server fail, ret:%{public}d", ret); + } + MMI_HILOGD("InputManagerImpl::GetPointerStyle, iconId:%{public}d, ret:%{public}d", iconId, ret); + return iconId; +} + bool InputManagerImpl::IsPointerVisible() { #if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING) diff --git a/frameworks/proxy/events/src/input_manager.cpp b/frameworks/proxy/events/src/input_manager.cpp index 3d65d84112..42aedfbb43 100755 --- a/frameworks/proxy/events/src/input_manager.cpp +++ b/frameworks/proxy/events/src/input_manager.cpp @@ -156,6 +156,18 @@ bool InputManager::IsPointerVisible() return InputMgrImpl->IsPointerVisible(); } +int32_t InputManager::SetPointerStyle(int32_t windowId, int32_t iconId) +{ + return InputMgrImpl->SetPointerStyle(windowId, iconId); +} + +int32_t InputManager::GetPointerStyle(int32_t windowId) +{ + int32_t iconId; + iconId = InputMgrImpl->GetPointerStyle(windowId, iconId); + return iconId; +} + int32_t InputManager::GetKeyboardType(int32_t deviceId, std::function callback) { return InputMgrImpl->GetKeyboardType(deviceId, callback); diff --git a/interfaces/native/innerkits/proxy/include/input_manager.h b/interfaces/native/innerkits/proxy/include/input_manager.h index edc4e57a7c..e912e91ddc 100755 --- a/interfaces/native/innerkits/proxy/include/input_manager.h +++ b/interfaces/native/innerkits/proxy/include/input_manager.h @@ -257,6 +257,8 @@ public: * @since 9 */ int32_t SetPointerVisible(bool visible); + int32_t SetPointerStyle(int32_t windowId, int32_t iconId); + int32_t GetPointerStyle(int32_t windowId); /** * @brief Checks whether the pointer icon is visible. diff --git a/service/BUILD.gn b/service/BUILD.gn index a06f237f59..2e55b5e06b 100755 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -120,13 +120,126 @@ ohos_prebuilt_etc("multimodalinput_config_ability.json") { relative_install_dir = "multimodalinput" } -ohos_prebuilt_etc("drawing_pointer_image") { +ohos_prebuilt_etc("drawing_pointer_image_angle") { source = "//foundation/multimodalinput/input/util/source_icon/angle.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } +ohos_prebuilt_etc("drawing_pointer_image_hand") { + source = "//foundation/multimodalinput/input/util/source_icon/hand.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_backgrounder") { + source = "//foundation/multimodalinput/input/util/source_icon/backgrounder.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_busy") { + source = "//foundation/multimodalinput/input/util/source_icon/busy.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_candidate") { + source = "//foundation/multimodalinput/input/util/source_icon/candidate.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_diagonalAdjustment1") { + source = "//foundation/multimodalinput/input/util/source_icon/diagonalAdjustment1.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_diagonalAdjustment2") { + source = "//foundation/multimodalinput/input/util/source_icon/diagonalAdjustment2.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_horizontalTrim") { + source = "//foundation/multimodalinput/input/util/source_icon/horizontalTrim.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_verticalAdjustment") { + source = "//foundation/multimodalinput/input/util/source_icon/verticalAdjustment.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_disable") { + source = "//foundation/multimodalinput/input/util/source_icon/disable.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_handwritten") { + source = "//foundation/multimodalinput/input/util/source_icon/handwritten.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_helpChoose") { + source = "//foundation/multimodalinput/input/util/source_icon/helpChoose.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_move") { + source = "//foundation/multimodalinput/input/util/source_icon/move.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_personalSelection") { + source = "//foundation/multimodalinput/input/util/source_icon/personalSelection.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_precisionSelect") { + source = "//foundation/multimodalinput/input/util/source_icon/precisionSelect.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_siteSelection") { + source = "//foundation/multimodalinput/input/util/source_icon/siteSelection.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_textSelection") { + source = "//foundation/multimodalinput/input/util/source_icon/textSelection.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + + ohos_shared_library("libmmi-server") { sources = [ "//foundation/multimodalinput/input/frameworks/proxy/event_handler/src/bytrace_adapter.cpp", @@ -199,7 +312,23 @@ ohos_shared_library("libmmi-server") { configs = [ ":libmmi_server_config" ] deps = [ - ":drawing_pointer_image", + ":drawing_pointer_image_angle", + ":drawing_pointer_image_hand", + ":drawing_pointer_image_backgrounder", + ":drawing_pointer_image_busy", + ":drawing_pointer_image_candidate", + ":drawing_pointer_image_diagonalAdjustment1", + ":drawing_pointer_image_diagonalAdjustment2", + ":drawing_pointer_image_horizontalTrim", + ":drawing_pointer_image_verticalAdjustment", + ":drawing_pointer_image_disable", + ":drawing_pointer_image_handwritten", + ":drawing_pointer_image_helpChoose", + ":drawing_pointer_image_move", + ":drawing_pointer_image_personalSelection", + ":drawing_pointer_image_precisionSelect", + ":drawing_pointer_image_siteSelection", + ":drawing_pointer_image_textSelection", ":mmi_device_config.ini", ":multimodalinput_config_ability.json", "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", diff --git a/service/connect_manager/include/i_multimodal_input_connect.h b/service/connect_manager/include/i_multimodal_input_connect.h index 3df946b786..cd4f0d8675 100755 --- a/service/connect_manager/include/i_multimodal_input_connect.h +++ b/service/connect_manager/include/i_multimodal_input_connect.h @@ -35,6 +35,8 @@ public: virtual int32_t AllocSocketFd(const std::string &programName, const int32_t moduleType, int32_t &socketFd) = 0; virtual int32_t AddInputEventFilter(sptr filter) = 0; virtual int32_t SetPointerVisible(bool visible) = 0; + virtual int32_t SetPointerStyle(int32_t windowId, int32_t iconId) = 0; + virtual int32_t GetPointerStyle(int32_t windowId, int32_t &iconId) = 0; virtual int32_t IsPointerVisible(bool &visible) = 0; virtual int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys) = 0; virtual int32_t GetDeviceIds(int32_t userData) = 0; @@ -71,6 +73,8 @@ public: REGISTER_DEV_MONITOR = 18, UNREGISTER_DEV_MONITOR = 19, GET_KEYBOARD_TYPE = 20, + SET_POINTER_STYLE = 21, + GET_POINTER_STYLE = 22 }; enum { diff --git a/service/connect_manager/include/multimodal_input_connect_manager.h b/service/connect_manager/include/multimodal_input_connect_manager.h index 50f0d3dd27..d4e35f18a6 100755 --- a/service/connect_manager/include/multimodal_input_connect_manager.h +++ b/service/connect_manager/include/multimodal_input_connect_manager.h @@ -35,6 +35,8 @@ public: int32_t GetClientSocketFdOfAllocedSocketPair() const; int32_t AddInputEventFilter(sptr filter); int32_t SetPointerVisible(bool visible); + int32_t SetPointerStyle(int32_t windowId, int32_t iconId); + int32_t GetPointerStyle(int32_t windowId, int32_t &iconId); int32_t IsPointerVisible(bool &visible); int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys); int32_t GetDeviceIds(int32_t userData); diff --git a/service/connect_manager/include/multimodal_input_connect_proxy.h b/service/connect_manager/include/multimodal_input_connect_proxy.h index 06c5dfe271..c115f32078 100755 --- a/service/connect_manager/include/multimodal_input_connect_proxy.h +++ b/service/connect_manager/include/multimodal_input_connect_proxy.h @@ -35,6 +35,8 @@ public: int32_t &socketFd) override; virtual int32_t AddInputEventFilter(sptr filter) override; virtual int32_t SetPointerVisible(bool visible) override; + virtual int32_t SetPointerStyle(int32_t windowId, int32_t iconId) override; + virtual int32_t GetPointerStyle(int32_t windowId, int32_t &iconId) override; virtual int32_t IsPointerVisible(bool &visible) override; virtual int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys) override; virtual int32_t GetDeviceIds(int32_t userData) override; diff --git a/service/connect_manager/include/multimodal_input_connect_stub.h b/service/connect_manager/include/multimodal_input_connect_stub.h index 3de1a51342..4347aade1a 100755 --- a/service/connect_manager/include/multimodal_input_connect_stub.h +++ b/service/connect_manager/include/multimodal_input_connect_stub.h @@ -40,6 +40,8 @@ protected: int32_t StubHandleAllocSocketFd(MessageParcel &data, MessageParcel &reply); int32_t StubAddInputEventFilter(MessageParcel& data, MessageParcel& reply); int32_t StubSetPointerVisible(MessageParcel& data, MessageParcel& reply); + int32_t StubSetPointerStyle(MessageParcel& data, MessageParcel& reply); + int32_t StubGetPointerStyle(MessageParcel& data, MessageParcel& reply); int32_t StubIsPointerVisible(MessageParcel& data, MessageParcel& reply); int32_t StubSupportKeys(MessageParcel& data, MessageParcel& reply); int32_t StubGetDeviceIds(MessageParcel& data, MessageParcel& reply); diff --git a/service/connect_manager/src/multimodal_input_connect_manager.cpp b/service/connect_manager/src/multimodal_input_connect_manager.cpp index a37a750517..f53b77edbd 100755 --- a/service/connect_manager/src/multimodal_input_connect_manager.cpp +++ b/service/connect_manager/src/multimodal_input_connect_manager.cpp @@ -89,6 +89,20 @@ int32_t MultimodalInputConnectManager::SetPointerVisible(bool visible) return multimodalInputConnectService_->SetPointerVisible(visible); } +int32_t MultimodalInputConnectManager::SetPointerStyle(int32_t windowId, int32_t iconId) +{ + CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID); + return multimodalInputConnectService_->SetPointerStyle(windowId, iconId); +} + +int32_t MultimodalInputConnectManager::GetPointerStyle(int32_t windowId, int32_t &iconId) +{ + CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID); + int32_t ret = multimodalInputConnectService_->GetPointerStyle(windowId, iconId); + MMI_HILOGD("MultimodalInputConnectManager::GetPointerStyle, ret:%{public}d", ret); + return ret; +} + int32_t MultimodalInputConnectManager::IsPointerVisible(bool &visible) { CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID); diff --git a/service/connect_manager/src/multimodal_input_connect_proxy.cpp b/service/connect_manager/src/multimodal_input_connect_proxy.cpp index bd10284512..274eb7f56a 100755 --- a/service/connect_manager/src/multimodal_input_connect_proxy.cpp +++ b/service/connect_manager/src/multimodal_input_connect_proxy.cpp @@ -119,6 +119,56 @@ int32_t MultimodalInputConnectProxy::SetPointerVisible(bool visible) return RET_OK; } +int32_t MultimodalInputConnectProxy::SetPointerStyle(int32_t windowId, int32_t iconId) +{ + CALL_DEBUG_ENTER; + MessageParcel data; + if (!data.WriteInterfaceToken(MultimodalInputConnectProxy::GetDescriptor())) { + MMI_HILOGE("Failed to write descriptor"); + return ERR_INVALID_VALUE; + } + WRITEINT32(data, windowId, ERR_INVALID_VALUE); + WRITEINT32(data, iconId, ERR_INVALID_VALUE); + + MessageParcel reply; + MessageOption option; + sptr remote = Remote(); + CHKPR(remote, RET_ERR); + int32_t ret = remote->SendRequest(SET_POINTER_STYLE, data, reply, option); + if (ret != RET_OK) { + MMI_HILOGE("send request fail, ret:%{public}d", ret); + return ret; + } + return RET_OK; +} + +int32_t MultimodalInputConnectProxy::GetPointerStyle(int32_t windowId, int32_t &iconId) +{ + CALL_DEBUG_ENTER; + MessageParcel data; + if (!data.WriteInterfaceToken(MultimodalInputConnectProxy::GetDescriptor())) { + MMI_HILOGE("Failed to write descriptor"); + return ERR_INVALID_VALUE; + } + MMI_HILOGD("MultimodalInputConnectProxy::GetPointerStyle, windowId:%{public}d, iconId:%{public}d", windowId, iconId); + + WRITEINT32(data, windowId, ERR_INVALID_VALUE); + WRITEINT32(data, iconId, ERR_INVALID_VALUE); + + MessageParcel reply; + MessageOption option; + sptr remote = Remote(); + CHKPR(remote, RET_ERR); + int32_t ret = remote->SendRequest(GET_POINTER_STYLE, data, reply, option); + if (ret != RET_OK) { + MMI_HILOGE("send request fail, ret:%{public}d", ret); + return ret; + } + iconId = reply.ReadInt32(); + MMI_HILOGD("MultimodalInputConnectProxy::GetPointerStyle, iconId:%{public}d", iconId); + return RET_OK; +} + int32_t MultimodalInputConnectProxy::IsPointerVisible(bool &visible) { CALL_DEBUG_ENTER; diff --git a/service/connect_manager/src/multimodal_input_connect_stub.cpp b/service/connect_manager/src/multimodal_input_connect_stub.cpp index 00e10bdfea..4e385c55d3 100755 --- a/service/connect_manager/src/multimodal_input_connect_stub.cpp +++ b/service/connect_manager/src/multimodal_input_connect_stub.cpp @@ -50,6 +50,8 @@ int32_t MultimodalInputConnectStub::OnRemoteRequest( {IMultimodalInputConnect::ALLOC_SOCKET_FD, &MultimodalInputConnectStub::StubHandleAllocSocketFd}, {IMultimodalInputConnect::ADD_INPUT_EVENT_FILTER, &MultimodalInputConnectStub::StubAddInputEventFilter}, {IMultimodalInputConnect::SET_POINTER_VISIBLE, &MultimodalInputConnectStub::StubSetPointerVisible}, + {IMultimodalInputConnect::SET_POINTER_STYLE, &MultimodalInputConnectStub::StubSetPointerStyle}, + {IMultimodalInputConnect::GET_POINTER_STYLE, &MultimodalInputConnectStub::StubGetPointerStyle}, {IMultimodalInputConnect::IS_POINTER_VISIBLE, &MultimodalInputConnectStub::StubIsPointerVisible}, {IMultimodalInputConnect::REGISTER_DEV_MONITOR, &MultimodalInputConnectStub::StubRegisterInputDeviceMonitor}, {IMultimodalInputConnect::UNREGISTER_DEV_MONITOR, @@ -143,6 +145,49 @@ int32_t MultimodalInputConnectStub::StubSetPointerVisible(MessageParcel& data, M return RET_OK; } +int32_t MultimodalInputConnectStub::StubSetPointerStyle(MessageParcel& data, MessageParcel& reply) +{ + CALL_DEBUG_ENTER; + if (!PerHelper->CheckPermission(PermissionHelper::APL_SYSTEM_BASIC_CORE)) { + MMI_HILOGE("permission check fail"); + return CHECK_PERMISSION_FAIL; + } + + int32_t windowId; + READINT32(data, windowId, IPC_PROXY_DEAD_OBJECT_ERR); + int32_t iconId; + READINT32(data, iconId, IPC_PROXY_DEAD_OBJECT_ERR); + int32_t ret = SetPointerStyle(windowId, iconId); + if (ret != RET_OK) { + MMI_HILOGE("call SetPointerStyle failed ret:%{public}d", ret); + return ret; + } + MMI_HILOGD("success window:%{public}d, icon:%{public}d, pid:%{public}d", windowId, iconId, GetCallingPid()); + return RET_OK; +} + +int32_t MultimodalInputConnectStub::StubGetPointerStyle(MessageParcel& data, MessageParcel& reply) +{ + CALL_DEBUG_ENTER; + if (!PerHelper->CheckPermission(PermissionHelper::APL_SYSTEM_BASIC_CORE)) { + MMI_HILOGE("permission check fail"); + return CHECK_PERMISSION_FAIL; + } + + int32_t windowId; + READINT32(data, windowId, IPC_PROXY_DEAD_OBJECT_ERR); + int32_t iconId; + READINT32(data, iconId, IPC_PROXY_DEAD_OBJECT_ERR); + int32_t ret = GetPointerStyle(windowId, iconId); + if (ret != RET_OK) { + MMI_HILOGE("call GetPointerStyle failed ret:%{public}d", ret); + return ret; + } + WRITEINT32(reply, iconId, IPC_STUB_WRITE_PARCEL_ERR); + MMI_HILOGD("success window:%{public}d, icon:%{public}d, pid:%{public}d", windowId, iconId, GetCallingPid()); + return RET_OK; +} + int32_t MultimodalInputConnectStub::StubIsPointerVisible(MessageParcel& data, MessageParcel& reply) { CALL_DEBUG_ENTER; diff --git a/service/module_loader/include/mmi_service.h b/service/module_loader/include/mmi_service.h index c3e4c8ce8a..497f16e35e 100755 --- a/service/module_loader/include/mmi_service.h +++ b/service/module_loader/include/mmi_service.h @@ -53,6 +53,8 @@ public: int32_t &toReturnClientFd) override; virtual int32_t AddInputEventFilter(sptr filter) override; virtual int32_t SetPointerVisible(bool visible) override; + virtual int32_t SetPointerStyle(int32_t windowId, int32_t iconId) override; + virtual int32_t GetPointerStyle(int32_t windowId, int32_t &iconId) override; virtual int32_t IsPointerVisible(bool &visible) override; virtual int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys) override; virtual int32_t GetDeviceIds(int32_t userData) override; diff --git a/service/module_loader/src/mmi_service.cpp b/service/module_loader/src/mmi_service.cpp index 04b497e9b5..614a8d4f43 100755 --- a/service/module_loader/src/mmi_service.cpp +++ b/service/module_loader/src/mmi_service.cpp @@ -389,6 +389,32 @@ int32_t MMIService::SetPointerVisible(bool visible) #endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING return RET_OK; } + +int32_t MMIService::SetPointerStyle(int32_t windowId, int32_t iconId) +{ + CALL_DEBUG_ENTER; + int32_t ret = delegateTasks_.PostSyncTask(std::bind(&IPointerDrawingManager::SetPointerStyle, + IPointerDrawingManager::GetInstance(), GetCallingPid(), windowId, iconId)); + if (ret != RET_OK) { + MMI_HILOGE("set pointer visible failed,return %{public}d", ret); + return ret; + } + return RET_OK; +} + +int32_t MMIService::GetPointerStyle(int32_t windowId, int32_t &iconId) +{ + CALL_DEBUG_ENTER; + int32_t ret = delegateTasks_.PostSyncTask(std::bind(&IPointerDrawingManager::GetPointerStyle, + IPointerDrawingManager::GetInstance(), GetCallingPid(), windowId, std::ref(iconId))); + if (ret != RET_OK) { + MMI_HILOGE("set pointer visible failed,return %{public}d", ret); + return ret; + } + MMI_HILOGD("MMIService::GetPointerStyle, iconId:%{public}d", iconId); + return RET_OK; +} + #if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING) int32_t MMIService::CheckPointerVisible(bool &visible) { diff --git a/service/window_manager/include/i_pointer_drawing_manager.h b/service/window_manager/include/i_pointer_drawing_manager.h index 42fb5801d4..00c61ef30f 100755 --- a/service/window_manager/include/i_pointer_drawing_manager.h +++ b/service/window_manager/include/i_pointer_drawing_manager.h @@ -17,6 +17,7 @@ #define I_POINTER_DRAWING_MANAGER_H #include +#include "struct_multimodal.h" #include "display_info.h" @@ -28,8 +29,8 @@ public: virtual ~IPointerDrawingManager() = default; static std::shared_ptr GetInstance(); - virtual void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY) {} - virtual void OnDisplayInfo(int32_t displayId, int32_t width, int32_t height, Direction direction) {} + virtual void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle = MOUSE_ICON::ANGLE) {} + virtual void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, int32_t width, int32_t height, Direction direction) {} virtual bool Init() { return true; @@ -39,10 +40,22 @@ public: { return 0; } + virtual int32_t SetPointerStyle(int32_t pid, int32_t windowId, int32_t iconId) + { + return 0; + } + virtual int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &iconId) + { + return 0; + } virtual bool IsPointerVisible() { return false; } + virtual int32_t InitLayer(const MOUSE_ICON mouseStyle) + { + return 0; + } public: static inline std::shared_ptr iPointDrawMgr_ = nullptr; diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h index 6be3a1a239..fad5b8cd6f 100755 --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -72,6 +72,11 @@ public: #endif // OHOS_BUILD_ENABLE_TOUCH #ifdef OHOS_BUILD_ENABLE_POINTER const DisplayGroupInfo& GetDisplayGroupInfo(); + void OnSessionLost(SessionPtr session); + int32_t SetPointerStyle(int32_t pid, int32_t windowId, int32_t iconId); + int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &iconId) const; + void UpdatePointerStyle(); + bool isNeedRefreshLayer(int32_t windowId); #endif // OHOS_BUILD_ENABLE_POINTER void Dump(int32_t fd, const std::vector &args); int32_t GetWindowPid(int32_t windowId, const DisplayGroupInfo& displayGroupInfo) const; @@ -108,6 +113,7 @@ private: #ifdef OHOS_BUILD_ENABLE_POINTER std::optional SelectWindowInfo(int32_t logicalX, int32_t logicalY, const std::shared_ptr& pointerEvent); + std::optional GetWindowInfo(int32_t logicalX, int32_t logicalY); #endif // OHOS_BUILD_ENABLE_POINTER #ifdef OHOS_BUILD_ENABLE_TOUCH void GetPhysicalDisplayCoord(struct libinput_event_touch* touch, @@ -128,6 +134,7 @@ private: int32_t lastLogicY_ = -1; WindowInfo lastWindowInfo_; std::shared_ptr lastPointerEvent_ = nullptr; + std::map> mapPointerStyle_ = {}; #endif // OHOS_BUILD_ENABLE_POINTER DisplayGroupInfo displayGroupInfo_; MouseLocation mouseLocation_ = {-1, -1}; // physical coord diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index 2b8d79690b..65b2b7ef5c 100755 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -36,16 +36,19 @@ class PointerDrawingManager : public IPointerDrawingManager, public IDeviceObserver, public std::enable_shared_from_this { public: - PointerDrawingManager() = default; - virtual ~PointerDrawingManager() = default; + PointerDrawingManager(); + ~PointerDrawingManager(); DISALLOW_COPY_AND_MOVE(PointerDrawingManager); - void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY); - void OnDisplayInfo(int32_t displayId, int32_t width, int32_t height, Direction direction); + void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle = MOUSE_ICON::ANGLE); + void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, int32_t width, int32_t height, Direction direction); void UpdatePointerDevice(bool hasPointerDevice); bool Init(); void DeletePointerVisible(int32_t pid); int32_t SetPointerVisible(int32_t pid, bool visible); + int32_t SetPointerStyle(int32_t pid, int32_t windowId, int32_t iconId); + int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &iconId); bool IsPointerVisible(); + int32_t InitLayer(const MOUSE_ICON mouseStyle); public: static const int32_t IMAGE_WIDTH = 64; @@ -55,8 +58,8 @@ private: void CreatePointerWindow(int32_t displayId, int32_t physicalX, int32_t physicalY); sptr GetLayer(); sptr GetSurfaceBuffer(sptr layer) const; - void DoDraw(uint8_t *addr, uint32_t width, uint32_t height); - void DrawPixelmap(OHOS::Rosen::Drawing::Canvas &canvas); + void DoDraw(uint8_t *addr, uint32_t width, uint32_t height, const MOUSE_ICON mouseStyle = MOUSE_ICON::ANGLE); + void DrawPixelmap(OHOS::Rosen::Drawing::Canvas &canvas, const std::string& iconPath); void DrawManager(); void FixCursorPosition(int32_t &physicalX, int32_t &physicalY); std::unique_ptr DecodeImageToPixelMap(const std::string &imagePath); @@ -70,10 +73,15 @@ private: int32_t displayId_ = -1; int32_t displayWidth_ = 0; int32_t displayHeight_ = 0; + int32_t pid_ = 0; + int32_t focusWindowId_ = 0; bool hasPointerDevice_ = false; int32_t lastPhysicalX_ = -1; int32_t lastPhysicalY_ = -1; Direction direction_ = Direction0; + int32_t preMouseStyle_ = 0; + std::map mouseIcons_; + struct PidInfo { int32_t pid { 0 }; bool visible { false }; diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index c978fddeaf..dbf9421c57 100755 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -22,6 +22,7 @@ #include "input_device_manager.h" #include "i_pointer_drawing_manager.h" #include "mouse_event_handler.h" +#include "pointer_drawing_manager.h" #include "util.h" #include "util_ex.h" @@ -29,6 +30,7 @@ namespace OHOS { namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "InputWindowsManager"}; +constexpr int32_t DEFAULT_POINTER_STYLE = 0; } // namespace InputWindowsManager::InputWindowsManager() {} @@ -38,6 +40,8 @@ InputWindowsManager::~InputWindowsManager() {} void InputWindowsManager::Init(UDSServer& udsServer) { udsServer_ = &udsServer; + CHKPV(udsServer_); + udsServer_->AddSessionDeletedCallback(std::bind(&InputWindowsManager::OnSessionLost, this, std::placeholders::_1)); } int32_t InputWindowsManager::GetClientFd(std::shared_ptr pointerEvent) const @@ -172,11 +176,22 @@ void InputWindowsManager::UpdateDisplayInfo(const DisplayGroupInfo &displayGroup CheckFocusWindowChange(displayGroupInfo); CheckZorderWindowChange(displayGroupInfo); displayGroupInfo_ = displayGroupInfo; + UpdatePointerStyle(); + if (!displayGroupInfo.displaysInfo.empty()) { #ifdef OHOS_BUILD_ENABLE_POINTER + const MouseLocation &mouseLocation = GetMouseInfo(); + int32_t logicX = mouseLocation.physicalX; + int32_t logicY = mouseLocation.physicalY; + auto touchWindow = GetWindowInfo(logicX, logicY); + if (!touchWindow) { + MMI_HILOGE("TouchWindow is nullptr"); + return; + } + int32_t focusWindowPid = GetWindowPid(touchWindow->id); IPointerDrawingManager::GetInstance()->OnDisplayInfo(displayGroupInfo.displaysInfo[0].id, - displayGroupInfo.displaysInfo[0].width, displayGroupInfo.displaysInfo[0].height, - displayGroupInfo.displaysInfo[0].direction); + focusWindowPid, touchWindow->id, displayGroupInfo.displaysInfo[0].width, + displayGroupInfo.displaysInfo[0].height, displayGroupInfo.displaysInfo[0].direction); #endif // OHOS_BUILD_ENABLE_POINTER } #ifdef OHOS_BUILD_ENABLE_POINTER_DRAWING @@ -449,6 +464,121 @@ const DisplayGroupInfo& InputWindowsManager::GetDisplayGroupInfo() { return displayGroupInfo_; } + +bool InputWindowsManager::isNeedRefreshLayer(int32_t windowId) +{ + CALL_DEBUG_ENTER; + const MouseLocation &mouseLocation = GetMouseInfo(); + int32_t logicX = mouseLocation.physicalX; + int32_t logicY = mouseLocation.physicalY; + auto touchWindow = GetWindowInfo(logicX, logicY); + if (!touchWindow) { + MMI_HILOGE("TouchWindow is nullptr"); + return false; + } + if (touchWindow->id == windowId) + { + MMI_HILOGD("Need refresh pointer style, focusWindow type:%{public}d, window type:%{public}d", + touchWindow->id, windowId); + return true; + } + + MMI_HILOGD("Not need refresh pointer style, focusWindow type:%{public}d, window type:%{public}d", + touchWindow->id, windowId); + return false; +} + +void InputWindowsManager::OnSessionLost(SessionPtr session) +{ + CALL_DEBUG_ENTER; + CHKPV(session); + int32_t pid = session->GetPid(); + + auto it = mapPointerStyle_.find(pid); + if (it != mapPointerStyle_.end()) { + mapPointerStyle_.erase(it); + MMI_HILOGD("Clear the pointer style map, pd:%{public}d", pid); + return; + } +} + +int32_t InputWindowsManager::SetPointerStyle(int32_t pid, int32_t windowId, int32_t iconId) +{ + CALL_DEBUG_ENTER; + auto it = mapPointerStyle_.find(pid); + if (it == mapPointerStyle_.end()) { + MMI_HILOGE("The pointer style map is not include param pd:%{public}d", pid); + return RET_ERR; + } + + auto subit = it->second.find(windowId); + if (subit == it->second.end()) { + MMI_HILOGE("The window type is invalid"); + return RET_ERR; + } + + it->second.erase(subit); + auto ret = it->second.insert(std::make_pair(windowId, iconId)); + if (!ret.second) { + MMI_HILOGE("Map insert failed, ret.second:%{public}d", ret.second); + return RET_ERR; + } + MMI_HILOGD("Window type:%{public}d set pointer style:%{public}d success", windowId, iconId); + return RET_OK; +} + +int32_t InputWindowsManager::GetPointerStyle(int32_t pid, int32_t windowId, int32_t &iconId) const +{ + CALL_DEBUG_ENTER; + iconId = DEFAULT_POINTER_STYLE; + + auto it = mapPointerStyle_.find(pid); + if (it == mapPointerStyle_.end()) { + MMI_HILOGE("The pointer style map is not include param pd, %{public}d", pid); + return RET_ERR; + } + + auto subit = it->second.find(windowId); + if (subit == it->second.end()) { + MMI_HILOGE("The window type is Invalid"); + return RET_ERR; + } + + iconId = subit->second; + MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, iconId); + return RET_OK; +} + +void InputWindowsManager::UpdatePointerStyle() +{ + CALL_DEBUG_ENTER; + for (const auto& windowItem : displayGroupInfo_.windowsInfo) { + int32_t pid = windowItem.pid; + auto it = mapPointerStyle_.find(pid); + if (it == mapPointerStyle_.end()) { + std::map tmpPointerStyle; + tmpPointerStyle.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); + auto iter = mapPointerStyle_.insert(std::make_pair(pid, tmpPointerStyle)); + if (!iter.second) { + MMI_HILOGE("The pd is duplicated"); + return; + } + continue; + } + + auto subit = it->second.find(windowItem.id); + if (subit == it->second.end()) { + auto iter = it->second.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); + if (!iter.second) { + MMI_HILOGE("The window type is duplicated"); + return; + } + } + } + + MMI_HILOGD("Number of pointer style:%{public}zu", mapPointerStyle_.size()); +} + #endif // OHOS_BUILD_ENABLE_POINTER #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) @@ -559,6 +689,23 @@ std::optional InputWindowsManager::SelectWindowInfo(int32_t logicalX return std::nullopt; } +std::optional InputWindowsManager::GetWindowInfo(int32_t logicalX, int32_t logicalY) +{ + CALL_DEBUG_ENTER; + for (const auto& item : displayGroupInfo_.windowsInfo) { + if ((item.flags & WindowInfo::FLAG_BIT_UNTOUCHABLE) == WindowInfo::FLAG_BIT_UNTOUCHABLE) { + MMI_HILOGD("Skip the untouchable window to continue searching, " + "window:%{public}d, flags:%{public}d", item.id, item.flags); + continue; + } else if (IsInHotArea(logicalX, logicalY, item.pointerHotAreas)) { + return std::make_optional(item); + } else { + MMI_HILOGW("Continue searching for the dispatch window"); + } + } + return std::nullopt; +} + void InputWindowsManager::UpdatePointerEvent(int32_t logicalX, int32_t logicalY, const std::shared_ptr& pointerEvent, const WindowInfo& touchWindow) { @@ -607,12 +754,20 @@ int32_t InputWindowsManager::UpdateMouseTarget(std::shared_ptr poi MMI_HILOGE("The addition of logicalY overflows"); return RET_ERR; } - IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); + auto touchWindow = SelectWindowInfo(logicalX, logicalY, pointerEvent); if (!touchWindow) { MMI_HILOGE("touchWindow is nullptr, targetWindow:%{public}d", pointerEvent->GetTargetWindowId()); return RET_ERR; } + + int32_t mouseStyle = 0; + int32_t ret = GetPointerStyle(touchWindow->pid, touchWindow->id, mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed, mouse style return default style"); + } + IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), pointerItem.GetDisplayY(), MOUSE_ICON(mouseStyle)); + pointerEvent->SetTargetWindowId(touchWindow->id); pointerEvent->SetAgentWindowId(touchWindow->agentWindowId); int32_t windowX = logicalX - touchWindow->area.x; diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 4201f037df..784951913b 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -32,16 +32,40 @@ namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "PointerDrawingManager" }; const std::string IMAGE_POINTER_JPEG_PATH = "/system/etc/multimodalinput/mouse_icon/angle.png"; +constexpr int32_t MAX_POINTER_STYLE = 16; } // namespace } // namespace MMI } // namespace OHOS namespace OHOS { namespace MMI { -void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY) +PointerDrawingManager::PointerDrawingManager() +{ + mouseIcons_[MOUSE_ICON::ANGLE] = "/system/etc/multimodalinput/mouse_icon/angle.png"; + mouseIcons_[MOUSE_ICON::HAND] = "/system/etc/multimodalinput/mouse_icon/hand.png"; + mouseIcons_[MOUSE_ICON::BACkGROUNDER] = "/system/etc/multimodalinput/mouse_icon/backgrounder.png"; + mouseIcons_[MOUSE_ICON::BUSY] = "/system/etc/multimodalinput/mouse_icon/busy.png"; + mouseIcons_[MOUSE_ICON::CANDIDATE] = "/system/etc/multimodalinput/mouse_icon/candidate.png"; + mouseIcons_[MOUSE_ICON::DIAGONALADJUSTMENT1] = "/system/etc/multimodalinput/mouse_icon/diagonalAdjustment1.png"; + mouseIcons_[MOUSE_ICON::DIAGONALADJUSTMENT2] = "/system/etc/multimodalinput/mouse_icon/diagonalAdjustment2.png"; + mouseIcons_[MOUSE_ICON::HORIZONTALTRIM] = "/system/etc/multimodalinput/mouse_icon/horizontalTrim.png"; + mouseIcons_[MOUSE_ICON::VERTICALADJUSTMENT] = "/system/etc/multimodalinput/mouse_icon/verticalAdjustment.png"; + mouseIcons_[MOUSE_ICON::DISABLE] = "/system/etc/multimodalinput/mouse_icon/disable.png"; + mouseIcons_[MOUSE_ICON::HANDWRITTEN] = "/system/etc/multimodalinput/mouse_icon/handwritten.png"; + mouseIcons_[MOUSE_ICON::HELPCHOOSE] = "/system/etc/multimodalinput/mouse_icon/helpChoose.png"; + mouseIcons_[MOUSE_ICON::MOVESTYLE] = "/system/etc/multimodalinput/mouse_icon/move.png"; + mouseIcons_[MOUSE_ICON::PERSONALSELECTION] = "/system/etc/multimodalinput/mouse_icon/personalSelection.png"; + mouseIcons_[MOUSE_ICON::PRECISIONSELECT] = "/system/etc/multimodalinput/mouse_icon/precisionSelect.png"; + mouseIcons_[MOUSE_ICON::SITESELECTION] = "/system/etc/multimodalinput/mouse_icon/siteSelection.png"; + mouseIcons_[MOUSE_ICON::TEXTSELECTION] = "/system/etc/multimodalinput/mouse_icon/textSelection.png"; +} + +PointerDrawingManager::~PointerDrawingManager() {} + +void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; - MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", displayId, physicalX, physicalY); + MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", displayId, physicalX, physicalY, mouseStyle); FixCursorPosition(physicalX, physicalY); lastPhysicalX_ = physicalX; lastPhysicalY_ = physicalY; @@ -49,31 +73,59 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in if (IsPointerVisible()) { pointerWindow_->MoveTo(physicalX, physicalY); } + + if (preMouseStyle_ == mouseStyle) { + MMI_HILOGD("The preMouseStyle is equal with mouseStyle"); + MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", + displayId, physicalX, physicalY); + return; + } + preMouseStyle_ = mouseStyle; + int32_t ret = InitLayer(mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return; + } + MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", displayId, physicalX, physicalY); return; } - + CreatePointerWindow(displayId, physicalX, physicalY); - CHKPV(pointerWindow_); + int32_t ret = InitLayer(mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return; + } + + MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", + displayId, physicalX, physicalY); + return; +} + +int32_t PointerDrawingManager::InitLayer(const MOUSE_ICON mouseStyle) +{ + CALL_DEBUG_ENTER; + CHKPR(pointerWindow_, RET_ERR); sptr layer = GetLayer(); if (layer == nullptr) { - MMI_HILOGE("Draw pointer is failed, get layer is nullptr"); + MMI_HILOGE("Init layer is failed, get layer is nullptr"); pointerWindow_->Destroy(); pointerWindow_ = nullptr; - return; + return RET_ERR; } sptr buffer = GetSurfaceBuffer(layer); if (buffer == nullptr || buffer->GetVirAddr() == nullptr) { - MMI_HILOGE("Draw pointer is failed, buffer or virAddr is nullptr"); + MMI_HILOGE("Init layer is failed, buffer or virAddr is nullptr"); pointerWindow_->Destroy(); pointerWindow_ = nullptr; - return; + return RET_ERR; } auto addr = static_cast(buffer->GetVirAddr()); - DoDraw(addr, buffer->GetWidth(), buffer->GetHeight()); + DoDraw(addr, buffer->GetWidth(), buffer->GetHeight(), mouseStyle); OHOS::BufferFlushConfig flushConfig = { .damage = { .w = buffer->GetWidth(), @@ -81,11 +133,9 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in }, }; OHOS::SurfaceError ret = layer->FlushBuffer(buffer, -1, flushConfig); - MMI_HILOGD("Draw pointer FlushBuffer ret:%{public}s", SurfaceErrorStr(ret).c_str()); - if (IsPointerVisible()) { - pointerWindow_->Show(); - } - MMI_HILOGD("displayId:%{public}d,physicalX:%{public}d,physicalY:%{public}d", displayId, physicalX, physicalY); + MMI_HILOGD("Init layer FlushBuffer ret:%{public}s", SurfaceErrorStr(ret).c_str()); + UpdatePointerVisible(); + return RET_OK; } void PointerDrawingManager::FixCursorPosition(int32_t &physicalX, int32_t &physicalY) @@ -167,7 +217,7 @@ sptr PointerDrawingManager::GetSurfaceBuffer(sptr pixelmap = DecodeImageToPixelMap(IMAGE_POINTER_JPEG_PATH); + std::unique_ptr pixelmap = DecodeImageToPixelMap(iconPath); CHKPV(pixelmap); OHOS::Rosen::Drawing::Pen pen; pen.SetAntiAlias(true); @@ -220,7 +270,8 @@ std::unique_ptr PointerDrawingManager::DecodeImageToPixel return pixelMap; } -void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t width, int32_t height, Direction direction) +void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, + int32_t width, int32_t height, Direction direction) { CALL_DEBUG_ENTER; hasDisplay_ = true; @@ -228,6 +279,8 @@ void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t width, int3 displayWidth_ = width; displayHeight_ = height; direction_ = direction; + focusWindowId_ = focusWindowId; + pid_ = pid; DrawManager(); } @@ -240,13 +293,23 @@ void PointerDrawingManager::UpdatePointerDevice(bool hasPointerDevice) void PointerDrawingManager::DrawManager() { - if (hasDisplay_ && hasPointerDevice_ && pointerWindow_ == nullptr) { + MMI_HILOGD("Draw manager, focusWindowId:%{public}d", focusWindowId_); + if (hasDisplay_ && hasPointerDevice_) { MMI_HILOGD("Draw pointer begin"); + int32_t mouseStyle = 0; + int32_t ret = WinMgr->GetPointerStyle(pid_, focusWindowId_, mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed, mouse style return default style"); + } + if (lastPhysicalX_ == -1 || lastPhysicalY_ == -1) { - DrawPointer(displayId_, displayWidth_/2, displayHeight_/2); + DrawPointer(displayId_, displayWidth_/2, displayHeight_/2, MOUSE_ICON(mouseStyle)); + MMI_HILOGD("Draw manager, mouseStyle:%{public}d", mouseStyle); return; } - DrawPointer(displayId_, lastPhysicalX_, lastPhysicalY_); + + DrawPointer(displayId_, lastPhysicalX_, lastPhysicalY_, MOUSE_ICON(mouseStyle)); + MMI_HILOGD("Draw manager, mouseStyle:%{public}d", mouseStyle); return; } @@ -334,5 +397,45 @@ int32_t PointerDrawingManager::SetPointerVisible(int32_t pid, bool visible) UpdatePointerVisible(); return RET_OK; } + +int32_t PointerDrawingManager::SetPointerStyle(int32_t pid, int32_t windowId, int32_t iconId) +{ + CALL_DEBUG_ENTER; + if (iconId > MAX_POINTER_STYLE) { + MMI_HILOGE("Pointer icon type invalid"); + return RET_ERR; + } + + if (WinMgr->SetPointerStyle(pid, windowId, iconId)) { + MMI_HILOGE("Set pointer style failed"); + return RET_ERR; + } + + if (!WinMgr->isNeedRefreshLayer(windowId)) { + MMI_HILOGD("Not need refresh layer, window type:%{public}d, icon type:%{public}d", windowId, iconId); + return RET_OK; + } + + int32_t ret = InitLayer(MOUSE_ICON(iconId)); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return RET_ERR; + } + MMI_HILOGD("Window type:%{public}d set pointer style:%{public}d success", windowId, iconId); + return RET_OK; +} + +int32_t PointerDrawingManager::GetPointerStyle(int32_t pid, int32_t windowId, int32_t &iconId) +{ + CALL_DEBUG_ENTER; + int32_t ret = WinMgr->GetPointerStyle(pid, windowId, iconId); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed, pointer style return default style"); + return RET_ERR; + } + + MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, iconId); + return RET_OK; +} } // namespace MMI } // namespace OHOS diff --git a/util/common/include/struct_multimodal.h b/util/common/include/struct_multimodal.h index 733e3e2d47..1945f62fc5 100755 --- a/util/common/include/struct_multimodal.h +++ b/util/common/include/struct_multimodal.h @@ -108,6 +108,26 @@ enum TABLET_PAD_STRIP_AXIS_SOURCE { TABLET_PAD_STRIP_SOURCE_FINGER, }; +enum MOUSE_ICON { + ANGLE = 0, + HAND = 1, + BACkGROUNDER = 2, + BUSY = 3, + CANDIDATE = 4, + DIAGONALADJUSTMENT1 = 5, + DIAGONALADJUSTMENT2 = 6, + HORIZONTALTRIM = 7, + VERTICALADJUSTMENT = 8, + DISABLE = 9, + HANDWRITTEN = 10, + HELPCHOOSE = 11, + MOVESTYLE = 12, + PERSONALSELECTION = 13, + PRECISIONSELECT = 14, + SITESELECTION = 15, + TEXTSELECTION = 16, +}; + #pragma pack(1) struct TagPackHead { MmiMessageId idMsg; -- Gitee From ed5abb25a0a32b61fd1fe4ed664a00b34ab279b3 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 4 Aug 2022 07:42:46 +0000 Subject: [PATCH 02/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Idee69301ab4e576dd9e7c32bcbb9c76728c28b31 --- .../napi/pointer/include/js_pointer_context.h | 5 - .../napi/pointer/include/js_pointer_manager.h | 3 - .../napi/pointer/src/js_pointer_context.cpp | 165 ------------------ .../napi/pointer/src/js_pointer_manager.cpp | 51 ------ util/source_icon/Default.png | Bin 2549 -> 1247 bytes 5 files changed, 224 deletions(-) diff --git a/frameworks/napi/pointer/include/js_pointer_context.h b/frameworks/napi/pointer/include/js_pointer_context.h index 6bd544a514..9a3fe590c9 100755 --- a/frameworks/napi/pointer/include/js_pointer_context.h +++ b/frameworks/napi/pointer/include/js_pointer_context.h @@ -27,17 +27,12 @@ public: static napi_value Export(napi_env env, napi_value exports); static napi_value SetPointerVisible(napi_env env, napi_callback_info info); static napi_value IsPointerVisible(napi_env env, napi_callback_info info); - static napi_value SetPointerStyle(napi_env env, napi_callback_info info); - static napi_value GetPointerStyle(napi_env env, napi_callback_info info); - static napi_value CreateEumnPointerStyle(napi_env env, napi_value exports); std::shared_ptr GetJsPointerMgr() const; private: static napi_value CreateInstance(napi_env env); static JsPointerContext* GetInstance(napi_env env); static napi_value CreateJsObject(napi_env env, napi_callback_info info); - static napi_value EnumConstructor(napi_env env, napi_callback_info info); - static napi_value CreatePointerStyle(napi_env env, napi_value exports); std::shared_ptr mgr_ {nullptr}; napi_ref contextRef_ {nullptr}; }; diff --git a/frameworks/napi/pointer/include/js_pointer_manager.h b/frameworks/napi/pointer/include/js_pointer_manager.h index f1585df49a..5b4dd583ca 100755 --- a/frameworks/napi/pointer/include/js_pointer_manager.h +++ b/frameworks/napi/pointer/include/js_pointer_manager.h @@ -57,7 +57,6 @@ const std::string CALL_FUNCTION = "napi_call_function"; const std::string CREATE_BOOL = "napi_get_boolean"; const std::string CREATE_INT32 = "napi_create_int32"; const std::string CREATE_OBJECT = "napi_create_object"; -const std::string GET_INT32 = "napi_get_value_int32"; } // namespace class JsCommon { @@ -85,8 +84,6 @@ public: void ResetEnv(); napi_value SetPointerVisible(napi_env env, bool visible, napi_value handle = nullptr); napi_value IsPointerVisible(napi_env env, napi_value handle = nullptr); - napi_value SetPointerStyle(napi_env env, int windowid, int pointerStyle, napi_value handle = nullptr); - napi_value GetPointerStyle(napi_env env, int windowid, napi_value handle = nullptr); }; } // namespace MMI } // namespace OHOS diff --git a/frameworks/napi/pointer/src/js_pointer_context.cpp b/frameworks/napi/pointer/src/js_pointer_context.cpp index cde60113ba..29f64fbc3b 100755 --- a/frameworks/napi/pointer/src/js_pointer_context.cpp +++ b/frameworks/napi/pointer/src/js_pointer_context.cpp @@ -19,25 +19,6 @@ namespace OHOS { namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "JsPointerContext" }; -enum IconId { - ANGLE = 0, - HAND = 1, - BACkGROUNDER = 2, - BUSY = 3, - CANDIDATE = 4, - DIAGONALADJUSTMENT1 = 5, - DIAGONALADJUSTMENT2 = 6, - HORIZONTALTRIM = 7, - VERTICALADJUSTMENT = 8, - DISABLE = 9, - HANDWRITTEN = 10, - HELPCHOOSE = 11, - MOVESTYLE = 12, - PERSONALSELECTION = 13, - PRECISIONSELECT = 14, - SITESELECTION = 15, - TEXTSELECTION = 16, -}; } // namespace JsPointerContext::JsPointerContext() : mgr_(std::make_shared()) {} @@ -181,146 +162,6 @@ napi_value JsPointerContext::IsPointerVisible(napi_env env, napi_callback_info i return jsPointerMgr->IsPointerVisible(env, argv[0]); } -napi_value JsPointerContext::SetPointerStyle(napi_env env, napi_callback_info info) -{ - CALL_DEBUG_ENTER; - size_t argc = 3; - napi_value argv[3]; - CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO); - if (argc < 1 || argc > 3) { - THROWERR(env, "The number of parameters is not as expected"); - return nullptr; - } - - if (!JsCommon::TypeOf(env, argv[0], napi_number)) { - THROWERR(env, "The first parameter type is wrong"); - return nullptr; - } - int32_t windowid = 0; - CHKRP(env, napi_get_value_int32(env, argv[0], &windowid), GET_INT32); - - if (!JsCommon::TypeOf(env, argv[1], napi_number)) { - THROWERR(env, "The second parameter type is wrong"); - return nullptr; - } - int32_t pointerStyle = 0; - CHKRP(env, napi_get_value_int32(env, argv[1], &pointerStyle), GET_INT32); - - JsPointerContext *jsPointer = JsPointerContext::GetInstance(env); - auto jsmouseMgr = jsPointer->GetJsPointerMgr(); - if (argc == 2) { - return jsmouseMgr->SetPointerStyle(env, windowid, pointerStyle); - } - if (!JsCommon::TypeOf(env, argv[2], napi_function)) { - THROWERR(env, "The third parameter type is wrong"); - return nullptr; - } - return jsmouseMgr->SetPointerStyle(env, windowid, pointerStyle, argv[2]); -} - -napi_value JsPointerContext::GetPointerStyle(napi_env env, napi_callback_info info) -{ - CALL_DEBUG_ENTER; - size_t argc = 2; - napi_value argv[2]; - CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO); - if (argc < 1 || argc > 2) { - THROWERR(env, "The number of parameters is not as expected"); - return nullptr; - } - - if (!JsCommon::TypeOf(env, argv[0], napi_number)) { - THROWERR(env, "The first parameter type is wrong"); - return nullptr; - } - int32_t windowid = 0; - CHKRP(env, napi_get_value_int32(env, argv[0], &windowid), GET_INT32); - - JsPointerContext *jsPointer = JsPointerContext::GetInstance(env); - auto jsmouseMgr = jsPointer->GetJsPointerMgr(); - if (argc == 1) { - return jsmouseMgr->GetPointerStyle(env, windowid); - } - if (!JsCommon::TypeOf(env, argv[1], napi_function)) { - THROWERR(env, "The second parameter type is wrong"); - return nullptr; - } - return jsmouseMgr->GetPointerStyle(env, windowid, argv[1]); -} - -napi_value JsPointerContext::CreatePointerStyle(napi_env env, napi_value exports) -{ - CALL_DEBUG_ENTER; - napi_value angle = nullptr; - CHKRP(env, napi_create_int32(env, IconId::ANGLE, &angle), CREATE_INT32); - napi_value hand = nullptr; - CHKRP(env, napi_create_int32(env, IconId::HAND, &hand), CREATE_INT32); - napi_value backgrounder = nullptr; - CHKRP(env, napi_create_int32(env, IconId::BACkGROUNDER, &backgrounder), CREATE_INT32); - napi_value busy = nullptr; - CHKRP(env, napi_create_int32(env, IconId::BUSY, &busy), CREATE_INT32); - napi_value candidate = nullptr; - CHKRP(env, napi_create_int32(env, IconId::CANDIDATE, &candidate), CREATE_INT32); - napi_value diagonaladjustment1 = nullptr; - CHKRP(env, napi_create_int32(env, IconId::DIAGONALADJUSTMENT1, &diagonaladjustment1), CREATE_INT32); - napi_value diagonaladjustment2 = nullptr; - CHKRP(env, napi_create_int32(env, IconId::DIAGONALADJUSTMENT2, &diagonaladjustment2), CREATE_INT32); - napi_value horizontaltrim = nullptr; - CHKRP(env, napi_create_int32(env, IconId::HORIZONTALTRIM, &horizontaltrim), CREATE_INT32); - napi_value verticaladjustment = nullptr; - CHKRP(env, napi_create_int32(env, IconId::VERTICALADJUSTMENT, &verticaladjustment), CREATE_INT32); - napi_value disable = nullptr; - CHKRP(env, napi_create_int32(env, IconId::DISABLE, &disable), CREATE_INT32); - napi_value handwritten = nullptr; - CHKRP(env, napi_create_int32(env, IconId::HANDWRITTEN, &handwritten), CREATE_INT32); - napi_value helpchoose = nullptr; - CHKRP(env, napi_create_int32(env, IconId::HELPCHOOSE, &helpchoose), CREATE_INT32); - napi_value move = nullptr; - CHKRP(env, napi_create_int32(env, IconId::MOVESTYLE, &move), CREATE_INT32); - napi_value personalselection = nullptr; - CHKRP(env, napi_create_int32(env, IconId::PERSONALSELECTION, &personalselection), CREATE_INT32); - napi_value precisionselect = nullptr; - CHKRP(env, napi_create_int32(env, IconId::PRECISIONSELECT, &precisionselect), CREATE_INT32); - napi_value siteselection = nullptr; - CHKRP(env, napi_create_int32(env, IconId::SITESELECTION, &siteselection), CREATE_INT32); - napi_value textselection = nullptr; - CHKRP(env, napi_create_int32(env, IconId::TEXTSELECTION, &textselection), CREATE_INT32); - - napi_property_descriptor desc[] = { - DECLARE_NAPI_STATIC_PROPERTY("ANGLE", angle), - DECLARE_NAPI_STATIC_PROPERTY("HAND", hand), - DECLARE_NAPI_STATIC_PROPERTY("BACkGROUNDER", busy), - DECLARE_NAPI_STATIC_PROPERTY("CANDIDATE", candidate), - DECLARE_NAPI_STATIC_PROPERTY("DIAGONALADJUSTMENT1", diagonaladjustment1), - DECLARE_NAPI_STATIC_PROPERTY("DIAGONALADJUSTMENT2", diagonaladjustment2), - DECLARE_NAPI_STATIC_PROPERTY("HORIZONTALTRIM", horizontaltrim), - DECLARE_NAPI_STATIC_PROPERTY("VERTICALADJUSTMENT", verticaladjustment), - DECLARE_NAPI_STATIC_PROPERTY("DISABLE", disable), - DECLARE_NAPI_STATIC_PROPERTY("HANDWRITTEN", handwritten), - DECLARE_NAPI_STATIC_PROPERTY("HELPCHOOSE", helpchoose), - DECLARE_NAPI_STATIC_PROPERTY("MOVE", move), - DECLARE_NAPI_STATIC_PROPERTY("PERSONALSELECTION", personalselection), - DECLARE_NAPI_STATIC_PROPERTY("PRECISIONSELECT", precisionselect), - DECLARE_NAPI_STATIC_PROPERTY("SITESELECTION", siteselection), - DECLARE_NAPI_STATIC_PROPERTY("TEXTSELECTION", textselection), - }; - napi_value result = nullptr; - CHKRP(env, napi_define_class(env, "Iconid", NAPI_AUTO_LENGTH, EnumConstructor, nullptr, - sizeof(desc) / sizeof(*desc), desc, &result), DEFINE_CLASS); - CHKRP(env, napi_set_named_property(env, exports, "Iconid", result), SET_NAMED_PROPERTY); - return exports; -} - -napi_value JsPointerContext::EnumConstructor(napi_env env, napi_callback_info info) -{ - CALL_DEBUG_ENTER; - size_t argc = 0; - napi_value args[1] = {0}; - napi_value ret = nullptr; - void *data = nullptr; - CHKRP(env, napi_get_cb_info(env, info, &argc, args, &ret, &data), GET_CB_INFO); - return ret; -} napi_value JsPointerContext::Export(napi_env env, napi_value exports) { CALL_DEBUG_ENTER; @@ -332,14 +173,8 @@ napi_value JsPointerContext::Export(napi_env env, napi_value exports) napi_property_descriptor desc[] = { DECLARE_NAPI_STATIC_FUNCTION("setPointerVisible", SetPointerVisible), DECLARE_NAPI_STATIC_FUNCTION("isPointerVisible", IsPointerVisible), - DECLARE_NAPI_STATIC_FUNCTION("setPointerStyle", SetPointerStyle), - DECLARE_NAPI_STATIC_FUNCTION("getPointerStyle", GetPointerStyle), }; CHKRP(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc), DEFINE_PROPERTIES); - if(CreatePointerStyle(env, exports) == nullptr) { - THROWERR(env, "Failed to create pointer style"); - return nullptr; - } return exports; } } // namespace MMI diff --git a/frameworks/napi/pointer/src/js_pointer_manager.cpp b/frameworks/napi/pointer/src/js_pointer_manager.cpp index 2653050d06..cf1127c9fa 100755 --- a/frameworks/napi/pointer/src/js_pointer_manager.cpp +++ b/frameworks/napi/pointer/src/js_pointer_manager.cpp @@ -165,56 +165,5 @@ napi_value JsPointerManager::IsPointerVisible(napi_env env, napi_value handle) AsyncCallbackWork(asyncContext); return promise; } - -napi_value JsPointerManager::SetPointerStyle(napi_env env, int windowid, int pointerStyle, napi_value handle) -{ - CALL_DEBUG_ENTER; - sptr asyncContext = new (std::nothrow) AsyncContext(env); - if (asyncContext == nullptr) { - THROWERR(env, "create AsyncContext failed"); - return nullptr; - } - - asyncContext->errorCode = InputManager::GetInstance()->SetPointerStyle(windowid, pointerStyle); - asyncContext->reserve << ReturnType::VOID; - - napi_value promise = nullptr; - if (handle != nullptr) { - CHKRP(env, napi_create_reference(env, handle, 1, &asyncContext->callback), CREATE_REFERENCE); - CHKRP(env, napi_get_undefined(env, &promise), GET_UNDEFINED); - } else { - CHKRP(env, napi_create_promise(env, &asyncContext->deferred, &promise), CREATE_PROMISE); - } - AsyncCallbackWork(asyncContext); - return promise; -} - -napi_value JsPointerManager::GetPointerStyle(napi_env env, int windowid, napi_value handle) -{ - CALL_DEBUG_ENTER; - sptr asyncContext = new (std::nothrow) AsyncContext(env); - if (asyncContext == nullptr) { - THROWERR(env, "create AsyncContext failed"); - return nullptr; - } - - int pointerStyle = InputManager::GetInstance()->GetPointerStyle(windowid); - if (pointerStyle == RET_ERR) - { - asyncContext->errorCode = ERR_OK; - } - asyncContext->reserve << ReturnType::NUMBER << pointerStyle; - asyncContext->errorCode = ERR_OK; - napi_value promise = nullptr; - if (handle != nullptr) { - CHKRP(env, napi_create_reference(env, handle, 1, &asyncContext->callback), CREATE_REFERENCE); - CHKRP(env, napi_get_undefined(env, &promise), GET_UNDEFINED); - } else { - CHKRP(env, napi_create_promise(env, &asyncContext->deferred, &promise), CREATE_PROMISE); - } - AsyncCallbackWork(asyncContext); - return promise; -} - } // namespace MMI } // namespace OHOS \ No newline at end of file diff --git a/util/source_icon/Default.png b/util/source_icon/Default.png index cd2afb76ad60205efe489297d16bf3f089e9ac9f..038a5ecf7384c5905cf3e53109fb4f5e07af4671 100755 GIT binary patch literal 1247 zcmX|93rv$&6#iQ%^g)Y6UJ;2M-AV;vL$LEyIqQeLIp9sHA>hs40{ez2$p@D(X(J+P5-V#2tjzn?l6!GV??F3iC&#^HlS!fIsJK-fML z5yxXN7;tZ7WCY)tnHf7fJ7Z&G3Wb6YT3%kZx3{O!XmGWt=`uqEvn3w=43#zF=3;ipa4pMq^zur08*)x05vr=gp&f#zXLxw~m0f0i4m6i4N^+1E8jg1Yc zh4AZPh=>SiY;<&VQ&SV0%?1^`2?5E)Cl&{T(fV0T zRBR>+z|d>K7D6j$NoXYn;h!M<3c}0C2)~8YwFXGtYKYdlDQM%-#-OowjJ7q&*io`} zW)JBW%=NFW(25PhZDC~I#*P|ClTVtyiu7 z`%pY9+Zo;w;k`X;ckNhd3;CQPFeth(!75N@N4QUNx5D(!f&D zvK$OFw())@pFjth)O5LPK8k=dxGAs)c}OBWw@vn-oSxU6c1|+1zlVVb$Z= zHz6L5!i?<&HK+U4u>kQ!pMTwDn)4LfE_u3P^;xn0!BO>;;vGZl3hk(6-{y@Rt3*Fj z_pZIE>HYrMN=bBE#&GA$nYlExi67`H%cDcHzm1Zgsv3VS-uL@fbu8qA)G;gD=67Kh NF+MLUq=PFe`41oP{u%%P literal 2549 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 LNkvXXu0mjfQF+cK -- Gitee From b6bc5a03c4fb3a4b157a067ecf392bc2d4a5b068 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 4 Aug 2022 07:50:06 +0000 Subject: [PATCH 03/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I9de77826e4eb95f5c07e160be67daf3c5629ecff --- frameworks/proxy/events/test/input_manager_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/proxy/events/test/input_manager_test.cpp b/frameworks/proxy/events/test/input_manager_test.cpp index 8d01eafa24..91d071559e 100755 --- a/frameworks/proxy/events/test/input_manager_test.cpp +++ b/frameworks/proxy/events/test/input_manager_test.cpp @@ -2331,7 +2331,6 @@ HWTEST_F(InputManagerTest, InputManagerTest_SetWindowInputEventConsumer_002, Tes uint64_t consumerThreadId = consumer->GetConsumerThreadId(); EXPECT_EQ(runnerThreadId, consumerThreadId); } -<<<<<<< Updated upstream #endif // OHOS_BUILD_ENABLE_KEYBOARD /** -- Gitee From f7167d0e1e53d490cd7b08d8072906be56343fe3 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 4 Aug 2022 08:51:56 +0000 Subject: [PATCH 04/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Iac04720370a53e9d72569cd9bc4e711374cc7a69 --- frameworks/proxy/events/src/input_manager.cpp | 6 +- .../include/i_pointer_drawing_manager.h | 6 +- .../include/pointer_drawing_manager.h | 6 +- .../src/input_windows_manager.cpp | 6 +- .../src/pointer_drawing_manager.cpp | 87 ++++++++++--------- 5 files changed, 57 insertions(+), 54 deletions(-) diff --git a/frameworks/proxy/events/src/input_manager.cpp b/frameworks/proxy/events/src/input_manager.cpp index ac110d1eb9..202da0ad5a 100755 --- a/frameworks/proxy/events/src/input_manager.cpp +++ b/frameworks/proxy/events/src/input_manager.cpp @@ -179,8 +179,7 @@ void InputManager::SetAnrObserver(std::shared_ptr observer) int32_t InputManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle) { - if(windowId < 0 || pointerStyle <0) - { + if (windowId < 0 || pointerStyle <0) { MMI_HILOGW("Parameter passing error"); return RET_ERR; } @@ -189,8 +188,7 @@ int32_t InputManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle) int32_t InputManager::GetPointerStyle(int32_t windowId) { - if(windowId < 0) - { + if (windowId < 0) { MMI_HILOGW("Parameter passing error"); return RET_ERR; } diff --git a/service/window_manager/include/i_pointer_drawing_manager.h b/service/window_manager/include/i_pointer_drawing_manager.h index dc445f37cd..eefffb548d 100755 --- a/service/window_manager/include/i_pointer_drawing_manager.h +++ b/service/window_manager/include/i_pointer_drawing_manager.h @@ -29,8 +29,10 @@ public: virtual ~IPointerDrawingManager() = default; static std::shared_ptr GetInstance(); - virtual void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT) {} - virtual void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, int32_t width, int32_t height, Direction direction) {} + virtual void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, + const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT) {} + virtual void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, + int32_t width, int32_t height, Direction direction) {} virtual bool Init() { return true; diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index b73c17b2e9..1f9c3f5706 100755 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -39,8 +39,10 @@ public: PointerDrawingManager(); ~PointerDrawingManager(); DISALLOW_COPY_AND_MOVE(PointerDrawingManager); - void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT); - void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, int32_t width, int32_t height, Direction direction); + void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, + const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT); + void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId,int32_t width, + int32_t height, Direction direction); void UpdatePointerDevice(bool hasPointerDevice); bool Init(); void DeletePointerVisible(int32_t pid); diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index 168896975c..e6c485d282 100755 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -476,8 +476,7 @@ bool InputWindowsManager::isNeedRefreshLayer(int32_t windowId) MMI_HILOGE("TouchWindow is nullptr"); return false; } - if (touchWindow->id == windowId) - { + if (touchWindow->id == windowId) { MMI_HILOGD("Need refresh pointer style, focusWindow type:%{public}d, window type:%{public}d", touchWindow->id, windowId); return true; @@ -761,7 +760,8 @@ int32_t InputWindowsManager::UpdateMouseTarget(std::shared_ptr poi if (ret != RET_OK) { MMI_HILOGE("Get pointer style failed, mouse style return default style"); } - IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), pointerItem.GetDisplayY(), MOUSE_ICON(mouseStyle)); + IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), + pointerItem.GetDisplayY(), MOUSE_ICON(mouseStyle)); pointerEvent->SetTargetWindowId(touchWindow->id); pointerEvent->SetAgentWindowId(touchWindow->agentWindowId); diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 5fc159853e..893cd997c7 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -31,7 +31,7 @@ namespace OHOS { namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "PointerDrawingManager" }; -const std::string IMAGE_POINTER_JPEG_PATH = "/system/etc/multimodalinput/mouse_icon/Default.png"; +const std::string IMAGE_POINTER_JPEG_PATH = "/system/etc/multimodalinput/mouse_icon/"; constexpr int32_t MAX_POINTER_STYLE = 38; } // namespace } // namespace MMI @@ -41,50 +41,51 @@ namespace OHOS { namespace MMI { PointerDrawingManager::PointerDrawingManager() { - mouseIcons_[MOUSE_ICON::DEFAULT] = "/system/etc/multimodalinput/mouse_icon/Default.png"; - mouseIcons_[MOUSE_ICON::EAST] = "/system/etc/multimodalinput/mouse_icon/East.png"; - mouseIcons_[MOUSE_ICON::WEST] = "/system/etc/multimodalinput/mouse_icon/West.png"; - mouseIcons_[MOUSE_ICON::SOUTH] = "/system/etc/multimodalinput/mouse_icon/South.png"; - mouseIcons_[MOUSE_ICON::NORTH] = "/system/etc/multimodalinput/mouse_icon/North.png"; - mouseIcons_[MOUSE_ICON::WEST_EAST] = "/system/etc/multimodalinput/mouse_icon/westEast.png"; - mouseIcons_[MOUSE_ICON::NORTH_SOUTH] = "/system/etc/multimodalinput/mouse_icon/northSouth.png"; - mouseIcons_[MOUSE_ICON::NORTH_EAST] = "/system/etc/multimodalinput/mouse_icon/northEast.png"; - mouseIcons_[MOUSE_ICON::NORTH_WEST] = "/system/etc/multimodalinput/mouse_icon/northWest.png"; - mouseIcons_[MOUSE_ICON::SOUTH_EAST] = "/system/etc/multimodalinput/mouse_icon/southEast.png"; - mouseIcons_[MOUSE_ICON::SOUTH_WEST] = "/system/etc/multimodalinput/mouse_icon/southWest.png"; - mouseIcons_[MOUSE_ICON::NORTH_EAST_SOUTH_WEST] = "/system/etc/multimodalinput/mouse_icon/northEastSouthWest.png"; - mouseIcons_[MOUSE_ICON::NORTH_WEST_SOUTH_EAST] = "/system/etc/multimodalinput/mouse_icon/northWestSouthEast.png"; - mouseIcons_[MOUSE_ICON::CROSS] = "/system/etc/multimodalinput/mouse_icon/Cross.png"; - mouseIcons_[MOUSE_ICON::CURSOR_COPY] = "/system/etc/multimodalinput/mouse_icon/cursorCopy.png"; - mouseIcons_[MOUSE_ICON::CURSOR_FORBID] = "/system/etc/multimodalinput/mouse_icon/cursorForbid.png"; - mouseIcons_[MOUSE_ICON::COLOR_SUCKER] = "/system/etc/multimodalinput/mouse_icon/colorsucker.png"; - mouseIcons_[MOUSE_ICON::HAND_GRABBING] = "/system/etc/multimodalinput/mouse_icon/handGrabbing.png"; - mouseIcons_[MOUSE_ICON::HAND_OPEN] = "/system/etc/multimodalinput/mouse_icon/handOpen.png"; - mouseIcons_[MOUSE_ICON::HAND_POINTING] = "/system/etc/multimodalinput/mouse_icon/handPointing.png"; - mouseIcons_[MOUSE_ICON::HELP] = "/system/etc/multimodalinput/mouse_icon/Help.png"; - mouseIcons_[MOUSE_ICON::CURSOR_MOVE] = "/system/etc/multimodalinput/mouse_icon/Move.png"; - mouseIcons_[MOUSE_ICON::RESIZE_LEFT_RIGHT] = "/system/etc/multimodalinput/mouse_icon/resizeLeftRight.png"; - mouseIcons_[MOUSE_ICON::RESIZE_UP_DOWN] = "/system/etc/multimodalinput/mouse_icon/resizeUpDown.png"; - mouseIcons_[MOUSE_ICON::SCREENSHOT_CHOOSE] = "/system/etc/multimodalinput/mouse_icon/screenshotChoose.png"; - mouseIcons_[MOUSE_ICON::SCREENSHOT_CURSOR] = "/system/etc/multimodalinput/mouse_icon/screenshotCursor.png"; - mouseIcons_[MOUSE_ICON::TEXT_CURSOR] = "/system/etc/multimodalinput/mouse_icon/textCursor.png"; - mouseIcons_[MOUSE_ICON::ZOOM_IN] = "/system/etc/multimodalinput/mouse_icon/zoomIn.png"; - mouseIcons_[MOUSE_ICON::ZOOM_OUT] = "/system/etc/multimodalinput/mouse_icon/zoomOut.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_EAST] = "/system/etc/multimodalinput/mouse_icon/middleBinEast.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_WEST] = "/system/etc/multimodalinput/mouse_icon/middleBinWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH] = "/system/etc/multimodalinput/mouse_icon/middleBinSouth.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH] = "/system/etc/multimodalinput/mouse_icon/middleBinNorth.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH] = "/system/etc/multimodalinput/mouse_icon/middleBinNorthSouth.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_EAST] = "/system/etc/multimodalinput/mouse_icon/middleBinNorthEast.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_WEST] = "/system/etc/multimodalinput/mouse_icon/middleBinNorthWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST] = "/system/etc/multimodalinput/mouse_icon/middleBinSouthEast.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST] = "/system/etc/multimodalinput/mouse_icon/middleBinSouthWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST] = "/system/etc/multimodalinput/mouse_icon/middleBinNorthSouthWestEast.png"; + mouseIcons_[MOUSE_ICON::DEFAULT] = IMAGE_POINTER_JPEG_PATH + "Default.png"; + mouseIcons_[MOUSE_ICON::EAST] = IMAGE_POINTER_JPEG_PATH + "East.png"; + mouseIcons_[MOUSE_ICON::WEST] = IMAGE_POINTER_JPEG_PATH + "West.png"; + mouseIcons_[MOUSE_ICON::SOUTH] = IMAGE_POINTER_JPEG_PATH + "South.png"; + mouseIcons_[MOUSE_ICON::NORTH] = IMAGE_POINTER_JPEG_PATH + "North.png"; + mouseIcons_[MOUSE_ICON::WEST_EAST] = IMAGE_POINTER_JPEG_PATH + "westEast.png"; + mouseIcons_[MOUSE_ICON::NORTH_SOUTH] = IMAGE_POINTER_JPEG_PATH + "northSouth.png"; + mouseIcons_[MOUSE_ICON::NORTH_EAST] = IMAGE_POINTER_JPEG_PATH + "northEast.png"; + mouseIcons_[MOUSE_ICON::NORTH_WEST] = IMAGE_POINTER_JPEG_PATH + "northWest.png"; + mouseIcons_[MOUSE_ICON::SOUTH_EAST] = IMAGE_POINTER_JPEG_PATH + "southEast.png"; + mouseIcons_[MOUSE_ICON::SOUTH_WEST] = IMAGE_POINTER_JPEG_PATH + "southWest.png"; + mouseIcons_[MOUSE_ICON::NORTH_EAST_SOUTH_WEST] = IMAGE_POINTER_JPEG_PATH + "northEastSouthWest.png"; + mouseIcons_[MOUSE_ICON::NORTH_WEST_SOUTH_EAST] = IMAGE_POINTER_JPEG_PATH + "northWestSouthEast.png"; + mouseIcons_[MOUSE_ICON::CROSS] = IMAGE_POINTER_JPEG_PATH + "Cross.png"; + mouseIcons_[MOUSE_ICON::CURSOR_COPY] = IMAGE_POINTER_JPEG_PATH + "cursorCopy.png"; + mouseIcons_[MOUSE_ICON::CURSOR_FORBID] = IMAGE_POINTER_JPEG_PATH + "cursorForbid.png"; + mouseIcons_[MOUSE_ICON::COLOR_SUCKER] = IMAGE_POINTER_JPEG_PATH + "colorsucker.png"; + mouseIcons_[MOUSE_ICON::HAND_GRABBING] = IMAGE_POINTER_JPEG_PATH + "handGrabbing.png"; + mouseIcons_[MOUSE_ICON::HAND_OPEN] = IMAGE_POINTER_JPEG_PATH + "handOpen.png"; + mouseIcons_[MOUSE_ICON::HAND_POINTING] = IMAGE_POINTER_JPEG_PATH + "handPointing.png"; + mouseIcons_[MOUSE_ICON::HELP] = IMAGE_POINTER_JPEG_PATH + "Help.png"; + mouseIcons_[MOUSE_ICON::CURSOR_MOVE] = IMAGE_POINTER_JPEG_PATH + "Move.png"; + mouseIcons_[MOUSE_ICON::RESIZE_LEFT_RIGHT] = IMAGE_POINTER_JPEG_PATH + "resizeLeftRight.png"; + mouseIcons_[MOUSE_ICON::RESIZE_UP_DOWN] = IMAGE_POINTER_JPEG_PATH + "resizeUpDown.png"; + mouseIcons_[MOUSE_ICON::SCREENSHOT_CHOOSE] = IMAGE_POINTER_JPEG_PATH + "screenshotChoose.png"; + mouseIcons_[MOUSE_ICON::SCREENSHOT_CURSOR] = IMAGE_POINTER_JPEG_PATH + "screenshotCursor.png"; + mouseIcons_[MOUSE_ICON::TEXT_CURSOR] = IMAGE_POINTER_JPEG_PATH + "textCursor.png"; + mouseIcons_[MOUSE_ICON::ZOOM_IN] = IMAGE_POINTER_JPEG_PATH + "zoomIn.png"; + mouseIcons_[MOUSE_ICON::ZOOM_OUT] = IMAGE_POINTER_JPEG_PATH + "zoomOut.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_EAST] = IMAGE_POINTER_JPEG_PATH + "middleBinEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_WEST] = IMAGE_POINTER_JPEG_PATH + "middleBinWest.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH] = IMAGE_POINTER_JPEG_PATH + "middleBinSouth.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH] = IMAGE_POINTER_JPEG_PATH + "middleBinNorth.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH] = IMAGE_POINTER_JPEG_PATH + "middleBinNorthSouth.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_EAST] = IMAGE_POINTER_JPEG_PATH + "middleBinNorthEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_WEST] = IMAGE_POINTER_JPEG_PATH + "middleBinNorthWest.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST] = IMAGE_POINTER_JPEG_PATH + "middleBinSouthEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST] = IMAGE_POINTER_JPEG_PATH + "middleBinSouthWest.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST] = IMAGE_POINTER_JPEG_PATH + "middleBinNorthSouthWestEast.png"; } PointerDrawingManager::~PointerDrawingManager() {} -void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle) +void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, + const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", displayId, physicalX, physicalY, mouseStyle); @@ -293,7 +294,7 @@ std::unique_ptr PointerDrawingManager::DecodeImageToPixel } void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, - int32_t width, int32_t height, Direction direction) + int32_t width, int32_t height, Direction direction) { CALL_DEBUG_ENTER; hasDisplay_ = true; @@ -456,7 +457,7 @@ int32_t PointerDrawingManager::GetPointerStyle(int32_t pid, int32_t windowId, in return RET_ERR; } - MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, pointerStyle); + MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, pointerStyle); return RET_OK; } } // namespace MMI -- Gitee From c1f2591afcc55788c15275ae56f9c66ad0a5342a Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 4 Aug 2022 08:53:57 +0000 Subject: [PATCH 05/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I954a0b63630930ff2b4474fc34a0363ceb39584b --- service/BUILD.gn | 81 +++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/service/BUILD.gn b/service/BUILD.gn index add89c7283..6108d30cb3 100644 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -226,7 +226,8 @@ ohos_prebuilt_etc("drawing_pointer_image_cursorCopy") { } ohos_prebuilt_etc("drawing_pointer_image_cursorForbid") { - source = "//foundation/multimodalinput/input/util/source_icon/cursorForbid.png" + source = + "//foundation/multimodalinput/input/util/source_icon/cursorForbid.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -240,7 +241,8 @@ ohos_prebuilt_etc("drawing_pointer_image_colorsucker") { } ohos_prebuilt_etc("drawing_pointer_image_handGrabbing") { - source = "//foundation/multimodalinput/input/util/source_icon/handGrabbing.png" + source = + "//foundation/multimodalinput/input/util/source_icon/handGrabbing.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -254,7 +256,8 @@ ohos_prebuilt_etc("drawing_pointer_image_handOpen") { } ohos_prebuilt_etc("drawing_pointer_image_handPointing") { - source = "//foundation/multimodalinput/input/util/source_icon/handPointing.png" + source = + "//foundation/multimodalinput/input/util/source_icon/handPointing.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -275,28 +278,32 @@ ohos_prebuilt_etc("drawing_pointer_image_Move") { } ohos_prebuilt_etc("drawing_pointer_image_resizeLeftRight") { - source = "//foundation/multimodalinput/input/util/source_icon/resizeLeftRight.png" + source = + "//foundation/multimodalinput/input/util/source_icon/resizeLeftRight.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_resizeUpDown") { - source = "//foundation/multimodalinput/input/util/source_icon/resizeUpDown.png" + source = + "//foundation/multimodalinput/input/util/source_icon/resizeUpDown.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_screenshotChoose") { - source = "//foundation/multimodalinput/input/util/source_icon/screenshotChoose.png" + source = + "//foundation/multimodalinput/input/util/source_icon/screenshotChoose.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_screenshotCursor") { - source = "//foundation/multimodalinput/input/util/source_icon/screenshotCursor.png" + source = + "//foundation/multimodalinput/input/util/source_icon/screenshotCursor.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -324,28 +331,32 @@ ohos_prebuilt_etc("drawing_pointer_image_zoomOut") { } ohos_prebuilt_etc("drawing_pointer_image_middleBinEast") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinEast.png" + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinEast.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_middleBinWest") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinWest.png" + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinWest.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_middleBinSouth") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinSouth.png" + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinSouth.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_middleBinNorth") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorth.png" + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinNorth.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -465,45 +476,45 @@ ohos_shared_library("libmmi-server") { configs = [ ":libmmi_server_config" ] deps = [ + ":drawing_pointer_image_Cross", ":drawing_pointer_image_Default", ":drawing_pointer_image_East", - ":drawing_pointer_image_West", - ":drawing_pointer_image_South", + ":drawing_pointer_image_Help", + ":drawing_pointer_image_Move", ":drawing_pointer_image_North", - ":drawing_pointer_image_westEast", - ":drawing_pointer_image_northSouth", - ":drawing_pointer_image_northEast", - ":drawing_pointer_image_northWest", - ":drawing_pointer_image_southEast", - ":drawing_pointer_image_southWest", - ":drawing_pointer_image_northEastSouthWest", - ":drawing_pointer_image_northWestSouthEast", - ":drawing_pointer_image_Cross", + ":drawing_pointer_image_South", + ":drawing_pointer_image_West", + ":drawing_pointer_image_colorsucker", ":drawing_pointer_image_cursorCopy", ":drawing_pointer_image_cursorForbid", - ":drawing_pointer_image_colorsucker", ":drawing_pointer_image_handGrabbing", ":drawing_pointer_image_handOpen", ":drawing_pointer_image_handPointing", - ":drawing_pointer_image_Help", - ":drawing_pointer_image_Move", + ":drawing_pointer_image_middleBinEast", + ":drawing_pointer_image_middleBinNorth", + ":drawing_pointer_image_middleBinNorthEast", + ":drawing_pointer_image_middleBinNorthSouth", + ":drawing_pointer_image_middleBinNorthSouthWestEast", + ":drawing_pointer_image_middleBinNorthWest", + ":drawing_pointer_image_middleBinSouth", + ":drawing_pointer_image_middleBinSouthEast", + ":drawing_pointer_image_middleBinSouthWest", + ":drawing_pointer_image_middleBinWest", + ":drawing_pointer_image_northEast", + ":drawing_pointer_image_northEastSouthWest", + ":drawing_pointer_image_northSouth", + ":drawing_pointer_image_northWest", + ":drawing_pointer_image_northWestSouthEast", ":drawing_pointer_image_resizeLeftRight", ":drawing_pointer_image_resizeUpDown", ":drawing_pointer_image_screenshotChoose", ":drawing_pointer_image_screenshotCursor", + ":drawing_pointer_image_southEast", + ":drawing_pointer_image_southWest", ":drawing_pointer_image_textCursor", + ":drawing_pointer_image_westEast", ":drawing_pointer_image_zoomIn", ":drawing_pointer_image_zoomOut", - ":drawing_pointer_image_middleBinEast", - ":drawing_pointer_image_middleBinWest", - ":drawing_pointer_image_middleBinSouth", - ":drawing_pointer_image_middleBinNorth", - ":drawing_pointer_image_middleBinNorthSouth", - ":drawing_pointer_image_middleBinNorthEast", - ":drawing_pointer_image_middleBinNorthWest", - ":drawing_pointer_image_middleBinSouthEast", - ":drawing_pointer_image_middleBinSouthWest", - ":drawing_pointer_image_middleBinNorthSouthWestEast", ":mmi_device_config.ini", ":multimodalinput_config_ability.json", "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", -- Gitee From 56befeaf612697ec832bcc88a41df15f1f4b60f4 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 4 Aug 2022 09:53:39 +0000 Subject: [PATCH 06/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Iac391e252674635edd6a3aaf00b83c529914d87c --- service/window_manager/include/pointer_drawing_manager.h | 2 +- service/window_manager/src/pointer_drawing_manager.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index 1f9c3f5706..aec040ab28 100755 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -41,7 +41,7 @@ public: DISALLOW_COPY_AND_MOVE(PointerDrawingManager); void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT); - void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId,int32_t width, + void OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, int32_t width, int32_t height, Direction direction); void UpdatePointerDevice(bool hasPointerDevice); bool Init(); diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 893cd997c7..69357d75a6 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -79,7 +79,8 @@ PointerDrawingManager::PointerDrawingManager() mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_WEST] = IMAGE_POINTER_JPEG_PATH + "middleBinNorthWest.png"; mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST] = IMAGE_POINTER_JPEG_PATH + "middleBinSouthEast.png"; mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST] = IMAGE_POINTER_JPEG_PATH + "middleBinSouthWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST] = IMAGE_POINTER_JPEG_PATH + "middleBinNorthSouthWestEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST] = IMAGE_POINTER_JPEG_PATH + + "middleBinNorthSouthWestEast.png"; } PointerDrawingManager::~PointerDrawingManager() {} @@ -88,7 +89,8 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; - MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", displayId, physicalX, physicalY, mouseStyle); + MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", + displayId, physicalX, physicalY, mouseStyle); FixCursorPosition(physicalX, physicalY); lastPhysicalX_ = physicalX; lastPhysicalY_ = physicalY; @@ -294,7 +296,7 @@ std::unique_ptr PointerDrawingManager::DecodeImageToPixel } void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t pid, int32_t focusWindowId, - int32_t width, int32_t height, Direction direction) + int32_t width, int32_t height, Direction direction) { CALL_DEBUG_ENTER; hasDisplay_ = true; -- Gitee From 607a444881d53de9dafacc923b0bf7120029ab75 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 8 Aug 2022 12:37:40 +0000 Subject: [PATCH 07/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I5840d881c58354c12a29576cf3debcbe505dc867 --- .../include/input_manager_impl.h | 2 + .../event_handler/src/input_manager_impl.cpp | 22 ++ frameworks/proxy/events/src/input_manager.cpp | 18 + .../innerkits/proxy/include/input_manager.h | 3 + service/BUILD.gn | 321 +++++++++++++++++- .../include/i_multimodal_input_connect.h | 6 +- .../multimodal_input_connect_manager.h | 2 + .../include/multimodal_input_connect_proxy.h | 2 + .../include/multimodal_input_connect_stub.h | 2 + .../src/multimodal_input_connect_manager.cpp | 12 + .../src/multimodal_input_connect_proxy.cpp | 46 +++ .../src/multimodal_input_connect_stub.cpp | 44 +++ service/module_loader/include/mmi_service.h | 2 + service/module_loader/src/mmi_service.cpp | 24 ++ .../include/i_pointer_drawing_manager.h | 18 +- .../include/input_windows_manager.h | 7 + .../include/pointer_drawing_manager.h | 21 +- .../src/input_windows_manager.cpp | 157 ++++++++- .../src/pointer_drawing_manager.cpp | 179 ++++++++-- util/common/include/struct_multimodal.h | 47 +++ util/source_icon/Cross.png | Bin 0 -> 643 bytes util/source_icon/Default.png | Bin 0 -> 1247 bytes util/source_icon/East.png | Bin 0 -> 1822 bytes util/source_icon/Help.png | Bin 0 -> 4304 bytes util/source_icon/Move.png | Bin 0 -> 3299 bytes util/source_icon/North.png | Bin 0 -> 1705 bytes util/source_icon/South.png | Bin 0 -> 1829 bytes util/source_icon/West.png | Bin 0 -> 1892 bytes util/source_icon/colorSucker.png | Bin 0 -> 2840 bytes util/source_icon/cursorCopy.png | Bin 0 -> 4008 bytes util/source_icon/cursorForbid.png | Bin 0 -> 4463 bytes util/source_icon/handGrabbing.png | Bin 0 -> 2691 bytes util/source_icon/handOpen.png | Bin 0 -> 3497 bytes util/source_icon/handPointing.png | Bin 0 -> 3091 bytes util/source_icon/middleBinEast.png | Bin 0 -> 2779 bytes util/source_icon/middleBinNorth.png | Bin 0 -> 2628 bytes util/source_icon/middleBinNorthEast.png | Bin 0 -> 2927 bytes util/source_icon/middleBinNorthSouth.png | Bin 0 -> 3244 bytes .../middleBinNorthSouthWestEast.png | Bin 0 -> 4564 bytes util/source_icon/middleBinNorthWest.png | Bin 0 -> 2883 bytes util/source_icon/middleBinSouth.png | Bin 0 -> 2680 bytes util/source_icon/middleBinSouthEast.png | Bin 0 -> 2916 bytes util/source_icon/middleBinSouthWest.png | Bin 0 -> 2873 bytes util/source_icon/middleBinWest.png | Bin 0 -> 2739 bytes util/source_icon/northEast.png | Bin 0 -> 2029 bytes util/source_icon/northEastSouthWest.png | Bin 0 -> 2751 bytes util/source_icon/northSouth.png | Bin 0 -> 2391 bytes util/source_icon/northWest.png | Bin 0 -> 1956 bytes util/source_icon/northWestSouthEast.png | Bin 0 -> 2684 bytes util/source_icon/resizeLeftRight.png | Bin 0 -> 2950 bytes util/source_icon/resizeUpDown.png | Bin 0 -> 2668 bytes util/source_icon/screenshotChoose.png | Bin 0 -> 1251 bytes util/source_icon/screenshotCursor.png | Bin 0 -> 2839 bytes util/source_icon/southEast.png | Bin 0 -> 2034 bytes util/source_icon/southWest.png | Bin 0 -> 2019 bytes util/source_icon/textCursor.png | Bin 0 -> 730 bytes util/source_icon/westEast.png | Bin 0 -> 2435 bytes util/source_icon/zoomIn.png | Bin 0 -> 3743 bytes util/source_icon/zoomOut.png | Bin 0 -> 3613 bytes 59 files changed, 897 insertions(+), 38 deletions(-) mode change 100644 => 100755 frameworks/proxy/event_handler/include/input_manager_impl.h mode change 100644 => 100755 frameworks/proxy/event_handler/src/input_manager_impl.cpp mode change 100644 => 100755 frameworks/proxy/events/src/input_manager.cpp mode change 100644 => 100755 interfaces/native/innerkits/proxy/include/input_manager.h mode change 100644 => 100755 service/BUILD.gn mode change 100644 => 100755 service/connect_manager/include/i_multimodal_input_connect.h mode change 100644 => 100755 service/connect_manager/include/multimodal_input_connect_manager.h mode change 100644 => 100755 service/connect_manager/include/multimodal_input_connect_proxy.h mode change 100644 => 100755 service/connect_manager/include/multimodal_input_connect_stub.h mode change 100644 => 100755 service/connect_manager/src/multimodal_input_connect_manager.cpp mode change 100644 => 100755 service/connect_manager/src/multimodal_input_connect_proxy.cpp mode change 100644 => 100755 service/connect_manager/src/multimodal_input_connect_stub.cpp mode change 100644 => 100755 service/module_loader/include/mmi_service.h mode change 100644 => 100755 service/module_loader/src/mmi_service.cpp mode change 100644 => 100755 service/window_manager/include/i_pointer_drawing_manager.h mode change 100644 => 100755 service/window_manager/include/input_windows_manager.h mode change 100644 => 100755 service/window_manager/include/pointer_drawing_manager.h mode change 100644 => 100755 service/window_manager/src/input_windows_manager.cpp mode change 100644 => 100755 service/window_manager/src/pointer_drawing_manager.cpp mode change 100644 => 100755 util/common/include/struct_multimodal.h create mode 100755 util/source_icon/Cross.png create mode 100755 util/source_icon/Default.png create mode 100755 util/source_icon/East.png create mode 100755 util/source_icon/Help.png create mode 100755 util/source_icon/Move.png create mode 100755 util/source_icon/North.png create mode 100755 util/source_icon/South.png create mode 100755 util/source_icon/West.png create mode 100755 util/source_icon/colorSucker.png create mode 100755 util/source_icon/cursorCopy.png create mode 100755 util/source_icon/cursorForbid.png create mode 100755 util/source_icon/handGrabbing.png create mode 100755 util/source_icon/handOpen.png create mode 100755 util/source_icon/handPointing.png create mode 100755 util/source_icon/middleBinEast.png create mode 100755 util/source_icon/middleBinNorth.png create mode 100755 util/source_icon/middleBinNorthEast.png create mode 100755 util/source_icon/middleBinNorthSouth.png create mode 100755 util/source_icon/middleBinNorthSouthWestEast.png create mode 100755 util/source_icon/middleBinNorthWest.png create mode 100755 util/source_icon/middleBinSouth.png create mode 100755 util/source_icon/middleBinSouthEast.png create mode 100755 util/source_icon/middleBinSouthWest.png create mode 100755 util/source_icon/middleBinWest.png create mode 100755 util/source_icon/northEast.png create mode 100755 util/source_icon/northEastSouthWest.png create mode 100755 util/source_icon/northSouth.png create mode 100755 util/source_icon/northWest.png create mode 100755 util/source_icon/northWestSouthEast.png create mode 100755 util/source_icon/resizeLeftRight.png create mode 100755 util/source_icon/resizeUpDown.png create mode 100755 util/source_icon/screenshotChoose.png create mode 100755 util/source_icon/screenshotCursor.png create mode 100755 util/source_icon/southEast.png create mode 100755 util/source_icon/southWest.png create mode 100755 util/source_icon/textCursor.png create mode 100755 util/source_icon/westEast.png create mode 100755 util/source_icon/zoomIn.png create mode 100755 util/source_icon/zoomOut.png diff --git a/frameworks/proxy/event_handler/include/input_manager_impl.h b/frameworks/proxy/event_handler/include/input_manager_impl.h old mode 100644 new mode 100755 index 0e44b2d3f2..c2368c5fc7 --- a/frameworks/proxy/event_handler/include/input_manager_impl.h +++ b/frameworks/proxy/event_handler/include/input_manager_impl.h @@ -97,6 +97,8 @@ public: int32_t SetPointerVisible(bool visible); bool IsPointerVisible(); + int32_t SetPointerStyle(int32_t windowId, int32_t pointerStyle); + int32_t GetPointerStyle(int32_t windowId, int32_t &pointerStyle); int32_t SetPointerSpeed(int32_t speed); int32_t GetPointerSpeed(); diff --git a/frameworks/proxy/event_handler/src/input_manager_impl.cpp b/frameworks/proxy/event_handler/src/input_manager_impl.cpp old mode 100644 new mode 100755 index 54b2ccac56..aa17f2f6ed --- a/frameworks/proxy/event_handler/src/input_manager_impl.cpp +++ b/frameworks/proxy/event_handler/src/input_manager_impl.cpp @@ -595,6 +595,28 @@ int32_t InputManagerImpl::GetPointerSpeed() #endif // OHOS_BUILD_ENABLE_POINTER } +int32_t InputManagerImpl::SetPointerStyle(int32_t windowId, int32_t pointerStyle) +{ + CALL_DEBUG_ENTER; + int32_t ret = MultimodalInputConnMgr->SetPointerStyle(windowId, pointerStyle); + if (ret != RET_OK) { + MMI_HILOGE("Failed to send to server, ret:%{public}d", ret); + return RET_ERR; + } + return RET_OK; +} + +int32_t InputManagerImpl::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) +{ + CALL_DEBUG_ENTER; + int32_t ret = MultimodalInputConnMgr->GetPointerStyle(windowId, pointerStyle); + if (ret != RET_OK) { + MMI_HILOGE("Failed to send to server, ret:%{public}d", ret); + return RET_ERR; + } + return RET_OK; +} + void InputManagerImpl::OnConnected() { CALL_DEBUG_ENTER; diff --git a/frameworks/proxy/events/src/input_manager.cpp b/frameworks/proxy/events/src/input_manager.cpp old mode 100644 new mode 100755 index bbdb28b902..74c332af73 --- a/frameworks/proxy/events/src/input_manager.cpp +++ b/frameworks/proxy/events/src/input_manager.cpp @@ -176,5 +176,23 @@ void InputManager::SetAnrObserver(std::shared_ptr observer) { InputMgrImpl->SetAnrObserver(observer); } + +int32_t InputManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle) +{ + if (windowId < 0 || pointerStyle < 0) { + MMI_HILOGE("Parameter passing error"); + return RET_ERR; + } + return InputMgrImpl->SetPointerStyle(windowId, pointerStyle); +} + +int32_t InputManager::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) +{ + if (windowId < 0) { + MMI_HILOGE("Parameter passing error"); + return RET_ERR; + } + return InputMgrImpl->GetPointerStyle(windowId, pointerStyle); +} } // namespace MMI } // namespace OHOS \ No newline at end of file diff --git a/interfaces/native/innerkits/proxy/include/input_manager.h b/interfaces/native/innerkits/proxy/include/input_manager.h old mode 100644 new mode 100755 index 26fadaeaa2..7a8bf8f968 --- a/interfaces/native/innerkits/proxy/include/input_manager.h +++ b/interfaces/native/innerkits/proxy/include/input_manager.h @@ -265,6 +265,9 @@ public: */ bool IsPointerVisible(); + int32_t SetPointerStyle(int32_t windowId, int32_t pointerStyle); + int32_t GetPointerStyle(int32_t windowId, int32_t &pointerStyle); + /** * @brief 设置鼠标移动速度(取值范围1到20)。 * @param speed 客户端设置的鼠标移动速度. diff --git a/service/BUILD.gn b/service/BUILD.gn old mode 100644 new mode 100755 index a07c8355cd..b2a2ebf017 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -120,8 +120,285 @@ ohos_prebuilt_etc("multimodalinput_config_ability.json") { relative_install_dir = "multimodalinput" } -ohos_prebuilt_etc("drawing_pointer_image") { - source = "//foundation/multimodalinput/input/util/source_icon/angle.png" +ohos_prebuilt_etc("drawing_pointer_image_Default") { + source = "//foundation/multimodalinput/input/util/source_icon/Default.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_East") { + source = "//foundation/multimodalinput/input/util/source_icon/East.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_West") { + source = "//foundation/multimodalinput/input/util/source_icon/West.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_South") { + source = "//foundation/multimodalinput/input/util/source_icon/South.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_North") { + source = "//foundation/multimodalinput/input/util/source_icon/North.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_westEast") { + source = "//foundation/multimodalinput/input/util/source_icon/westEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_northSouth") { + source = "//foundation/multimodalinput/input/util/source_icon/northSouth.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_northEast") { + source = "//foundation/multimodalinput/input/util/source_icon/northEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_northWest") { + source = "//foundation/multimodalinput/input/util/source_icon/northWest.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_southEast") { + source = "//foundation/multimodalinput/input/util/source_icon/southEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_southWest") { + source = "//foundation/multimodalinput/input/util/source_icon/southWest.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_northEastSouthWest") { + source = "//foundation/multimodalinput/input/util/source_icon/northEastSouthWest.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_northWestSouthEast") { + source = "//foundation/multimodalinput/input/util/source_icon/northWestSouthEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_Cross") { + source = "//foundation/multimodalinput/input/util/source_icon/Cross.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_cursorCopy") { + source = "//foundation/multimodalinput/input/util/source_icon/cursorCopy.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_cursorForbid") { + source = + "//foundation/multimodalinput/input/util/source_icon/cursorForbid.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_colorSucker") { + source = "//foundation/multimodalinput/input/util/source_icon/colorSucker.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_handGrabbing") { + source = + "//foundation/multimodalinput/input/util/source_icon/handGrabbing.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_handOpen") { + source = "//foundation/multimodalinput/input/util/source_icon/handOpen.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_handPointing") { + source = + "//foundation/multimodalinput/input/util/source_icon/handPointing.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_Help") { + source = "//foundation/multimodalinput/input/util/source_icon/Help.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_Move") { + source = "//foundation/multimodalinput/input/util/source_icon/Move.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_resizeLeftRight") { + source = + "//foundation/multimodalinput/input/util/source_icon/resizeLeftRight.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_resizeUpDown") { + source = + "//foundation/multimodalinput/input/util/source_icon/resizeUpDown.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_screenshotChoose") { + source = + "//foundation/multimodalinput/input/util/source_icon/screenshotChoose.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_screenshotCursor") { + source = + "//foundation/multimodalinput/input/util/source_icon/screenshotCursor.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_textCursor") { + source = "//foundation/multimodalinput/input/util/source_icon/textCursor.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_zoomIn") { + source = "//foundation/multimodalinput/input/util/source_icon/zoomIn.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_zoomOut") { + source = "//foundation/multimodalinput/input/util/source_icon/zoomOut.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinEast") { + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinWest") { + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinWest.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinSouth") { + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinSouth.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinNorth") { + source = + "//foundation/multimodalinput/input/util/source_icon/middleBinNorth.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthSouth") { + source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthSouth.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthEast") { + source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthWest") { + source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthWest.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinSouthEast") { + source = "//foundation/multimodalinput/input/util/source_icon/middleBinSouthEast.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinSouthWest") { + source = "//foundation/multimodalinput/input/util/source_icon/middleBinSouthWest.png" + part_name = "input" + subsystem_name = "multimodalinput" + relative_install_dir = "multimodalinput/mouse_icon" +} + +ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthSouthWestEast") { + source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthSouthWestEast.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -199,7 +476,45 @@ ohos_shared_library("libmmi-server") { configs = [ ":libmmi_server_config" ] deps = [ - ":drawing_pointer_image", + ":drawing_pointer_image_Cross", + ":drawing_pointer_image_Default", + ":drawing_pointer_image_East", + ":drawing_pointer_image_Help", + ":drawing_pointer_image_Move", + ":drawing_pointer_image_North", + ":drawing_pointer_image_South", + ":drawing_pointer_image_West", + ":drawing_pointer_image_colorSucker", + ":drawing_pointer_image_cursorCopy", + ":drawing_pointer_image_cursorForbid", + ":drawing_pointer_image_handGrabbing", + ":drawing_pointer_image_handOpen", + ":drawing_pointer_image_handPointing", + ":drawing_pointer_image_middleBinEast", + ":drawing_pointer_image_middleBinNorth", + ":drawing_pointer_image_middleBinNorthEast", + ":drawing_pointer_image_middleBinNorthSouth", + ":drawing_pointer_image_middleBinNorthSouthWestEast", + ":drawing_pointer_image_middleBinNorthWest", + ":drawing_pointer_image_middleBinSouth", + ":drawing_pointer_image_middleBinSouthEast", + ":drawing_pointer_image_middleBinSouthWest", + ":drawing_pointer_image_middleBinWest", + ":drawing_pointer_image_northEast", + ":drawing_pointer_image_northEastSouthWest", + ":drawing_pointer_image_northSouth", + ":drawing_pointer_image_northWest", + ":drawing_pointer_image_northWestSouthEast", + ":drawing_pointer_image_resizeLeftRight", + ":drawing_pointer_image_resizeUpDown", + ":drawing_pointer_image_screenshotChoose", + ":drawing_pointer_image_screenshotCursor", + ":drawing_pointer_image_southEast", + ":drawing_pointer_image_southWest", + ":drawing_pointer_image_textCursor", + ":drawing_pointer_image_westEast", + ":drawing_pointer_image_zoomIn", + ":drawing_pointer_image_zoomOut", ":mmi_device_config.ini", ":multimodalinput_config_ability.json", "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", diff --git a/service/connect_manager/include/i_multimodal_input_connect.h b/service/connect_manager/include/i_multimodal_input_connect.h old mode 100644 new mode 100755 index 8597e9a6fa..3158f69300 --- a/service/connect_manager/include/i_multimodal_input_connect.h +++ b/service/connect_manager/include/i_multimodal_input_connect.h @@ -39,6 +39,8 @@ public: virtual int32_t IsPointerVisible(bool &visible) = 0; virtual int32_t SetPointerSpeed(int32_t speed) = 0; virtual int32_t GetPointerSpeed(int32_t &speed) = 0; + virtual int32_t SetPointerStyle(int32_t windowId, int32_t pointerStyle) = 0; + virtual int32_t GetPointerStyle(int32_t windowId, int32_t &pointerStyle) = 0; virtual int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys) = 0; virtual int32_t GetDeviceIds(int32_t userData) = 0; virtual int32_t GetDevice(int32_t userData, int32_t id) = 0; @@ -75,7 +77,9 @@ public: UNREGISTER_DEV_MONITOR = 19, GET_KEYBOARD_TYPE = 20, SET_POINTER_SPEED = 21, - GET_POINTER_SPEED = 22 + GET_POINTER_SPEED = 22, + SET_POINTER_STYLE = 23, + GET_POINTER_STYLE = 24 }; enum { diff --git a/service/connect_manager/include/multimodal_input_connect_manager.h b/service/connect_manager/include/multimodal_input_connect_manager.h old mode 100644 new mode 100755 index de799289dc..5a91c608ac --- a/service/connect_manager/include/multimodal_input_connect_manager.h +++ b/service/connect_manager/include/multimodal_input_connect_manager.h @@ -42,6 +42,8 @@ public: int32_t IsPointerVisible(bool &visible); int32_t SetPointerSpeed(int32_t speed); int32_t GetPointerSpeed(int32_t &speed); + int32_t SetPointerStyle(int32_t windowId, int32_t pointerStyle); + int32_t GetPointerStyle(int32_t windowId, int32_t &pointerStyle); int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys); int32_t GetDeviceIds(int32_t userData); int32_t GetDevice(int32_t userData, int32_t id); diff --git a/service/connect_manager/include/multimodal_input_connect_proxy.h b/service/connect_manager/include/multimodal_input_connect_proxy.h old mode 100644 new mode 100755 index 36b46e6d9f..1e97edc53b --- a/service/connect_manager/include/multimodal_input_connect_proxy.h +++ b/service/connect_manager/include/multimodal_input_connect_proxy.h @@ -38,6 +38,8 @@ public: virtual int32_t IsPointerVisible(bool &visible) override; virtual int32_t SetPointerSpeed(int32_t speed) override; virtual int32_t GetPointerSpeed(int32_t &speed) override; + virtual int32_t SetPointerStyle(int32_t windowId, int32_t pointerStyle) override; + virtual int32_t GetPointerStyle(int32_t windowId, int32_t &pointerStyle) override; virtual int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys) override; virtual int32_t GetDeviceIds(int32_t userData) override; virtual int32_t GetDevice(int32_t userData, int32_t deviceId) override; diff --git a/service/connect_manager/include/multimodal_input_connect_stub.h b/service/connect_manager/include/multimodal_input_connect_stub.h old mode 100644 new mode 100755 index 179fd610ab..6e1af7a701 --- a/service/connect_manager/include/multimodal_input_connect_stub.h +++ b/service/connect_manager/include/multimodal_input_connect_stub.h @@ -40,6 +40,8 @@ protected: int32_t StubHandleAllocSocketFd(MessageParcel &data, MessageParcel &reply); int32_t StubAddInputEventFilter(MessageParcel& data, MessageParcel& reply); int32_t StubSetPointerVisible(MessageParcel& data, MessageParcel& reply); + int32_t StubSetPointerStyle(MessageParcel& data, MessageParcel& reply); + int32_t StubGetPointerStyle(MessageParcel& data, MessageParcel& reply); int32_t StubIsPointerVisible(MessageParcel& data, MessageParcel& reply); int32_t StubSupportKeys(MessageParcel& data, MessageParcel& reply); int32_t StubGetDeviceIds(MessageParcel& data, MessageParcel& reply); diff --git a/service/connect_manager/src/multimodal_input_connect_manager.cpp b/service/connect_manager/src/multimodal_input_connect_manager.cpp old mode 100644 new mode 100755 index 8bff22a172..bc60e19f16 --- a/service/connect_manager/src/multimodal_input_connect_manager.cpp +++ b/service/connect_manager/src/multimodal_input_connect_manager.cpp @@ -107,6 +107,18 @@ int32_t MultimodalInputConnectManager::GetPointerSpeed(int32_t &speed) return multimodalInputConnectService_->GetPointerSpeed(speed); } +int32_t MultimodalInputConnectManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle) +{ + CHKPR(multimodalInputConnectService_, RET_ERR); + return multimodalInputConnectService_->SetPointerStyle(windowId, pointerStyle); +} + +int32_t MultimodalInputConnectManager::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) +{ + CHKPR(multimodalInputConnectService_, RET_ERR); + return multimodalInputConnectService_->GetPointerStyle(windowId, pointerStyle); +} + int32_t MultimodalInputConnectManager::RegisterDevListener() { CHKPR(multimodalInputConnectService_, RET_ERR); diff --git a/service/connect_manager/src/multimodal_input_connect_proxy.cpp b/service/connect_manager/src/multimodal_input_connect_proxy.cpp old mode 100644 new mode 100755 index 81db56d5d8..822e04f542 --- a/service/connect_manager/src/multimodal_input_connect_proxy.cpp +++ b/service/connect_manager/src/multimodal_input_connect_proxy.cpp @@ -184,6 +184,52 @@ int32_t MultimodalInputConnectProxy::GetPointerSpeed(int32_t &speed) return RET_OK; } +int32_t MultimodalInputConnectProxy::SetPointerStyle(int32_t windowId, int32_t pointerStyle) +{ + CALL_DEBUG_ENTER; + MessageParcel data; + if (!data.WriteInterfaceToken(MultimodalInputConnectProxy::GetDescriptor())) { + MMI_HILOGE("Failed to write descriptor"); + return ERR_INVALID_VALUE; + } + + WRITEINT32(data, windowId, RET_ERR); + WRITEINT32(data, pointerStyle, RET_ERR); + + MessageParcel reply; + MessageOption option; + sptr remote = Remote(); + CHKPR(remote, RET_ERR); + int32_t ret = remote->SendRequest(SET_POINTER_STYLE, data, reply, option); + if (ret != RET_OK) { + MMI_HILOGE("Send request fail, ret:%{public}d", ret); + return RET_ERR; + } + return RET_OK; +} + +int32_t MultimodalInputConnectProxy::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) +{ + CALL_DEBUG_ENTER; + MessageParcel data; + if (!data.WriteInterfaceToken(MultimodalInputConnectProxy::GetDescriptor())) { + MMI_HILOGE("Failed to write descriptor"); + return RET_ERR; + } + WRITEINT32(data, windowId, RET_ERR); + MessageParcel reply; + MessageOption option; + sptr remote = Remote(); + CHKPR(remote, RET_ERR); + int32_t ret = remote->SendRequest(GET_POINTER_STYLE, data, reply, option); + if (ret != RET_OK) { + MMI_HILOGE("Send request fail, ret:%{public}d", ret); + return RET_ERR; + } + pointerStyle = reply.ReadInt32(); + return RET_OK; +} + int32_t MultimodalInputConnectProxy::RegisterDevListener() { MessageParcel data; diff --git a/service/connect_manager/src/multimodal_input_connect_stub.cpp b/service/connect_manager/src/multimodal_input_connect_stub.cpp old mode 100644 new mode 100755 index 8f982bff17..b31fb48c76 --- a/service/connect_manager/src/multimodal_input_connect_stub.cpp +++ b/service/connect_manager/src/multimodal_input_connect_stub.cpp @@ -50,6 +50,8 @@ int32_t MultimodalInputConnectStub::OnRemoteRequest( {IMultimodalInputConnect::ALLOC_SOCKET_FD, &MultimodalInputConnectStub::StubHandleAllocSocketFd}, {IMultimodalInputConnect::ADD_INPUT_EVENT_FILTER, &MultimodalInputConnectStub::StubAddInputEventFilter}, {IMultimodalInputConnect::SET_POINTER_VISIBLE, &MultimodalInputConnectStub::StubSetPointerVisible}, + {IMultimodalInputConnect::SET_POINTER_STYLE, &MultimodalInputConnectStub::StubSetPointerStyle}, + {IMultimodalInputConnect::GET_POINTER_STYLE, &MultimodalInputConnectStub::StubGetPointerStyle}, {IMultimodalInputConnect::IS_POINTER_VISIBLE, &MultimodalInputConnectStub::StubIsPointerVisible}, {IMultimodalInputConnect::REGISTER_DEV_MONITOR, &MultimodalInputConnectStub::StubRegisterInputDeviceMonitor}, {IMultimodalInputConnect::UNREGISTER_DEV_MONITOR, @@ -201,6 +203,48 @@ int32_t MultimodalInputConnectStub::StubGetPointerSpeed(MessageParcel& data, Mes return RET_OK; } +int32_t MultimodalInputConnectStub::StubSetPointerStyle(MessageParcel& data, MessageParcel& reply) +{ + CALL_DEBUG_ENTER; + if (!PerHelper->CheckPermission(PermissionHelper::APL_SYSTEM_CORE)) { + MMI_HILOGE("Permission check fail"); + return RET_ERR; + } + + int32_t windowId; + READINT32(data, windowId, RET_ERR); + int32_t pointerStyle; + READINT32(data, pointerStyle, RET_ERR); + int32_t ret = SetPointerStyle(windowId, pointerStyle); + if (ret != RET_OK) { + MMI_HILOGE("Call SetPointerStyle failed ret:%{public}d", ret); + return RET_ERR; + } + MMI_HILOGD("Successfully set window:%{public}d, icon:%{public}d", windowId, pointerStyle); + return RET_OK; +} + +int32_t MultimodalInputConnectStub::StubGetPointerStyle(MessageParcel& data, MessageParcel& reply) +{ + CALL_DEBUG_ENTER; + if (!PerHelper->CheckPermission(PermissionHelper::APL_SYSTEM_CORE)) { + MMI_HILOGE("Permission check fail"); + return RET_ERR; + } + + int32_t windowId; + READINT32(data, windowId, RET_ERR); + int32_t pointerStyle; + int32_t ret = GetPointerStyle(windowId, pointerStyle); + if (ret != RET_OK) { + MMI_HILOGE("Call GetPointerStyle failed ret:%{public}d", ret); + return RET_ERR; + } + WRITEINT32(reply, pointerStyle, RET_ERR); + MMI_HILOGD("Successfully get window:%{public}d, icon:%{public}d", windowId, pointerStyle); + return RET_OK; +} + int32_t MultimodalInputConnectStub::StubSupportKeys(MessageParcel& data, MessageParcel& reply) { CALL_DEBUG_ENTER; diff --git a/service/module_loader/include/mmi_service.h b/service/module_loader/include/mmi_service.h old mode 100644 new mode 100755 index fc6f777669..5118eeb641 --- a/service/module_loader/include/mmi_service.h +++ b/service/module_loader/include/mmi_service.h @@ -56,6 +56,8 @@ public: virtual int32_t IsPointerVisible(bool &visible) override; virtual int32_t SetPointerSpeed(int32_t speed) override; virtual int32_t GetPointerSpeed(int32_t &speed) override; + virtual int32_t SetPointerStyle(int32_t windowId, int32_t pointerStyle) override; + virtual int32_t GetPointerStyle(int32_t windowId, int32_t &pointerStyle) override; virtual int32_t SupportKeys(int32_t userData, int32_t deviceId, std::vector &keys) override; virtual int32_t GetDeviceIds(int32_t userData) override; virtual int32_t GetDevice(int32_t userData, int32_t deviceId) override; diff --git a/service/module_loader/src/mmi_service.cpp b/service/module_loader/src/mmi_service.cpp old mode 100644 new mode 100755 index b77a72ef24..ae87115530 --- a/service/module_loader/src/mmi_service.cpp +++ b/service/module_loader/src/mmi_service.cpp @@ -441,6 +441,30 @@ int32_t MMIService::GetPointerSpeed(int32_t &speed) return RET_OK; } +int32_t MMIService::SetPointerStyle(int32_t windowId, int32_t pointerStyle) +{ + CALL_DEBUG_ENTER; + int32_t ret = delegateTasks_.PostSyncTask(std::bind(&IPointerDrawingManager::SetPointerStyle, + IPointerDrawingManager::GetInstance(), GetCallingPid(), windowId, pointerStyle)); + if (ret != RET_OK) { + MMI_HILOGE("Set pointer style failed,return %{public}d", ret); + return RET_ERR; + } + return RET_OK; +} + +int32_t MMIService::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) +{ + CALL_DEBUG_ENTER; + int32_t ret = delegateTasks_.PostSyncTask(std::bind(&IPointerDrawingManager::GetPointerStyle, + IPointerDrawingManager::GetInstance(), GetCallingPid(), windowId, std::ref(pointerStyle))); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed,return %{public}d", pointerStyle); + return RET_ERR; + } + return RET_OK; +} + int32_t MMIService::OnSupportKeys(int32_t pid, int32_t userData, int32_t deviceId, std::vector &keys) { CALL_DEBUG_ENTER; diff --git a/service/window_manager/include/i_pointer_drawing_manager.h b/service/window_manager/include/i_pointer_drawing_manager.h old mode 100644 new mode 100755 index 42fb5801d4..ef30852513 --- a/service/window_manager/include/i_pointer_drawing_manager.h +++ b/service/window_manager/include/i_pointer_drawing_manager.h @@ -19,6 +19,7 @@ #include #include "display_info.h" +#include "struct_multimodal.h" namespace OHOS { namespace MMI { @@ -28,8 +29,9 @@ public: virtual ~IPointerDrawingManager() = default; static std::shared_ptr GetInstance(); - virtual void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY) {} - virtual void OnDisplayInfo(int32_t displayId, int32_t width, int32_t height, Direction direction) {} + virtual void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, + const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT) {} + virtual void OnDisplayInfo(int32_t displayId, WinInfo info, int32_t width, int32_t height, Direction direction) {} virtual bool Init() { return true; @@ -39,10 +41,22 @@ public: { return 0; } + virtual int32_t SetPointerStyle(int32_t pid, int32_t windowId, int32_t pointerStyle) + { + return 0; + } + virtual int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &pointerStyle) + { + return 0; + } virtual bool IsPointerVisible() { return false; } + virtual int32_t InitLayer(const MOUSE_ICON mouseStyle) + { + return 0; + } public: static inline std::shared_ptr iPointDrawMgr_ = nullptr; diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h old mode 100644 new mode 100755 index 6be3a1a239..e061ff593e --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -72,6 +72,11 @@ public: #endif // OHOS_BUILD_ENABLE_TOUCH #ifdef OHOS_BUILD_ENABLE_POINTER const DisplayGroupInfo& GetDisplayGroupInfo(); + void OnSessionLost(SessionPtr session); + int32_t SetPointerStyle(int32_t pid, int32_t windowId, int32_t pointerStyle); + int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &pointerStyle) const; + void UpdatePointerStyle(); + bool IsNeedRefreshLayer(int32_t windowId); #endif // OHOS_BUILD_ENABLE_POINTER void Dump(int32_t fd, const std::vector &args); int32_t GetWindowPid(int32_t windowId, const DisplayGroupInfo& displayGroupInfo) const; @@ -108,6 +113,7 @@ private: #ifdef OHOS_BUILD_ENABLE_POINTER std::optional SelectWindowInfo(int32_t logicalX, int32_t logicalY, const std::shared_ptr& pointerEvent); + std::optional GetWindowInfo(int32_t logicalX, int32_t logicalY); #endif // OHOS_BUILD_ENABLE_POINTER #ifdef OHOS_BUILD_ENABLE_TOUCH void GetPhysicalDisplayCoord(struct libinput_event_touch* touch, @@ -128,6 +134,7 @@ private: int32_t lastLogicY_ = -1; WindowInfo lastWindowInfo_; std::shared_ptr lastPointerEvent_ = nullptr; + std::map> mapPointerStyle_ = {}; #endif // OHOS_BUILD_ENABLE_POINTER DisplayGroupInfo displayGroupInfo_; MouseLocation mouseLocation_ = {-1, -1}; // physical coord diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h old mode 100644 new mode 100755 index 2b8d79690b..dcb13cecd3 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -36,16 +36,20 @@ class PointerDrawingManager : public IPointerDrawingManager, public IDeviceObserver, public std::enable_shared_from_this { public: - PointerDrawingManager() = default; - virtual ~PointerDrawingManager() = default; + PointerDrawingManager(); + ~PointerDrawingManager(); DISALLOW_COPY_AND_MOVE(PointerDrawingManager); - void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY); - void OnDisplayInfo(int32_t displayId, int32_t width, int32_t height, Direction direction); + void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, + const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT); + void OnDisplayInfo(int32_t displayId, WinInfo info, int32_t width, int32_t height, Direction direction); void UpdatePointerDevice(bool hasPointerDevice); bool Init(); void DeletePointerVisible(int32_t pid); int32_t SetPointerVisible(int32_t pid, bool visible); + int32_t SetPointerStyle(int32_t pid, int32_t windowId, int32_t pointerStyle); + int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &pointerStyle); bool IsPointerVisible(); + int32_t InitLayer(const MOUSE_ICON mouseStyle); public: static const int32_t IMAGE_WIDTH = 64; @@ -55,8 +59,8 @@ private: void CreatePointerWindow(int32_t displayId, int32_t physicalX, int32_t physicalY); sptr GetLayer(); sptr GetSurfaceBuffer(sptr layer) const; - void DoDraw(uint8_t *addr, uint32_t width, uint32_t height); - void DrawPixelmap(OHOS::Rosen::Drawing::Canvas &canvas); + void DoDraw(uint8_t *addr, uint32_t width, uint32_t height, const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT); + void DrawPixelmap(OHOS::Rosen::Drawing::Canvas &canvas, const std::string& iconPath); void DrawManager(); void FixCursorPosition(int32_t &physicalX, int32_t &physicalY); std::unique_ptr DecodeImageToPixelMap(const std::string &imagePath); @@ -70,10 +74,15 @@ private: int32_t displayId_ = -1; int32_t displayWidth_ = 0; int32_t displayHeight_ = 0; + int32_t pid_ = 0; + int32_t windowId_ = 0; bool hasPointerDevice_ = false; int32_t lastPhysicalX_ = -1; int32_t lastPhysicalY_ = -1; Direction direction_ = Direction0; + int32_t preMouseStyle_ = 0; + std::map mouseIcons_; + struct PidInfo { int32_t pid { 0 }; bool visible { false }; diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp old mode 100644 new mode 100755 index 8510c4b0ee..da419ab503 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -22,6 +22,7 @@ #include "input_device_manager.h" #include "i_pointer_drawing_manager.h" #include "mouse_event_handler.h" +#include "pointer_drawing_manager.h" #include "util.h" #include "util_ex.h" @@ -29,6 +30,7 @@ namespace OHOS { namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "InputWindowsManager"}; +constexpr int32_t DEFAULT_POINTER_STYLE = 0; } // namespace InputWindowsManager::InputWindowsManager() {} @@ -38,6 +40,8 @@ InputWindowsManager::~InputWindowsManager() {} void InputWindowsManager::Init(UDSServer& udsServer) { udsServer_ = &udsServer; + CHKPV(udsServer_); + udsServer_->AddSessionDeletedCallback(std::bind(&InputWindowsManager::OnSessionLost, this, std::placeholders::_1)); } int32_t InputWindowsManager::GetClientFd(std::shared_ptr pointerEvent) const @@ -172,10 +176,22 @@ void InputWindowsManager::UpdateDisplayInfo(const DisplayGroupInfo &displayGroup CheckFocusWindowChange(displayGroupInfo); CheckZorderWindowChange(displayGroupInfo); displayGroupInfo_ = displayGroupInfo; + UpdatePointerStyle(); + if (!displayGroupInfo.displaysInfo.empty()) { #ifdef OHOS_BUILD_ENABLE_POINTER + const MouseLocation &mouseLocation = GetMouseInfo(); + int32_t logicX = mouseLocation.physicalX; + int32_t logicY = mouseLocation.physicalY; + auto windowInfo = GetWindowInfo(logicX, logicY); + if (!windowInfo) { + MMI_HILOGE("The windowInfo is nullptr"); + return; + } + int32_t windowPid = GetWindowPid(windowInfo->id); + WinInfo info = { .windowPid = windowPid, .windowId = windowInfo->id }; IPointerDrawingManager::GetInstance()->OnDisplayInfo(displayGroupInfo.displaysInfo[0].id, - displayGroupInfo.displaysInfo[0].width, displayGroupInfo.displaysInfo[0].height, + info, displayGroupInfo.displaysInfo[0].width, displayGroupInfo.displaysInfo[0].height, displayGroupInfo.displaysInfo[0].direction); #endif // OHOS_BUILD_ENABLE_POINTER } @@ -202,7 +218,7 @@ void InputWindowsManager::SendPointerEvent(int32_t pointerAction) lastLogicY_ = mouseLocation.physicalY; auto touchWindow = SelectWindowInfo(lastLogicX_, lastLogicY_, pointerEvent); if (!touchWindow) { - MMI_HILOGE("touchWindow is nullptr, targetWindow:%{public}d", pointerEvent->GetTargetWindowId()); + MMI_HILOGE("TouchWindow is nullptr, targetWindow:%{public}d", pointerEvent->GetTargetWindowId()); return; } PointerEvent::PointerItem pointerItem; @@ -449,6 +465,115 @@ const DisplayGroupInfo& InputWindowsManager::GetDisplayGroupInfo() { return displayGroupInfo_; } + +bool InputWindowsManager::IsNeedRefreshLayer(int32_t windowId) +{ + CALL_DEBUG_ENTER; + const MouseLocation &mouseLocation = GetMouseInfo(); + int32_t logicX = mouseLocation.physicalX; + int32_t logicY = mouseLocation.physicalY; + auto touchWindow = GetWindowInfo(logicX, logicY); + if (!touchWindow) { + MMI_HILOGE("TouchWindow is nullptr"); + return false; + } + if (touchWindow->id == windowId) { + MMI_HILOGD("Need refresh pointer style, focusWindow type:%{public}d, window type:%{public}d", + touchWindow->id, windowId); + return true; + } + + MMI_HILOGD("Not need refresh pointer style, focusWindow type:%{public}d, window type:%{public}d", + touchWindow->id, windowId); + return false; +} + +void InputWindowsManager::OnSessionLost(SessionPtr session) +{ + CALL_DEBUG_ENTER; + CHKPV(session); + int32_t pid = session->GetPid(); + + auto it = mapPointerStyle_.find(pid); + if (it != mapPointerStyle_.end()) { + mapPointerStyle_.erase(it); + MMI_HILOGD("Clear the pointer style map, pd:%{public}d", pid); + return; + } +} + +int32_t InputWindowsManager::SetPointerStyle(int32_t pid, int32_t windowId, int32_t pointerStyle) +{ + CALL_DEBUG_ENTER; + auto it = mapPointerStyle_.find(pid); + if (it == mapPointerStyle_.end()) { + MMI_HILOGE("The pointer style map is not include param pd:%{public}d", pid); + return RET_ERR; + } + + auto subit = it->second.find(windowId); + if (subit == it->second.end()) { + MMI_HILOGE("The window type is invalid"); + return RET_ERR; + } + + subit->second = pointerStyle; + MMI_HILOGD("Window type:%{public}d set pointer style:%{public}d success", windowId, pointerStyle); + return RET_OK; +} + +int32_t InputWindowsManager::GetPointerStyle(int32_t pid, int32_t windowId, int32_t &pointerStyle) const +{ + CALL_DEBUG_ENTER; + pointerStyle = DEFAULT_POINTER_STYLE; + + auto it = mapPointerStyle_.find(pid); + if (it == mapPointerStyle_.end()) { + MMI_HILOGE("The pointer style map is not include param pd, %{public}d", pid); + return RET_ERR; + } + + auto subit = it->second.find(windowId); + if (subit == it->second.end()) { + MMI_HILOGE("The window type is Invalid"); + return RET_ERR; + } + + pointerStyle = subit->second; + MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, pointerStyle); + return RET_OK; +} + +void InputWindowsManager::UpdatePointerStyle() +{ + CALL_DEBUG_ENTER; + for (const auto& windowItem : displayGroupInfo_.windowsInfo) { + int32_t pid = windowItem.pid; + auto it = mapPointerStyle_.find(pid); + if (it == mapPointerStyle_.end()) { + std::map tmpPointerStyle; + tmpPointerStyle.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); + auto iter = mapPointerStyle_.insert(std::make_pair(pid, tmpPointerStyle)); + if (!iter.second) { + MMI_HILOGE("The pd is duplicated"); + return; + } + continue; + } + + auto subit = it->second.find(windowItem.id); + if (subit == it->second.end()) { + auto iter = it->second.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); + if (!iter.second) { + MMI_HILOGE("The window type is duplicated"); + return; + } + } + } + + MMI_HILOGD("Number of pointer style:%{public}zu", mapPointerStyle_.size()); +} + #endif // OHOS_BUILD_ENABLE_POINTER #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) @@ -559,6 +684,23 @@ std::optional InputWindowsManager::SelectWindowInfo(int32_t logicalX return std::nullopt; } +std::optional InputWindowsManager::GetWindowInfo(int32_t logicalX, int32_t logicalY) +{ + CALL_DEBUG_ENTER; + for (const auto& item : displayGroupInfo_.windowsInfo) { + if ((item.flags & WindowInfo::FLAG_BIT_UNTOUCHABLE) == WindowInfo::FLAG_BIT_UNTOUCHABLE) { + MMI_HILOGD("Skip the untouchable window to continue searching, " + "window:%{public}d, flags:%{public}d", item.id, item.flags); + continue; + } else if (IsInHotArea(logicalX, logicalY, item.pointerHotAreas)) { + return std::make_optional(item); + } else { + MMI_HILOGW("Continue searching for the dispatch window"); + } + } + return std::nullopt; +} + void InputWindowsManager::UpdatePointerEvent(int32_t logicalX, int32_t logicalY, const std::shared_ptr& pointerEvent, const WindowInfo& touchWindow) { @@ -607,12 +749,21 @@ int32_t InputWindowsManager::UpdateMouseTarget(std::shared_ptr poi MMI_HILOGE("The addition of logicalY overflows"); return RET_ERR; } - IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); + auto touchWindow = SelectWindowInfo(logicalX, logicalY, pointerEvent); if (!touchWindow) { MMI_HILOGE("touchWindow is nullptr, targetWindow:%{public}d", pointerEvent->GetTargetWindowId()); return RET_ERR; } + + int32_t mouseStyle = 0; + int32_t ret = GetPointerStyle(touchWindow->pid, touchWindow->id, mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed, mouse style return default style"); + } + IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), + pointerItem.GetDisplayY(), MOUSE_ICON(mouseStyle)); + pointerEvent->SetTargetWindowId(touchWindow->id); pointerEvent->SetAgentWindowId(touchWindow->agentWindowId); int32_t windowX = logicalX - touchWindow->area.x; diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp old mode 100644 new mode 100755 index 3b7fda8f8a..c71c81f223 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -31,47 +31,124 @@ namespace OHOS { namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "PointerDrawingManager" }; -const std::string IMAGE_POINTER_JPEG_PATH = "/system/etc/multimodalinput/mouse_icon/angle.png"; +const std::string IMAGE_POINTER_DEFAULT_PATH = "/system/etc/multimodalinput/mouse_icon/"; } // namespace } // namespace MMI } // namespace OHOS namespace OHOS { namespace MMI { -void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY) +PointerDrawingManager::PointerDrawingManager() +{ + + mouseIcons_[MOUSE_ICON::DEFAULT] = IMAGE_POINTER_DEFAULT_PATH + "Default.png"; + mouseIcons_[MOUSE_ICON::EAST] = IMAGE_POINTER_DEFAULT_PATH + "East.png"; + mouseIcons_[MOUSE_ICON::WEST] = IMAGE_POINTER_DEFAULT_PATH + "West.png"; + mouseIcons_[MOUSE_ICON::SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "South.png"; + mouseIcons_[MOUSE_ICON::NORTH] = IMAGE_POINTER_DEFAULT_PATH + "North.png"; + mouseIcons_[MOUSE_ICON::WEST_EAST] = IMAGE_POINTER_DEFAULT_PATH + "westEast.png"; + mouseIcons_[MOUSE_ICON::NORTH_SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "northSouth.png"; + mouseIcons_[MOUSE_ICON::NORTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "northEast.png"; + mouseIcons_[MOUSE_ICON::NORTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "northWest.png"; + mouseIcons_[MOUSE_ICON::SOUTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "southEast.png"; + mouseIcons_[MOUSE_ICON::SOUTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "southWest.png"; + mouseIcons_[MOUSE_ICON::NORTH_EAST_SOUTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "northEastSouthWest.png"; + mouseIcons_[MOUSE_ICON::NORTH_WEST_SOUTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "northWestSouthEast.png"; + mouseIcons_[MOUSE_ICON::CROSS] = IMAGE_POINTER_DEFAULT_PATH + "Cross.png"; + mouseIcons_[MOUSE_ICON::CURSOR_COPY] = IMAGE_POINTER_DEFAULT_PATH + "cursorCopy.png"; + mouseIcons_[MOUSE_ICON::CURSOR_FORBID] = IMAGE_POINTER_DEFAULT_PATH + "cursorForbid.png"; + mouseIcons_[MOUSE_ICON::COLOR_SUCKER] = IMAGE_POINTER_DEFAULT_PATH + "colorSucker.png"; + mouseIcons_[MOUSE_ICON::HAND_GRABBING] = IMAGE_POINTER_DEFAULT_PATH + "handGrabbing.png"; + mouseIcons_[MOUSE_ICON::HAND_OPEN] = IMAGE_POINTER_DEFAULT_PATH + "handOpen.png"; + mouseIcons_[MOUSE_ICON::HAND_POINTING] = IMAGE_POINTER_DEFAULT_PATH + "handPointing.png"; + mouseIcons_[MOUSE_ICON::HELP] = IMAGE_POINTER_DEFAULT_PATH + "Help.png"; + mouseIcons_[MOUSE_ICON::CURSOR_MOVE] = IMAGE_POINTER_DEFAULT_PATH + "Move.png"; + mouseIcons_[MOUSE_ICON::RESIZE_LEFT_RIGHT] = IMAGE_POINTER_DEFAULT_PATH + "resizeLeftRight.png"; + mouseIcons_[MOUSE_ICON::RESIZE_UP_DOWN] = IMAGE_POINTER_DEFAULT_PATH + "resizeUpDown.png"; + mouseIcons_[MOUSE_ICON::SCREENSHOT_CHOOSE] = IMAGE_POINTER_DEFAULT_PATH + "screenshotChoose.png"; + mouseIcons_[MOUSE_ICON::SCREENSHOT_CURSOR] = IMAGE_POINTER_DEFAULT_PATH + "screenshotCursor.png"; + mouseIcons_[MOUSE_ICON::TEXT_CURSOR] = IMAGE_POINTER_DEFAULT_PATH + "textCursor.png"; + mouseIcons_[MOUSE_ICON::ZOOM_IN] = IMAGE_POINTER_DEFAULT_PATH + "zoomIn.png"; + mouseIcons_[MOUSE_ICON::ZOOM_OUT] = IMAGE_POINTER_DEFAULT_PATH + "zoomOut.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_EAST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_WEST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinWest.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "middleBinSouth.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorth.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorthSouth.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorthEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorthWest.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinSouthEast.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinSouthWest.png"; + mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST] = IMAGE_POINTER_DEFAULT_PATH + + "middleBinNorthSouthWestEast.png"; +} + +PointerDrawingManager::~PointerDrawingManager() {} + +void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, + const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; - MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", displayId, physicalX, physicalY); + MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", + displayId, physicalX, physicalY, mouseStyle); FixCursorPosition(physicalX, physicalY); lastPhysicalX_ = physicalX; lastPhysicalY_ = physicalY; if (pointerWindow_ != nullptr) { pointerWindow_->MoveTo(physicalX, physicalY); + + if (preMouseStyle_ == mouseStyle) { + MMI_HILOGD("The preMouseStyle is equal with mouseStyle"); + MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", + displayId, physicalX, physicalY); + return; + } + preMouseStyle_ = mouseStyle; + int32_t ret = InitLayer(mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return; + } + MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", displayId, physicalX, physicalY); return; } - + CreatePointerWindow(displayId, physicalX, physicalY); - CHKPV(pointerWindow_); + int32_t ret = InitLayer(mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return; + } + + MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", + displayId, physicalX, physicalY); + return; +} + +int32_t PointerDrawingManager::InitLayer(const MOUSE_ICON mouseStyle) +{ + CALL_DEBUG_ENTER; + CHKPR(pointerWindow_, RET_ERR); sptr layer = GetLayer(); if (layer == nullptr) { - MMI_HILOGE("Draw pointer is failed, get layer is nullptr"); + MMI_HILOGE("Init layer is failed, get layer is nullptr"); pointerWindow_->Destroy(); pointerWindow_ = nullptr; - return; + return RET_ERR; } sptr buffer = GetSurfaceBuffer(layer); if (buffer == nullptr || buffer->GetVirAddr() == nullptr) { - MMI_HILOGE("Draw pointer is failed, buffer or virAddr is nullptr"); + MMI_HILOGE("Init layer is failed, buffer or virAddr is nullptr"); pointerWindow_->Destroy(); pointerWindow_ = nullptr; - return; + return RET_ERR; } auto addr = static_cast(buffer->GetVirAddr()); - DoDraw(addr, buffer->GetWidth(), buffer->GetHeight()); + DoDraw(addr, buffer->GetWidth(), buffer->GetHeight(), mouseStyle); OHOS::BufferFlushConfig flushConfig = { .damage = { .w = buffer->GetWidth(), @@ -79,11 +156,9 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in }, }; OHOS::SurfaceError ret = layer->FlushBuffer(buffer, -1, flushConfig); - MMI_HILOGD("Draw pointer FlushBuffer ret:%{public}s", SurfaceErrorStr(ret).c_str()); - if (IsPointerVisible()) { - pointerWindow_->Show(); - } - MMI_HILOGD("displayId:%{public}d,physicalX:%{public}d,physicalY:%{public}d", displayId, physicalX, physicalY); + MMI_HILOGD("Init layer FlushBuffer ret:%{public}s", SurfaceErrorStr(ret).c_str()); + UpdatePointerVisible(); + return RET_OK; } void PointerDrawingManager::FixCursorPosition(int32_t &physicalX, int32_t &physicalY) @@ -165,7 +240,7 @@ sptr PointerDrawingManager::GetSurfaceBuffer(sptr pixelmap = DecodeImageToPixelMap(IMAGE_POINTER_JPEG_PATH); + std::unique_ptr pixelmap = DecodeImageToPixelMap(iconPath); CHKPV(pixelmap); OHOS::Rosen::Drawing::Pen pen; pen.SetAntiAlias(true); @@ -218,7 +293,8 @@ std::unique_ptr PointerDrawingManager::DecodeImageToPixel return pixelMap; } -void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t width, int32_t height, Direction direction) +void PointerDrawingManager::OnDisplayInfo(int32_t displayId, WinInfo info, int32_t width, + int32_t height, Direction direction) { CALL_DEBUG_ENTER; hasDisplay_ = true; @@ -226,6 +302,8 @@ void PointerDrawingManager::OnDisplayInfo(int32_t displayId, int32_t width, int3 displayWidth_ = width; displayHeight_ = height; direction_ = direction; + windowId_ = info.windowId; + pid_ = info.windowPid; DrawManager(); } @@ -238,13 +316,22 @@ void PointerDrawingManager::UpdatePointerDevice(bool hasPointerDevice) void PointerDrawingManager::DrawManager() { - if (hasDisplay_ && hasPointerDevice_ && pointerWindow_ == nullptr) { + if (hasDisplay_ && hasPointerDevice_) { MMI_HILOGD("Draw pointer begin"); + int32_t mouseStyle = 0; + int32_t ret = WinMgr->GetPointerStyle(pid_, windowId_, mouseStyle); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed, mouse style return default style"); + } + if (lastPhysicalX_ == -1 || lastPhysicalY_ == -1) { - DrawPointer(displayId_, displayWidth_/2, displayHeight_/2); + DrawPointer(displayId_, displayWidth_/2, displayHeight_/2, MOUSE_ICON(mouseStyle)); + MMI_HILOGD("Draw manager, mouseStyle:%{public}d", mouseStyle); return; } - DrawPointer(displayId_, lastPhysicalX_, lastPhysicalY_); + + DrawPointer(displayId_, lastPhysicalX_, lastPhysicalY_, MOUSE_ICON(mouseStyle)); + MMI_HILOGD("Draw manager, mouseStyle:%{public}d", mouseStyle); return; } @@ -332,5 +419,51 @@ int32_t PointerDrawingManager::SetPointerVisible(int32_t pid, bool visible) UpdatePointerVisible(); return RET_OK; } + +int32_t PointerDrawingManager::SetPointerStyle(int32_t pid, int32_t windowId, int32_t pointerStyle) +{ + CALL_DEBUG_ENTER; + if (WinMgr->GetWindowPid(windowId) != pid) { + MMI_HILOGE("The param window type is invalid"); + return RET_ERR; + } + + auto it = mouseIcons_.find(MOUSE_ICON(pointerStyle)); + if (it == mouseIcons_.end()) { + MMI_HILOGE("The param pointerStyle is invalid"); + return RET_ERR; + } + + if (WinMgr->SetPointerStyle(pid, windowId, pointerStyle)) { + MMI_HILOGE("Set pointer style failed"); + return RET_ERR; + } + + if (!WinMgr->IsNeedRefreshLayer(windowId)) { + MMI_HILOGD("Not need refresh layer, window type:%{public}d, pointer style:%{public}d", windowId, pointerStyle); + return RET_OK; + } + + int32_t ret = InitLayer(MOUSE_ICON(pointerStyle)); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return RET_ERR; + } + MMI_HILOGD("Window type:%{public}d set pointer style:%{public}d success", windowId, pointerStyle); + return RET_OK; +} + +int32_t PointerDrawingManager::GetPointerStyle(int32_t pid, int32_t windowId, int32_t &pointerStyle) +{ + CALL_DEBUG_ENTER; + int32_t ret = WinMgr->GetPointerStyle(pid, windowId, pointerStyle); + if (ret != RET_OK) { + MMI_HILOGE("Get pointer style failed, pointer style return default style"); + return RET_ERR; + } + + MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, pointerStyle); + return RET_OK; +} } // namespace MMI } // namespace OHOS diff --git a/util/common/include/struct_multimodal.h b/util/common/include/struct_multimodal.h old mode 100644 new mode 100755 index 733e3e2d47..0d6182c41a --- a/util/common/include/struct_multimodal.h +++ b/util/common/include/struct_multimodal.h @@ -108,6 +108,48 @@ enum TABLET_PAD_STRIP_AXIS_SOURCE { TABLET_PAD_STRIP_SOURCE_FINGER, }; +enum MOUSE_ICON { + DEFAULT = 0, + EAST = 1, + WEST = 2, + SOUTH = 3, + NORTH = 4, + WEST_EAST = 5, + NORTH_SOUTH = 6, + NORTH_EAST = 7, + NORTH_WEST = 8, + SOUTH_EAST = 9, + SOUTH_WEST = 10, + NORTH_EAST_SOUTH_WEST = 11, + NORTH_WEST_SOUTH_EAST = 12, + CROSS = 13, + CURSOR_COPY = 14, + CURSOR_FORBID = 15, + COLOR_SUCKER = 16, + HAND_GRABBING = 17, + HAND_OPEN = 18, + HAND_POINTING = 19, + HELP = 20, + CURSOR_MOVE = 21, + RESIZE_LEFT_RIGHT = 22, + RESIZE_UP_DOWN = 23, + SCREENSHOT_CHOOSE = 24, + SCREENSHOT_CURSOR = 25, + TEXT_CURSOR = 26, + ZOOM_IN = 27, + ZOOM_OUT = 28, + MIDDLE_BTN_EAST = 29, + MIDDLE_BTN_WEST = 30, + MIDDLE_BTN_SOUTH = 31, + MIDDLE_BTN_NORTH = 32, + MIDDLE_BTN_NORTH_SOUTH = 33, + MIDDLE_BTN_NORTH_EAST = 34, + MIDDLE_BTN_NORTH_WEST = 35, + MIDDLE_BTN_SOUTH_EAST = 36, + MIDDLE_BTN_SOUTH_WEST = 37, + MIDDLE_BTN_NORTH_SOUTH_WEST_EAST = 38, +}; + #pragma pack(1) struct TagPackHead { MmiMessageId idMsg; @@ -188,6 +230,11 @@ struct Threshold { int32_t lower {}; }; +struct WinInfo { + int32_t windowPid {}; + int32_t windowId {}; +}; + struct RegisteredEvent { int32_t deviceId {}; char uuid[MAX_UUIDSIZE] {}; diff --git a/util/source_icon/Cross.png b/util/source_icon/Cross.png new file mode 100755 index 0000000000000000000000000000000000000000..b7f79e2c77d7e93e134daab77edbd192bf7ff4a5 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-euz(rC1}QXr;NuTe_SVzIF{Fa= z?d^wt%?1Jo3JngOK6AcWVSeT3Lu~mx{8W@;3 zuo4@*8xtk^isn4o;nTj){+&?rSzrH(PoEagx%Q>Bf5tDl=0B-Csh7Xy-tJ3`z5eob z!1b?}D;93BKgz^)!^5;PtSByK-K>O({#!SArY&P$aPo0D(+laDx(p_jf4mrKl{d3C zsP)HlF33;W#&F@uM{UM0y=TN2X4%xKHtd^tlgVN7@%1bh%#ETMGCuv7%J9oAjhn$& zZod(a2KT(rwmh)`d{dWBah_Yp{@Tv_m7I6Q)NtWRv+Z>5{aY^VODXqp}0<;lJ;-YxE~|HrXE zRdtpjbG)jgYfa0dc=K7SpUnw6biYwE@{H9*c^})o^BTdvNk}9 XWSG81`l;EjpakIQ>gTe~DWM4fdG7B6 literal 0 HcmV?d00001 diff --git a/util/source_icon/Default.png b/util/source_icon/Default.png new file mode 100755 index 0000000000000000000000000000000000000000..038a5ecf7384c5905cf3e53109fb4f5e07af4671 GIT binary patch literal 1247 zcmX|93rv$&6#iQ%^g)Y6UJ;2M-AV;vL$LEyIqQeLIp9sHA>hs40{ez2$p@D(X(J+P5-V#2tjzn?l6!GV??F3iC&#^HlS!fIsJK-fML z5yxXN7;tZ7WCY)tnHf7fJ7Z&G3Wb6YT3%kZx3{O!XmGWt=`uqEvn3w=43#zF=3;ipa4pMq^zur08*)x05vr=gp&f#zXLxw~m0f0i4m6i4N^+1E8jg1Yc zh4AZPh=>SiY;<&VQ&SV0%?1^`2?5E)Cl&{T(fV0T zRBR>+z|d>K7D6j$NoXYn;h!M<3c}0C2)~8YwFXGtYKYdlDQM%-#-OowjJ7q&*io`} zW)JBW%=NFW(25PhZDC~I#*P|ClTVtyiu7 z`%pY9+Zo;w;k`X;ckNhd3;CQPFeth(!75N@N4QUNx5D(!f&D zvK$OFw())@pFjth)O5LPK8k=dxGAs)c}OBWw@vn-oSxU6c1|+1zlVVb$Z= zHz6L5!i?<&HK+U4u>kQ!pMTwDn)4LfE_u3P^;xn0!BO>;;vGZl3hk(6-{y@Rt3*Fj z_pZIE>HYrMN=bBE#&GA$nYlExi67`H%cDcHzm1Zgsv3VS-uL@fbu8qA)G;gD=67Kh NF+MLUq=PFe`41oP{u%%P literal 0 HcmV?d00001 diff --git a/util/source_icon/East.png b/util/source_icon/East.png new file mode 100755 index 0000000000000000000000000000000000000000..ce9f8c9f0b523c58ab051aed3ba5f43825c2165f GIT binary patch literal 1822 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/North.png b/util/source_icon/North.png new file mode 100755 index 0000000000000000000000000000000000000000..1d5467be9b59a1cab0d84c21e0cc31816108c01c GIT binary patch literal 1705 zcmZ`(X{T8++#9lG8})lsP&!8e-9yJ43jVxlLJ)OX}c~8)~K_nQ4}( zg^Z?{2&AP%x$iZizD#P=Mw39%m`owXb?D1`U*5aF-?`_Ud(YQ^i7 zAplg#kk2zZ_@6DF4*jqG9JHKv^8^4DZD*V#F%cpyb@jA3q1EpwT1zWumdv$QI0s@Ops7Z}mrw=%!sx59=-;_sY$Q#0SxoL&fH$>Bg+r8d_hp9uQm>+CySKlu! zEqTgTS64>`oIPTMtxan)4|VIjPcR&bKUm&&ZmmXQS7UG+gR!^YxMZup!|m&=s;Vl^ z_{RkPuHhCRH{OmQIDt1PKZJwlXRh43sh~+hM-{EDtN;1Oi6u%$9C%_B_+IfiyIpo92?Cr zi?DCGABnUqaLxdwzvSuR;jwkTPO1oPc!m9R`TK4LgV8==9~FAk?M2+kl|C~ae-~TT z=z;n9`66i-bT2US`0^WWds|yukgonLIr&wIMPq_@I^b}%n3UUnXF2z)jM#6N+QgAo z=SY(8mxl+3&IFbzVuah1gS^p)%@)bQo35i7lDJctRLSzI*KY~F=-`Gk=wtAo^n=hu z?+*SLdXRsgEscx)z2W#W(@YIdWdKqz?_Of(b3ZXzZRDr;vZ=_^B?}BgzL$p!2-9Er z9U$yURqw3?ig&xkk@KdLTuH#D)FtZC?PBnDR~3L&t6T%0MVg+_K>?ihAujTMJMM{!Lp&!QO)+<&dN|G)cs&yTy1VyuKsRZez-I&!UBH)JqsA$L z@MLCEfS`YNJRq+Bhdv`ztR{E^HZW9JYhji?6y7iDt6Sd>$J1d@=0lcdW<}M4jE}a# zs8KHb8->tX$I-1h2ixXWO@KN>NCyZPHC^5soYW6&XZJMiX7XUG@pe_TQk@Q!BC|7# zw26K}y6N`JOvsgJifLpIrfe&+uYEl!@yR)D(!%gPfKZXQ@-+HEW8)Ij5mu~vxJP+T zpQs9mt$HPLYXzI;9cu1Bt1EsBvlh-0d3H0oM36_lc%me_D9~U24iBzux2X@qs$AGn#0XGz0 z)izl5F?OW|064y!{Upbesk?GO0_GQ+%7y!Zy#kdvDxs6Ih?hW}fz&(nXW@f^+;EZx zr<8aEe$ty;Uq9npjt$P3W%cRgu=b}FjurVEi*Ca8jH!X4e9Gp|+BBhPoS5WT)Cg>ipUV!ks5@7yf?ac{>HAv(<*N^ulS>7e(NT*6WSnM~qKA g&icQ<8Ksi34IF)0hMYw5-vG*TKH-659}CL-2e^M7>Hq)$ literal 0 HcmV?d00001 diff --git a/util/source_icon/South.png b/util/source_icon/South.png new file mode 100755 index 0000000000000000000000000000000000000000..0810133b57c45d1be279bf3562adab6fdfd889bb GIT binary patch literal 1829 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/cursorCopy.png b/util/source_icon/cursorCopy.png new file mode 100755 index 0000000000000000000000000000000000000000..cb4f56956f838f8dec0e92f58d7914878672dca4 GIT binary patch literal 4008 zcmV;Z4_EMsP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91Pyhe`05RZ9PXGW95=lfsRCodHoO^Io^%ci=_wMFF zvU!m=PahB%0ti%#C@&4@XxmW+hE`{^R)U2oB3fEy`~#;mwuMgZXs6Y}I1W{dw&OTs zEjSJasznqLK}bj@NI)QjM;<_4knHw+e|x{{Z#TP}d&z^u^~@a3@BZ%Zan9$S-@SM5 zy}{|QCQfOlt4p@S75gE6Q+;Bg*zVNoq^Rn2i}IipK(Hf#q=R!$m@pxsyuAFjs;a8H z=gpg!BKs3WJ(?O)hVlSNQI&Oz^0!(54G;h(QFMrC+Wh(RbKBb5{_8iTy}fIBD1c;CR#rYhc(eksytK6R2H8JC zv_LdRG*i?o8kZ2m0Rlpr=+K&)nqLy!+O=z0^tZOQ9(wS>2d7D!(W1je^F#>|*&A1x zr~~BkO&16`)z#I%A~o6eheKSvc=2?pzg8642#8qH$i%pUNPs;5;X;9I%9ADhqz+K( zLLj!Zv{WuywCHB3zg~1C`iKq{jVp-Z0CD~U!2F7eil@Q>N__~#ix)3eEnK*8hSZM{ z1w>q6;tHY;kQWdDD2N77_H}`H@4fflD)nPUM~TK2#ApBu4<0HGDb8Qzk~rKy?wZ zvV;i`HeMk{0*G^Gg3XCrIiRM!r{ZSa6 z0u4Hd{RS`+MDuwf9?Ig$HeL_lVJ@CY;^8hbk?&aGCv?C`zXFu#LoyK$Wz8qsqh%l7 zvEY1&R|-5IhA(B=HL#@L0ZRBG5SyEu4-^*{kC%G98o=8=yy+V>S$I_d3ZM{(+qP}{ zxzvpo#lu)$m2pAA3o2$Ie1-O#VB&s}B}7g*eEl$> zg^ucvvur&~5O{cS?c>vHySA~h@sq5qEWEJ4P87=+7ZWaHWZ|I9K)+-Yp7+HRWZs4i z8_>=v7lhMgWo2(Volc)&7(TInpU>xj#ULCH+fa|k)7j9_aBjtl72E6U>(v0S|ov4~lJ$p+gQYOS9gWo&b#LO*lN+enQ}#kWL7e3OEdumInrHP)B8k!4ewV zAPzvqHlU&ph2vsdujl?A***an4o|+7dHnU)Uq30HGDv0?oYwOkAb$r!y`ohP%{N%H_< zY}6AXfze_g%Tl~@;Sq^70@^^aY@mRSpHT_&K=r5N#*KSc%D50Xba?XF+o?w$dE~K8 zn>Oj^JOrdPyEr?2^1|`6GDc+1N%DH8%K*tTL|`T{ehE))tFa{kWuMdK4AhBrIi0PS z+d4jKIotBy{J52TGM0;DKJ z^>a8bHlJ;IvFuMf|5~@Z4q2&ZyABfI;18r%AO^e$3>fWSx(|Rj7vX*ony_!*z6Fye zP5O(JA#lhk-v`z%U%q_B%P+qScn}2OmmbdB*UbE3?zrqy!{g3z%4orxYITN-?24LP z!Bt}gfSFBAcrt5XpWJDlzEIoz+_tAbe6{{WeY?~$Be}E#zVsqQKCS6sjXGZbPSqjlL{RJ>z73CTi4}kt zP#+j&f`TPH*1M-YG->j+vq!BHU;+>4wE#GE<&;(`^RyAIXB1qqFG(56bF;^0eSEmA zh8H$~BRpFB14|F90693qrV<`3#!<`nn%N@@rrtO4MWL5gH6Qp)%*(|z6@OFepPPgpulSiA*>C0|>&Xs7$1w+nx>S7T%_W@vk zXC56>*5%Bd^yA_U8TlDFXY)Lb1Fx?jTktS$PXMAnL8`HS@ca3T5>q`BTy7(9&I2?; z)ULK@+}Fz%bA*fB2~52GH#6^-dS37dkPz9$GDtfB0gD6c7GtrtHvB6pv zy8tmT!NI}-x3|Dsf*raLnw_lE`}cL(o3DIU{>xl?Otz-B0+2@p7VT-(6)bODUP`hz zafS|TphDBh$lbyW_-@9;t1)BKW7fNMDO&-EP8d)hlt;|{y(N=p%9RD5Sqv(H&+uKG zMiw$2Jw}#e#$^>C2f?76OdYlKg4F5UIoPb}JK|vmqHGBqW3>Yi15*jnP$I2d4#mr~Kx{r)HJ~ zzbbHJ+}*uhQ6@gd3YDAkraSUd@P%7f@%ep@{b%+%zP@;@>&_@OrtgSH#Uhrm!CDeK z06CyOiM$+BpP6xAxAxH~tJN=zZW~5ua8v#a$K)8lO6CkNajgDuMTDM_t4!a+;YDs7 zr52s-2#*XQ+UeU5ZShOk^I-H3c{#nlF02RvlWj3Xr`xD6A@9 zzR+I7orBG4z6axBTvlVT3lQUSGFV^3vGaKEIw-~T9q)$qm~6#j2cSNQf`^HBZ~S7H zOpouE2bYM?%J%@gaEOS{l2`@E0mC77*4Naxv^BMVVrjMk)CfMqcX5d?*!9@pDPxZ5 zwN-!|kdxqu1-0R5BhUH}HW1Zul9dBqj((oz<>@C5KF-0%4t|u10!eGKEhWSPx&nt z;1~;I(_@Y~H6GfBcnH#J2I@eViMqvsaCNkIIGay5e>(E!;q&DMJN}c!0V7ztAN_IHFHRpi zQ!h^8^Itvtm<&7*GEutq-wr?m!=Nm~DtKm{tNuu1Yogavo-;n@4tYvrXMBv?Cn8T> zE|tGs@x=arR#eIa00)5KSqOMgTVf|bz|w`=I!skQ{#otW{Bb#F(}sCx>m9CE`Q+}} zXSc80xkKg$I6eCS5vL%+vz&R-M~NMP=s;M3-rsDqK4_~yIPz6)QFfhon0NZs%0y(| ziBC`dcI(q0{97C*JOU&vG7b+r^vq-S=}VV>*@Aeb067`04v}?1+iRb1mtFHgwzBej%oci)qqjW}gG0O-KbyNV7E;`2Oa7D4Hj`bQP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91Pyhe`05RZ9PXGWA*-1n}RCodHoC%Or#Tm!@%{_bX za_n+sK|~HgE-?@V3`cD@+xdpxw>vXE%kF|%zN&A#Umst0|K{s{{rWx7L~PMQ zMG(qrGF-EzAVp*i7_Q}V9RJ>ifS@8qaAvBc>xdB}>?cl~m{eF;c*peV(-SG(N@@w^ z!#>K%u<244{$cp~|2D)x0RT_{$3dDvnmlF7lhShVs%$Q%RFZ zQPxh%U}cz{0-_Ai76Ot?VOl{!!Ayq7q1Wp@ylmOB!Ia;P6d+Sb0TJLkB}ATv?0xX6 zG}5j#b(b=@l`B_rGzf@`7A+b|Wim;-kir`=y*nMmmb?!h1t?kMflo0tx(><^X=>-s zpFe*%rS~B1O4=zQ$^fyB!HeL1-AQ{NI&^5c43N^AK=gP#N9N9*JCf3Sl6FdnGC)i} zOy3OBEYd#v_wRqk2$0gRKqLq(43O79+&nOS;Zgne?%lhhC4iK71tLL!$N-&mjr9*x zu{UY|+}zw%kpNQu6^H}@0I?B<2QolxPkul;V9%aC&qf1CWjZ}X2FUwAcpz>d*`xz^ z@7}#S7QoI9(FhP*5e7JD*REa9sQ~QE5Zer3XNB0N06QbZHV4?*Ahrv@&IGaD0CpCL z?Fz6J5RHek=-*{6?GBJeAMa+{2=NNQC=mH5j1Oh`Wczyqu|qr%0AoPJ0fr1we&=#o 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 BP^tg` literal 0 HcmV?d00001 diff --git a/util/source_icon/handGrabbing.png b/util/source_icon/handGrabbing.png new file mode 100755 index 0000000000000000000000000000000000000000..23e0b188165e780722392cdd5e3502803dfa918d GIT binary patch literal 2691 zcma)8XE+-Q7fw*4*VY<|#w^#06&fp5HLFHLi*l<*BwAY$tr6v_U8`bUNwr34UHiHf zN>QUWmnPH-RT3qQ+TrS-?|Z&~-;ejaXa6|QInQ&F?QJdi&VtSY002HKOH<@2+y4YN z=c&vP`u^sWfT2hW6F|+dY$*i_=fSwKCGJaVbUsMkMt+ZrF^TMae1^R85#KQLS0K7IVsjV-2FEc1*J9qN zvxI)QTY9T0dNjgJJfXInp#}{X#9}%M<2i~KgQX=$f91hS(x1LWBc~=OCpCkYy8Zex zWrp+V9dYa~e%5%XPOaY#olJfkMyv17QEc7#{lotAZJlJ1F3G{3;x2jVY*sgQ&ruTl zWns&xv#8SF;bj-H`QATO^syHfdMZcxnqDDE6}Eq*?4w+p{rWx9CH3m5J*i^*x<~8( zRP$vqV&qtEZ1RHr=BJ&^lJ0?=Zzc5B%P{A%iX#(u<0y!{dfN1#5x}OP#rKkZ3~Fy{ zvC4)^`VhN9oD}0l`JgcxHgzHwp!qz8Ah=AD^=*HWaDcYkQI*%CC zjhneTQjs1RqoBv{&Q8u7L;};;*`%rZhj5dHER%QmV>f2bN>|&X-JmendT*-|{|29- zs=sdJ>xKHjBfoo(BEO9v)5#5_8nC@MA_^-G!`M4F`xP8Uxt{rA*Z#ohigF-^>Fl$FA%nQImn7R^}3(oqdPI%0#e!niyxxoPd5)xzI! zocuJ$dXS~d4=C8UJGEJ0th*HX{jh7K*-xgK~8r}=h4VYjy#5}%M}Y>Zbc+Ld^#yJrioxVpL)DegP|4yBR7 z$bBtaOlX+=KN--U6rvY2ofwG_l0K*1%Sc1hOcDu`Ckf{@U`Q{A z*>ZE?(0-S%Gf8BH=##~+C!0ptEooKvl9RBCa+rBIZPBp$H`$o#8-dn_T;C~atBQ9+ zwDjuwjmz1%VZUJWWRU2?n`;&5krMyq9}}f!sg5>Y;7b9#t0M$7f8IBOJW+-nMgj_C z#%mZy@iLOv4QHW~Du*GJAH_D@$gq1x$BEyOh0OW1mv%wn_N^3qb@;=iH7IU;0CDqBrAzS@UCED7v zCK;K!UDM4&O*pvy+7sk8n){_81>G;M{IP%f>OeabaZ7Ku?U9&R#sve>42Tg3Tk_~= zFL)AY8Pwwc zY}4JHkE&%!y`phL!~$`~%Nf@>4~DOkf9&2gSKakVMtEy*a&w#`8f8*m##*^K_;Nu| zSC{qs5bgYIP$k23C-;zC2k@4lprEwN0IrVrss7B@_^+GMHwOh~0nRDyRts@lEv2(u zxcuE%2kUL?Te-d*8;Y^GAp4Hw^o=CH;AT*Jn*d}pEhKy~3;6brnC)KDNzv{1^IAY* z7(ipdSj&{6LD94C5Ke6vk@(7LQktKa<}GG@lEUO}L?gG#Zl7K>oGV=-?<2wzAYR%@ zo)AmowD_YP^6~Itth83mVP*bq58jg@0Y$O#t?O-Zil9M?S>dJzEYzMyNCp?mv=VlEC&aX+qas$s@3dcax%~Nz%Lg}xA+(o>d697= zoIsK}NbYR$!##MBRyQPy|C~3tdk$02QyRDQcM57f7~I<9pLm|n>4`VSPvyPx6qS{e zn|ei2Vmp=>S=`|KG-9{;gtN5O|8r9hRYAp|!<&7_gLvG%HD&x`v8C#_|M{tSz1dEH Y4i*~=<>i+3KOaCVGh5Rdle>@q1&{U*DgXcg literal 0 HcmV?d00001 diff --git a/util/source_icon/handOpen.png b/util/source_icon/handOpen.png new file mode 100755 index 0000000000000000000000000000000000000000..14b8255ecb35c84146e344cdd422db00aa85efbe GIT binary patch literal 3497 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 Uuy2K(`|~ED3``N_`u8IK1F=MqmjD0& literal 0 HcmV?d00001 diff --git a/util/source_icon/handPointing.png b/util/source_icon/handPointing.png new file mode 100755 index 0000000000000000000000000000000000000000..784fe1d8bb97740ea3b95a8d82bcadcacf97b509 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinNorth.png b/util/source_icon/middleBinNorth.png new file mode 100755 index 0000000000000000000000000000000000000000..824214ee55bb4c8ea8c63398ba6b00ce3c9b0fd9 GIT binary patch literal 2628 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinNorthSouth.png b/util/source_icon/middleBinNorthSouth.png new file mode 100755 index 0000000000000000000000000000000000000000..5ed9074b55b2a9654af8e19b6e71c48ebd863c52 GIT binary patch literal 3244 zcmYLMc{tQx7ymLE{jvpnBlk3VovEcEi9Og#sk$@=1Up-V0zlR-qF=od5t-!~lTkoZ)z_ zi1B~BW<{X?%g2gxv&NilI~}m8i=7`;**ppt%GeJ$cZs&XJrK52 zzo~0Ivmh?idgo*2-$U`?ru-0+9iN` zNny6R+`QY`{l|qXvvyfZgpk!i13_c{d^q`S37do9b_p_cb+p2uzrSDn_EuJ6#dh6t zNNqnM$tUx5J(xcdA^ub1r&xsf;UC{=Lfg>r@Vzn)&fpK_7}xY`%nqO{>{y(48jzma z8Q9uFjNez7|CH1&8@%<+=I2a14N^N@>!eM;);!+$0*1Yr((!DvYSMgJuaG%yh$#q` z=t%Nk=w=2UtW)q>p9<7Knemo;NcjwD)#YwYMRgobu+BuzFu|#-UKNkB?>HEqdl%2k zIQru1L%TQ#)DNQ@g>V}^AM=_|5Q~7<#-h**?+zvM!s`b3f|8NW6WjB=UB>U9PgFY` zJmX1jiBt^TT^9+$u>^k*rduyQOa>FY;X;f>WbwRaX`qc9-bL+BgQ_3?{L)g!kU%V} z)4{T9@dyTr3Q#)T`^nnse_0XsipVndJ#Gl`-r|RNz{TIxEfF})B_m|$!P1<;h8B~N z{O&k5DeBXT`cg`qpbZvlV*r@Y-sl${j&KAb=+`Xl!i3|^%*{cNXGzW2Xw{iL!>DWy z$VZf$Pkf&n#xrPm+2vr9{14Yf)~1IWUnO)M5kK$$m}-!9=}zt>g�xmKld!BLpR| zp`9$y_IagNwquhbAX)$44($=)3bTKR6D`hYjM1O1C>AJCnGjPBr>{ITfn5nnl|iud<)$_$CpP zuE`?^h2Rr?<&cMjIQWgwtbXw1GUiThj&nE^85VRxcKo%i1?7zwS7?jK-RCezWUKcW zZcovzOdl>w4-{>P7PA9dgVIGHUc~yJjzlYTj$d1vsxO`xf;#XhdL>1)dJesW8o9sR z_ubrcF`m?+W79L;fnBBBsF;%)Bc$=jsl(ThTJ6xnKQ@O!p->Yh`O2FIDrEBZ28snKXBD$XOR8Xhd=WxwnFF@7Ysr-EXPPXdX<`#D_Bsi%thdDem19b z@NUAVQ(2_#@BIQw&Rq$3JL%Q6)m1>W?CEZt^Ng5`@+14UkR3+?dh(tv86rZedGn7P zela-Wl3yy37_z3qm8Hn2;up(Vt_Twni9jLjrn4TJ6e6k2sE_XIGMQVw!t`*b$HO8S z&bUcVjE9!vM9p?9wR{=wmLrtVUt9ky*#So^H*!;*%)QWPX;vWwaj?>+hVF5fAr0`c z%M$QUc_$E&b6XmMf|rDFC6qglukqc_eHN=31O8L-EL#senUIT*s_Mngu#9(|d_(Nv zO!W~5zVUmfM<1D<(83TzV`Eu(35*zv9tz%tMZsf$)fgFZT9etqT!Bz~cCwq9G~cMu zm(-Vzn(KiNt!mQ#Y%ir*EZrFig%t3lbPm5VVxhmC|HM!oC!fPf`(qeCyW5RT3WEk` zIw(6|2>D+(sAxzp zjt{%>M9iog|D=xZMxTpi!wG~okF7u=rGp2Kmr;LwGR*CP7#vvGOsm*gEYV9NF>|~w z4`J^cJ$&;xb;X6H6OQcK|A0RC8>n+~myA`Y9X{;OQ=;j3Og>vyk!ClLgXG+MoGK$t ziLOn7;MKWCz!7~oW0z#>Oke~c+t{GgboEU}(l025{9e9Ui0mVp>Ma+ssbB z)Z|x8yGAZIFVUhNQ4a!|pO|LJ*d(wwr%%dHFaDltsm=v>8qZb_#nQn$%vq|iD2sD` zA#zX3raDl>_v6c$%dP~G>HRB)-Z5ip4H6b{&^U{e%pub{+iD*x1HShKSK0}9p%=81 zVeL6snK$oE@2DYPxB_*1IIe)JeQLs*X&_oJ3-4vL+st@@o(kIe>Q)piY(5We=?lFy z{li44qX#~`1xM3gc;-5Lt=eU-<0OmOo*$(zkNy0{@J$+RV>@@LZ0YShSg@VPTaq?2 zVS5au==7CMVb>~z1C|7T5lr}(7s z+dSp{*8OX8BiTl#)*ot;RQgDAZXdFsFA%|7qHN{xHp~BI?^Rx0SEV<{0~sFq(+p3l zm{^OF4GT|8wXkH70+t4-?%LY#Ja75zE)T_+=Z!EwrOh>9ksDuXV4O!d*eNBHW8ZEIzyyj|`4D=4`GqJcBXa9=Z7qJ%w1 zX-M<=f&gs%;W}lg{2l=oLF<8N3&__qTiS!3GRn5{epg`SVHZVx!Pa|xif9emoL3o! zb1p1g{h?B9d-bW4YfY|}zmwyJbmK771>Pk+-RNrd*yLW$WoQkt=^aJ3W z7fsLJ2lJ~+D^ntCZP$RQ#L}bQ3{mxxk=WZ|RrZNhZp9a_M_?vM7E_o9%=CEw-! zPt&z4Ko@UMZ*FeqHDC-MHXOgW8?{JJ1JL5dqwChIppVNj+pX(UXR0Lt+u*gXKpc_x zoPxV?jPC4NS-bX#wyN~=iw?|%JA_3pNAztY!nX4?Xr85Tf8bEW8K}!4JU0SmL0iNA zY*i$=iP4&L<*OnaJZKpz@LI8MtUAa;NW(tS$QRrGl0EG+-32YlT9|lABc}cj;h(45 zLibuI94?i^7jt)AlMs)?9IhAh85Zn_}^uED^w$F zE)xn12-Rp%NoUY!O)_;k5{t6u!hZF67sqz+%z7#yk}oYD2V?Z2O-0iC3|)AwRVMBG zZDIM-hAEwMxPxX=xZmilpF+aV4m`B!rARN?&tBK@JGSO8_dqB3cG#J27*B#rN#MDI zD?s-`aaw4vu$1nS6+SIo+R^}{cag!;(JsofB%Q5#X1F$lowJ_%Y>CZND8oy#HgwOj zQ7}iJ-ceA;$?#9eT{j-Yj!b%rR&-MopQ9NV=U2Xe9|}nf{>MKpRL6BlqVcZlgH5w` zJ5GQRTCke6m%O(`22S0{T&}=LI_U8LV~7MHqTlz%?DQkUW!H zq?{08MF{Gx)Q@xuOc`bVrasiJbTj(B1<%;|80qKr%MUz18*TH-JC-_#xWAz=g37xi zE>tMrOoB@-Mvq=Ll6iH`FEQH};<{2&CP{r&?8PZ4&$04aTuLuaHIng$qo0Pk2igr> zfMa~cC{!@a^virgD1|jruC^D%^vU}BLUs~n5zGhhdzON;UoDqvd4cqq*$`{OfX3)s z1nA5?*)uhm7>}Kc0$IcRnefPQO~}g>VNld)jEC|Kss%`ht=^HspX2ULVtZXW+Smga z8)lRs?yn|r@@Nx-rZO^a;jUhp+cLXa&UKG)r9G~?(8E8PI<3$9v)oBKLvwp LCOXwxx1;|B%-118 literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinNorthSouthWestEast.png b/util/source_icon/middleBinNorthSouthWestEast.png new file mode 100755 index 0000000000000000000000000000000000000000..da7fdacc4b8cb7feeb3116f46d346eb9aeb63098 GIT binary patch literal 4564 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinSouth.png b/util/source_icon/middleBinSouth.png new file mode 100755 index 0000000000000000000000000000000000000000..d6729e2dbaa257fc54a6683357dbf6750e67598b GIT binary patch literal 2680 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinSouthEast.png b/util/source_icon/middleBinSouthEast.png new file mode 100755 index 0000000000000000000000000000000000000000..69cc75e94563e246a74fe5ebe3d996d8039a5a67 GIT binary patch literal 2916 zcmb7GXH?V66930wD265h3>`#3nm2SorAm?Bq^ckx=%q;&xCsQgd4Pa`Kp-@c>ZOS^ zVJ-ysYYU?>293qSyv zVL`v=3eNmz)v5seU;lR?V%E$O0NDCW40P?nK%3d#5A4TzJN**_(4!8*!qQSVv|`?n zxxc*}q=c698kATWoGp9WW~_T`Wu(o*hkGLGQ&PY&H=pKQwc^NBQHX!SC(3fDTeE9j zVTT@hEG%kbar$YV9-B9B9>^2eDX4Ldd}n>5X^-N4+D}QYOEZ%yfkprS(kfwP*?#Tt{P1AvD%^iJ4~ z^Vrpj0If~Q!(p6^)Y{wcf8dhYaZPO6e6HDlR-D<9YdP9>pXXLE@eX*fG1Oz=PkU^B zdUfZtjU0F(lw}XmTU+#mk8h7i_>N_5WWr>PjU{`mB2Y*{KI2^6=W9|xyleO=u>AG!-e8Z>d3S|^PEY7X%3gg| zlQQlxRTJTw^E@;64-2j+<&)avhds8^TF$9I^JB|d9l1x?Mrd8mi5|UHD=SJ(lyB@a zK+m3gK`Tx6xwkVeRW|@^FE#C5J?gpQN~}3A7W!k-Df6b;*QN8m3)-kqFP0fuIsSd# zeXivmy}6hKydFT%6H;(Ia$JxTy%t7QhxEQN=-*mO@&4LYiYQD{=R@n#@cp`TNWN`} zHeteruQo0g8_#hP%qw7p+IrhEi;Uo~wc*PKsEx5Vgz2WM(JILg^j*40wWMyeasgc9 z@UfY(?W+&+{!YdKs{~X7Qd3!3$;tcHZ%Pjd;S>?-#UB%^FrFB2eso>2f6#@rmO7u% z3&FQp0#o*cAwO&NOmsY4T~%nc(Tft2+AjYJ`8o)96u-=hj8}x5n8wl%-$rrF5nb(JZN*p;nLESfA@i*f1+`KG*v>5&jFe^W3XH z-~O%tOeBp_7E#7`@cIMJ(0nxS-z;&!LDo;nrHS;n{SK{E+&O*=#bMour7wg}R-&T* zQ}1_!lztxWu74{v&#?**=&cKQbYsCbdF*+oAa4_f4TLQJ!&js1qqK-b^`IN+zE#!1 z<+2Seu^FBY9=}Oq0C36xLLy$?>50Iqt$)HA+S_*cMFb>ecQGlZzUM}+cGOAw+S*zf zv{F@(r~WhD|8QruZtpu5$?brHfc29$V&vh<){wVi_zw&U&NrLJphMQ9HQGqn-_ZiSw>P4fu z-N)^5+}8~IUud6ZuE}+LVZy`k_(uXfkF8Tc$d)|?l_3q1SxO}=N=5{8Oxv0P17M`) zQJ`+f)@)EWRWGBFnN#H0CRCdTJS+YF$EP^$ALk$Tm&C9PIbaTV4xaUd#eaVrNaQFl z*XR<95C{sU;?Cr-dVgox$`aNJMYq6^>6#bGcUC!tHS530VJJQfLMcH5)5xvjjs*Uw zf4zw16eS-v8ZK_3^bVf#%0-qh-$Hncd+C#goKWc8RA(V1&?aB`!OA`^mzB_CKZmG8 zea#M79W0^uJpXv|s@Nqnh5?7XipG#xlNacdBUv3^=aKiZFy`p|N} z6rtS8{~D4)OnAc5E_Ob5RF5otMj8y2Akb37a!aTBcXz3=IqLq~USCch6or?X9UU_0 zNxh*i|LUXJ=1k3B7}<%-bDC5>1?QcEcR|a0JtyASL3oV_*7@S)XMOqCk6aoAWl?-I zw<+rg0`aCGYm6Kd0{CRkSt_;C6#^SUy>lKqn3>aFJFvW8%a3yNhx#parRFg(M8D{( zmiE`~S_g$MO)WVQyX_&LG4&?>P6_O2+myp2elz=*tqdRxp4G)NaaTsG)Id_U|J;&8 z1hhcOI{1}@!l`UkZ&I0ju8p?D*C9*r%=zdwcth?5&RGm-?|vhvi*~0;;k_`hkYCugU`?v>I45;wav2-!EOw zN4BBB#)hzL7JRcFD^{^+awzLz!ZW0E(WvbFNiBm0&SpP};g@$TD2#xCIEK<26w?o1 z;}Xl%78#8YF#p;9)voq>co=;)EYMEXb=ap}FmwcIK9(6$JU%3}n$%`XGP}nu+%S!a zYQ}=vRM_R-hpgZJR$`hNSQSt2u7pIq20JkSqC|t48|U*Mwf@Z-g>S0M+whX2wjL{$ zEE$OyN0O^Nc=sMQiF1KIi%B?DIO=~VTIhrhsFDFsvJO3|_@n;}>E}A91-O2mRF=5O z|D+;lE-(DolKFU}?}Tpyvksp9$|YZjP6y+EFbF%dY8K2Vp+5i>8C1irh8oM9ClY?w zWS&OA{Zq!%e=PdCLR3Wjc-1$XimAy=P)m(|y3fuAGElz&VS#()7K4J}jg3K46*8q^ z>={e)7w6r;UR0>q9yUvz+YZ5{s~pDMuM^0<`v(}Jf<=tsBjJ0vDtI##bzWtnS29YL z4+y&HQv*fOpka_NgX3QDmK2S1>=JIPz-YF3rhzehs|wsYC-d%zogZ7fMuQi5nO#NCXnAD@qw zs;s%@kcDMF@VsCL&P;z@l|u^=Gta`zk8~3SB0|G$me@3yx@N}}D}$Ww4hk=O9`hvy zb`UJ#YLL$FvHk3;j4hYg3cC$&A_p9g->vC2x4Ns?iBO6op6dKBNfo0;2?V@>g>O?8 QfB$ezZdw>r>$yGoH(Hc?qW}N^ literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinSouthWest.png b/util/source_icon/middleBinSouthWest.png new file mode 100755 index 0000000000000000000000000000000000000000..ad9c16eb9f964679c283a2e92cdf2b470f8beaaf GIT binary patch literal 2873 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/middleBinWest.png b/util/source_icon/middleBinWest.png new file mode 100755 index 0000000000000000000000000000000000000000..6471ef08e3f484e3820ed7e65153a728b160cecf GIT binary patch literal 2739 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 b1ci>R>`KJHzU{s9yJ{`XZOp1nJmUTa(xs#% literal 0 HcmV?d00001 diff --git a/util/source_icon/northEastSouthWest.png b/util/source_icon/northEastSouthWest.png new file mode 100755 index 0000000000000000000000000000000000000000..4687ca51c07a8a8411e74948f10e114dc8f31370 GIT binary patch literal 2751 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/northSouth.png b/util/source_icon/northSouth.png new file mode 100755 index 0000000000000000000000000000000000000000..bf456de72c5f2370897fdec1ca231e9e33f38823 GIT binary patch literal 2391 zcmV-d38?moP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91Pyhe`05RZ9PXGW2!AV3xRCodHn@f)sRSB~@fA!=OfV+!lURTW8#ZJX1OjYiff1Mf1?Rz7U(?^E zrl-5_h-d|c<- z8Yi0ej<_fnS%r5fmik)gk=wU#e;d>ac<0WY+dxZMqmMD=SmyjMAkG5saKJcv^XAR( zGQ4Qxp4$YGF^mmm&Yp)j4c^NEfn)jRjT<+K40iWo6}F04%=S#VT6i%-Zj9#&^td7gnFjy&U7NKMnn1Nf-sBFc)Ky%L@w& z$D^%P_V3r#gJHqEbv&J`tE+!6E-ro+#g$Um!lM2KMr_u*N;h89P;Q@@r3d)_To#jdqK0A+HmKEQ|5@Iw>gj_n6J^-4aJAj1< zhy_-q3bWc@t>@!wxeg+6h1fYblj;*7F-)9=Al5Al7R&DAC{GhU1b|`Lh1pU@2Z0xH zipw3_l>i7B85F+V36xo&0yN=yyzOhULK33Zc4BeN$)T$Ftma1B+%nV-BtaLGcUgwV z6Pkrj6UG2ZU>P8N!o!a-Dfc3M0wj5Nqh%Js;t}Bi!ly70r-|?Y#ay9b=@S}O$z|I* zv3&r{uuMFIG;tQpv1QR&?QgPqEM)=acIO(usc!q+whw?LlM@%7NwQGe7)KqeMzK{K zS2tH**#YBvlfD4vgsTh4@a)4{&U2f}dAw!kYn$eF+RhOgWg7%WfZKq_)FFy?Nc~GZ} z?M(Urn3K!kEVFRpvT$rx`lgBVnOFVS2mdlbgqQ7uo{s-Z5?zX)cD5OuJ5Ff))6KFw zYFa*y6QGcs$4(TiZHyt0Z0*~Y?HXWCCPQS=b?^X~AZ1&rb@q)vb5&DwJR$h$ES zvr_?H6(CPS-jwo{-nXLscIbzfFJJy;9*7wpKJZog#5XT*63e%<_z-)03Wx7bB?IIl z=jqEG#0!u7za1Q{qoF54-w*xx(xpph9|dBD$6S1rzVL}}Vi1d%#3qO00T$N$qPTN~ zBzY2|)ni=Ug&)M2PcB@z@Y^g9Gd$)nHxwW2=)C*tjxYI;+m07MWxq}Uk)6O@IC)Do z%Ev>ww>}CzJq=Xoz#fv}19|-VR}EZYy7^(-Iebz^5Y-S{Ed%4 zRjDgcUM=hN`8PoSX&6m~Q14Ahv~OVnLUb_zsS169zydkXV~+5$bq@XbFh&$Nm8o|w zLjWXc7L{SpR)xqI+5iHeI)K8e+Q$Mfax9Jtb_i*MC_Djjv_0j1Ru8mJE@COBBYGEk07S*2T;lpQA&EYJ|a*=JkP zIn;klaHx1WPL6H4YV&x?!m8TbSDn*q-GqA$(&D@tzo{-TT}`Vyu6J8axc7h!0p`u4 z3bMg{f6enI-d{!!JU8X_*n#!E@X`NBU?eaS7zvC7Mgp@E_zwh7?Z-X3hY|n)002ov JPDHLkV1mEiWJv%3 literal 0 HcmV?d00001 diff --git a/util/source_icon/northWest.png b/util/source_icon/northWest.png new file mode 100755 index 0000000000000000000000000000000000000000..285e87bb2a97482a8cbb940962dba9a8b554a97a GIT binary patch literal 1956 zcmai#X*|>m7svm9TXtjVqOnYq#wBxIjdDpD8q9)`ESKzivXm(`GMPzXY(v><%y6?t zB_pORql+dHS(4mJ$ktV+QTF9N_6QeM0-0!VVPw*emXX?+$In2_Ibp^lD#p(vLIz?9Q~#EwOzJt6^scnJuI ziwN%YO2qy(gm;uv;cp%{&l7G;&AfEI3QU52lh}VEJ#i4Pk{3c zNUkW8PLHEzQi6QlroD22TaP6*>`Nw=YUER;K8KfS+xZ!_r;k%pG;i-4+FBTHT;pP? z?06ka3D_U#tyXYwOP*ocjtcH5?fbM@2^?ayXD}sXvvmsCIr&&)+?nNt56z$WnNU>} z3N_?{I!yUK(pxmJ0Y07S2)cC?Y zX={C{ZOT|otN((;T$k&)HNK;I6c2RS^jL19(P$nTRc&o;m0T`2;Okf`bKxk3LLnN^ z39T+X$Q3Ob<8$a^T>jfwnX|P=GIAMaR<)bozCCOvvdl>{L2H*zco`ivFwwbel=$<^ zxK#<~Lx=+#YVve8ul7qK-i%3I{C;&NPI>GJX_n`>{pWLOWwd!-Fkr0Fba{ai3+ox^EVG1j{ZvJZU>@zA*LMg6E!2xxcdd6xEuaBiT~YPUpA zM|$0@q+;b!uR_0=Yz`|#stebpk6;hH-9`TDr71F35{tKemx}H&omdtP^|q-=iyg62 z@ZuqASK3_K#Smc8QVM;{gsfR_hEy-?zW6jJN4dVJ>Fh+iM>VuMZ75zF&7`h2u1Dv; zAtbqMz8^mHQBI*>S551>7J?A{k+;Qt0fr|eY?AU+kv|bwTd}DODFvHN+pR_%Q*W$Q z*um|3us;5DTcx0`G`qZIu9L3%PG4XDAGNN5o&sZmvu2Nc-AiTivIF&jMdJ3RSti;t zcB<>u-(0tNM|gE>?swmn7WHb+*+P($LAP1ffpL_Cq3xNXYy5dLHq+alZGm=Q?j0By zNQT8~+!chrI5B6oTX21}1LJt)IUJ3MNG-Z%6xNyfySMn;$=ejwY@^FC-us_BZ|V~l zT&>tjyY?rH%e5WL@!YQsrI8`#uBmpNj|dtPFJTnYcisZ9!)~0CI@;_CK zkBsI?2v~xYtIRnAyplZktejB5dzs$3noJT-K4VO!P;!sc!x7b^2eoM3aSToWR?TJ~ zWUA#1#I1+V=ktEW-091)A04jousR9VN!hfRRV}n~@DO|5G8;v*o-&n`RT?9JA*uMf zyL398ShMt~l;ZotgnzZs3qsdhMk%V_IVa3J;1T!!2`NlowEowQ2=ku9a>jOk0e~E- zOh!G5%?!8^zm{Vmi07}UM{U;ypRgOd(CxlhhGgoGa!PM#UAp2_-w(H}0Q8K+P`{0s zw~lb0`4R8gnw7_`Xa(Ia2vbQ$she^Qf(O~yy?yxeDzlykbW<4F5z|2%72hN8eF#+c zZZ)?Lk7jzzG*t}QA%=gz_Ma~jv=C_S?OS>UbTm9$T2Jg>;QR|M5rjS}h2lGkN_IXZ N&ejR@z{daTe*lyMaXA10 literal 0 HcmV?d00001 diff --git a/util/source_icon/northWestSouthEast.png b/util/source_icon/northWestSouthEast.png new file mode 100755 index 0000000000000000000000000000000000000000..c55b7f0d6dcd5d938c05c26ffa888cfb37b3975a GIT binary patch literal 2684 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/resizeLeftRight.png b/util/source_icon/resizeLeftRight.png new file mode 100755 index 0000000000000000000000000000000000000000..00baa2e6152d1cb24ff00ffe2be0e0d193cf1bf9 GIT binary patch literal 2950 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 literal 0 HcmV?d00001 diff --git a/util/source_icon/screenshotCursor.png b/util/source_icon/screenshotCursor.png new file mode 100755 index 0000000000000000000000000000000000000000..cb23fd38408337f47d0bbfba58aab93fb13a8d86 GIT binary patch literal 2839 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 Nf84{l_E=ELzX8DZv>*Tg literal 0 HcmV?d00001 diff --git a/util/source_icon/textCursor.png b/util/source_icon/textCursor.png new file mode 100755 index 0000000000000000000000000000000000000000..738d2c07c2aaf78ec63347c1edc540bae791703b GIT binary patch literal 730 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 literal 0 HcmV?d00001 -- Gitee From 6be3721aefe19dce9854959d33d4d0907c2bc270 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 15 Aug 2022 07:22:55 +0000 Subject: [PATCH 08/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I557aba6348bd0445ed7768a063e9d476cc89be0b --- .../napi/pointer/include/js_pointer_context.h | 5 + .../napi/pointer/include/js_pointer_manager.h | 4 +- .../napi/pointer/src/js_pointer_context.cpp | 214 +++++++++++++++ .../napi/pointer/src/js_pointer_manager.cpp | 47 ++++ service/BUILD.gn | 245 +++++++++--------- .../src/multimodal_input_connect_proxy.cpp | 2 +- service/module_loader/src/mmi_service.cpp | 2 +- .../include/pointer_drawing_manager.h | 9 +- .../src/input_windows_manager.cpp | 6 + .../src/pointer_drawing_manager.cpp | 137 ++++++---- util/common/include/struct_multimodal.h | 17 ++ util/common/include/util.h | 1 + util/common/src/util.cpp | 29 +++ util/source_icon/Colorsucker_SW.png | Bin 0 -> 665 bytes util/source_icon/Copy_NW.png | Bin 0 -> 913 bytes util/source_icon/Cross.png | Bin 643 -> 0 bytes util/source_icon/Cross_Center.png | Bin 0 -> 366 bytes util/source_icon/Default.png | Bin 1247 -> 0 bytes util/source_icon/Default_NW.png | Bin 0 -> 522 bytes util/source_icon/East.png | Bin 1822 -> 0 bytes util/source_icon/East_Center.png | Bin 0 -> 310 bytes util/source_icon/Forbid_NW.png | Bin 0 -> 1138 bytes util/source_icon/HandGrabbing_Center.png | Bin 0 -> 762 bytes util/source_icon/HandOpen_Center.png | Bin 0 -> 1014 bytes util/source_icon/HandPointing_NW.png | Bin 0 -> 832 bytes util/source_icon/Help.png | Bin 4304 -> 0 bytes util/source_icon/Help_NW.png | Bin 0 -> 1034 bytes util/source_icon/MiddleBin_East_Center.png | Bin 0 -> 499 bytes util/source_icon/MiddleBin_NE_Center.png | Bin 0 -> 688 bytes util/source_icon/MiddleBin_NSWE_Center.png | Bin 0 -> 761 bytes util/source_icon/MiddleBin_NS_Center.png | Bin 0 -> 637 bytes util/source_icon/MiddleBin_NW_Center.png | Bin 0 -> 683 bytes util/source_icon/MiddleBin_North_Center.png | Bin 0 -> 577 bytes util/source_icon/MiddleBin_SE_Center.png | Bin 0 -> 648 bytes util/source_icon/MiddleBin_SW_Center.png | Bin 0 -> 622 bytes util/source_icon/MiddleBin_South_Center.png | Bin 0 -> 589 bytes util/source_icon/MiddleBin_West_Center.png | Bin 0 -> 512 bytes util/source_icon/Move.png | Bin 3299 -> 0 bytes util/source_icon/Move_Center.png | Bin 0 -> 698 bytes util/source_icon/NESW_Center.png | Bin 0 -> 520 bytes util/source_icon/NWSE_Center.png | Bin 0 -> 511 bytes util/source_icon/North.png | Bin 1705 -> 0 bytes util/source_icon/NorthEast_Center.png | Bin 0 -> 384 bytes util/source_icon/NorthSouth_Center.png | Bin 0 -> 396 bytes util/source_icon/NorthWest_Center.png | Bin 0 -> 400 bytes util/source_icon/North_Center.png | Bin 0 -> 390 bytes util/source_icon/ResizeLeftRight_Center.png | Bin 0 -> 567 bytes util/source_icon/ResizeUpDown_Center.png | Bin 0 -> 549 bytes util/source_icon/ScreenshotCross_Center.png | Bin 0 -> 631 bytes util/source_icon/ScreenshotCursor_Center.png | Bin 0 -> 857 bytes util/source_icon/South.png | Bin 1829 -> 0 bytes util/source_icon/SouthEast_Center.png | Bin 0 -> 416 bytes util/source_icon/SouthWest_Center.png | Bin 0 -> 413 bytes util/source_icon/South_Center.png | Bin 0 -> 356 bytes util/source_icon/TextCursor_Center.png | Bin 0 -> 480 bytes util/source_icon/West.png | Bin 1892 -> 0 bytes util/source_icon/WestEast_Center.png | Bin 0 -> 374 bytes util/source_icon/West_Center.png | Bin 0 -> 337 bytes util/source_icon/ZoomIn_Center.png | Bin 0 -> 798 bytes util/source_icon/ZoomOut_Center.png | Bin 0 -> 756 bytes util/source_icon/colorSucker.png | Bin 2840 -> 0 bytes util/source_icon/colorsucker.png | Bin 2840 -> 0 bytes util/source_icon/cursorCopy.png | Bin 4008 -> 0 bytes util/source_icon/cursorForbid.png | Bin 4463 -> 0 bytes util/source_icon/handGrabbing.png | Bin 2691 -> 0 bytes util/source_icon/handOpen.png | Bin 3497 -> 0 bytes util/source_icon/handPointing.png | Bin 3091 -> 0 bytes util/source_icon/middleBinEast.png | Bin 2779 -> 0 bytes util/source_icon/middleBinNorth.png | Bin 2628 -> 0 bytes util/source_icon/middleBinNorthEast.png | Bin 2927 -> 0 bytes util/source_icon/middleBinNorthSouth.png | Bin 3244 -> 0 bytes .../middleBinNorthSouthWestEast.png | Bin 4564 -> 0 bytes util/source_icon/middleBinNorthWest.png | Bin 2883 -> 0 bytes util/source_icon/middleBinSouth.png | Bin 2680 -> 0 bytes util/source_icon/middleBinSouthEast.png | Bin 2916 -> 0 bytes util/source_icon/middleBinSouthWest.png | Bin 2873 -> 0 bytes util/source_icon/middleBinWest.png | Bin 2739 -> 0 bytes util/source_icon/northEast.png | Bin 2029 -> 0 bytes util/source_icon/northEastSouthWest.png | Bin 2751 -> 0 bytes util/source_icon/northSouth.png | Bin 2391 -> 0 bytes util/source_icon/northWest.png | Bin 1956 -> 0 bytes util/source_icon/northWestSouthEast.png | Bin 2684 -> 0 bytes util/source_icon/resizeLeftRight.png | Bin 2950 -> 0 bytes util/source_icon/resizeUpDown.png | Bin 2668 -> 0 bytes util/source_icon/screenshotChoose.png | Bin 1251 -> 0 bytes util/source_icon/screenshotCursor.png | Bin 2839 -> 0 bytes util/source_icon/southEast.png | Bin 2034 -> 0 bytes util/source_icon/southWest.png | Bin 2019 -> 0 bytes util/source_icon/textCursor.png | Bin 730 -> 0 bytes util/source_icon/westEast.png | Bin 2435 -> 0 bytes util/source_icon/zoomIn.png | Bin 3743 -> 0 bytes util/source_icon/zoomOut.png | Bin 3613 -> 0 bytes 92 files changed, 537 insertions(+), 181 deletions(-) mode change 100644 => 100755 frameworks/napi/pointer/include/js_pointer_context.h mode change 100644 => 100755 frameworks/napi/pointer/include/js_pointer_manager.h mode change 100644 => 100755 frameworks/napi/pointer/src/js_pointer_context.cpp mode change 100644 => 100755 frameworks/napi/pointer/src/js_pointer_manager.cpp mode change 100644 => 100755 util/common/include/util.h mode change 100644 => 100755 util/common/src/util.cpp create mode 100755 util/source_icon/Colorsucker_SW.png create mode 100755 util/source_icon/Copy_NW.png delete mode 100755 util/source_icon/Cross.png create mode 100755 util/source_icon/Cross_Center.png delete mode 100755 util/source_icon/Default.png create mode 100755 util/source_icon/Default_NW.png delete mode 100755 util/source_icon/East.png create mode 100755 util/source_icon/East_Center.png create mode 100755 util/source_icon/Forbid_NW.png create mode 100755 util/source_icon/HandGrabbing_Center.png create mode 100755 util/source_icon/HandOpen_Center.png create mode 100755 util/source_icon/HandPointing_NW.png delete mode 100755 util/source_icon/Help.png create mode 100755 util/source_icon/Help_NW.png create mode 100755 util/source_icon/MiddleBin_East_Center.png create mode 100755 util/source_icon/MiddleBin_NE_Center.png create mode 100755 util/source_icon/MiddleBin_NSWE_Center.png create mode 100755 util/source_icon/MiddleBin_NS_Center.png create mode 100755 util/source_icon/MiddleBin_NW_Center.png create mode 100755 util/source_icon/MiddleBin_North_Center.png create mode 100755 util/source_icon/MiddleBin_SE_Center.png create mode 100755 util/source_icon/MiddleBin_SW_Center.png create mode 100755 util/source_icon/MiddleBin_South_Center.png create mode 100755 util/source_icon/MiddleBin_West_Center.png delete mode 100755 util/source_icon/Move.png create mode 100755 util/source_icon/Move_Center.png create mode 100755 util/source_icon/NESW_Center.png create mode 100755 util/source_icon/NWSE_Center.png delete mode 100755 util/source_icon/North.png create mode 100755 util/source_icon/NorthEast_Center.png create mode 100755 util/source_icon/NorthSouth_Center.png create mode 100755 util/source_icon/NorthWest_Center.png create mode 100755 util/source_icon/North_Center.png create mode 100755 util/source_icon/ResizeLeftRight_Center.png create mode 100755 util/source_icon/ResizeUpDown_Center.png create mode 100755 util/source_icon/ScreenshotCross_Center.png create mode 100755 util/source_icon/ScreenshotCursor_Center.png delete mode 100755 util/source_icon/South.png create mode 100755 util/source_icon/SouthEast_Center.png create mode 100755 util/source_icon/SouthWest_Center.png create mode 100755 util/source_icon/South_Center.png create mode 100755 util/source_icon/TextCursor_Center.png delete mode 100755 util/source_icon/West.png create mode 100755 util/source_icon/WestEast_Center.png create mode 100755 util/source_icon/West_Center.png create mode 100755 util/source_icon/ZoomIn_Center.png create mode 100755 util/source_icon/ZoomOut_Center.png delete mode 100755 util/source_icon/colorSucker.png delete mode 100755 util/source_icon/colorsucker.png delete mode 100755 util/source_icon/cursorCopy.png delete mode 100755 util/source_icon/cursorForbid.png delete mode 100755 util/source_icon/handGrabbing.png delete mode 100755 util/source_icon/handOpen.png delete mode 100755 util/source_icon/handPointing.png delete mode 100755 util/source_icon/middleBinEast.png delete mode 100755 util/source_icon/middleBinNorth.png delete mode 100755 util/source_icon/middleBinNorthEast.png delete mode 100755 util/source_icon/middleBinNorthSouth.png delete mode 100755 util/source_icon/middleBinNorthSouthWestEast.png delete mode 100755 util/source_icon/middleBinNorthWest.png delete mode 100755 util/source_icon/middleBinSouth.png delete mode 100755 util/source_icon/middleBinSouthEast.png delete mode 100755 util/source_icon/middleBinSouthWest.png delete mode 100755 util/source_icon/middleBinWest.png delete mode 100755 util/source_icon/northEast.png delete mode 100755 util/source_icon/northEastSouthWest.png delete mode 100755 util/source_icon/northSouth.png delete mode 100755 util/source_icon/northWest.png delete mode 100755 util/source_icon/northWestSouthEast.png delete mode 100755 util/source_icon/resizeLeftRight.png delete mode 100755 util/source_icon/resizeUpDown.png delete mode 100755 util/source_icon/screenshotChoose.png delete mode 100755 util/source_icon/screenshotCursor.png delete mode 100755 util/source_icon/southEast.png delete mode 100755 util/source_icon/southWest.png delete mode 100755 util/source_icon/textCursor.png delete mode 100755 util/source_icon/westEast.png delete mode 100755 util/source_icon/zoomIn.png delete mode 100755 util/source_icon/zoomOut.png diff --git a/frameworks/napi/pointer/include/js_pointer_context.h b/frameworks/napi/pointer/include/js_pointer_context.h old mode 100644 new mode 100755 index 3470f08314..225f6c4c35 --- a/frameworks/napi/pointer/include/js_pointer_context.h +++ b/frameworks/napi/pointer/include/js_pointer_context.h @@ -27,6 +27,9 @@ public: static napi_value Export(napi_env env, napi_value exports); static napi_value SetPointerVisible(napi_env env, napi_callback_info info); static napi_value IsPointerVisible(napi_env env, napi_callback_info info); + static napi_value SetPointerStyle(napi_env env, napi_callback_info info); + static napi_value GetPointerStyle(napi_env env, napi_callback_info info); + static napi_value CreateEumnPointerStyle(napi_env env, napi_value exports); std::shared_ptr GetJsPointerMgr() const; static napi_value SetPointerSpeed(napi_env env, napi_callback_info info); static napi_value GetPointerSpeed(napi_env env, napi_callback_info info); @@ -35,6 +38,8 @@ private: static napi_value CreateInstance(napi_env env); static JsPointerContext* GetInstance(napi_env env); static napi_value CreateJsObject(napi_env env, napi_callback_info info); + static napi_value EnumConstructor(napi_env env, napi_callback_info info); + static napi_value CreatePointerStyle(napi_env env, napi_value exports); std::shared_ptr mgr_ {nullptr}; napi_ref contextRef_ {nullptr}; }; diff --git a/frameworks/napi/pointer/include/js_pointer_manager.h b/frameworks/napi/pointer/include/js_pointer_manager.h old mode 100644 new mode 100755 index 925ec29342..98580715d6 --- a/frameworks/napi/pointer/include/js_pointer_manager.h +++ b/frameworks/napi/pointer/include/js_pointer_manager.h @@ -57,7 +57,7 @@ const std::string CALL_FUNCTION = "napi_call_function"; const std::string CREATE_BOOL = "napi_get_boolean"; const std::string CREATE_INT32 = "napi_create_int32"; const std::string CREATE_OBJECT = "napi_create_object"; -const std::string GET_INT32 = "napi_get_int32"; +const std::string GET_INT32 = "napi_get_value_int32"; } // namespace class JsCommon { @@ -87,6 +87,8 @@ public: napi_value IsPointerVisible(napi_env env, napi_value handle = nullptr); napi_value SetPointerSpeed(napi_env env, int32_t pointerSpeed, napi_value handle = nullptr); napi_value GetPointerSpeed(napi_env env, napi_value handle = nullptr); + napi_value SetPointerStyle(napi_env env, int windowid, int pointerStyle, napi_value handle = nullptr); + napi_value GetPointerStyle(napi_env env, int windowid, napi_value handle = nullptr); }; } // namespace MMI } // namespace OHOS diff --git a/frameworks/napi/pointer/src/js_pointer_context.cpp b/frameworks/napi/pointer/src/js_pointer_context.cpp old mode 100644 new mode 100755 index 783ae3035d..5268f23121 --- a/frameworks/napi/pointer/src/js_pointer_context.cpp +++ b/frameworks/napi/pointer/src/js_pointer_context.cpp @@ -221,6 +221,214 @@ napi_value JsPointerContext::GetPointerSpeed(napi_env env, napi_callback_info in return jsPointerMgr->GetPointerSpeed(env, argv[0]); } +napi_value JsPointerContext::SetPointerStyle(napi_env env, napi_callback_info info) +{ + CALL_DEBUG_ENTER; + size_t argc = 3; + napi_value argv[3]; + CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO); + if (argc < 2 || argc > 3) { + THROWERR(env, "The number of parameters is not as expected"); + return nullptr; + } + + if (!JsCommon::TypeOf(env, argv[0], napi_number)) { + THROWERR(env, "The first parameter type is wrong"); + return nullptr; + } + int32_t windowid = 0; + CHKRP(env, napi_get_value_int32(env, argv[0], &windowid), GET_INT32); + + if (!JsCommon::TypeOf(env, argv[1], napi_number)) { + THROWERR(env, "The second parameter type is wrong"); + return nullptr; + } + int32_t pointerStyle = 0; + CHKRP(env, napi_get_value_int32(env, argv[1], &pointerStyle), GET_INT32); + + JsPointerContext *jsPointer = JsPointerContext::GetInstance(env); + auto jsPointerMgr = jsPointer->GetJsPointerMgr(); + if (argc == 2) { + return jsPointerMgr->SetPointerStyle(env, windowid, pointerStyle); + } + if (!JsCommon::TypeOf(env, argv[2], napi_function)) { + THROWERR(env, "The third parameter type is wrong"); + return nullptr; + } + return jsPointerMgr->SetPointerStyle(env, windowid, pointerStyle, argv[2]); +} + +napi_value JsPointerContext::GetPointerStyle(napi_env env, napi_callback_info info) +{ + CALL_DEBUG_ENTER; + size_t argc = 2; + napi_value argv[2]; + CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO); + if (argc < 1 || argc > 2) { + THROWERR(env, "The number of parameters is not as expected"); + return nullptr; + } + + if (!JsCommon::TypeOf(env, argv[0], napi_number)) { + THROWERR(env, "The first parameter type is wrong"); + return nullptr; + } + int32_t windowid = 0; + CHKRP(env, napi_get_value_int32(env, argv[0], &windowid), GET_INT32); + + JsPointerContext *jsPointer = JsPointerContext::GetInstance(env); + auto jsPointerMgr = jsPointer->GetJsPointerMgr(); + if (argc == 1) { + return jsPointerMgr->GetPointerStyle(env, windowid); + } + if (!JsCommon::TypeOf(env, argv[1], napi_function)) { + THROWERR(env, "The second parameter type is wrong"); + return nullptr; + } + return jsPointerMgr->GetPointerStyle(env, windowid, argv[1]); +} + +napi_value JsPointerContext::CreatePointerStyle(napi_env env, napi_value exports) +{ + CALL_DEBUG_ENTER; + napi_value defaults = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::DEFAULT, &defaults), CREATE_INT32); + napi_value east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::EAST, &east), CREATE_INT32); + napi_value west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::WEST, &west), CREATE_INT32); + napi_value south = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::SOUTH, &south), CREATE_INT32); + napi_value north = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH, &north), CREATE_INT32); + napi_value west_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::WEST_EAST, &west_east), CREATE_INT32); + napi_value north_south = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_SOUTH, &north_south), CREATE_INT32); + napi_value north_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_EAST, &north_east), CREATE_INT32); + napi_value north_west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_WEST, &north_west), CREATE_INT32); + napi_value south_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::SOUTH_EAST, &south_east), CREATE_INT32); + napi_value south_west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::SOUTH_WEST, &south_west), CREATE_INT32); + napi_value north_east_south_west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_EAST_SOUTH_WEST, &north_east_south_west), CREATE_INT32); + napi_value north_west_south_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_WEST_SOUTH_EAST, &north_west_south_east), CREATE_INT32); + napi_value cross = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::CROSS, &cross), CREATE_INT32); + napi_value cursor_copy = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::CURSOR_COPY, &cursor_copy), CREATE_INT32); + napi_value cursor_forbid = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::CURSOR_FORBID, &cursor_forbid), CREATE_INT32); + napi_value color_sucker = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::COLOR_SUCKER, &color_sucker), CREATE_INT32); + napi_value hand_grabbing = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::HAND_GRABBING, &hand_grabbing), CREATE_INT32); + napi_value hand_open = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::HAND_OPEN, &hand_open), CREATE_INT32); + napi_value hand_pointing = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::HAND_POINTING, &hand_pointing), CREATE_INT32); + napi_value help = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::HELP, &help), CREATE_INT32); + napi_value cursor_move = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::CURSOR_MOVE, &cursor_move), CREATE_INT32); + napi_value resize_up_down = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::RESIZE_LEFT_RIGHT, &resize_up_down), CREATE_INT32); + napi_value resize_left_right = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::RESIZE_UP_DOWN, &resize_left_right), CREATE_INT32); + napi_value screenshot_choose = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::SCREENSHOT_CHOOSE, &screenshot_choose), CREATE_INT32); + napi_value screenshot_cursor = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::SCREENSHOT_CURSOR, &screenshot_cursor), CREATE_INT32); + napi_value text_cursor = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::TEXT_CURSOR, &text_cursor), CREATE_INT32); + napi_value zoom_in = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::ZOOM_IN, &zoom_in), CREATE_INT32); + napi_value zoom_out = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::ZOOM_OUT, &zoom_out), CREATE_INT32); + napi_value middle_btn_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_EAST, &middle_btn_east), CREATE_INT32); + napi_value middle_btn_west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_WEST, &middle_btn_west), CREATE_INT32); + napi_value middle_btn_south = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH, &middle_btn_south), CREATE_INT32); + napi_value middle_btn_north = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH, &middle_btn_north), CREATE_INT32); + napi_value middle_btn_north_south = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH, &middle_btn_north_south), CREATE_INT32); + napi_value middle_btn_north_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_EAST, &middle_btn_north_east), CREATE_INT32); + napi_value middle_btn_north_west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_WEST, &middle_btn_north_west), CREATE_INT32); + napi_value middle_btn_south_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST, &middle_btn_south_east), CREATE_INT32); + napi_value middle_btn_south_west = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST, &middle_btn_south_west), CREATE_INT32); + napi_value middle_btn_north_south_west_east = nullptr; + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST, &middle_btn_north_south_west_east), CREATE_INT32); + + napi_property_descriptor desc[] = { + DECLARE_NAPI_STATIC_PROPERTY("DEFAULT", defaults), + DECLARE_NAPI_STATIC_PROPERTY("EAST", east), + DECLARE_NAPI_STATIC_PROPERTY("WEST", west), + DECLARE_NAPI_STATIC_PROPERTY("SOUTH", south), + DECLARE_NAPI_STATIC_PROPERTY("NORTH", north), + DECLARE_NAPI_STATIC_PROPERTY("WEST_EAST", west_east), + DECLARE_NAPI_STATIC_PROPERTY("NORTH_SOUTH", north_south), + DECLARE_NAPI_STATIC_PROPERTY("NORTH_EAST", north_east), + DECLARE_NAPI_STATIC_PROPERTY("NORTH_WEST", north_west), + DECLARE_NAPI_STATIC_PROPERTY("SOUTH_EAST", south_east), + DECLARE_NAPI_STATIC_PROPERTY("SOUTH_WEST", south_west), + DECLARE_NAPI_STATIC_PROPERTY("NORTH_EAST_SOUTH_WEST", north_east_south_west), + DECLARE_NAPI_STATIC_PROPERTY("NORTH_WEST_SOUTH_EAST", north_west_south_east), + DECLARE_NAPI_STATIC_PROPERTY("CROSS", cross), + DECLARE_NAPI_STATIC_PROPERTY("CURSOR_COPY", cursor_copy), + DECLARE_NAPI_STATIC_PROPERTY("CURSOR_FORBID", cursor_forbid), + DECLARE_NAPI_STATIC_PROPERTY("COLOR_SUCKER", color_sucker), + DECLARE_NAPI_STATIC_PROPERTY("HAND_GRABBING", hand_grabbing), + DECLARE_NAPI_STATIC_PROPERTY("HAND_OPEN", hand_open), + DECLARE_NAPI_STATIC_PROPERTY("HAND_POINTING", hand_pointing), + DECLARE_NAPI_STATIC_PROPERTY("HELP", help), + DECLARE_NAPI_STATIC_PROPERTY("CURSOR_MOVE", cursor_move), + DECLARE_NAPI_STATIC_PROPERTY("RESIZE_LEFT_RIGHT", resize_left_right), + DECLARE_NAPI_STATIC_PROPERTY("RESIZE_UP_DOWN", resize_up_down), + DECLARE_NAPI_STATIC_PROPERTY("SCREENSHOT_CHOOSE", screenshot_choose), + DECLARE_NAPI_STATIC_PROPERTY("SCREENSHOT_CURSOR", screenshot_cursor), + DECLARE_NAPI_STATIC_PROPERTY("TEXT_CURSOR", text_cursor), + DECLARE_NAPI_STATIC_PROPERTY("ZOOM_IN", zoom_in), + DECLARE_NAPI_STATIC_PROPERTY("ZOOM_OUT", zoom_out), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_EAST", middle_btn_east), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_WEST", middle_btn_west), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH", middle_btn_south), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH", middle_btn_north), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_SOUTH", middle_btn_north_south), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_EAST", middle_btn_north_east), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_WEST", middle_btn_north_west), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH_EAST", middle_btn_south_east), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH_WEST", middle_btn_south_west), + DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_SOUTH_WEST_EAST", middle_btn_north_south_west_east), + }; + napi_value result = nullptr; + CHKRP(env, napi_define_class(env, "MOUSE_ICON", NAPI_AUTO_LENGTH, EnumConstructor, nullptr, + sizeof(desc) / sizeof(*desc), desc, &result), DEFINE_CLASS); + CHKRP(env, napi_set_named_property(env, exports, "MOUSE_ICON", result), SET_NAMED_PROPERTY); + return exports; +} + +napi_value JsPointerContext::EnumConstructor(napi_env env, napi_callback_info info) +{ + CALL_DEBUG_ENTER; + size_t argc = 0; + napi_value args[1] = {0}; + napi_value ret = nullptr; + void *data = nullptr; + CHKRP(env, napi_get_cb_info(env, info, &argc, args, &ret, &data), GET_CB_INFO); + return ret; +} + napi_value JsPointerContext::Export(napi_env env, napi_value exports) { CALL_DEBUG_ENTER; @@ -234,8 +442,14 @@ napi_value JsPointerContext::Export(napi_env env, napi_value exports) DECLARE_NAPI_STATIC_FUNCTION("isPointerVisible", IsPointerVisible), DECLARE_NAPI_STATIC_FUNCTION("setPointerSpeed", SetPointerSpeed), DECLARE_NAPI_STATIC_FUNCTION("getPointerSpeed", GetPointerSpeed), + DECLARE_NAPI_STATIC_FUNCTION("setPointerStyle", SetPointerStyle), + DECLARE_NAPI_STATIC_FUNCTION("getPointerStyle", GetPointerStyle), }; CHKRP(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc), DEFINE_PROPERTIES); + if(CreatePointerStyle(env, exports) == nullptr) { + THROWERR(env, "Failed to create pointer style"); + return nullptr; + } return exports; } } // namespace MMI diff --git a/frameworks/napi/pointer/src/js_pointer_manager.cpp b/frameworks/napi/pointer/src/js_pointer_manager.cpp old mode 100644 new mode 100755 index 5516b6ae1c..aa261eec47 --- a/frameworks/napi/pointer/src/js_pointer_manager.cpp +++ b/frameworks/napi/pointer/src/js_pointer_manager.cpp @@ -210,5 +210,52 @@ napi_value JsPointerManager::GetPointerSpeed(napi_env env, napi_value handle) AsyncCallbackWork(asyncContext); return promise; } + +napi_value JsPointerManager::SetPointerStyle(napi_env env, int windowid, int pointerStyle, napi_value handle) +{ + CALL_DEBUG_ENTER; + sptr asyncContext = new (std::nothrow) AsyncContext(env); + if (asyncContext == nullptr) { + THROWERR(env, "create AsyncContext failed"); + return nullptr; + } + MMI_HILOGE("SetPointerStyle windowid:%{public}d, pointerStyle:%{public}d", windowid, pointerStyle); + asyncContext->errorCode = InputManager::GetInstance()->SetPointerStyle(windowid, pointerStyle); + asyncContext->reserve << ReturnType::VOID; + + napi_value promise = nullptr; + if (handle != nullptr) { + CHKRP(env, napi_create_reference(env, handle, 1, &asyncContext->callback), CREATE_REFERENCE); + CHKRP(env, napi_get_undefined(env, &promise), GET_UNDEFINED); + } else { + CHKRP(env, napi_create_promise(env, &asyncContext->deferred, &promise), CREATE_PROMISE); + } + AsyncCallbackWork(asyncContext); + return promise; +} + +napi_value JsPointerManager::GetPointerStyle(napi_env env, int windowid, napi_value handle) +{ + CALL_DEBUG_ENTER; + sptr asyncContext = new (std::nothrow) AsyncContext(env); + if (asyncContext == nullptr) { + THROWERR(env, "create AsyncContext failed"); + return nullptr; + } + MMI_HILOGE("GetPointerStyle windowid:%{public}d", windowid); + int pointerStyle = 0; + asyncContext->errorCode = InputManager::GetInstance()->GetPointerStyle(windowid, pointerStyle); + asyncContext->reserve << ReturnType::NUMBER << pointerStyle; + napi_value promise = nullptr; + if (handle != nullptr) { + CHKRP(env, napi_create_reference(env, handle, 1, &asyncContext->callback), CREATE_REFERENCE); + CHKRP(env, napi_get_undefined(env, &promise), GET_UNDEFINED); + } else { + CHKRP(env, napi_create_promise(env, &asyncContext->deferred, &promise), CREATE_PROMISE); + } + AsyncCallbackWork(asyncContext); + return promise; +} + } // namespace MMI } // namespace OHOS \ No newline at end of file diff --git a/service/BUILD.gn b/service/BUILD.gn index 151dab6106..e17e6926de 100755 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -120,285 +120,274 @@ ohos_prebuilt_etc("multimodalinput_config_ability.json") { relative_install_dir = "multimodalinput" } -ohos_prebuilt_etc("drawing_pointer_image_Default") { - source = "//foundation/multimodalinput/input/util/source_icon/Default.png" +ohos_prebuilt_etc("drawing_pointer_image_Default_NW") { + source = "//foundation/multimodalinput/input/util/source_icon/Default_NW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_East") { - source = "//foundation/multimodalinput/input/util/source_icon/East.png" +ohos_prebuilt_etc("drawing_pointer_image_East_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/East_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_West") { - source = "//foundation/multimodalinput/input/util/source_icon/West.png" +ohos_prebuilt_etc("drawing_pointer_image_West_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/West_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_South") { - source = "//foundation/multimodalinput/input/util/source_icon/South.png" +ohos_prebuilt_etc("drawing_pointer_image_South_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/South_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_North") { - source = "//foundation/multimodalinput/input/util/source_icon/North.png" +ohos_prebuilt_etc("drawing_pointer_image_North_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/North_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_westEast") { - source = "//foundation/multimodalinput/input/util/source_icon/westEast.png" +ohos_prebuilt_etc("drawing_pointer_image_WestEast_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/WestEast_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_northSouth") { - source = "//foundation/multimodalinput/input/util/source_icon/northSouth.png" +ohos_prebuilt_etc("drawing_pointer_image_NorthSouth_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/NorthSouth_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_northEast") { - source = "//foundation/multimodalinput/input/util/source_icon/northEast.png" +ohos_prebuilt_etc("drawing_pointer_image_NorthEast_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/NorthEast_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_northWest") { - source = "//foundation/multimodalinput/input/util/source_icon/northWest.png" +ohos_prebuilt_etc("drawing_pointer_image_NorthWest_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/NorthWest_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_southEast") { - source = "//foundation/multimodalinput/input/util/source_icon/southEast.png" +ohos_prebuilt_etc("drawing_pointer_image_SouthEast_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/SouthEast_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_southWest") { - source = "//foundation/multimodalinput/input/util/source_icon/southWest.png" +ohos_prebuilt_etc("drawing_pointer_image_SouthWest_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/SouthWest_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_northEastSouthWest") { - source = "//foundation/multimodalinput/input/util/source_icon/northEastSouthWest.png" +ohos_prebuilt_etc("drawing_pointer_image_NESW_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/NESW_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_northWestSouthEast") { - source = "//foundation/multimodalinput/input/util/source_icon/northWestSouthEast.png" +ohos_prebuilt_etc("drawing_pointer_image_NWSE_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/NWSE_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_Cross") { - source = "//foundation/multimodalinput/input/util/source_icon/Cross.png" +ohos_prebuilt_etc("drawing_pointer_image_Cross_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/Cross_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_cursorCopy") { - source = "//foundation/multimodalinput/input/util/source_icon/cursorCopy.png" +ohos_prebuilt_etc("drawing_pointer_image_Copy_NW") { + source = "//foundation/multimodalinput/input/util/source_icon/Copy_NW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_cursorForbid") { - source = - "//foundation/multimodalinput/input/util/source_icon/cursorForbid.png" +ohos_prebuilt_etc("drawing_pointer_image_Forbid_NW") { + source = "//foundation/multimodalinput/input/util/source_icon/Forbid_NW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_colorSucker") { - source = "//foundation/multimodalinput/input/util/source_icon/colorSucker.png" +ohos_prebuilt_etc("drawing_pointer_image_Colorsucker_SW") { + source = "//foundation/multimodalinput/input/util/source_icon/Colorsucker_SW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_handGrabbing") { - source = - "//foundation/multimodalinput/input/util/source_icon/handGrabbing.png" +ohos_prebuilt_etc("drawing_pointer_image_HandGrabbing_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/HandGrabbing_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_handOpen") { - source = "//foundation/multimodalinput/input/util/source_icon/handOpen.png" +ohos_prebuilt_etc("drawing_pointer_image_HandOpen_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/HandOpen_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_handPointing") { - source = - "//foundation/multimodalinput/input/util/source_icon/handPointing.png" +ohos_prebuilt_etc("drawing_pointer_image_HandPointing_NW") { + source = "//foundation/multimodalinput/input/util/source_icon/HandPointing_NW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_Help") { - source = "//foundation/multimodalinput/input/util/source_icon/Help.png" +ohos_prebuilt_etc("drawing_pointer_image_Help_NW") { + source = "//foundation/multimodalinput/input/util/source_icon/Help_NW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_Move") { - source = "//foundation/multimodalinput/input/util/source_icon/Move.png" +ohos_prebuilt_etc("drawing_pointer_image_Move_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/Move_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_resizeLeftRight") { - source = - "//foundation/multimodalinput/input/util/source_icon/resizeLeftRight.png" +ohos_prebuilt_etc("drawing_pointer_image_ResizeLeftRight_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/ResizeLeftRight_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_resizeUpDown") { - source = - "//foundation/multimodalinput/input/util/source_icon/resizeUpDown.png" +ohos_prebuilt_etc("drawing_pointer_image_ResizeUpDown_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/ResizeUpDown_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_screenshotChoose") { - source = - "//foundation/multimodalinput/input/util/source_icon/screenshotChoose.png" +ohos_prebuilt_etc("drawing_pointer_image_ScreenshotCross_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/ScreenshotCross_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_screenshotCursor") { - source = - "//foundation/multimodalinput/input/util/source_icon/screenshotCursor.png" +ohos_prebuilt_etc("drawing_pointer_image_ScreenshotCursor_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/ScreenshotCursor_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_textCursor") { - source = "//foundation/multimodalinput/input/util/source_icon/textCursor.png" +ohos_prebuilt_etc("drawing_pointer_image_TextCursor_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/TextCursor_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_zoomIn") { - source = "//foundation/multimodalinput/input/util/source_icon/zoomIn.png" +ohos_prebuilt_etc("drawing_pointer_image_ZoomIn_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/ZoomIn_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_zoomOut") { - source = "//foundation/multimodalinput/input/util/source_icon/zoomOut.png" +ohos_prebuilt_etc("drawing_pointer_image_ZoomOut_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/ZoomOut_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinEast") { - source = - "//foundation/multimodalinput/input/util/source_icon/middleBinEast.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_East_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_East_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinWest") { - source = - "//foundation/multimodalinput/input/util/source_icon/middleBinWest.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_West_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_West_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinSouth") { - source = - "//foundation/multimodalinput/input/util/source_icon/middleBinSouth.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_South_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_South_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinNorth") { - source = - "//foundation/multimodalinput/input/util/source_icon/middleBinNorth.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_North_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_North_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthSouth") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthSouth.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_NS_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_NS_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthEast") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthEast.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_NE_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_NE_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthWest") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthWest.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_NW_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_NW_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinSouthEast") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinSouthEast.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_SE_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_SE_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinSouthWest") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinSouthWest.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_SW_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_SW_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } -ohos_prebuilt_etc("drawing_pointer_image_middleBinNorthSouthWestEast") { - source = "//foundation/multimodalinput/input/util/source_icon/middleBinNorthSouthWestEast.png" +ohos_prebuilt_etc("drawing_pointer_image_MiddleBin_NSWE_Center") { + source = "//foundation/multimodalinput/input/util/source_icon/MiddleBin_NSWE_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -476,45 +465,45 @@ ohos_shared_library("libmmi-server") { configs = [ ":libmmi_server_config" ] deps = [ - ":drawing_pointer_image_Cross", - ":drawing_pointer_image_Default", - ":drawing_pointer_image_East", - ":drawing_pointer_image_Help", - ":drawing_pointer_image_Move", - ":drawing_pointer_image_North", - ":drawing_pointer_image_South", - ":drawing_pointer_image_West", - ":drawing_pointer_image_colorSucker", - ":drawing_pointer_image_cursorCopy", - ":drawing_pointer_image_cursorForbid", - ":drawing_pointer_image_handGrabbing", - ":drawing_pointer_image_handOpen", - ":drawing_pointer_image_handPointing", - ":drawing_pointer_image_middleBinEast", - ":drawing_pointer_image_middleBinNorth", - ":drawing_pointer_image_middleBinNorthEast", - ":drawing_pointer_image_middleBinNorthSouth", - ":drawing_pointer_image_middleBinNorthSouthWestEast", - ":drawing_pointer_image_middleBinNorthWest", - ":drawing_pointer_image_middleBinSouth", - ":drawing_pointer_image_middleBinSouthEast", - ":drawing_pointer_image_middleBinSouthWest", - ":drawing_pointer_image_middleBinWest", - ":drawing_pointer_image_northEast", - ":drawing_pointer_image_northEastSouthWest", - ":drawing_pointer_image_northSouth", - ":drawing_pointer_image_northWest", - ":drawing_pointer_image_northWestSouthEast", - ":drawing_pointer_image_resizeLeftRight", - ":drawing_pointer_image_resizeUpDown", - ":drawing_pointer_image_screenshotChoose", - ":drawing_pointer_image_screenshotCursor", - ":drawing_pointer_image_southEast", - ":drawing_pointer_image_southWest", - ":drawing_pointer_image_textCursor", - ":drawing_pointer_image_westEast", - ":drawing_pointer_image_zoomIn", - ":drawing_pointer_image_zoomOut", + ":drawing_pointer_image_HandPointing_NW", + ":drawing_pointer_image_MiddleBin_North_Center", + ":drawing_pointer_image_North_Center", + ":drawing_pointer_image_MiddleBin_South_Center", + ":drawing_pointer_image_South_Center", + ":drawing_pointer_image_MiddleBin_West_Center", + ":drawing_pointer_image_West_Center", + ":drawing_pointer_image_MiddleBin_East_Center", + ":drawing_pointer_image_East_Center", + ":drawing_pointer_image_Default_NW", + ":drawing_pointer_image_Copy_NW", + ":drawing_pointer_image_Forbid_NW", + ":drawing_pointer_image_Help_NW", + ":drawing_pointer_image_MiddleBin_NW_Center", + ":drawing_pointer_image_NorthWest_Center", + ":drawing_pointer_image_ZoomIn_Center", + ":drawing_pointer_image_ZoomOut_Center", + ":drawing_pointer_image_MiddleBin_NE_Center", + ":drawing_pointer_image_NorthEast_Center", + ":drawing_pointer_image_MiddleBin_SW_Center", + ":drawing_pointer_image_SouthWest_Center", + ":drawing_pointer_image_Colorsucker_SW", + ":drawing_pointer_image_MiddleBin_SE_Center", + ":drawing_pointer_image_SouthEast_Center", + ":drawing_pointer_image_Cross_Center", + ":drawing_pointer_image_HandGrabbing_Center", + ":drawing_pointer_image_HandOpen_Center", + ":drawing_pointer_image_MiddleBin_NS_Center", + ":drawing_pointer_image_MiddleBin_NSWE_Center", + ":drawing_pointer_image_Move_Center", + ":drawing_pointer_image_NESW_Center", + ":drawing_pointer_image_NorthSouth_Center", + ":drawing_pointer_image_NWSE_Center", + ":drawing_pointer_image_ResizeLeftRight_Center", + ":drawing_pointer_image_ResizeUpDown_Center", + ":drawing_pointer_image_ScreenshotCross_Center", + ":drawing_pointer_image_ScreenshotCursor_Center", + ":drawing_pointer_image_TextCursor_Center", + ":drawing_pointer_image_WestEast_Center", ":mmi_device_config.ini", ":multimodalinput_config_ability.json", "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", diff --git a/service/connect_manager/src/multimodal_input_connect_proxy.cpp b/service/connect_manager/src/multimodal_input_connect_proxy.cpp index 822e04f542..6570d8c113 100755 --- a/service/connect_manager/src/multimodal_input_connect_proxy.cpp +++ b/service/connect_manager/src/multimodal_input_connect_proxy.cpp @@ -190,7 +190,7 @@ int32_t MultimodalInputConnectProxy::SetPointerStyle(int32_t windowId, int32_t p MessageParcel data; if (!data.WriteInterfaceToken(MultimodalInputConnectProxy::GetDescriptor())) { MMI_HILOGE("Failed to write descriptor"); - return ERR_INVALID_VALUE; + return RET_ERR; } WRITEINT32(data, windowId, RET_ERR); diff --git a/service/module_loader/src/mmi_service.cpp b/service/module_loader/src/mmi_service.cpp index ae87115530..5e43f55152 100755 --- a/service/module_loader/src/mmi_service.cpp +++ b/service/module_loader/src/mmi_service.cpp @@ -459,7 +459,7 @@ int32_t MMIService::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) int32_t ret = delegateTasks_.PostSyncTask(std::bind(&IPointerDrawingManager::GetPointerStyle, IPointerDrawingManager::GetInstance(), GetCallingPid(), windowId, std::ref(pointerStyle))); if (ret != RET_OK) { - MMI_HILOGE("Get pointer style failed,return %{public}d", pointerStyle); + MMI_HILOGE("Get pointer style failed,return %{public}d", ret); return RET_ERR; } return RET_OK; diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index dcb13cecd3..7353980a1e 100755 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -50,10 +50,11 @@ public: int32_t GetPointerStyle(int32_t pid, int32_t windowId, int32_t &pointerStyle); bool IsPointerVisible(); int32_t InitLayer(const MOUSE_ICON mouseStyle); + void AdjustMouseFocus(ICON_TYPE iconType, int32_t &physicalX, int32_t &physicalY); public: - static const int32_t IMAGE_WIDTH = 64; - static const int32_t IMAGE_HEIGHT = 64; + static const int32_t IMAGE_WIDTH = 48; + static const int32_t IMAGE_HEIGHT = 48; private: void CreatePointerWindow(int32_t displayId, int32_t physicalX, int32_t physicalY); @@ -67,6 +68,7 @@ private: void DeletePidInfo(int32_t pid); void UpdatePointerVisible(); void UpdatePidInfo(int32_t pid, bool visible); + void InitStyle(); private: sptr pointerWindow_ = nullptr; @@ -81,8 +83,7 @@ private: int32_t lastPhysicalY_ = -1; Direction direction_ = Direction0; int32_t preMouseStyle_ = 0; - std::map mouseIcons_; - + std::map mouseIcons_; struct PidInfo { int32_t pid { 0 }; bool visible { false }; diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index da419ab503..955c20480f 100755 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -31,6 +31,7 @@ namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "InputWindowsManager"}; constexpr int32_t DEFAULT_POINTER_STYLE = 0; +constexpr int32_t MAX_WINDOW_COUNT = 20; } // namespace InputWindowsManager::InputWindowsManager() {} @@ -563,6 +564,10 @@ void InputWindowsManager::UpdatePointerStyle() auto subit = it->second.find(windowItem.id); if (subit == it->second.end()) { + if (it->second.size() == MAX_WINDOW_COUNT) { + MMI_HILOGD("The window count:%{public}zu exceeds limit in same pd", it->second.size()); + it->second.erase(it->second.begin()); + } auto iter = it->second.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); if (!iter.second) { MMI_HILOGE("The window type is duplicated"); @@ -760,6 +765,7 @@ int32_t InputWindowsManager::UpdateMouseTarget(std::shared_ptr poi int32_t ret = GetPointerStyle(touchWindow->pid, touchWindow->id, mouseStyle); if (ret != RET_OK) { MMI_HILOGE("Get pointer style failed, mouse style return default style"); + return RET_ERR; } IPointerDrawingManager::GetInstance()->DrawPointer(displayId, pointerItem.GetDisplayX(), pointerItem.GetDisplayY(), MOUSE_ICON(mouseStyle)); diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 7b19d6ad0f..e24f7a7151 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -26,6 +26,7 @@ #include "define_multimodal.h" #include "input_device_manager.h" #include "mmi_log.h" +#include "util.h" namespace OHOS { namespace MMI { @@ -40,46 +41,7 @@ namespace OHOS { namespace MMI { PointerDrawingManager::PointerDrawingManager() { - mouseIcons_[MOUSE_ICON::DEFAULT] = IMAGE_POINTER_DEFAULT_PATH + "Default.png"; - mouseIcons_[MOUSE_ICON::EAST] = IMAGE_POINTER_DEFAULT_PATH + "East.png"; - mouseIcons_[MOUSE_ICON::WEST] = IMAGE_POINTER_DEFAULT_PATH + "West.png"; - mouseIcons_[MOUSE_ICON::SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "South.png"; - mouseIcons_[MOUSE_ICON::NORTH] = IMAGE_POINTER_DEFAULT_PATH + "North.png"; - mouseIcons_[MOUSE_ICON::WEST_EAST] = IMAGE_POINTER_DEFAULT_PATH + "westEast.png"; - mouseIcons_[MOUSE_ICON::NORTH_SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "northSouth.png"; - mouseIcons_[MOUSE_ICON::NORTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "northEast.png"; - mouseIcons_[MOUSE_ICON::NORTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "northWest.png"; - mouseIcons_[MOUSE_ICON::SOUTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "southEast.png"; - mouseIcons_[MOUSE_ICON::SOUTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "southWest.png"; - mouseIcons_[MOUSE_ICON::NORTH_EAST_SOUTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "northEastSouthWest.png"; - mouseIcons_[MOUSE_ICON::NORTH_WEST_SOUTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "northWestSouthEast.png"; - mouseIcons_[MOUSE_ICON::CROSS] = IMAGE_POINTER_DEFAULT_PATH + "Cross.png"; - mouseIcons_[MOUSE_ICON::CURSOR_COPY] = IMAGE_POINTER_DEFAULT_PATH + "cursorCopy.png"; - mouseIcons_[MOUSE_ICON::CURSOR_FORBID] = IMAGE_POINTER_DEFAULT_PATH + "cursorForbid.png"; - mouseIcons_[MOUSE_ICON::COLOR_SUCKER] = IMAGE_POINTER_DEFAULT_PATH + "colorSucker.png"; - mouseIcons_[MOUSE_ICON::HAND_GRABBING] = IMAGE_POINTER_DEFAULT_PATH + "handGrabbing.png"; - mouseIcons_[MOUSE_ICON::HAND_OPEN] = IMAGE_POINTER_DEFAULT_PATH + "handOpen.png"; - mouseIcons_[MOUSE_ICON::HAND_POINTING] = IMAGE_POINTER_DEFAULT_PATH + "handPointing.png"; - mouseIcons_[MOUSE_ICON::HELP] = IMAGE_POINTER_DEFAULT_PATH + "Help.png"; - mouseIcons_[MOUSE_ICON::CURSOR_MOVE] = IMAGE_POINTER_DEFAULT_PATH + "Move.png"; - mouseIcons_[MOUSE_ICON::RESIZE_LEFT_RIGHT] = IMAGE_POINTER_DEFAULT_PATH + "resizeLeftRight.png"; - mouseIcons_[MOUSE_ICON::RESIZE_UP_DOWN] = IMAGE_POINTER_DEFAULT_PATH + "resizeUpDown.png"; - mouseIcons_[MOUSE_ICON::SCREENSHOT_CHOOSE] = IMAGE_POINTER_DEFAULT_PATH + "screenshotChoose.png"; - mouseIcons_[MOUSE_ICON::SCREENSHOT_CURSOR] = IMAGE_POINTER_DEFAULT_PATH + "screenshotCursor.png"; - mouseIcons_[MOUSE_ICON::TEXT_CURSOR] = IMAGE_POINTER_DEFAULT_PATH + "textCursor.png"; - mouseIcons_[MOUSE_ICON::ZOOM_IN] = IMAGE_POINTER_DEFAULT_PATH + "zoomIn.png"; - mouseIcons_[MOUSE_ICON::ZOOM_OUT] = IMAGE_POINTER_DEFAULT_PATH + "zoomOut.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_EAST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinEast.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_WEST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "middleBinSouth.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorth.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorthSouth.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorthEast.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinNorthWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinSouthEast.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST] = IMAGE_POINTER_DEFAULT_PATH + "middleBinSouthWest.png"; - mouseIcons_[MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST] = IMAGE_POINTER_DEFAULT_PATH + - "middleBinNorthSouthWestEast.png"; + InitStyle(); } PointerDrawingManager::~PointerDrawingManager() {} @@ -93,6 +55,8 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in FixCursorPosition(physicalX, physicalY); lastPhysicalX_ = physicalX; lastPhysicalY_ = physicalY; + + AdjustMouseFocus(ICON_TYPE(mouseIcons_[mouseStyle].alignmentWay), physicalX, physicalY); if (pointerWindow_ != nullptr) { pointerWindow_->MoveTo(physicalX, physicalY); @@ -115,6 +79,7 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in } CreatePointerWindow(displayId, physicalX, physicalY); + CHKPV(pointerWindow_); int32_t ret = InitLayer(mouseStyle); if (ret != RET_OK) { MMI_HILOGE("Init layer failed"); @@ -129,20 +94,23 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in int32_t PointerDrawingManager::InitLayer(const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; - CHKPR(pointerWindow_, RET_ERR); sptr layer = GetLayer(); if (layer == nullptr) { + if (pointerWindow_ != nullptr) { + pointerWindow_->Destroy(); + pointerWindow_ = nullptr; + } MMI_HILOGE("Init layer is failed, get layer is nullptr"); - pointerWindow_->Destroy(); - pointerWindow_ = nullptr; return RET_ERR; } sptr buffer = GetSurfaceBuffer(layer); if (buffer == nullptr || buffer->GetVirAddr() == nullptr) { + if (pointerWindow_ != nullptr) { + pointerWindow_->Destroy(); + pointerWindow_ = nullptr; + } MMI_HILOGE("Init layer is failed, buffer or virAddr is nullptr"); - pointerWindow_->Destroy(); - pointerWindow_ = nullptr; return RET_ERR; } @@ -160,6 +128,30 @@ int32_t PointerDrawingManager::InitLayer(const MOUSE_ICON mouseStyle) return RET_OK; } +void PointerDrawingManager::AdjustMouseFocus(ICON_TYPE iconType, int32_t &physicalX, int32_t &physicalY) +{ + CALL_DEBUG_ENTER; + int32_t realImageWidth = 40; + int32_t realImageHeight = 40; + + switch (iconType) { + case ANGLE_SW: { + physicalY -= realImageHeight; + break; + } + case ANGLE_CENTER: { + physicalX -= realImageWidth / 2; + physicalY -= realImageHeight / 2; + break; + } + case ANGLE_NW: + default: { + MMI_HILOGD("No need adjust mouse focus"); + break; + } + } +} + void PointerDrawingManager::FixCursorPosition(int32_t &physicalX, int32_t &physicalY) { if (physicalX < 0) { @@ -249,7 +241,7 @@ void PointerDrawingManager::DoDraw(uint8_t *addr, uint32_t width, uint32_t heigh OHOS::Rosen::Drawing::Canvas canvas; canvas.Bind(bitmap); canvas.Clear(OHOS::Rosen::Drawing::Color::COLOR_TRANSPARENT); - DrawPixelmap(canvas, mouseIcons_[mouseStyle]); + DrawPixelmap(canvas, mouseIcons_[mouseStyle].iconPath); static constexpr uint32_t stride = 4; uint32_t addrSize = width * height * stride; errno_t ret = memcpy_s(addr, addrSize, bitmap.GetPixels(), addrSize); @@ -464,5 +456,58 @@ int32_t PointerDrawingManager::GetPointerStyle(int32_t pid, int32_t windowId, in MMI_HILOGD("Window type:%{public}d get pointer style:%{public}d success", windowId, pointerStyle); return RET_OK; } + +void PointerDrawingManager::InitStyle() +{ + CALL_DEBUG_ENTER; + mouseIcons_ = { + {DEFAULT, {ANGLE_NW, IMAGE_POINTER_DEFAULT_PATH + "Default_NW.png"}}, + {EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "East_Center.png"}}, + {WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "West_Center.png"}}, + {SOUTH, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "South_Center.png"}}, + {NORTH, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "North_Center.png"}}, + {WEST_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "WestEast_Center.png"}}, + {NORTH_SOUTH, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "NorthSouth_Center.png"}}, + {NORTH_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "NorthEast_Center.png"}}, + {NORTH_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "NorthWest_Center.png"}}, + {SOUTH_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "SouthEast_Center.png"}}, + {SOUTH_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "SouthWest_Center.png"}}, + {NORTH_EAST_SOUTH_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "NESW_Center.png"}}, + {NORTH_WEST_SOUTH_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "NWSE_Center.png"}}, + {CROSS, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "Cross_Center.png"}}, + {CURSOR_COPY, {ANGLE_NW, IMAGE_POINTER_DEFAULT_PATH + "Copy_NW.png"}}, + {CURSOR_FORBID, {ANGLE_NW, IMAGE_POINTER_DEFAULT_PATH + "Forbid_NW.png"}}, + {COLOR_SUCKER, {ANGLE_SW, IMAGE_POINTER_DEFAULT_PATH + "Colorsucker_SW.png"}}, + {HAND_GRABBING, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "HandGrabbing_Center.png"}}, + {HAND_OPEN, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "HandOpen_Center.png"}}, + {HAND_POINTING, {ANGLE_NW, IMAGE_POINTER_DEFAULT_PATH + "HandPointing_NW.png"}}, + {HELP, {ANGLE_NW, IMAGE_POINTER_DEFAULT_PATH + "Help_NW.png"}}, + {CURSOR_MOVE, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "Move_Center.png"}}, + {RESIZE_LEFT_RIGHT, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "ResizeLeftRight_Center.png"}}, + {RESIZE_UP_DOWN, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "ResizeUpDown_Center.png"}}, + {SCREENSHOT_CHOOSE, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "ScreenshotCross_Center.png"}}, + {SCREENSHOT_CURSOR, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "ScreenshotCursor_Center.png"}}, + {TEXT_CURSOR, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "TextCursor_Center.png"}}, + {ZOOM_IN, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "ZoomIn_Center.png"}}, + {ZOOM_OUT, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "ZoomOut_Center.png"}}, + {MIDDLE_BTN_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_East_Center.png"}}, + {MIDDLE_BTN_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_West_Center.png"}}, + {MIDDLE_BTN_SOUTH, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_South_Center.png"}}, + {MIDDLE_BTN_NORTH, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_North_Center.png"}}, + {MIDDLE_BTN_NORTH_SOUTH, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_NS_Center.png"}}, + {MIDDLE_BTN_NORTH_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_NE_Center.png"}}, + {MIDDLE_BTN_NORTH_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_NW_Center.png"}}, + {MIDDLE_BTN_SOUTH_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_SE_Center.png"}}, + {MIDDLE_BTN_SOUTH_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_SW_Center.png"}}, + {MIDDLE_BTN_NORTH_SOUTH_WEST_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_NSWE_Center.png"}}, + }; + for (auto iter = mouseIcons_.begin(); iter != mouseIcons_.end(); ) { + if((ReadCursorStyleFile(iter->second.iconPath)) != RET_OK) { + iter = mouseIcons_.erase(iter); + continue; + } + ++iter; + } +} } // namespace MMI } // namespace OHOS diff --git a/util/common/include/struct_multimodal.h b/util/common/include/struct_multimodal.h index 0d6182c41a..1c550f0401 100755 --- a/util/common/include/struct_multimodal.h +++ b/util/common/include/struct_multimodal.h @@ -150,6 +150,23 @@ enum MOUSE_ICON { MIDDLE_BTN_NORTH_SOUTH_WEST_EAST = 38, }; +enum ICON_TYPE { + ANGLE_E = 0, + ANGLE_S = 1, + ANGLE_W = 2, + ANGLE_N = 3, + ANGLE_SE = 4, + ANGLE_NE = 5, + ANGLE_SW = 6, + ANGLE_NW = 7, + ANGLE_CENTER = 8, +}; + +struct IconStyle { + int32_t alignmentWay {0}; + std::string iconPath; +}; + #pragma pack(1) struct TagPackHead { MmiMessageId idMsg; diff --git a/util/common/include/util.h b/util/common/include/util.h old mode 100644 new mode 100755 index 1c1ac00f70..9c732b6991 --- a/util/common/include/util.h +++ b/util/common/include/util.h @@ -64,6 +64,7 @@ void ReadProConfigFile(const std::string &realPath, int32_t deviceId, std::string StringFmt(const char* str, ...); std::string ReadJsonFile(const std::string &filePath); std::string ReadUinputToolFile(const std::string &filePath); +int32_t ReadCursorStyleFile(const std::string &filePath); int32_t ReadTomlFile(const std::string &filePath, DeviceConfig& devConf); int32_t ReadConfigFile(const std::string &realPath, DeviceConfig& devConf); int32_t ConfigItemSwitch(const std::string &configItem, const std::string &value, DeviceConfig& devConf); diff --git a/util/common/src/util.cpp b/util/common/src/util.cpp old mode 100644 new mode 100755 index eb10650751..f5f9230a0f --- a/util/common/src/util.cpp +++ b/util/common/src/util.cpp @@ -54,6 +54,7 @@ const std::string CONFIG_ITEM_REPEAT = "Key.autorepeat"; const std::string CONFIG_ITEM_DELAY = "Key.autorepeat.delaytime"; const std::string CONFIG_ITEM_INTERVAL = "Key.autorepeat.intervaltime"; const std::string CONFIG_ITEM_TYPE = "Key.keyboard.type"; +const std::string CURSORSTYLE_PATH = "/system/etc/multimodalinput/mouse_icon/"; const std::string DATA_PATH = "/data"; const std::string INPUT_PATH = "/system/etc/multimodalinput/"; const std::string KEY_PATH = "/vendor/etc/keymap/"; @@ -486,6 +487,11 @@ static bool IsValidTomlPath(const std::string &filePath) return IsValidPath(KEY_PATH, filePath); } +static bool IsValidCursorStylePath(const std::string &filePath) +{ + return IsValidPath(CURSORSTYLE_PATH, filePath); +} + void ReadProFile(const std::string &filePath, int32_t deviceId, std::map> &configMap) { @@ -695,5 +701,28 @@ int32_t ConfigItemSwitch(const std::string &configItem, const std::string &value } return RET_OK; } + +int32_t ReadCursorStyleFile(const std::string &filePath) +{ + CALL_DEBUG_ENTER; + if (filePath.empty()) { + MMI_HILOGE("FilePath is empty"); + return RET_ERR; + } + char realPath[PATH_MAX] = {}; + if (realpath(filePath.c_str(), realPath) == nullptr) { + MMI_HILOGE("Path is error"); + return RET_ERR; + } + if (!IsValidCursorStylePath(realPath)) { + MMI_HILOGE("File path is error"); + return RET_ERR; + } + if (!IsFileExists(realPath)) { + MMI_HILOGE("File is not existent"); + return RET_ERR; + } + return RET_OK; +} } // namespace MMI } // namespace OHOS diff --git a/util/source_icon/Colorsucker_SW.png b/util/source_icon/Colorsucker_SW.png new file mode 100755 index 0000000000000000000000000000000000000000..40e19e94e129682fdeb461cceef0f0a57c64d66d GIT binary patch literal 665 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(MNL;aou{tnv<&|DxJ+8ui%*|TP>QC zq|Er1<>Ks`%@YdT9;VnD9+j)PQ@Pvt^X>e+_aaX6w;10xlsQ;0kiEc{!M=qV%1v0$ z>@ua*?E=dyXa8?uJCvjoX1)G;>qLstlkdM*253x3lz3gwc(UO1(@7ibiY#P4ow;8HvGcw;sUFo3d9qKp zXs681yYGZ8*q)RX-!3!}IUOV3cF6V3h0SYC51OuDy-0$0hs6WC(@%{ydM&-QzWdI* zn>okMm5N-Bmw9GmKKbE-?_NtkNpP^ZY`-nKFu=p_XrHKr@X3@(_4f0-w|~CJ`5=Br z*=}8_-nJX>zX$!SiDOz9rv0qo250ij?uT`^qSjx3SzsYBf9KH}`NysqhBADa+i&L< z%-!UZb-jiA!J`=N&lTnB3)pvOML*jqa?a?Yt{Q`0*2S=wcXYGjrwBJRhpkqfzt#Bs zo!W;LtPFoVmS6r99liSM8RAj6$r;E$_>(P&-XSY7v)395OV literal 0 HcmV?d00001 diff --git a/util/source_icon/Copy_NW.png b/util/source_icon/Copy_NW.png new file mode 100755 index 0000000000000000000000000000000000000000..212517131bf176661ae85c7513def022dbb50559 GIT binary patch literal 913 zcmV;C18)3@P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K4`$)A(Md>5kLsWM*gVCa@%v_wvtgGs)y%==FLZTdmd?Aw(8TEC?ow#bUSF zY<@Qqk^phx%!O2d#zHy)jf8Xq8VBhGXcXi)Kw}{N0F8ju0j@e^5WrQ13<{_q=~~40 z<3_5agk^282g3o1p(|0B&J@K_LP3AF>%+-vaD{s zUhiZwnOh3(;-}Lyolf^UzW7r(VL~&h1q_}flk4X0?tYBm@fL=!_$W#y7-KI;`s}-t z2mAg0a|}#}nMyFW$T>g$aPQOCVaDllnKR+s+Y^`Y$lMknxU)ZKn*r-H2A3b~dv+)2 z7+u~FkX8zoZsfh>@68uP9D=7hK&$T5|A3?-^gr6fuymd5tkPvuAyP22P&pn{^1JRc=k$?*+ldb_60fJ^rNXnW8z#n n#WS*kDnPXfKRcZ~Mz;R~fdlaz2k4jM00000NkvXXu0mjfuTYJF literal 0 HcmV?d00001 diff --git a/util/source_icon/Cross.png b/util/source_icon/Cross.png deleted file mode 100755 index b7f79e2c77d7e93e134daab77edbd192bf7ff4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-euz(rC1}QXr;NuTe_SVzIF{Fa= z?d^wt%?1Jo3JngOK6AcWVSeT3Lu~mx{8W@;3 zuo4@*8xtk^isn4o;nTj){+&?rSzrH(PoEagx%Q>Bf5tDl=0B-Csh7Xy-tJ3`z5eob z!1b?}D;93BKgz^)!^5;PtSByK-K>O({#!SArY&P$aPo0D(+laDx(p_jf4mrKl{d3C zsP)HlF33;W#&F@uM{UM0y=TN2X4%xKHtd^tlgVN7@%1bh%#ETMGCuv7%J9oAjhn$& zZod(a2KT(rwmh)`d{dWBah_Yp{@Tv_m7I6Q)NtWRv+Z>5{aY^VODXqp}0<;lJ;-YxE~|HrXE zRdtpjbG)jgYfa0dc=K7SpUnw6biYwE@{H9*c^})o^BTdvNk}9 XWSG81`l;EjpakIQ>gTe~DWM4fdG7B6 diff --git a/util/source_icon/Cross_Center.png b/util/source_icon/Cross_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..58625855d1cd96ea8a29ab9c3c201d90ac717e83 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(A(pF?@W;zzc+2noWh@yaq!L(DFO>=l| zzqbD2!QQ;~wvl?j&F1jidrzLX4Euaf`mFm7)jrLo6SjU6xb!f|Tq?Q7%W&M`IRQhvSqxumJHxhAfR*ZKB;Z_B~>iOmWeb>0oaPMcS*+M2SXxTf$^ j#;g`Gjs^yfn3)H-omU-yB+tAR6lM&bu6{1-oD!MM-AV;vL$LEyIqQeLIp9sHA>hs40{ez2$p@D(X(J+P5-V#2tjzn?l6!GV??F3iC&#^HlS!fIsJK-fML z5yxXN7;tZ7WCY)tnHf7fJ7Z&G3Wb6YT3%kZx3{O!XmGWt=`uqEvn3w=43#zF=3;ipa4pMq^zur08*)x05vr=gp&f#zXLxw~m0f0i4m6i4N^+1E8jg1Yc zh4AZPh=>SiY;<&VQ&SV0%?1^`2?5E)Cl&{T(fV0T zRBR>+z|d>K7D6j$NoXYn;h!M<3c}0C2)~8YwFXGtYKYdlDQM%-#-OowjJ7q&*io`} zW)JBW%=NFW(25PhZDC~I#*P|ClTVtyiu7 z`%pY9+Zo;w;k`X;ckNhd3;CQPFeth(!75N@N4QUNx5D(!f&D zvK$OFw())@pFjth)O5LPK8k=dxGAs)c}OBWw@vn-oSxU6c1|+1zlVVb$Z= zHz6L5!i?<&HK+U4u>kQ!pMTwDn)4LfE_u3P^;xn0!BO>;;vGZl3hk(6-{y@Rt3*Fj z_pZIE>HYrMN=bBE#&GA$nYlExi67`H%cDcHzm1Zgsv3VS-uL@fbu8qA)G;gD=67Kh NF+MLUq=PFe`41oP{u%%P diff --git a/util/source_icon/Default_NW.png b/util/source_icon/Default_NW.png new file mode 100755 index 0000000000000000000000000000000000000000..6308171fe9d612050376f6a5dfdc870e51bc92db GIT binary patch literal 522 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 X&Hk5m?gTe~DWM4fL+xE# literal 0 HcmV?d00001 diff --git a/util/source_icon/Forbid_NW.png b/util/source_icon/Forbid_NW.png new file mode 100755 index 0000000000000000000000000000000000000000..c5c43d4b4b8aaf6d53931586e519a583d064fec7 GIT binary patch literal 1138 zcmV-&1daQNP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K5+(|@1R9FekmtBaAQ5eUcGas3; z*qBDMSkcO?l5(f^#%3jvk0>{Lu|$z5DO!nGS+=A|6tNd>6!}g<)`hZHB4tMwyV%`! zL(9BocxUD~|Fd(Zch1c2e74?Gv*+u1p7VR3bI$XeCDSyY8HVwSbM7ZQ76HavT3Y^w z!{HCMgan{)oP8k`plu9}-0AE#A zMV+0UhTrc$;q`itsSo*7DO0cb!`;JRES5-B6R;)`~9323E-@bujAKyt?=vWIr z7`Clr#k3tV2y2=+a}Iw%dd|4sP8A!QXwuGRO-gi4lYX}Dm$J~&OE%lOOs>8wnIY2T zCe$@hth-BkDV*F|K%#`twaQxkfhQr0OJua4Rl_4SvQLS{l}cY0L(ZAiBbOmLrl3ZH zG(&I5)3DlNA=y-^F>@yG5t)ngkyT`Z1_@c{WE9vg zv0#h4g^e^o1YyKEgc3cx=#bHex5!mfOUBjnnJ6Q+Gsg=Uap1|M%OgW1h6ZGuBez?h zmKR0c?#iQQr7U#xlFha*ldJE*dk#U>Dv0zo+;%_);b|9cNKabl(T3+@{h!Ghm?dTP zln0xzt?L!qm$`UwY4Bo#_*PvR*#rR_F%h8zw-p6v4%-SZ<3sc;0vQLfOVc|-+t4nh z6!2JR5RZjwxz>0-79=26wd->$^)SWz4UbK{=Zf7D=)y+1-h$vrc~C*w?a80=paR6# z;M1& literal 0 HcmV?d00001 diff --git a/util/source_icon/HandGrabbing_Center.png b/util/source_icon/HandGrabbing_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..09ab3121d15e27a975fbaa228aadb2399e4492b9 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(;JX9>gnf1bU=S)LR;nnVFhc z*t$cAWi~T2+mWv~B$BV~J!xJ&aksWj*|#0uT|XaKZhl<-dEei(XJ>_!6hs8LI9OYl zoER521UP7Xn6LeS&0g|b)Fc&VUEcP?@)!0sq$d97+oZF<^)CzasWn%#0z*UB+Eud! zew)u}-Dqpobi%`WE}yCIWu>d{ziTo}pHDHG&d}?&m@Uq!byvE?_fMOqR50iLu>bnA zrb=(RvPT{-I}_t-U$x0wB6M~!Y>Hd|^l#n&Jt10}3juJfiXeQwM8-)!G?eOCN2LUh~@O;JiPH*Z)5_zE;8S z+0PQI)Thndi!XLawJj`SwJfQd>9tfZFV{et|7K2EZw+g^<<3JYa~?%*zrEG*^{G^& znE_LlaHo7MOx@M~S<|b{ZuZ%ni8>-&yN*9jyng@j!MA1m-Oa4#pMS4nDZ!IrAn}JU zzAU}C`L~F?QNrQ+Ln~{h`z^npV)_VqCaBgWIP+AH*-I7FFUyJ;Ersy hBo=6dKUmLH&+zfgqTV@nbMisy&ePS;Wt~$(695I0LFWJf literal 0 HcmV?d00001 diff --git a/util/source_icon/HandOpen_Center.png b/util/source_icon/HandOpen_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..e1cb7a972ec2d372f0d75cbe80159c4a66e74e10 GIT binary patch literal 1014 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K5U`a$lR9Fe^S4&76Q51b+CLfa; zqt;@fpe4aVY)V_Qs7=w8NFYd2=%S10#*MahU9fHn?jm(7g|6(PLMUC-h0u)(-Pj_S zLKh{gV4A9FKA6vBGClW|s4JN_fws`OaPr=pxz}^%zTcHG)65K*8897K^2_u&^MnudlO? zj*e&0!W2beKA%s*yIZZTt#$g_ct#v0fJEK|gsd5XFSob1)sc}AR;g6H5LG=oI%0i& zeXLwA``X*vDYL9zuS;m|L+}T*pMiUTZZj+pqCReJZWbYog~MUBTCFA7BOM&P$hCgW07m5q*$GPH7`KpXhCVeFt@GMRK!>+yJ4I-OS0{Xt{B zCMuBpqd)|ZakS)8sTAw#>f(GmJ3G9kpZ@-S3$@6g6bJ-J7&|!n(reT9<*c`ln_GfBps9PG@|1d08d4xw$z7 z=UriSb@i;CbNh5wg3~U_E8>5nt*z}Ci=7MU>FH6T(dfCN8ZYBI& zrZ;SiQ7{UN{rSwy%&{I}xIjjdqA+y<*12RIi+H6aNl&^;ZC#pud2%)_e@;mO%=vUki!@x7}|4im@MlynsCo)z@oQV1wl>$=pQN5 k%nXKj{pDw07*qoM6N<$f}{(+ZvX%Q literal 0 HcmV?d00001 diff --git a/util/source_icon/HandPointing_NW.png b/util/source_icon/HandPointing_NW.png new file mode 100755 index 0000000000000000000000000000000000000000..f0daa0dad6154a1846fb9fe4b7f441b3ab6f8b5b GIT binary patch literal 832 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(gn5}GC;IzS0p_S1yz5WMtlf8oPtS_0ltd2*UO*B;m z*Yhu$Ah3bMC1CNo`}bb@&XX+qct>WA-n!{Y?DJ~x-<(-~FMa;cC?~V-gpCne6|RZ* zbIktAZ++~bV321vJ4B$xIH0QF_Le>smT3zEI;w2s9u@6ema$tu)4n3qYs3AwW#K)n z9ziqO+0#`#HB^7BzWmZ4>B#%<_Zur&Y*@D(SS#Wr=K>Q z?&Lb_WXg_s9kH8IOZUe0NB^*MxahR;UB=FseLg2Tb3SvlAGS59UZ%2JdG*z*C=C(4 zq>U1dRyNlQcHEUKu#m}_doOg7g0wZmq{{~rHuPpl*D6iq2>!5h63b1spIzB&d%kW9 zmNQWOS~Yj>)ca*zQ*Qngy*7D=;(6YwUQ3GPE>8a+ z5z~2pxAx!22#2F`C+-|BnVewYQIISk9%k1WcIeb1pj=z~ZF~wnJ6U*$U zN0T=GX!!3a=oOowY~VEOV#boptx;?-)m1+4PhZU{Rg(0c_{yH;e@f!33P$MzSFG4? o#Qqh2!ITv!8h{1fXlL5bXwrN6@Q);o?V!}_>FVdQ&MBb@0I>^JF8}}l literal 0 HcmV?d00001 diff --git a/util/source_icon/Help.png b/util/source_icon/Help.png deleted file mode 100755 index 3d37f2888b54425e1f217fc7a84a43d89b70afad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4304 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 Ef<{fe+5i9m literal 0 HcmV?d00001 diff --git a/util/source_icon/MiddleBin_East_Center.png b/util/source_icon/MiddleBin_East_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..921cd4ceea8d97ffb6d4c45008d6428cda998cce GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(CktgZ>12o9_@LM(V`A(ZeB0!#1;3KKYO|B9-xjpET{3z4I=qp8Be!SI?}h8K zb0ye*?yHwN9%y_uVXNBC2ZD=P)$*Em2@jZ0n_r7}PKeO({7XRavzkK6Q$Ns%4p`mBJg;);0Y)*Zv zI&=O^jjm_8ckdWCzn^k^&)xQ_NR_;z-TQYf^|Wk-`JYkoLpF;YWArx8Cr(_=OF#kc M>FVdQ&MBb@04_w zjd{1evbR+K`Tk!H516WTAEfP#tDk%Rd6x?*DwG6yU*=R+U5r-Mv*g?X}Zo?T;q6QOYUxC37)j0 zNgtKv`nhv{HAm>EEqL`RL+K`?LY4JgKl$mWm)^}WTRtr{*Hdk>r=eVb{mFIp6Xa94 z4j3EUX?)Do{GpfOyUNK-z3IY>FTQxH(71+^E1qfn+A!}FBguo0RV%W1$Mgz#R_%~e z?9@ReCQCiduZJK-Wz^IU#?Y<0cu4Rg-7Ai1DA_qwq6oWyrR>r`jIORklcDzkFQc zyo%9Wjd!mXPCI!pJWrtX@714P3!0`d!Q(4{t0s!Ij#+lmsa>zI+~0 zpNn1Wl2jyjPi*_i69&e=@7Eje-rTLOeszUWKX*tF+_x+eJTX=3RMR+PvWOwXaP}PD$>|Xi3a)(GdP(;wxOUbW+M%RZpY-MK7*S zES`VkgJ7_f=k|A5TW7s2u}U+Wohw+9Q)YW_ic`SMoe^upGS^?ftt-}@vNz8DWLfKi z^{8FKBfm z?bqMBZPDJ@#(gWacTVrUHF3+$FP~TZ_PQkW_4B3&9jl(qzpm@o@%OdZwxIRV0#8LG z`j2Z`U*65VT6gpP@H+2H_vL*BQZ5u&{`g*3_H6&knge3Lr++i*5eDBoi8Xk1}$5!+m-YeYSC0Kq2>L9cFo-Xq==V;x;{zg~)mP0?}P z)B|tJUhh~ZJ>_(&>jdw&j@%QC=3d)va(dGgj;;^gC-adqOR9XG7PK3>&%C zQEQiJP4yCaa^=8-H?L<``?4L|8Myp%V)o6euS>7KEnBQ$?pw^x#-8`C=@Rpa1->y( z9_z0=pXhhv)hXLF^WFU4TUX39n7U)?)dLR>*oIxWx>0uN{j()jrmL=IJ<|n>omG)# z@Dr?faIKzszEVNn?QMoKe8y874o);Xukw`j#I8&K6g#)gEZZ$>yY^PD@tK|-E8e@! z)sYok`P_dl$K~G}6qxq+N1uNB>3U)JE!X~NA4B$Qb^GPBDid56>{#)AqP^J4_uj%x znUd@0o)cenGW`?N(x=_lavSBg{(J2_xl<=agzt|%yB*_lyUyf}Oo(N8h)uHe^u|9D>c`^x8MYZqs((qx^&r{PUft?FH2VGPWQf_VpO?F=e3>)*VjLF|K*RoI9w&y?>@cryI7Aqo6pl@ zk3ZI`2>q1eYu_57lNN0wCw?;Jl81_r+AsaM_21b&>`omik!61ROhH}X$I(R>S7=N> z{Vc)YN4CVVe3>T)z8=}cSQ=aJvHY^x&JZotTW`Nrn9Y_9_$G6tFZJ;o9&@SQbzH4Y zz7w7}yi(UW(elE3gZGVsT$$-*ZpSn~)Y$zGT^XVir#+RqQK4sQ?cJ9pE_&02zg)C< zCRKaH;^^eq&!?Co*Xnd6ZQK#1BPOoF#$0{=)z@E{X0t^b9UNANt=?96#`IUm#Iqmu zWTsfWEZc3x&Ga}qqEoAJ#nl`$!@GGgi}Tk$dADBrC4czpt1MTmPESs%JGuJI^Ut@> zn5BIYbbhn@%EY@pF833^1vk~5c)#{yM#76bFO=DGHD*6H^?T+2Y0pb#xx|-Bm1;XL z0>e>q?bWPYom~Ex%4~1bZf|avT=(|Bme6wJ<|n0V!#1y;%6c%r@0g+X47;Q`-`=J2 zo-F?tu)9b=;O~$4x!UT1j^KD|2y)O|AQHf}W9D#ngS$R7y5nUtzg~tiKld>v+teL50ZDhblzcgqc2uA#%Gqr3_i7UXO1o8n$lVI zyWXWusIyaS=i$94Iqm;jPOmQ75uN? znRUzO+3$51GgjnnUmdnOlw-w9+3%0Db=g#BE`M7#`^)dYC7W*^*?sq2aMk&SS#mN` zTg=ThyX{W3f7p8e{r#oiy4YSET<946B)?3*`*zd31jUZN1WElsz7ny2GawE1DdiHk)qO02R>q*51b%l*yJ&X)VMt&97_BHN%t zCn{`?otW>)|87RgdW-#^stY$i2%Qvmv%$IfTaa`4biXN;{HLE@%Gw&Wv>zz8Eu^Gv z$FT=9-T(8~_8#2&yz*L!m2N3hyW6o{At9oQzrB9U v*Bzd<^`$#Ki%mIau=p^kF@l3MAew2v(8rs6_ib+UfTGXS)z4*}Q$iB}M%eIU literal 0 HcmV?d00001 diff --git a/util/source_icon/MiddleBin_SE_Center.png b/util/source_icon/MiddleBin_SE_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..44284a6e04a19ca8453b46ea81db099ad84cfaa2 GIT binary patch literal 648 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(RwbmiO|8(!$qTJ2>kYf2$tZ>Gzi{FX)3b$22Q1b5=z@*M;3z zJexW>_f35LS==~;^W)OM%=Zrrr&s^`ey9JxsyJ(-`8$U42I~W|5BLh$cQF6I$9ODa z-Xb@{81`R3H%mJUTo=hdn>IPsNK&lRC9Kiz*o5Y1ISUvxrh55^xN6TnyQygB9#sZi*2O!#*rnHVJUMvM66s$ebvv*AFLluIm|*cdrRztH-Tv7= zYMahK-_6_V6lldgz0twp!|%U^OfpXOfxQnFi#-3$T^5*EAOVh$59~5O*os7V_^x>D QQwT~0p00i_>zopr04aC~4h4v`B@41=Ta_4Zmp>5OBO|@3zp; zQbxu{|B811od2YIbBvxmqtp*Uk*}Yx>?q_~X0|Nz7{kgXmov?cX7-#&+dTiqzusk; z&tEK6;<2~=d+i64i?Lw;@u@#+@*bM+iqN@NsJ2fbP0l+XkKs2>4x literal 0 HcmV?d00001 diff --git a/util/source_icon/MiddleBin_South_Center.png b/util/source_icon/MiddleBin_South_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..e7d5afb6f8f8b1b2939b9e18bdb8b8b3d9729f4d GIT binary patch literal 589 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(o&}q%Op_R=)68j2Y??x>UX3nq<+>W)?kKu( zW;2hM5|5C|wxw^plzBh@uiCdS{klY3+%3kp4P_423uG_wWw8I-%Iu{Xyhzn>GRGx_ z^H8M=-$&~{SM3jQ09^YAV`>mGXhHMk5Ro7puI_AxK#>c~V z=Z>q_WidU)CHLPeKe@e#ZJO0hEvE-P;hoWu+&q12ZZ2iY*So9n``xq8I|El=HIip! zW6x82$y3mKz_|aP><_6%@8g9%A1mgpWC5y9ReQOfVdm;f@{^v-dRbz1GE?`i>EYRe z;-{+v-@CiJO#2+He(2p}i@Mu++s{u@S5MTpD!tCw%=}$@nzx>>{I%DmSMs($zM3VP zXEr;0r7hUy2hO@)Ij`m@(8Jd37_u@XWb@6C?xTm)Ppsr^KkQ-QZ~y)2x9B-Lc@JMG zj{WXD>(law0zmIRQF{@gESRwW^rqb33Vk+Riv-@>n0F_;NFe6?=R;XrS8)_&?c}z+ zI-xS<*`=M*b03K{8D{T$zh9vBe5@khi)FyzJy6JQ$Ef6VQ|M8ikq{^Bs;8 literal 0 HcmV?d00001 diff --git a/util/source_icon/MiddleBin_West_Center.png b/util/source_icon/MiddleBin_West_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..7460bc18d63e000689755b39b8ead3c3609ee4f5 GIT binary patch literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(ga>k%`hD_CF8Q4DQSxRL$P@XZ&2ZDNy*#BaE9WGkhxv8CTXWAy*`vF|oAH)b#hCouUma2hbGeOS-op(%gj{ncff*G@2h65bgh zV|dLZbo@4r==!K zv;|);J%2^wNnfFiw@^WujJukrk#&;q<#Q(%vTdE+sS@?iqObXRrTngSr+2Mm&#G{j zYY=K#lIdl?U;5gFXb-kmdKI;Vst0E^zh7ytkO literal 0 HcmV?d00001 diff --git a/util/source_icon/Move.png b/util/source_icon/Move.png deleted file mode 100755 index 89b91a80365ae68d7a72ae67390b120e585d0a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3299 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 diff --git a/util/source_icon/Move_Center.png b/util/source_icon/Move_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..00f64e54dca0d0731b595b4ddc9e0f7294c40c72 GIT binary patch literal 698 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(tO?(G~x6~H-FZ?udT_yx98yJm_i;4HW}u=#t?~)MJr6^`nj)pvwV?=*SX69 zE)LyCldin}dg{V+b1B}YJ)dg-+w%T(f2pwJXU)GmFH5Ech-_T6|53~=pQy$=ta`=@ zjO%8k_#NcoO3z3Pt2`iD$nk_c}wrVf4(t(#%=XeUxiXNPQUKh<m6LasM(_URrgu+u#!Sl{+PC%8f*Dq>6E7^SVRN4AI?p=q@4bDcXC0pW=8>!V z*JH$~cisHP{$tvy91Nmq9I|sV-r@O5_uRM3+=q~QZF;)z- zw@*I#L{9RNQ+)dVyJ49-j@GRWi)MBFz-77mI8$kaD8rQJ*VdOW5fiv}URS$7NhLjK zk@RQ#iEA3I?V>vzXNxJAuTy9`!(;K&(dxvR#>xBvhE literal 0 HcmV?d00001 diff --git a/util/source_icon/NESW_Center.png b/util/source_icon/NESW_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..908886aeb3f8df976bb67b2261e8e52e7222e622 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(FF(iWX z?bNebEd~M&u2CNzYz_aqW}l0H>^Ih^Up#M>r|s)ga$U*xD&H!2hN{cvH|t6_w{y14 z$WXgqH#tSNom)DAIj4blL*r~Cg{60TAOB!pyYWit-$Y)i72jL~YuXbv7?UY7NI4}L07yR(UOrA%|SF@LtUaj9K za47TkwU@vDG1j+S-IOBGz*ik)dpFF%w}GWIT%g8yxBB%%_vT71$eiWRP+?MQ?|a#H pkF@Xm$~n9n7|jl_-Dr?y-mhM{*l%{Fgf}P_JYD@<);T3K0RX>h#X|r9 literal 0 HcmV?d00001 diff --git a/util/source_icon/NWSE_Center.png b/util/source_icon/NWSE_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..09fa728fbb45082a0524c284b8906b91d7b3a6f7 GIT binary patch literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC({iyy76I?g7l4>a>qZ$gkH7Yk+XBB zUyhkWi}vYHi{JmAD=ZK#z$fsqYtaSoL#$>CqTd9HtTf;W6=2EV{zLy&vR22b)X1_k z$4z{n?^^fOqVIe+Q%tobW6(KM-^HJ8;`vpWgk+w{*x1dOuwq5H>c=_Fit>wD(?JA3>bo(^vH~q_tKPWHUz1{-EZ$9$nKv(n2BCdB&W-3^! zGQMNg>hqh#a;Go#GUw$;0cn+k2U+$vc${%uRAjM*%YkpwgF3DstD|}pwwdu9j=f&$ zm7QDsG2PspC7?!M_inOK)#BzG(Q7Qy&IwAy)-vbqtNW+Se*3}u!}n%42}Otqu(~h? dKA5lhfirB{evK(Qyw^d2@9FC2vd$@?2>@LjzJ>q* literal 0 HcmV?d00001 diff --git a/util/source_icon/North.png b/util/source_icon/North.png deleted file mode 100755 index 1d5467be9b59a1cab0d84c21e0cc31816108c01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 zcmZ`(X{T8++#9lG8})lsP&!8e-9yJ43jVxlLJ)OX}c~8)~K_nQ4}( zg^Z?{2&AP%x$iZizD#P=Mw39%m`owXb?D1`U*5aF-?`_Ud(YQ^i7 zAplg#kk2zZ_@6DF4*jqG9JHKv^8^4DZD*V#F%cpyb@jA3q1EpwT1zWumdv$QI0s@Ops7Z}mrw=%!sx59=-;_sY$Q#0SxoL&fH$>Bg+r8d_hp9uQm>+CySKlu! zEqTgTS64>`oIPTMtxan)4|VIjPcR&bKUm&&ZmmXQS7UG+gR!^YxMZup!|m&=s;Vl^ z_{RkPuHhCRH{OmQIDt1PKZJwlXRh43sh~+hM-{EDtN;1Oi6u%$9C%_B_+IfiyIpo92?Cr zi?DCGABnUqaLxdwzvSuR;jwkTPO1oPc!m9R`TK4LgV8==9~FAk?M2+kl|C~ae-~TT z=z;n9`66i-bT2US`0^WWds|yukgonLIr&wIMPq_@I^b}%n3UUnXF2z)jM#6N+QgAo z=SY(8mxl+3&IFbzVuah1gS^p)%@)bQo35i7lDJctRLSzI*KY~F=-`Gk=wtAo^n=hu z?+*SLdXRsgEscx)z2W#W(@YIdWdKqz?_Of(b3ZXzZRDr;vZ=_^B?}BgzL$p!2-9Er z9U$yURqw3?ig&xkk@KdLTuH#D)FtZC?PBnDR~3L&t6T%0MVg+_K>?ihAujTMJMM{!Lp&!QO)+<&dN|G)cs&yTy1VyuKsRZez-I&!UBH)JqsA$L z@MLCEfS`YNJRq+Bhdv`ztR{E^HZW9JYhji?6y7iDt6Sd>$J1d@=0lcdW<}M4jE}a# zs8KHb8->tX$I-1h2ixXWO@KN>NCyZPHC^5soYW6&XZJMiX7XUG@pe_TQk@Q!BC|7# zw26K}y6N`JOvsgJifLpIrfe&+uYEl!@yR)D(!%gPfKZXQ@-+HEW8)Ij5mu~vxJP+T zpQs9mt$HPLYXzI;9cu1Bt1EsBvlh-0d3H0oM36_lc%me_D9~U24iBzux2X@qs$AGn#0XGz0 z)izl5F?OW|064y!{Upbesk?GO0_GQ+%7y!Zy#kdvDxs6Ih?hW}fz&(nXW@f^+;EZx zr<8aEe$ty;Uq9npjt$P3W%cRgu=b}FjurVEi*Ca8jH!X4e9Gp|+BBhPoS5WT)Cg>ipUV!ks5@7yf?ac{>HAv(<*N^ulS>7e(NT*6WSnM~qKA g&icQ<8Ksi34IF)0hMYw5-vG*TKH-659}CL-2e^M7>Hq)$ diff --git a/util/source_icon/NorthEast_Center.png b/util/source_icon/NorthEast_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..f6134237f38cd681b319c95bf1b77017bc1524b4 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(7R@SHVFE6 z$bsXbjql~)TaTX4*==gQCgAI}sPrCArir=}%$biIyZ8IF0Z+eBO7Q{yCtF!|vVFJ^ zQu+4mJG9$Vb|+V-mT#LU^z*^_@t6qFZKCEaLp sy^?oEbIvw{&P#UDQVSTNXhq%wR@W1XJ9jI@E&}=9)78&qol`;+01K;ztN;K2 literal 0 HcmV?d00001 diff --git a/util/source_icon/NorthSouth_Center.png b/util/source_icon/NorthSouth_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..b15678a6b178ca0d9b13f7c7f58d025ab7a1ce12 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(Z&`1BVcOg5Xue^AvG1`3j^arLvuq}v{9t_Gd2`AI2@wqj z)&&eAH(VPf9$&Tmp7QvYUiZ7L9L!&9|8KljWwvg0qtC+^&C0W-PRPuWI$>%dI^nRv zo}U`5X(x+$j$f*{E96u$p=+`e%YJK%mrK}=-g|v1wJdpsh=K5?m9MvCh8^`}&=Hm9 zayl5q>h=6FpWLzsHdoI&UMdNn^vXaERotFv&3o#%cpClcfFtHFLyZP%m{S&zko*l=t#@k!83GK Qfg!-)>FVdQ&MBb@060F5J^%m! literal 0 HcmV?d00001 diff --git a/util/source_icon/NorthWest_Center.png b/util/source_icon/NorthWest_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..cfbe4c8910575c12afde4b5904d79b5beda0c162 GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(V^9}nJPdpyEVab7IQ#LVe=rr+NYq)G`_&P_%?+>IL(kR5ci2tkN%h-cK-5DO26`u09%=vh( zrjE^X(t?8wJO{vNhs1_!?_TZF+gbc3=<%e@rJhlz5*Ms{eahzi_bJ+!Oj1uY3q0Bu z^852|p6lD*hI&;lKdMvSRXvY8^U`bAWe>ubE!nqoomiHs7ddUO-D`%gmO*~;p`nhS z3uj;ZGZ5L@YXd zP=HOk`K{wG$@#s8oaKGZf{z>x7?`2RApHU30-w#-dfa%6L1EzO>gTe~DWM4fb6|%b literal 0 HcmV?d00001 diff --git a/util/source_icon/ResizeLeftRight_Center.png b/util/source_icon/ResizeLeftRight_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..83e7671e3ffea65260bdb36d8b392fa78d55cd4e GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(?@_14>T9KD&z6wP4(|n?EGcY-V*Q)nDLhd4 z?Ps;|&AD^E<@|in(nH`goF{M;NvrL8RgLgxrrhb=iVJx;Ulw>n2tK11K{ zGv8}lZaE*heQ%RW*pUj=>o;sW|9m^J^20q*c9-mfhTos4lvi*4H+R!f*T5Tpx3E@T zSXZCBaZ}T_TzQ$}l_jy?g>!$typq>mVQN*k`r&=ko4RL6KQWOI(X;lEj+Nb_{{b6Mw<&;$UKDCBnl literal 0 HcmV?d00001 diff --git a/util/source_icon/ResizeUpDown_Center.png b/util/source_icon/ResizeUpDown_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..db8bccf89b6e5260db3875a22b5200fabd30c23c GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(o_h}Y4;UkO8IK)ldGLLP&8M`Wg$Z+4 zZd6&?|LyDR{(gJb^To4^4_H2sDd3YRT=06=>{YAcRtDs_T$#ebc(wHJywscOqFrkn zrxaK`?CUa}pkwpsc_Kn z`V~jZDbg$lrP}+QH>Ewue)e|h!GqZ*cNWKV_1*YhUi4!5vyd;jg7ypRm2dS)Gp(v` zGSqIhUC7yFEUdJDPfaQ3u$*+OeB!f*5?41~v-RkzsbA?bZHwcj=4Vg- zMDgh{8ko9q3%uVWZuNNOp@87ZEBwA|z0b_DUuXF8e@&P8S`~xWT+{3qoDlzdFVw+L zNlI-03US7yN4pnkJhC}IwITDCzLFucTi_Pn!ylNBZ=P;-ZAR$fxr=Lc&M-|r*&wrT z(M3BO1tYO|qvbzYC7Nw4Wp=M@+QR0?nkhS{f#>w5n$4fKPgab53k*98_J0eQGx~9)eDLuPgg&ebxsLQ0LxX^g8%>k literal 0 HcmV?d00001 diff --git a/util/source_icon/ScreenshotCross_Center.png b/util/source_icon/ScreenshotCross_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..27460c082507e71082d11cd8a20eee2fc24da28d GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(!7L3VG;X4^58T|S_1S8;tVgJOY!Tz@71IivmkA59CmBz6i< zbidiR@v+d22j|`_S|%+1&FYXigC{Ud7AsBlKDlvMi^5?QPgU*Oyt#UIE*GsIh-z#$ z_u*??yvfzIIPN0L=4i0``s+&~g);6*Nmg^M_Qsv(JseO|WjM9! z{AZy*O53M3-R$1-^SqF!;^`cHwtZID zGAC7wJUn=Q_l^Y`yJuV%l=iw=!eO`g7V`mnH$l%y*^K=MSOT_%`fk!v41H+1kEw0) z$vMu?enzg8IeC|1s?T(V^LKPVu*mSSHBWKbe}DOXW{VX|WP~NQPf}YMelF{r5}E+z CP5vwZ literal 0 HcmV?d00001 diff --git a/util/source_icon/ScreenshotCursor_Center.png b/util/source_icon/ScreenshotCursor_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..71abea4ca351988a92b8a5b2b2228321df31aecc GIT binary patch literal 857 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(euD#CfD;6|+hqFtI965M$VejSyuC(6CPRct{CYBWlX*W5_ z$V9Vqb9pJ0c{Yi;-0@i!_VMeTaCw#5^S|>w8M`P6-n*V)&~X2K{JXbrYaJ$O?qu1-GV#vs zxb@!+rFswDy*oF?POYZAT-vpszs7vrvSMnxh$z2hxmT|wY#b-*MAsjeAw!v+COVcN?dv)pV}<2Qd}{y*r6uf zZvOhx(OYZP{-@wLgY({fygZoN7$%Zmn4)x?J$x`}Ysu zyzyxfls?#T-fWYoiwZ1EPXIS zZPu|;?WT&tX20dlj~^!o@+K)ue7xy)O%o5t>xlhKEU=L2UuGe|@!`fU#zbA` zxeAk5_N!zskI-;>cQD0>vuf`=^RsEjC!Q7sXo#?gpPZW770K~$ON7pq-2p4~cvw#F zyqvYwK!&gWq3&m=j_Fa6=N>FQ{d7{7=uHkou_Bd%sh@+UJke+7KKS|aWPl|e~uwM-EP?M$>~ z8b)g@RcdJk)g~zwv>vsdR18rj4Jww{Ui|ake{;|I?su2(oO}QK@;uy~6y;CI0|21t z;!NGvkq=#cpq3ysb5tf<|2r_wG*i$p)vBROZ z1vO_g6;nLLE$d02=NSw}w33q20i{Sba%X3U8#ljZDu1uOP1gjBX@62y!*2fiP7#>*kJ6i6#~u z+rwYqC=Nk%QCp@%ZcEWhota4LtdWXwY!OgY8!1}E^EBWpB4#j28v5&xNs-P*nR&DIEZQ#|X`v#$*#JllqdG}>emeloJ`^)v&GFH4t z?24wpV2`K2znx^%Y4z%sA-ff|B3q<@jDW$_6M^fZeDE+9@CXw7paD*TEsl&LXSQ#Itg%}WU;lljY;nVDxxlm-n?Ti)d$mh(U^j%`yj+?km@*SH@` z*O;{SH~f(8g<>5XMr-*>f4|%$E;gF?3+6?AW4}daf``aHei)w0+5dCo^Ym!@j;C=E z{h@a)jpdW)<$BtjfQn53;O+bR9Xv}hxN zpM7VI8}*2J@6_a^*gm4$F!g)!IPg~mA}PHc4BF~i7fWJ@ZkNA;!C)vKXgaQ-t?YGu zBQ?!HJ&gu%QmiKO;O=>%hqlEBY8Ce5*cc`0c&-W}BD8*}>SLAA)w?;#Y3l6Uo$^DTOB@(I(N=}6YWCd!c3aH|o8Q0r zRp8ZebN)%Cje>&0t@}{(UJ@#<3R`V^l=m)kNf&`F+-efP6-+C* zoH*6jELW&nzV`10Yf)>dM!%wwvT)44E{#nM-q%oy>d7yK^%l$q&y%^gvubv4dP*1n z3|tXj#Q8aP8XO!8Yg8SXgU^bnre);B=CwaRRhu2<(`PlD?w@g*U|V~i8Zvggp$}e2 zNNHO1)twm~9St1atS%*$dn2e&V`_ydRoYfSHzcP!TL#=)OXzyu(y~s+<96>f)YVPX z>$!aLLz6~g;x%-eRd&6}FMM5BrtjW|)vxb5R>_E41g_9TNA76GP!6QjJpVh>_diXI zqw*HiF@UW<#!r8JBnK=zoc$#M2`Z*UM68rL3KjD>rrBhF>0-=l05KY7{(~6Ak8K?Y zJ`$eSHN}c5e{5&S$zC!p#`|cEjq>I5_f%;7Vd|wv!d6tPOWL)xf(OuIN+lYatKK&C zFBV??Ie{BFQ74RP1uPY8qFS~>FQuYXPHH`zI`wqX!t7-tWCB8ziupT~Ug2&I&!lrB zpHvKT5(HVz(wa|W@&oy7{iQVKh86y$PRSsm&cKf5n5&(B!Yh_`>~Tg;(d;4o}aGyCiPv(xwRghEw literal 0 HcmV?d00001 diff --git a/util/source_icon/SouthWest_Center.png b/util/source_icon/SouthWest_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..2ae8e9a9fa396bb6ed0f385b7b99b66830357a40 GIT binary patch literal 413 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 cXR<+>*zopr09NvIZU6uP literal 0 HcmV?d00001 diff --git a/util/source_icon/West_Center.png b/util/source_icon/West_Center.png new file mode 100755 index 0000000000000000000000000000000000000000..2cad91aca31f2e2b257c523e80e6fc2d71fa2cee GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(7Tdgmy* rGQFEH_eT8P+hq>2FuNIeQcO26R)2V7@!Vf|F33Bcu6{1-oD!MRS#Xb5C(=?5N(Mc{H?pf%n^UVV+`2JEnfGYu+VT-@Si9_apy;#KMQ`?(Qm3 zjo2mFCI9~E&sA!di<=rvo@9zlI;AYmmjCRYadFYRGbtiUn>-pJ@cPPzDM8U|!{RU0 zvcm3os=6TGyQCGV5 zo8d8;XL25F>s3yBg<2G@zkd1qZ`;mFspK<>dWJ_1@t-^3^mtd&%N2dIV-{bWkmHxk zSKO&MEt%!m1nbG&^IvzXmIy73*P6QK*}HV0`l23hj$<`VSL*i5UpDd8=sNWE>FF8X zJR2ES>~mPRMEd&X=gJ{F=AKPk6t$LX%9%qZvwaQa`q%!sn4wZ|rNe1q!rx~_mKWca zt-a%;rrdUT;RA_z>P;S^c0hv9I0HZ%?D_`A>bnf(ka@{NuO$a=!ZHP6OX!eo;}a zl<1u?+hVkynml7#91vKO`Rv?``1|Xd?rTl$vXtOClDGYH_r{{mlg~fj`Ki2r$+>ff z-|hJ^qx1OVBD?waNj?4P{xy6LE;Y}Z?_77>fz!R%{}{F+>0Df^?kdd-14 z!_M`mnNE8>^*E=tGeXBn`DNu@ucbjkyJsHZS!X$I>Z!^Jd$@fZpC1VLJfB;;?7RG( zn7XDL;YZf+9^BOQWbx!D3-3IfP$E=!lKrIhgnf0BUVr`d@Yd8l<&$d~93OtyUnyT@ ze>!)vj##(Q{D6DH_gnp*+-Olbxu21}=wNJ8|3nMXmMBfUa5XD*dz9{O<1{{LyB}U>QZ**5IM}o_$n$j5uCUdS=P&tO{-e816r}&d z!E$cNJ(H%0hDPkT{8D1}SvG^~ZM^a|or+<{4w^39krW?jb;Xk9xxnLQeZwP@lntEx z)Mn5B>&hw1u|6KCYMP8AQ=jERnWne%J|}H{`$Nci4MSf)W6gVYkB}b*QoSKdg93w$ zte3^DUtPEVz0|zZPeXR!-BxQnv**>cYX*`i0RT$QFZs?V5QpL!dA{8YaAcjyQAoiW>X-CY;8{(4<AK*4;4kjpeDXBE1RM8#Q;#j<`}& znmG0HUnTSD^O?%D&3-!sgf-UOYP~bfTINLTgWBZAJz_6Dx5wy+^*>+t9p662D``O^w$#HJ`J}-c)8)V!gMD ash;8IXT@{HiOSue6zA#c=d#Wzp$PzH>qbKW literal 0 HcmV?d00001 diff --git a/util/source_icon/colorSucker.png b/util/source_icon/colorSucker.png deleted file mode 100755 index 06bc6d8fe04acff740e659fafd44a085061588b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 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 diff --git a/util/source_icon/colorsucker.png b/util/source_icon/colorsucker.png deleted file mode 100755 index 06bc6d8fe04acff740e659fafd44a085061588b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 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 diff --git a/util/source_icon/cursorCopy.png b/util/source_icon/cursorCopy.png deleted file mode 100755 index cb4f56956f838f8dec0e92f58d7914878672dca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4008 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%0AoPJ0fr1we&=#o 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 BP^tg` diff --git a/util/source_icon/handGrabbing.png b/util/source_icon/handGrabbing.png deleted file mode 100755 index 23e0b188165e780722392cdd5e3502803dfa918d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2691 zcma)8XE+-Q7fw*4*VY<|#w^#06&fp5HLFHLi*l<*BwAY$tr6v_U8`bUNwr34UHiHf zN>QUWmnPH-RT3qQ+TrS-?|Z&~-;ejaXa6|QInQ&F?QJdi&VtSY002HKOH<@2+y4YN z=c&vP`u^sWfT2hW6F|+dY$*i_=fSwKCGJaVbUsMkMt+ZrF^TMae1^R85#KQLS0K7IVsjV-2FEc1*J9qN zvxI)QTY9T0dNjgJJfXInp#}{X#9}%M<2i~KgQX=$f91hS(x1LWBc~=OCpCkYy8Zex zWrp+V9dYa~e%5%XPOaY#olJfkMyv17QEc7#{lotAZJlJ1F3G{3;x2jVY*sgQ&ruTl zWns&xv#8SF;bj-H`QATO^syHfdMZcxnqDDE6}Eq*?4w+p{rWx9CH3m5J*i^*x<~8( zRP$vqV&qtEZ1RHr=BJ&^lJ0?=Zzc5B%P{A%iX#(u<0y!{dfN1#5x}OP#rKkZ3~Fy{ zvC4)^`VhN9oD}0l`JgcxHgzHwp!qz8Ah=AD^=*HWaDcYkQI*%CC zjhneTQjs1RqoBv{&Q8u7L;};;*`%rZhj5dHER%QmV>f2bN>|&X-JmendT*-|{|29- zs=sdJ>xKHjBfoo(BEO9v)5#5_8nC@MA_^-G!`M4F`xP8Uxt{rA*Z#ohigF-^>Fl$FA%nQImn7R^}3(oqdPI%0#e!niyxxoPd5)xzI! zocuJ$dXS~d4=C8UJGEJ0th*HX{jh7K*-xgK~8r}=h4VYjy#5}%M}Y>Zbc+Ld^#yJrioxVpL)DegP|4yBR7 z$bBtaOlX+=KN--U6rvY2ofwG_l0K*1%Sc1hOcDu`Ckf{@U`Q{A z*>ZE?(0-S%Gf8BH=##~+C!0ptEooKvl9RBCa+rBIZPBp$H`$o#8-dn_T;C~atBQ9+ zwDjuwjmz1%VZUJWWRU2?n`;&5krMyq9}}f!sg5>Y;7b9#t0M$7f8IBOJW+-nMgj_C z#%mZy@iLOv4QHW~Du*GJAH_D@$gq1x$BEyOh0OW1mv%wn_N^3qb@;=iH7IU;0CDqBrAzS@UCED7v zCK;K!UDM4&O*pvy+7sk8n){_81>G;M{IP%f>OeabaZ7Ku?U9&R#sve>42Tg3Tk_~= zFL)AY8Pwwc zY}4JHkE&%!y`phL!~$`~%Nf@>4~DOkf9&2gSKakVMtEy*a&w#`8f8*m##*^K_;Nu| zSC{qs5bgYIP$k23C-;zC2k@4lprEwN0IrVrss7B@_^+GMHwOh~0nRDyRts@lEv2(u zxcuE%2kUL?Te-d*8;Y^GAp4Hw^o=CH;AT*Jn*d}pEhKy~3;6brnC)KDNzv{1^IAY* z7(ipdSj&{6LD94C5Ke6vk@(7LQktKa<}GG@lEUO}L?gG#Zl7K>oGV=-?<2wzAYR%@ zo)AmowD_YP^6~Itth83mVP*bq58jg@0Y$O#t?O-Zil9M?S>dJzEYzMyNCp?mv=VlEC&aX+qas$s@3dcax%~Nz%Lg}xA+(o>d697= zoIsK}NbYR$!##MBRyQPy|C~3tdk$02QyRDQcM57f7~I<9pLm|n>4`VSPvyPx6qS{e zn|ei2Vmp=>S=`|KG-9{;gtN5O|8r9hRYAp|!<&7_gLvG%HD&x`v8C#_|M{tSz1dEH Y4i*~=<>i+3KOaCVGh5Rdle>@q1&{U*DgXcg diff --git a/util/source_icon/handOpen.png b/util/source_icon/handOpen.png deleted file mode 100755 index 14b8255ecb35c84146e344cdd422db00aa85efbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3497 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 Uuy2K(`|~ED3``N_`u8IK1F=MqmjD0& diff --git a/util/source_icon/handPointing.png b/util/source_icon/handPointing.png deleted file mode 100755 index 784fe1d8bb97740ea3b95a8d82bcadcacf97b509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3091 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 diff --git a/util/source_icon/middleBinNorth.png b/util/source_icon/middleBinNorth.png deleted file mode 100755 index 824214ee55bb4c8ea8c63398ba6b00ce3c9b0fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2628 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 diff --git a/util/source_icon/middleBinNorthSouth.png b/util/source_icon/middleBinNorthSouth.png deleted file mode 100755 index 5ed9074b55b2a9654af8e19b6e71c48ebd863c52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3244 zcmYLMc{tQx7ymLE{jvpnBlk3VovEcEi9Og#sk$@=1Up-V0zlR-qF=od5t-!~lTkoZ)z_ zi1B~BW<{X?%g2gxv&NilI~}m8i=7`;**ppt%GeJ$cZs&XJrK52 zzo~0Ivmh?idgo*2-$U`?ru-0+9iN` zNny6R+`QY`{l|qXvvyfZgpk!i13_c{d^q`S37do9b_p_cb+p2uzrSDn_EuJ6#dh6t zNNqnM$tUx5J(xcdA^ub1r&xsf;UC{=Lfg>r@Vzn)&fpK_7}xY`%nqO{>{y(48jzma z8Q9uFjNez7|CH1&8@%<+=I2a14N^N@>!eM;);!+$0*1Yr((!DvYSMgJuaG%yh$#q` z=t%Nk=w=2UtW)q>p9<7Knemo;NcjwD)#YwYMRgobu+BuzFu|#-UKNkB?>HEqdl%2k zIQru1L%TQ#)DNQ@g>V}^AM=_|5Q~7<#-h**?+zvM!s`b3f|8NW6WjB=UB>U9PgFY` zJmX1jiBt^TT^9+$u>^k*rduyQOa>FY;X;f>WbwRaX`qc9-bL+BgQ_3?{L)g!kU%V} z)4{T9@dyTr3Q#)T`^nnse_0XsipVndJ#Gl`-r|RNz{TIxEfF})B_m|$!P1<;h8B~N z{O&k5DeBXT`cg`qpbZvlV*r@Y-sl${j&KAb=+`Xl!i3|^%*{cNXGzW2Xw{iL!>DWy z$VZf$Pkf&n#xrPm+2vr9{14Yf)~1IWUnO)M5kK$$m}-!9=}zt>g�xmKld!BLpR| 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 LCOXwxx1;|B%-118 diff --git a/util/source_icon/middleBinNorthSouthWestEast.png b/util/source_icon/middleBinNorthSouthWestEast.png deleted file mode 100755 index da7fdacc4b8cb7feeb3116f46d346eb9aeb63098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4564 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 diff --git a/util/source_icon/middleBinSouth.png b/util/source_icon/middleBinSouth.png deleted file mode 100755 index d6729e2dbaa257fc54a6683357dbf6750e67598b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 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 diff --git a/util/source_icon/middleBinSouthEast.png b/util/source_icon/middleBinSouthEast.png deleted file mode 100755 index 69cc75e94563e246a74fe5ebe3d996d8039a5a67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2916 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 QfB$ezZdw>r>$yGoH(Hc?qW}N^ diff --git a/util/source_icon/middleBinSouthWest.png b/util/source_icon/middleBinSouthWest.png deleted file mode 100755 index ad9c16eb9f964679c283a2e92cdf2b470f8beaaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2873 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 diff --git a/util/source_icon/middleBinWest.png b/util/source_icon/middleBinWest.png deleted file mode 100755 index 6471ef08e3f484e3820ed7e65153a728b160cecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2739 zcma)8cU05K7XAg?&h}x)L=kjVdHt{ym#JT@BMM-yLaZ!oI7Xce&>tESe=LPpWp`o0D?9} z*>Di^%Xq<@FxHjy0@QUZ`i7+?Aj|Q20Z^nnaOhVG$4+nz0J!r& z05=Cgzvl9|{=JIH1i=t6yZSR8CGlHYiI*)bG&EqOOGNtjpAARX# zqxLZs?js%_{V#ff6e4&Znwdxq3$xQN6{9>;T?HOqD*Vmls7dU(;=;r{?C&K7EPGo_ zA?tB%P^WqG#>V*4o_}rvbv&Saqn3eC^QNc~7e8cVEa}}OTt%ZTgdRj0qE4MYDipwmi$Txi~8si45vII$4Ys%d|jEx&`ANcbo&%R{Gj^_fE z$u{h3a3qi(L7B?A!^HZciASVCDI86Y%L(Kd|&B61j{;gB)%;m)e;W9wd9bdp;%^*|I1SFrJvwCtO2@?m}1p(5l-h zdllEJ;vLFsM`y|x3By{{in=Z#RYn&jxm`D++jOHwvn+B2m|bTghtSuTGhUddr{!uB z7hwULQlhla8qc1b)J%)Ue#_coXjDYW@|OH86t!+MwhF7I)`_qd;s-!VTJ z>B5(Z{hg)h(z3Fj0d{u7(Gut5n-o6n6u>-I)y#M1bF+;61F})z)mm}n03(S6@*EFSg3B#%Ki|R^LFN>U|BGE!AH zXzasSQ5|1XFyusPEW$uvirF<(X81OrY{TLdG;Jq(Y7DwxgaRWPXiabQx8Rjm`+@BS zG2=+Vb>jM1wSk(%V2NF6vf`Bn$%Tal3)`n7$Y-k8yN|9=bOM?4Gt7>IJlI2eJ#opc zH%ps3Th9dj>>V8XvoLtKiii~d)b=vgD=d3 zg?!}C!kU}ZmGIcUBlxBYml)rjMVe@(qoS+vjBypUI!GjP=JqB|?^-R%c}7jVvB%7L z3%t}BFPdq!+MBJrr0c(?WyHLeNcerJ=(A^}qOK52G@SFk!Tzk(VX0%sj!EhCEY#$x;LgcTSKvB3$L_2TtXKQ1R3yj1 zlwPu$gIH#P#CsDXH9CH)sAW}|t~m`aD;T7vSimsg*}^(2KS}**VfyOOYGYjBqxD?F zR^Y~xeJZ6Ydq|T2?kDVROm51BA(o45D(@fs6c$Y-j>|h%Nu95GT-UcwMx~7aVR?e66v0{4c zoA0$uam2B=?jeN^sMsXA8@#733`+yEKf`gcOm~qOsBHOTFsE^d1qAp?enP2}$RMSA zWq7`PP*nQFo$p__X~0yngSJUqXC>`Cei#?a?y=l$@fLjx^RfM`u*oR!iUCJ~SLHR< zhKes<1|sGY73Jj25m4XBV5G-TQN^IBj?aA8b^^k{>Z<3ZS(OKo(a}(u$_~{Wp9`5{ zg~Rt(SL=`{k-6~KQl8Q)c2-%+AXM-yqx;CniM__P$x#O~hX}|?y_p5#4cXt%UE6E# za~vJz&}+F{)w`%Il1G_OJ}gKBnnxP9u=Os6=?aF_wL%KIlnorI2qx=o-_rC z%;hB3v(@RNKTK`wN#Ax2xB$PfDg?~dVKl08f9vd%nnwTi*(TJxUCOIP6%b&2^b>Uy zvli_s8>Ysi<9~yqA8CY~Y5c)v1shvqbAkAjjlOhS2XQv#)|=(X+as?7r)NHt@=tXO zMKT;o*6c8{Gv&U*$!RDHTCuCA-sgD2oZtC)yQdbh*9>9%o=?=MA%WMcMdI5ghiL?P zoHmM|Z8auWY`-DQs)uT04|1D`v+dE=^OzNA6{v4+Ij^*F_g3|9NcPO!9bb1Aj~!5= z6wU%ed&hVysD?nM6r(QNcCh~~?cjEK?cX^UUs;id)^B*%5+=<^UTI6t^ylp+lZ|_? zu@$pk40`#yGnW%gj+i8HSy5z9{Zxv;3Y#t-$W^zL%Y01ylaZko$Q0)V59a+%PO0{) zALqVT)BG(@0m>8Qkp$v01O&7LR|f=IpOa!9$z&GOTTYt!_7>9q$m$V;!|OqZfT%FS z(=*24e!P)0EEGK8(wcqb0Zv{lv+_MUWWPiD5zi4Qx0LwJ!PJZ>kTO>ISTe|jN7cLc zGC|K1N3VetG!I;-KS#u?eJCwiNah)}jUn9Z4Wk;*%qs}2H^wnu=XSRFgZoc`o>5in zT3?bMsGT1vpr*LTU#NxDpXJm3mpJ&!Eza+aP?qcRcwDdiH9#Gr$A^>f764$5mS$(|Z-T22-=}Ar%P{<;HugB;B;^Q+$7)2-{+LGB z7Ae#OCUUJnvj2gUIrneo zi|DB0*3%B}bsXFs$aTNiC6el)lR9A z)|_K5sK$Q`uKqbT6oK!H%Rizw$?hQt*=wGUuCBPxM|=tNqom0BbCvkZx*_@8#PxR>n6Dt+8;?6B%u3vXEB$I)(Uz-EpLQq-A3}kLzX3k`D7%8^N^{?3& zSfO3nuP_0BHNAgAhn2-DVs-2%M`g%ZTNKU;k1UP@M@BiAYM;0b!Q!HS+1+{sO&g1i zbzEH`d^O%nG7ArQ9cdxmH6@UR_o9Q0o+mlJ(={+K(8XZJa{N8Kz2|()iH!)=ATfK{ zEYb* zz;$shO29+7s#aD<0s>H@Ew2o}nyiDO0r`tY%POzYWLb|^CLmtC4z#G_Dj*x}R?=WU zcjADm4Zc z)9sHtiHfLSEuCMyXtfR_o=V-ynn>Q=d@8wCnaX)mON^}*0g5&vrV2QP)Rfx$zRMkh^Z zbSlisRZoQ7v$?51f4{H9*7nTnf;X+v+nC090U)%}yjEv%Zn za495?TCG)a`egd4sY~T0B_-HTqdQMVIf8ulw~Tsg;$_Qrjy`Sna-#W_dFgGZ?BSWN zqJ3VRab}9#mGZ`&LM5DdaL4?I+}2ddqZm~Cb7;$8F}h4e7Ae*i(_If7go4Q%t{l#s zA?2hx=58hX4E!GWicM6EmXhvbxMwnEg2^jMqVr{CWx);%pP|9*b*qK8BDWE})RrMS zhh5#3llfK@t`6ZT+0oidQx&ZBto~dlaod`jnp%6CLKpU(kjNcZ3(T~#(^-QnGa_+b zO?~VqT%6Z99QoKwosK%R@q96+e_c4%HejEK=RUESnmN;=!?$sc5)#K*t5YB(ajy%G zZU~qnub0i@kYPaLBkIB%dm6S70T>^!{p|6WspEr72B;QJwT*w|Eb!N@c1#*T?Gvw` z`t8Y5xEo+dV1~Kn4+XGgA9-=MkWa+I zLbZbQ7*8`am_9txKN8Pf^Z5{o!r#eSEM^h|2$l b1ci>R>`KJHzU{s9yJ{`XZOp1nJmUTa(xs#% diff --git a/util/source_icon/northEastSouthWest.png b/util/source_icon/northEastSouthWest.png deleted file mode 100755 index 4687ca51c07a8a8411e74948f10e114dc8f31370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2751 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 diff --git a/util/source_icon/northSouth.png b/util/source_icon/northSouth.png deleted file mode 100755 index bf456de72c5f2370897fdec1ca231e9e33f38823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2391 zcmV-d38?moP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91Pyhe`05RZ9PXGW2!AV3xRCodHn@f)sRSB~@fA!=OfV+!lURTW8#ZJX1OjYiff1Mf1?Rz7U(?^E zrl-5_h-d|c<- z8Yi0ej<_fnS%r5fmik)gk=wU#e;d>ac<0WY+dxZMqmMD=SmyjMAkG5saKJcv^XAR( zGQ4Qxp4$YGF^mmm&Yp)j4c^NEfn)jRjT<+K40iWo6}F04%=S#VT6i%-Zj9#&^td7gnFjy&U7NKMnn1Nf-sBFc)Ky%L@w& z$D^%P_V3r#gJHqEbv&J`tE+!6E-ro+#g$Um!lM2KMr_u*N;h89P;Q@@r3d)_To#jdqK0A+HmKEQ|5@Iw>gj_n6J^-4aJAj1< zhy_-q3bWc@t>@!wxeg+6h1fYblj;*7F-)9=Al5Al7R&DAC{GhU1b|`Lh1pU@2Z0xH zipw3_l>i7B85F+V36xo&0yN=yyzOhULK33Zc4BeN$)T$Ftma1B+%nV-BtaLGcUgwV z6Pkrj6UG2ZU>P8N!o!a-Dfc3M0wj5Nqh%Js;t}Bi!ly70r-|?Y#ay9b=@S}O$z|I* zv3&r{uuMFIG;tQpv1QR&?QgPqEM)=acIO(usc!q+whw?LlM@%7NwQGe7)KqeMzK{K zS2tH**#YBvlfD4vgsTh4@a)4{&U2f}dAw!kYn$eF+RhOgWg7%WfZKq_)FFy?Nc~GZ} z?M(Urn3K!kEVFRpvT$rx`lgBVnOFVS2mdlbgqQ7uo{s-Z5?zX)cD5OuJ5Ff))6KFw zYFa*y6QGcs$4(TiZHyt0Z0*~Y?HXWCCPQS=b?^X~AZ1&rb@q)vb5&DwJR$h$ES zvr_?H6(CPS-jwo{-nXLscIbzfFJJy;9*7wpKJZog#5XT*63e%<_z-)03Wx7bB?IIl z=jqEG#0!u7za1Q{qoF54-w*xx(xpph9|dBD$6S1rzVL}}Vi1d%#3qO00T$N$qPTN~ zBzY2|)ni=Ug&)M2PcB@z@Y^g9Gd$)nHxwW2=)C*tjxYI;+m07MWxq}Uk)6O@IC)Do z%Ev>ww>}CzJq=Xoz#fv}19|-VR}EZYy7^(-Iebz^5Y-S{Ed%4 zRjDgcUM=hN`8PoSX&6m~Q14Ahv~OVnLUb_zsS169zydkXV~+5$bq@XbFh&$Nm8o|w zLjWXc7L{SpR)xqI+5iHeI)K8e+Q$Mfax9Jtb_i*MC_Djjv_0j1Ru8mJE@COBBYGEk07S*2T;lpQA&EYJ|a*=JkP zIn;klaHx1WPL6H4YV&x?!m8TbSDn*q-GqA$(&D@tzo{-TT}`Vyu6J8axc7h!0p`u4 z3bMg{f6enI-d{!!JU8X_*n#!E@X`NBU?eaS7zvC7Mgp@E_zwh7?Z-X3hY|n)002ov JPDHLkV1mEiWJv%3 diff --git a/util/source_icon/northWest.png b/util/source_icon/northWest.png deleted file mode 100755 index 285e87bb2a97482a8cbb940962dba9a8b554a97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1956 zcmai#X*|>m7svm9TXtjVqOnYq#wBxIjdDpD8q9)`ESKzivXm(`GMPzXY(v><%y6?t zB_pORql+dHS(4mJ$ktV+QTF9N_6QeM0-0!VVPw*emXX?+$In2_Ibp^lD#p(vLIz?9Q~#EwOzJt6^scnJuI ziwN%YO2qy(gm;uv;cp%{&l7G;&AfEI3QU52lh}VEJ#i4Pk{3c zNUkW8PLHEzQi6QlroD22TaP6*>`Nw=YUER;K8KfS+xZ!_r;k%pG;i-4+FBTHT;pP? z?06ka3D_U#tyXYwOP*ocjtcH5?fbM@2^?ayXD}sXvvmsCIr&&)+?nNt56z$WnNU>} z3N_?{I!yUK(pxmJ0Y07S2)cC?Y zX={C{ZOT|otN((;T$k&)HNK;I6c2RS^jL19(P$nTRc&o;m0T`2;Okf`bKxk3LLnN^ z39T+X$Q3Ob<8$a^T>jfwnX|P=GIAMaR<)bozCCOvvdl>{L2H*zco`ivFwwbel=$<^ zxK#<~Lx=+#YVve8ul7qK-i%3I{C;&NPI>GJX_n`>{pWLOWwd!-Fkr0Fba{ai3+ox^EVG1j{ZvJZU>@zA*LMg6E!2xxcdd6xEuaBiT~YPUpA zM|$0@q+;b!uR_0=Yz`|#stebpk6;hH-9`TDr71F35{tKemx}H&omdtP^|q-=iyg62 z@ZuqASK3_K#Smc8QVM;{gsfR_hEy-?zW6jJN4dVJ>Fh+iM>VuMZ75zF&7`h2u1Dv; zAtbqMz8^mHQBI*>S551>7J?A{k+;Qt0fr|eY?AU+kv|bwTd}DODFvHN+pR_%Q*W$Q z*um|3us;5DTcx0`G`qZIu9L3%PG4XDAGNN5o&sZmvu2Nc-AiTivIF&jMdJ3RSti;t zcB<>u-(0tNM|gE>?swmn7WHb+*+P($LAP1ffpL_Cq3xNXYy5dLHq+alZGm=Q?j0By zNQT8~+!chrI5B6oTX21}1LJt)IUJ3MNG-Z%6xNyfySMn;$=ejwY@^FC-us_BZ|V~l zT&>tjyY?rH%e5WL@!YQsrI8`#uBmpNj|dtPFJTnYcisZ9!)~0CI@;_CK zkBsI?2v~xYtIRnAyplZktejB5dzs$3noJT-K4VO!P;!sc!x7b^2eoM3aSToWR?TJ~ zWUA#1#I1+V=ktEW-091)A04jousR9VN!hfRRV}n~@DO|5G8;v*o-&n`RT?9JA*uMf zyL398ShMt~l;ZotgnzZs3qsdhMk%V_IVa3J;1T!!2`NlowEowQ2=ku9a>jOk0e~E- zOh!G5%?!8^zm{Vmi07}UM{U;ypRgOd(CxlhhGgoGa!PM#UAp2_-w(H}0Q8K+P`{0s zw~lb0`4R8gnw7_`Xa(Ia2vbQ$she^Qf(O~yy?yxeDzlykbW<4F5z|2%72hN8eF#+c zZZ)?Lk7jzzG*t}QA%=gz_Ma~jv=C_S?OS>UbTm9$T2Jg>;QR|M5rjS}h2lGkN_IXZ N&ejR@z{daTe*lyMaXA10 diff --git a/util/source_icon/northWestSouthEast.png b/util/source_icon/northWestSouthEast.png deleted file mode 100755 index c55b7f0d6dcd5d938c05c26ffa888cfb37b3975a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2684 zcmZWrc|6mP8~@BPb4>2cIV05YC6h0fBDYS(pOlLo$qm!2GHs+Uxvz;Mjo=0YLYB0j@tS2aq}d0C47l0L}vj{mJEW z{HKb^<@~Szr%~&p^#uUnT}7LlTq1zJJa$R2ABXkAu(cB<*XuUqhKyys;m+jy8zN73 zUOw!0v6J`1)m^7_Z{;dv+z~hjS%{C(HEmRO75zx!k|QcpSXf95=Kl8=@u%;q55#`o zpBai`HyQ2@%+m*&Mp{#iu6?PaZ8WssbQ9FR?hLc!I6_J_M&~MFL{xbnas5x|Y?15D z*Zj^;5ovTY6A$CAVQb&l)on>Zzhd^#OM~X8BvbLU2g6!lHq{?4nLh}UV-}1>h8P%n zcL_s$jl8>cn4x+tSvxpwY5&n=vO4FI-Ydqt6?89Fh-%|5f1%f4w07aRWxcNF`J#y; zSCyW8(isEA{2Yt6ex#l-f(+p!*is%C`*sA&rqS4%;u1bS)LObE0lb#Qo2qP%HISCv z&RZI$*7lx?UaB|Uja1#(?~f7S!Rn%oQX-Y-0{4Dx)6QC0>}yXLOTu8=v}|o}iQ?Ah zRt@NebGlZocC`ULqZ626pa>7kSD8Q(+^wIV{@r%gyC9_Psow2X(>iT6k9ft@G971} zOWDZR{3>xlAo-S=Y^pDWOOOK%AujERJb)~`DnjmgBsRz z4IO+d0-Khu_GdKh^c7z$oWCT!X&H)curf+tdl;D~&8%vP1})Z?MwHryT3Xi+b3Gb@ zCRHCL$d6_OwXY)?f{ZxMzSYkBESa=$z8o#MAJkl`wncQay_XK5k?tL1}1SQFa_~iAfbu@(Sr{^vcU60CzqyrWUypax`RZZ*MRErmRz(#uds|om`Rp z4EeIPlTq5&X(6{P*{w_wX^4hy1(|y&OAGJMoG3$!%RXzLtMura@xzm1xGyVB7evUv zikP>KIw{V0hJnH#L}(DJ4P0zR3Kecl*D|1WD2GpJpWn#f9Xa>gK^pFD;r{fY9K5k; z0`GUq^_hCA$jXpIz5f)ud44!$a_Y4#ev9mOEp}W@$f^@}+)a`o_&5CPbR82_r)!0~ zi_60`v1~ry4RSEG=JdRUq8WF!ME>4cW3gCKplr^?6~j9}DKG2gA4RGMx;ES6bd$MBExbh;xl;(=EuslW{-Q?g{%kF+4_AE4nc_wvU!v5#kmw*m z-m@O*Rv!#uSZCmH{^3kDC$@<&nMY8DfZhm47V{wRNhM&%GtQ!;K(-K5j5$uV*LahL z)S$I|u!@qT{XjaDhZjPqzjrtPvYRsyQdBK;(pIPIC2881Zj+Ll-UTAheTemTZw=c> zEfeZLMPPj_Jk|?c3LU*TIyS03TJzeWVvi|ivJUM|Cd2URw#rajr@=$Q@D_xTa)A5! zkj1WhhxWIp>#n);E;~eTwz26CuaR&}t%B#t&zx(#24~VtX4@j}u+Ilko1S{aCv>$t z)^x&iohfFKtA+tH9Kyt)0l4JJ2Cfq#k(iIO6Dq&Ye#!(NiIjxbpHv!7lS=`b1Lm58 zZ!(l`!7QCxZiCH-$Z85Qfh=&(-N|BMU$%O?_5ft0ymWC83O+{{h{=&eE{_g7L(C`4 zjECe7`(A=Qq^p88;ZaD#dB8mBWVrDSB>4~@21nOw+Zuvb_34;jMd_{=ZP!X`W7R+o zUZzj^omj%V`qzZ5+)%g1fQ8_u zz4ijDgH_tiV-tB@PaA-VDpTp%E@O8=(}~w(1@3oh5tK!`Jr}82YH40<$D=p)$m@=_ z<8K>g@QF~fS<2r(p8qrC>dT_Wi^{{~=(a0U5OmGinuYJ6?c4;F z<|?@-(ufX7iU~FmlGQg%r8E$FJF0++9H_~oJ6EO}1DB*Nl4Q1(pcf*{i4kF5vOVcl zZ)&BHueTNW5ffQQO2@0map_RAe^6SW{KUl>Kh{4MTz!w9>}4k$8pzTlXK-;Uy&6+B zLnLi8biP&fy@jvpFG?cvKiB)63UtTu6v(G~p-W>Oqg;7l__LAA$SlDML^&p0omkZA}uH;b_OWLPwIs2FUMeMyeoULcL(k)!VB{`RMI$lkT zqAV*y1-{5?aTs_D~9?J7*NKdEbk5oL;FBz1?^d z0+)DS-a&~EgKG4|I=gZn`E^Br3YM56hyFoeW^-U@A|7~ z@mqHndWZ#BEt%BAYc$3Yjttk~>JtL#R;3y}NBOC-dZ8!$Nq%`>6!_r{T*`gU_9@^R z!M9v-&`|<2Nt#uiTFF`3gjV zwz*C`+)L4fs59_{oAtc4wbi=$MQ+|O&5y2!VjD3Y>nK63<{6}~Mp%bi><;WHg-Je` z71!hZhw?^y#qcYBp1JzrQMcFEMhg78DuJt@^74I+mBvc@!?ge{b5)Sukb@;Jd<8C?1RKMQI z&e|0GIy~I8Xv5LRMKob~5_wK4GmWprWY!6c#4U(QKQ-Ag6hhO)^||4qmAffFm;3OG zL-^_gz2s4dZ?#l=pdSMnfy=hIWgdKDQq(DKtjw*aVxk+`ECE6C2%G4W9Afops+pW( z6o+r8z1}IU90R6BvLriMWYFp_NW!f+i)n=klqxPtjNWvCh7@yPHext0UYcAYYcW(^ zp8i;yUK#7s6zh#UqgM#cGRVAbeWg4ZMRZLsti;IN8ym;bM}n*@DmVq|>0@8h2}ONcp`OmOumBeZFz!rQn>x}pXj!nE(I) diff --git a/util/source_icon/resizeLeftRight.png b/util/source_icon/resizeLeftRight.png deleted file mode 100755 index 00baa2e6152d1cb24ff00ffe2be0e0d193cf1bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2950 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 diff --git a/util/source_icon/screenshotCursor.png b/util/source_icon/screenshotCursor.png deleted file mode 100755 index cb23fd38408337f47d0bbfba58aab93fb13a8d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 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 Nf84{l_E=ELzX8DZv>*Tg diff --git a/util/source_icon/textCursor.png b/util/source_icon/textCursor.png deleted file mode 100755 index 738d2c07c2aaf78ec63347c1edc540bae791703b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 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 -- Gitee From b7ab728c4011c4c2092d419d4fc83e56884f6d6f Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 15 Aug 2022 07:40:44 +0000 Subject: [PATCH 09/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I0460b8b957292ebfef667b5b88fd23a2797f7111 --- frameworks/napi/pointer/src/js_pointer_manager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/frameworks/napi/pointer/src/js_pointer_manager.cpp b/frameworks/napi/pointer/src/js_pointer_manager.cpp index 09d7b3d3ee..dd21e3b16b 100755 --- a/frameworks/napi/pointer/src/js_pointer_manager.cpp +++ b/frameworks/napi/pointer/src/js_pointer_manager.cpp @@ -244,7 +244,6 @@ napi_value JsPointerManager::SetPointerStyle(napi_env env, int windowid, int poi THROWERR(env, "create AsyncContext failed"); return nullptr; } - MMI_HILOGE("SetPointerStyle windowid:%{public}d, pointerStyle:%{public}d", windowid, pointerStyle); asyncContext->errorCode = InputManager::GetInstance()->SetPointerStyle(windowid, pointerStyle); asyncContext->reserve << ReturnType::VOID; @@ -267,7 +266,6 @@ napi_value JsPointerManager::GetPointerStyle(napi_env env, int windowid, napi_va THROWERR(env, "create AsyncContext failed"); return nullptr; } - MMI_HILOGE("GetPointerStyle windowid:%{public}d", windowid); int pointerStyle = 0; asyncContext->errorCode = InputManager::GetInstance()->GetPointerStyle(windowid, pointerStyle); asyncContext->reserve << ReturnType::NUMBER << pointerStyle; -- Gitee From 655bb303dac06f03c77edf9c0351185f58b75a44 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 15 Aug 2022 07:57:07 +0000 Subject: [PATCH 10/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Ib6b12414bbc7aa35c1acae872f6506ddaed221fa --- frameworks/napi/pointer/src/js_pointer_context.cpp | 7 ++++--- frameworks/napi/pointer/src/js_pointer_manager.cpp | 1 - .../proxy/event_handler/include/input_manager_impl.h | 1 - service/window_manager/src/pointer_drawing_manager.cpp | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/frameworks/napi/pointer/src/js_pointer_context.cpp b/frameworks/napi/pointer/src/js_pointer_context.cpp index d8a40d14f4..05ebb2be40 100755 --- a/frameworks/napi/pointer/src/js_pointer_context.cpp +++ b/frameworks/napi/pointer/src/js_pointer_context.cpp @@ -368,7 +368,8 @@ napi_value JsPointerContext::CreatePointerStyle(napi_env env, napi_value exports napi_value middle_btn_south_west = nullptr; CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST, &middle_btn_south_west), CREATE_INT32); napi_value middle_btn_north_south_west_east = nullptr; - CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST, &middle_btn_north_south_west_east), CREATE_INT32); + CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST, + &middle_btn_north_south_west_east), CREATE_INT32); napi_property_descriptor desc[] = { DECLARE_NAPI_STATIC_PROPERTY("DEFAULT", defaults), @@ -442,11 +443,11 @@ napi_value JsPointerContext::Export(napi_env env, napi_value exports) DECLARE_NAPI_STATIC_FUNCTION("isPointerVisible", IsPointerVisible), DECLARE_NAPI_STATIC_FUNCTION("setPointerSpeed", SetPointerSpeed), DECLARE_NAPI_STATIC_FUNCTION("getPointerSpeed", GetPointerSpeed), - DECLARE_NAPI_STATIC_FUNCTION("setPointerStyle", SetPointerStyle), + DECLARE_NAPI_STATIC_FUNCTION("setPointerStyle", SetPointerStyle), DECLARE_NAPI_STATIC_FUNCTION("getPointerStyle", GetPointerStyle), }; CHKRP(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc), DEFINE_PROPERTIES); - if(CreatePointerStyle(env, exports) == nullptr) { + if (CreatePointerStyle(env, exports) == nullptr) { THROWERR(env, "Failed to create pointer style"); return nullptr; } diff --git a/frameworks/napi/pointer/src/js_pointer_manager.cpp b/frameworks/napi/pointer/src/js_pointer_manager.cpp index dd21e3b16b..c10591f21e 100755 --- a/frameworks/napi/pointer/src/js_pointer_manager.cpp +++ b/frameworks/napi/pointer/src/js_pointer_manager.cpp @@ -279,6 +279,5 @@ napi_value JsPointerManager::GetPointerStyle(napi_env env, int windowid, napi_va AsyncCallbackWork(asyncContext); return promise; } - } // namespace MMI } // namespace OHOS \ No newline at end of file diff --git a/frameworks/proxy/event_handler/include/input_manager_impl.h b/frameworks/proxy/event_handler/include/input_manager_impl.h index 37756a1ee7..0d376e2c00 100755 --- a/frameworks/proxy/event_handler/include/input_manager_impl.h +++ b/frameworks/proxy/event_handler/include/input_manager_impl.h @@ -66,7 +66,6 @@ public: void SetWindowInputEventConsumer(std::shared_ptr inputEventConsumer, std::shared_ptr eventHandler); - #ifdef OHOS_BUILD_ENABLE_KEYBOARD void OnKeyEvent(std::shared_ptr keyEvent); #endif // OHOS_BUILD_ENABLE_KEYBOARD diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index e24f7a7151..9b034c5635 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -501,8 +501,8 @@ void PointerDrawingManager::InitStyle() {MIDDLE_BTN_SOUTH_WEST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_SW_Center.png"}}, {MIDDLE_BTN_NORTH_SOUTH_WEST_EAST, {ANGLE_CENTER, IMAGE_POINTER_DEFAULT_PATH + "MiddleBin_NSWE_Center.png"}}, }; - for (auto iter = mouseIcons_.begin(); iter != mouseIcons_.end(); ) { - if((ReadCursorStyleFile(iter->second.iconPath)) != RET_OK) { + for (auto iter = mouseIcons_.begin(); iter != mouseIcons_.end();) { + if ((ReadCursorStyleFile(iter->second.iconPath)) != RET_OK) { iter = mouseIcons_.erase(iter); continue; } -- Gitee From 33cc86b07e3d67af2e0e2c8ab34eec904710a9e7 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 15 Aug 2022 07:59:38 +0000 Subject: [PATCH 11/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Ic1c8e46aa68ae251b94c248fbdbfd420a9c3136a --- service/BUILD.gn | 89 +++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/service/BUILD.gn b/service/BUILD.gn index e17e6926de..fe94ad0e1d 100755 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -142,21 +142,24 @@ ohos_prebuilt_etc("drawing_pointer_image_West_Center") { } ohos_prebuilt_etc("drawing_pointer_image_South_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/South_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/South_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_North_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/North_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/North_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_WestEast_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/WestEast_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/WestEast_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -170,28 +173,32 @@ ohos_prebuilt_etc("drawing_pointer_image_NorthSouth_Center") { } ohos_prebuilt_etc("drawing_pointer_image_NorthEast_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/NorthEast_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/NorthEast_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_NorthWest_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/NorthWest_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/NorthWest_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_SouthEast_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/SouthEast_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/SouthEast_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_SouthWest_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/SouthWest_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/SouthWest_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -212,7 +219,8 @@ ohos_prebuilt_etc("drawing_pointer_image_NWSE_Center") { } ohos_prebuilt_etc("drawing_pointer_image_Cross_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/Cross_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/Cross_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -233,7 +241,8 @@ ohos_prebuilt_etc("drawing_pointer_image_Forbid_NW") { } ohos_prebuilt_etc("drawing_pointer_image_Colorsucker_SW") { - source = "//foundation/multimodalinput/input/util/source_icon/Colorsucker_SW.png" + source = + "//foundation/multimodalinput/input/util/source_icon/Colorsucker_SW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -247,14 +256,16 @@ ohos_prebuilt_etc("drawing_pointer_image_HandGrabbing_Center") { } ohos_prebuilt_etc("drawing_pointer_image_HandOpen_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/HandOpen_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/HandOpen_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_HandPointing_NW") { - source = "//foundation/multimodalinput/input/util/source_icon/HandPointing_NW.png" + source = + "//foundation/multimodalinput/input/util/source_icon/HandPointing_NW.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -310,14 +321,16 @@ ohos_prebuilt_etc("drawing_pointer_image_TextCursor_Center") { } ohos_prebuilt_etc("drawing_pointer_image_ZoomIn_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/ZoomIn_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/ZoomIn_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" } ohos_prebuilt_etc("drawing_pointer_image_ZoomOut_Center") { - source = "//foundation/multimodalinput/input/util/source_icon/ZoomOut_Center.png" + source = + "//foundation/multimodalinput/input/util/source_icon/ZoomOut_Center.png" part_name = "input" subsystem_name = "multimodalinput" relative_install_dir = "multimodalinput/mouse_icon" @@ -465,45 +478,45 @@ ohos_shared_library("libmmi-server") { configs = [ ":libmmi_server_config" ] deps = [ - ":drawing_pointer_image_HandPointing_NW", - ":drawing_pointer_image_MiddleBin_North_Center", - ":drawing_pointer_image_North_Center", - ":drawing_pointer_image_MiddleBin_South_Center", - ":drawing_pointer_image_South_Center", - ":drawing_pointer_image_MiddleBin_West_Center", - ":drawing_pointer_image_West_Center", - ":drawing_pointer_image_MiddleBin_East_Center", - ":drawing_pointer_image_East_Center", - ":drawing_pointer_image_Default_NW", - ":drawing_pointer_image_Copy_NW", - ":drawing_pointer_image_Forbid_NW", - ":drawing_pointer_image_Help_NW", - ":drawing_pointer_image_MiddleBin_NW_Center", - ":drawing_pointer_image_NorthWest_Center", - ":drawing_pointer_image_ZoomIn_Center", - ":drawing_pointer_image_ZoomOut_Center", - ":drawing_pointer_image_MiddleBin_NE_Center", - ":drawing_pointer_image_NorthEast_Center", - ":drawing_pointer_image_MiddleBin_SW_Center", - ":drawing_pointer_image_SouthWest_Center", ":drawing_pointer_image_Colorsucker_SW", - ":drawing_pointer_image_MiddleBin_SE_Center", - ":drawing_pointer_image_SouthEast_Center", + ":drawing_pointer_image_Copy_NW", ":drawing_pointer_image_Cross_Center", + ":drawing_pointer_image_Default_NW", + ":drawing_pointer_image_East_Center", + ":drawing_pointer_image_Forbid_NW", ":drawing_pointer_image_HandGrabbing_Center", ":drawing_pointer_image_HandOpen_Center", - ":drawing_pointer_image_MiddleBin_NS_Center", + ":drawing_pointer_image_HandPointing_NW", + ":drawing_pointer_image_Help_NW", + ":drawing_pointer_image_MiddleBin_East_Center", + ":drawing_pointer_image_MiddleBin_NE_Center", ":drawing_pointer_image_MiddleBin_NSWE_Center", + ":drawing_pointer_image_MiddleBin_NS_Center", + ":drawing_pointer_image_MiddleBin_NW_Center", + ":drawing_pointer_image_MiddleBin_North_Center", + ":drawing_pointer_image_MiddleBin_SE_Center", + ":drawing_pointer_image_MiddleBin_SW_Center", + ":drawing_pointer_image_MiddleBin_South_Center", + ":drawing_pointer_image_MiddleBin_West_Center", ":drawing_pointer_image_Move_Center", ":drawing_pointer_image_NESW_Center", - ":drawing_pointer_image_NorthSouth_Center", ":drawing_pointer_image_NWSE_Center", + ":drawing_pointer_image_NorthEast_Center", + ":drawing_pointer_image_NorthSouth_Center", + ":drawing_pointer_image_NorthWest_Center", + ":drawing_pointer_image_North_Center", ":drawing_pointer_image_ResizeLeftRight_Center", ":drawing_pointer_image_ResizeUpDown_Center", ":drawing_pointer_image_ScreenshotCross_Center", ":drawing_pointer_image_ScreenshotCursor_Center", + ":drawing_pointer_image_SouthEast_Center", + ":drawing_pointer_image_SouthWest_Center", + ":drawing_pointer_image_South_Center", ":drawing_pointer_image_TextCursor_Center", ":drawing_pointer_image_WestEast_Center", + ":drawing_pointer_image_West_Center", + ":drawing_pointer_image_ZoomIn_Center", + ":drawing_pointer_image_ZoomOut_Center", ":mmi_device_config.ini", ":multimodalinput_config_ability.json", "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", -- Gitee From 3aadc65ea8c23ca69ae713c7d8f09f9a033f369a Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 15 Aug 2022 08:08:02 +0000 Subject: [PATCH 12/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I4663bf477fc779465787584951d22e0f497a8631 --- frameworks/napi/pointer/src/js_pointer_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/napi/pointer/src/js_pointer_manager.cpp b/frameworks/napi/pointer/src/js_pointer_manager.cpp index c10591f21e..6813cd3f96 100755 --- a/frameworks/napi/pointer/src/js_pointer_manager.cpp +++ b/frameworks/napi/pointer/src/js_pointer_manager.cpp @@ -241,7 +241,7 @@ napi_value JsPointerManager::SetPointerStyle(napi_env env, int windowid, int poi CALL_DEBUG_ENTER; sptr asyncContext = new (std::nothrow) AsyncContext(env); if (asyncContext == nullptr) { - THROWERR(env, "create AsyncContext failed"); + THROWERR(env, "Create AsyncContext failed"); return nullptr; } asyncContext->errorCode = InputManager::GetInstance()->SetPointerStyle(windowid, pointerStyle); @@ -263,7 +263,7 @@ napi_value JsPointerManager::GetPointerStyle(napi_env env, int windowid, napi_va CALL_DEBUG_ENTER; sptr asyncContext = new (std::nothrow) AsyncContext(env); if (asyncContext == nullptr) { - THROWERR(env, "create AsyncContext failed"); + THROWERR(env, "Create AsyncContext failed"); return nullptr; } int pointerStyle = 0; -- Gitee From 5b757cc9605babfad00d400e82977b2b656d7896 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Mon, 15 Aug 2022 08:25:52 +0000 Subject: [PATCH 13/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I7961562bffa383abe7c07bcbb50efddf7b401fbd --- service/window_manager/include/i_pointer_drawing_manager.h | 1 - 1 file changed, 1 deletion(-) diff --git a/service/window_manager/include/i_pointer_drawing_manager.h b/service/window_manager/include/i_pointer_drawing_manager.h index 28ae408ec7..ef30852513 100755 --- a/service/window_manager/include/i_pointer_drawing_manager.h +++ b/service/window_manager/include/i_pointer_drawing_manager.h @@ -17,7 +17,6 @@ #define I_POINTER_DRAWING_MANAGER_H #include -#include "struct_multimodal.h" #include "display_info.h" #include "struct_multimodal.h" -- Gitee From 3c647eed307f37c5f8c8c0170448f3deb4f8ab84 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Tue, 16 Aug 2022 07:54:14 +0000 Subject: [PATCH 14/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I5a82d5a3ba9bf139d48570a191e956b3d905cdbb --- service/window_manager/include/pointer_drawing_manager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index 7353980a1e..a875a07f36 100755 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -53,8 +53,8 @@ public: void AdjustMouseFocus(ICON_TYPE iconType, int32_t &physicalX, int32_t &physicalY); public: - static const int32_t IMAGE_WIDTH = 48; - static const int32_t IMAGE_HEIGHT = 48; + static const int32_t IMAGE_WIDTH = 64; + static const int32_t IMAGE_HEIGHT = 64; private: void CreatePointerWindow(int32_t displayId, int32_t physicalX, int32_t physicalY); -- Gitee From 53ec4a6701af5a415c14b7fbce491edbff4cb814 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Tue, 16 Aug 2022 12:29:11 +0000 Subject: [PATCH 15/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I091d7d86289e5a617209c6f91c5627a5c8cc1ff9 --- frameworks/proxy/events/src/input_manager.cpp | 8 ----- .../include/input_windows_manager.h | 12 +++---- .../include/pointer_drawing_manager.h | 26 +++++++-------- .../src/input_windows_manager.cpp | 32 +++++++++---------- .../src/pointer_drawing_manager.cpp | 17 ++++------ 5 files changed, 40 insertions(+), 55 deletions(-) diff --git a/frameworks/proxy/events/src/input_manager.cpp b/frameworks/proxy/events/src/input_manager.cpp index c03d5fcc4b..05f6286d08 100755 --- a/frameworks/proxy/events/src/input_manager.cpp +++ b/frameworks/proxy/events/src/input_manager.cpp @@ -179,19 +179,11 @@ void InputManager::SetAnrObserver(std::shared_ptr observer) int32_t InputManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle) { - if (windowId < 0 || pointerStyle < 0) { - MMI_HILOGE("Parameter passing error"); - return RET_ERR; - } return InputMgrImpl->SetPointerStyle(windowId, pointerStyle); } int32_t InputManager::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) { - if (windowId < 0) { - MMI_HILOGE("Parameter passing error"); - return RET_ERR; - } return InputMgrImpl->GetPointerStyle(windowId, pointerStyle); } diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h index e061ff593e..40678a8aa1 100755 --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -37,7 +37,7 @@ struct MouseLocation { class InputWindowsManager : public DelayedSingleton { public: InputWindowsManager(); - virtual ~InputWindowsManager(); + virtual ~InputWindowsManager() = default; DISALLOW_COPY_AND_MOVE(InputWindowsManager); void Init(UDSServer& udsServer); @@ -129,12 +129,12 @@ private: private: UDSServer* udsServer_ = nullptr; #ifdef OHOS_BUILD_ENABLE_POINTER - int32_t firstBtnDownWindowId_ = -1; - int32_t lastLogicX_ = -1; - int32_t lastLogicY_ = -1; + int32_t firstBtnDownWindowId_ { -1 }; + int32_t lastLogicX_ { -1 }; + int32_t lastLogicY_ { -1 }; WindowInfo lastWindowInfo_; - std::shared_ptr lastPointerEvent_ = nullptr; - std::map> mapPointerStyle_ = {}; + std::shared_ptr lastPointerEvent_ { nullptr }; + std::map> pointerStyle_; #endif // OHOS_BUILD_ENABLE_POINTER DisplayGroupInfo displayGroupInfo_; MouseLocation mouseLocation_ = {-1, -1}; // physical coord diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index a875a07f36..a59b58aa3e 100755 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -37,7 +37,7 @@ class PointerDrawingManager : public IPointerDrawingManager, public std::enable_shared_from_this { public: PointerDrawingManager(); - ~PointerDrawingManager(); + ~PointerDrawingManager() = default; DISALLOW_COPY_AND_MOVE(PointerDrawingManager); void DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle = MOUSE_ICON::DEFAULT); @@ -71,18 +71,18 @@ private: void InitStyle(); private: - sptr pointerWindow_ = nullptr; - bool hasDisplay_ = false; - int32_t displayId_ = -1; - int32_t displayWidth_ = 0; - int32_t displayHeight_ = 0; - int32_t pid_ = 0; - int32_t windowId_ = 0; - bool hasPointerDevice_ = false; - int32_t lastPhysicalX_ = -1; - int32_t lastPhysicalY_ = -1; - Direction direction_ = Direction0; - int32_t preMouseStyle_ = 0; + sptr pointerWindow_ { nullptr }; + bool hasDisplay_ { false }; + int32_t displayId_ { -1 }; + int32_t displayWidth_ { 0 }; + int32_t displayHeight_ { 0 }; + int32_t pid_ { 0 }; + int32_t windowId_ { 0 }; + bool hasPointerDevice_ { false }; + int32_t lastPhysicalX_ { -1 }; + int32_t lastPhysicalY_ { -1 }; + Direction direction_ { Direction0 }; + int32_t lastMouseStyle_ { 0 }; std::map mouseIcons_; struct PidInfo { int32_t pid { 0 }; diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index 955c20480f..d05e3f3835 100755 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -31,13 +31,11 @@ namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "InputWindowsManager"}; constexpr int32_t DEFAULT_POINTER_STYLE = 0; -constexpr int32_t MAX_WINDOW_COUNT = 20; +constexpr size_t MAX_WINDOW_COUNT = 20; } // namespace InputWindowsManager::InputWindowsManager() {} -InputWindowsManager::~InputWindowsManager() {} - void InputWindowsManager::Init(UDSServer& udsServer) { udsServer_ = &udsServer; @@ -495,9 +493,9 @@ void InputWindowsManager::OnSessionLost(SessionPtr session) CHKPV(session); int32_t pid = session->GetPid(); - auto it = mapPointerStyle_.find(pid); - if (it != mapPointerStyle_.end()) { - mapPointerStyle_.erase(it); + auto it = pointerStyle_.find(pid); + if (it != pointerStyle_.end()) { + pointerStyle_.erase(it); MMI_HILOGD("Clear the pointer style map, pd:%{public}d", pid); return; } @@ -506,8 +504,8 @@ void InputWindowsManager::OnSessionLost(SessionPtr session) int32_t InputWindowsManager::SetPointerStyle(int32_t pid, int32_t windowId, int32_t pointerStyle) { CALL_DEBUG_ENTER; - auto it = mapPointerStyle_.find(pid); - if (it == mapPointerStyle_.end()) { + auto it = pointerStyle_.find(pid); + if (it == pointerStyle_.end()) { MMI_HILOGE("The pointer style map is not include param pd:%{public}d", pid); return RET_ERR; } @@ -528,8 +526,8 @@ int32_t InputWindowsManager::GetPointerStyle(int32_t pid, int32_t windowId, int3 CALL_DEBUG_ENTER; pointerStyle = DEFAULT_POINTER_STYLE; - auto it = mapPointerStyle_.find(pid); - if (it == mapPointerStyle_.end()) { + auto it = pointerStyle_.find(pid); + if (it == pointerStyle_.end()) { MMI_HILOGE("The pointer style map is not include param pd, %{public}d", pid); return RET_ERR; } @@ -550,11 +548,11 @@ void InputWindowsManager::UpdatePointerStyle() CALL_DEBUG_ENTER; for (const auto& windowItem : displayGroupInfo_.windowsInfo) { int32_t pid = windowItem.pid; - auto it = mapPointerStyle_.find(pid); - if (it == mapPointerStyle_.end()) { + auto it = pointerStyle_.find(pid); + if (it == pointerStyle_.end()) { std::map tmpPointerStyle; tmpPointerStyle.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); - auto iter = mapPointerStyle_.insert(std::make_pair(pid, tmpPointerStyle)); + auto iter = pointerStyle_.insert(std::make_pair(pid, tmpPointerStyle)); if (!iter.second) { MMI_HILOGE("The pd is duplicated"); return; @@ -562,13 +560,13 @@ void InputWindowsManager::UpdatePointerStyle() continue; } - auto subit = it->second.find(windowItem.id); - if (subit == it->second.end()) { + auto subIter = it->second.find(windowItem.id); + if (subIter == it->second.end()) { if (it->second.size() == MAX_WINDOW_COUNT) { MMI_HILOGD("The window count:%{public}zu exceeds limit in same pd", it->second.size()); it->second.erase(it->second.begin()); } - auto iter = it->second.insert(std::pair(windowItem.id, DEFAULT_POINTER_STYLE)); + auto iter = it->second.insert(std::make_pair(windowItem.id, DEFAULT_POINTER_STYLE)); if (!iter.second) { MMI_HILOGE("The window type is duplicated"); return; @@ -576,7 +574,7 @@ void InputWindowsManager::UpdatePointerStyle() } } - MMI_HILOGD("Number of pointer style:%{public}zu", mapPointerStyle_.size()); + MMI_HILOGD("Number of pointer style:%{public}zu", pointerStyle_.size()); } #endif // OHOS_BUILD_ENABLE_POINTER diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 9b034c5635..aea7e79cc1 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -33,6 +33,8 @@ namespace MMI { namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "PointerDrawingManager" }; const std::string IMAGE_POINTER_DEFAULT_PATH = "/system/etc/multimodalinput/mouse_icon/"; +constexpr int32_t realImageWidth = 40; +constexpr int32_t realImageHeight = 40; } // namespace } // namespace MMI } // namespace OHOS @@ -44,13 +46,11 @@ PointerDrawingManager::PointerDrawingManager() InitStyle(); } -PointerDrawingManager::~PointerDrawingManager() {} - void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, int32_t physicalY, const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; - MMI_HILOGD("display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", + MMI_HILOGD("Display:%{public}d,physicalX:%{public}d,physicalY:%{public}d,mouseStyle:%{public}d", displayId, physicalX, physicalY, mouseStyle); FixCursorPosition(physicalX, physicalY); lastPhysicalX_ = physicalX; @@ -60,13 +60,11 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in if (pointerWindow_ != nullptr) { pointerWindow_->MoveTo(physicalX, physicalY); - if (preMouseStyle_ == mouseStyle) { - MMI_HILOGD("The preMouseStyle is equal with mouseStyle"); - MMI_HILOGD("Leave, display:%{public}d,physicalX:%{public}d,physicalY:%{public}d", - displayId, physicalX, physicalY); + if (lastMouseStyle_ == mouseStyle) { + MMI_HILOGD("The lastMouseStyle is equal with mouseStyle"); return; } - preMouseStyle_ = mouseStyle; + lastMouseStyle_ = mouseStyle; int32_t ret = InitLayer(mouseStyle); if (ret != RET_OK) { MMI_HILOGE("Init layer failed"); @@ -131,9 +129,6 @@ int32_t PointerDrawingManager::InitLayer(const MOUSE_ICON mouseStyle) void PointerDrawingManager::AdjustMouseFocus(ICON_TYPE iconType, int32_t &physicalX, int32_t &physicalY) { CALL_DEBUG_ENTER; - int32_t realImageWidth = 40; - int32_t realImageHeight = 40; - switch (iconType) { case ANGLE_SW: { physicalY -= realImageHeight; -- Gitee From e828ded974864cdf20c5658cea3815b996803aa9 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Wed, 17 Aug 2022 02:29:22 +0000 Subject: [PATCH 16/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Idcaaf4c15b9d1bfa5ddb8feb65decc138e0cb341 --- .../proxy/event_handler/src/input_manager_impl.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frameworks/proxy/event_handler/src/input_manager_impl.cpp b/frameworks/proxy/event_handler/src/input_manager_impl.cpp index 517dd6b87a..c3e0c2ab4a 100755 --- a/frameworks/proxy/event_handler/src/input_manager_impl.cpp +++ b/frameworks/proxy/event_handler/src/input_manager_impl.cpp @@ -597,6 +597,11 @@ int32_t InputManagerImpl::GetPointerSpeed() int32_t InputManagerImpl::SetPointerStyle(int32_t windowId, int32_t pointerStyle) { CALL_DEBUG_ENTER; + if(windowId < 0 || pointerStyle < 0) + { + MMI_HILOGE("The param is invalid"); + return RET_ERR; + } int32_t ret = MultimodalInputConnMgr->SetPointerStyle(windowId, pointerStyle); if (ret != RET_OK) { MMI_HILOGE("Failed to send to server, ret:%{public}d", ret); @@ -608,6 +613,11 @@ int32_t InputManagerImpl::SetPointerStyle(int32_t windowId, int32_t pointerStyle int32_t InputManagerImpl::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) { CALL_DEBUG_ENTER; + if(windowId < 0) + { + MMI_HILOGE("The param is invalid"); + return RET_ERR; + } int32_t ret = MultimodalInputConnMgr->GetPointerStyle(windowId, pointerStyle); if (ret != RET_OK) { MMI_HILOGE("Failed to send to server, ret:%{public}d", ret); -- Gitee From f0bba083ec856ac307aa3747f298961fe3492032 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Wed, 17 Aug 2022 06:26:00 +0000 Subject: [PATCH 17/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Ib5d2ceb675be889e8ee3853313babcb65d2c83f5 --- .../event_handler/src/input_manager_impl.cpp | 6 ++---- .../src/pointer_drawing_manager.cpp | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frameworks/proxy/event_handler/src/input_manager_impl.cpp b/frameworks/proxy/event_handler/src/input_manager_impl.cpp index c3e0c2ab4a..67ce9a2568 100755 --- a/frameworks/proxy/event_handler/src/input_manager_impl.cpp +++ b/frameworks/proxy/event_handler/src/input_manager_impl.cpp @@ -597,8 +597,7 @@ int32_t InputManagerImpl::GetPointerSpeed() int32_t InputManagerImpl::SetPointerStyle(int32_t windowId, int32_t pointerStyle) { CALL_DEBUG_ENTER; - if(windowId < 0 || pointerStyle < 0) - { + if (windowId < 0 || pointerStyle < 0) { MMI_HILOGE("The param is invalid"); return RET_ERR; } @@ -613,8 +612,7 @@ int32_t InputManagerImpl::SetPointerStyle(int32_t windowId, int32_t pointerStyle int32_t InputManagerImpl::GetPointerStyle(int32_t windowId, int32_t &pointerStyle) { CALL_DEBUG_ENTER; - if(windowId < 0) - { + if (windowId < 0) { MMI_HILOGE("The param is invalid"); return RET_ERR; } diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index aea7e79cc1..50b32db98d 100755 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -92,22 +92,19 @@ void PointerDrawingManager::DrawPointer(int32_t displayId, int32_t physicalX, in int32_t PointerDrawingManager::InitLayer(const MOUSE_ICON mouseStyle) { CALL_DEBUG_ENTER; + CHKPR(pointerWindow_, RET_ERR); sptr layer = GetLayer(); if (layer == nullptr) { - if (pointerWindow_ != nullptr) { - pointerWindow_->Destroy(); - pointerWindow_ = nullptr; - } + pointerWindow_->Destroy(); + pointerWindow_ = nullptr; MMI_HILOGE("Init layer is failed, get layer is nullptr"); return RET_ERR; } sptr buffer = GetSurfaceBuffer(layer); if (buffer == nullptr || buffer->GetVirAddr() == nullptr) { - if (pointerWindow_ != nullptr) { - pointerWindow_->Destroy(); - pointerWindow_ = nullptr; - } + pointerWindow_->Destroy(); + pointerWindow_ = nullptr; MMI_HILOGE("Init layer is failed, buffer or virAddr is nullptr"); return RET_ERR; } @@ -425,6 +422,11 @@ int32_t PointerDrawingManager::SetPointerStyle(int32_t pid, int32_t windowId, in return RET_ERR; } + if (!InputDevMgr->HasPointerDevice()) { + MMI_HILOGD("The pointer device is not exist"); + return RET_OK; + } + if (!WinMgr->IsNeedRefreshLayer(windowId)) { MMI_HILOGD("Not need refresh layer, window type:%{public}d, pointer style:%{public}d", windowId, pointerStyle); return RET_OK; -- Gitee From 9de970c5ba34bd4570adee7c337911a6a24fbe3e Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 18 Aug 2022 01:42:33 +0000 Subject: [PATCH 18/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I9b6409d5f497fc16dd21032961f1f7f2738e1afa --- .../napi/pointer/include/js_pointer_context.h | 0 .../napi/pointer/include/js_pointer_manager.h | 0 frameworks/napi/pointer/src/js_pointer_context.cpp | 0 frameworks/napi/pointer/src/js_pointer_manager.cpp | 0 .../event_handler/include/input_manager_impl.h | 0 .../proxy/event_handler/src/input_manager_impl.cpp | 0 frameworks/proxy/events/src/input_manager.cpp | 0 .../native/innerkits/proxy/include/input_manager.h | 0 service/BUILD.gn | 0 .../include/i_multimodal_input_connect.h | 0 .../include/multimodal_input_connect_manager.h | 0 .../include/multimodal_input_connect_proxy.h | 0 .../include/multimodal_input_connect_stub.h | 0 .../src/multimodal_input_connect_manager.cpp | 0 .../src/multimodal_input_connect_proxy.cpp | 0 .../src/multimodal_input_connect_stub.cpp | 0 service/module_loader/include/mmi_service.h | 0 service/module_loader/src/mmi_service.cpp | 0 .../include/i_pointer_drawing_manager.h | 0 .../window_manager/include/input_windows_manager.h | 0 .../include/pointer_drawing_manager.h | 0 .../window_manager/src/input_windows_manager.cpp | 0 .../window_manager/src/pointer_drawing_manager.cpp | 0 util/common/include/struct_multimodal.h | 0 util/common/include/util.h | 0 util/common/src/util.cpp | 0 util/source_icon/Colorsucker_SW.png | Bin util/source_icon/Copy_NW.png | Bin util/source_icon/Cross_Center.png | Bin util/source_icon/Default_NW.png | Bin util/source_icon/East_Center.png | Bin util/source_icon/Forbid_NW.png | Bin util/source_icon/HandGrabbing_Center.png | Bin util/source_icon/HandOpen_Center.png | Bin util/source_icon/HandPointing_NW.png | Bin util/source_icon/Help_NW.png | Bin util/source_icon/MiddleBin_East_Center.png | Bin util/source_icon/MiddleBin_NE_Center.png | Bin util/source_icon/MiddleBin_NSWE_Center.png | Bin util/source_icon/MiddleBin_NS_Center.png | Bin util/source_icon/MiddleBin_NW_Center.png | Bin util/source_icon/MiddleBin_North_Center.png | Bin util/source_icon/MiddleBin_SE_Center.png | Bin util/source_icon/MiddleBin_SW_Center.png | Bin util/source_icon/MiddleBin_South_Center.png | Bin util/source_icon/MiddleBin_West_Center.png | Bin util/source_icon/Move_Center.png | Bin util/source_icon/NESW_Center.png | Bin util/source_icon/NWSE_Center.png | Bin util/source_icon/NorthEast_Center.png | Bin util/source_icon/NorthSouth_Center.png | Bin util/source_icon/NorthWest_Center.png | Bin util/source_icon/North_Center.png | Bin util/source_icon/ResizeLeftRight_Center.png | Bin util/source_icon/ResizeUpDown_Center.png | Bin util/source_icon/ScreenshotCross_Center.png | Bin util/source_icon/ScreenshotCursor_Center.png | Bin util/source_icon/SouthEast_Center.png | Bin util/source_icon/SouthWest_Center.png | Bin util/source_icon/South_Center.png | Bin util/source_icon/TextCursor_Center.png | Bin util/source_icon/WestEast_Center.png | Bin util/source_icon/West_Center.png | Bin util/source_icon/ZoomIn_Center.png | Bin util/source_icon/ZoomOut_Center.png | Bin 65 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 frameworks/napi/pointer/include/js_pointer_context.h mode change 100755 => 100644 frameworks/napi/pointer/include/js_pointer_manager.h mode change 100755 => 100644 frameworks/napi/pointer/src/js_pointer_context.cpp mode change 100755 => 100644 frameworks/napi/pointer/src/js_pointer_manager.cpp mode change 100755 => 100644 frameworks/proxy/event_handler/include/input_manager_impl.h mode change 100755 => 100644 frameworks/proxy/event_handler/src/input_manager_impl.cpp mode change 100755 => 100644 frameworks/proxy/events/src/input_manager.cpp mode change 100755 => 100644 interfaces/native/innerkits/proxy/include/input_manager.h mode change 100755 => 100644 service/BUILD.gn mode change 100755 => 100644 service/connect_manager/include/i_multimodal_input_connect.h mode change 100755 => 100644 service/connect_manager/include/multimodal_input_connect_manager.h mode change 100755 => 100644 service/connect_manager/include/multimodal_input_connect_proxy.h mode change 100755 => 100644 service/connect_manager/include/multimodal_input_connect_stub.h mode change 100755 => 100644 service/connect_manager/src/multimodal_input_connect_manager.cpp mode change 100755 => 100644 service/connect_manager/src/multimodal_input_connect_proxy.cpp mode change 100755 => 100644 service/connect_manager/src/multimodal_input_connect_stub.cpp mode change 100755 => 100644 service/module_loader/include/mmi_service.h mode change 100755 => 100644 service/module_loader/src/mmi_service.cpp mode change 100755 => 100644 service/window_manager/include/i_pointer_drawing_manager.h mode change 100755 => 100644 service/window_manager/include/input_windows_manager.h mode change 100755 => 100644 service/window_manager/include/pointer_drawing_manager.h mode change 100755 => 100644 service/window_manager/src/input_windows_manager.cpp mode change 100755 => 100644 service/window_manager/src/pointer_drawing_manager.cpp mode change 100755 => 100644 util/common/include/struct_multimodal.h mode change 100755 => 100644 util/common/include/util.h mode change 100755 => 100644 util/common/src/util.cpp mode change 100755 => 100644 util/source_icon/Colorsucker_SW.png mode change 100755 => 100644 util/source_icon/Copy_NW.png mode change 100755 => 100644 util/source_icon/Cross_Center.png mode change 100755 => 100644 util/source_icon/Default_NW.png mode change 100755 => 100644 util/source_icon/East_Center.png mode change 100755 => 100644 util/source_icon/Forbid_NW.png mode change 100755 => 100644 util/source_icon/HandGrabbing_Center.png mode change 100755 => 100644 util/source_icon/HandOpen_Center.png mode change 100755 => 100644 util/source_icon/HandPointing_NW.png mode change 100755 => 100644 util/source_icon/Help_NW.png mode change 100755 => 100644 util/source_icon/MiddleBin_East_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_NE_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_NSWE_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_NS_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_NW_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_North_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_SE_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_SW_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_South_Center.png mode change 100755 => 100644 util/source_icon/MiddleBin_West_Center.png mode change 100755 => 100644 util/source_icon/Move_Center.png mode change 100755 => 100644 util/source_icon/NESW_Center.png mode change 100755 => 100644 util/source_icon/NWSE_Center.png mode change 100755 => 100644 util/source_icon/NorthEast_Center.png mode change 100755 => 100644 util/source_icon/NorthSouth_Center.png mode change 100755 => 100644 util/source_icon/NorthWest_Center.png mode change 100755 => 100644 util/source_icon/North_Center.png mode change 100755 => 100644 util/source_icon/ResizeLeftRight_Center.png mode change 100755 => 100644 util/source_icon/ResizeUpDown_Center.png mode change 100755 => 100644 util/source_icon/ScreenshotCross_Center.png mode change 100755 => 100644 util/source_icon/ScreenshotCursor_Center.png mode change 100755 => 100644 util/source_icon/SouthEast_Center.png mode change 100755 => 100644 util/source_icon/SouthWest_Center.png mode change 100755 => 100644 util/source_icon/South_Center.png mode change 100755 => 100644 util/source_icon/TextCursor_Center.png mode change 100755 => 100644 util/source_icon/WestEast_Center.png mode change 100755 => 100644 util/source_icon/West_Center.png mode change 100755 => 100644 util/source_icon/ZoomIn_Center.png mode change 100755 => 100644 util/source_icon/ZoomOut_Center.png diff --git a/frameworks/napi/pointer/include/js_pointer_context.h b/frameworks/napi/pointer/include/js_pointer_context.h old mode 100755 new mode 100644 diff --git a/frameworks/napi/pointer/include/js_pointer_manager.h b/frameworks/napi/pointer/include/js_pointer_manager.h old mode 100755 new mode 100644 diff --git a/frameworks/napi/pointer/src/js_pointer_context.cpp b/frameworks/napi/pointer/src/js_pointer_context.cpp old mode 100755 new mode 100644 diff --git a/frameworks/napi/pointer/src/js_pointer_manager.cpp b/frameworks/napi/pointer/src/js_pointer_manager.cpp old mode 100755 new mode 100644 diff --git a/frameworks/proxy/event_handler/include/input_manager_impl.h b/frameworks/proxy/event_handler/include/input_manager_impl.h old mode 100755 new mode 100644 diff --git a/frameworks/proxy/event_handler/src/input_manager_impl.cpp b/frameworks/proxy/event_handler/src/input_manager_impl.cpp old mode 100755 new mode 100644 diff --git a/frameworks/proxy/events/src/input_manager.cpp b/frameworks/proxy/events/src/input_manager.cpp old mode 100755 new mode 100644 diff --git a/interfaces/native/innerkits/proxy/include/input_manager.h b/interfaces/native/innerkits/proxy/include/input_manager.h old mode 100755 new mode 100644 diff --git a/service/BUILD.gn b/service/BUILD.gn old mode 100755 new mode 100644 diff --git a/service/connect_manager/include/i_multimodal_input_connect.h b/service/connect_manager/include/i_multimodal_input_connect.h old mode 100755 new mode 100644 diff --git a/service/connect_manager/include/multimodal_input_connect_manager.h b/service/connect_manager/include/multimodal_input_connect_manager.h old mode 100755 new mode 100644 diff --git a/service/connect_manager/include/multimodal_input_connect_proxy.h b/service/connect_manager/include/multimodal_input_connect_proxy.h old mode 100755 new mode 100644 diff --git a/service/connect_manager/include/multimodal_input_connect_stub.h b/service/connect_manager/include/multimodal_input_connect_stub.h old mode 100755 new mode 100644 diff --git a/service/connect_manager/src/multimodal_input_connect_manager.cpp b/service/connect_manager/src/multimodal_input_connect_manager.cpp old mode 100755 new mode 100644 diff --git a/service/connect_manager/src/multimodal_input_connect_proxy.cpp b/service/connect_manager/src/multimodal_input_connect_proxy.cpp old mode 100755 new mode 100644 diff --git a/service/connect_manager/src/multimodal_input_connect_stub.cpp b/service/connect_manager/src/multimodal_input_connect_stub.cpp old mode 100755 new mode 100644 diff --git a/service/module_loader/include/mmi_service.h b/service/module_loader/include/mmi_service.h old mode 100755 new mode 100644 diff --git a/service/module_loader/src/mmi_service.cpp b/service/module_loader/src/mmi_service.cpp old mode 100755 new mode 100644 diff --git a/service/window_manager/include/i_pointer_drawing_manager.h b/service/window_manager/include/i_pointer_drawing_manager.h old mode 100755 new mode 100644 diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h old mode 100755 new mode 100644 diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h old mode 100755 new mode 100644 diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp old mode 100755 new mode 100644 diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp old mode 100755 new mode 100644 diff --git a/util/common/include/struct_multimodal.h b/util/common/include/struct_multimodal.h old mode 100755 new mode 100644 diff --git a/util/common/include/util.h b/util/common/include/util.h old mode 100755 new mode 100644 diff --git a/util/common/src/util.cpp b/util/common/src/util.cpp old mode 100755 new mode 100644 diff --git a/util/source_icon/Colorsucker_SW.png b/util/source_icon/Colorsucker_SW.png old mode 100755 new mode 100644 diff --git a/util/source_icon/Copy_NW.png b/util/source_icon/Copy_NW.png old mode 100755 new mode 100644 diff --git a/util/source_icon/Cross_Center.png b/util/source_icon/Cross_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/Default_NW.png b/util/source_icon/Default_NW.png old mode 100755 new mode 100644 diff --git a/util/source_icon/East_Center.png b/util/source_icon/East_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/Forbid_NW.png b/util/source_icon/Forbid_NW.png old mode 100755 new mode 100644 diff --git a/util/source_icon/HandGrabbing_Center.png b/util/source_icon/HandGrabbing_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/HandOpen_Center.png b/util/source_icon/HandOpen_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/HandPointing_NW.png b/util/source_icon/HandPointing_NW.png old mode 100755 new mode 100644 diff --git a/util/source_icon/Help_NW.png b/util/source_icon/Help_NW.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_East_Center.png b/util/source_icon/MiddleBin_East_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_NE_Center.png b/util/source_icon/MiddleBin_NE_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_NSWE_Center.png b/util/source_icon/MiddleBin_NSWE_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_NS_Center.png b/util/source_icon/MiddleBin_NS_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_NW_Center.png b/util/source_icon/MiddleBin_NW_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_North_Center.png b/util/source_icon/MiddleBin_North_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_SE_Center.png b/util/source_icon/MiddleBin_SE_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_SW_Center.png b/util/source_icon/MiddleBin_SW_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_South_Center.png b/util/source_icon/MiddleBin_South_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/MiddleBin_West_Center.png b/util/source_icon/MiddleBin_West_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/Move_Center.png b/util/source_icon/Move_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/NESW_Center.png b/util/source_icon/NESW_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/NWSE_Center.png b/util/source_icon/NWSE_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/NorthEast_Center.png b/util/source_icon/NorthEast_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/NorthSouth_Center.png b/util/source_icon/NorthSouth_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/NorthWest_Center.png b/util/source_icon/NorthWest_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/North_Center.png b/util/source_icon/North_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/ResizeLeftRight_Center.png b/util/source_icon/ResizeLeftRight_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/ResizeUpDown_Center.png b/util/source_icon/ResizeUpDown_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/ScreenshotCross_Center.png b/util/source_icon/ScreenshotCross_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/ScreenshotCursor_Center.png b/util/source_icon/ScreenshotCursor_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/SouthEast_Center.png b/util/source_icon/SouthEast_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/SouthWest_Center.png b/util/source_icon/SouthWest_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/South_Center.png b/util/source_icon/South_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/TextCursor_Center.png b/util/source_icon/TextCursor_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/WestEast_Center.png b/util/source_icon/WestEast_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/West_Center.png b/util/source_icon/West_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/ZoomIn_Center.png b/util/source_icon/ZoomIn_Center.png old mode 100755 new mode 100644 diff --git a/util/source_icon/ZoomOut_Center.png b/util/source_icon/ZoomOut_Center.png old mode 100755 new mode 100644 -- Gitee From e727c2e8f4651d352c5ba800f28ddbece48154aa Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Thu, 18 Aug 2022 09:09:56 +0000 Subject: [PATCH 19/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I328536da85e2a8a2bd2eba9e3829525bd2c42277 --- .../src/pointer_drawing_manager.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) mode change 100644 => 100755 service/window_manager/src/pointer_drawing_manager.cpp diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp old mode 100644 new mode 100755 index eed358dd6e..cc6dd3f98b --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -428,10 +428,17 @@ int32_t PointerDrawingManager::SetPointerStyle(int32_t pid, int32_t windowId, in return RET_OK; } - int32_t ret = InitLayer(MOUSE_ICON(pointerStyle)); - if (ret != RET_OK) { - MMI_HILOGE("Init layer failed"); - return RET_ERR; + if (pointerWindow_ != nullptr) { + int32_t physicalX = lastPhysicalX_; + int32_t physicalY = lastPhysicalY_; + AdjustMouseFocus(ICON_TYPE(mouseIcons_[MOUSE_ICON(pointerStyle)].alignmentWay), physicalX, physicalY); + pointerWindow_->MoveTo(physicalX, physicalY); + + int32_t ret = InitLayer(MOUSE_ICON(pointerStyle)); + if (ret != RET_OK) { + MMI_HILOGE("Init layer failed"); + return RET_ERR; + } } MMI_HILOGD("Window type:%{public}d set pointer style:%{public}d success", windowId, pointerStyle); return RET_OK; -- Gitee From 6b3259a1078e4fa1282c62969674da938741e58b Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Fri, 19 Aug 2022 02:54:28 +0000 Subject: [PATCH 20/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: Icd1e8cabd31bb4f7ed3b7bd9aa0417d3ff15bffa --- service/connect_manager/include/i_multimodal_input_connect.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 service/connect_manager/include/i_multimodal_input_connect.h diff --git a/service/connect_manager/include/i_multimodal_input_connect.h b/service/connect_manager/include/i_multimodal_input_connect.h old mode 100755 new mode 100644 -- Gitee From 55f1c54904d728229565314c6d4544ccb63487a6 Mon Sep 17 00:00:00 2001 From: xing-jiangpan Date: Fri, 19 Aug 2022 02:56:13 +0000 Subject: [PATCH 21/21] Supports mouse style Settings Signed-off-by: xing-jiangpan Change-Id: I130bfc178250781454c2679d2010d3678ae5cdd1 --- service/window_manager/src/pointer_drawing_manager.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 service/window_manager/src/pointer_drawing_manager.cpp diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp old mode 100755 new mode 100644 -- Gitee