chore: code format by clang-format

This commit is contained in:
rankun 2020-03-29 02:13:01 +08:00
parent 35b85f7804
commit 827c529b36
68 changed files with 1517 additions and 1346 deletions

227
.clang-format Normal file
View file

@ -0,0 +1,227 @@
---
# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: Cpp
# BasedOnStyle: WebKit
# 访问说明符(public、private等)的偏移
AccessModifierOffset: -4
# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
AlignAfterOpenBracket: AlwaysBreak
# 连续赋值时,对齐所有等号
AlignConsecutiveAssignments: false
# 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations: false
# 左对齐逃脱换行(使用反斜杠换行)的反斜杠
AlignEscapedNewlines: Right
# 水平对齐二元和三元表达式的操作数
AlignOperands: true
# 对齐连续的尾随的注释
AlignTrailingComments: true
# 允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: false
# 允许短的块放在同一行
AllowShortBlocksOnASingleLine: false
# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: false
# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
AllowShortFunctionsOnASingleLine: Empty
# 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine: false
# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine: false
# 总是在定义返回类型后换行(deprecated)
AlwaysBreakAfterDefinitionReturnType: None
# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数),
# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
AlwaysBreakAfterReturnType: None
# 总是在多行string字面量前换行
AlwaysBreakBeforeMultilineStrings: false
# 总是在template声明后换行
AlwaysBreakTemplateDeclarations: true
# false表示函数实参要么都在同一行要么都各自一行
BinPackArguments: false
# false表示所有形参要么都在同一行要么都各自一行
BinPackParameters: false
# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义与Attach类似),
# Mozilla(除枚举、函数、记录定义与Attach类似), Stroustrup(除函数定义、catch、else与Attach类似),
# Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
# 注:这里认为语句块也属于函数
BreakBeforeBraces: Custom
# 大括号换行只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:
# class定义后面
AfterClass: true
# 控制语句后面
AfterControlStatement: false
# enum定义后面
AfterEnum: true
# 函数定义后面
AfterFunction: true
# 命名空间定义后面
AfterNamespace: true
# ObjC定义后面
AfterObjCDeclaration: false
# struct定义后面
AfterStruct: true
# union定义后面
AfterUnion: true
# extern 定义后面
AfterExternBlock: true
# catch之前
BeforeCatch: false
# else 之前
BeforeElse: false
# 缩进大括号
IndentBraces: false
# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators: All
# 继承列表的逗号前换行
BreakBeforeInheritanceComma: true
# 继承列表换行
#BreakInheritanceList: BeforeColon
# 在三元运算符前换行
BreakBeforeTernaryOperators: true
# 在构造函数的初始化列表的逗号前换行
BreakConstructorInitializersBeforeComma: true
# 初始化列表前换行
BreakConstructorInitializers: BeforeComma
# Java注解后换行
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
# 每行字符的限制0表示没有限制
ColumnLimit: 160
# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
CommentPragmas: '^ IWYU pragma:'
# 紧凑 命名空间
CompactNamespaces: false
# 构造函数的初始化列表要么都在同一行,要么都各自一行
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth: 4
# 延续的行的缩进宽度
ContinuationIndentWidth: 4
# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: false
# 继承最常用的指针和引用的对齐方式
DerivePointerAlignment: false
# 关闭格式化
DisableFormat: false
# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
ExperimentalAutoDetectBinPacking: false
# 固定命名空间注释
FixNamespaceComments: true
# 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
# 对#include进行排序匹配了某正则表达式的#include拥有对应的优先级匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前)
# 可以定义负数优先级从而保证某些#include永远在最前面
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
- Regex: 'stdafx\.'
Priority: 1
- Regex: '.*'
Priority: 1
IncludeIsMainRegex: '(Test)?$'
# 缩进case标签
IndentCaseLabels: false
IndentPPDirectives: None
# 缩进宽度
IndentWidth: 4
# 函数返回类型换行时,缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames: true
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
# 保留在块开始处的空行
KeepEmptyLinesAtTheStartOfBlocks: true
# 开始一个块的宏的正则表达式
MacroBlockBegin: ''
# 结束一个块的宏的正则表达式
MacroBlockEnd: ''
# 连续空行的最大数量
MaxEmptyLinesToKeep: 1
# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
# 使用ObjC块时缩进宽度
ObjCBlockIndentWidth: 4
# 在ObjC的@property后添加一个空格
ObjCSpaceAfterProperty: true
# 在ObjC的protocol列表前添加一个空格
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
# 在一个注释中引入换行的penalty
PenaltyBreakComment: 300
# 第一次在<<前换行的penalty
PenaltyBreakFirstLessLess: 120
# 在一个字符串字面量中引入换行的penalty
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
# 对于每个在行字符数限制之外的字符的penalty
PenaltyExcessCharacter: 1000000
# 将函数的返回类型放到它自己的行的penalty
PenaltyReturnTypeOnItsOwnLine: 60
# 指针和引用的对齐: Left, Right, Middle
PointerAlignment: Right
#RawStringFormats:
# - Delimiter: pb
# Language: TextProto
# BasedOnStyle: google
# 允许重新排版注释
ReflowComments: false
# 允许排序#include
SortIncludes: true
SortUsingDeclarations: true
# 在C风格类型转换后添加空格
SpaceAfterCStyleCast: false
# 模板关键字后面添加空格
SpaceAfterTemplateKeyword: true
# 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators: true
# 开圆括号之前添加一个空格: Never, ControlStatements, Always
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
# 在空的圆括号中添加空格
SpaceInEmptyParentheses: false
# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 1
# 在尖括号的<后和>前添加空格
SpacesInAngles: false
# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals: true
# 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false
# 在圆括号的(后和)前添加空格
SpacesInParentheses: false
# 在方括号的[后和]前添加空格lamda表达式和未指明大小的数组的声明不受影响
SpacesInSquareBrackets: false
# 标准: Cpp03, Cpp11, Auto
Standard: Cpp11
# tab宽度
TabWidth: 4
# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab: Never
...

View file

@ -1,15 +1,14 @@
#include <QProcess>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug> #include <QDebug>
#include <QFileInfo>
#include <QDir> #include <QDir>
#include <QFileInfo>
#include <QProcess>
#include "adbprocess.h" #include "adbprocess.h"
QString AdbProcess::s_adbPath = ""; QString AdbProcess::s_adbPath = "";
AdbProcess::AdbProcess(QObject *parent) AdbProcess::AdbProcess(QObject *parent) : QProcess(parent)
: QProcess(parent)
{ {
initSignals(); initSignals();
} }
@ -21,7 +20,7 @@ AdbProcess::~AdbProcess()
} }
} }
const QString& AdbProcess::getAdbPath() const QString &AdbProcess::getAdbPath()
{ {
if (s_adbPath.isEmpty()) { if (s_adbPath.isEmpty()) {
s_adbPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_ADB_PATH")); s_adbPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_ADB_PATH"));
@ -38,8 +37,7 @@ void AdbProcess::initSignals()
// aboutToQuit not exit event loop, so deletelater is ok // aboutToQuit not exit event loop, so deletelater is ok
//connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &AdbProcess::deleteLater); //connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &AdbProcess::deleteLater);
connect(this, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, connect(this, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
[this](int exitCode, QProcess::ExitStatus exitStatus){
if (NormalExit == exitStatus && 0 == exitCode) { if (NormalExit == exitStatus && 0 == exitCode) {
emit adbProcessResult(AER_SUCCESS_EXEC); emit adbProcessResult(AER_SUCCESS_EXEC);
} else { } else {
@ -49,9 +47,8 @@ void AdbProcess::initSignals()
qDebug() << "adb return " << exitCode << "exit status " << exitStatus; qDebug() << "adb return " << exitCode << "exit status " << exitStatus;
}); });
connect(this, &QProcess::errorOccurred, this, connect(this, &QProcess::errorOccurred, this, [this](QProcess::ProcessError error) {
[this](QProcess::ProcessError error){ if (QProcess::FailedToStart == error) {
if (QProcess::FailedToStart == error) {
emit adbProcessResult(AER_ERROR_MISSING_BINARY); emit adbProcessResult(AER_ERROR_MISSING_BINARY);
} else { } else {
emit adbProcessResult(AER_ERROR_START); emit adbProcessResult(AER_ERROR_START);
@ -60,27 +57,22 @@ void AdbProcess::initSignals()
} }
}); });
connect(this, &QProcess::readyReadStandardError, this, connect(this, &QProcess::readyReadStandardError, this, [this]() {
[this](){
QString tmp = QString::fromUtf8(readAllStandardError()).trimmed(); QString tmp = QString::fromUtf8(readAllStandardError()).trimmed();
m_errorOutput += tmp; m_errorOutput += tmp;
qWarning(QString("AdbProcess::error:%1").arg(tmp).toStdString().data()); qWarning(QString("AdbProcess::error:%1").arg(tmp).toStdString().data());
}); });
connect(this, &QProcess::readyReadStandardOutput, this, connect(this, &QProcess::readyReadStandardOutput, this, [this]() {
[this](){
QString tmp = QString::fromUtf8(readAllStandardOutput()).trimmed(); QString tmp = QString::fromUtf8(readAllStandardOutput()).trimmed();
m_standardOutput += tmp; m_standardOutput += tmp;
qInfo(QString("AdbProcess::out:%1").arg(tmp).toStdString().data()); qInfo(QString("AdbProcess::out:%1").arg(tmp).toStdString().data());
}); });
connect(this, &QProcess::started, this, connect(this, &QProcess::started, this, [this]() { emit adbProcessResult(AER_SUCCESS_START); });
[this](){
emit adbProcessResult(AER_SUCCESS_START);
});
} }
void AdbProcess::execute(const QString& serial, const QStringList& args) void AdbProcess::execute(const QString &serial, const QStringList &args)
{ {
m_standardOutput = ""; m_standardOutput = "";
m_errorOutput = ""; m_errorOutput = "";
@ -105,7 +97,11 @@ bool AdbProcess::isRuning()
void AdbProcess::setShowTouchesEnabled(const QString &serial, bool enabled) void AdbProcess::setShowTouchesEnabled(const QString &serial, bool enabled)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "shell" << "settings" << "put" << "system" << "show_touches"; adbArgs << "shell"
<< "settings"
<< "put"
<< "system"
<< "show_touches";
adbArgs << (enabled ? "1" : "0"); adbArgs << (enabled ? "1" : "0");
execute(serial, adbArgs); execute(serial, adbArgs);
} }
@ -115,7 +111,7 @@ QStringList AdbProcess::getDevicesSerialFromStdOut()
// get devices serial by adb devices // get devices serial by adb devices
QStringList serials; QStringList serials;
QStringList devicesInfoList = m_standardOutput.split(QRegExp("\r\n|\n"), QString::SkipEmptyParts); QStringList devicesInfoList = m_standardOutput.split(QRegExp("\r\n|\n"), QString::SkipEmptyParts);
for(QString deviceInfo : devicesInfoList) { for (QString deviceInfo : devicesInfoList) {
QStringList deviceInfos = deviceInfo.split(QRegExp("\t"), QString::SkipEmptyParts); QStringList deviceInfos = deviceInfo.split(QRegExp("\t"), QString::SkipEmptyParts);
if (2 == deviceInfos.count() && 0 == deviceInfos[1].compare("device")) { if (2 == deviceInfos.count() && 0 == deviceInfos[1].compare("device")) {
serials << deviceInfos[0]; serials << deviceInfos[0];
@ -136,7 +132,7 @@ QString AdbProcess::getDeviceIPFromStdOut()
} }
#else #else
QString strIPExp = "inet addr:[\\d.]*"; QString strIPExp = "inet addr:[\\d.]*";
QRegExp ipRegExp(strIPExp,Qt::CaseInsensitive); QRegExp ipRegExp(strIPExp, Qt::CaseInsensitive);
if (ipRegExp.indexIn(m_standardOutput) != -1) { if (ipRegExp.indexIn(m_standardOutput) != -1) {
ip = ipRegExp.cap(0); ip = ipRegExp.cap(0);
ip = ip.right(ip.size() - 10); ip = ip.right(ip.size() - 10);
@ -151,7 +147,7 @@ QString AdbProcess::getDeviceIPByIpFromStdOut()
QString ip = ""; QString ip = "";
QString strIPExp = "wlan0 inet [\\d.]*"; QString strIPExp = "wlan0 inet [\\d.]*";
QRegExp ipRegExp(strIPExp,Qt::CaseInsensitive); QRegExp ipRegExp(strIPExp, Qt::CaseInsensitive);
if (ipRegExp.indexIn(m_standardOutput) != -1) { if (ipRegExp.indexIn(m_standardOutput) != -1) {
ip = ipRegExp.cap(0); ip = ipRegExp.cap(0);
ip = ip.right(ip.size() - 14); ip = ip.right(ip.size() - 14);
@ -170,7 +166,7 @@ QString AdbProcess::getErrorOut()
return m_errorOutput; return m_errorOutput;
} }
void AdbProcess::forward(const QString& serial, quint16 localPort, const QString& deviceSocketName) void AdbProcess::forward(const QString &serial, quint16 localPort, const QString &deviceSocketName)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "forward"; adbArgs << "forward";
@ -179,7 +175,7 @@ void AdbProcess::forward(const QString& serial, quint16 localPort, const QString
execute(serial, adbArgs); execute(serial, adbArgs);
} }
void AdbProcess::forwardRemove(const QString& serial, quint16 localPort) void AdbProcess::forwardRemove(const QString &serial, quint16 localPort)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "forward"; adbArgs << "forward";
@ -188,7 +184,7 @@ void AdbProcess::forwardRemove(const QString& serial, quint16 localPort)
execute(serial, adbArgs); execute(serial, adbArgs);
} }
void AdbProcess::reverse(const QString& serial, const QString& deviceSocketName, quint16 localPort) void AdbProcess::reverse(const QString &serial, const QString &deviceSocketName, quint16 localPort)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "reverse"; adbArgs << "reverse";
@ -197,7 +193,7 @@ void AdbProcess::reverse(const QString& serial, const QString& deviceSocketName,
execute(serial, adbArgs); execute(serial, adbArgs);
} }
void AdbProcess::reverseRemove(const QString& serial, const QString& deviceSocketName) void AdbProcess::reverseRemove(const QString &serial, const QString &deviceSocketName)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "reverse"; adbArgs << "reverse";
@ -206,7 +202,7 @@ void AdbProcess::reverseRemove(const QString& serial, const QString& deviceSocke
execute(serial, adbArgs); execute(serial, adbArgs);
} }
void AdbProcess::push(const QString& serial, const QString& local, const QString& remote) void AdbProcess::push(const QString &serial, const QString &local, const QString &remote)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "push"; adbArgs << "push";
@ -215,7 +211,7 @@ void AdbProcess::push(const QString& serial, const QString& local, const QString
execute(serial, adbArgs); execute(serial, adbArgs);
} }
void AdbProcess::install(const QString& serial, const QString& local) void AdbProcess::install(const QString &serial, const QString &local)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "install"; adbArgs << "install";
@ -224,7 +220,7 @@ void AdbProcess::install(const QString& serial, const QString& local)
execute(serial, adbArgs); execute(serial, adbArgs);
} }
void AdbProcess::removePath(const QString& serial, const QString& path) void AdbProcess::removePath(const QString &serial, const QString &path)
{ {
QStringList adbArgs; QStringList adbArgs;
adbArgs << "shell"; adbArgs << "shell";

View file

@ -8,34 +8,35 @@ class AdbProcess : public QProcess
Q_OBJECT Q_OBJECT
public: public:
enum ADB_EXEC_RESULT { enum ADB_EXEC_RESULT
AER_SUCCESS_START, // 启动成功 {
AER_ERROR_START, // 启动失败 AER_SUCCESS_START, // 启动成功
AER_SUCCESS_EXEC, // 执行成功 AER_ERROR_START, // 启动失败
AER_ERROR_EXEC, // 执行失败 AER_SUCCESS_EXEC, // 执行成功
AER_ERROR_MISSING_BINARY, // 找不到文件 AER_ERROR_EXEC, // 执行失败
AER_ERROR_MISSING_BINARY, // 找不到文件
}; };
explicit AdbProcess(QObject *parent = nullptr); explicit AdbProcess(QObject *parent = nullptr);
virtual ~AdbProcess(); virtual ~AdbProcess();
void execute(const QString& serial, const QStringList& args); void execute(const QString &serial, const QStringList &args);
void forward(const QString& serial, quint16 localPort, const QString& deviceSocketName); void forward(const QString &serial, quint16 localPort, const QString &deviceSocketName);
void forwardRemove(const QString& serial, quint16 localPort); void forwardRemove(const QString &serial, quint16 localPort);
void reverse(const QString& serial, const QString& deviceSocketName, quint16 localPort); void reverse(const QString &serial, const QString &deviceSocketName, quint16 localPort);
void reverseRemove(const QString& serial, const QString& deviceSocketName); void reverseRemove(const QString &serial, const QString &deviceSocketName);
void push(const QString& serial, const QString& local, const QString& remote); void push(const QString &serial, const QString &local, const QString &remote);
void install(const QString& serial, const QString& local); void install(const QString &serial, const QString &local);
void removePath(const QString& serial, const QString& path); void removePath(const QString &serial, const QString &path);
bool isRuning(); bool isRuning();
void setShowTouchesEnabled(const QString& serial, bool enabled); void setShowTouchesEnabled(const QString &serial, bool enabled);
QStringList getDevicesSerialFromStdOut(); QStringList getDevicesSerialFromStdOut();
QString getDeviceIPFromStdOut(); QString getDeviceIPFromStdOut();
QString getDeviceIPByIpFromStdOut(); QString getDeviceIPByIpFromStdOut();
QString getStdOut(); QString getStdOut();
QString getErrorOut(); QString getErrorOut();
static const QString& getAdbPath(); static const QString &getAdbPath();
signals: signals:
void adbProcessResult(ADB_EXEC_RESULT processResult); void adbProcessResult(ADB_EXEC_RESULT processResult);

View file

@ -0,0 +1,84 @@
#!/bin/bash
#
# clang-format-all: a tool to run clang-format on an entire project
# Copyright (C) 2016 Evan Klitzke <evan@eklitzke.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
function usage {
echo "Usage: $0 DIR..."
exit 1
}
if [ $# -eq 0 ]; then
usage
fi
# Variable that will hold the name of the clang-format command
FMT=""
# Some distros just call it clang-format. Others (e.g. Ubuntu) are insistent
# that the version number be part of the command. We prefer clang-format if
# that's present, otherwise we work backwards from highest version to lowest
# version.
for clangfmt in clang-format{,-{4,3}.{9,8,7,6,5,4,3,2,1,0}}; do
if which "$clangfmt" &>/dev/null; then
FMT="$clangfmt"
break
fi
done
# Check if we found a working clang-format
if [ -z "$FMT" ]; then
echo "failed to find clang-format"
exit 1
fi
# Check all of the arguments first to make sure they're all directories
for dir in "$@"; do
if [ ! -d "${dir}" ]; then
echo "${dir} is not a directory"
usage
fi
done
# Find a dominating file, starting from a given directory and going up.
find-dominating-file() {
if [ -r "$1"/"$2" ]; then
return 0
fi
if [ "$1" = "/" ]; then
return 1
fi
find-dominating-file "$(realpath "$1"/..)" "$2"
return $?
}
# Run clang-format -i on all of the things
for dir in "$@"; do
pushd "${dir}" &>/dev/null
if ! find-dominating-file . .clang-format; then
echo "Failed to find dominating .clang-format starting at $PWD"
continue
fi
find . \
\( -name '*.c' \
-o -name '*.cc' \
-o -name '*.cpp' \
-o -name '*.h' \
-o -name '*.hh' \
-o -name '*.hpp' \) \
-exec "${FMT}" -i '{}' \;
popd &>/dev/null
done

View file

@ -5,17 +5,18 @@
class QScrcpyEvent : public QEvent class QScrcpyEvent : public QEvent
{ {
public: public:
enum Type { enum Type
{
VideoSocket = QEvent::User + 1, VideoSocket = QEvent::User + 1,
Control, Control,
}; };
QScrcpyEvent(Type type) : QEvent(QEvent::Type(type)){} QScrcpyEvent(Type type) : QEvent(QEvent::Type(type)) {}
}; };
// VideoSocketEvent // VideoSocketEvent
class VideoSocketEvent : public QScrcpyEvent class VideoSocketEvent : public QScrcpyEvent
{ {
public: public:
VideoSocketEvent() : QScrcpyEvent(VideoSocket){} VideoSocketEvent() : QScrcpyEvent(VideoSocket) {}
}; };
#endif // QSCRCPYEVENT_H #endif // QSCRCPYEVENT_H

View file

@ -23,7 +23,8 @@
/** /**
* Meta key / modifer state. * Meta key / modifer state.
*/ */
enum AndroidMetastate { enum AndroidMetastate
{
/** No meta keys are pressed. */ /** No meta keys are pressed. */
AMETA_NONE = 0, AMETA_NONE = 0,
@ -82,7 +83,8 @@ enum AndroidMetastate {
/** /**
* Input event types. * Input event types.
*/ */
enum AndroidInputEventType { enum AndroidInputEventType
{
/** Indicates that the input event is a key event. */ /** Indicates that the input event is a key event. */
AINPUT_EVENT_TYPE_KEY = 1, AINPUT_EVENT_TYPE_KEY = 1,
/** Indicates that the input event is a motion event. */ /** Indicates that the input event is a motion event. */
@ -92,7 +94,8 @@ enum AndroidInputEventType {
/** /**
* Key event actions. * Key event actions.
*/ */
enum AndroidKeyeventAction { enum AndroidKeyeventAction
{
/** The key has been pressed down. */ /** The key has been pressed down. */
AKEY_EVENT_ACTION_DOWN = 0, AKEY_EVENT_ACTION_DOWN = 0,
@ -111,7 +114,8 @@ enum AndroidKeyeventAction {
/** /**
* Key event flags. * Key event flags.
*/ */
enum AndroidKeyeventFlags { enum AndroidKeyeventFlags
{
/** This mask is set if the device woke because of this key event. */ /** This mask is set if the device woke because of this key event. */
AKEY_EVENT_FLAG_WOKE_HERE = 0x1, AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
@ -195,7 +199,8 @@ enum AndroidKeyeventFlags {
#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8 #define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
/** Motion event actions */ /** Motion event actions */
enum AndroidMotioneventAction { enum AndroidMotioneventAction
{
/** Bit mask of the parts of the action code that are the action itself. */ /** Bit mask of the parts of the action code that are the action itself. */
AMOTION_EVENT_ACTION_MASK = 0xff, AMOTION_EVENT_ACTION_MASK = 0xff,
@ -205,7 +210,7 @@ enum AndroidMotioneventAction {
* down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
* index where the data for the pointer going up or down can be found. * index where the data for the pointer going up or down can be found.
*/ */
AMOTION_EVENT_ACTION_POINTER_INDEX_MASK = 0xff00, AMOTION_EVENT_ACTION_POINTER_INDEX_MASK = 0xff00,
/** A pressed gesture has started, the motion contains the initial starting location. */ /** A pressed gesture has started, the motion contains the initial starting location. */
AMOTION_EVENT_ACTION_DOWN = 0, AMOTION_EVENT_ACTION_DOWN = 0,
@ -281,7 +286,8 @@ enum AndroidMotioneventAction {
/** /**
* Motion event flags. * Motion event flags.
*/ */
enum AndroidMotioneventFlags { enum AndroidMotioneventFlags
{
/** /**
* This flag indicates that the window that received this motion event is partly * This flag indicates that the window that received this motion event is partly
* or wholly obscured by another visible window above it. This flag is set to true * or wholly obscured by another visible window above it. This flag is set to true
@ -298,7 +304,8 @@ enum AndroidMotioneventFlags {
/** /**
* Motion event edge touch flags. * Motion event edge touch flags.
*/ */
enum AndroidMotioneventEdgeTouchTlags { enum AndroidMotioneventEdgeTouchTlags
{
/** No edges intersected. */ /** No edges intersected. */
AMOTION_EVENT_EDGE_FLAG_NONE = 0, AMOTION_EVENT_EDGE_FLAG_NONE = 0,
@ -319,7 +326,8 @@ enum AndroidMotioneventEdgeTouchTlags {
* Constants that identify each individual axis of a motion event. * Constants that identify each individual axis of a motion event.
* @anchor AMOTION_EVENT_AXIS * @anchor AMOTION_EVENT_AXIS
*/ */
enum AndroidMotioneventAxis { enum AndroidMotioneventAxis
{
/** /**
* Axis constant: X axis of a motion event. * Axis constant: X axis of a motion event.
* *
@ -688,7 +696,8 @@ enum AndroidMotioneventAxis {
* Constants that identify buttons that are associated with motion events. * Constants that identify buttons that are associated with motion events.
* Refer to the documentation on the MotionEvent class for descriptions of each button. * Refer to the documentation on the MotionEvent class for descriptions of each button.
*/ */
enum AndroidMotioneventButtons { enum AndroidMotioneventButtons
{
/** primary */ /** primary */
AMOTION_EVENT_BUTTON_PRIMARY = 1 << 0, AMOTION_EVENT_BUTTON_PRIMARY = 1 << 0,
/** secondary */ /** secondary */
@ -707,7 +716,8 @@ enum AndroidMotioneventButtons {
* Constants that identify tool types. * Constants that identify tool types.
* Refer to the documentation on the MotionEvent class for descriptions of each tool type. * Refer to the documentation on the MotionEvent class for descriptions of each tool type.
*/ */
enum AndroidMotioneventToolType { enum AndroidMotioneventToolType
{
/** unknown */ /** unknown */
AMOTION_EVENT_TOOL_TYPE_UNKNOWN = 0, AMOTION_EVENT_TOOL_TYPE_UNKNOWN = 0,
/** finger */ /** finger */
@ -726,7 +736,8 @@ enum AndroidMotioneventToolType {
* Refer to the documentation on android.view.InputDevice for more details about input sources * Refer to the documentation on android.view.InputDevice for more details about input sources
* and their correct interpretation. * and their correct interpretation.
*/ */
enum AndroidInputSourceClass { enum AndroidInputSourceClass
{
/** mask */ /** mask */
AINPUT_SOURCE_CLASS_MASK = 0x000000ff, AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
@ -747,7 +758,8 @@ enum AndroidInputSourceClass {
/** /**
* Input sources. * Input sources.
*/ */
enum AndroidInputSource { enum AndroidInputSource
{
/** unknown */ /** unknown */
AINPUT_SOURCE_UNKNOWN = 0x00000000, AINPUT_SOURCE_UNKNOWN = 0x00000000,
@ -784,7 +796,8 @@ enum AndroidInputSource {
* *
* Refer to the documentation on android.view.InputDevice for more details. * Refer to the documentation on android.view.InputDevice for more details.
*/ */
enum AndroidKeyboardType { enum AndroidKeyboardType
{
/** none */ /** none */
AINPUT_KEYBOARD_TYPE_NONE = 0, AINPUT_KEYBOARD_TYPE_NONE = 0,
/** non alphabetic */ /** non alphabetic */
@ -802,7 +815,8 @@ enum AndroidKeyboardType {
* *
* @deprecated These constants are deprecated. Use {@link AMOTION_EVENT_AXIS AMOTION_EVENT_AXIS_*} constants instead. * @deprecated These constants are deprecated. Use {@link AMOTION_EVENT_AXIS AMOTION_EVENT_AXIS_*} constants instead.
*/ */
enum AndroidMotionRange { enum AndroidMotionRange
{
/** x */ /** x */
AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X, AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
/** y */ /** y */

View file

@ -23,395 +23,396 @@
/** /**
* Key codes. * Key codes.
*/ */
enum AndroidKeycode { enum AndroidKeycode
{
/** Unknown key code. */ /** Unknown key code. */
AKEYCODE_UNKNOWN = 0, AKEYCODE_UNKNOWN = 0,
/** Soft Left key. /** Soft Left key.
* Usually situated below the display on phones and used as a multi-function * Usually situated below the display on phones and used as a multi-function
* feature key for selecting a software defined function shown on the bottom left * feature key for selecting a software defined function shown on the bottom left
* of the display. */ * of the display. */
AKEYCODE_SOFT_LEFT = 1, AKEYCODE_SOFT_LEFT = 1,
/** Soft Right key. /** Soft Right key.
* Usually situated below the display on phones and used as a multi-function * Usually situated below the display on phones and used as a multi-function
* feature key for selecting a software defined function shown on the bottom right * feature key for selecting a software defined function shown on the bottom right
* of the display. */ * of the display. */
AKEYCODE_SOFT_RIGHT = 2, AKEYCODE_SOFT_RIGHT = 2,
/** Home key. /** Home key.
* This key is handled by the framework and is never delivered to applications. */ * This key is handled by the framework and is never delivered to applications. */
AKEYCODE_HOME = 3, AKEYCODE_HOME = 3,
/** Back key. */ /** Back key. */
AKEYCODE_BACK = 4, AKEYCODE_BACK = 4,
/** Call key. */ /** Call key. */
AKEYCODE_CALL = 5, AKEYCODE_CALL = 5,
/** End Call key. */ /** End Call key. */
AKEYCODE_ENDCALL = 6, AKEYCODE_ENDCALL = 6,
/** '0' key. */ /** '0' key. */
AKEYCODE_0 = 7, AKEYCODE_0 = 7,
/** '1' key. */ /** '1' key. */
AKEYCODE_1 = 8, AKEYCODE_1 = 8,
/** '2' key. */ /** '2' key. */
AKEYCODE_2 = 9, AKEYCODE_2 = 9,
/** '3' key. */ /** '3' key. */
AKEYCODE_3 = 10, AKEYCODE_3 = 10,
/** '4' key. */ /** '4' key. */
AKEYCODE_4 = 11, AKEYCODE_4 = 11,
/** '5' key. */ /** '5' key. */
AKEYCODE_5 = 12, AKEYCODE_5 = 12,
/** '6' key. */ /** '6' key. */
AKEYCODE_6 = 13, AKEYCODE_6 = 13,
/** '7' key. */ /** '7' key. */
AKEYCODE_7 = 14, AKEYCODE_7 = 14,
/** '8' key. */ /** '8' key. */
AKEYCODE_8 = 15, AKEYCODE_8 = 15,
/** '9' key. */ /** '9' key. */
AKEYCODE_9 = 16, AKEYCODE_9 = 16,
/** '*' key. */ /** '*' key. */
AKEYCODE_STAR = 17, AKEYCODE_STAR = 17,
/** '#' key. */ /** '#' key. */
AKEYCODE_POUND = 18, AKEYCODE_POUND = 18,
/** Directional Pad Up key. /** Directional Pad Up key.
* May also be synthesized from trackball motions. */ * May also be synthesized from trackball motions. */
AKEYCODE_DPAD_UP = 19, AKEYCODE_DPAD_UP = 19,
/** Directional Pad Down key. /** Directional Pad Down key.
* May also be synthesized from trackball motions. */ * May also be synthesized from trackball motions. */
AKEYCODE_DPAD_DOWN = 20, AKEYCODE_DPAD_DOWN = 20,
/** Directional Pad Left key. /** Directional Pad Left key.
* May also be synthesized from trackball motions. */ * May also be synthesized from trackball motions. */
AKEYCODE_DPAD_LEFT = 21, AKEYCODE_DPAD_LEFT = 21,
/** Directional Pad Right key. /** Directional Pad Right key.
* May also be synthesized from trackball motions. */ * May also be synthesized from trackball motions. */
AKEYCODE_DPAD_RIGHT = 22, AKEYCODE_DPAD_RIGHT = 22,
/** Directional Pad Center key. /** Directional Pad Center key.
* May also be synthesized from trackball motions. */ * May also be synthesized from trackball motions. */
AKEYCODE_DPAD_CENTER = 23, AKEYCODE_DPAD_CENTER = 23,
/** Volume Up key. /** Volume Up key.
* Adjusts the speaker volume up. */ * Adjusts the speaker volume up. */
AKEYCODE_VOLUME_UP = 24, AKEYCODE_VOLUME_UP = 24,
/** Volume Down key. /** Volume Down key.
* Adjusts the speaker volume down. */ * Adjusts the speaker volume down. */
AKEYCODE_VOLUME_DOWN = 25, AKEYCODE_VOLUME_DOWN = 25,
/** Power key. */ /** Power key. */
AKEYCODE_POWER = 26, AKEYCODE_POWER = 26,
/** Camera key. /** Camera key.
* Used to launch a camera application or take pictures. */ * Used to launch a camera application or take pictures. */
AKEYCODE_CAMERA = 27, AKEYCODE_CAMERA = 27,
/** Clear key. */ /** Clear key. */
AKEYCODE_CLEAR = 28, AKEYCODE_CLEAR = 28,
/** 'A' key. */ /** 'A' key. */
AKEYCODE_A = 29, AKEYCODE_A = 29,
/** 'B' key. */ /** 'B' key. */
AKEYCODE_B = 30, AKEYCODE_B = 30,
/** 'C' key. */ /** 'C' key. */
AKEYCODE_C = 31, AKEYCODE_C = 31,
/** 'D' key. */ /** 'D' key. */
AKEYCODE_D = 32, AKEYCODE_D = 32,
/** 'E' key. */ /** 'E' key. */
AKEYCODE_E = 33, AKEYCODE_E = 33,
/** 'F' key. */ /** 'F' key. */
AKEYCODE_F = 34, AKEYCODE_F = 34,
/** 'G' key. */ /** 'G' key. */
AKEYCODE_G = 35, AKEYCODE_G = 35,
/** 'H' key. */ /** 'H' key. */
AKEYCODE_H = 36, AKEYCODE_H = 36,
/** 'I' key. */ /** 'I' key. */
AKEYCODE_I = 37, AKEYCODE_I = 37,
/** 'J' key. */ /** 'J' key. */
AKEYCODE_J = 38, AKEYCODE_J = 38,
/** 'K' key. */ /** 'K' key. */
AKEYCODE_K = 39, AKEYCODE_K = 39,
/** 'L' key. */ /** 'L' key. */
AKEYCODE_L = 40, AKEYCODE_L = 40,
/** 'M' key. */ /** 'M' key. */
AKEYCODE_M = 41, AKEYCODE_M = 41,
/** 'N' key. */ /** 'N' key. */
AKEYCODE_N = 42, AKEYCODE_N = 42,
/** 'O' key. */ /** 'O' key. */
AKEYCODE_O = 43, AKEYCODE_O = 43,
/** 'P' key. */ /** 'P' key. */
AKEYCODE_P = 44, AKEYCODE_P = 44,
/** 'Q' key. */ /** 'Q' key. */
AKEYCODE_Q = 45, AKEYCODE_Q = 45,
/** 'R' key. */ /** 'R' key. */
AKEYCODE_R = 46, AKEYCODE_R = 46,
/** 'S' key. */ /** 'S' key. */
AKEYCODE_S = 47, AKEYCODE_S = 47,
/** 'T' key. */ /** 'T' key. */
AKEYCODE_T = 48, AKEYCODE_T = 48,
/** 'U' key. */ /** 'U' key. */
AKEYCODE_U = 49, AKEYCODE_U = 49,
/** 'V' key. */ /** 'V' key. */
AKEYCODE_V = 50, AKEYCODE_V = 50,
/** 'W' key. */ /** 'W' key. */
AKEYCODE_W = 51, AKEYCODE_W = 51,
/** 'X' key. */ /** 'X' key. */
AKEYCODE_X = 52, AKEYCODE_X = 52,
/** 'Y' key. */ /** 'Y' key. */
AKEYCODE_Y = 53, AKEYCODE_Y = 53,
/** 'Z' key. */ /** 'Z' key. */
AKEYCODE_Z = 54, AKEYCODE_Z = 54,
/** ',' key. */ /** ',' key. */
AKEYCODE_COMMA = 55, AKEYCODE_COMMA = 55,
/** '.' key. */ /** '.' key. */
AKEYCODE_PERIOD = 56, AKEYCODE_PERIOD = 56,
/** Left Alt modifier key. */ /** Left Alt modifier key. */
AKEYCODE_ALT_LEFT = 57, AKEYCODE_ALT_LEFT = 57,
/** Right Alt modifier key. */ /** Right Alt modifier key. */
AKEYCODE_ALT_RIGHT = 58, AKEYCODE_ALT_RIGHT = 58,
/** Left Shift modifier key. */ /** Left Shift modifier key. */
AKEYCODE_SHIFT_LEFT = 59, AKEYCODE_SHIFT_LEFT = 59,
/** Right Shift modifier key. */ /** Right Shift modifier key. */
AKEYCODE_SHIFT_RIGHT = 60, AKEYCODE_SHIFT_RIGHT = 60,
/** Tab key. */ /** Tab key. */
AKEYCODE_TAB = 61, AKEYCODE_TAB = 61,
/** Space key. */ /** Space key. */
AKEYCODE_SPACE = 62, AKEYCODE_SPACE = 62,
/** Symbol modifier key. /** Symbol modifier key.
* Used to enter alternate symbols. */ * Used to enter alternate symbols. */
AKEYCODE_SYM = 63, AKEYCODE_SYM = 63,
/** Explorer special function key. /** Explorer special function key.
* Used to launch a browser application. */ * Used to launch a browser application. */
AKEYCODE_EXPLORER = 64, AKEYCODE_EXPLORER = 64,
/** Envelope special function key. /** Envelope special function key.
* Used to launch a mail application. */ * Used to launch a mail application. */
AKEYCODE_ENVELOPE = 65, AKEYCODE_ENVELOPE = 65,
/** Enter key. */ /** Enter key. */
AKEYCODE_ENTER = 66, AKEYCODE_ENTER = 66,
/** Backspace key. /** Backspace key.
* Deletes characters before the insertion point, unlike {@link AKEYCODE_FORWARD_DEL}. */ * Deletes characters before the insertion point, unlike {@link AKEYCODE_FORWARD_DEL}. */
AKEYCODE_DEL = 67, AKEYCODE_DEL = 67,
/** '`' (backtick) key. */ /** '`' (backtick) key. */
AKEYCODE_GRAVE = 68, AKEYCODE_GRAVE = 68,
/** '-'. */ /** '-'. */
AKEYCODE_MINUS = 69, AKEYCODE_MINUS = 69,
/** '=' key. */ /** '=' key. */
AKEYCODE_EQUALS = 70, AKEYCODE_EQUALS = 70,
/** '[' key. */ /** '[' key. */
AKEYCODE_LEFT_BRACKET = 71, AKEYCODE_LEFT_BRACKET = 71,
/** ']' key. */ /** ']' key. */
AKEYCODE_RIGHT_BRACKET = 72, AKEYCODE_RIGHT_BRACKET = 72,
/** '\' key. */ /** '\' key. */
AKEYCODE_BACKSLASH = 73, AKEYCODE_BACKSLASH = 73,
/** ';' key. */ /** ';' key. */
AKEYCODE_SEMICOLON = 74, AKEYCODE_SEMICOLON = 74,
/** ''' (apostrophe) key. */ /** ''' (apostrophe) key. */
AKEYCODE_APOSTROPHE = 75, AKEYCODE_APOSTROPHE = 75,
/** '/' key. */ /** '/' key. */
AKEYCODE_SLASH = 76, AKEYCODE_SLASH = 76,
/** '@' key. */ /** '@' key. */
AKEYCODE_AT = 77, AKEYCODE_AT = 77,
/** Number modifier key. /** Number modifier key.
* Used to enter numeric symbols. * Used to enter numeric symbols.
* This key is not {@link AKEYCODE_NUM_LOCK}; it is more like {@link AKEYCODE_ALT_LEFT}. */ * This key is not {@link AKEYCODE_NUM_LOCK}; it is more like {@link AKEYCODE_ALT_LEFT}. */
AKEYCODE_NUM = 78, AKEYCODE_NUM = 78,
/** Headset Hook key. /** Headset Hook key.
* Used to hang up calls and stop media. */ * Used to hang up calls and stop media. */
AKEYCODE_HEADSETHOOK = 79, AKEYCODE_HEADSETHOOK = 79,
/** Camera Focus key. /** Camera Focus key.
* Used to focus the camera. */ * Used to focus the camera. */
AKEYCODE_FOCUS = 80, AKEYCODE_FOCUS = 80,
/** '+' key. */ /** '+' key. */
AKEYCODE_PLUS = 81, AKEYCODE_PLUS = 81,
/** Menu key. */ /** Menu key. */
AKEYCODE_MENU = 82, AKEYCODE_MENU = 82,
/** Notification key. */ /** Notification key. */
AKEYCODE_NOTIFICATION = 83, AKEYCODE_NOTIFICATION = 83,
/** Search key. */ /** Search key. */
AKEYCODE_SEARCH = 84, AKEYCODE_SEARCH = 84,
/** Play/Pause media key. */ /** Play/Pause media key. */
AKEYCODE_MEDIA_PLAY_PAUSE= 85, AKEYCODE_MEDIA_PLAY_PAUSE = 85,
/** Stop media key. */ /** Stop media key. */
AKEYCODE_MEDIA_STOP = 86, AKEYCODE_MEDIA_STOP = 86,
/** Play Next media key. */ /** Play Next media key. */
AKEYCODE_MEDIA_NEXT = 87, AKEYCODE_MEDIA_NEXT = 87,
/** Play Previous media key. */ /** Play Previous media key. */
AKEYCODE_MEDIA_PREVIOUS = 88, AKEYCODE_MEDIA_PREVIOUS = 88,
/** Rewind media key. */ /** Rewind media key. */
AKEYCODE_MEDIA_REWIND = 89, AKEYCODE_MEDIA_REWIND = 89,
/** Fast Forward media key. */ /** Fast Forward media key. */
AKEYCODE_MEDIA_FAST_FORWARD = 90, AKEYCODE_MEDIA_FAST_FORWARD = 90,
/** Mute key. /** Mute key.
* Mutes the microphone, unlike {@link AKEYCODE_VOLUME_MUTE}. */ * Mutes the microphone, unlike {@link AKEYCODE_VOLUME_MUTE}. */
AKEYCODE_MUTE = 91, AKEYCODE_MUTE = 91,
/** Page Up key. */ /** Page Up key. */
AKEYCODE_PAGE_UP = 92, AKEYCODE_PAGE_UP = 92,
/** Page Down key. */ /** Page Down key. */
AKEYCODE_PAGE_DOWN = 93, AKEYCODE_PAGE_DOWN = 93,
/** Picture Symbols modifier key. /** Picture Symbols modifier key.
* Used to switch symbol sets (Emoji, Kao-moji). */ * Used to switch symbol sets (Emoji, Kao-moji). */
AKEYCODE_PICTSYMBOLS = 94, AKEYCODE_PICTSYMBOLS = 94,
/** Switch Charset modifier key. /** Switch Charset modifier key.
* Used to switch character sets (Kanji, Katakana). */ * Used to switch character sets (Kanji, Katakana). */
AKEYCODE_SWITCH_CHARSET = 95, AKEYCODE_SWITCH_CHARSET = 95,
/** A Button key. /** A Button key.
* On a game controller, the A button should be either the button labeled A * On a game controller, the A button should be either the button labeled A
* or the first button on the bottom row of controller buttons. */ * or the first button on the bottom row of controller buttons. */
AKEYCODE_BUTTON_A = 96, AKEYCODE_BUTTON_A = 96,
/** B Button key. /** B Button key.
* On a game controller, the B button should be either the button labeled B * On a game controller, the B button should be either the button labeled B
* or the second button on the bottom row of controller buttons. */ * or the second button on the bottom row of controller buttons. */
AKEYCODE_BUTTON_B = 97, AKEYCODE_BUTTON_B = 97,
/** C Button key. /** C Button key.
* On a game controller, the C button should be either the button labeled C * On a game controller, the C button should be either the button labeled C
* or the third button on the bottom row of controller buttons. */ * or the third button on the bottom row of controller buttons. */
AKEYCODE_BUTTON_C = 98, AKEYCODE_BUTTON_C = 98,
/** X Button key. /** X Button key.
* On a game controller, the X button should be either the button labeled X * On a game controller, the X button should be either the button labeled X
* or the first button on the upper row of controller buttons. */ * or the first button on the upper row of controller buttons. */
AKEYCODE_BUTTON_X = 99, AKEYCODE_BUTTON_X = 99,
/** Y Button key. /** Y Button key.
* On a game controller, the Y button should be either the button labeled Y * On a game controller, the Y button should be either the button labeled Y
* or the second button on the upper row of controller buttons. */ * or the second button on the upper row of controller buttons. */
AKEYCODE_BUTTON_Y = 100, AKEYCODE_BUTTON_Y = 100,
/** Z Button key. /** Z Button key.
* On a game controller, the Z button should be either the button labeled Z * On a game controller, the Z button should be either the button labeled Z
* or the third button on the upper row of controller buttons. */ * or the third button on the upper row of controller buttons. */
AKEYCODE_BUTTON_Z = 101, AKEYCODE_BUTTON_Z = 101,
/** L1 Button key. /** L1 Button key.
* On a game controller, the L1 button should be either the button labeled L1 (or L) * On a game controller, the L1 button should be either the button labeled L1 (or L)
* or the top left trigger button. */ * or the top left trigger button. */
AKEYCODE_BUTTON_L1 = 102, AKEYCODE_BUTTON_L1 = 102,
/** R1 Button key. /** R1 Button key.
* On a game controller, the R1 button should be either the button labeled R1 (or R) * On a game controller, the R1 button should be either the button labeled R1 (or R)
* or the top right trigger button. */ * or the top right trigger button. */
AKEYCODE_BUTTON_R1 = 103, AKEYCODE_BUTTON_R1 = 103,
/** L2 Button key. /** L2 Button key.
* On a game controller, the L2 button should be either the button labeled L2 * On a game controller, the L2 button should be either the button labeled L2
* or the bottom left trigger button. */ * or the bottom left trigger button. */
AKEYCODE_BUTTON_L2 = 104, AKEYCODE_BUTTON_L2 = 104,
/** R2 Button key. /** R2 Button key.
* On a game controller, the R2 button should be either the button labeled R2 * On a game controller, the R2 button should be either the button labeled R2
* or the bottom right trigger button. */ * or the bottom right trigger button. */
AKEYCODE_BUTTON_R2 = 105, AKEYCODE_BUTTON_R2 = 105,
/** Left Thumb Button key. /** Left Thumb Button key.
* On a game controller, the left thumb button indicates that the left (or only) * On a game controller, the left thumb button indicates that the left (or only)
* joystick is pressed. */ * joystick is pressed. */
AKEYCODE_BUTTON_THUMBL = 106, AKEYCODE_BUTTON_THUMBL = 106,
/** Right Thumb Button key. /** Right Thumb Button key.
* On a game controller, the right thumb button indicates that the right * On a game controller, the right thumb button indicates that the right
* joystick is pressed. */ * joystick is pressed. */
AKEYCODE_BUTTON_THUMBR = 107, AKEYCODE_BUTTON_THUMBR = 107,
/** Start Button key. /** Start Button key.
* On a game controller, the button labeled Start. */ * On a game controller, the button labeled Start. */
AKEYCODE_BUTTON_START = 108, AKEYCODE_BUTTON_START = 108,
/** Select Button key. /** Select Button key.
* On a game controller, the button labeled Select. */ * On a game controller, the button labeled Select. */
AKEYCODE_BUTTON_SELECT = 109, AKEYCODE_BUTTON_SELECT = 109,
/** Mode Button key. /** Mode Button key.
* On a game controller, the button labeled Mode. */ * On a game controller, the button labeled Mode. */
AKEYCODE_BUTTON_MODE = 110, AKEYCODE_BUTTON_MODE = 110,
/** Escape key. */ /** Escape key. */
AKEYCODE_ESCAPE = 111, AKEYCODE_ESCAPE = 111,
/** Forward Delete key. /** Forward Delete key.
* Deletes characters ahead of the insertion point, unlike {@link AKEYCODE_DEL}. */ * Deletes characters ahead of the insertion point, unlike {@link AKEYCODE_DEL}. */
AKEYCODE_FORWARD_DEL = 112, AKEYCODE_FORWARD_DEL = 112,
/** Left Control modifier key. */ /** Left Control modifier key. */
AKEYCODE_CTRL_LEFT = 113, AKEYCODE_CTRL_LEFT = 113,
/** Right Control modifier key. */ /** Right Control modifier key. */
AKEYCODE_CTRL_RIGHT = 114, AKEYCODE_CTRL_RIGHT = 114,
/** Caps Lock key. */ /** Caps Lock key. */
AKEYCODE_CAPS_LOCK = 115, AKEYCODE_CAPS_LOCK = 115,
/** Scroll Lock key. */ /** Scroll Lock key. */
AKEYCODE_SCROLL_LOCK = 116, AKEYCODE_SCROLL_LOCK = 116,
/** Left Meta modifier key. */ /** Left Meta modifier key. */
AKEYCODE_META_LEFT = 117, AKEYCODE_META_LEFT = 117,
/** Right Meta modifier key. */ /** Right Meta modifier key. */
AKEYCODE_META_RIGHT = 118, AKEYCODE_META_RIGHT = 118,
/** Function modifier key. */ /** Function modifier key. */
AKEYCODE_FUNCTION = 119, AKEYCODE_FUNCTION = 119,
/** System Request / Print Screen key. */ /** System Request / Print Screen key. */
AKEYCODE_SYSRQ = 120, AKEYCODE_SYSRQ = 120,
/** Break / Pause key. */ /** Break / Pause key. */
AKEYCODE_BREAK = 121, AKEYCODE_BREAK = 121,
/** Home Movement key. /** Home Movement key.
* Used for scrolling or moving the cursor around to the start of a line * Used for scrolling or moving the cursor around to the start of a line
* or to the top of a list. */ * or to the top of a list. */
AKEYCODE_MOVE_HOME = 122, AKEYCODE_MOVE_HOME = 122,
/** End Movement key. /** End Movement key.
* Used for scrolling or moving the cursor around to the end of a line * Used for scrolling or moving the cursor around to the end of a line
* or to the bottom of a list. */ * or to the bottom of a list. */
AKEYCODE_MOVE_END = 123, AKEYCODE_MOVE_END = 123,
/** Insert key. /** Insert key.
* Toggles insert / overwrite edit mode. */ * Toggles insert / overwrite edit mode. */
AKEYCODE_INSERT = 124, AKEYCODE_INSERT = 124,
/** Forward key. /** Forward key.
* Navigates forward in the history stack. Complement of {@link AKEYCODE_BACK}. */ * Navigates forward in the history stack. Complement of {@link AKEYCODE_BACK}. */
AKEYCODE_FORWARD = 125, AKEYCODE_FORWARD = 125,
/** Play media key. */ /** Play media key. */
AKEYCODE_MEDIA_PLAY = 126, AKEYCODE_MEDIA_PLAY = 126,
/** Pause media key. */ /** Pause media key. */
AKEYCODE_MEDIA_PAUSE = 127, AKEYCODE_MEDIA_PAUSE = 127,
/** Close media key. /** Close media key.
* May be used to close a CD tray, for example. */ * May be used to close a CD tray, for example. */
AKEYCODE_MEDIA_CLOSE = 128, AKEYCODE_MEDIA_CLOSE = 128,
/** Eject media key. /** Eject media key.
* May be used to eject a CD tray, for example. */ * May be used to eject a CD tray, for example. */
AKEYCODE_MEDIA_EJECT = 129, AKEYCODE_MEDIA_EJECT = 129,
/** Record media key. */ /** Record media key. */
AKEYCODE_MEDIA_RECORD = 130, AKEYCODE_MEDIA_RECORD = 130,
/** F1 key. */ /** F1 key. */
AKEYCODE_F1 = 131, AKEYCODE_F1 = 131,
/** F2 key. */ /** F2 key. */
AKEYCODE_F2 = 132, AKEYCODE_F2 = 132,
/** F3 key. */ /** F3 key. */
AKEYCODE_F3 = 133, AKEYCODE_F3 = 133,
/** F4 key. */ /** F4 key. */
AKEYCODE_F4 = 134, AKEYCODE_F4 = 134,
/** F5 key. */ /** F5 key. */
AKEYCODE_F5 = 135, AKEYCODE_F5 = 135,
/** F6 key. */ /** F6 key. */
AKEYCODE_F6 = 136, AKEYCODE_F6 = 136,
/** F7 key. */ /** F7 key. */
AKEYCODE_F7 = 137, AKEYCODE_F7 = 137,
/** F8 key. */ /** F8 key. */
AKEYCODE_F8 = 138, AKEYCODE_F8 = 138,
/** F9 key. */ /** F9 key. */
AKEYCODE_F9 = 139, AKEYCODE_F9 = 139,
/** F10 key. */ /** F10 key. */
AKEYCODE_F10 = 140, AKEYCODE_F10 = 140,
/** F11 key. */ /** F11 key. */
AKEYCODE_F11 = 141, AKEYCODE_F11 = 141,
/** F12 key. */ /** F12 key. */
AKEYCODE_F12 = 142, AKEYCODE_F12 = 142,
/** Num Lock key. /** Num Lock key.
* This is the Num Lock key; it is different from {@link AKEYCODE_NUM}. * This is the Num Lock key; it is different from {@link AKEYCODE_NUM}.
* This key alters the behavior of other keys on the numeric keypad. */ * This key alters the behavior of other keys on the numeric keypad. */
AKEYCODE_NUM_LOCK = 143, AKEYCODE_NUM_LOCK = 143,
/** Numeric keypad '0' key. */ /** Numeric keypad '0' key. */
AKEYCODE_NUMPAD_0 = 144, AKEYCODE_NUMPAD_0 = 144,
/** Numeric keypad '1' key. */ /** Numeric keypad '1' key. */
AKEYCODE_NUMPAD_1 = 145, AKEYCODE_NUMPAD_1 = 145,
/** Numeric keypad '2' key. */ /** Numeric keypad '2' key. */
AKEYCODE_NUMPAD_2 = 146, AKEYCODE_NUMPAD_2 = 146,
/** Numeric keypad '3' key. */ /** Numeric keypad '3' key. */
AKEYCODE_NUMPAD_3 = 147, AKEYCODE_NUMPAD_3 = 147,
/** Numeric keypad '4' key. */ /** Numeric keypad '4' key. */
AKEYCODE_NUMPAD_4 = 148, AKEYCODE_NUMPAD_4 = 148,
/** Numeric keypad '5' key. */ /** Numeric keypad '5' key. */
AKEYCODE_NUMPAD_5 = 149, AKEYCODE_NUMPAD_5 = 149,
/** Numeric keypad '6' key. */ /** Numeric keypad '6' key. */
AKEYCODE_NUMPAD_6 = 150, AKEYCODE_NUMPAD_6 = 150,
/** Numeric keypad '7' key. */ /** Numeric keypad '7' key. */
AKEYCODE_NUMPAD_7 = 151, AKEYCODE_NUMPAD_7 = 151,
/** Numeric keypad '8' key. */ /** Numeric keypad '8' key. */
AKEYCODE_NUMPAD_8 = 152, AKEYCODE_NUMPAD_8 = 152,
/** Numeric keypad '9' key. */ /** Numeric keypad '9' key. */
AKEYCODE_NUMPAD_9 = 153, AKEYCODE_NUMPAD_9 = 153,
/** Numeric keypad '/' key (for division). */ /** Numeric keypad '/' key (for division). */
AKEYCODE_NUMPAD_DIVIDE = 154, AKEYCODE_NUMPAD_DIVIDE = 154,
/** Numeric keypad '*' key (for multiplication). */ /** Numeric keypad '*' key (for multiplication). */
AKEYCODE_NUMPAD_MULTIPLY = 155, AKEYCODE_NUMPAD_MULTIPLY = 155,
/** Numeric keypad '-' key (for subtraction). */ /** Numeric keypad '-' key (for subtraction). */
AKEYCODE_NUMPAD_SUBTRACT = 156, AKEYCODE_NUMPAD_SUBTRACT = 156,
/** Numeric keypad '+' key (for addition). */ /** Numeric keypad '+' key (for addition). */
AKEYCODE_NUMPAD_ADD = 157, AKEYCODE_NUMPAD_ADD = 157,
/** Numeric keypad '.' key (for decimals or digit grouping). */ /** Numeric keypad '.' key (for decimals or digit grouping). */
AKEYCODE_NUMPAD_DOT = 158, AKEYCODE_NUMPAD_DOT = 158,
/** Numeric keypad ',' key (for decimals or digit grouping). */ /** Numeric keypad ',' key (for decimals or digit grouping). */
AKEYCODE_NUMPAD_COMMA = 159, AKEYCODE_NUMPAD_COMMA = 159,
/** Numeric keypad Enter key. */ /** Numeric keypad Enter key. */
AKEYCODE_NUMPAD_ENTER = 160, AKEYCODE_NUMPAD_ENTER = 160,
/** Numeric keypad '=' key. */ /** Numeric keypad '=' key. */
AKEYCODE_NUMPAD_EQUALS = 161, AKEYCODE_NUMPAD_EQUALS = 161,
/** Numeric keypad '(' key. */ /** Numeric keypad '(' key. */
AKEYCODE_NUMPAD_LEFT_PAREN = 162, AKEYCODE_NUMPAD_LEFT_PAREN = 162,
/** Numeric keypad ')' key. */ /** Numeric keypad ')' key. */
@ -420,107 +421,107 @@ enum AndroidKeycode {
* Mutes the speaker, unlike {@link AKEYCODE_MUTE}. * Mutes the speaker, unlike {@link AKEYCODE_MUTE}.
* This key should normally be implemented as a toggle such that the first press * This key should normally be implemented as a toggle such that the first press
* mutes the speaker and the second press restores the original volume. */ * mutes the speaker and the second press restores the original volume. */
AKEYCODE_VOLUME_MUTE = 164, AKEYCODE_VOLUME_MUTE = 164,
/** Info key. /** Info key.
* Common on TV remotes to show additional information related to what is * Common on TV remotes to show additional information related to what is
* currently being viewed. */ * currently being viewed. */
AKEYCODE_INFO = 165, AKEYCODE_INFO = 165,
/** Channel up key. /** Channel up key.
* On TV remotes, increments the television channel. */ * On TV remotes, increments the television channel. */
AKEYCODE_CHANNEL_UP = 166, AKEYCODE_CHANNEL_UP = 166,
/** Channel down key. /** Channel down key.
* On TV remotes, decrements the television channel. */ * On TV remotes, decrements the television channel. */
AKEYCODE_CHANNEL_DOWN = 167, AKEYCODE_CHANNEL_DOWN = 167,
/** Zoom in key. */ /** Zoom in key. */
AKEYCODE_ZOOM_IN = 168, AKEYCODE_ZOOM_IN = 168,
/** Zoom out key. */ /** Zoom out key. */
AKEYCODE_ZOOM_OUT = 169, AKEYCODE_ZOOM_OUT = 169,
/** TV key. /** TV key.
* On TV remotes, switches to viewing live TV. */ * On TV remotes, switches to viewing live TV. */
AKEYCODE_TV = 170, AKEYCODE_TV = 170,
/** Window key. /** Window key.
* On TV remotes, toggles picture-in-picture mode or other windowing functions. */ * On TV remotes, toggles picture-in-picture mode or other windowing functions. */
AKEYCODE_WINDOW = 171, AKEYCODE_WINDOW = 171,
/** Guide key. /** Guide key.
* On TV remotes, shows a programming guide. */ * On TV remotes, shows a programming guide. */
AKEYCODE_GUIDE = 172, AKEYCODE_GUIDE = 172,
/** DVR key. /** DVR key.
* On some TV remotes, switches to a DVR mode for recorded shows. */ * On some TV remotes, switches to a DVR mode for recorded shows. */
AKEYCODE_DVR = 173, AKEYCODE_DVR = 173,
/** Bookmark key. /** Bookmark key.
* On some TV remotes, bookmarks content or web pages. */ * On some TV remotes, bookmarks content or web pages. */
AKEYCODE_BOOKMARK = 174, AKEYCODE_BOOKMARK = 174,
/** Toggle captions key. /** Toggle captions key.
* Switches the mode for closed-captioning text, for example during television shows. */ * Switches the mode for closed-captioning text, for example during television shows. */
AKEYCODE_CAPTIONS = 175, AKEYCODE_CAPTIONS = 175,
/** Settings key. /** Settings key.
* Starts the system settings activity. */ * Starts the system settings activity. */
AKEYCODE_SETTINGS = 176, AKEYCODE_SETTINGS = 176,
/** TV power key. /** TV power key.
* On TV remotes, toggles the power on a television screen. */ * On TV remotes, toggles the power on a television screen. */
AKEYCODE_TV_POWER = 177, AKEYCODE_TV_POWER = 177,
/** TV input key. /** TV input key.
* On TV remotes, switches the input on a television screen. */ * On TV remotes, switches the input on a television screen. */
AKEYCODE_TV_INPUT = 178, AKEYCODE_TV_INPUT = 178,
/** Set-top-box power key. /** Set-top-box power key.
* On TV remotes, toggles the power on an external Set-top-box. */ * On TV remotes, toggles the power on an external Set-top-box. */
AKEYCODE_STB_POWER = 179, AKEYCODE_STB_POWER = 179,
/** Set-top-box input key. /** Set-top-box input key.
* On TV remotes, switches the input mode on an external Set-top-box. */ * On TV remotes, switches the input mode on an external Set-top-box. */
AKEYCODE_STB_INPUT = 180, AKEYCODE_STB_INPUT = 180,
/** A/V Receiver power key. /** A/V Receiver power key.
* On TV remotes, toggles the power on an external A/V Receiver. */ * On TV remotes, toggles the power on an external A/V Receiver. */
AKEYCODE_AVR_POWER = 181, AKEYCODE_AVR_POWER = 181,
/** A/V Receiver input key. /** A/V Receiver input key.
* On TV remotes, switches the input mode on an external A/V Receiver. */ * On TV remotes, switches the input mode on an external A/V Receiver. */
AKEYCODE_AVR_INPUT = 182, AKEYCODE_AVR_INPUT = 182,
/** Red "programmable" key. /** Red "programmable" key.
* On TV remotes, acts as a contextual/programmable key. */ * On TV remotes, acts as a contextual/programmable key. */
AKEYCODE_PROG_RED = 183, AKEYCODE_PROG_RED = 183,
/** Green "programmable" key. /** Green "programmable" key.
* On TV remotes, actsas a contextual/programmable key. */ * On TV remotes, actsas a contextual/programmable key. */
AKEYCODE_PROG_GREEN = 184, AKEYCODE_PROG_GREEN = 184,
/** Yellow "programmable" key. /** Yellow "programmable" key.
* On TV remotes, acts as a contextual/programmable key. */ * On TV remotes, acts as a contextual/programmable key. */
AKEYCODE_PROG_YELLOW = 185, AKEYCODE_PROG_YELLOW = 185,
/** Blue "programmable" key. /** Blue "programmable" key.
* On TV remotes, acts as a contextual/programmable key. */ * On TV remotes, acts as a contextual/programmable key. */
AKEYCODE_PROG_BLUE = 186, AKEYCODE_PROG_BLUE = 186,
/** App switch key. /** App switch key.
* Should bring up the application switcher dialog. */ * Should bring up the application switcher dialog. */
AKEYCODE_APP_SWITCH = 187, AKEYCODE_APP_SWITCH = 187,
/** Generic Game Pad Button #1.*/ /** Generic Game Pad Button #1.*/
AKEYCODE_BUTTON_1 = 188, AKEYCODE_BUTTON_1 = 188,
/** Generic Game Pad Button #2.*/ /** Generic Game Pad Button #2.*/
AKEYCODE_BUTTON_2 = 189, AKEYCODE_BUTTON_2 = 189,
/** Generic Game Pad Button #3.*/ /** Generic Game Pad Button #3.*/
AKEYCODE_BUTTON_3 = 190, AKEYCODE_BUTTON_3 = 190,
/** Generic Game Pad Button #4.*/ /** Generic Game Pad Button #4.*/
AKEYCODE_BUTTON_4 = 191, AKEYCODE_BUTTON_4 = 191,
/** Generic Game Pad Button #5.*/ /** Generic Game Pad Button #5.*/
AKEYCODE_BUTTON_5 = 192, AKEYCODE_BUTTON_5 = 192,
/** Generic Game Pad Button #6.*/ /** Generic Game Pad Button #6.*/
AKEYCODE_BUTTON_6 = 193, AKEYCODE_BUTTON_6 = 193,
/** Generic Game Pad Button #7.*/ /** Generic Game Pad Button #7.*/
AKEYCODE_BUTTON_7 = 194, AKEYCODE_BUTTON_7 = 194,
/** Generic Game Pad Button #8.*/ /** Generic Game Pad Button #8.*/
AKEYCODE_BUTTON_8 = 195, AKEYCODE_BUTTON_8 = 195,
/** Generic Game Pad Button #9.*/ /** Generic Game Pad Button #9.*/
AKEYCODE_BUTTON_9 = 196, AKEYCODE_BUTTON_9 = 196,
/** Generic Game Pad Button #10.*/ /** Generic Game Pad Button #10.*/
AKEYCODE_BUTTON_10 = 197, AKEYCODE_BUTTON_10 = 197,
/** Generic Game Pad Button #11.*/ /** Generic Game Pad Button #11.*/
AKEYCODE_BUTTON_11 = 198, AKEYCODE_BUTTON_11 = 198,
/** Generic Game Pad Button #12.*/ /** Generic Game Pad Button #12.*/
AKEYCODE_BUTTON_12 = 199, AKEYCODE_BUTTON_12 = 199,
/** Generic Game Pad Button #13.*/ /** Generic Game Pad Button #13.*/
AKEYCODE_BUTTON_13 = 200, AKEYCODE_BUTTON_13 = 200,
/** Generic Game Pad Button #14.*/ /** Generic Game Pad Button #14.*/
AKEYCODE_BUTTON_14 = 201, AKEYCODE_BUTTON_14 = 201,
/** Generic Game Pad Button #15.*/ /** Generic Game Pad Button #15.*/
AKEYCODE_BUTTON_15 = 202, AKEYCODE_BUTTON_15 = 202,
/** Generic Game Pad Button #16.*/ /** Generic Game Pad Button #16.*/
AKEYCODE_BUTTON_16 = 203, AKEYCODE_BUTTON_16 = 203,
/** Language Switch key. /** Language Switch key.
* Toggles the current input language such as switching between English and Japanese on * Toggles the current input language such as switching between English and Japanese on
* a QWERTY keyboard. On some devices, the same function may be performed by * a QWERTY keyboard. On some devices, the same function may be performed by
@ -530,85 +531,85 @@ enum AndroidKeycode {
* Toggles silent or vibrate mode on and off to make the device behave more politely * Toggles silent or vibrate mode on and off to make the device behave more politely
* in certain settings such as on a crowded train. On some devices, the key may only * in certain settings such as on a crowded train. On some devices, the key may only
* operate when long-pressed. */ * operate when long-pressed. */
AKEYCODE_MANNER_MODE = 205, AKEYCODE_MANNER_MODE = 205,
/** 3D Mode key. /** 3D Mode key.
* Toggles the display between 2D and 3D mode. */ * Toggles the display between 2D and 3D mode. */
AKEYCODE_3D_MODE = 206, AKEYCODE_3D_MODE = 206,
/** Contacts special function key. /** Contacts special function key.
* Used to launch an address book application. */ * Used to launch an address book application. */
AKEYCODE_CONTACTS = 207, AKEYCODE_CONTACTS = 207,
/** Calendar special function key. /** Calendar special function key.
* Used to launch a calendar application. */ * Used to launch a calendar application. */
AKEYCODE_CALENDAR = 208, AKEYCODE_CALENDAR = 208,
/** Music special function key. /** Music special function key.
* Used to launch a music player application. */ * Used to launch a music player application. */
AKEYCODE_MUSIC = 209, AKEYCODE_MUSIC = 209,
/** Calculator special function key. /** Calculator special function key.
* Used to launch a calculator application. */ * Used to launch a calculator application. */
AKEYCODE_CALCULATOR = 210, AKEYCODE_CALCULATOR = 210,
/** Japanese full-width / half-width key. */ /** Japanese full-width / half-width key. */
AKEYCODE_ZENKAKU_HANKAKU = 211, AKEYCODE_ZENKAKU_HANKAKU = 211,
/** Japanese alphanumeric key. */ /** Japanese alphanumeric key. */
AKEYCODE_EISU = 212, AKEYCODE_EISU = 212,
/** Japanese non-conversion key. */ /** Japanese non-conversion key. */
AKEYCODE_MUHENKAN = 213, AKEYCODE_MUHENKAN = 213,
/** Japanese conversion key. */ /** Japanese conversion key. */
AKEYCODE_HENKAN = 214, AKEYCODE_HENKAN = 214,
/** Japanese katakana / hiragana key. */ /** Japanese katakana / hiragana key. */
AKEYCODE_KATAKANA_HIRAGANA = 215, AKEYCODE_KATAKANA_HIRAGANA = 215,
/** Japanese Yen key. */ /** Japanese Yen key. */
AKEYCODE_YEN = 216, AKEYCODE_YEN = 216,
/** Japanese Ro key. */ /** Japanese Ro key. */
AKEYCODE_RO = 217, AKEYCODE_RO = 217,
/** Japanese kana key. */ /** Japanese kana key. */
AKEYCODE_KANA = 218, AKEYCODE_KANA = 218,
/** Assist key. /** Assist key.
* Launches the global assist activity. Not delivered to applications. */ * Launches the global assist activity. Not delivered to applications. */
AKEYCODE_ASSIST = 219, AKEYCODE_ASSIST = 219,
/** Brightness Down key. /** Brightness Down key.
* Adjusts the screen brightness down. */ * Adjusts the screen brightness down. */
AKEYCODE_BRIGHTNESS_DOWN = 220, AKEYCODE_BRIGHTNESS_DOWN = 220,
/** Brightness Up key. /** Brightness Up key.
* Adjusts the screen brightness up. */ * Adjusts the screen brightness up. */
AKEYCODE_BRIGHTNESS_UP = 221, AKEYCODE_BRIGHTNESS_UP = 221,
/** Audio Track key. /** Audio Track key.
* Switches the audio tracks. */ * Switches the audio tracks. */
AKEYCODE_MEDIA_AUDIO_TRACK = 222, AKEYCODE_MEDIA_AUDIO_TRACK = 222,
/** Sleep key. /** Sleep key.
* Puts the device to sleep. Behaves somewhat like {@link AKEYCODE_POWER} but it * Puts the device to sleep. Behaves somewhat like {@link AKEYCODE_POWER} but it
* has no effect if the device is already asleep. */ * has no effect if the device is already asleep. */
AKEYCODE_SLEEP = 223, AKEYCODE_SLEEP = 223,
/** Wakeup key. /** Wakeup key.
* Wakes up the device. Behaves somewhat like {@link AKEYCODE_POWER} but it * Wakes up the device. Behaves somewhat like {@link AKEYCODE_POWER} but it
* has no effect if the device is already awake. */ * has no effect if the device is already awake. */
AKEYCODE_WAKEUP = 224, AKEYCODE_WAKEUP = 224,
/** Pairing key. /** Pairing key.
* Initiates peripheral pairing mode. Useful for pairing remote control * Initiates peripheral pairing mode. Useful for pairing remote control
* devices or game controllers, especially if no other input mode is * devices or game controllers, especially if no other input mode is
* available. */ * available. */
AKEYCODE_PAIRING = 225, AKEYCODE_PAIRING = 225,
/** Media Top Menu key. /** Media Top Menu key.
* Goes to the top of media menu. */ * Goes to the top of media menu. */
AKEYCODE_MEDIA_TOP_MENU = 226, AKEYCODE_MEDIA_TOP_MENU = 226,
/** '11' key. */ /** '11' key. */
AKEYCODE_11 = 227, AKEYCODE_11 = 227,
/** '12' key. */ /** '12' key. */
AKEYCODE_12 = 228, AKEYCODE_12 = 228,
/** Last Channel key. /** Last Channel key.
* Goes to the last viewed channel. */ * Goes to the last viewed channel. */
AKEYCODE_LAST_CHANNEL = 229, AKEYCODE_LAST_CHANNEL = 229,
/** TV data service key. /** TV data service key.
* Displays data services like weather, sports. */ * Displays data services like weather, sports. */
AKEYCODE_TV_DATA_SERVICE = 230, AKEYCODE_TV_DATA_SERVICE = 230,
/** Voice Assist key. /** Voice Assist key.
* Launches the global voice assist activity. Not delivered to applications. */ * Launches the global voice assist activity. Not delivered to applications. */
AKEYCODE_VOICE_ASSIST = 231, AKEYCODE_VOICE_ASSIST = 231,
/** Radio key. /** Radio key.
* Toggles TV service / Radio service. */ * Toggles TV service / Radio service. */
AKEYCODE_TV_RADIO_SERVICE = 232, AKEYCODE_TV_RADIO_SERVICE = 232,
/** Teletext key. /** Teletext key.
* Displays Teletext service. */ * Displays Teletext service. */
AKEYCODE_TV_TELETEXT = 233, AKEYCODE_TV_TELETEXT = 233,
/** Number entry key. /** Number entry key.
* Initiates to enter multi-digit channel nubmber when each digit key is assigned * Initiates to enter multi-digit channel nubmber when each digit key is assigned
* for selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC * for selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC
@ -622,7 +623,7 @@ enum AndroidKeycode {
AKEYCODE_TV_TERRESTRIAL_DIGITAL = 236, AKEYCODE_TV_TERRESTRIAL_DIGITAL = 236,
/** Satellite key. /** Satellite key.
* Switches to digital satellite broadcast service. */ * Switches to digital satellite broadcast service. */
AKEYCODE_TV_SATELLITE = 237, AKEYCODE_TV_SATELLITE = 237,
/** BS key. /** BS key.
* Switches to BS digital satellite broadcasting service available in Japan. */ * Switches to BS digital satellite broadcasting service available in Japan. */
AKEYCODE_TV_SATELLITE_BS = 238, AKEYCODE_TV_SATELLITE_BS = 238,
@ -634,7 +635,7 @@ enum AndroidKeycode {
AKEYCODE_TV_SATELLITE_SERVICE = 240, AKEYCODE_TV_SATELLITE_SERVICE = 240,
/** Toggle Network key. /** Toggle Network key.
* Toggles selecting broacast services. */ * Toggles selecting broacast services. */
AKEYCODE_TV_NETWORK = 241, AKEYCODE_TV_NETWORK = 241,
/** Antenna/Cable key. /** Antenna/Cable key.
* Toggles broadcast input source between antenna and cable. */ * Toggles broadcast input source between antenna and cable. */
AKEYCODE_TV_ANTENNA_CABLE = 242, AKEYCODE_TV_ANTENNA_CABLE = 242,
@ -664,7 +665,7 @@ enum AndroidKeycode {
AKEYCODE_TV_INPUT_COMPONENT_2 = 250, AKEYCODE_TV_INPUT_COMPONENT_2 = 250,
/** VGA #1 key. /** VGA #1 key.
* Switches to VGA (analog RGB) input #1. */ * Switches to VGA (analog RGB) input #1. */
AKEYCODE_TV_INPUT_VGA_1 = 251, AKEYCODE_TV_INPUT_VGA_1 = 251,
/** Audio description key. /** Audio description key.
* Toggles audio description off / on. */ * Toggles audio description off / on. */
AKEYCODE_TV_AUDIO_DESCRIPTION = 252, AKEYCODE_TV_AUDIO_DESCRIPTION = 252,
@ -676,7 +677,7 @@ enum AndroidKeycode {
AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254, AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254,
/** Zoom mode key. /** Zoom mode key.
* Changes Zoom mode (Normal, Full, Zoom, Wide-zoom, etc.) */ * Changes Zoom mode (Normal, Full, Zoom, Wide-zoom, etc.) */
AKEYCODE_TV_ZOOM_MODE = 255, AKEYCODE_TV_ZOOM_MODE = 255,
/** Contents menu key. /** Contents menu key.
* Goes to the title list. Corresponds to Contents Menu (0x0B) of CEC User Control * Goes to the title list. Corresponds to Contents Menu (0x0B) of CEC User Control
* Code */ * Code */
@ -690,11 +691,11 @@ enum AndroidKeycode {
* CEC User Control Code. */ * CEC User Control Code. */
AKEYCODE_TV_TIMER_PROGRAMMING = 258, AKEYCODE_TV_TIMER_PROGRAMMING = 258,
/** Help key. */ /** Help key. */
AKEYCODE_HELP = 259, AKEYCODE_HELP = 259,
AKEYCODE_NAVIGATE_PREVIOUS = 260, AKEYCODE_NAVIGATE_PREVIOUS = 260,
AKEYCODE_NAVIGATE_NEXT = 261, AKEYCODE_NAVIGATE_NEXT = 261,
AKEYCODE_NAVIGATE_IN = 262, AKEYCODE_NAVIGATE_IN = 262,
AKEYCODE_NAVIGATE_OUT = 263, AKEYCODE_NAVIGATE_OUT = 263,
/** Primary stem key for Wear /** Primary stem key for Wear
* Main power/reset button on watch. */ * Main power/reset button on watch. */
AKEYCODE_STEM_PRIMARY = 264, AKEYCODE_STEM_PRIMARY = 264,
@ -705,11 +706,11 @@ enum AndroidKeycode {
/** Generic stem key 3 for Wear */ /** Generic stem key 3 for Wear */
AKEYCODE_STEM_3 = 267, AKEYCODE_STEM_3 = 267,
/** Directional Pad Up-Left */ /** Directional Pad Up-Left */
AKEYCODE_DPAD_UP_LEFT = 268, AKEYCODE_DPAD_UP_LEFT = 268,
/** Directional Pad Down-Left */ /** Directional Pad Down-Left */
AKEYCODE_DPAD_DOWN_LEFT = 269, AKEYCODE_DPAD_DOWN_LEFT = 269,
/** Directional Pad Up-Right */ /** Directional Pad Up-Right */
AKEYCODE_DPAD_UP_RIGHT = 270, AKEYCODE_DPAD_UP_RIGHT = 270,
/** Directional Pad Down-Right */ /** Directional Pad Down-Right */
AKEYCODE_DPAD_DOWN_RIGHT = 271, AKEYCODE_DPAD_DOWN_RIGHT = 271,
/** Skip forward media key */ /** Skip forward media key */

View file

@ -2,12 +2,12 @@
#include <QClipboard> #include <QClipboard>
#include "controller.h" #include "controller.h"
#include "videosocket.h"
#include "controlmsg.h" #include "controlmsg.h"
#include "receiver.h"
#include "inputconvertgame.h" #include "inputconvertgame.h"
#include "receiver.h"
#include "videosocket.h"
Controller::Controller(QString gameScript, QObject* parent) : QObject(parent) Controller::Controller(QString gameScript, QObject *parent) : QObject(parent)
{ {
m_receiver = new Receiver(this); m_receiver = new Receiver(this);
Q_ASSERT(m_receiver); Q_ASSERT(m_receiver);
@ -15,12 +15,9 @@ Controller::Controller(QString gameScript, QObject* parent) : QObject(parent)
updateScript(gameScript); updateScript(gameScript);
} }
Controller::~Controller() Controller::~Controller() {}
{
} void Controller::setControlSocket(QTcpSocket *controlSocket)
void Controller::setControlSocket(QTcpSocket* controlSocket)
{ {
if (m_controlSocket || !controlSocket) { if (m_controlSocket || !controlSocket) {
return; return;
@ -38,11 +35,8 @@ void Controller::postControlMsg(ControlMsg *controlMsg)
void Controller::test(QRect rc) void Controller::test(QRect rc)
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TOUCH); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TOUCH);
controlMsg->setInjectTouchMsgData(POINTER_ID_MOUSE, controlMsg->setInjectTouchMsgData(POINTER_ID_MOUSE, AMOTION_EVENT_ACTION_DOWN, AMOTION_EVENT_BUTTON_PRIMARY, rc, 1.0f);
AMOTION_EVENT_ACTION_DOWN,
AMOTION_EVENT_BUTTON_PRIMARY,
rc, 1.0f);
postControlMsg(controlMsg); postControlMsg(controlMsg);
} }
@ -52,11 +46,11 @@ void Controller::updateScript(QString gameScript)
delete m_inputConvert; delete m_inputConvert;
} }
if (!gameScript.isEmpty()) { if (!gameScript.isEmpty()) {
InputConvertGame* convertgame = new InputConvertGame(this); InputConvertGame *convertgame = new InputConvertGame(this);
convertgame->loadKeyMap(gameScript); convertgame->loadKeyMap(gameScript);
m_inputConvert = convertgame; m_inputConvert = convertgame;
} else { } else {
m_inputConvert = new InputConvertNormal(this); m_inputConvert = new InputConvertNormal(this);
} }
Q_ASSERT(m_inputConvert); Q_ASSERT(m_inputConvert);
connect(m_inputConvert, &InputConvertBase::grabCursor, this, &Controller::grabCursor); connect(m_inputConvert, &InputConvertBase::grabCursor, this, &Controller::grabCursor);
@ -64,7 +58,7 @@ void Controller::updateScript(QString gameScript)
void Controller::onPostBackOrScreenOn() void Controller::onPostBackOrScreenOn()
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_BACK_OR_SCREEN_ON); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_BACK_OR_SCREEN_ON);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -108,7 +102,7 @@ void Controller::onPostVolumeDown()
void Controller::onExpandNotificationPanel() void Controller::onExpandNotificationPanel()
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_EXPAND_NOTIFICATION_PANEL); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_EXPAND_NOTIFICATION_PANEL);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -117,7 +111,7 @@ void Controller::onExpandNotificationPanel()
void Controller::onCollapseNotificationPanel() void Controller::onCollapseNotificationPanel()
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_COLLAPSE_NOTIFICATION_PANEL); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_COLLAPSE_NOTIFICATION_PANEL);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -126,7 +120,7 @@ void Controller::onCollapseNotificationPanel()
void Controller::onRequestDeviceClipboard() void Controller::onRequestDeviceClipboard()
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_GET_CLIPBOARD); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_GET_CLIPBOARD);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -137,7 +131,7 @@ void Controller::onSetDeviceClipboard()
{ {
QClipboard *board = QApplication::clipboard(); QClipboard *board = QApplication::clipboard();
QString text = board->text(); QString text = board->text();
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_SET_CLIPBOARD); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_SET_CLIPBOARD);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -152,9 +146,9 @@ void Controller::onClipboardPaste()
onPostTextInput(text); onPostTextInput(text);
} }
void Controller::onPostTextInput(QString& text) void Controller::onPostTextInput(QString &text)
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TEXT); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TEXT);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -164,7 +158,7 @@ void Controller::onPostTextInput(QString& text)
void Controller::onSetScreenPowerMode(ControlMsg::ScreenPowerMode mode) void Controller::onSetScreenPowerMode(ControlMsg::ScreenPowerMode mode)
{ {
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_SET_SCREEN_POWER_MODE); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_SET_SCREEN_POWER_MODE);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -196,7 +190,7 @@ void Controller::onKeyEvent(const QKeyEvent *from, const QSize &frameSize, const
bool Controller::event(QEvent *event) bool Controller::event(QEvent *event)
{ {
if (event && static_cast<ControlMsg::Type>(event->type()) == ControlMsg::Control) { if (event && static_cast<ControlMsg::Type>(event->type()) == ControlMsg::Control) {
ControlMsg* controlMsg = dynamic_cast<ControlMsg*>(event); ControlMsg *controlMsg = dynamic_cast<ControlMsg *>(event);
if (controlMsg) { if (controlMsg) {
sendControl(controlMsg->serializeData()); sendControl(controlMsg->serializeData());
} }
@ -219,14 +213,14 @@ bool Controller::sendControl(const QByteArray &buffer)
void Controller::postKeyCodeClick(AndroidKeycode keycode) void Controller::postKeyCodeClick(AndroidKeycode keycode)
{ {
ControlMsg* controlEventDown = new ControlMsg(ControlMsg::CMT_INJECT_KEYCODE); ControlMsg *controlEventDown = new ControlMsg(ControlMsg::CMT_INJECT_KEYCODE);
if (!controlEventDown) { if (!controlEventDown) {
return; return;
} }
controlEventDown->setInjectKeycodeMsgData(AKEY_EVENT_ACTION_DOWN, keycode, AMETA_NONE); controlEventDown->setInjectKeycodeMsgData(AKEY_EVENT_ACTION_DOWN, keycode, AMETA_NONE);
postControlMsg(controlEventDown); postControlMsg(controlEventDown);
ControlMsg* controlEventUp = new ControlMsg(ControlMsg::CMT_INJECT_KEYCODE); ControlMsg *controlEventUp = new ControlMsg(ControlMsg::CMT_INJECT_KEYCODE);
if (!controlEventUp) { if (!controlEventUp) {
return; return;
} }

View file

@ -13,11 +13,11 @@ class Controller : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
Controller(QString gameScript = "", QObject* parent = Q_NULLPTR); Controller(QString gameScript = "", QObject *parent = Q_NULLPTR);
virtual ~Controller(); virtual ~Controller();
void setControlSocket(QTcpSocket* controlSocket); void setControlSocket(QTcpSocket *controlSocket);
void postControlMsg(ControlMsg* controlMsg); void postControlMsg(ControlMsg *controlMsg);
void test(QRect rc); void test(QRect rc);
void updateScript(QString gameScript = ""); void updateScript(QString gameScript = "");
@ -35,16 +35,16 @@ public slots:
void onSetScreenPowerMode(ControlMsg::ScreenPowerMode mode); void onSetScreenPowerMode(ControlMsg::ScreenPowerMode mode);
// for input convert // for input convert
void onMouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize); void onMouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize);
void onWheelEvent(const QWheelEvent* from, const QSize& frameSize, const QSize& showSize); void onWheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize);
void onKeyEvent(const QKeyEvent* from, const QSize& frameSize, const QSize& showSize); void onKeyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize);
// turn the screen on if it was off, press BACK otherwise // turn the screen on if it was off, press BACK otherwise
void onPostBackOrScreenOn(); void onPostBackOrScreenOn();
void onRequestDeviceClipboard(); void onRequestDeviceClipboard();
void onSetDeviceClipboard(); void onSetDeviceClipboard();
void onClipboardPaste(); void onClipboardPaste();
void onPostTextInput(QString& text); void onPostTextInput(QString &text);
signals: signals:
void grabCursor(bool grab); void grabCursor(bool grab);
@ -53,8 +53,8 @@ protected:
bool event(QEvent *event); bool event(QEvent *event);
private: private:
bool sendControl(const QByteArray& buffer); bool sendControl(const QByteArray &buffer);
void postKeyCodeClick(AndroidKeycode keycode); void postKeyCodeClick(AndroidKeycode keycode);
private: private:
QPointer<QTcpSocket> m_controlSocket; QPointer<QTcpSocket> m_controlSocket;

View file

@ -1,22 +1,19 @@
#include <QDebug> #include <QDebug>
#include "controlmsg.h"
#include "bufferutil.h" #include "bufferutil.h"
#include "controlmsg.h"
ControlMsg::ControlMsg(ControlMsgType controlMsgType) ControlMsg::ControlMsg(ControlMsgType controlMsgType) : QScrcpyEvent(Control)
: QScrcpyEvent(Control)
{ {
m_data.type = controlMsgType; m_data.type = controlMsgType;
} }
ControlMsg::~ControlMsg() ControlMsg::~ControlMsg()
{ {
if (CMT_SET_CLIPBOARD == m_data.type if (CMT_SET_CLIPBOARD == m_data.type && Q_NULLPTR != m_data.setClipboard.text) {
&& Q_NULLPTR != m_data.setClipboard.text) {
delete m_data.setClipboard.text; delete m_data.setClipboard.text;
m_data.setClipboard.text = Q_NULLPTR; m_data.setClipboard.text = Q_NULLPTR;
} else if (CMT_INJECT_TEXT == m_data.type } else if (CMT_INJECT_TEXT == m_data.type && Q_NULLPTR != m_data.injectText.text) {
&& Q_NULLPTR != m_data.injectText.text){
delete m_data.injectText.text; delete m_data.injectText.text;
m_data.injectText.text = Q_NULLPTR; m_data.injectText.text = Q_NULLPTR;
} }
@ -29,7 +26,7 @@ void ControlMsg::setInjectKeycodeMsgData(AndroidKeyeventAction action, AndroidKe
m_data.injectKeycode.metastate = metastate; m_data.injectKeycode.metastate = metastate;
} }
void ControlMsg::setInjectTextMsgData(QString& text) void ControlMsg::setInjectTextMsgData(QString &text)
{ {
// write length (2 byte) + string (non nul-terminated) // write length (2 byte) + string (non nul-terminated)
if (CONTROL_MSG_TEXT_MAX_LENGTH < text.length()) { if (CONTROL_MSG_TEXT_MAX_LENGTH < text.length()) {
@ -78,7 +75,7 @@ void ControlMsg::setSetScreenPowerModeData(ControlMsg::ScreenPowerMode mode)
m_data.setScreenPowerMode.mode = mode; m_data.setScreenPowerMode.mode = mode;
} }
void ControlMsg::writePosition(QBuffer &buffer, const QRect& value) void ControlMsg::writePosition(QBuffer &buffer, const QRect &value)
{ {
BufferUtil::write32(buffer, value.left()); BufferUtil::write32(buffer, value.left());
BufferUtil::write32(buffer, value.top()); BufferUtil::write32(buffer, value.top());
@ -93,7 +90,7 @@ quint16 ControlMsg::toFixedPoint16(float f)
if (u >= 0xffff) { if (u >= 0xffff) {
u = 0xffff; u = 0xffff;
} }
return (quint16) u; return (quint16)u;
} }
QByteArray ControlMsg::serializeData() QByteArray ControlMsg::serializeData()
@ -113,16 +110,14 @@ QByteArray ControlMsg::serializeData()
BufferUtil::write16(buffer, strlen(m_data.injectText.text)); BufferUtil::write16(buffer, strlen(m_data.injectText.text));
buffer.write(m_data.injectText.text, strlen(m_data.injectText.text)); buffer.write(m_data.injectText.text, strlen(m_data.injectText.text));
break; break;
case CMT_INJECT_TOUCH: case CMT_INJECT_TOUCH: {
{
buffer.putChar(m_data.injectTouch.action); buffer.putChar(m_data.injectTouch.action);
BufferUtil::write64(buffer, m_data.injectTouch.id); BufferUtil::write64(buffer, m_data.injectTouch.id);
writePosition(buffer, m_data.injectTouch.position); writePosition(buffer, m_data.injectTouch.position);
quint16 pressure = toFixedPoint16(m_data.injectTouch.pressure); quint16 pressure = toFixedPoint16(m_data.injectTouch.pressure);
BufferUtil::write16(buffer, pressure); BufferUtil::write16(buffer, pressure);
BufferUtil::write32(buffer, m_data.injectTouch.buttons); BufferUtil::write32(buffer, m_data.injectTouch.buttons);
} } break;
break;
case CMT_INJECT_SCROLL: case CMT_INJECT_SCROLL:
writePosition(buffer, m_data.injectScroll.position); writePosition(buffer, m_data.injectScroll.position);
BufferUtil::write32(buffer, m_data.injectScroll.hScroll); BufferUtil::write32(buffer, m_data.injectScroll.hScroll);

View file

@ -1,13 +1,13 @@
#ifndef CONTROLMSG_H #ifndef CONTROLMSG_H
#define CONTROLMSG_H #define CONTROLMSG_H
#include <QBuffer>
#include <QRect> #include <QRect>
#include <QString> #include <QString>
#include <QBuffer>
#include "qscrcpyevent.h"
#include "input.h" #include "input.h"
#include "keycodes.h" #include "keycodes.h"
#include "qscrcpyevent.h"
#define CONTROL_MSG_TEXT_MAX_LENGTH 300 #define CONTROL_MSG_TEXT_MAX_LENGTH 300
#define CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH 4093 #define CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH 4093
@ -15,8 +15,9 @@
// ControlMsg // ControlMsg
class ControlMsg : public QScrcpyEvent class ControlMsg : public QScrcpyEvent
{ {
public: public:
enum ControlMsgType { enum ControlMsgType
{
CMT_NULL = -1, CMT_NULL = -1,
CMT_INJECT_KEYCODE = 0, CMT_INJECT_KEYCODE = 0,
CMT_INJECT_TEXT, CMT_INJECT_TEXT,
@ -30,7 +31,8 @@ public:
CMT_SET_SCREEN_POWER_MODE CMT_SET_SCREEN_POWER_MODE
}; };
enum ScreenPowerMode { enum ScreenPowerMode
{
// see <https://android.googlesource.com/platform/frameworks/base.git/+/pie-release-2/core/java/android/view/SurfaceControl.java#305> // see <https://android.googlesource.com/platform/frameworks/base.git/+/pie-release-2/core/java/android/view/SurfaceControl.java#305>
SPM_OFF = 0, SPM_OFF = 0,
SPM_NORMAL = 2, SPM_NORMAL = 2,
@ -40,55 +42,63 @@ public:
virtual ~ControlMsg(); virtual ~ControlMsg();
void setInjectKeycodeMsgData(AndroidKeyeventAction action, AndroidKeycode keycode, AndroidMetastate metastate); void setInjectKeycodeMsgData(AndroidKeyeventAction action, AndroidKeycode keycode, AndroidMetastate metastate);
void setInjectTextMsgData(QString& text); void setInjectTextMsgData(QString &text);
// id 代表一个触摸点最多支持10个触摸点[0,9] // id 代表一个触摸点最多支持10个触摸点[0,9]
// action 只能是AMOTION_EVENT_ACTION_DOWNAMOTION_EVENT_ACTION_UPAMOTION_EVENT_ACTION_MOVE // action 只能是AMOTION_EVENT_ACTION_DOWNAMOTION_EVENT_ACTION_UPAMOTION_EVENT_ACTION_MOVE
// position action动作对应的位置 // position action动作对应的位置
void setInjectTouchMsgData(quint64 id, AndroidMotioneventAction action, AndroidMotioneventButtons buttons, QRect position, float pressure); void setInjectTouchMsgData(quint64 id, AndroidMotioneventAction action, AndroidMotioneventButtons buttons, QRect position, float pressure);
void setInjectScrollMsgData(QRect position, qint32 hScroll, qint32 vScroll); void setInjectScrollMsgData(QRect position, qint32 hScroll, qint32 vScroll);
void setSetClipboardMsgData(QString& text); void setSetClipboardMsgData(QString &text);
void setSetScreenPowerModeData(ControlMsg::ScreenPowerMode mode); void setSetScreenPowerModeData(ControlMsg::ScreenPowerMode mode);
QByteArray serializeData(); QByteArray serializeData();
private: private:
void writePosition(QBuffer& buffer, const QRect& value); void writePosition(QBuffer &buffer, const QRect &value);
quint16 toFixedPoint16(float f); quint16 toFixedPoint16(float f);
private: private:
struct ControlMsgData { struct ControlMsgData
{
ControlMsgType type = CMT_NULL; ControlMsgType type = CMT_NULL;
union { union
struct { {
struct
{
AndroidKeyeventAction action; AndroidKeyeventAction action;
AndroidKeycode keycode; AndroidKeycode keycode;
AndroidMetastate metastate; AndroidMetastate metastate;
} injectKeycode; } injectKeycode;
struct { struct
char* text = Q_NULLPTR; {
char *text = Q_NULLPTR;
} injectText; } injectText;
struct { struct
{
quint64 id; quint64 id;
AndroidMotioneventAction action; AndroidMotioneventAction action;
AndroidMotioneventButtons buttons; AndroidMotioneventButtons buttons;
QRect position; QRect position;
float pressure; float pressure;
} injectTouch; } injectTouch;
struct { struct
{
QRect position; QRect position;
qint32 hScroll; qint32 hScroll;
qint32 vScroll; qint32 vScroll;
} injectScroll; } injectScroll;
struct { struct
{
char *text = Q_NULLPTR; char *text = Q_NULLPTR;
} setClipboard; } setClipboard;
struct { struct
{
ScreenPowerMode mode; ScreenPowerMode mode;
} setScreenPowerMode; } setScreenPowerMode;
}; };
ControlMsgData(){} ControlMsgData() {}
~ControlMsgData(){} ~ControlMsgData() {}
}; };
ControlMsgData m_data; ControlMsgData m_data;

View file

@ -1,17 +1,12 @@
#include "inputconvertbase.h" #include "inputconvertbase.h"
#include "controller.h" #include "controller.h"
InputConvertBase::InputConvertBase(Controller* controller) InputConvertBase::InputConvertBase(Controller *controller) : QObject(controller), m_controller(controller)
: QObject(controller)
, m_controller(controller)
{ {
Q_ASSERT(controller); Q_ASSERT(controller);
} }
InputConvertBase::~InputConvertBase() InputConvertBase::~InputConvertBase() {}
{
}
void InputConvertBase::sendControlMsg(ControlMsg *msg) void InputConvertBase::sendControlMsg(ControlMsg *msg)
{ {
@ -19,4 +14,3 @@ void InputConvertBase::sendControlMsg(ControlMsg *msg)
m_controller->postControlMsg(msg); m_controller->postControlMsg(msg);
} }
} }

View file

@ -1,10 +1,10 @@
#ifndef INPUTCONVERTBASE_H #ifndef INPUTCONVERTBASE_H
#define INPUTCONVERTBASE_H #define INPUTCONVERTBASE_H
#include <QMouseEvent>
#include <QWheelEvent>
#include <QKeyEvent> #include <QKeyEvent>
#include <QMouseEvent>
#include <QPointer> #include <QPointer>
#include <QWheelEvent>
#include "controlmsg.h" #include "controlmsg.h"
@ -13,20 +13,20 @@ class InputConvertBase : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
InputConvertBase(Controller* controller); InputConvertBase(Controller *controller);
virtual ~InputConvertBase(); virtual ~InputConvertBase();
// the frame size may be different from the real device size, so we need the size // the frame size may be different from the real device size, so we need the size
// to which the absolute position apply, to scale it accordingly // to which the absolute position apply, to scale it accordingly
virtual void mouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize) = 0; virtual void mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize) = 0;
virtual void wheelEvent(const QWheelEvent* from, const QSize& frameSize, const QSize& showSize) = 0; virtual void wheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize) = 0;
virtual void keyEvent(const QKeyEvent* from, const QSize& frameSize, const QSize& showSize) = 0; virtual void keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize) = 0;
signals: signals:
void grabCursor(bool grab); void grabCursor(bool grab);
protected: protected:
void sendControlMsg(ControlMsg* msg); void sendControlMsg(ControlMsg *msg);
private: private:
QPointer<Controller> m_controller; QPointer<Controller> m_controller;

View file

@ -6,16 +6,9 @@
#define CURSOR_POS_CHECK 50 #define CURSOR_POS_CHECK 50
InputConvertGame::InputConvertGame(Controller* controller) InputConvertGame::InputConvertGame(Controller *controller) : InputConvertNormal(controller) {}
: InputConvertNormal(controller)
{
} InputConvertGame::~InputConvertGame() {}
InputConvertGame::~InputConvertGame()
{
}
void InputConvertGame::mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize) void InputConvertGame::mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize)
{ {
@ -55,7 +48,7 @@ void InputConvertGame::wheelEvent(const QWheelEvent *from, const QSize &frameSiz
} }
} }
void InputConvertGame::keyEvent(const QKeyEvent *from, const QSize& frameSize, const QSize& showSize) void InputConvertGame::keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize)
{ {
// 处理开关按键 // 处理开关按键
if (m_keyMap.isSwitchOnKeyboard() && m_keyMap.getSwitchKey() == from->key()) { if (m_keyMap.isSwitchOnKeyboard() && m_keyMap.getSwitchKey() == from->key()) {
@ -68,11 +61,9 @@ void InputConvertGame::keyEvent(const QKeyEvent *from, const QSize& frameSize, c
return; return;
} }
const KeyMap::KeyMapNode& node = m_keyMap.getKeyMapNodeKey(from->key()); const KeyMap::KeyMapNode &node = m_keyMap.getKeyMapNodeKey(from->key());
// 处理特殊按键:可以在按键映射和普通映射间切换的按键 // 处理特殊按键:可以在按键映射和普通映射间切换的按键
if (m_needSwitchGameAgain if (m_needSwitchGameAgain && KeyMap::KMT_CLICK == node.type && node.data.click.switchMap) {
&& KeyMap::KMT_CLICK == node.type
&& node.data.click.switchMap) {
updateSize(frameSize, showSize); updateSize(frameSize, showSize);
// Qt::Key_Tab Qt::Key_M for PUBG mobile // Qt::Key_Tab Qt::Key_M for PUBG mobile
processKeyClick(node.data.click.keyNode.pos, false, node.data.click.switchMap, from); processKeyClick(node.data.click.keyNode.pos, false, node.data.click.switchMap, from);
@ -142,20 +133,17 @@ void InputConvertGame::sendTouchUpEvent(int id, QPointF pos)
void InputConvertGame::sendTouchEvent(int id, QPointF pos, AndroidMotioneventAction action) void InputConvertGame::sendTouchEvent(int id, QPointF pos, AndroidMotioneventAction action)
{ {
if (0 > id || MULTI_TOUCH_MAX_NUM-1 < id) { if (0 > id || MULTI_TOUCH_MAX_NUM - 1 < id) {
Q_ASSERT(0); Q_ASSERT(0);
return; return;
} }
//qDebug() << "id:" << id << " pos:" << pos << " action" << action; //qDebug() << "id:" << id << " pos:" << pos << " action" << action;
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TOUCH); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TOUCH);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
controlMsg->setInjectTouchMsgData(static_cast<quint64>(id), controlMsg->setInjectTouchMsgData(
action, static_cast<quint64>(id), action, static_cast<AndroidMotioneventButtons>(0), QRect(calcFrameAbsolutePos(pos).toPoint(), m_frameSize), 1.0f);
static_cast<AndroidMotioneventButtons>(0),
QRect(calcFrameAbsolutePos(pos).toPoint(),m_frameSize),
1.0f);
sendControlMsg(controlMsg); sendControlMsg(controlMsg);
} }
@ -244,7 +232,7 @@ void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const Q
} }
// action // action
if(pressedNum == 0){ if (pressedNum == 0) {
// touch up release all // touch up release all
int id = getTouchID(m_ctrlSteerWheel.touchKey); int id = getTouchID(m_ctrlSteerWheel.touchKey);
sendTouchUpEvent(id, node.data.steerWheel.centerPos + m_ctrlSteerWheel.lastOffset); sendTouchUpEvent(id, node.data.steerWheel.centerPos + m_ctrlSteerWheel.lastOffset);
@ -268,8 +256,7 @@ void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const Q
// -------- key event -------- // -------- key event --------
void InputConvertGame::processKeyClick( void InputConvertGame::processKeyClick(const QPointF &clickPos, bool clickTwice, bool switchMap, const QKeyEvent *from)
const QPointF& clickPos, bool clickTwice, bool switchMap, const QKeyEvent *from)
{ {
if (switchMap && QEvent::KeyRelease == from->type()) { if (switchMap && QEvent::KeyRelease == from->type()) {
m_needSwitchGameAgain = !m_needSwitchGameAgain; m_needSwitchGameAgain = !m_needSwitchGameAgain;
@ -293,9 +280,9 @@ void InputConvertGame::processKeyClick(
} }
} }
void InputConvertGame::processKeyDrag(const QPointF& startPos, QPointF endPos, const QKeyEvent* from) void InputConvertGame::processKeyDrag(const QPointF &startPos, QPointF endPos, const QKeyEvent *from)
{ {
if (QEvent::KeyPress == from->type()){ if (QEvent::KeyPress == from->type()) {
int id = attachTouchID(from->key()); int id = attachTouchID(from->key());
sendTouchDownEvent(id, startPos); sendTouchDownEvent(id, startPos);
sendTouchMoveEvent(id, endPos); sendTouchMoveEvent(id, endPos);
@ -312,7 +299,7 @@ void InputConvertGame::processKeyDrag(const QPointF& startPos, QPointF endPos, c
bool InputConvertGame::processMouseClick(const QMouseEvent *from) bool InputConvertGame::processMouseClick(const QMouseEvent *from)
{ {
const KeyMap::KeyMapNode& node = m_keyMap.getKeyMapNodeMouse(from->button()); const KeyMap::KeyMapNode &node = m_keyMap.getKeyMapNodeMouse(from->button());
if (KeyMap::KMT_INVALID == node.type) { if (KeyMap::KMT_INVALID == node.type) {
return false; return false;
} }
@ -353,10 +340,8 @@ 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 if (m_ctrlMouseMove.lastConverPos.x() < 0.1 || m_ctrlMouseMove.lastConverPos.x() > 0.8 || m_ctrlMouseMove.lastConverPos.y() < 0.1
|| m_ctrlMouseMove.lastConverPos.x() > 0.8 || m_ctrlMouseMove.lastConverPos.y() > 0.8) {
|| m_ctrlMouseMove.lastConverPos.y() < 0.1
|| m_ctrlMouseMove.lastConverPos.y() > 0.8) {
mouseMoveStopTouch(); mouseMoveStopTouch();
mouseMoveStartTouch(from); mouseMoveStartTouch(from);
} }
@ -401,7 +386,7 @@ void InputConvertGame::moveCursorTo(const QMouseEvent *from, const QPoint &local
QCursor::setPos(globalPos); QCursor::setPos(globalPos);
} }
void InputConvertGame::mouseMoveStartTouch(const QMouseEvent* from) void InputConvertGame::mouseMoveStartTouch(const QMouseEvent *from)
{ {
Q_UNUSED(from) Q_UNUSED(from)
if (!m_ctrlMouseMove.touching) { if (!m_ctrlMouseMove.touching) {

View file

@ -11,17 +11,17 @@ class InputConvertGame : public InputConvertNormal
{ {
Q_OBJECT Q_OBJECT
public: public:
InputConvertGame(Controller* controller); InputConvertGame(Controller *controller);
virtual ~InputConvertGame(); virtual ~InputConvertGame();
virtual void mouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize); virtual void mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize);
virtual void wheelEvent(const QWheelEvent* from, const QSize& frameSize, const QSize& showSize); virtual void wheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize);
virtual void keyEvent(const QKeyEvent* from, const QSize& frameSize, const QSize& showSize); virtual void keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize);
void loadKeyMap(const QString& json); void loadKeyMap(const QString &json);
protected: protected:
void updateSize(const QSize& frameSize, const QSize& showSize); void updateSize(const QSize &frameSize, const QSize &showSize);
void sendTouchDownEvent(int id, QPointF pos); void sendTouchDownEvent(int id, QPointF pos);
void sendTouchMoveEvent(int id, QPointF pos); void sendTouchMoveEvent(int id, QPointF pos);
void sendTouchUpEvent(int id, QPointF pos); void sendTouchUpEvent(int id, QPointF pos);
@ -35,19 +35,19 @@ protected:
int getTouchID(int key); int getTouchID(int key);
// steer wheel // steer wheel
void processSteerWheel(const KeyMap::KeyMapNode &node, const QKeyEvent* from); void processSteerWheel(const KeyMap::KeyMapNode &node, const QKeyEvent *from);
// click // click
void processKeyClick(const QPointF& clickPos, bool clickTwice, bool switchMap, const QKeyEvent* from); void processKeyClick(const QPointF &clickPos, bool clickTwice, bool switchMap, const QKeyEvent *from);
// drag // drag
void processKeyDrag(const QPointF& startPos, QPointF endPos, const QKeyEvent* from); void processKeyDrag(const QPointF &startPos, QPointF endPos, const QKeyEvent *from);
// mouse // mouse
bool processMouseClick(const QMouseEvent* from); bool processMouseClick(const QMouseEvent *from);
bool processMouseMove(const QMouseEvent* from); bool processMouseMove(const QMouseEvent *from);
void moveCursorTo(const QMouseEvent* from, const QPoint& localPosPixel); void moveCursorTo(const QMouseEvent *from, const QPoint &localPosPixel);
void mouseMoveStartTouch(const QMouseEvent* from); void mouseMoveStartTouch(const QMouseEvent *from);
void mouseMoveStopTouch(); void mouseMoveStopTouch();
void startMouseMoveTimer(); void startMouseMoveTimer();
void stopMouseMoveTimer(); void stopMouseMoveTimer();
@ -67,7 +67,8 @@ private:
KeyMap m_keyMap; KeyMap m_keyMap;
// steer wheel // steer wheel
struct { struct
{
// the first key pressed // the first key pressed
int touchKey = Qt::Key_unknown; int touchKey = Qt::Key_unknown;
bool pressedUp = false; bool pressedUp = false;
@ -79,9 +80,10 @@ private:
} m_ctrlSteerWheel; } m_ctrlSteerWheel;
// mouse move // mouse move
struct { struct
{
QPointF lastConverPos; QPointF lastConverPos;
QPointF lastPos = {0.0, 0.0}; QPointF lastPos = { 0.0, 0.0 };
bool touching = false; bool touching = false;
int timer = 0; int timer = 0;
} m_ctrlMouseMove; } m_ctrlMouseMove;

View file

@ -2,18 +2,11 @@
#include "inputconvertnormal.h" #include "inputconvertnormal.h"
InputConvertNormal::InputConvertNormal(Controller* controller) InputConvertNormal::InputConvertNormal(Controller *controller) : InputConvertBase(controller) {}
: InputConvertBase(controller)
{
} InputConvertNormal::~InputConvertNormal() {}
InputConvertNormal::~InputConvertNormal() void InputConvertNormal::mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize)
{
}
void InputConvertNormal::mouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize)
{ {
if (!from) { if (!from) {
return; return;
@ -43,10 +36,10 @@ void InputConvertNormal::mouseEvent(const QMouseEvent* from, const QSize& frameS
QPointF pos = from->localPos(); QPointF pos = from->localPos();
// convert pos // convert pos
pos.setX(pos.x() * frameSize.width() / showSize.width()); pos.setX(pos.x() * frameSize.width() / showSize.width());
pos.setY(pos.y() * frameSize.height() / showSize.height()); pos.setY(pos.y() * frameSize.height() / showSize.height());
// set data // set data
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TOUCH); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_TOUCH);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -54,7 +47,7 @@ void InputConvertNormal::mouseEvent(const QMouseEvent* from, const QSize& frameS
sendControlMsg(controlMsg); sendControlMsg(controlMsg);
} }
void InputConvertNormal::wheelEvent(const QWheelEvent *from, const QSize& frameSize, const QSize& showSize) void InputConvertNormal::wheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize)
{ {
if (!from) { if (!from) {
return; return;
@ -79,7 +72,7 @@ void InputConvertNormal::wheelEvent(const QWheelEvent *from, const QSize& frameS
pos.setY(pos.y() * frameSize.height() / showSize.height()); pos.setY(pos.y() * frameSize.height() / showSize.height());
// set data // set data
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_SCROLL); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_SCROLL);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }
@ -87,7 +80,7 @@ void InputConvertNormal::wheelEvent(const QWheelEvent *from, const QSize& frameS
sendControlMsg(controlMsg); sendControlMsg(controlMsg);
} }
void InputConvertNormal::keyEvent(const QKeyEvent *from, const QSize& frameSize, const QSize& showSize) void InputConvertNormal::keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize)
{ {
Q_UNUSED(frameSize) Q_UNUSED(frameSize)
Q_UNUSED(showSize) Q_UNUSED(showSize)
@ -115,7 +108,7 @@ void InputConvertNormal::keyEvent(const QKeyEvent *from, const QSize& frameSize,
} }
// set data // set data
ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_KEYCODE); ControlMsg *controlMsg = new ControlMsg(ControlMsg::CMT_INJECT_KEYCODE);
if (!controlMsg) { if (!controlMsg) {
return; return;
} }

View file

@ -7,12 +7,12 @@ class InputConvertNormal : public InputConvertBase
{ {
Q_OBJECT Q_OBJECT
public: public:
InputConvertNormal(Controller* controller); InputConvertNormal(Controller *controller);
virtual ~InputConvertNormal(); virtual ~InputConvertNormal();
virtual void mouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize); virtual void mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize);
virtual void wheelEvent(const QWheelEvent* from, const QSize& frameSize, const QSize& showSize); virtual void wheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize);
virtual void keyEvent(const QKeyEvent* from, const QSize& frameSize, const QSize& showSize); virtual void keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize);
private: private:
AndroidMotioneventButtons convertMouseButtons(Qt::MouseButtons buttonState); AndroidMotioneventButtons convertMouseButtons(Qt::MouseButtons buttonState);

View file

@ -1,27 +1,20 @@
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QMetaEnum>
#include <QFileInfo>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug> #include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QJsonArray>
#include <QJsonDocument>
#include <QMetaEnum>
#include "keymap.h" #include "keymap.h"
QString KeyMap::s_keyMapPath = ""; QString KeyMap::s_keyMapPath = "";
KeyMap::KeyMap(QObject *parent) KeyMap::KeyMap(QObject *parent) : QObject(parent) {}
: QObject(parent)
{
} KeyMap::~KeyMap() {}
KeyMap::~KeyMap() const QString &KeyMap::getKeyMapPath()
{
}
const QString& KeyMap::getKeyMapPath()
{ {
if (s_keyMapPath.isEmpty()) { if (s_keyMapPath.isEmpty()) {
s_keyMapPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_KEYMAP_PATH")); s_keyMapPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_KEYMAP_PATH"));
@ -43,7 +36,7 @@ void KeyMap::loadKeyMap(const QString &json)
jsonDoc = QJsonDocument::fromJson(json.toUtf8(), &jsonError); jsonDoc = QJsonDocument::fromJson(json.toUtf8(), &jsonError);
if(jsonError.error != QJsonParseError::NoError) { if (jsonError.error != QJsonParseError::NoError) {
errorString = QString("json error: %1").arg(jsonError.errorString()); errorString = QString("json error: %1").arg(jsonError.errorString());
goto parseError; goto parseError;
} }
@ -57,13 +50,13 @@ void KeyMap::loadKeyMap(const QString &json)
} }
switchKey = getItemKey(rootObj, "switchKey"); switchKey = getItemKey(rootObj, "switchKey");
if(switchKey.first == AT_INVALID) { if (switchKey.first == AT_INVALID) {
errorString = QString("json error: switchKey invalid"); errorString = QString("json error: switchKey invalid");
goto parseError; goto parseError;
} }
m_switchKey.type = switchKey.first; m_switchKey.type = switchKey.first;
m_switchKey.key= switchKey.second; m_switchKey.key = switchKey.second;
// mouseMoveMap // mouseMoveMap
if (checkItemObject(rootObj, "mouseMoveMap")) { if (checkItemObject(rootObj, "mouseMoveMap")) {
@ -110,8 +103,7 @@ void KeyMap::loadKeyMap(const QString &json)
KeyMap::KeyMapType type = getItemKeyMapType(node, "type"); KeyMap::KeyMapType type = getItemKeyMapType(node, "type");
switch (type) { switch (type) {
case KeyMap::KMT_CLICK: case KeyMap::KMT_CLICK: {
{
// safe check // safe check
if (!checkForClick(node)) { if (!checkForClick(node)) {
qWarning() << "json error: keyMapNodes node format error"; qWarning() << "json error: keyMapNodes node format error";
@ -129,10 +121,8 @@ void KeyMap::loadKeyMap(const QString &json)
keyMapNode.data.click.keyNode.pos = getItemPos(node, "pos"); keyMapNode.data.click.keyNode.pos = getItemPos(node, "pos");
keyMapNode.data.click.switchMap = getItemBool(node, "switchMap"); keyMapNode.data.click.switchMap = getItemBool(node, "switchMap");
m_keyMapNodes.push_back(keyMapNode); m_keyMapNodes.push_back(keyMapNode);
} } break;
break; case KeyMap::KMT_CLICK_TWICE: {
case KeyMap::KMT_CLICK_TWICE:
{
// safe check // safe check
if (!checkForClickTwice(node)) { if (!checkForClickTwice(node)) {
qWarning() << "json error: keyMapNodes node format error"; qWarning() << "json error: keyMapNodes node format error";
@ -151,10 +141,8 @@ void KeyMap::loadKeyMap(const QString &json)
keyMapNode.data.click.keyNode.pos = getItemPos(node, "pos"); keyMapNode.data.click.keyNode.pos = getItemPos(node, "pos");
keyMapNode.data.click.switchMap = getItemBool(node, "switchMap"); keyMapNode.data.click.switchMap = getItemBool(node, "switchMap");
m_keyMapNodes.push_back(keyMapNode); m_keyMapNodes.push_back(keyMapNode);
} } break;
break; case KeyMap::KMT_STEER_WHEEL: {
case KeyMap::KMT_STEER_WHEEL:
{
// safe check // safe check
if (!checkForSteerWhell(node)) { if (!checkForSteerWhell(node)) {
qWarning() << "json error: keyMapNodes node format error"; qWarning() << "json error: keyMapNodes node format error";
@ -164,8 +152,7 @@ void KeyMap::loadKeyMap(const QString &json)
QPair<ActionType, int> rightKey = getItemKey(node, "rightKey"); QPair<ActionType, int> rightKey = getItemKey(node, "rightKey");
QPair<ActionType, int> upKey = getItemKey(node, "upKey"); QPair<ActionType, int> upKey = getItemKey(node, "upKey");
QPair<ActionType, int> downKey = getItemKey(node, "downKey"); QPair<ActionType, int> downKey = getItemKey(node, "downKey");
if (leftKey.first == AT_INVALID || rightKey.first == AT_INVALID if (leftKey.first == AT_INVALID || rightKey.first == AT_INVALID || upKey.first == AT_INVALID || downKey.first == AT_INVALID) {
|| upKey.first == AT_INVALID || downKey.first == AT_INVALID) {
if (leftKey.first == AT_INVALID) { if (leftKey.first == AT_INVALID) {
qWarning() << "json error: keyMapNodes node invalid key: " << node.value("leftKey").toString(); qWarning() << "json error: keyMapNodes node invalid key: " << node.value("leftKey").toString();
} }
@ -184,26 +171,16 @@ void KeyMap::loadKeyMap(const QString &json)
KeyMapNode keyMapNode; KeyMapNode keyMapNode;
keyMapNode.type = type; keyMapNode.type = type;
keyMapNode.data.steerWheel.left = { leftKey.first, leftKey.second, keyMapNode.data.steerWheel.left = { leftKey.first, leftKey.second, QPointF(0, 0), QPointF(0, 0), getItemDouble(node, "leftOffset") };
QPointF(0, 0), QPointF(0, 0), keyMapNode.data.steerWheel.right = { rightKey.first, rightKey.second, QPointF(0, 0), QPointF(0, 0), getItemDouble(node, "rightOffset") };
getItemDouble(node, "leftOffset") }; keyMapNode.data.steerWheel.up = { upKey.first, upKey.second, QPointF(0, 0), QPointF(0, 0), getItemDouble(node, "upOffset") };
keyMapNode.data.steerWheel.right = { rightKey.first, rightKey.second, keyMapNode.data.steerWheel.down = { downKey.first, downKey.second, QPointF(0, 0), QPointF(0, 0), getItemDouble(node, "downOffset") };
QPointF(0, 0), QPointF(0, 0),
getItemDouble(node, "rightOffset") };
keyMapNode.data.steerWheel.up = { upKey.first, upKey.second,
QPointF(0, 0), QPointF(0, 0),
getItemDouble(node, "upOffset") };
keyMapNode.data.steerWheel.down = { downKey.first, downKey.second,
QPointF(0, 0), QPointF(0, 0),
getItemDouble(node, "downOffset") };
keyMapNode.data.steerWheel.centerPos = getItemPos(node, "centerPos"); keyMapNode.data.steerWheel.centerPos = getItemPos(node, "centerPos");
m_idxSteerWheel = m_keyMapNodes.size(); m_idxSteerWheel = m_keyMapNodes.size();
m_keyMapNodes.push_back(keyMapNode); m_keyMapNodes.push_back(keyMapNode);
} } break;
break; case KeyMap::KMT_DRAG: {
case KeyMap::KMT_DRAG:
{
// safe check // safe check
if (!checkForDrag(node)) { if (!checkForDrag(node)) {
qWarning() << "json error: keyMapNodes node format error"; qWarning() << "json error: keyMapNodes node format error";
@ -241,7 +218,7 @@ parseError:
return; return;
} }
const KeyMap::KeyMapNode& KeyMap::getKeyMapNode(int key) const KeyMap::KeyMapNode &KeyMap::getKeyMapNode(int key)
{ {
auto p = m_rmapKey.value(key, &m_invalidNode); auto p = m_rmapKey.value(key, &m_invalidNode);
if (p == &m_invalidNode) { if (p == &m_invalidNode) {
@ -250,12 +227,12 @@ const KeyMap::KeyMapNode& KeyMap::getKeyMapNode(int key)
return *p; return *p;
} }
const KeyMap::KeyMapNode& KeyMap::getKeyMapNodeKey(int key) const KeyMap::KeyMapNode &KeyMap::getKeyMapNodeKey(int key)
{ {
return *m_rmapKey.value(key, &m_invalidNode); return *m_rmapKey.value(key, &m_invalidNode);
} }
const KeyMap::KeyMapNode& KeyMap::getKeyMapNodeMouse(int key) const KeyMap::KeyMapNode &KeyMap::getKeyMapNodeMouse(int key)
{ {
return *m_rmapMouse.value(key, &m_invalidNode); return *m_rmapMouse.value(key, &m_invalidNode);
} }
@ -270,7 +247,7 @@ int KeyMap::getSwitchKey()
return m_switchKey.key; return m_switchKey.key;
} }
const KeyMap::KeyMapNode& KeyMap::getMouseMoveMap() const KeyMap::KeyMapNode &KeyMap::getMouseMoveMap()
{ {
return m_keyMapNodes[m_idxMouseMove]; return m_keyMapNodes[m_idxMouseMove];
} }
@ -289,39 +266,31 @@ void KeyMap::makeReverseMap()
{ {
m_rmapKey.clear(); m_rmapKey.clear();
m_rmapMouse.clear(); m_rmapMouse.clear();
for (int i = 0 ; i < m_keyMapNodes.size(); ++i) { for (int i = 0; i < m_keyMapNodes.size(); ++i) {
auto& node = m_keyMapNodes[i]; auto &node = m_keyMapNodes[i];
switch (node.type) { switch (node.type) {
case KMT_CLICK: case KMT_CLICK: {
{ QMultiHash<int, KeyMapNode *> &m = node.data.click.keyNode.type == AT_KEY ? m_rmapKey : m_rmapMouse;
QMultiHash<int, KeyMapNode*>& m = node.data.click.keyNode.type == AT_KEY ? m_rmapKey : m_rmapMouse;
m.insert(node.data.click.keyNode.key, &node); m.insert(node.data.click.keyNode.key, &node);
} } break;
break; case KMT_CLICK_TWICE: {
case KMT_CLICK_TWICE: QMultiHash<int, KeyMapNode *> &m = node.data.clickTwice.keyNode.type == AT_KEY ? m_rmapKey : m_rmapMouse;
{
QMultiHash<int, KeyMapNode*>& m = node.data.clickTwice.keyNode.type == AT_KEY ? m_rmapKey : m_rmapMouse;
m.insert(node.data.clickTwice.keyNode.key, &node); m.insert(node.data.clickTwice.keyNode.key, &node);
} } break;
break; case KMT_STEER_WHEEL: {
case KMT_STEER_WHEEL: QMultiHash<int, KeyMapNode *> &ml = node.data.steerWheel.left.type == AT_KEY ? m_rmapKey : m_rmapMouse;
{
QMultiHash<int, KeyMapNode*>& ml = node.data.steerWheel.left.type == AT_KEY ? m_rmapKey : m_rmapMouse;
ml.insert(node.data.steerWheel.left.key, &node); ml.insert(node.data.steerWheel.left.key, &node);
QMultiHash<int, KeyMapNode*>& mr = node.data.steerWheel.right.type == AT_KEY ? m_rmapKey : m_rmapMouse; QMultiHash<int, KeyMapNode *> &mr = node.data.steerWheel.right.type == AT_KEY ? m_rmapKey : m_rmapMouse;
mr.insert(node.data.steerWheel.right.key, &node); mr.insert(node.data.steerWheel.right.key, &node);
QMultiHash<int, KeyMapNode*>& mu = node.data.steerWheel.up.type == AT_KEY ? m_rmapKey : m_rmapMouse; QMultiHash<int, KeyMapNode *> &mu = node.data.steerWheel.up.type == AT_KEY ? m_rmapKey : m_rmapMouse;
mu.insert(node.data.steerWheel.up.key, &node); mu.insert(node.data.steerWheel.up.key, &node);
QMultiHash<int, KeyMapNode*>& md = node.data.steerWheel.down.type == AT_KEY ? m_rmapKey : m_rmapMouse; QMultiHash<int, KeyMapNode *> &md = node.data.steerWheel.down.type == AT_KEY ? m_rmapKey : m_rmapMouse;
md.insert(node.data.steerWheel.down.key, &node); md.insert(node.data.steerWheel.down.key, &node);
} } break;
break; case KMT_DRAG: {
case KMT_DRAG: QMultiHash<int, KeyMapNode *> &m = node.data.drag.keyNode.type == AT_KEY ? m_rmapKey : m_rmapMouse;
{
QMultiHash<int, KeyMapNode*>& m = node.data.drag.keyNode.type == AT_KEY ? m_rmapKey : m_rmapMouse;
m.insert(node.data.drag.keyNode.key, &node); m.insert(node.data.drag.keyNode.key, &node);
} } break;
break;
default: default:
break; break;
} }
@ -333,12 +302,12 @@ QString KeyMap::getItemString(const QJsonObject &node, const QString &name)
return node.value(name).toString(); return node.value(name).toString();
} }
double KeyMap::getItemDouble(const QJsonObject& node, const QString& name) double KeyMap::getItemDouble(const QJsonObject &node, const QString &name)
{ {
return node.value(name).toDouble(); return node.value(name).toDouble();
} }
bool KeyMap::getItemBool(const QJsonObject& node, const QString& name) bool KeyMap::getItemBool(const QJsonObject &node, const QString &name)
{ {
return node.value(name).toBool(false); return node.value(name).toBool(false);
} }
@ -348,43 +317,43 @@ QJsonObject KeyMap::getItemObject(const QJsonObject &node, const QString &name)
return node.value(name).toObject(); return node.value(name).toObject();
} }
QPointF KeyMap::getItemPos(const QJsonObject& node, const QString& name) QPointF KeyMap::getItemPos(const QJsonObject &node, const QString &name)
{ {
QJsonObject pos = node.value(name).toObject(); QJsonObject pos = node.value(name).toObject();
return QPointF(pos.value("x").toDouble(), pos.value("y").toDouble()); return QPointF(pos.value("x").toDouble(), pos.value("y").toDouble());
} }
QPair<KeyMap::ActionType, int> KeyMap::getItemKey(const QJsonObject& node, const QString& name) QPair<KeyMap::ActionType, int> KeyMap::getItemKey(const QJsonObject &node, const QString &name)
{ {
QString value = getItemString(node, name); QString value = getItemString(node, name);
int key = m_metaEnumKey.keyToValue(value.toStdString().c_str()); int key = m_metaEnumKey.keyToValue(value.toStdString().c_str());
int btn = m_metaEnumMouseButtons.keyToValue(value.toStdString().c_str()); int btn = m_metaEnumMouseButtons.keyToValue(value.toStdString().c_str());
if (key == -1 && btn == -1) { if (key == -1 && btn == -1) {
return {AT_INVALID, -1}; return { AT_INVALID, -1 };
} else if (key != -1) { } else if (key != -1) {
return {AT_KEY, key}; return { AT_KEY, key };
} else { } else {
return {AT_MOUSE, btn}; return { AT_MOUSE, btn };
} }
} }
KeyMap::KeyMapType KeyMap::getItemKeyMapType(const QJsonObject& node, const QString& name) KeyMap::KeyMapType KeyMap::getItemKeyMapType(const QJsonObject &node, const QString &name)
{ {
QString value = getItemString(node, name); QString value = getItemString(node, name);
return static_cast<KeyMap::KeyMapType>(m_metaEnumKeyMapType.keyToValue(value.toStdString().c_str())); return static_cast<KeyMap::KeyMapType>(m_metaEnumKeyMapType.keyToValue(value.toStdString().c_str()));
} }
bool KeyMap::checkItemString(const QJsonObject& node, const QString& name) bool KeyMap::checkItemString(const QJsonObject &node, const QString &name)
{ {
return node.contains(name) && node.value(name).isString(); return node.contains(name) && node.value(name).isString();
} }
bool KeyMap::checkItemDouble(const QJsonObject& node, const QString& name) bool KeyMap::checkItemDouble(const QJsonObject &node, const QString &name)
{ {
return node.contains(name) && node.value(name).isDouble(); return node.contains(name) && node.value(name).isDouble();
} }
bool KeyMap::checkItemBool(const QJsonObject& node, const QString& name) bool KeyMap::checkItemBool(const QJsonObject &node, const QString &name)
{ {
return node.contains(name) && node.value(name).isBool(); return node.contains(name) && node.value(name).isBool();
} }
@ -394,38 +363,33 @@ bool KeyMap::checkItemObject(const QJsonObject &node, const QString &name)
return node.contains(name) && node.value(name).isObject(); return node.contains(name) && node.value(name).isObject();
} }
bool KeyMap::checkItemPos(const QJsonObject& node, const QString& name) bool KeyMap::checkItemPos(const QJsonObject &node, const QString &name)
{ {
if (node.contains(name) && node.value(name).isObject()) { if (node.contains(name) && node.value(name).isObject()) {
QJsonObject pos = node.value(name).toObject(); QJsonObject pos = node.value(name).toObject();
return pos.contains("x") && pos.value("x").isDouble() return pos.contains("x") && pos.value("x").isDouble() && pos.contains("y") && pos.value("y").isDouble();
&& pos.contains("y") && pos.value("y").isDouble();
} }
return false; return false;
} }
bool KeyMap::checkForClick(const QJsonObject& node) bool KeyMap::checkForClick(const QJsonObject &node)
{ {
return checkForClickTwice(node) && checkItemBool(node, "switchMap"); return checkForClickTwice(node) && checkItemBool(node, "switchMap");
} }
bool KeyMap::checkForClickTwice(const QJsonObject& node) bool KeyMap::checkForClickTwice(const QJsonObject &node)
{ {
return checkItemString(node, "key") && checkItemPos(node, "pos"); return checkItemString(node, "key") && checkItemPos(node, "pos");
} }
bool KeyMap::checkForSteerWhell(const QJsonObject& node) bool KeyMap::checkForSteerWhell(const QJsonObject &node)
{ {
return checkItemString(node, "leftKey") && checkItemString(node, "rightKey") return checkItemString(node, "leftKey") && checkItemString(node, "rightKey") && checkItemString(node, "upKey") && checkItemString(node, "downKey")
&& checkItemString(node, "upKey") && checkItemString(node, "downKey") && checkItemDouble(node, "leftOffset") && checkItemDouble(node, "rightOffset") && checkItemDouble(node, "upOffset")
&& checkItemDouble(node, "leftOffset") && checkItemDouble(node, "rightOffset") && checkItemDouble(node, "downOffset") && checkItemPos(node, "centerPos");
&& checkItemDouble(node, "upOffset") && checkItemDouble(node, "downOffset")
&& checkItemPos(node, "centerPos");
} }
bool KeyMap::checkForDrag(const QJsonObject& node) bool KeyMap::checkForDrag(const QJsonObject &node)
{ {
return checkItemString(node, "key") return checkItemString(node, "key") && checkItemPos(node, "startPos") && checkItemPos(node, "endPos");
&& checkItemPos(node, "startPos") && checkItemPos(node, "endPos");
} }

View file

@ -1,76 +1,82 @@
#ifndef KEYMAP_H #ifndef KEYMAP_H
#define KEYMAP_H #define KEYMAP_H
#include <QObject> #include <QJsonObject>
#include <QPointF>
#include <QVector>
#include <QRectF>
#include <QPair>
#include <QMetaEnum> #include <QMetaEnum>
#include <QMultiHash> #include <QMultiHash>
#include <QJsonObject> #include <QObject>
#include <QPair>
#include <QPointF>
#include <QRectF>
#include <QVector>
class KeyMap : public QObject class KeyMap : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
enum KeyMapType { enum KeyMapType
{
KMT_INVALID = -1, KMT_INVALID = -1,
KMT_CLICK = 0, KMT_CLICK = 0,
KMT_CLICK_TWICE, KMT_CLICK_TWICE,
KMT_STEER_WHEEL, KMT_STEER_WHEEL,
KMT_DRAG, KMT_DRAG,
KMT_MOUSE_MOVE KMT_MOUSE_MOVE
}; };
Q_ENUM(KeyMapType) Q_ENUM(KeyMapType)
enum ActionType { enum ActionType
{
AT_INVALID = -1, AT_INVALID = -1,
AT_KEY = 0, AT_KEY = 0,
AT_MOUSE = 1, AT_MOUSE = 1,
}; };
Q_ENUM(ActionType) Q_ENUM(ActionType)
struct KeyNode { struct KeyNode
{
ActionType type = AT_INVALID; ActionType type = AT_INVALID;
int key = Qt::Key_unknown; int key = Qt::Key_unknown;
QPointF pos = QPointF(0, 0); // normal key QPointF pos = QPointF(0, 0); // normal key
QPointF extendPos = QPointF(0, 0); // for drag QPointF extendPos = QPointF(0, 0); // for drag
double extendOffset = 0.0; // for steerWheel double extendOffset = 0.0; // for steerWheel
KeyNode(ActionType type = AT_INVALID, KeyNode(
int key = Qt::Key_unknown, ActionType type = AT_INVALID,
QPointF pos = QPointF(0, 0), int key = Qt::Key_unknown,
QPointF extendPos = QPointF(0, 0), QPointF pos = QPointF(0, 0),
double extendOffset = 0.0) QPointF extendPos = QPointF(0, 0),
: type(type) double extendOffset = 0.0)
, key(key) : type(type), key(key), pos(pos), extendPos(extendPos), extendOffset(extendOffset)
, pos(pos)
, extendPos(extendPos)
, extendOffset(extendOffset)
{ {
} }
}; };
struct KeyMapNode { struct KeyMapNode
{
KeyMapType type = KMT_INVALID; KeyMapType type = KMT_INVALID;
union DATA { union DATA
struct { {
struct
{
KeyNode keyNode; KeyNode keyNode;
bool switchMap = false; bool switchMap = false;
} click; } click;
struct { struct
{
KeyNode keyNode; KeyNode keyNode;
} clickTwice; } clickTwice;
struct { struct
QPointF centerPos = {0.0, 0.0}; {
QPointF centerPos = { 0.0, 0.0 };
KeyNode left, right, up, down; KeyNode left, right, up, down;
} steerWheel; } steerWheel;
struct { struct
{
KeyNode keyNode; KeyNode keyNode;
} drag; } drag;
struct { struct
QPointF startPos = {0.0, 0.0}; {
QPointF startPos = { 0.0, 0.0 };
int speedRatio = 1; int speedRatio = 1;
} mouseMove; } mouseMove;
DATA() {} DATA() {}
@ -84,49 +90,49 @@ public:
virtual ~KeyMap(); virtual ~KeyMap();
void loadKeyMap(const QString &json); void loadKeyMap(const QString &json);
const KeyMap::KeyMapNode& getKeyMapNode(int key); const KeyMap::KeyMapNode &getKeyMapNode(int key);
const KeyMap::KeyMapNode& getKeyMapNodeKey(int key); const KeyMap::KeyMapNode &getKeyMapNodeKey(int key);
const KeyMap::KeyMapNode& getKeyMapNodeMouse(int key); const KeyMap::KeyMapNode &getKeyMapNodeMouse(int key);
bool isSwitchOnKeyboard(); bool isSwitchOnKeyboard();
int getSwitchKey(); int getSwitchKey();
bool isValidMouseMoveMap(); bool isValidMouseMoveMap();
bool isValidSteerWheelMap(); bool isValidSteerWheelMap();
const KeyMap::KeyMapNode& getMouseMoveMap(); const KeyMap::KeyMapNode &getMouseMoveMap();
static const QString& getKeyMapPath(); static const QString &getKeyMapPath();
private: private:
// set up the reverse map from key/event event to keyMapNode // set up the reverse map from key/event event to keyMapNode
void makeReverseMap(); void makeReverseMap();
// safe check for base // safe check for base
bool checkItemString(const QJsonObject& node, const QString& name); bool checkItemString(const QJsonObject &node, const QString &name);
bool checkItemDouble(const QJsonObject& node, const QString& name); bool checkItemDouble(const QJsonObject &node, const QString &name);
bool checkItemBool(const QJsonObject& node, const QString& name); bool checkItemBool(const QJsonObject &node, const QString &name);
bool checkItemObject(const QJsonObject& node, const QString& name); bool checkItemObject(const QJsonObject &node, const QString &name);
bool checkItemPos(const QJsonObject& node, const QString& name); bool checkItemPos(const QJsonObject &node, const QString &name);
// safe check for KeyMapNode // safe check for KeyMapNode
bool checkForClick(const QJsonObject& node); bool checkForClick(const QJsonObject &node);
bool checkForClickTwice(const QJsonObject& node); bool checkForClickTwice(const QJsonObject &node);
bool checkForSteerWhell(const QJsonObject& node); bool checkForSteerWhell(const QJsonObject &node);
bool checkForDrag(const QJsonObject& node); bool checkForDrag(const QJsonObject &node);
// get keymap from json object // get keymap from json object
QString getItemString(const QJsonObject& node, const QString& name); QString getItemString(const QJsonObject &node, const QString &name);
double getItemDouble(const QJsonObject& node, const QString& name); double getItemDouble(const QJsonObject &node, const QString &name);
bool getItemBool(const QJsonObject& node, const QString& name); bool getItemBool(const QJsonObject &node, const QString &name);
QJsonObject getItemObject(const QJsonObject& node, const QString& name); QJsonObject getItemObject(const QJsonObject &node, const QString &name);
QPointF getItemPos(const QJsonObject& node, const QString& name); QPointF getItemPos(const QJsonObject &node, const QString &name);
QPair<ActionType, int> getItemKey(const QJsonObject& node, const QString& name); QPair<ActionType, int> getItemKey(const QJsonObject &node, const QString &name);
KeyMapType getItemKeyMapType(const QJsonObject& node, const QString& name); KeyMapType getItemKeyMapType(const QJsonObject &node, const QString &name);
private: private:
static QString s_keyMapPath; static QString s_keyMapPath;
QVector<KeyMapNode> m_keyMapNodes; QVector<KeyMapNode> m_keyMapNodes;
KeyNode m_switchKey = {AT_KEY, Qt::Key_QuoteLeft}; KeyNode m_switchKey = { AT_KEY, Qt::Key_QuoteLeft };
// just for return // just for return
KeyMapNode m_invalidNode; KeyMapNode m_invalidNode;
@ -142,8 +148,8 @@ private:
QMetaEnum m_metaEnumMouseButtons = QMetaEnum::fromType<Qt::MouseButtons>(); QMetaEnum m_metaEnumMouseButtons = QMetaEnum::fromType<Qt::MouseButtons>();
QMetaEnum m_metaEnumKeyMapType = QMetaEnum::fromType<KeyMap::KeyMapType>(); QMetaEnum m_metaEnumKeyMapType = QMetaEnum::fromType<KeyMap::KeyMapType>();
// reverse map of key/mouse event // reverse map of key/mouse event
QMultiHash<int, KeyMapNode*> m_rmapKey; QMultiHash<int, KeyMapNode *> m_rmapKey;
QMultiHash<int, KeyMapNode*> m_rmapMouse; QMultiHash<int, KeyMapNode *> m_rmapMouse;
}; };
#endif // KEYMAP_H #endif // KEYMAP_H

View file

@ -1,17 +1,13 @@
#include <QDebug> #include <QDebug>
#include "devicemsg.h"
#include "bufferutil.h" #include "bufferutil.h"
#include "devicemsg.h"
DeviceMsg::DeviceMsg(QObject *parent) : QObject(parent) DeviceMsg::DeviceMsg(QObject *parent) : QObject(parent) {}
{
}
DeviceMsg::~DeviceMsg() DeviceMsg::~DeviceMsg()
{ {
if (DMT_GET_CLIPBOARD == m_data.type if (DMT_GET_CLIPBOARD == m_data.type && Q_NULLPTR != m_data.clipboardMsg.text) {
&& Q_NULLPTR != m_data.clipboardMsg.text) {
delete m_data.clipboardMsg.text; delete m_data.clipboardMsg.text;
m_data.clipboardMsg.text = Q_NULLPTR; m_data.clipboardMsg.text = Q_NULLPTR;
} }
@ -22,12 +18,12 @@ DeviceMsg::DeviceMsgType DeviceMsg::type()
return m_data.type; return m_data.type;
} }
void DeviceMsg::getClipboardMsgData(QString& text) void DeviceMsg::getClipboardMsgData(QString &text)
{ {
text = QString::fromUtf8(m_data.clipboardMsg.text); text = QString::fromUtf8(m_data.clipboardMsg.text);
} }
qint32 DeviceMsg::deserialize(QByteArray& byteArray) qint32 DeviceMsg::deserialize(QByteArray &byteArray)
{ {
QBuffer buf(&byteArray); QBuffer buf(&byteArray);
buf.open(QBuffer::ReadOnly); buf.open(QBuffer::ReadOnly);
@ -61,7 +57,7 @@ qint32 DeviceMsg::deserialize(QByteArray& byteArray)
break; break;
} }
default: default:
qWarning("Unsupported device msg type: %d", (int) m_data.type); qWarning("Unsupported device msg type: %d", (int)m_data.type);
ret = -1; // error, we cannot recover ret = -1; // error, we cannot recover
} }

View file

@ -11,7 +11,8 @@ class DeviceMsg : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
enum DeviceMsgType { enum DeviceMsgType
{
DMT_NULL = -1, DMT_NULL = -1,
// 和服务端对应 // 和服务端对应
DMT_GET_CLIPBOARD = 0, DMT_GET_CLIPBOARD = 0,
@ -20,20 +21,23 @@ public:
virtual ~DeviceMsg(); virtual ~DeviceMsg();
DeviceMsg::DeviceMsgType type(); DeviceMsg::DeviceMsgType type();
void getClipboardMsgData(QString& text); void getClipboardMsgData(QString &text);
qint32 deserialize(QByteArray& byteArray); qint32 deserialize(QByteArray &byteArray);
private: private:
struct DeviceMsgData { struct DeviceMsgData
{
DeviceMsgType type = DMT_NULL; DeviceMsgType type = DMT_NULL;
union { union
struct { {
char* text = Q_NULLPTR; struct
{
char *text = Q_NULLPTR;
} clipboardMsg; } clipboardMsg;
}; };
DeviceMsgData(){} DeviceMsgData() {}
~DeviceMsgData(){} ~DeviceMsgData() {}
}; };
DeviceMsgData m_data; DeviceMsgData m_data;

View file

@ -1,18 +1,13 @@
#include <QTcpSocket>
#include <QApplication> #include <QApplication>
#include <QClipboard> #include <QClipboard>
#include <QTcpSocket> #include <QTcpSocket>
#include "receiver.h"
#include "devicemsg.h" #include "devicemsg.h"
#include "receiver.h"
Receiver::Receiver(QObject *parent) : QObject(parent) Receiver::Receiver(QObject *parent) : QObject(parent) {}
{
}
Receiver::~Receiver() Receiver::~Receiver() {}
{
}
void Receiver::setControlSocket(QTcpSocket *controlSocket) void Receiver::setControlSocket(QTcpSocket *controlSocket)
{ {
@ -24,7 +19,7 @@ void Receiver::setControlSocket(QTcpSocket *controlSocket)
} }
void Receiver::onReadyRead() void Receiver::onReadyRead()
{ {
if (!m_controlSocket) { if (!m_controlSocket) {
return; return;
} }
@ -44,8 +39,7 @@ void Receiver::onReadyRead()
void Receiver::processMsg(DeviceMsg *deviceMsg) void Receiver::processMsg(DeviceMsg *deviceMsg)
{ {
switch (deviceMsg->type()) { switch (deviceMsg->type()) {
case DeviceMsg::DMT_GET_CLIPBOARD: case DeviceMsg::DMT_GET_CLIPBOARD: {
{
qInfo("Device clipboard copied"); qInfo("Device clipboard copied");
QClipboard *board = QApplication::clipboard(); QClipboard *board = QApplication::clipboard();
QString text; QString text;

View file

@ -2,15 +2,9 @@
#include "avframeconvert.h" #include "avframeconvert.h"
AVFrameConvert::AVFrameConvert() AVFrameConvert::AVFrameConvert() {}
{
} AVFrameConvert::~AVFrameConvert() {}
AVFrameConvert::~AVFrameConvert()
{
}
void AVFrameConvert::setSrcFrameInfo(int srcWidth, int srcHeight, AVPixelFormat srcFormat) void AVFrameConvert::setSrcFrameInfo(int srcWidth, int srcHeight, AVPixelFormat srcFormat)
{ {
@ -20,11 +14,11 @@ void AVFrameConvert::setSrcFrameInfo(int srcWidth, int srcHeight, AVPixelFormat
qDebug() << "Convert::src frame info " << srcWidth << "x" << srcHeight; qDebug() << "Convert::src frame info " << srcWidth << "x" << srcHeight;
} }
void AVFrameConvert::getSrcFrameInfo(int& srcWidth, int& srcHeight, AVPixelFormat& srcFormat) void AVFrameConvert::getSrcFrameInfo(int &srcWidth, int &srcHeight, AVPixelFormat &srcFormat)
{ {
srcWidth = m_srcWidth; srcWidth = m_srcWidth;
srcHeight = m_srcHeight; srcHeight = m_srcHeight;
srcFormat = m_srcFormat; srcFormat = m_srcFormat;
} }
void AVFrameConvert::setDstFrameInfo(int dstWidth, int dstHeight, AVPixelFormat dstFormat) void AVFrameConvert::setDstFrameInfo(int dstWidth, int dstHeight, AVPixelFormat dstFormat)
@ -34,7 +28,7 @@ void AVFrameConvert::setDstFrameInfo(int dstWidth, int dstHeight, AVPixelFormat
m_dstFormat = dstFormat; m_dstFormat = dstFormat;
} }
void AVFrameConvert::getDstFrameInfo(int& dstWidth, int& dstHeight, AVPixelFormat& dstFormat) void AVFrameConvert::getDstFrameInfo(int &dstWidth, int &dstHeight, AVPixelFormat &dstFormat)
{ {
dstWidth = m_dstWidth; dstWidth = m_dstWidth;
dstHeight = m_dstHeight; dstHeight = m_dstHeight;
@ -46,8 +40,7 @@ bool AVFrameConvert::init()
if (m_convertCtx) { if (m_convertCtx) {
return true; return true;
} }
m_convertCtx = sws_getContext(m_srcWidth, m_srcHeight, m_srcFormat, m_dstWidth, m_dstHeight, m_dstFormat, m_convertCtx = sws_getContext(m_srcWidth, m_srcHeight, m_srcFormat, m_dstWidth, m_dstHeight, m_dstFormat, SWS_BICUBIC, Q_NULLPTR, Q_NULLPTR, Q_NULLPTR);
SWS_BICUBIC, Q_NULLPTR, Q_NULLPTR, Q_NULLPTR);
if (!m_convertCtx) { if (!m_convertCtx) {
return false; return false;
} }
@ -67,15 +60,13 @@ void AVFrameConvert::deInit()
} }
} }
bool AVFrameConvert::convert(const AVFrame* srcFrame, AVFrame* dstFrame) bool AVFrameConvert::convert(const AVFrame *srcFrame, AVFrame *dstFrame)
{ {
if(!m_convertCtx || !srcFrame || !dstFrame) { if (!m_convertCtx || !srcFrame || !dstFrame) {
return false; return false;
} }
qint32 ret = sws_scale(m_convertCtx, qint32 ret
static_cast<const uint8_t* const*>(srcFrame->data), = sws_scale(m_convertCtx, static_cast<const uint8_t *const *>(srcFrame->data), srcFrame->linesize, 0, m_srcHeight, dstFrame->data, dstFrame->linesize);
srcFrame->linesize, 0, m_srcHeight, dstFrame->data,
dstFrame->linesize);
if (0 == ret) { if (0 == ret) {
return false; return false;
} }

View file

@ -5,8 +5,8 @@
extern "C" extern "C"
{ {
#include "libavcodec/avcodec.h" #include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libavutil/frame.h" #include "libavutil/frame.h"
#include "libswscale/swscale.h"
} }
class AVFrameConvert class AVFrameConvert
@ -17,14 +17,14 @@ public:
public: public:
void setSrcFrameInfo(int srcWidth, int srcHeight, AVPixelFormat srcFormat); void setSrcFrameInfo(int srcWidth, int srcHeight, AVPixelFormat srcFormat);
void getSrcFrameInfo(int& srcWidth, int& srcHeight, AVPixelFormat& srcFormat); void getSrcFrameInfo(int &srcWidth, int &srcHeight, AVPixelFormat &srcFormat);
void setDstFrameInfo(int dstWidth, int dstHeight, AVPixelFormat dstFormat); void setDstFrameInfo(int dstWidth, int dstHeight, AVPixelFormat dstFormat);
void getDstFrameInfo(int& dstWidth, int& dstHeight, AVPixelFormat& dstFormat); void getDstFrameInfo(int &dstWidth, int &dstHeight, AVPixelFormat &dstFormat);
bool init(); bool init();
bool isInit(); bool isInit();
void deInit(); void deInit();
bool convert(const AVFrame* srcFrame, AVFrame* dstFrame); bool convert(const AVFrame *srcFrame, AVFrame *dstFrame);
private: private:
int m_srcWidth = 0; int m_srcWidth = 0;

View file

@ -1,20 +1,12 @@
#include <QDebug> #include <QDebug>
#include "compat.h" #include "compat.h"
#include "videobuffer.h"
#include "decoder.h" #include "decoder.h"
#include "videobuffer.h"
Decoder::Decoder(VideoBuffer* vb, QObject *parent) Decoder::Decoder(VideoBuffer *vb, QObject *parent) : QObject(parent), m_vb(vb) {}
: QObject(parent)
, m_vb(vb)
{
} Decoder::~Decoder() {}
Decoder::~Decoder()
{
}
bool Decoder::open(const AVCodec *codec) bool Decoder::open(const AVCodec *codec)
{ {
@ -43,12 +35,12 @@ void Decoder::close()
avcodec_free_context(&m_codecCtx); avcodec_free_context(&m_codecCtx);
} }
bool Decoder::push(const AVPacket* packet) bool Decoder::push(const AVPacket *packet)
{ {
if (!m_codecCtx || !m_vb) { if (!m_codecCtx || !m_vb) {
return false; return false;
} }
AVFrame* decodingFrame = m_vb->decodingFrame(); AVFrame *decodingFrame = m_vb->decodingFrame();
#ifdef QTSCRCPY_LAVF_HAS_NEW_ENCODING_DECODING_API #ifdef QTSCRCPY_LAVF_HAS_NEW_ENCODING_DECODING_API
int ret = -1; int ret = -1;
if ((ret = avcodec_send_packet(m_codecCtx, packet)) < 0) { if ((ret = avcodec_send_packet(m_codecCtx, packet)) < 0) {
@ -123,6 +115,6 @@ void Decoder::pushFrame()
if (previousFrameSkipped) { if (previousFrameSkipped) {
// the previous newFrame will consume this frame // the previous newFrame will consume this frame
return; return;
} }
emit onNewFrame(); emit onNewFrame();
} }

View file

@ -12,7 +12,7 @@ class Decoder : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
Decoder(VideoBuffer* vb, QObject *parent = Q_NULLPTR); Decoder(VideoBuffer *vb, QObject *parent = Q_NULLPTR);
virtual ~Decoder(); virtual ~Decoder();
bool open(const AVCodec *codec); bool open(const AVCodec *codec);
@ -26,9 +26,9 @@ signals:
protected: protected:
void pushFrame(); void pushFrame();
private: private:
VideoBuffer* m_vb = Q_NULLPTR; VideoBuffer *m_vb = Q_NULLPTR;
AVCodecContext* m_codecCtx = Q_NULLPTR; AVCodecContext *m_codecCtx = Q_NULLPTR;
bool m_isCodecCtxOpen = false; bool m_isCodecCtxOpen = false;
}; };

View file

@ -1,17 +1,11 @@
#include <QTimerEvent>
#include <QDebug> #include <QDebug>
#include <QTimerEvent>
#include "fpscounter.h" #include "fpscounter.h"
FpsCounter::FpsCounter(QObject* parent) : QObject(parent) FpsCounter::FpsCounter(QObject *parent) : QObject(parent) {}
{
} FpsCounter::~FpsCounter() {}
FpsCounter::~FpsCounter()
{
}
void FpsCounter::start() void FpsCounter::start()
{ {
@ -20,7 +14,7 @@ void FpsCounter::start()
} }
void FpsCounter::stop() void FpsCounter::stop()
{ {
stopCounterTimer(); stopCounterTimer();
resetCounter(); resetCounter();
} }

View file

@ -6,7 +6,7 @@ class FpsCounter : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
FpsCounter(QObject* parent = Q_NULLPTR); FpsCounter(QObject *parent = Q_NULLPTR);
virtual ~FpsCounter(); virtual ~FpsCounter();
void start(); void start();
@ -23,7 +23,7 @@ private:
void stopCounterTimer(); void stopCounterTimer();
void resetCounter(); void resetCounter();
private: private:
quint32 m_counterTimer = 0; quint32 m_counterTimer = 0;
quint32 m_curRendered = 0; quint32 m_curRendered = 0;
quint32 m_curSkipped = 0; quint32 m_curSkipped = 0;

View file

@ -1,19 +1,13 @@
#include "videobuffer.h" #include "videobuffer.h"
extern "C" extern "C"
{ {
#include "libavutil/avutil.h"
#include "libavformat/avformat.h" #include "libavformat/avformat.h"
#include "libavutil/avutil.h"
} }
VideoBuffer::VideoBuffer() VideoBuffer::VideoBuffer() {}
{
} VideoBuffer::~VideoBuffer() {}
VideoBuffer::~VideoBuffer()
{
}
bool VideoBuffer::init(bool renderExpiredFrames) bool VideoBuffer::init(bool renderExpiredFrames)
{ {
@ -68,7 +62,7 @@ AVFrame *VideoBuffer::decodingFrame()
return m_decodingFrame; return m_decodingFrame;
} }
void VideoBuffer::offerDecodedFrame(bool& previousFrameSkipped) void VideoBuffer::offerDecodedFrame(bool &previousFrameSkipped)
{ {
m_mutex.lock(); m_mutex.lock();
@ -87,7 +81,7 @@ void VideoBuffer::offerDecodedFrame(bool& previousFrameSkipped)
swap(); swap();
previousFrameSkipped = !m_renderingFrameConsumed; previousFrameSkipped = !m_renderingFrameConsumed;
m_renderingFrameConsumed = false; m_renderingFrameConsumed = false;
m_mutex.unlock(); m_mutex.unlock();
} }
const AVFrame *VideoBuffer::consumeRenderedFrame() const AVFrame *VideoBuffer::consumeRenderedFrame()

View file

@ -10,7 +10,7 @@
typedef struct AVFrame AVFrame; typedef struct AVFrame AVFrame;
class VideoBuffer class VideoBuffer
{ {
public: public:
VideoBuffer(); VideoBuffer();
virtual ~VideoBuffer(); virtual ~VideoBuffer();
@ -20,19 +20,19 @@ public:
void lock(); void lock();
void unLock(); void unLock();
AVFrame* decodingFrame(); AVFrame *decodingFrame();
// set the decoder frame as ready for rendering // set the decoder frame as ready for rendering
// this function locks m_mutex during its execution // this function locks m_mutex during its execution
// returns true if the previous frame had been consumed // returns true if the previous frame had been consumed
void offerDecodedFrame(bool& previousFrameSkipped); void offerDecodedFrame(bool &previousFrameSkipped);
// mark the rendering frame as consumed and return it // mark the rendering frame as consumed and return it
// MUST be called with m_mutex locked!!! // MUST be called with m_mutex locked!!!
// the caller is expected to render the returned frame to some texture before // the caller is expected to render the returned frame to some texture before
// unlocking m_mutex // unlocking m_mutex
const AVFrame* consumeRenderedFrame(); const AVFrame *consumeRenderedFrame();
const AVFrame* peekRenderedFrame(); const AVFrame *peekRenderedFrame();
// wake up and avoid any blocking call // wake up and avoid any blocking call
void interrupt(); void interrupt();
@ -41,8 +41,8 @@ private:
void swap(); void swap();
private: private:
AVFrame* m_decodingFrame = Q_NULLPTR; AVFrame *m_decodingFrame = Q_NULLPTR;
AVFrame* m_renderingframe = Q_NULLPTR; AVFrame *m_renderingframe = Q_NULLPTR;
QMutex m_mutex; QMutex m_mutex;
bool m_renderingFrameConsumed = true; bool m_renderingFrameConsumed = true;
FpsCounter m_fpsCounter; FpsCounter m_fpsCounter;

View file

@ -1,27 +1,25 @@
#include <QTimer>
#include <QMessageBox>
#include <QDir> #include <QDir>
#include <QMessageBox>
#include <QTimer>
#include "avframeconvert.h"
#include "config.h"
#include "controller.h"
#include "decoder.h"
#include "device.h" #include "device.h"
#include "filehandler.h"
#include "mousetap/mousetap.h"
#include "recorder.h" #include "recorder.h"
#include "server.h" #include "server.h"
#include "videobuffer.h"
#include "decoder.h"
#include "filehandler.h"
#include "stream.h" #include "stream.h"
#include "videobuffer.h"
#include "videoform.h" #include "videoform.h"
#include "controller.h"
#include "config.h"
#include "avframeconvert.h"
#include "mousetap/mousetap.h"
extern "C" extern "C"
{ {
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
} }
Device::Device(DeviceParams params, QObject *parent) Device::Device(DeviceParams params, QObject *parent) : QObject(parent), m_params(params)
: QObject(parent)
, m_params(params)
{ {
if (!params.display && m_params.recordFileName.trimmed().isEmpty()) { if (!params.display && m_params.recordFileName.trimmed().isEmpty()) {
qCritical("not display must be recorded"); qCritical("not display must be recorded");
@ -102,7 +100,7 @@ const QSize Device::frameSize()
void Device::updateScript(QString script) void Device::updateScript(QString script)
{ {
if(m_controller){ if (m_controller) {
m_controller->updateScript(script); m_controller->updateScript(script);
} }
} }
@ -121,11 +119,11 @@ void Device::onScreenshot()
void Device::onShowTouch(bool show) void Device::onShowTouch(bool show)
{ {
AdbProcess* adb = new AdbProcess(); AdbProcess *adb = new AdbProcess();
if (!adb) { if (!adb) {
return; return;
} }
connect(adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult){ connect(adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) {
if (AdbProcess::AER_SUCCESS_START != processResult) { if (AdbProcess::AER_SUCCESS_START != processResult) {
sender()->deleteLater(); sender()->deleteLater();
} }
@ -167,7 +165,7 @@ void Device::initSignals()
connect(this, &Device::postTextInput, m_controller, &Controller::onPostTextInput); connect(this, &Device::postTextInput, m_controller, &Controller::onPostTextInput);
} }
if (m_videoForm) { if (m_videoForm) {
connect(m_videoForm, &VideoForm::destroyed, this, [this](QObject *obj){ connect(m_videoForm, &VideoForm::destroyed, this, [this](QObject *obj) {
Q_UNUSED(obj) Q_UNUSED(obj)
deleteLater(); deleteLater();
}); });
@ -177,7 +175,7 @@ void Device::initSignals()
if (m_fileHandler) { if (m_fileHandler) {
connect(this, &Device::pushFileRequest, m_fileHandler, &FileHandler::onPushFileRequest); connect(this, &Device::pushFileRequest, m_fileHandler, &FileHandler::onPushFileRequest);
connect(this, &Device::installApkRequest, m_fileHandler, &FileHandler::onInstallApkRequest); connect(this, &Device::installApkRequest, m_fileHandler, &FileHandler::onInstallApkRequest);
connect(m_fileHandler, &FileHandler::fileHandlerResult, this, [this](FileHandler::FILE_HANDLER_RESULT processResult, bool isApk){ connect(m_fileHandler, &FileHandler::fileHandlerResult, this, [this](FileHandler::FILE_HANDLER_RESULT processResult, bool isApk) {
QString tipsType = ""; QString tipsType = "";
if (isApk) { if (isApk) {
tipsType = tr("install apk"); tipsType = tr("install apk");
@ -203,14 +201,14 @@ void Device::initSignals()
} }
if (m_server) { if (m_server) {
connect(m_server, &Server::serverStartResult, this, [this](bool success){ connect(m_server, &Server::serverStartResult, this, [this](bool success) {
if (success) { if (success) {
m_server->connectTo(); m_server->connectTo();
} else { } else {
deleteLater(); deleteLater();
} }
}); });
connect(m_server, &Server::connectToResult, this, [this](bool success, const QString &deviceName, const QSize &size){ connect(m_server, &Server::connectToResult, this, [this](bool success, const QString &deviceName, const QSize &size) {
if (success) { if (success) {
double diff = m_startTimeCount.elapsed() / 1000.0; double diff = m_startTimeCount.elapsed() / 1000.0;
qInfo(QString("server start finish in %1s").arg(diff).toStdString().c_str()); qInfo(QString("server start finish in %1s").arg(diff).toStdString().c_str());
@ -251,14 +249,14 @@ void Device::initSignals()
} }
} }
}); });
connect(m_server, &Server::onServerStop, this, [this](){ connect(m_server, &Server::onServerStop, this, [this]() {
deleteLater(); deleteLater();
qDebug() << "server process stop"; qDebug() << "server process stop";
}); });
} }
if (m_stream) { if (m_stream) {
connect(m_stream, &Stream::onStreamStop, this, [this](){ connect(m_stream, &Stream::onStreamStop, this, [this]() {
deleteLater(); deleteLater();
qDebug() << "stream thread stop"; qDebug() << "stream thread stop";
}); });
@ -266,21 +264,26 @@ void Device::initSignals()
if (m_decoder && m_vb) { if (m_decoder && m_vb) {
// must be Qt::QueuedConnection, ui update must be main thread // must be Qt::QueuedConnection, ui update must be main thread
connect(m_decoder, &Decoder::onNewFrame, this, [this](){ connect(
m_vb->lock(); m_decoder,
const AVFrame *frame = m_vb->consumeRenderedFrame(); &Decoder::onNewFrame,
if (m_videoForm) { this,
m_videoForm->updateRender(frame); [this]() {
} m_vb->lock();
m_vb->unLock(); const AVFrame *frame = m_vb->consumeRenderedFrame();
},Qt::QueuedConnection); if (m_videoForm) {
m_videoForm->updateRender(frame);
}
m_vb->unLock();
},
Qt::QueuedConnection);
} }
} }
void Device::startServer() void Device::startServer()
{ {
// fix: macos cant recv finished signel, timer is ok // fix: macos cant recv finished signel, timer is ok
QTimer::singleShot(0, this, [this](){ QTimer::singleShot(0, this, [this]() {
m_startTimeCount.start(); m_startTimeCount.start();
// max size support 480p 720p 1080p 设备原生分辨率 // max size support 480p 720p 1080p 设备原生分辨率
// support wireless connect, example: // support wireless connect, example:
@ -300,7 +303,7 @@ void Device::startServer()
}); });
} }
void Device::onSetControlState(Device* device, Device::GroupControlState state) void Device::onSetControlState(Device *device, Device::GroupControlState state)
{ {
Q_UNUSED(device) Q_UNUSED(device)
if (m_controlState == state) { if (m_controlState == state) {
@ -328,7 +331,7 @@ Device::GroupControlState Device::controlState()
return m_controlState; return m_controlState;
} }
bool Device::saveFrame(const AVFrame* frame) bool Device::saveFrame(const AVFrame *frame)
{ {
if (!frame) { if (!frame) {
return false; return false;
@ -336,7 +339,7 @@ bool Device::saveFrame(const AVFrame* frame)
// create buffer // create buffer
QImage rgbImage(frame->width, frame->height, QImage::Format_RGB32); QImage rgbImage(frame->width, frame->height, QImage::Format_RGB32);
AVFrame* rgbFrame = av_frame_alloc(); AVFrame *rgbFrame = av_frame_alloc();
if (!rgbFrame) { if (!rgbFrame) {
return false; return false;
} }

View file

@ -22,20 +22,22 @@ class Device : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
struct DeviceParams { struct DeviceParams
QString recordFileName = ""; // 视频录制文件名 {
QString serial = ""; // 设备序列号 QString recordFileName = ""; // 视频录制文件名
quint16 localPort = 27183; // reverse时本地监听端口 QString serial = ""; // 设备序列号
quint16 maxSize = 720; // 视频分辨率 quint16 localPort = 27183; // reverse时本地监听端口
quint32 bitRate = 8000000; // 视频比特率 quint16 maxSize = 720; // 视频分辨率
quint32 maxFps = 60; // 视频最大帧率 quint32 bitRate = 8000000; // 视频比特率
bool closeScreen = false; // 启动时自动息屏 quint32 maxFps = 60; // 视频最大帧率
bool useReverse = true; // true:先使用adb reverse失败后自动使用adb forwardfalse:直接使用adb forward bool closeScreen = false; // 启动时自动息屏
bool display = true; // 是否显示画面(或者仅仅后台录制) bool useReverse = true; // true:先使用adb reverse失败后自动使用adb forwardfalse:直接使用adb forward
QString gameScript = ""; // 游戏映射脚本 bool display = true; // 是否显示画面(或者仅仅后台录制)
bool renderExpiredFrames = false; // 是否渲染延迟视频帧 QString gameScript = ""; // 游戏映射脚本
bool renderExpiredFrames = false; // 是否渲染延迟视频帧
}; };
enum GroupControlState { enum GroupControlState
{
GCS_FREE = 0, GCS_FREE = 0,
GCS_HOST, GCS_HOST,
GCS_CLIENT, GCS_CLIENT,
@ -67,37 +69,37 @@ signals:
void expandNotificationPanel(); void expandNotificationPanel();
void collapseNotificationPanel(); void collapseNotificationPanel();
void postBackOrScreenOn(); void postBackOrScreenOn();
void postTextInput(QString& text); void postTextInput(QString &text);
void requestDeviceClipboard(); void requestDeviceClipboard();
void setDeviceClipboard(); void setDeviceClipboard();
void clipboardPaste(); void clipboardPaste();
void pushFileRequest(const QString& serial, const QString& file, const QString& devicePath = ""); void pushFileRequest(const QString &serial, const QString &file, const QString &devicePath = "");
void installApkRequest(const QString& serial, const QString& apkFile); void installApkRequest(const QString &serial, const QString &apkFile);
// key map // key map
void mouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize); void mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize);
void wheelEvent(const QWheelEvent* from, const QSize& frameSize, const QSize& showSize); void wheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize);
void keyEvent(const QKeyEvent* from, const QSize& frameSize, const QSize& showSize); void keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize);
// self connect signal and slots // self connect signal and slots
void screenshot(); void screenshot();
void showTouch(bool show); void showTouch(bool show);
void setControlState(Device* device, Device::GroupControlState state); void setControlState(Device *device, Device::GroupControlState state);
void grabCursor(bool grab); void grabCursor(bool grab);
// for notify // for notify
void controlStateChange(Device* device, Device::GroupControlState oldState, Device::GroupControlState newState); void controlStateChange(Device *device, Device::GroupControlState oldState, Device::GroupControlState newState);
public slots: public slots:
void onScreenshot(); void onScreenshot();
void onShowTouch(bool show); void onShowTouch(bool show);
void onSetControlState(Device* device, Device::GroupControlState state); void onSetControlState(Device *device, Device::GroupControlState state);
void onGrabCursor(bool grab); void onGrabCursor(bool grab);
private: private:
void initSignals(); void initSignals();
void startServer(); void startServer();
bool saveFrame(const AVFrame* frame); bool saveFrame(const AVFrame *frame);
private: private:
// server relevant // server relevant
@ -106,8 +108,8 @@ private:
QPointer<Controller> m_controller; QPointer<Controller> m_controller;
QPointer<FileHandler> m_fileHandler; QPointer<FileHandler> m_fileHandler;
QPointer<Stream> m_stream; QPointer<Stream> m_stream;
VideoBuffer* m_vb = Q_NULLPTR; VideoBuffer *m_vb = Q_NULLPTR;
Recorder* m_recorder = Q_NULLPTR; Recorder *m_recorder = Q_NULLPTR;
// ui // ui
QPointer<VideoForm> m_videoForm; QPointer<VideoForm> m_videoForm;

View file

@ -1,9 +1,8 @@
#include "filehandler.h" #include "filehandler.h"
FileHandler::FileHandler(QObject *parent) FileHandler::FileHandler(QObject *parent) : QObject(parent)
: QObject (parent)
{ {
connect(&m_adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult){ connect(&m_adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) {
switch (processResult) { switch (processResult) {
case AdbProcess::AER_ERROR_START: case AdbProcess::AER_ERROR_START:
case AdbProcess::AER_ERROR_EXEC: case AdbProcess::AER_ERROR_EXEC:
@ -19,12 +18,9 @@ FileHandler::FileHandler(QObject *parent)
}); });
} }
FileHandler::~FileHandler() FileHandler::~FileHandler() {}
{
} void FileHandler::onPushFileRequest(const QString &serial, const QString &file, const QString &devicePath)
void FileHandler::onPushFileRequest(const QString &serial, const QString &file, const QString& devicePath)
{ {
if (m_adb.isRuning()) { if (m_adb.isRuning()) {
emit fileHandlerResult(FAR_IS_RUNNING, false); emit fileHandlerResult(FAR_IS_RUNNING, false);

View file

@ -8,10 +8,11 @@ class FileHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
enum FILE_HANDLER_RESULT { enum FILE_HANDLER_RESULT
FAR_IS_RUNNING, // 正在执行 {
FAR_SUCCESS_EXEC, // 执行成功 FAR_IS_RUNNING, // 正在执行
FAR_ERROR_EXEC, // 执行失败 FAR_SUCCESS_EXEC, // 执行成功
FAR_ERROR_EXEC, // 执行失败
}; };
FileHandler(QObject *parent = nullptr); FileHandler(QObject *parent = nullptr);
@ -20,8 +21,8 @@ public:
const QString &getDevicePath(); const QString &getDevicePath();
public slots: public slots:
void onPushFileRequest(const QString& serial, const QString& file, const QString& devicePath = ""); void onPushFileRequest(const QString &serial, const QString &file, const QString &devicePath = "");
void onInstallApkRequest(const QString& serial, const QString& apkFile); void onInstallApkRequest(const QString &serial, const QString &apkFile);
signals: signals:
void fileHandlerResult(FILE_HANDLER_RESULT processResult, bool isApk = false); void fileHandlerResult(FILE_HANDLER_RESULT processResult, bool isApk = false);

View file

@ -1,25 +1,19 @@
#include <QCoreApplication>
#include <QDebug> #include <QDebug>
#include <QFileInfo> #include <QFileInfo>
#include <QCoreApplication>
#include "compat.h" #include "compat.h"
#include "recorder.h" #include "recorder.h"
static const AVRational SCRCPY_TIME_BASE = {1, 1000000}; // timestamps in us static const AVRational SCRCPY_TIME_BASE = { 1, 1000000 }; // timestamps in us
Recorder::Recorder(const QString& fileName, QObject* parent) Recorder::Recorder(const QString &fileName, QObject *parent) : QThread(parent), m_fileName(fileName), m_format(guessRecordFormat(fileName)) {}
: QThread(parent)
, m_fileName(fileName) Recorder::~Recorder() {}
, m_format(guessRecordFormat(fileName))
AVPacket *Recorder::packetNew(const AVPacket *packet)
{ {
} AVPacket *rec = new AVPacket;
Recorder::~Recorder()
{
}
AVPacket* Recorder::packetNew(const AVPacket *packet) {
AVPacket* rec = new AVPacket;
if (!rec) { if (!rec) {
return Q_NULLPTR; return Q_NULLPTR;
} }
@ -34,7 +28,8 @@ AVPacket* Recorder::packetNew(const AVPacket *packet) {
return rec; return rec;
} }
void Recorder::packetDelete(AVPacket* packet) { void Recorder::packetDelete(AVPacket *packet)
{
av_packet_unref(packet); av_packet_unref(packet);
delete packet; delete packet;
} }
@ -56,11 +51,11 @@ void Recorder::setFormat(Recorder::RecorderFormat format)
m_format = format; m_format = format;
} }
bool Recorder::open(const AVCodec* inputCodec) bool Recorder::open(const AVCodec *inputCodec)
{ {
QString formatName = recorderGetFormatName(m_format); QString formatName = recorderGetFormatName(m_format);
Q_ASSERT(!formatName.isEmpty()); Q_ASSERT(!formatName.isEmpty());
const AVOutputFormat* format = findMuxer(formatName.toUtf8()); const AVOutputFormat *format = findMuxer(formatName.toUtf8());
if (!format) { if (!format) {
qCritical("Could not find muxer"); qCritical("Could not find muxer");
return false; return false;
@ -77,13 +72,12 @@ bool Recorder::open(const AVCodec* inputCodec)
// still expects a pointer-to-non-const (it has not be updated accordingly) // still expects a pointer-to-non-const (it has not be updated accordingly)
// <https://github.com/FFmpeg/FFmpeg/commit/0694d8702421e7aff1340038559c438b61bb30dd> // <https://github.com/FFmpeg/FFmpeg/commit/0694d8702421e7aff1340038559c438b61bb30dd>
m_formatCtx->oformat = (AVOutputFormat*)format; m_formatCtx->oformat = (AVOutputFormat *)format;
QString comment = "Recorded by QtScrcpy " + QCoreApplication::applicationVersion(); QString comment = "Recorded by QtScrcpy " + QCoreApplication::applicationVersion();
av_dict_set(&m_formatCtx->metadata, "comment", av_dict_set(&m_formatCtx->metadata, "comment", comment.toUtf8(), 0);
comment.toUtf8(), 0);
AVStream* outStream = avformat_new_stream(m_formatCtx, inputCodec); AVStream *outStream = avformat_new_stream(m_formatCtx, inputCodec);
if (!outStream) { if (!outStream) {
avformat_free_context(m_formatCtx); avformat_free_context(m_formatCtx);
m_formatCtx = Q_NULLPTR; m_formatCtx = Q_NULLPTR;
@ -102,10 +96,9 @@ bool Recorder::open(const AVCodec* inputCodec)
outStream->codec->pix_fmt = AV_PIX_FMT_YUV420P; outStream->codec->pix_fmt = AV_PIX_FMT_YUV420P;
outStream->codec->width = m_declaredFrameSize.width(); outStream->codec->width = m_declaredFrameSize.width();
outStream->codec->height = m_declaredFrameSize.height(); outStream->codec->height = m_declaredFrameSize.height();
#endif #endif
int ret = avio_open(&m_formatCtx->pb, m_fileName.toUtf8().toStdString().c_str(), int ret = avio_open(&m_formatCtx->pb, m_fileName.toUtf8().toStdString().c_str(), AVIO_FLAG_WRITE);
AVIO_FLAG_WRITE);
if (ret < 0) { if (ret < 0) {
char errorbuf[255] = { 0 }; char errorbuf[255] = { 0 };
av_strerror(ret, errorbuf, 254); av_strerror(ret, errorbuf, 254);
@ -164,12 +157,12 @@ bool Recorder::write(AVPacket *packet)
return av_write_frame(m_formatCtx, packet) >= 0; return av_write_frame(m_formatCtx, packet) >= 0;
} }
const AVOutputFormat *Recorder::findMuxer(const char* name) const AVOutputFormat *Recorder::findMuxer(const char *name)
{ {
#ifdef QTSCRCPY_LAVF_HAS_NEW_MUXER_ITERATOR_API #ifdef QTSCRCPY_LAVF_HAS_NEW_MUXER_ITERATOR_API
void* opaque = Q_NULLPTR; void *opaque = Q_NULLPTR;
#endif #endif
const AVOutputFormat* outFormat = Q_NULLPTR; const AVOutputFormat *outFormat = Q_NULLPTR;
do { do {
#ifdef QTSCRCPY_LAVF_HAS_NEW_MUXER_ITERATOR_API #ifdef QTSCRCPY_LAVF_HAS_NEW_MUXER_ITERATOR_API
outFormat = av_muxer_iterate(&opaque); outFormat = av_muxer_iterate(&opaque);
@ -181,10 +174,10 @@ const AVOutputFormat *Recorder::findMuxer(const char* name)
return outFormat; return outFormat;
} }
bool Recorder::recorderWriteHeader(const AVPacket* packet) bool Recorder::recorderWriteHeader(const AVPacket *packet)
{ {
AVStream *ostream = m_formatCtx->streams[0]; AVStream *ostream = m_formatCtx->streams[0];
quint8* extradata = (quint8*)av_malloc(packet->size * sizeof(quint8)); quint8 *extradata = (quint8 *)av_malloc(packet->size * sizeof(quint8));
if (!extradata) { if (!extradata) {
qCritical("Cannot allocate extradata"); qCritical("Cannot allocate extradata");
return false; return false;
@ -208,7 +201,7 @@ bool Recorder::recorderWriteHeader(const AVPacket* packet)
return true; return true;
} }
void Recorder::recorderRescalePacket(AVPacket* packet) void Recorder::recorderRescalePacket(AVPacket *packet)
{ {
AVStream *ostream = m_formatCtx->streams[0]; AVStream *ostream = m_formatCtx->streams[0];
av_packet_rescale_ts(packet, SCRCPY_TIME_BASE, ostream->time_base); av_packet_rescale_ts(packet, SCRCPY_TIME_BASE, ostream->time_base);
@ -217,9 +210,12 @@ void Recorder::recorderRescalePacket(AVPacket* packet)
QString Recorder::recorderGetFormatName(Recorder::RecorderFormat format) QString Recorder::recorderGetFormatName(Recorder::RecorderFormat format)
{ {
switch (format) { switch (format) {
case RECORDER_FORMAT_MP4: return "mp4"; case RECORDER_FORMAT_MP4:
case RECORDER_FORMAT_MKV: return "matroska"; return "mp4";
default: return ""; case RECORDER_FORMAT_MKV:
return "matroska";
default:
return "";
} }
} }
@ -240,7 +236,8 @@ Recorder::RecorderFormat Recorder::guessRecordFormat(const QString &fileName)
return Recorder::RECORDER_FORMAT_NULL; return Recorder::RECORDER_FORMAT_NULL;
} }
void Recorder::run() { void Recorder::run()
{
for (;;) { for (;;) {
AVPacket *rec = Q_NULLPTR; AVPacket *rec = Q_NULLPTR;
{ {
@ -252,7 +249,7 @@ void Recorder::run() {
// if stopped is set, continue to process the remaining events (to // if stopped is set, continue to process the remaining events (to
// finish the recording) before actually stopping // finish the recording) before actually stopping
if (m_stopped && m_queue.isEmpty()) { if (m_stopped && m_queue.isEmpty()) {
AVPacket* last = m_previous; AVPacket *last = m_previous;
if (last) { if (last) {
// assign an arbitrary duration to the last packet // assign an arbitrary duration to the last packet
last->duration = 100000; last->duration = 100000;
@ -272,7 +269,7 @@ void Recorder::run() {
} }
// recorder->previous is only written from this thread, no need to lock // recorder->previous is only written from this thread, no need to lock
AVPacket* previous = m_previous; AVPacket *previous = m_previous;
m_previous = rec; m_previous = rec;
if (!previous) { if (!previous) {
@ -281,8 +278,7 @@ void Recorder::run() {
} }
// config packets have no PTS, we must ignore them // config packets have no PTS, we must ignore them
if (rec->pts != AV_NOPTS_VALUE if (rec->pts != AV_NOPTS_VALUE && previous->pts != AV_NOPTS_VALUE) {
&& previous->pts != AV_NOPTS_VALUE) {
// we now know the duration of the previous packet // we now know the duration of the previous packet
previous->duration = rec->pts - previous->pts; previous->duration = rec->pts - previous->pts;
} }
@ -302,18 +298,21 @@ void Recorder::run() {
qDebug("Recorder thread ended"); qDebug("Recorder thread ended");
} }
bool Recorder::startRecorder() { bool Recorder::startRecorder()
{
start(); start();
return true; return true;
} }
void Recorder::stopRecorder() { void Recorder::stopRecorder()
{
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
m_stopped = true; m_stopped = true;
m_recvDataCond.wakeOne(); m_recvDataCond.wakeOne();
} }
bool Recorder::push(const AVPacket *packet) { bool Recorder::push(const AVPacket *packet)
{
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
Q_ASSERT(!m_stopped); Q_ASSERT(!m_stopped);
@ -322,7 +321,7 @@ bool Recorder::push(const AVPacket *packet) {
return false; return false;
} }
AVPacket* rec = packetNew(packet); AVPacket *rec = packetNew(packet);
if (rec) { if (rec) {
m_queue.enqueue(rec); m_queue.enqueue(rec);
m_recvDataCond.wakeOne(); m_recvDataCond.wakeOne();

View file

@ -1,11 +1,11 @@
#ifndef RECORDER_H #ifndef RECORDER_H
#define RECORDER_H #define RECORDER_H
#include <QString>
#include <QSize>
#include <QThread>
#include <QMutex> #include <QMutex>
#include <QWaitCondition>
#include <QQueue> #include <QQueue>
#include <QSize>
#include <QString>
#include <QThread>
#include <QWaitCondition>
extern "C" extern "C"
{ {
@ -16,34 +16,35 @@ class Recorder : public QThread
{ {
Q_OBJECT Q_OBJECT
public: public:
enum RecorderFormat { enum RecorderFormat
{
RECORDER_FORMAT_NULL = 0, RECORDER_FORMAT_NULL = 0,
RECORDER_FORMAT_MP4, RECORDER_FORMAT_MP4,
RECORDER_FORMAT_MKV, RECORDER_FORMAT_MKV,
}; };
Recorder(const QString& fileName, QObject *parent = Q_NULLPTR); Recorder(const QString &fileName, QObject *parent = Q_NULLPTR);
virtual ~Recorder(); virtual ~Recorder();
void setFrameSize(const QSize& declaredFrameSize); void setFrameSize(const QSize &declaredFrameSize);
void setFormat(Recorder::RecorderFormat format); void setFormat(Recorder::RecorderFormat format);
bool open(const AVCodec* inputCodec); bool open(const AVCodec *inputCodec);
void close(); void close();
bool write(AVPacket* packet); bool write(AVPacket *packet);
bool startRecorder(); bool startRecorder();
void stopRecorder(); void stopRecorder();
bool push(const AVPacket *packet); bool push(const AVPacket *packet);
private: private:
const AVOutputFormat* findMuxer(const char* name); const AVOutputFormat *findMuxer(const char *name);
bool recorderWriteHeader(const AVPacket* packet); bool recorderWriteHeader(const AVPacket *packet);
void recorderRescalePacket(AVPacket *packet); void recorderRescalePacket(AVPacket *packet);
QString recorderGetFormatName(Recorder::RecorderFormat format); QString recorderGetFormatName(Recorder::RecorderFormat format);
RecorderFormat guessRecordFormat(const QString& fileName); RecorderFormat guessRecordFormat(const QString &fileName);
private: private:
AVPacket* packetNew(const AVPacket *packet); AVPacket *packetNew(const AVPacket *packet);
void packetDelete(AVPacket* packet); void packetDelete(AVPacket *packet);
void queueClear(); void queueClear();
protected: protected:
@ -51,20 +52,20 @@ protected:
private: private:
QString m_fileName = ""; QString m_fileName = "";
AVFormatContext* m_formatCtx = Q_NULLPTR; AVFormatContext *m_formatCtx = Q_NULLPTR;
QSize m_declaredFrameSize; QSize m_declaredFrameSize;
bool m_headerWritten = false; bool m_headerWritten = false;
RecorderFormat m_format = RECORDER_FORMAT_NULL; RecorderFormat m_format = RECORDER_FORMAT_NULL;
QMutex m_mutex; QMutex m_mutex;
QWaitCondition m_recvDataCond; QWaitCondition m_recvDataCond;
bool m_stopped = false; // set on recorder_stop() by the stream reader bool m_stopped = false; // set on recorder_stop() by the stream reader
bool m_failed = false; // set on packet write failure bool m_failed = false; // set on packet write failure
QQueue<AVPacket*> m_queue; QQueue<AVPacket *> m_queue;
// we can write a packet only once we received the next one so that we can // we can write a packet only once we received the next one so that we can
// set its duration (next_pts - current_pts) // set its duration (next_pts - current_pts)
// "previous" is only accessed from the recorder thread, so it does not // "previous" is only accessed from the recorder thread, so it does not
// need to be protected by the mutex // need to be protected by the mutex
AVPacket* m_previous = Q_NULLPTR; AVPacket *m_previous = Q_NULLPTR;
}; };
#endif // RECORDER_H #endif // RECORDER_H

View file

@ -14,18 +14,30 @@ static const GLfloat coordinate[] = {
// GL_TRIANGLE_STRIP的绘制方式 // GL_TRIANGLE_STRIP的绘制方式
// 使用前3个坐标绘制一个三角形使用后三个坐标绘制一个三角形正好为一个矩形 // 使用前3个坐标绘制一个三角形使用后三个坐标绘制一个三角形正好为一个矩形
// x y z // x y z
-1.0f, -1.0f, 0.0f, -1.0f,
1.0f, -1.0f, 0.0f, -1.0f,
-1.0f, 1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f, 1.0f,
-1.0f,
0.0f,
-1.0f,
1.0f,
0.0f,
1.0f,
1.0f,
0.0f,
// 纹理坐标存储4个xy坐标 // 纹理坐标存储4个xy坐标
// 坐标范围为[0,1],左下角为 0,0 // 坐标范围为[0,1],左下角为 0,0
// TODO 为什么这个顺序指定四个顶点?顶点坐标和纹理坐标如何映射的? // TODO 为什么这个顺序指定四个顶点?顶点坐标和纹理坐标如何映射的?
0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f,
1.0f, 0.0f 1.0f,
0.0f,
0.0f,
1.0f,
0.0f
}; };
// 顶点着色器 // 顶点着色器
@ -107,7 +119,7 @@ void QYUVOpenGLWidget::setFrameSize(const QSize &frameSize)
} }
} }
const QSize& QYUVOpenGLWidget::frameSize() const QSize &QYUVOpenGLWidget::frameSize()
{ {
return m_frameSize; return m_frameSize;
} }
@ -133,13 +145,13 @@ void QYUVOpenGLWidget::initializeGL()
m_vbo.allocate(coordinate, sizeof(coordinate)); m_vbo.allocate(coordinate, sizeof(coordinate));
initShader(); initShader();
// 设置背景清理色为黑色 // 设置背景清理色为黑色
glClearColor(0.0,0.0,0.0,0.0); glClearColor(0.0, 0.0, 0.0, 0.0);
// 清理颜色背景 // 清理颜色背景
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
} }
void QYUVOpenGLWidget::paintGL() void QYUVOpenGLWidget::paintGL()
{ {
if (m_needUpdate) { if (m_needUpdate) {
deInitTextures(); deInitTextures();
initTextures(); initTextures();
@ -198,7 +210,7 @@ void QYUVOpenGLWidget::initShader()
} }
void QYUVOpenGLWidget::initTextures() void QYUVOpenGLWidget::initTextures()
{ {
// 创建纹理 // 创建纹理
glGenTextures(1, &m_texture[0]); glGenTextures(1, &m_texture[0]);
glBindTexture(GL_TEXTURE_2D, m_texture[0]); glBindTexture(GL_TEXTURE_2D, m_texture[0]);
@ -216,7 +228,7 @@ void QYUVOpenGLWidget::initTextures()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, m_frameSize.width()/2, m_frameSize.height()/2, 0, GL_RED, GL_UNSIGNED_BYTE, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, m_frameSize.width() / 2, m_frameSize.height() / 2, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
glGenTextures(1, &m_texture[2]); glGenTextures(1, &m_texture[2]);
glBindTexture(GL_TEXTURE_2D, m_texture[2]); glBindTexture(GL_TEXTURE_2D, m_texture[2]);
@ -226,7 +238,7 @@ void QYUVOpenGLWidget::initTextures()
// 设置st方向上纹理超出坐标时的显示策略 // 设置st方向上纹理超出坐标时的显示策略
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, m_frameSize.width()/2, m_frameSize.height()/2, 0, GL_RED, GL_UNSIGNED_BYTE, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, m_frameSize.width() / 2, m_frameSize.height() / 2, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
m_textureInited = true; m_textureInited = true;
} }
@ -246,7 +258,7 @@ void QYUVOpenGLWidget::updateTexture(GLuint texture, quint32 textureType, quint8
if (!pixels) if (!pixels)
return; return;
QSize size = 0 == textureType ? m_frameSize : m_frameSize/2; QSize size = 0 == textureType ? m_frameSize : m_frameSize / 2;
makeCurrent(); makeCurrent();
glBindTexture(GL_TEXTURE_2D, texture); glBindTexture(GL_TEXTURE_2D, texture);

View file

@ -1,11 +1,13 @@
#ifndef QYUVOPENGLWIDGET_H #ifndef QYUVOPENGLWIDGET_H
#define QYUVOPENGLWIDGET_H #define QYUVOPENGLWIDGET_H
#include <QOpenGLWidget> #include <QOpenGLBuffer>
#include <QOpenGLFunctions> #include <QOpenGLFunctions>
#include <QOpenGLShaderProgram> #include <QOpenGLShaderProgram>
#include <QOpenGLBuffer> #include <QOpenGLWidget>
class QYUVOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions class QYUVOpenGLWidget
: public QOpenGLWidget
, protected QOpenGLFunctions
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -15,24 +17,24 @@ public:
QSize minimumSizeHint() const override; QSize minimumSizeHint() const override;
QSize sizeHint() const override; QSize sizeHint() const override;
void setFrameSize(const QSize& frameSize); void setFrameSize(const QSize &frameSize);
const QSize& frameSize(); const QSize &frameSize();
void updateTextures(quint8* dataY, quint8* dataU, quint8* dataV, quint32 linesizeY, quint32 linesizeU, quint32 linesizeV); void updateTextures(quint8 *dataY, quint8 *dataU, quint8 *dataV, quint32 linesizeY, quint32 linesizeU, quint32 linesizeV);
protected: protected:
void initializeGL(); void initializeGL();
void paintGL(); void paintGL();
void resizeGL(int width, int height); void resizeGL(int width, int height);
private: private:
void initShader(); void initShader();
void initTextures(); void initTextures();
void deInitTextures(); void deInitTextures();
void updateTexture(GLuint texture, quint32 textureType, quint8* pixels, quint32 stride); void updateTexture(GLuint texture, quint32 textureType, quint8 *pixels, quint32 stride);
private: private:
// 视频帧尺寸 // 视频帧尺寸
QSize m_frameSize = {-1, -1}; QSize m_frameSize = { -1, -1 };
bool m_needUpdate = false; bool m_needUpdate = false;
bool m_textureInited = false; bool m_textureInited = false;
@ -40,10 +42,10 @@ private:
QOpenGLBuffer m_vbo; QOpenGLBuffer m_vbo;
// 着色器程序:编译链接着色器 // 着色器程序:编译链接着色器
QOpenGLShaderProgram m_shaderProgram; QOpenGLShaderProgram m_shaderProgram;
// YUV纹理用于生成纹理贴图 // YUV纹理用于生成纹理贴图
GLuint m_texture[3] = {0}; GLuint m_texture[3] = { 0 };
}; };
#endif // QYUVOPENGLWIDGET_H #endif // QYUVOPENGLWIDGET_H

View file

@ -1,12 +1,12 @@
#include <QDebug>
#include <QTimer>
#include <QThread>
#include <QTimerEvent>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug>
#include <QFileInfo> #include <QFileInfo>
#include <QThread>
#include <QTimer>
#include <QTimerEvent>
#include "server.h"
#include "config.h" #include "config.h"
#include "server.h"
#define DEVICE_NAME_FIELD_LENGTH 64 #define DEVICE_NAME_FIELD_LENGTH 64
#define SOCKET_NAME "scrcpy" #define SOCKET_NAME "scrcpy"
@ -18,10 +18,10 @@ Server::Server(QObject *parent) : QObject(parent)
connect(&m_workProcess, &AdbProcess::adbProcessResult, this, &Server::onWorkProcessResult); connect(&m_workProcess, &AdbProcess::adbProcessResult, this, &Server::onWorkProcessResult);
connect(&m_serverProcess, &AdbProcess::adbProcessResult, this, &Server::onWorkProcessResult); connect(&m_serverProcess, &AdbProcess::adbProcessResult, this, &Server::onWorkProcessResult);
connect(&m_serverSocket, &QTcpServer::newConnection, this, [this](){ connect(&m_serverSocket, &QTcpServer::newConnection, this, [this]() {
QTcpSocket* tmp = m_serverSocket.nextPendingConnection(); QTcpSocket *tmp = m_serverSocket.nextPendingConnection();
if (dynamic_cast<VideoSocket*>(tmp)) { if (dynamic_cast<VideoSocket *>(tmp)) {
m_videoSocket = dynamic_cast<VideoSocket*>(tmp); m_videoSocket = dynamic_cast<VideoSocket *>(tmp);
if (!m_videoSocket->isValid() || !readInfo(m_videoSocket, m_deviceName, m_deviceSize)) { if (!m_videoSocket->isValid() || !readInfo(m_videoSocket, m_deviceName, m_deviceSize)) {
stop(); stop();
emit connectToResult(false); emit connectToResult(false);
@ -45,12 +45,9 @@ Server::Server(QObject *parent) : QObject(parent)
}); });
} }
Server:: ~Server() Server::~Server() {}
{
} const QString &Server::getServerPath()
const QString& Server::getServerPath()
{ {
if (m_serverPath.isEmpty()) { if (m_serverPath.isEmpty()) {
m_serverPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_SERVER_PATH")); m_serverPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_SERVER_PATH"));
@ -63,7 +60,7 @@ const QString& Server::getServerPath()
} }
bool Server::pushServer() bool Server::pushServer()
{ {
if (m_workProcess.isRuning()) { if (m_workProcess.isRuning()) {
m_workProcess.kill(); m_workProcess.kill();
} }
@ -82,11 +79,11 @@ bool Server::enableTunnelReverse()
bool Server::disableTunnelReverse() bool Server::disableTunnelReverse()
{ {
AdbProcess* adb = new AdbProcess(); AdbProcess *adb = new AdbProcess();
if (!adb) { if (!adb) {
return false; return false;
} }
connect(adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult){ connect(adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) {
if (AdbProcess::AER_SUCCESS_START != processResult) { if (AdbProcess::AER_SUCCESS_START != processResult) {
sender()->deleteLater(); sender()->deleteLater();
} }
@ -105,11 +102,11 @@ bool Server::enableTunnelForward()
} }
bool Server::disableTunnelForward() bool Server::disableTunnelForward()
{ {
AdbProcess* adb = new AdbProcess(); AdbProcess *adb = new AdbProcess();
if (!adb) { if (!adb) {
return false; return false;
} }
connect(adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult){ connect(adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) {
if (AdbProcess::AER_SUCCESS_START != processResult) { if (AdbProcess::AER_SUCCESS_START != processResult) {
sender()->deleteLater(); sender()->deleteLater();
} }
@ -150,7 +147,7 @@ bool Server::execute()
} }
bool Server::start(Server::ServerParams params) bool Server::start(Server::ServerParams params)
{ {
m_params = params; m_params = params;
m_serverStartStep = SSS_PUSH; m_serverStartStep = SSS_PUSH;
return startServerByStep(); return startServerByStep();
@ -161,7 +158,7 @@ bool Server::connectTo()
if (SSS_RUNNING != m_serverStartStep) { if (SSS_RUNNING != m_serverStartStep) {
qWarning("server not run"); qWarning("server not run");
return false; return false;
} }
if (!m_tunnelForward && !m_videoSocket) { if (!m_tunnelForward && !m_videoSocket) {
startAcceptTimeoutTimer(); startAcceptTimeoutTimer();
@ -192,8 +189,8 @@ void Server::timerEvent(QTimerEvent *event)
} }
} }
VideoSocket* Server::getVideoSocket() VideoSocket *Server::getVideoSocket()
{ {
return m_videoSocket; return m_videoSocket;
} }
@ -228,8 +225,8 @@ void Server::stop()
} }
m_tunnelForward = false; m_tunnelForward = false;
m_tunnelEnabled = false; m_tunnelEnabled = false;
} }
m_serverSocket.close(); m_serverSocket.close();
} }
bool Server::startServerByStep() bool Server::startServerByStep()
@ -283,14 +280,14 @@ bool Server::startServerByStep()
return stepSuccess; return stepSuccess;
} }
bool Server::readInfo(VideoSocket* videoSocket, QString &deviceName, QSize &size) bool Server::readInfo(VideoSocket *videoSocket, QString &deviceName, QSize &size)
{ {
unsigned char buf[DEVICE_NAME_FIELD_LENGTH + 4]; unsigned char buf[DEVICE_NAME_FIELD_LENGTH + 4];
if (videoSocket->bytesAvailable() <= (DEVICE_NAME_FIELD_LENGTH + 4)) { if (videoSocket->bytesAvailable() <= (DEVICE_NAME_FIELD_LENGTH + 4)) {
videoSocket->waitForReadyRead(300); videoSocket->waitForReadyRead(300);
} }
qint64 len = videoSocket->read((char*)buf, sizeof(buf)); qint64 len = videoSocket->read((char *)buf, sizeof(buf));
if (len < DEVICE_NAME_FIELD_LENGTH + 4) { if (len < DEVICE_NAME_FIELD_LENGTH + 4) {
qInfo("Could not retrieve device information"); qInfo("Could not retrieve device information");
return false; return false;
@ -298,7 +295,7 @@ bool Server::readInfo(VideoSocket* videoSocket, QString &deviceName, QSize &size
buf[DEVICE_NAME_FIELD_LENGTH - 1] = '\0'; // in case the client sends garbage buf[DEVICE_NAME_FIELD_LENGTH - 1] = '\0'; // in case the client sends garbage
// strcpy is safe here, since name contains at least DEVICE_NAME_FIELD_LENGTH bytes // strcpy is safe here, since name contains at least DEVICE_NAME_FIELD_LENGTH bytes
// and strlen(buf) < DEVICE_NAME_FIELD_LENGTH // and strlen(buf) < DEVICE_NAME_FIELD_LENGTH
deviceName = (char*)buf; deviceName = (char *)buf;
size.setWidth((buf[DEVICE_NAME_FIELD_LENGTH] << 8) | buf[DEVICE_NAME_FIELD_LENGTH + 1]); size.setWidth((buf[DEVICE_NAME_FIELD_LENGTH] << 8) | buf[DEVICE_NAME_FIELD_LENGTH + 1]);
size.setHeight((buf[DEVICE_NAME_FIELD_LENGTH + 2] << 8) | buf[DEVICE_NAME_FIELD_LENGTH + 3]); size.setHeight((buf[DEVICE_NAME_FIELD_LENGTH + 2] << 8) | buf[DEVICE_NAME_FIELD_LENGTH + 3]);
return true; return true;
@ -342,7 +339,7 @@ void Server::onConnectTimer()
QSize deviceSize; QSize deviceSize;
bool success = false; bool success = false;
VideoSocket* videoSocket = new VideoSocket(); VideoSocket *videoSocket = new VideoSocket();
QTcpSocket *controlSocket = new QTcpSocket(); QTcpSocket *controlSocket = new QTcpSocket();
videoSocket->connectToHost(QHostAddress::LocalHost, m_params.localPort); videoSocket->connectToHost(QHostAddress::LocalHost, m_params.localPort);
@ -427,7 +424,7 @@ void Server::onWorkProcessResult(AdbProcess::ADB_EXEC_RESULT processResult)
m_serverStartStep = SSS_ENABLE_TUNNEL_FORWARD; m_serverStartStep = SSS_ENABLE_TUNNEL_FORWARD;
} }
startServerByStep(); startServerByStep();
} else if (AdbProcess::AER_SUCCESS_START != processResult){ } else if (AdbProcess::AER_SUCCESS_START != processResult) {
qCritical("adb push failed"); qCritical("adb push failed");
m_serverStartStep = SSS_NULL; m_serverStartStep = SSS_NULL;
emit serverStartResult(false); emit serverStartResult(false);
@ -437,7 +434,7 @@ void Server::onWorkProcessResult(AdbProcess::ADB_EXEC_RESULT processResult)
if (AdbProcess::AER_SUCCESS_EXEC == processResult) { if (AdbProcess::AER_SUCCESS_EXEC == processResult) {
m_serverStartStep = SSS_EXECUTE_SERVER; m_serverStartStep = SSS_EXECUTE_SERVER;
startServerByStep(); startServerByStep();
} else if (AdbProcess::AER_SUCCESS_START != processResult){ } else if (AdbProcess::AER_SUCCESS_START != processResult) {
// 有一些设备reverse会报错more than o'ne deviceadb的bug // 有一些设备reverse会报错more than o'ne deviceadb的bug
// https://github.com/Genymobile/scrcpy/issues/5 // https://github.com/Genymobile/scrcpy/issues/5
qCritical("adb reverse failed"); qCritical("adb reverse failed");
@ -450,7 +447,7 @@ void Server::onWorkProcessResult(AdbProcess::ADB_EXEC_RESULT processResult)
if (AdbProcess::AER_SUCCESS_EXEC == processResult) { if (AdbProcess::AER_SUCCESS_EXEC == processResult) {
m_serverStartStep = SSS_EXECUTE_SERVER; m_serverStartStep = SSS_EXECUTE_SERVER;
startServerByStep(); startServerByStep();
} else if (AdbProcess::AER_SUCCESS_START != processResult){ } else if (AdbProcess::AER_SUCCESS_START != processResult) {
qCritical("adb forward failed"); qCritical("adb forward failed");
m_serverStartStep = SSS_NULL; m_serverStartStep = SSS_NULL;
emit serverStartResult(false); emit serverStartResult(false);
@ -467,7 +464,7 @@ void Server::onWorkProcessResult(AdbProcess::ADB_EXEC_RESULT processResult)
m_serverStartStep = SSS_RUNNING; m_serverStartStep = SSS_RUNNING;
m_tunnelEnabled = true; m_tunnelEnabled = true;
emit serverStartResult(true); emit serverStartResult(true);
} else if (AdbProcess::AER_ERROR_START == processResult){ } else if (AdbProcess::AER_ERROR_START == processResult) {
if (!m_tunnelForward) { if (!m_tunnelForward) {
m_serverSocket.close(); m_serverSocket.close();
disableTunnelReverse(); disableTunnelReverse();

View file

@ -5,15 +5,16 @@
#include <QPointer> #include <QPointer>
#include <QSize> #include <QSize>
#include "adbprocess.h"
#include "tcpserver.h" #include "tcpserver.h"
#include "videosocket.h" #include "videosocket.h"
#include "adbprocess.h"
class Server : public QObject class Server : public QObject
{ {
Q_OBJECT Q_OBJECT
enum SERVER_START_STEP { enum SERVER_START_STEP
{
SSS_NULL, SSS_NULL,
SSS_PUSH, SSS_PUSH,
SSS_ENABLE_TUNNEL_REVERSE, SSS_ENABLE_TUNNEL_REVERSE,
@ -21,16 +22,18 @@ class Server : public QObject
SSS_EXECUTE_SERVER, SSS_EXECUTE_SERVER,
SSS_RUNNING, SSS_RUNNING,
}; };
public: public:
struct ServerParams { struct ServerParams
QString serial = ""; // 设备序列号 {
quint16 localPort = 27183; // reverse时本地监听端口 QString serial = ""; // 设备序列号
quint16 maxSize = 720; // 视频分辨率 quint16 localPort = 27183; // reverse时本地监听端口
quint32 bitRate = 8000000; // 视频比特率 quint16 maxSize = 720; // 视频分辨率
quint32 maxFps = 60; // 视频最大帧率 quint32 bitRate = 8000000; // 视频比特率
QString crop = "-"; // 视频裁剪 quint32 maxFps = 60; // 视频最大帧率
bool control = true; // 安卓端是否接收键鼠控制 QString crop = "-"; // 视频裁剪
bool useReverse = true; // true:先使用adb reverse失败后自动使用adb forwardfalse:直接使用adb forward bool control = true; // 安卓端是否接收键鼠控制
bool useReverse = true; // true:先使用adb reverse失败后自动使用adb forwardfalse:直接使用adb forward
}; };
explicit Server(QObject *parent = nullptr); explicit Server(QObject *parent = nullptr);
@ -41,8 +44,8 @@ public:
bool isReverse(); bool isReverse();
Server::ServerParams getParams(); Server::ServerParams getParams();
VideoSocket* getVideoSocket(); VideoSocket *getVideoSocket();
QTcpSocket* getControlSocket(); QTcpSocket *getControlSocket();
void stop(); void stop();
@ -58,15 +61,15 @@ protected:
void timerEvent(QTimerEvent *event); void timerEvent(QTimerEvent *event);
private: private:
const QString& getServerPath(); const QString &getServerPath();
bool pushServer(); bool pushServer();
bool enableTunnelReverse(); bool enableTunnelReverse();
bool disableTunnelReverse(); bool disableTunnelReverse();
bool enableTunnelForward(); bool enableTunnelForward();
bool disableTunnelForward(); bool disableTunnelForward();
bool execute(); bool execute();
bool startServerByStep(); bool startServerByStep();
bool readInfo(VideoSocket* videoSocket, QString& deviceName, QSize& size); bool readInfo(VideoSocket *videoSocket, QString &deviceName, QSize &size);
void startAcceptTimeoutTimer(); void startAcceptTimeoutTimer();
void stopAcceptTimeoutTimer(); void stopAcceptTimeoutTimer();
void startConnectTimeoutTimer(); void startConnectTimeoutTimer();

View file

@ -1,15 +1,9 @@
#include "tcpserver.h" #include "tcpserver.h"
#include "videosocket.h" #include "videosocket.h"
TcpServer::TcpServer(QObject *parent) : QTcpServer(parent) TcpServer::TcpServer(QObject *parent) : QTcpServer(parent) {}
{
} TcpServer::~TcpServer() {}
TcpServer::~TcpServer()
{
}
void TcpServer::incomingConnection(qintptr handle) void TcpServer::incomingConnection(qintptr handle)
{ {

View file

@ -1,6 +1,6 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QThread>
#include <QDebug> #include <QDebug>
#include <QThread>
#include "qscrcpyevent.h" #include "qscrcpyevent.h"
#include "videosocket.h" #include "videosocket.h"
@ -31,7 +31,7 @@ qint32 VideoSocket::subThreadRecvData(quint8 *buf, qint32 bufSize)
m_dataSize = 0; m_dataSize = 0;
// post event // post event
VideoSocketEvent* getDataEvent = new VideoSocketEvent(); VideoSocketEvent *getDataEvent = new VideoSocketEvent();
QCoreApplication::postEvent(this, getDataEvent); QCoreApplication::postEvent(this, getDataEvent);
// wait // wait
@ -58,7 +58,7 @@ void VideoSocket::onReadyRead()
if (m_buffer && m_bufferSize <= bytesAvailable()) { if (m_buffer && m_bufferSize <= bytesAvailable()) {
// recv data // recv data
qint64 readSize = qMin(bytesAvailable(), (qint64)m_bufferSize); qint64 readSize = qMin(bytesAvailable(), (qint64)m_bufferSize);
m_dataSize = read((char*)m_buffer, readSize); m_dataSize = read((char *)m_buffer, readSize);
m_buffer = Q_NULLPTR; m_buffer = Q_NULLPTR;
m_bufferSize = 0; m_bufferSize = 0;

View file

@ -2,8 +2,8 @@
#define VIDEOSOCKET_H #define VIDEOSOCKET_H
#include <QEvent> #include <QEvent>
#include <QTcpSocket>
#include <QMutex> #include <QMutex>
#include <QTcpSocket>
#include <QWaitCondition> #include <QWaitCondition>
class VideoSocket : public QTcpSocket class VideoSocket : public QTcpSocket
@ -13,7 +13,7 @@ public:
explicit VideoSocket(QObject *parent = nullptr); explicit VideoSocket(QObject *parent = nullptr);
virtual ~VideoSocket(); virtual ~VideoSocket();
qint32 subThreadRecvData(quint8* buf, qint32 bufSize); qint32 subThreadRecvData(quint8 *buf, qint32 bufSize);
protected: protected:
bool event(QEvent *event); bool event(QEvent *event);
@ -26,7 +26,7 @@ private:
QMutex m_mutex; QMutex m_mutex;
QWaitCondition m_recvDataCond; QWaitCondition m_recvDataCond;
bool m_recvData = false; bool m_recvData = false;
quint8* m_buffer = Q_NULLPTR; quint8 *m_buffer = Q_NULLPTR;
qint32 m_bufferSize = 0; qint32 m_bufferSize = 0;
qint32 m_dataSize = 0; qint32 m_dataSize = 0;
bool m_quit = false; bool m_quit = false;

View file

@ -2,27 +2,23 @@
#include <QTime> #include <QTime>
#include "compat.h" #include "compat.h"
#include "stream.h"
#include "decoder.h" #include "decoder.h"
#include "videosocket.h"
#include "recorder.h" #include "recorder.h"
#include "stream.h"
#include "videosocket.h"
#define BUFSIZE 0x10000 #define BUFSIZE 0x10000
#define HEADER_SIZE 12 #define HEADER_SIZE 12
#define NO_PTS UINT64_C(-1) #define NO_PTS UINT64_C(-1)
typedef qint32 (*ReadPacketFunc)(void*, quint8*, qint32); typedef qint32 (*ReadPacketFunc)(void *, quint8 *, qint32);
Stream::Stream(QObject *parent) Stream::Stream(QObject *parent) : QThread(parent) {}
: QThread(parent)
Stream::~Stream() {}
static void avLogCallback(void *avcl, int level, const char *fmt, va_list vl)
{ {
}
Stream::~Stream()
{
}
static void avLogCallback(void *avcl, int level, const char *fmt, va_list vl) {
Q_UNUSED(avcl) Q_UNUSED(avcl)
Q_UNUSED(vl) Q_UNUSED(vl)
@ -68,22 +64,24 @@ void Stream::deInit()
avformat_network_deinit(); // ignore failure avformat_network_deinit(); // ignore failure
} }
void Stream::setDecoder(Decoder* decoder) void Stream::setDecoder(Decoder *decoder)
{ {
m_decoder = decoder; m_decoder = decoder;
} }
static quint32 bufferRead32be(quint8* buf) { static quint32 bufferRead32be(quint8 *buf)
{
return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
} }
static quint64 bufferRead64be(quint8* buf) { static quint64 bufferRead64be(quint8 *buf)
{
quint32 msb = bufferRead32be(buf); quint32 msb = bufferRead32be(buf);
quint32 lsb = bufferRead32be(&buf[4]); quint32 lsb = bufferRead32be(&buf[4]);
return ((quint64) msb << 32) | lsb; return ((quint64)msb << 32) | lsb;
} }
void Stream::setVideoSocket(VideoSocket* videoSocket) void Stream::setVideoSocket(VideoSocket *videoSocket)
{ {
m_videoSocket = videoSocket; m_videoSocket = videoSocket;
} }
@ -93,7 +91,7 @@ void Stream::setRecoder(Recorder *recorder)
m_recorder = recorder; m_recorder = recorder;
} }
qint32 Stream::recvData(quint8* buf, qint32 bufSize) qint32 Stream::recvData(quint8 *buf, qint32 bufSize)
{ {
if (!buf) { if (!buf) {
return 0; return 0;
@ -149,16 +147,16 @@ void Stream::run()
if (m_recorder) { if (m_recorder) {
if (!m_recorder->open(codec)) { if (!m_recorder->open(codec)) {
qCritical("Could not open recorder"); qCritical("Could not open recorder");
goto runQuit; goto runQuit;
}
if (!m_recorder->startRecorder()) {
qCritical("Could not start recorder");
goto runQuit;
}
} }
if (!m_recorder->startRecorder()) {
qCritical("Could not start recorder");
goto runQuit;
}
}
m_parser = av_parser_init(AV_CODEC_ID_H264); m_parser = av_parser_init(AV_CODEC_ID_H264);
if (!m_parser) { if (!m_parser) {
qCritical("Could not initialize parser"); qCritical("Could not initialize parser");
@ -242,12 +240,12 @@ bool Stream::recvPacket(AVPacket *packet)
} }
r = recvData(packet->data, len); r = recvData(packet->data, len);
if (r < 0 || ((uint32_t) r) < len) { if (r < 0 || ((uint32_t)r) < len) {
av_packet_unref(packet); av_packet_unref(packet);
return false; return false;
} }
packet->pts = pts != NO_PTS ? (int64_t) pts : AV_NOPTS_VALUE; packet->pts = pts != NO_PTS ? (int64_t)pts : AV_NOPTS_VALUE;
return true; return true;
} }
@ -324,13 +322,11 @@ bool Stream::parse(AVPacket *packet)
int inLen = packet->size; int inLen = packet->size;
quint8 *outData = Q_NULLPTR; quint8 *outData = Q_NULLPTR;
int outLen = 0; int outLen = 0;
int r = av_parser_parse2(m_parser, m_codecCtx, int r = av_parser_parse2(m_parser, m_codecCtx, &outData, &outLen, inData, inLen, AV_NOPTS_VALUE, AV_NOPTS_VALUE, -1);
&outData, &outLen, inData, inLen,
AV_NOPTS_VALUE, AV_NOPTS_VALUE, -1);
// PARSER_FLAG_COMPLETE_FRAMES is set // PARSER_FLAG_COMPLETE_FRAMES is set
Q_ASSERT(r == inLen); Q_ASSERT(r == inLen);
(void) r; (void)r;
Q_ASSERT(outLen == inLen); Q_ASSERT(outLen == inLen);
if (m_parser->key_frame == 1) { if (m_parser->key_frame == 1) {

View file

@ -1,8 +1,8 @@
#ifndef STREAM_H #ifndef STREAM_H
#define STREAM_H #define STREAM_H
#include <QThread>
#include <QPointer> #include <QPointer>
#include <QThread>
extern "C" extern "C"
{ {
@ -24,10 +24,10 @@ public:
static bool init(); static bool init();
static void deInit(); static void deInit();
void setDecoder(Decoder* decoder); void setDecoder(Decoder *decoder);
void setRecoder(Recorder* recorder); void setRecoder(Recorder *recorder);
void setVideoSocket(VideoSocket* deviceSocket); void setVideoSocket(VideoSocket *deviceSocket);
qint32 recvData(quint8* buf, qint32 bufSize); qint32 recvData(quint8 *buf, qint32 bufSize);
bool startDecode(); bool startDecode();
void stopDecode(); void stopDecode();
@ -36,8 +36,8 @@ signals:
protected: protected:
void run(); void run();
bool recvPacket(AVPacket* packet); bool recvPacket(AVPacket *packet);
bool pushPacket(AVPacket* packet); bool pushPacket(AVPacket *packet);
bool processConfigPacket(AVPacket *packet); bool processConfigPacket(AVPacket *packet);
bool parse(AVPacket *packet); bool parse(AVPacket *packet);
bool processFrame(AVPacket *packet); bool processFrame(AVPacket *packet);
@ -45,10 +45,10 @@ protected:
private: private:
QPointer<VideoSocket> m_videoSocket; QPointer<VideoSocket> m_videoSocket;
// for recorder // for recorder
Recorder* m_recorder = Q_NULLPTR; Recorder *m_recorder = Q_NULLPTR;
Decoder* m_decoder = Q_NULLPTR; Decoder *m_decoder = Q_NULLPTR;
AVCodecContext* m_codecCtx = Q_NULLPTR; AVCodecContext *m_codecCtx = Q_NULLPTR;
AVCodecParserContext *m_parser = Q_NULLPTR; AVCodecParserContext *m_parser = Q_NULLPTR;
// successive packets may need to be concatenated, until a non-config // successive packets may need to be concatenated, until a non-config
// packet is available // packet is available

View file

@ -1,16 +1,14 @@
#include <QMouseEvent>
#include <QDebug> #include <QDebug>
#include <QShowEvent>
#include <QHideEvent> #include <QHideEvent>
#include <QMouseEvent>
#include <QShowEvent>
#include "device.h"
#include "iconhelper.h"
#include "toolform.h" #include "toolform.h"
#include "ui_toolform.h" #include "ui_toolform.h"
#include "iconhelper.h"
#include "device.h"
ToolForm::ToolForm(QWidget* adsorbWidget, AdsorbPositions adsorbPos) ToolForm::ToolForm(QWidget *adsorbWidget, AdsorbPositions adsorbPos) : MagneticWidget(adsorbWidget, adsorbPos), ui(new Ui::ToolForm)
: MagneticWidget(adsorbWidget, adsorbPos)
, ui(new Ui::ToolForm)
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint); setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
@ -40,7 +38,7 @@ void ToolForm::initStyle()
IconHelper::Instance()->SetIcon(ui->homeBtn, QChar(0xf1db), 15); IconHelper::Instance()->SetIcon(ui->homeBtn, QChar(0xf1db), 15);
//IconHelper::Instance()->SetIcon(ui->returnBtn, QChar(0xf104), 15); //IconHelper::Instance()->SetIcon(ui->returnBtn, QChar(0xf104), 15);
IconHelper::Instance()->SetIcon(ui->returnBtn, QChar(0xf053), 15); IconHelper::Instance()->SetIcon(ui->returnBtn, QChar(0xf053), 15);
IconHelper::Instance()->SetIcon(ui->appSwitchBtn, QChar(0xf24d), 15); IconHelper::Instance()->SetIcon(ui->appSwitchBtn, QChar(0xf24d), 15);
IconHelper::Instance()->SetIcon(ui->volumeUpBtn, QChar(0xf028), 15); IconHelper::Instance()->SetIcon(ui->volumeUpBtn, QChar(0xf028), 15);
IconHelper::Instance()->SetIcon(ui->volumeDownBtn, QChar(0xf027), 15); IconHelper::Instance()->SetIcon(ui->volumeDownBtn, QChar(0xf027), 15);
IconHelper::Instance()->SetIcon(ui->closeScreenBtn, QChar(0xf070), 15); IconHelper::Instance()->SetIcon(ui->closeScreenBtn, QChar(0xf070), 15);
@ -132,7 +130,7 @@ void ToolForm::on_menuBtn_clicked()
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postGoMenu(); emit m_device->postGoMenu();
} }
void ToolForm::on_appSwitchBtn_clicked() void ToolForm::on_appSwitchBtn_clicked()

View file

@ -1,14 +1,15 @@
#ifndef TOOLFORM_H #ifndef TOOLFORM_H
#define TOOLFORM_H #define TOOLFORM_H
#include <QWidget>
#include <QPointer> #include <QPointer>
#include <QWidget>
#include "magneticwidget.h"
#include "device.h" #include "device.h"
#include "magneticwidget.h"
namespace Ui { namespace Ui
class ToolForm; {
class ToolForm;
} }
class Device; class Device;
@ -17,7 +18,7 @@ class ToolForm : public MagneticWidget
Q_OBJECT Q_OBJECT
public: public:
explicit ToolForm(QWidget* adsorbWidget, AdsorbPositions adsorbPos); explicit ToolForm(QWidget *adsorbWidget, AdsorbPositions adsorbPos);
~ToolForm(); ~ToolForm();
void setDevice(Device *device); void setDevice(Device *device);
@ -45,7 +46,7 @@ private slots:
void on_touchBtn_clicked(); void on_touchBtn_clicked();
void on_groupControlBtn_clicked(); void on_groupControlBtn_clicked();
void onControlStateChange(Device* device, Device::GroupControlState oldState, Device::GroupControlState newState); void onControlStateChange(Device *device, Device::GroupControlState oldState, Device::GroupControlState newState);
private: private:
void initStyle(); void initStyle();

View file

@ -1,34 +1,31 @@
#include <QDesktopWidget> #include <QDesktopWidget>
#include <QMouseEvent>
#include <QTimer>
#include <QStyle>
#include <QStyleOption>
#include <QPainter>
#include <QtWidgets/QHBoxLayout>
#include <QMimeData>
#include <QFileInfo> #include <QFileInfo>
#include <QMessageBox> #include <QMessageBox>
#include <QShortcut> #include <QMimeData>
#include <QWindow> #include <QMouseEvent>
#include <QPainter>
#include <QScreen> #include <QScreen>
#include <QShortcut>
#include <QStyle>
#include <QStyleOption>
#include <QTimer>
#include <QWindow>
#include <QtWidgets/QHBoxLayout>
#include "videoform.h"
#include "qyuvopenglwidget.h"
#include "ui_videoform.h"
#include "iconhelper.h"
#include "toolform.h"
#include "device.h"
#include "controller.h"
#include "config.h" #include "config.h"
#include "controller.h"
#include "device.h"
#include "iconhelper.h"
#include "qyuvopenglwidget.h"
#include "toolform.h"
#include "ui_videoform.h"
#include "videoform.h"
extern "C" extern "C"
{ {
#include "libavutil/frame.h" #include "libavutil/frame.h"
} }
VideoForm::VideoForm(bool framelessWindow, bool skin, QWidget *parent) VideoForm::VideoForm(bool framelessWindow, bool skin, QWidget *parent) : QWidget(parent), ui(new Ui::videoForm), m_skin(skin)
: QWidget(parent)
, ui(new Ui::videoForm)
, m_skin(skin)
{ {
ui->setupUi(this); ui->setupUi(this);
initUI(); initUI();
@ -80,8 +77,7 @@ QRect VideoForm::getGrabCursorRect()
{ {
QRect rc; QRect rc;
#if defined(Q_OS_WIN32) #if defined(Q_OS_WIN32)
rc = QRect(m_videoWidget->mapToGlobal(m_videoWidget->pos()) rc = QRect(m_videoWidget->mapToGlobal(m_videoWidget->pos()), m_videoWidget->size());
, m_videoWidget->size());
// high dpi support // high dpi support
rc.setTopLeft(rc.topLeft() * m_videoWidget->devicePixelRatio()); rc.setTopLeft(rc.topLeft() * m_videoWidget->devicePixelRatio());
rc.setBottomRight(rc.bottomRight() * m_videoWidget->devicePixelRatio()); rc.setBottomRight(rc.bottomRight() * m_videoWidget->devicePixelRatio());
@ -130,8 +126,7 @@ void VideoForm::updateRender(const AVFrame *frame)
updateShowSize(QSize(frame->width, frame->height)); updateShowSize(QSize(frame->width, frame->height));
m_videoWidget->setFrameSize(QSize(frame->width, frame->height)); m_videoWidget->setFrameSize(QSize(frame->width, frame->height));
m_videoWidget->updateTextures(frame->data[0], frame->data[1], frame->data[2], m_videoWidget->updateTextures(frame->data[0], frame->data[1], frame->data[2], frame->linesize[0], frame->linesize[1], frame->linesize[2]);
frame->linesize[0], frame->linesize[1], frame->linesize[2]);
} }
void VideoForm::showToolForm(bool show) void VideoForm::showToolForm(bool show)
@ -157,146 +152,141 @@ void VideoForm::moveCenter()
void VideoForm::installShortcut() void VideoForm::installShortcut()
{ {
QShortcut *shortcut = nullptr; QShortcut *shortcut = nullptr;
// switchFullScreen // switchFullScreen
shortcut = new QShortcut(QKeySequence("Ctrl+f"), this); shortcut = new QShortcut(QKeySequence("Ctrl+f"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->switchFullScreen(); emit m_device->switchFullScreen();
}); });
// resizeSquare // resizeSquare
shortcut = new QShortcut(QKeySequence("Ctrl+g"), this); shortcut = new QShortcut(QKeySequence("Ctrl+g"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() { resizeSquare(); });
resizeSquare();
});
// removeBlackRect // removeBlackRect
shortcut = new QShortcut(QKeySequence("Ctrl+x"), this); shortcut = new QShortcut(QKeySequence("Ctrl+x"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() { removeBlackRect(); });
removeBlackRect();
});
// postGoHome
shortcut = new QShortcut(QKeySequence("Ctrl+h"), this);
connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) {
return;
}
emit m_device->postGoHome();
});
// postGoHome // postGoBack
shortcut = new QShortcut(QKeySequence("Ctrl+h"), this); shortcut = new QShortcut(QKeySequence("Ctrl+b"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postGoHome(); emit m_device->postGoBack();
}); });
// postGoBack // postAppSwitch
shortcut = new QShortcut(QKeySequence("Ctrl+b"), this); shortcut = new QShortcut(QKeySequence("Ctrl+s"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postGoBack(); emit m_device->postAppSwitch();
}); });
// postAppSwitch // postGoMenu
shortcut = new QShortcut(QKeySequence("Ctrl+s"), this); shortcut = new QShortcut(QKeySequence("Ctrl+m"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postAppSwitch(); emit m_device->postGoMenu();
}); });
// postGoMenu // postVolumeUp
shortcut = new QShortcut(QKeySequence("Ctrl+m"), this); shortcut = new QShortcut(QKeySequence("Ctrl+up"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postGoMenu(); emit m_device->postVolumeUp();
}); });
// postVolumeUp // postVolumeDown
shortcut = new QShortcut(QKeySequence("Ctrl+up"), this); shortcut = new QShortcut(QKeySequence("Ctrl+down"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postVolumeUp(); emit m_device->postVolumeDown();
}); });
// postVolumeDown // postPower
shortcut = new QShortcut(QKeySequence("Ctrl+down"), this); shortcut = new QShortcut(QKeySequence("Ctrl+p"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postVolumeDown(); emit m_device->postPower();
}); });
// postPower // setScreenPowerMode(ControlMsg::SPM_OFF)
shortcut = new QShortcut(QKeySequence("Ctrl+p"), this); shortcut = new QShortcut(QKeySequence("Ctrl+o"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->postPower(); emit m_device->setScreenPowerMode(ControlMsg::SPM_OFF);
}); });
// setScreenPowerMode(ControlMsg::SPM_OFF) // expandNotificationPanel
shortcut = new QShortcut(QKeySequence("Ctrl+o"), this); shortcut = new QShortcut(QKeySequence("Ctrl+n"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->setScreenPowerMode(ControlMsg::SPM_OFF); emit m_device->expandNotificationPanel();
}); });
// expandNotificationPanel // collapseNotificationPanel
shortcut = new QShortcut(QKeySequence("Ctrl+n"), this); shortcut = new QShortcut(QKeySequence("Ctrl+Shift+n"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->expandNotificationPanel(); emit m_device->collapseNotificationPanel();
}); });
// collapseNotificationPanel // requestDeviceClipboard
shortcut = new QShortcut(QKeySequence("Ctrl+Shift+n"), this); shortcut = new QShortcut(QKeySequence("Ctrl+c"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->collapseNotificationPanel(); emit m_device->requestDeviceClipboard();
}); });
// requestDeviceClipboard // clipboardPaste
shortcut = new QShortcut(QKeySequence("Ctrl+c"), this); shortcut = new QShortcut(QKeySequence("Ctrl+v"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->requestDeviceClipboard(); emit m_device->clipboardPaste();
}); });
// clipboardPaste // setDeviceClipboard
shortcut = new QShortcut(QKeySequence("Ctrl+v"), this); shortcut = new QShortcut(QKeySequence("Ctrl+Shift+v"), this);
connect(shortcut, &QShortcut::activated, this, [this](){ connect(shortcut, &QShortcut::activated, this, [this]() {
if (!m_device) { if (!m_device) {
return; return;
} }
emit m_device->clipboardPaste(); emit m_device->setDeviceClipboard();
}); });
// setDeviceClipboard
shortcut = new QShortcut(QKeySequence("Ctrl+Shift+v"), this);
connect(shortcut, &QShortcut::activated, this, [this](){
if (!m_device) {
return;
}
emit m_device->setDeviceClipboard();
});
} }
QRect VideoForm::getScreenRect() QRect VideoForm::getScreenRect()
@ -368,7 +358,7 @@ void VideoForm::updateShowSize(const QSize &newSize)
showSize.setHeight(qMin(newSize.height(), screenRect.height() - 200)); showSize.setHeight(qMin(newSize.height(), screenRect.height() - 200));
showSize.setWidth(showSize.height() * m_widthHeightRatio); showSize.setWidth(showSize.height() * m_widthHeightRatio);
} else { } else {
showSize.setWidth(qMin(newSize.width(), screenRect.width()/2)); showSize.setWidth(qMin(newSize.width(), screenRect.width() / 2));
showSize.setHeight(showSize.width() / m_widthHeightRatio); showSize.setHeight(showSize.width() / m_widthHeightRatio);
} }
@ -517,7 +507,7 @@ void VideoForm::mouseMoveEvent(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());
} else if (!m_dragPosition.isNull()){ } else if (!m_dragPosition.isNull()) {
if (event->buttons() & Qt::LeftButton) { if (event->buttons() & Qt::LeftButton) {
move(event->globalPos() - m_dragPosition); move(event->globalPos() - m_dragPosition);
event->accept(); event->accept();
@ -527,8 +517,7 @@ void VideoForm::mouseMoveEvent(QMouseEvent *event)
void VideoForm::mouseDoubleClickEvent(QMouseEvent *event) void VideoForm::mouseDoubleClickEvent(QMouseEvent *event)
{ {
if (event->button() == Qt::LeftButton if (event->button() == Qt::LeftButton && !m_videoWidget->geometry().contains(event->pos())) {
&& !m_videoWidget->geometry().contains(event->pos())) {
removeBlackRect(); removeBlackRect();
} }
@ -549,8 +538,7 @@ void VideoForm::wheelEvent(QWheelEvent *event)
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers,
Qt::Orientation orient = Qt::Vertical); Qt::Orientation orient = Qt::Vertical);
*/ */
QWheelEvent wheelEvent(pos, event->globalPosF(), event->delta(), QWheelEvent wheelEvent(pos, event->globalPosF(), event->delta(), event->buttons(), event->modifiers(), event->orientation());
event->buttons(), event->modifiers(), event->orientation());
emit m_device->wheelEvent(&wheelEvent, m_videoWidget->frameSize(), m_videoWidget->size()); emit m_device->wheelEvent(&wheelEvent, m_videoWidget->frameSize(), m_videoWidget->size());
} }
} }
@ -560,9 +548,7 @@ void VideoForm::keyPressEvent(QKeyEvent *event)
if (!m_device) { if (!m_device) {
return; return;
} }
if (Qt::Key_Escape == event->key() if (Qt::Key_Escape == event->key() && !event->isAutoRepeat() && isFullScreen()) {
&& !event->isAutoRepeat()
&& isFullScreen()) {
emit m_device->switchFullScreen(); emit m_device->switchFullScreen();
} }
@ -649,7 +635,7 @@ void VideoForm::dropEvent(QDropEvent *event)
if (!m_device) { if (!m_device) {
return; return;
} }
const QMimeData* qm = event->mimeData(); const QMimeData *qm = event->mimeData();
QString file = qm->urls()[0].toLocalFile(); QString file = qm->urls()[0].toLocalFile();
QFileInfo fileInfo(file); QFileInfo fileInfo(file);

View file

@ -1,11 +1,12 @@
#ifndef VIDEOFORM_H #ifndef VIDEOFORM_H
#define VIDEOFORM_H #define VIDEOFORM_H
#include <QWidget>
#include <QPointer> #include <QPointer>
#include <QWidget>
namespace Ui { namespace Ui
class videoForm; {
class videoForm;
} }
struct AVFrame; struct AVFrame;
@ -32,11 +33,11 @@ public:
public slots: public slots:
void onSwitchFullScreen(); void onSwitchFullScreen();
private: private:
void updateStyleSheet(bool vertical); void updateStyleSheet(bool vertical);
QMargins getMargins(bool vertical); QMargins getMargins(bool vertical);
void initUI(); void initUI();
void showToolForm(bool show = true); void showToolForm(bool show = true);
void moveCenter(); void moveCenter();
void installShortcut(); void installShortcut();
@ -63,7 +64,7 @@ protected:
private: private:
// ui // ui
Ui::videoForm *ui; Ui::videoForm *ui;
QPointer<ToolForm> m_toolForm; QPointer<ToolForm> m_toolForm;
QPointer<QWidget> m_loadingWidget; QPointer<QWidget> m_loadingWidget;
QPointer<QYUVOpenGLWidget> m_videoWidget; QPointer<QYUVOpenGLWidget> m_videoWidget;

View file

@ -1,7 +1,7 @@
#include <QDebug> #include <QDebug>
#include <QKeyEvent>
#include <QMouseEvent> #include <QMouseEvent>
#include <QWheelEvent> #include <QWheelEvent>
#include <QKeyEvent>
#include "devicemanage.h" #include "devicemanage.h"
#include "server.h" #include "server.h"
@ -9,15 +9,9 @@
#define DM_MAX_DEVICES_NUM 16 #define DM_MAX_DEVICES_NUM 16
DeviceManage::DeviceManage(QObject *parent) : QObject(parent) DeviceManage::DeviceManage(QObject *parent) : QObject(parent) {}
{
} DeviceManage::~DeviceManage() {}
DeviceManage::~DeviceManage()
{
}
bool DeviceManage::connectDevice(Device::DeviceParams params) bool DeviceManage::connectDevice(Device::DeviceParams params)
{ {
@ -195,8 +189,7 @@ void DeviceManage::onControlStateChange(Device *device, Device::GroupControlStat
return; return;
} }
// free to host // free to host
if (oldState == Device::GroupControlState::GCS_FREE if (oldState == Device::GroupControlState::GCS_FREE && newState == Device::GroupControlState::GCS_HOST) {
&& newState == Device::GroupControlState::GCS_HOST) {
// install direct control signals // install direct control signals
setGroupControlHost(device, true); setGroupControlHost(device, true);
// install convert control signals(frameSize need convert) // install convert control signals(frameSize need convert)
@ -206,8 +199,7 @@ void DeviceManage::onControlStateChange(Device *device, Device::GroupControlStat
return; return;
} }
// host to free // host to free
if (oldState == Device::GroupControlState::GCS_HOST if (oldState == Device::GroupControlState::GCS_HOST && newState == Device::GroupControlState::GCS_FREE) {
&& newState == Device::GroupControlState::GCS_FREE) {
// uninstall direct control signals // uninstall direct control signals
setGroupControlHost(device, false); setGroupControlHost(device, false);
// uninstall convert control signals(frameSize need convert) // uninstall convert control signals(frameSize need convert)
@ -268,16 +260,14 @@ void DeviceManage::onKeyEvent(const QKeyEvent *from, const QSize &frameSize, con
quint16 DeviceManage::getFreePort() quint16 DeviceManage::getFreePort()
{ {
quint16 port = m_localPortStart; quint16 port = m_localPortStart;
while (port < m_localPortStart + DM_MAX_DEVICES_NUM) { while (port < m_localPortStart + DM_MAX_DEVICES_NUM) {
bool used = false; bool used = false;
QMapIterator<QString, QPointer<Device>> i(m_devices); QMapIterator<QString, QPointer<Device>> i(m_devices);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
auto device = i.value(); auto device = i.value();
if (device && device->getServer() if (device && device->getServer() && device->getServer()->isReverse() && port == device->getServer()->getParams().localPort) {
&& device->getServer()->isReverse()
&& port == device->getServer()->getParams().localPort) {
used = true; used = true;
break; break;
} }

View file

@ -1,8 +1,8 @@
#ifndef DEVICEMANAGE_H #ifndef DEVICEMANAGE_H
#define DEVICEMANAGE_H #define DEVICEMANAGE_H
#include <QPointer>
#include <QMap> #include <QMap>
#include <QPointer>
#include "device.h" #include "device.h"
@ -26,12 +26,12 @@ protected:
protected slots: protected slots:
void onDeviceDisconnect(QString serial); void onDeviceDisconnect(QString serial);
void onControlStateChange(Device* device, Device::GroupControlState oldState, Device::GroupControlState newState); void onControlStateChange(Device *device, Device::GroupControlState oldState, Device::GroupControlState newState);
// neend convert frameSize to its frameSize // neend convert frameSize to its frameSize
void onMouseEvent(const QMouseEvent* from, const QSize& frameSize, const QSize& showSize); void onMouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize);
void onWheelEvent(const QWheelEvent* from, const QSize& frameSize, const QSize& showSize); void onWheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize);
void onKeyEvent(const QKeyEvent* from, const QSize& frameSize, const QSize& showSize); void onKeyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize);
private: private:
quint16 getFreePort(); quint16 getFreePort();

View file

@ -1,25 +1,23 @@
#include <QFile>
#include <QTime>
#include <QKeyEvent>
#include <QFileDialog>
#include <QTimer>
#include <QDebug> #include <QDebug>
#include <QFile>
#include <QFileDialog>
#include <QKeyEvent>
#include <QTime>
#include <QTimer>
#include "dialog.h"
#include "ui_dialog.h"
#include "device.h"
#include "videoform.h"
#include "keymap.h"
#include "config.h" #include "config.h"
#include "device.h"
#include "dialog.h"
#include "keymap.h"
#include "ui_dialog.h"
#include "videoform.h"
Dialog::Dialog(QWidget *parent) : Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog)
QDialog(parent), {
ui(new Ui::Dialog)
{
ui->setupUi(this); ui->setupUi(this);
initUI(); initUI();
connect(&m_adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult){ connect(&m_adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) {
QString log = ""; QString log = "";
bool newLine = true; bool newLine = true;
QStringList args = m_adb.arguments(); QStringList args = m_adb.arguments();
@ -33,7 +31,7 @@ Dialog::Dialog(QWidget *parent) :
break; break;
case AdbProcess::AER_ERROR_EXEC: case AdbProcess::AER_ERROR_EXEC:
//log = m_adb.getErrorOut(); //log = m_adb.getErrorOut();
if (args.contains("ifconfig") && args.contains("wlan0")){ if (args.contains("ifconfig") && args.contains("wlan0")) {
getIPbyIp(); getIPbyIp();
} }
break; break;
@ -45,7 +43,7 @@ Dialog::Dialog(QWidget *parent) :
if (args.contains("devices")) { if (args.contains("devices")) {
QStringList devices = m_adb.getDevicesSerialFromStdOut(); QStringList devices = m_adb.getDevicesSerialFromStdOut();
ui->serialBox->clear(); ui->serialBox->clear();
for (auto& item : devices) { for (auto &item : devices) {
ui->serialBox->addItem(item); ui->serialBox->addItem(item);
} }
} else if (args.contains("show") && args.contains("wlan0")) { } else if (args.contains("show") && args.contains("wlan0")) {
@ -119,7 +117,7 @@ void Dialog::initUI()
// linux need more width // linux need more width
setFixedWidth(480); setFixedWidth(480);
#endif #endif
} }
void Dialog::execAdbCmd() void Dialog::execAdbCmd()
{ {
@ -131,11 +129,10 @@ void Dialog::execAdbCmd()
m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", QString::SkipEmptyParts)); m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", QString::SkipEmptyParts));
} }
QString Dialog::getGameScript(const QString& fileName) QString Dialog::getGameScript(const QString &fileName)
{ {
QFile loadFile(KeyMap::getKeyMapPath() + "/" + fileName); QFile loadFile(KeyMap::getKeyMapPath() + "/" + fileName);
if(!loadFile.open(QIODevice::ReadOnly)) if (!loadFile.open(QIODevice::ReadOnly)) {
{
outLog("open file failed:" + fileName, true); outLog("open file failed:" + fileName, true);
return ""; return "";
} }
@ -194,7 +191,7 @@ void Dialog::on_startServerBtn_clicked()
} }
void Dialog::on_stopServerBtn_clicked() void Dialog::on_stopServerBtn_clicked()
{ {
if (m_deviceManage.disconnectDevice(ui->serialBox->currentText().trimmed())) { if (m_deviceManage.disconnectDevice(ui->serialBox->currentText().trimmed())) {
outLog("stop server"); outLog("stop server");
} }
@ -241,7 +238,7 @@ void Dialog::outLog(const QString &log, bool newLine)
{ {
// avoid sub thread update ui // avoid sub thread update ui
QString backLog = log; QString backLog = log;
QTimer::singleShot(0, this, [this, backLog, newLine](){ QTimer::singleShot(0, this, [this, backLog, newLine]() {
ui->outEdit->append(backLog); ui->outEdit->append(backLog);
if (newLine) { if (newLine) {
ui->outEdit->append("<br/>"); ui->outEdit->append("<br/>");
@ -324,10 +321,7 @@ void Dialog::on_wirelessDisConnectBtn_clicked()
void Dialog::on_selectRecordPathBtn_clicked() void Dialog::on_selectRecordPathBtn_clicked()
{ {
QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly; QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
QString directory = QFileDialog::getExistingDirectory(this, QString directory = QFileDialog::getExistingDirectory(this, tr("select path"), "", options);
tr("select path"),
"",
options);
ui->recordPathEdt->setText(directory); ui->recordPathEdt->setText(directory);
} }
@ -349,7 +343,7 @@ void Dialog::on_stopAdbBtn_clicked()
} }
void Dialog::on_clearOut_clicked() void Dialog::on_clearOut_clicked()
{ {
ui->outEdit->clear(); ui->outEdit->clear();
} }

View file

@ -7,8 +7,9 @@
#include "adbprocess.h" #include "adbprocess.h"
#include "devicemanage.h" #include "devicemanage.h"
namespace Ui { namespace Ui
class Dialog; {
class Dialog;
} }
class QYUVOpenGLWidget; class QYUVOpenGLWidget;
@ -20,8 +21,8 @@ public:
explicit Dialog(QWidget *parent = 0); explicit Dialog(QWidget *parent = 0);
~Dialog(); ~Dialog();
void outLog(const QString& log, bool newLine = true); void outLog(const QString &log, bool newLine = true);
bool filterLog(const QString & log); bool filterLog(const QString &log);
void getIPbyIp(); void getIPbyIp();
private slots: private slots:
@ -69,7 +70,7 @@ private:
bool checkAdbRun(); bool checkAdbRun();
void initUI(); void initUI();
void execAdbCmd(); void execAdbCmd();
QString getGameScript(const QString& fileName); QString getGameScript(const QString &fileName);
private: private:
Ui::Dialog *ui; Ui::Dialog *ui;

View file

@ -1,22 +1,21 @@
#include "iconhelper.h" #include "iconhelper.h"
IconHelper* IconHelper::_instance = 0; IconHelper *IconHelper::_instance = 0;
IconHelper::IconHelper(QObject*): IconHelper::IconHelper(QObject *) : QObject(qApp)
QObject(qApp)
{ {
int fontId = QFontDatabase::addApplicationFont(":/font/fontawesome-webfont.ttf"); int fontId = QFontDatabase::addApplicationFont(":/font/fontawesome-webfont.ttf");
QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0); QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);
iconFont = QFont(fontName); iconFont = QFont(fontName);
} }
void IconHelper::SetIcon(QLabel* lab, QChar c, int size) void IconHelper::SetIcon(QLabel *lab, QChar c, int size)
{ {
iconFont.setPointSize(size); iconFont.setPointSize(size);
lab->setFont(iconFont); lab->setFont(iconFont);
lab->setText(c); lab->setText(c);
} }
void IconHelper::SetIcon(QPushButton* btn, QChar c, int size) void IconHelper::SetIcon(QPushButton *btn, QChar c, int size)
{ {
iconFont.setPointSize(size); iconFont.setPointSize(size);
btn->setFont(iconFont); btn->setFont(iconFont);

View file

@ -1,23 +1,23 @@
#ifndef ICONHELPER_H #ifndef ICONHELPER_H
#define ICONHELPER_H #define ICONHELPER_H
#include <QObject> #include <QApplication>
#include <QFont> #include <QFont>
#include <QFontDatabase> #include <QFontDatabase>
#include <QMutex>
#include <QLabel> #include <QLabel>
#include <QMutex>
#include <QObject>
#include <QPushButton> #include <QPushButton>
#include <QApplication>
class IconHelper : public QObject class IconHelper : public QObject
{ {
private: private:
explicit IconHelper(QObject *parent = 0); explicit IconHelper(QObject *parent = 0);
QFont iconFont; QFont iconFont;
static IconHelper* _instance; static IconHelper *_instance;
public: public:
static IconHelper* Instance() static IconHelper *Instance()
{ {
static QMutex mutex; static QMutex mutex;
if (!_instance) { if (!_instance) {
@ -29,9 +29,8 @@ public:
return _instance; return _instance;
} }
void SetIcon(QLabel* lab, QChar c, int size = 10); void SetIcon(QLabel *lab, QChar c, int size = 10);
void SetIcon(QPushButton* btn, QChar c, int size = 10); void SetIcon(QPushButton *btn, QChar c, int size = 10);
}; };
#endif // ICONHELPER_H #endif // ICONHELPER_H

View file

@ -1,17 +1,17 @@
#include <QApplication> #include <QApplication>
#include <QDebug> #include <QDebug>
#include <QTcpSocket>
#include <QTcpServer>
#include <QTranslator>
#include <QFile> #include <QFile>
#include <QSurfaceFormat> #include <QSurfaceFormat>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTranslator>
#include "dialog.h"
#include "stream.h"
#include "mousetap/mousetap.h"
#include "config.h" #include "config.h"
#include "dialog.h"
#include "mousetap/mousetap.h"
#include "stream.h"
static Dialog* g_mainDlg = Q_NULLPTR; static Dialog *g_mainDlg = Q_NULLPTR;
static QtMessageHandler g_oldMessageHandler = Q_NULLPTR; static QtMessageHandler g_oldMessageHandler = Q_NULLPTR;
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg); void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
@ -42,7 +42,7 @@ int main(int argc, char *argv[])
int opengl = Config::getInstance().getDesktopOpenGL(); int opengl = Config::getInstance().getDesktopOpenGL();
if (0 == opengl) { if (0 == opengl) {
QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
} else if (1 == opengl){ } else if (1 == opengl) {
QApplication::setAttribute(Qt::AA_UseOpenGLES); QApplication::setAttribute(Qt::AA_UseOpenGLES);
} else if (2 == opengl) { } else if (2 == opengl) {
QApplication::setAttribute(Qt::AA_UseDesktopOpenGL); QApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
@ -98,7 +98,9 @@ int main(int argc, char *argv[])
g_mainDlg->setWindowTitle(Config::getInstance().getTitle()); g_mainDlg->setWindowTitle(Config::getInstance().getTitle());
g_mainDlg->show(); g_mainDlg->show();
qInfo(QObject::tr("This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address:").toUtf8()); qInfo(QObject::tr("This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the "
"following address:")
.toUtf8());
qInfo(QString("QtScrcpy %1 <https://github.com/barry-ran/QtScrcpy>").arg(QCoreApplication::applicationVersion()).toUtf8()); qInfo(QString("QtScrcpy %1 <https://github.com/barry-ran/QtScrcpy>").arg(QCoreApplication::applicationVersion()).toUtf8());
int ret = a.exec(); int ret = a.exec();
@ -111,7 +113,8 @@ int main(int argc, char *argv[])
return ret; return ret;
} }
void installTranslator() { void installTranslator()
{
static QTranslator translator; static QTranslator translator;
QLocale locale; QLocale locale;
QLocale::Language language = locale.language(); QLocale::Language language = locale.language();

View file

@ -3,16 +3,9 @@
#include "keepradiowidget.h" #include "keepradiowidget.h"
KeepRadioWidget::KeepRadioWidget(QWidget *parent) : KeepRadioWidget::KeepRadioWidget(QWidget *parent) : QWidget(parent) {}
QWidget(parent)
{
} KeepRadioWidget::~KeepRadioWidget() {}
KeepRadioWidget::~KeepRadioWidget()
{
}
void KeepRadioWidget::setWidget(QWidget *w) void KeepRadioWidget::setWidget(QWidget *w)
{ {

View file

@ -1,8 +1,8 @@
#ifndef KEEPRADIOWIDGET_H #ifndef KEEPRADIOWIDGET_H
#define KEEPRADIOWIDGET_H #define KEEPRADIOWIDGET_H
#include <QWidget>
#include <QPointer> #include <QPointer>
#include <QWidget>
class KeepRadioWidget : public QWidget class KeepRadioWidget : public QWidget
{ {
@ -11,7 +11,7 @@ public:
explicit KeepRadioWidget(QWidget *parent = nullptr); explicit KeepRadioWidget(QWidget *parent = nullptr);
~KeepRadioWidget(); ~KeepRadioWidget();
void setWidget(QWidget* w); void setWidget(QWidget *w);
void setWidthHeightRadio(float widthHeightRadio); void setWidthHeightRadio(float widthHeightRadio);
const QSize goodSize(); const QSize goodSize();
@ -23,7 +23,6 @@ private:
float m_widthHeightRadio = -1.0f; float m_widthHeightRadio = -1.0f;
QPointer<QWidget> m_subWidget; QPointer<QWidget> m_subWidget;
QSize m_goodSize; QSize m_goodSize;
}; };
#endif // KEEPRADIOWIDGET_H #endif // KEEPRADIOWIDGET_H

View file

@ -4,17 +4,13 @@
#include "magneticwidget.h" #include "magneticwidget.h"
MagneticWidget::MagneticWidget(QWidget* adsorbWidget, AdsorbPositions adsorbPos) MagneticWidget::MagneticWidget(QWidget *adsorbWidget, AdsorbPositions adsorbPos) : QWidget(Q_NULLPTR), m_adsorbPos(adsorbPos), m_adsorbWidget(adsorbWidget)
: QWidget(Q_NULLPTR)
, m_adsorbPos(adsorbPos)
, m_adsorbWidget(adsorbWidget)
{ {
Q_ASSERT(m_adsorbWidget); Q_ASSERT(m_adsorbWidget);
setParent(m_adsorbWidget); setParent(m_adsorbWidget);
setWindowFlags(windowFlags() | Qt::Tool); setWindowFlags(windowFlags() | Qt::Tool);
m_adsorbWidget->installEventFilter(this); m_adsorbWidget->installEventFilter(this);
} }
MagneticWidget::~MagneticWidget() MagneticWidget::~MagneticWidget()
@ -110,68 +106,53 @@ void MagneticWidget::moveEvent(QMoveEvent *event)
m_adsorbed = false; m_adsorbed = false;
if (m_adsorbPos & AP_INSIDE_LEFT if (m_adsorbPos & AP_INSIDE_LEFT && parentRect.intersects(targetRect) && qAbs(parentLeft - targetLeft) < adsorbDistance) {
&& parentRect.intersects(targetRect)
&& qAbs(parentLeft - targetLeft) < adsorbDistance) {
finalPosition.setX(parentLeft); finalPosition.setX(parentLeft);
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_INSIDE_LEFT; m_curAdsorbPosition = AP_INSIDE_LEFT;
} }
if (m_adsorbPos & AP_OUTSIDE_RIGHT if (m_adsorbPos & AP_OUTSIDE_RIGHT && parentRect.intersects(targetRect.translated(-adsorbDistance, 0)) && qAbs(parentRight - targetLeft) < adsorbDistance) {
&& parentRect.intersects(targetRect.translated(-adsorbDistance, 0))
&& qAbs(parentRight - targetLeft) < adsorbDistance) {
finalPosition.setX(parentRight); finalPosition.setX(parentRight);
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_OUTSIDE_RIGHT; m_curAdsorbPosition = AP_OUTSIDE_RIGHT;
} }
if (m_adsorbPos & AP_OUTSIDE_LEFT if (m_adsorbPos & AP_OUTSIDE_LEFT && parentRect.intersects(targetRect.translated(adsorbDistance, 0)) && qAbs(parentLeft - targetRight) < adsorbDistance) {
&& parentRect.intersects(targetRect.translated(adsorbDistance, 0))
&& qAbs(parentLeft - targetRight) < adsorbDistance) {
finalPosition.setX(parentLeft - targetRect.width()); finalPosition.setX(parentLeft - targetRect.width());
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_OUTSIDE_LEFT; m_curAdsorbPosition = AP_OUTSIDE_LEFT;
} }
if (m_adsorbPos & AP_INSIDE_RIGHT if (m_adsorbPos & AP_INSIDE_RIGHT && parentRect.intersects(targetRect) && qAbs(parentRight - targetRight) < adsorbDistance) {
&& parentRect.intersects(targetRect)
&& qAbs(parentRight - targetRight) < adsorbDistance) {
finalPosition.setX(parentRight - targetRect.width()); finalPosition.setX(parentRight - targetRect.width());
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_INSIDE_RIGHT; m_curAdsorbPosition = AP_INSIDE_RIGHT;
} }
if (m_adsorbPos & AP_INSIDE_TOP if (m_adsorbPos & AP_INSIDE_TOP && parentRect.intersects(targetRect) && qAbs(parentTop - targetTop) < adsorbDistance) {
&& parentRect.intersects(targetRect)
&& qAbs(parentTop - targetTop) < adsorbDistance) {
finalPosition.setY(parentTop); finalPosition.setY(parentTop);
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_INSIDE_TOP; m_curAdsorbPosition = AP_INSIDE_TOP;
} }
if (m_adsorbPos & AP_OUTSIDE_TOP if (m_adsorbPos & AP_OUTSIDE_TOP && parentRect.intersects(targetRect.translated(0, adsorbDistance)) && qAbs(parentTop - targetBottom) < adsorbDistance) {
&& parentRect.intersects(targetRect.translated(0, adsorbDistance))
&& qAbs(parentTop - targetBottom) < adsorbDistance) {
finalPosition.setY(parentTop - targetRect.height()); finalPosition.setY(parentTop - targetRect.height());
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_OUTSIDE_TOP; m_curAdsorbPosition = AP_OUTSIDE_TOP;
} }
if (m_adsorbPos & AP_OUTSIDE_BOTTOM if (m_adsorbPos & AP_OUTSIDE_BOTTOM && parentRect.intersects(targetRect.translated(0, -adsorbDistance))
&& parentRect.intersects(targetRect.translated(0, -adsorbDistance)) && qAbs(parentBottom - targetTop) < adsorbDistance) {
&& qAbs(parentBottom - targetTop) < adsorbDistance) {
finalPosition.setY(parentBottom); finalPosition.setY(parentBottom);
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_OUTSIDE_BOTTOM; m_curAdsorbPosition = AP_OUTSIDE_BOTTOM;
} }
if (m_adsorbPos & AP_INSIDE_BOTTOM if (m_adsorbPos & AP_INSIDE_BOTTOM && parentRect.intersects(targetRect) && qAbs(parentBottom - targetBottom) < adsorbDistance) {
&& parentRect.intersects(targetRect)
&& qAbs(parentBottom - targetBottom) < adsorbDistance) {
finalPosition.setY(parentBottom - targetRect.height()); finalPosition.setY(parentBottom - targetRect.height());
m_adsorbed |= true; m_adsorbed |= true;
m_curAdsorbPosition = AP_INSIDE_BOTTOM; m_curAdsorbPosition = AP_INSIDE_BOTTOM;
} }
if (m_adsorbed) { if (m_adsorbed) {
@ -191,4 +172,3 @@ void MagneticWidget::getGeometry(QRect &relativeWidgetRect, QRect &targetWidgetR
targetWidgetRect.setWidth(width()); targetWidgetRect.setWidth(width());
targetWidgetRect.setHeight(height()); targetWidgetRect.setHeight(height());
} }

View file

@ -1,8 +1,8 @@
#ifndef MAGNETICWIDGET_H #ifndef MAGNETICWIDGET_H
#define MAGNETICWIDGET_H #define MAGNETICWIDGET_H
#include <QWidget>
#include <QPointer> #include <QPointer>
#include <QWidget>
/* /*
* a magnetic widget * a magnetic widget
@ -14,21 +14,22 @@ class MagneticWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
enum AdsorbPosition { enum AdsorbPosition
AP_OUTSIDE_LEFT = 0x01, // 吸附外部左边框 {
AP_OUTSIDE_TOP = 0x02, // 吸附外部上边框 AP_OUTSIDE_LEFT = 0x01, // 吸附外部左边框
AP_OUTSIDE_RIGHT = 0x04, // 吸附外部右边框 AP_OUTSIDE_TOP = 0x02, // 吸附外部上边框
AP_OUTSIDE_BOTTOM = 0x08, // 吸附外部下边框 AP_OUTSIDE_RIGHT = 0x04, // 吸附外部右边框
AP_INSIDE_LEFT = 0x10, // 吸附内部左边框 AP_OUTSIDE_BOTTOM = 0x08, // 吸附外部下边框
AP_INSIDE_TOP = 0x20, // 吸附内部上边框 AP_INSIDE_LEFT = 0x10, // 吸附内部左边框
AP_INSIDE_RIGHT = 0x40, // 吸附内部右边框 AP_INSIDE_TOP = 0x20, // 吸附内部上边框
AP_INSIDE_BOTTOM = 0x80, // 吸附内部下边框 AP_INSIDE_RIGHT = 0x40, // 吸附内部右边框
AP_ALL = 0xFF, // 全吸附 AP_INSIDE_BOTTOM = 0x80, // 吸附内部下边框
AP_ALL = 0xFF, // 全吸附
}; };
Q_DECLARE_FLAGS(AdsorbPositions, AdsorbPosition) Q_DECLARE_FLAGS(AdsorbPositions, AdsorbPosition)
public: public:
explicit MagneticWidget(QWidget* adsorbWidget, AdsorbPositions adsorbPos = AP_ALL); explicit MagneticWidget(QWidget *adsorbWidget, AdsorbPositions adsorbPos = AP_ALL);
~MagneticWidget(); ~MagneticWidget();
bool isAdsorbed(); bool isAdsorbed();
@ -38,7 +39,7 @@ protected:
void moveEvent(QMoveEvent *event) override; void moveEvent(QMoveEvent *event) override;
private: private:
void getGeometry(QRect& relativeWidgetRect, QRect& targetWidgetRect); void getGeometry(QRect &relativeWidgetRect, QRect &targetWidgetRect);
private: private:
AdsorbPositions m_adsorbPos = AP_ALL; AdsorbPositions m_adsorbPos = AP_ALL;

View file

@ -11,7 +11,7 @@ void BufferUtil::write32(QBuffer &buffer, quint32 value)
void BufferUtil::write64(QBuffer &buffer, quint64 value) void BufferUtil::write64(QBuffer &buffer, quint64 value)
{ {
write32(buffer, value >> 32); write32(buffer, value >> 32);
write32(buffer, (quint32) value); write32(buffer, (quint32)value);
} }
void BufferUtil::write16(QBuffer &buffer, quint32 value) void BufferUtil::write16(QBuffer &buffer, quint32 value)
@ -24,9 +24,9 @@ quint16 BufferUtil::read16(QBuffer &buffer)
{ {
uchar c; uchar c;
quint16 ret = 0; quint16 ret = 0;
buffer.getChar(reinterpret_cast<char*>(&c)); buffer.getChar(reinterpret_cast<char *>(&c));
ret |= (c << 8); ret |= (c << 8);
buffer.getChar(reinterpret_cast<char*>(&c)); buffer.getChar(reinterpret_cast<char *>(&c));
ret |= c; ret |= c;
return ret; return ret;
@ -36,13 +36,13 @@ quint32 BufferUtil::read32(QBuffer &buffer)
{ {
uchar c; uchar c;
quint32 ret = 0; quint32 ret = 0;
buffer.getChar(reinterpret_cast<char*>(&c)); buffer.getChar(reinterpret_cast<char *>(&c));
ret |= (c << 24); ret |= (c << 24);
buffer.getChar(reinterpret_cast<char*>(&c)); buffer.getChar(reinterpret_cast<char *>(&c));
ret |= (c << 16); ret |= (c << 16);
buffer.getChar(reinterpret_cast<char*>(&c)); buffer.getChar(reinterpret_cast<char *>(&c));
ret |= (c << 8); ret |= (c << 8);
buffer.getChar(reinterpret_cast<char*>(&c)); buffer.getChar(reinterpret_cast<char *>(&c));
ret |= c; ret |= c;
return ret; return ret;
@ -53,5 +53,6 @@ quint64 BufferUtil::read64(QBuffer &buffer)
quint32 msb = read32(buffer); quint32 msb = read32(buffer);
quint32 lsb = read32(buffer); quint32 lsb = read32(buffer);
return ((quint64) msb << 32) | lsb;; return ((quint64)msb << 32) | lsb;
;
} }

View file

@ -5,12 +5,12 @@
class BufferUtil class BufferUtil
{ {
public: public:
static void write16(QBuffer& buffer, quint32 value); static void write16(QBuffer &buffer, quint32 value);
static void write32(QBuffer& buffer, quint32 value); static void write32(QBuffer &buffer, quint32 value);
static void write64(QBuffer& buffer, quint64 value); static void write64(QBuffer &buffer, quint64 value);
static quint16 read16(QBuffer& buffer); static quint16 read16(QBuffer &buffer);
static quint32 read32(QBuffer& buffer); static quint32 read32(QBuffer &buffer);
static quint64 read64(QBuffer& buffer); static quint64 read64(QBuffer &buffer);
}; };
#endif // BUFFERUTIL_H #endif // BUFFERUTIL_H

View file

@ -6,11 +6,10 @@
// In ffmpeg/doc/APIchanges: // In ffmpeg/doc/APIchanges:
// 2016-04-11 - 6f69f7a / 9200514 - lavf 57.33.100 / 57.5.0 - avformat.h // 2016-04-11 - 6f69f7a / 9200514 - lavf 57.33.100 / 57.5.0 - avformat.h
// Add AVStream.codecpar, deprecate AVStream.codec. // Add AVStream.codecpar, deprecate AVStream.codec.
#if (LIBAVFORMAT_VERSION_MICRO >= 100 /* FFmpeg */ && \ #if (LIBAVFORMAT_VERSION_MICRO >= 100 /* FFmpeg */ && LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 33, 100)) \
LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 33, 100)) \ || (LIBAVFORMAT_VERSION_MICRO < 100 && /* Libav */ \
|| (LIBAVFORMAT_VERSION_MICRO < 100 && /* Libav */ \
LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 5, 0)) LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 5, 0))
# define QTSCRCPY_LAVF_HAS_NEW_CODEC_PARAMS_API #define QTSCRCPY_LAVF_HAS_NEW_CODEC_PARAMS_API
#endif #endif
// In ffmpeg/doc/APIchanges: // In ffmpeg/doc/APIchanges:
@ -19,9 +18,9 @@
// av_register_all(), av_iformat_next(), av_oformat_next(). // av_register_all(), av_iformat_next(), av_oformat_next().
// Add av_demuxer_iterate(), and av_muxer_iterate(). // Add av_demuxer_iterate(), and av_muxer_iterate().
#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(58, 9, 100) #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(58, 9, 100)
# define QTSCRCPY_LAVF_HAS_NEW_MUXER_ITERATOR_API #define QTSCRCPY_LAVF_HAS_NEW_MUXER_ITERATOR_API
#else #else
# define QTSCRCPY_LAVF_REQUIRES_REGISTER_ALL #define QTSCRCPY_LAVF_REQUIRES_REGISTER_ALL
#endif #endif
// In ffmpeg/doc/APIchanges: // In ffmpeg/doc/APIchanges:
@ -30,7 +29,7 @@
// and output -- avcodec_send_packet(), avcodec_receive_frame(), // and output -- avcodec_send_packet(), avcodec_receive_frame(),
// avcodec_send_frame() and avcodec_receive_packet(). // avcodec_send_frame() and avcodec_receive_packet().
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 100) #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 100)
# define QTSCRCPY_LAVF_HAS_NEW_ENCODING_DECODING_API #define QTSCRCPY_LAVF_HAS_NEW_ENCODING_DECODING_API
#endif #endif
#endif // COMPAT_H #endif // COMPAT_H

View file

@ -1,6 +1,6 @@
#include <QSettings>
#include <QCoreApplication> #include <QCoreApplication>
#include <QFileInfo> #include <QFileInfo>
#include <QSettings>
#include "config.h" #include "config.h"
@ -72,7 +72,7 @@ Config &Config::getInstance()
return config; return config;
} }
const QString& Config::getConfigPath() const QString &Config::getConfigPath()
{ {
if (s_configPath.isEmpty()) { if (s_configPath.isEmpty()) {
s_configPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_CONFIG_PATH")); s_configPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_CONFIG_PATH"));
@ -261,6 +261,3 @@ QString Config::getTitle()
m_settings->endGroup(); m_settings->endGroup();
return title; return title;
} }

View file

@ -10,7 +10,7 @@ class Config : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
static Config& getInstance(); static Config &getInstance();
// config // config
QString getTitle(); QString getTitle();
QString getServerVersion(); QString getServerVersion();
@ -23,7 +23,7 @@ public:
// user data // user data
QString getRecordPath(); QString getRecordPath();
void setRecordPath(const QString& path); void setRecordPath(const QString &path);
int getBitRateIndex(); int getBitRateIndex();
void setBitRateIndex(int bitRateIndex); void setBitRateIndex(int bitRateIndex);
int getMaxSizeIndex(); int getMaxSizeIndex();
@ -37,7 +37,7 @@ public:
private: private:
explicit Config(QObject *parent = nullptr); explicit Config(QObject *parent = nullptr);
const QString& getConfigPath(); const QString &getConfigPath();
private: private:
static QString s_configPath; static QString s_configPath;

View file

@ -1,13 +1,15 @@
#ifndef COCOAMOUSETAP_H #ifndef COCOAMOUSETAP_H
#define COCOAMOUSETAP_H #define COCOAMOUSETAP_H
#include <QThread>
#include <QSemaphore> #include <QSemaphore>
#include <QThread>
#include "mousetap.h" #include "mousetap.h"
struct MouseEventTapData; struct MouseEventTapData;
class QWidget; class QWidget;
class CocoaMouseTap : public MouseTap, public QThread class CocoaMouseTap
: public MouseTap
, public QThread
{ {
public: public:
CocoaMouseTap(QObject *parent = Q_NULLPTR); CocoaMouseTap(QObject *parent = Q_NULLPTR);

View file

@ -3,9 +3,10 @@
#include <QRect> #include <QRect>
class QWidget; class QWidget;
class MouseTap { class MouseTap
{
public: public:
static MouseTap* getInstance(); static MouseTap *getInstance();
virtual void initMouseEventTap() = 0; virtual void initMouseEventTap() = 0;
virtual void quitMouseEventTap() = 0; virtual void quitMouseEventTap() = 0;
// rc base global screenspace coordinate system, which has a flipped Y. // rc base global screenspace coordinate system, which has a flipped Y.

View file

@ -1,35 +1,23 @@
#include <Windows.h>
#include <QWidget>
#include <QDebug> #include <QDebug>
#include <QWidget>
#include <Windows.h>
#include "winmousetap.h" #include "winmousetap.h"
WinMouseTap::WinMouseTap() WinMouseTap::WinMouseTap() {}
{
} WinMouseTap::~WinMouseTap() {}
WinMouseTap::~WinMouseTap() void WinMouseTap::initMouseEventTap() {}
{
} void WinMouseTap::quitMouseEventTap() {}
void WinMouseTap::initMouseEventTap()
{
}
void WinMouseTap::quitMouseEventTap()
{
}
void WinMouseTap::enableMouseEventTap(QRect rc, bool enabled) void WinMouseTap::enableMouseEventTap(QRect rc, bool enabled)
{ {
if (enabled && rc.isEmpty()) { if (enabled && rc.isEmpty()) {
return; return;
} }
if(enabled) { if (enabled) {
RECT mainRect; RECT mainRect;
mainRect.left = (LONG)rc.left(); mainRect.left = (LONG)rc.left();
mainRect.right = (LONG)rc.right(); mainRect.right = (LONG)rc.right();