1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "MouseInputImpl.h" 17 18#include <thread> 19#include <vector> 20#include <chrono> 21#include <sstream> 22 23#include "PreviewerEngineLog.h" 24 25using namespace OHOS::MMI; 26 27MouseInputImpl::MouseInputImpl() noexcept 28{ 29} 30 31TouchType MouseInputImpl::ConvertToOsType(int status) const 32{ 33 if (status < static_cast<int>(TouchType::DOWN) || status > static_cast<int>(TouchType::UNKNOWN)) { 34 return TouchType::UNKNOWN; 35 } 36 return static_cast<TouchType>(status); 37} 38 39SourceTool MouseInputImpl::ConvertToOsTool(int tools) const 40{ 41 if (tools < static_cast<int>(SourceTool::UNKNOWN) || tools > static_cast<int>(SourceTool::LENS)) { 42 return SourceTool::UNKNOWN; 43 } 44 return static_cast<SourceTool>(tools); 45} 46 47void MouseInputImpl::DispatchOsTouchEvent() const 48{ 49 auto pointerEvent = std::make_shared<PointerEvent>(); 50 struct timespec ts; 51 clock_gettime(CLOCK_MONOTONIC, &ts); 52 std::chrono::duration<int64_t, std::nano> duration(ts.tv_sec * SEC_TO_NANOSEC + ts.tv_nsec); 53 pointerEvent->time = std::chrono::high_resolution_clock::time_point(duration); 54 pointerEvent->id = 1; 55 pointerEvent->x = mouseXPosition; 56 pointerEvent->y = mouseYPosition; 57 pointerEvent->type = ConvertToOsType(touchAction); 58 pointerEvent->buttonId_ = pointButton; 59 pointerEvent->pointerAction_ = pointAction; 60 pointerEvent->sourceType = sourceType; 61 pointerEvent->sourceTool = ConvertToOsTool(sourceTool); 62 pointerEvent->pressedButtons_ = pressedBtnsVec; 63 std::copy(axisValuesArr.begin(), axisValuesArr.end(), pointerEvent->axisValues_.begin()); 64 pointerEvent->size = sizeof (PointerEvent); 65 std::stringstream ss; 66 ss << "["; 67 for (double val : axisValuesArr) { 68 ss << " " << val << " "; 69 } 70 ss << "]" << std::endl; 71 ILOG("MouseInputImpl::DispatchEvent x: %f y:%f type:%d buttonId_:%d pointerAction_:%d sourceType:%d \ 72 sourceTool:%d pressedButtonsSize:%d axisValuesArr:%s", pointerEvent->x, pointerEvent->y, 73 pointerEvent->type, pointerEvent->buttonId_, pointerEvent->pointerAction_, pointerEvent->sourceType, 74 pointerEvent->sourceTool, pointerEvent->pressedButtons_.size(), ss.str().c_str()); 75 ILOG("current thread: %d", std::this_thread::get_id()); 76 JsAppImpl::GetInstance().DispatchPointerEvent(pointerEvent); 77} 78 79void MouseInputImpl::DispatchOsBackEvent() const 80{ 81 ILOG("DispatchBackPressedEvent run."); 82 ILOG("current thread: %d", std::this_thread::get_id()); 83 JsAppImpl::GetInstance().DispatchBackPressedEvent(); 84} 85 86MouseInputImpl& MouseInputImpl::GetInstance() 87{ 88 static MouseInputImpl instance; 89 return instance; 90} 91 92void MouseInputImpl::SetMouseStatus(int status) 93{ 94 touchAction = status; 95} 96 97void MouseInputImpl::SetMousePosition(double xPosition, double yPosition) 98{ 99 mouseXPosition = xPosition; 100 mouseYPosition = yPosition; 101} 102