diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp index 0e1c722..8ae3846 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "inputconvertgame.h" @@ -76,6 +77,27 @@ void InputConvertGame::keyEvent(const QKeyEvent *from, const QSize &frameSize, c return; } + // small eyes + if (from->key() == m_keyMap.getMouseMoveMap().data.mouseMove.smallEyes.key) { + m_ctrlMouseMove.smallEyes = (QEvent::KeyPress == from->type()); + + if (QEvent::KeyPress == from->type()) { + m_processMouseMove = false; + int delay = 30; + QTimer::singleShot(delay, this, [this]() { mouseMoveStopTouch(); }); + QTimer::singleShot(delay * 2, this, [this]() { + mouseMoveStartTouch(nullptr); + m_processMouseMove = true; + }); + + stopMouseMoveTimer(); + } else { + mouseMoveStopTouch(); + mouseMoveStartTouch(nullptr); + } + return; + } + switch (node.type) { // 处理方向盘 case KeyMap::KMT_STEER_WHEEL: @@ -304,7 +326,6 @@ bool InputConvertGame::processMouseClick(const QMouseEvent *from) return false; } - qDebug() << "mouse event " << from->type(); if (QEvent::MouseButtonPress == from->type() || QEvent::MouseButtonDblClick == from->type()) { int id = attachTouchID(from->button()); sendTouchDownEvent(id, node.data.click.keyNode.pos); @@ -330,7 +351,7 @@ bool InputConvertGame::processMouseMove(const QMouseEvent *from) return true; } - if (!m_ctrlMouseMove.lastPos.isNull()) { + if (!m_ctrlMouseMove.lastPos.isNull() && m_processMouseMove) { QPointF distance = from->localPos() - m_ctrlMouseMove.lastPos; distance /= m_keyMap.getMouseMoveMap().data.mouseMove.speedRatio; @@ -340,10 +361,20 @@ bool InputConvertGame::processMouseMove(const QMouseEvent *from) m_ctrlMouseMove.lastConverPos.setX(m_ctrlMouseMove.lastConverPos.x() + distance.x() / m_showSize.width()); m_ctrlMouseMove.lastConverPos.setY(m_ctrlMouseMove.lastConverPos.y() + distance.y() / m_showSize.height()); - if (m_ctrlMouseMove.lastConverPos.x() < 0.1 || m_ctrlMouseMove.lastConverPos.x() > 0.8 || m_ctrlMouseMove.lastConverPos.y() < 0.1 - || m_ctrlMouseMove.lastConverPos.y() > 0.8) { - mouseMoveStopTouch(); - mouseMoveStartTouch(from); + if (m_ctrlMouseMove.lastConverPos.x() < 0.1 || m_ctrlMouseMove.lastConverPos.x() > 0.98 || m_ctrlMouseMove.lastConverPos.y() < 0.1 + || m_ctrlMouseMove.lastConverPos.y() > 0.98) { + if (m_ctrlMouseMove.smallEyes) { + m_processMouseMove = false; + int delay = 30; + QTimer::singleShot(delay, this, [this]() { mouseMoveStopTouch(); }); + QTimer::singleShot(delay * 2, this, [this]() { + mouseMoveStartTouch(nullptr); + m_processMouseMove = true; + }); + } else { + mouseMoveStopTouch(); + mouseMoveStartTouch(from); + } } sendTouchMoveEvent(getTouchID(Qt::ExtraButton24), m_ctrlMouseMove.lastConverPos); @@ -390,7 +421,8 @@ void InputConvertGame::mouseMoveStartTouch(const QMouseEvent *from) { Q_UNUSED(from) if (!m_ctrlMouseMove.touching) { - QPointF mouseMoveStartPos = m_keyMap.getMouseMoveMap().data.mouseMove.startPos; + QPointF mouseMoveStartPos + = m_ctrlMouseMove.smallEyes ? m_keyMap.getMouseMoveMap().data.mouseMove.smallEyes.pos : m_keyMap.getMouseMoveMap().data.mouseMove.startPos; int id = attachTouchID(Qt::ExtraButton24); sendTouchDownEvent(id, mouseMoveStartPos); m_ctrlMouseMove.lastConverPos = mouseMoveStartPos; diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h index c684717..662e9d1 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h @@ -66,6 +66,8 @@ private: int m_multiTouchID[MULTI_TOUCH_MAX_NUM] = { 0 }; KeyMap m_keyMap; + bool m_processMouseMove = true; + // steer wheel struct { @@ -86,6 +88,7 @@ private: QPointF lastPos = { 0.0, 0.0 }; bool touching = false; int timer = 0; + bool smallEyes = false; } m_ctrlMouseMove; }; diff --git a/QtScrcpy/device/controller/inputconvert/keymap/keymap.cpp b/QtScrcpy/device/controller/inputconvert/keymap/keymap.cpp index 6cfb3c3..6c795da 100644 --- a/QtScrcpy/device/controller/inputconvert/keymap/keymap.cpp +++ b/QtScrcpy/device/controller/inputconvert/keymap/keymap.cpp @@ -81,6 +81,39 @@ void KeyMap::loadKeyMap(const QString &json) if (checkItemDouble(startPos, "y")) { keyMapNode.data.mouseMove.startPos.setY(getItemDouble(startPos, "y")); } + + // small eyes + if (checkItemObject(mouseMoveMap, "smallEyes")) { + QJsonObject smallEyes = mouseMoveMap.value("smallEyes").toObject(); + if (!smallEyes.contains("type") || !smallEyes.value("type").isString()) { + errorString = QString("json error: smallEyes no find node type"); + goto parseError; + } + + // type just support KMT_CLICK + KeyMap::KeyMapType type = getItemKeyMapType(smallEyes, "type"); + if (KeyMap::KMT_CLICK != type) { + errorString = QString("json error: smallEyes just support KMT_CLICK"); + goto parseError; + } + + // safe check + if (!checkForClick(smallEyes)) { + errorString = QString("json error: smallEyes node format error"); + goto parseError; + } + + QPair key = getItemKey(smallEyes, "key"); + if (key.first == AT_INVALID) { + errorString = QString("json error: keyMapNodes node invalid key: %1").arg(smallEyes.value("key").toString()); + goto parseError; + } + + keyMapNode.data.mouseMove.smallEyes.type = key.first; + keyMapNode.data.mouseMove.smallEyes.key = key.second; + keyMapNode.data.mouseMove.smallEyes.pos = getItemPos(smallEyes, "pos"); + } + m_idxMouseMove = m_keyMapNodes.size(); m_keyMapNodes.push_back(keyMapNode); } diff --git a/QtScrcpy/device/controller/inputconvert/keymap/keymap.h b/QtScrcpy/device/controller/inputconvert/keymap/keymap.h index b1fd321..1d4c555 100644 --- a/QtScrcpy/device/controller/inputconvert/keymap/keymap.h +++ b/QtScrcpy/device/controller/inputconvert/keymap/keymap.h @@ -78,6 +78,7 @@ public: { QPointF startPos = { 0.0, 0.0 }; int speedRatio = 1; + KeyNode smallEyes; } mouseMove; DATA() {} ~DATA() {} diff --git a/QtScrcpy/device/ui/videoform.cpp b/QtScrcpy/device/ui/videoform.cpp index e9d77ef..da4e749 100644 --- a/QtScrcpy/device/ui/videoform.cpp +++ b/QtScrcpy/device/ui/videoform.cpp @@ -454,7 +454,7 @@ void VideoForm::onSwitchFullScreen() void VideoForm::updateFPS(quint32 fps) { - qDebug() << "FPS:" << fps; + //qDebug() << "FPS:" << fps; if (!m_fpsLabel) { return; } @@ -556,6 +556,14 @@ void VideoForm::mouseDoubleClickEvent(QMouseEvent *event) if (event->button() == Qt::RightButton && m_device) { emit m_device->postBackOrScreenOn(); } + + if (m_videoWidget->geometry().contains(event->pos())) { + if (!m_device) { + return; + } + event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint())); + emit m_device->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size()); + } } void VideoForm::wheelEvent(QWheelEvent *event) diff --git a/keymap/gameforpeace.json b/keymap/gameforpeace.json index 97d735a..3b46c4a 100644 --- a/keymap/gameforpeace.json +++ b/keymap/gameforpeace.json @@ -5,7 +5,17 @@ "x": 0.57, "y": 0.26 }, - "speedRatio": 8 + "smallEyes": { + "comment": "小眼睛", + "type": "KMT_CLICK", + "key": "Key_Alt", + "pos": { + "x": 0.8, + "y": 0.31 + }, + "switchMap": false + }, + "speedRatio": 10 }, "keyMapNodes": [ { @@ -102,16 +112,6 @@ }, "switchMap": false }, - { - "comment": "小眼睛", - "type": "KMT_CLICK", - "key": "Key_Alt", - "pos": { - "x": 0.8, - "y": 0.31 - }, - "switchMap": false - }, { "comment": "捡东西1", "type": "KMT_CLICK",