mirror of
https://github.com/barry-ran/QtScrcpy.git
synced 2025-08-04 22:48:44 +00:00
commit
3b23648458
12 changed files with 117 additions and 26 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QCursor>
|
#include <QCursor>
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include "inputconvertgame.h"
|
#include "inputconvertgame.h"
|
||||||
|
|
||||||
|
@ -76,6 +77,27 @@ void InputConvertGame::keyEvent(const QKeyEvent *from, const QSize &frameSize, c
|
||||||
return;
|
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) {
|
switch (node.type) {
|
||||||
// 处理方向盘
|
// 处理方向盘
|
||||||
case KeyMap::KMT_STEER_WHEEL:
|
case KeyMap::KMT_STEER_WHEEL:
|
||||||
|
@ -304,7 +326,6 @@ bool InputConvertGame::processMouseClick(const QMouseEvent *from)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "mouse event " << from->type();
|
|
||||||
if (QEvent::MouseButtonPress == from->type() || QEvent::MouseButtonDblClick == from->type()) {
|
if (QEvent::MouseButtonPress == from->type() || QEvent::MouseButtonDblClick == from->type()) {
|
||||||
int id = attachTouchID(from->button());
|
int id = attachTouchID(from->button());
|
||||||
sendTouchDownEvent(id, node.data.click.keyNode.pos);
|
sendTouchDownEvent(id, node.data.click.keyNode.pos);
|
||||||
|
@ -330,7 +351,7 @@ bool InputConvertGame::processMouseMove(const QMouseEvent *from)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_ctrlMouseMove.lastPos.isNull()) {
|
if (!m_ctrlMouseMove.lastPos.isNull() && m_processMouseMove) {
|
||||||
QPointF distance = from->localPos() - m_ctrlMouseMove.lastPos;
|
QPointF distance = from->localPos() - m_ctrlMouseMove.lastPos;
|
||||||
distance /= m_keyMap.getMouseMoveMap().data.mouseMove.speedRatio;
|
distance /= m_keyMap.getMouseMoveMap().data.mouseMove.speedRatio;
|
||||||
|
|
||||||
|
@ -340,11 +361,21 @@ bool InputConvertGame::processMouseMove(const QMouseEvent *from)
|
||||||
m_ctrlMouseMove.lastConverPos.setX(m_ctrlMouseMove.lastConverPos.x() + distance.x() / m_showSize.width());
|
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());
|
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
|
if (m_ctrlMouseMove.lastConverPos.x() < 0.1 || m_ctrlMouseMove.lastConverPos.x() > 0.98 || m_ctrlMouseMove.lastConverPos.y() < 0.1
|
||||||
|| m_ctrlMouseMove.lastConverPos.y() > 0.8) {
|
|| 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();
|
mouseMoveStopTouch();
|
||||||
mouseMoveStartTouch(from);
|
mouseMoveStartTouch(from);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sendTouchMoveEvent(getTouchID(Qt::ExtraButton24), m_ctrlMouseMove.lastConverPos);
|
sendTouchMoveEvent(getTouchID(Qt::ExtraButton24), m_ctrlMouseMove.lastConverPos);
|
||||||
}
|
}
|
||||||
|
@ -390,7 +421,8 @@ void InputConvertGame::mouseMoveStartTouch(const QMouseEvent *from)
|
||||||
{
|
{
|
||||||
Q_UNUSED(from)
|
Q_UNUSED(from)
|
||||||
if (!m_ctrlMouseMove.touching) {
|
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);
|
int id = attachTouchID(Qt::ExtraButton24);
|
||||||
sendTouchDownEvent(id, mouseMoveStartPos);
|
sendTouchDownEvent(id, mouseMoveStartPos);
|
||||||
m_ctrlMouseMove.lastConverPos = mouseMoveStartPos;
|
m_ctrlMouseMove.lastConverPos = mouseMoveStartPos;
|
||||||
|
|
|
@ -66,6 +66,8 @@ private:
|
||||||
int m_multiTouchID[MULTI_TOUCH_MAX_NUM] = { 0 };
|
int m_multiTouchID[MULTI_TOUCH_MAX_NUM] = { 0 };
|
||||||
KeyMap m_keyMap;
|
KeyMap m_keyMap;
|
||||||
|
|
||||||
|
bool m_processMouseMove = true;
|
||||||
|
|
||||||
// steer wheel
|
// steer wheel
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -86,6 +88,7 @@ private:
|
||||||
QPointF lastPos = { 0.0, 0.0 };
|
QPointF lastPos = { 0.0, 0.0 };
|
||||||
bool touching = false;
|
bool touching = false;
|
||||||
int timer = 0;
|
int timer = 0;
|
||||||
|
bool smallEyes = false;
|
||||||
} m_ctrlMouseMove;
|
} m_ctrlMouseMove;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,39 @@ void KeyMap::loadKeyMap(const QString &json)
|
||||||
if (checkItemDouble(startPos, "y")) {
|
if (checkItemDouble(startPos, "y")) {
|
||||||
keyMapNode.data.mouseMove.startPos.setY(getItemDouble(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<ActionType, int> 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_idxMouseMove = m_keyMapNodes.size();
|
||||||
m_keyMapNodes.push_back(keyMapNode);
|
m_keyMapNodes.push_back(keyMapNode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,7 @@ public:
|
||||||
{
|
{
|
||||||
QPointF startPos = { 0.0, 0.0 };
|
QPointF startPos = { 0.0, 0.0 };
|
||||||
int speedRatio = 1;
|
int speedRatio = 1;
|
||||||
|
KeyNode smallEyes;
|
||||||
} mouseMove;
|
} mouseMove;
|
||||||
DATA() {}
|
DATA() {}
|
||||||
~DATA() {}
|
~DATA() {}
|
||||||
|
|
|
@ -454,7 +454,7 @@ void VideoForm::onSwitchFullScreen()
|
||||||
|
|
||||||
void VideoForm::updateFPS(quint32 fps)
|
void VideoForm::updateFPS(quint32 fps)
|
||||||
{
|
{
|
||||||
qDebug() << "FPS:" << fps;
|
//qDebug() << "FPS:" << fps;
|
||||||
if (!m_fpsLabel) {
|
if (!m_fpsLabel) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -495,6 +495,14 @@ void VideoForm::mousePressEvent(QMouseEvent *event)
|
||||||
}
|
}
|
||||||
event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint()));
|
event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint()));
|
||||||
emit m_device->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size());
|
emit m_device->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size());
|
||||||
|
|
||||||
|
// debug keymap pos
|
||||||
|
if (event->button() == Qt::LeftButton) {
|
||||||
|
qreal x = event->localPos().x() / m_videoWidget->size().width();
|
||||||
|
qreal y = event->localPos().y() / m_videoWidget->size().height();
|
||||||
|
QString posTip = QString(R"("pos": {"x": %1, "y": %2})").arg(x).arg(y);
|
||||||
|
qInfo(posTip.toStdString().c_str());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (event->button() == Qt::LeftButton) {
|
if (event->button() == Qt::LeftButton) {
|
||||||
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
|
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
|
||||||
|
@ -556,6 +564,14 @@ void VideoForm::mouseDoubleClickEvent(QMouseEvent *event)
|
||||||
if (event->button() == Qt::RightButton && m_device) {
|
if (event->button() == Qt::RightButton && m_device) {
|
||||||
emit m_device->postBackOrScreenOn();
|
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)
|
void VideoForm::wheelEvent(QWheelEvent *event)
|
||||||
|
|
|
@ -43,15 +43,15 @@ bool DeviceManage::connectDevice(Device::DeviceParams params)
|
||||||
connect(device, &Device::deviceDisconnect, this, &DeviceManage::onDeviceDisconnect);
|
connect(device, &Device::deviceDisconnect, this, &DeviceManage::onDeviceDisconnect);
|
||||||
connect(device, &Device::controlStateChange, this, &DeviceManage::onControlStateChange);
|
connect(device, &Device::controlStateChange, this, &DeviceManage::onControlStateChange);
|
||||||
m_devices[params.serial] = device;
|
m_devices[params.serial] = device;
|
||||||
|
if (!m_script.isEmpty()) {
|
||||||
|
device->updateScript(m_script);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceManage::updateScript(QString script)
|
void DeviceManage::updateScript(QString script)
|
||||||
{
|
{
|
||||||
if (m_devices.isEmpty()) {
|
m_script = script;
|
||||||
qWarning() << "no device connect!!!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QMapIterator<QString, QPointer<Device>> i(m_devices);
|
QMapIterator<QString, QPointer<Device>> i(m_devices);
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
i.next();
|
i.next();
|
||||||
|
|
|
@ -40,6 +40,7 @@ private:
|
||||||
private:
|
private:
|
||||||
QMap<QString, QPointer<Device>> m_devices;
|
QMap<QString, QPointer<Device>> m_devices;
|
||||||
quint16 m_localPortStart = 27183;
|
quint16 m_localPortStart = 27183;
|
||||||
|
QString m_script;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DEVICEMANAGE_H
|
#endif // DEVICEMANAGE_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
[中文介绍](README_zh.md)
|
[中文介绍](README_zh.md)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
[English introduction](README.md)
|
[English introduction](README.md)
|
||||||
|
|
||||||
|
|
BIN
docs/image/debug-keymap-pos.png
Normal file
BIN
docs/image/debug-keymap-pos.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 780 KiB |
|
@ -10,6 +10,10 @@
|
||||||
|
|
||||||
- 按键映射中的坐标位置都是用相对位置表示的,屏幕的宽高都用1表示,例如屏幕的像素为1920x1080,那么坐标(0.5,0.5)则表示的是
|
- 按键映射中的坐标位置都是用相对位置表示的,屏幕的宽高都用1表示,例如屏幕的像素为1920x1080,那么坐标(0.5,0.5)则表示的是
|
||||||
以屏幕左上角为原点,像素坐标(1920,1080)*(0.5,0.5)=(960,540)的位置。
|
以屏幕左上角为原点,像素坐标(1920,1080)*(0.5,0.5)=(960,540)的位置。
|
||||||
|
|
||||||
|
或者鼠标左键单击时控制台会输出此时的pos,直接使用这个pos即可
|
||||||
|

|
||||||
|
|
||||||
- 按键映射中的按键码是用Qt的枚举表示的,详细说明可以[参考Qt文档]( https://doc.qt.io/qt-5/qt.html )(搜索 The key names used by Qt. 可以快速定位)。
|
- 按键映射中的按键码是用Qt的枚举表示的,详细说明可以[参考Qt文档]( https://doc.qt.io/qt-5/qt.html )(搜索 The key names used by Qt. 可以快速定位)。
|
||||||
- 开发人员选项中打开如下两个设置,可以方便的观察触摸点的坐标:
|
- 开发人员选项中打开如下两个设置,可以方便的观察触摸点的坐标:
|
||||||

|

|
||||||
|
@ -21,7 +25,8 @@
|
||||||
- mouseMoveMap:鼠标移动映射,鼠标的移动将被映射为以startPos为起点,以鼠标移动方向为移动方向的手指拖动操作(开启鼠标移动映射以后会隐藏鼠标,限制鼠标移动范围)。
|
- mouseMoveMap:鼠标移动映射,鼠标的移动将被映射为以startPos为起点,以鼠标移动方向为移动方向的手指拖动操作(开启鼠标移动映射以后会隐藏鼠标,限制鼠标移动范围)。
|
||||||
一般在FPS手游中用来调整人物视野。
|
一般在FPS手游中用来调整人物视野。
|
||||||
- startPos 手指拖动起始点
|
- startPos 手指拖动起始点
|
||||||
- speedRatio 鼠标移动映射为手指拖动的比例,可以控制鼠标灵敏度
|
- speedRatio 鼠标移动映射为手指拖动的比例,可以控制鼠标灵敏度,数值要大于0.00,数值越大,灵敏度越低
|
||||||
|
- smallEyes 触发小眼睛的按键,按下此按键以后,鼠标的移动将被映射为以smallEyes.pos为起点,以鼠标移动方向为移动方向的手指拖动操作
|
||||||
|
|
||||||
- keyMapNodes 一般按键的映射,json数组,所有一般按键映射都放在这个数组中,将键盘的按键映射为普通的手指点击。
|
- keyMapNodes 一般按键的映射,json数组,所有一般按键映射都放在这个数组中,将键盘的按键映射为普通的手指点击。
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,17 @@
|
||||||
"x": 0.57,
|
"x": 0.57,
|
||||||
"y": 0.26
|
"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": [
|
"keyMapNodes": [
|
||||||
{
|
{
|
||||||
|
@ -102,16 +112,6 @@
|
||||||
},
|
},
|
||||||
"switchMap": false
|
"switchMap": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"comment": "小眼睛",
|
|
||||||
"type": "KMT_CLICK",
|
|
||||||
"key": "Key_Alt",
|
|
||||||
"pos": {
|
|
||||||
"x": 0.8,
|
|
||||||
"y": 0.31
|
|
||||||
},
|
|
||||||
"switchMap": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"comment": "捡东西1",
|
"comment": "捡东西1",
|
||||||
"type": "KMT_CLICK",
|
"type": "KMT_CLICK",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue