From 9a1497c2709e0f53b4470f3bd68330d35f0e9b69 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Sat, 17 Apr 2021 19:00:34 +0800 Subject: [PATCH 01/15] feat: change video window title --- QtScrcpy/device/device.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QtScrcpy/device/device.cpp b/QtScrcpy/device/device.cpp index fc0b959..5005032 100644 --- a/QtScrcpy/device/device.cpp +++ b/QtScrcpy/device/device.cpp @@ -221,7 +221,7 @@ void Device::initSignals() // must be show before updateShowSize m_videoForm->show(); - m_videoForm->setWindowTitle(deviceName); + m_videoForm->setWindowTitle(Config::getInstance().getTitle() + "-" + deviceName); m_videoForm->updateShowSize(size); bool deviceVer = size.height() > size.width(); From e69c7e3047c48ab9d5626450915076961df47831 Mon Sep 17 00:00:00 2001 From: rankun Date: Sun, 16 May 2021 13:00:26 +0800 Subject: [PATCH 02/15] feat: adjust window height by simple mode --- QtScrcpy/dialog.cpp | 4 ++++ QtScrcpy/dialog.ui | 43 ++++++++++++++++++++++++++++++++++++++++--- QtScrcpy/main.cpp | 4 ++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index 71a4a07..a4fb50a 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -621,6 +621,10 @@ void Dialog::on_useSingleModeCheck_clicked() ui->wirelessGroupBox->show(); ui->usbGroupBox->show(); } + + QTimer::singleShot(0, this, [this](){ + resize(width(), layout()->sizeHint().height()); + }); } void Dialog::on_serialBox_currentIndexChanged(const QString &arg1) diff --git a/QtScrcpy/dialog.ui b/QtScrcpy/dialog.ui index b098da0..89103c5 100644 --- a/QtScrcpy/dialog.ui +++ b/QtScrcpy/dialog.ui @@ -7,7 +7,7 @@ 0 0 500 - 745 + 769 @@ -72,10 +72,22 @@ + + + 0 + 0 + + + + + 0 + 100 + + 16777215 - 16777215 + 100 @@ -751,10 +763,22 @@ + + + 0 + 0 + + 0 - 140 + 100 + + + + + 16777215 + 100 @@ -768,6 +792,19 @@ + + + + Qt::Vertical + + + + 20 + 0 + + + + diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index 50178f0..def7be0 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -56,6 +56,10 @@ int main(int argc, char *argv[]) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) + QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); +#endif + QSurfaceFormat varFormat = QSurfaceFormat::defaultFormat(); varFormat.setVersion(2, 0); varFormat.setProfile(QSurfaceFormat::NoProfile); From ac7d28c89561df20bbf231130dfd0b266cfbc9a2 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Sun, 16 May 2021 16:58:12 +0800 Subject: [PATCH 03/15] feat: update dialog height --- QtScrcpy/dialog.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QtScrcpy/dialog.ui b/QtScrcpy/dialog.ui index 89103c5..16daf24 100644 --- a/QtScrcpy/dialog.ui +++ b/QtScrcpy/dialog.ui @@ -772,13 +772,13 @@ 0 - 100 + 120 16777215 - 100 + 120 From e356df6f69c1f0d2ec39112518ed0830ffbf4bb9 Mon Sep 17 00:00:00 2001 From: ifdu-code <79692260+ifdu-code@users.noreply.github.com> Date: Tue, 18 May 2021 09:55:55 +0800 Subject: [PATCH 04/15] fix: Fix memory leak --- QtScrcpy/dialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index a4fb50a..c4b9b8a 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -77,11 +77,11 @@ Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) } }); - m_hideIcon = new QSystemTrayIcon(); + m_hideIcon = new QSystemTrayIcon(this); m_hideIcon->setIcon(QIcon(":/image/tray/logo.png")); m_menu = new QMenu(); m_quit = new QAction(); - m_showWindow = new QAction();; + m_showWindow = new QAction(); m_showWindow->setText(tr("show")); m_quit->setText(tr("quit")); m_menu->addAction(m_showWindow); From da60163b3d955924df7c040d5f0024dc651b0eba Mon Sep 17 00:00:00 2001 From: rankun Date: Mon, 31 May 2021 15:20:13 +0800 Subject: [PATCH 05/15] fix: qmenu memory leak --- QtScrcpy/dialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index c4b9b8a..bbea1b4 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -79,9 +79,9 @@ Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) m_hideIcon = new QSystemTrayIcon(this); m_hideIcon->setIcon(QIcon(":/image/tray/logo.png")); - m_menu = new QMenu(); - m_quit = new QAction(); - m_showWindow = new QAction(); + m_menu = new QMenu(this); + m_quit = new QAction(this); + m_showWindow = new QAction(this); m_showWindow->setText(tr("show")); m_quit->setText(tr("quit")); m_menu->addAction(m_showWindow); From f0124e9b69e23a3cf6a4a3786c11cbc1e62cda25 Mon Sep 17 00:00:00 2001 From: Zhang Xiang Date: Wed, 16 Jun 2021 11:31:25 +0800 Subject: [PATCH 06/15] Ported to CMake, rename i18n files, and other minor adjustments --- CMakeLists.txt | 21 ++ QtScrcpy/CMakeLists.txt | 255 ++++++++++++++++++ QtScrcpy/QtScrcpy.pro | 4 - QtScrcpy/adb/CMakeLists.txt | 11 + QtScrcpy/common/CMakeLists.txt | 6 + QtScrcpy/device/CMakeLists.txt | 40 +++ QtScrcpy/device/android/CMakeLists.txt | 7 + QtScrcpy/device/controller/CMakeLists.txt | 26 ++ .../controller/inputconvert/CMakeLists.txt | 39 +++ .../inputconvert/keymap/CMakeLists.txt | 8 + .../device/controller/receiver/CMakeLists.txt | 14 + QtScrcpy/device/decoder/CMakeLists.txt | 21 ++ QtScrcpy/device/filehandler/CMakeLists.txt | 9 + QtScrcpy/device/recorder/CMakeLists.txt | 14 + QtScrcpy/device/render/CMakeLists.txt | 8 + QtScrcpy/device/server/CMakeLists.txt | 20 ++ QtScrcpy/device/stream/CMakeLists.txt | 20 ++ QtScrcpy/device/ui/CMakeLists.txt | 23 ++ QtScrcpy/device/ui/videoform.cpp | 16 -- QtScrcpy/device/ui/videoform.h | 1 - QtScrcpy/devicemanage/CMakeLists.txt | 13 + QtScrcpy/fontawesome/CMakeLists.txt | 8 + QtScrcpy/main.cpp | 4 +- .../res/i18n/{QtScrcpy_en.qm => en_US.qm} | Bin .../res/i18n/{QtScrcpy_en.ts => en_US.ts} | 72 ++--- .../res/i18n/{QtScrcpy_zh.qm => zh_CN.qm} | Bin .../res/i18n/{QtScrcpy_zh.ts => zh_CN.ts} | 72 ++--- QtScrcpy/res/res.qrc | 4 +- QtScrcpy/uibase/CMakeLists.txt | 10 + QtScrcpy/util/CMakeLists.txt | 21 ++ QtScrcpy/util/mousetap/CMakeLists.txt | 50 ++++ QtScrcpy/version | 2 +- README.md | 8 +- README_zh.md | 8 +- all.pro | 4 +- 35 files changed, 731 insertions(+), 108 deletions(-) create mode 100755 CMakeLists.txt create mode 100755 QtScrcpy/CMakeLists.txt create mode 100755 QtScrcpy/adb/CMakeLists.txt create mode 100755 QtScrcpy/common/CMakeLists.txt create mode 100755 QtScrcpy/device/CMakeLists.txt create mode 100755 QtScrcpy/device/android/CMakeLists.txt create mode 100755 QtScrcpy/device/controller/CMakeLists.txt create mode 100755 QtScrcpy/device/controller/inputconvert/CMakeLists.txt create mode 100755 QtScrcpy/device/controller/inputconvert/keymap/CMakeLists.txt create mode 100755 QtScrcpy/device/controller/receiver/CMakeLists.txt create mode 100755 QtScrcpy/device/decoder/CMakeLists.txt create mode 100755 QtScrcpy/device/filehandler/CMakeLists.txt create mode 100755 QtScrcpy/device/recorder/CMakeLists.txt create mode 100755 QtScrcpy/device/render/CMakeLists.txt create mode 100755 QtScrcpy/device/server/CMakeLists.txt create mode 100755 QtScrcpy/device/stream/CMakeLists.txt create mode 100755 QtScrcpy/device/ui/CMakeLists.txt create mode 100755 QtScrcpy/devicemanage/CMakeLists.txt create mode 100755 QtScrcpy/fontawesome/CMakeLists.txt rename QtScrcpy/res/i18n/{QtScrcpy_en.qm => en_US.qm} (100%) rename QtScrcpy/res/i18n/{QtScrcpy_en.ts => en_US.ts} (88%) rename QtScrcpy/res/i18n/{QtScrcpy_zh.qm => zh_CN.qm} (100%) rename QtScrcpy/res/i18n/{QtScrcpy_zh.ts => zh_CN.ts} (88%) create mode 100755 QtScrcpy/uibase/CMakeLists.txt create mode 100755 QtScrcpy/util/CMakeLists.txt create mode 100755 QtScrcpy/util/mousetap/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..4666405 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.19 FATAL_ERROR) + +# Read version numbers from file +file (STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/QtScrcpy/version STRING_VERSION) +message(STATUS "QtScrcpy Version ${STRING_VERSION}") +project(QtScrcpy + VERSION ${STRING_VERSION} + LANGUAGES C CXX +) + +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + enable_language(OBJCXX) +endif() + +# Split version numbers +string(REPLACE "." ";" VERSION_LIST ${STRING_VERSION}) +list(GET VERSION_LIST 0 VERSION_MAJOR) +list(GET VERSION_LIST 1 VERSION_MINOR) +list(GET VERSION_LIST 2 VERSION_PATCH) + +add_subdirectory(QtScrcpy) diff --git a/QtScrcpy/CMakeLists.txt b/QtScrcpy/CMakeLists.txt new file mode 100755 index 0000000..41ea0d5 --- /dev/null +++ b/QtScrcpy/CMakeLists.txt @@ -0,0 +1,255 @@ +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# *********************************************************** +# Qt Package finding +# *********************************************************** + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets Network LinguistTools REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network LinguistTools REQUIRED) + +# *********************************************************** +# Cross-platform settings +# *********************************************************** + +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + + # ffmpeg cannot be compiled natively by MSVC version < 12.0 (2013) + if(MSVC_VERSION LESS 1800) + message(FATAL_ERROR "[QtScrCpy] FATAL ERROR: MSVC version is older than 12.0 (2013).") + endif() + + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8") + +endif() + +# ******************** Microsoft Windows ******************** +if(WIN32) + message(STATUS "[QtScrCpy] Make for Microsoft Windows.") + # 通过rc的方式的话,VERSION变量rc中获取不到,定义为宏方便rc中使用 + # Define macros for .rc file + add_compile_definitions( + VERSION_MAJOR=${VERSION_MAJOR} + VERSION_MINOR=${VERSION_MINOR} + VERSION_PATCH=${VERSION_PATCH} + VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\" + ) + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit + message(STATUS "[QtScrCpy] 64-bit compiler detected.") + set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64") + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit + message(STATUS "[QtScrCpy] 32-bit compiler detected.") + set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86") + endif() + + link_directories(${QS_DLL_PATH}) + + # 构建完成后复制DLL依赖库 + # Copy DLL dependencies after building + file(GLOB QS_DLL_FILES "${QS_DLL_PATH}/*.dll") + foreach(QS_DLL_FILE ${QS_DLL_FILES}) + add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND + ${CMAKE_COMMAND} -E copy_if_different + "${QS_DLL_FILE}" "${PROJECT_BINARY_DIR}" + ) + endforeach() + + set(QS_EXTERNAL_LIBS_FFMPEG + avformat + avcodec + avutil + swscale + ) + + set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrCpy.rc") + +# ******************** Unix-like OSs ******************** +elseif(UNIX) + set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib") + link_directories(${QS_LIB_PATH}) + + # ==================== macOS ==================== + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + message(STATUS "[QtScrCpy] Make for macOS.") + + # QS_MAC_RESOURCES: esource file list stored in Contents/MacOS + file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib)") + list(APPEND QS_MAC_RESOURCES + "${PROJECT_SOURCE_DIR}/third_party/scrcpy-server" + "${PROJECT_SOURCE_DIR}/adb/mac/adb" + ) + + # QS_MAC_CONFIG: Config file stored in Contents/MacOS/config + set(QS_MAC_CONFIG "${PROJECT_SOURCE_DIR}/config/config.ini") + + # Icon file stored in Contents/Resources + set(QS_MAC_ICON_NAME "QtScrCpy.icns") + set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}") + + set_source_files_properties(${QS_MAC_RESOURCES} PROPERTIES + MACOSX_PACKAGE_LOCATION "MacOS" + ) + set_source_files_properties(${QS_MAC_CONFIG} PROPERTIES + MACOSX_PACKAGE_LOCATION "MacOS/config" + ) + + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + # The base plist template file + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist" + # The elements to be overwritten + MACOSX_BUNDLE_ICON_FILE "${QS_MAC_ICON_NAME}" + MACOSX_BUNDLE_BUNDLE_VERSION "${STRING_VERSION}" + MACOSX_BUNDLE_SHORT_VERSION_STRING "${STRING_VERSION}" + MACOSX_BUNDLE_LONG_VERSION_STRING "${STRING_VERSION}" + + # Copy file(s) to Contents/Resources + RESOURCE "${QS_MAC_ICON_PATH}" + ) + + set(QS_EXTERNAL_LIBS_FFMPEG + avformat.58 + avcodec.58 + avutil.56 + swscale.5 + ) + + # ========== Non-Mac Unix-like OS (Linux, BSD, etc.) ========== + else() + find_package(Threads REQUIRED) + + message(STATUS "[QtScrCpy] Make for non-Apple Unix-like OS.") + set(INSTALLED_FFMPEG_FOUND false) + + find_package(PkgConfig) + if(PkgConfig_FOUND) + pkg_check_modules(FFmpeg ffmpeg>=4) + if(FFmpeg_FOUND) + set(INSTALLED_FFMPEG_FOUND true) + message(STATUS "[QtScrCpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") + target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}") + target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}") + endif() + endif() + + if(NOT INSTALLED_FFMPEG_FOUND) + message(STATUS "[QtScrCpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.") + set(QS_EXTERNAL_LIBS_FFMPEG + avformat + avcodec + avutil + swscale + Threads::Threads + ) + endif() + endif() +endif() + +set(QS_SUBDIRECTORIES_MAIN + adb + common + device + devicemanage + fontawesome + uibase + util +) + +set(QS_TS_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/zh_CN.ts + ${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/en_US.ts + ) + +set(QS_SOURCES_MAIN + dialog.cpp + dialog.h + dialog.ui + ${QS_TS_FILES} +) + +set(QS_QRC_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/res/res.qrc") + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + if(WIN32) + qt_add_executable(${CMAKE_PROJECT_NAME} WIN32 MANUAL_FINALIZATION + main.cpp + ${QS_SOURCES_MAIN} + ${QS_QRC_MAIN} + ) + elseif(UNIX) + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + qt_add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE MANUAL_FINALIZATION + main.cpp + ${QS_SOURCES_MAIN} + ${QS_MAC_RESOURCES} + ${QS_MAC_CONFIG} + ${QS_QRC_MAIN} + ) + else() + qt_add_executable(${CMAKE_PROJECT_NAME} MANUAL_FINALIZATION + main.cpp + ${QS_SOURCES_MAIN} + ${QS_QRC_MAIN} + ) + endif() + endif() + + qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${QS_TS_FILES}) + +else() + if(WIN32) + add_executable(${CMAKE_PROJECT_NAME} WIN32 + main.cpp + ${QS_SOURCES_MAIN} + ${QS_QRC_MAIN} + ) + elseif(UNIX) + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE + main.cpp + ${QS_SOURCES_MAIN} + ${QS_MAC_RESOURCES} + ${QS_MAC_CONFIG} + ${QS_QRC_MAIN} + ) + else() + add_executable(${CMAKE_PROJECT_NAME} + main.cpp + ${QS_SOURCES_MAIN} + ${QS_QRC_MAIN} + ) + endif() + endif() + qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${QS_TS_FILES}) + +endif() + +target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(QS_SUBDIRECTORY_MAIN ${QS_SUBDIRECTORIES_MAIN}) + add_subdirectory(${QS_SUBDIRECTORY_MAIN}) +endforeach() + +target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC + adb + devicemanage + ) + +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Network + device + stream + ui + util + ) + + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(${CMAKE_PROJECT_NAME}) +endif() diff --git a/QtScrcpy/QtScrcpy.pro b/QtScrcpy/QtScrcpy.pro index e61704c..990537e 100644 --- a/QtScrcpy/QtScrcpy.pro +++ b/QtScrcpy/QtScrcpy.pro @@ -48,10 +48,6 @@ HEADERS += \ FORMS += \ dialog.ui -# 试用检查 -# DEFINES += TRIAL_EXPIRE_CHECK -DEFINES += TRIAL_TIMES=10 - # 子工程 include ($$PWD/common/common.pri) include ($$PWD/adb/adb.pri) diff --git a/QtScrcpy/adb/CMakeLists.txt b/QtScrcpy/adb/CMakeLists.txt new file mode 100755 index 0000000..3644ade --- /dev/null +++ b/QtScrcpy/adb/CMakeLists.txt @@ -0,0 +1,11 @@ +set(QS_SOURCES_ADB + adbprocess.h + adbprocess.cpp +) + +add_library(adb ${QS_SOURCES_ADB}) +target_include_directories(adb PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(adb PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + util + ) diff --git a/QtScrcpy/common/CMakeLists.txt b/QtScrcpy/common/CMakeLists.txt new file mode 100755 index 0000000..cd2b0c6 --- /dev/null +++ b/QtScrcpy/common/CMakeLists.txt @@ -0,0 +1,6 @@ +set(QS_SOURCES_COMMON + qscrcpyevent.h +) + +add_library(common INTERFACE ${QS_SOURCES_COMMON}) +target_include_directories(common INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/QtScrcpy/device/CMakeLists.txt b/QtScrcpy/device/CMakeLists.txt new file mode 100755 index 0000000..6e8b837 --- /dev/null +++ b/QtScrcpy/device/CMakeLists.txt @@ -0,0 +1,40 @@ +set(QS_SUBDIRECTORIES_DEVICE + android + controller + decoder + filehandler + recorder + render + server + stream + ui +) + +set(QS_SOURCES_DEVICE + device.h + device.cpp +) + +add_library(device ${QS_SOURCES_DEVICE}) + +target_include_directories(device PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(QS_SUBDIRECTORY_DEVICE ${QS_SUBDIRECTORIES_DEVICE}) + add_subdirectory (${QS_SUBDIRECTORY_DEVICE}) +endforeach() + +target_link_libraries(device INTERFACE inputconvert) +target_link_libraries(device PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + # device (self) + controller + decoder + filehandler + recorder + server + stream + ui + util + mousetap + ) + diff --git a/QtScrcpy/device/android/CMakeLists.txt b/QtScrcpy/device/android/CMakeLists.txt new file mode 100755 index 0000000..432d749 --- /dev/null +++ b/QtScrcpy/device/android/CMakeLists.txt @@ -0,0 +1,7 @@ +set(QS_SOURCES_DEVICE_ANDROID + input.h + keycodes.h +) + +add_library(android INTERFACE ${QS_SOURCES_DEVICE_ANDROID}) +target_include_directories(android INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/QtScrcpy/device/controller/CMakeLists.txt b/QtScrcpy/device/controller/CMakeLists.txt new file mode 100755 index 0000000..cf34254 --- /dev/null +++ b/QtScrcpy/device/controller/CMakeLists.txt @@ -0,0 +1,26 @@ +SET(QS_SUBDIRECTORIES_DEVICE_CONTROLLER + inputconvert + receiver +) + +SET(QS_SOURCES_DEVICE_CONTROLLER + controller.h + controller.cpp +) + +add_library(controller ${QS_SOURCES_DEVICE_CONTROLLER}) + +target_include_directories(controller PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(QS_SUBDIRECTORY_DEVICE_CONTROLLER ${QS_SUBDIRECTORIES_DEVICE_CONTROLLER}) + add_subdirectory (${QS_SUBDIRECTORY_DEVICE_CONTROLLER}) +endforeach() + +target_link_libraries(controller PUBLIC + inputconvert + ) +target_link_libraries(controller PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + receiver + server + ) diff --git a/QtScrcpy/device/controller/inputconvert/CMakeLists.txt b/QtScrcpy/device/controller/inputconvert/CMakeLists.txt new file mode 100755 index 0000000..2c5cd44 --- /dev/null +++ b/QtScrcpy/device/controller/inputconvert/CMakeLists.txt @@ -0,0 +1,39 @@ +SET(QS_SUBDIRECTORIES_DEVICE_CONTROLLER_INPUTCONVERT + keymap +) + +set(QS_SOURCES_DEVICE_CONTROLLER_INPUTCONVERT + controlmsg.h + controlmsg.cpp + inputconvertbase.h + inputconvertbase.cpp + inputconvertgame.h + inputconvertgame.cpp + inputconvertnormal.h + inputconvertnormal.cpp +) + +add_library(inputconvert ${QS_SOURCES_DEVICE_CONTROLLER_INPUTCONVERT}) + +target_include_directories(inputconvert PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(QS_SUBDIRECTORY_DEVICE_CONTROLLER_INPUTCONVERT ${QS_SUBDIRECTORIES_DEVICE_CONTROLLER_INPUTCONVERT}) + add_subdirectory (${QS_SUBDIRECTORY_DEVICE_CONTROLLER_INPUTCONVERT}) +endforeach() + +target_link_libraries(inputconvert PUBLIC + common + # controller + android + ) +target_link_libraries(inputconvert INTERFACE + # controller + # inputconvert (self) + keymap + ) +target_link_libraries(inputconvert PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + + controller + util + ) diff --git a/QtScrcpy/device/controller/inputconvert/keymap/CMakeLists.txt b/QtScrcpy/device/controller/inputconvert/keymap/CMakeLists.txt new file mode 100755 index 0000000..a74b052 --- /dev/null +++ b/QtScrcpy/device/controller/inputconvert/keymap/CMakeLists.txt @@ -0,0 +1,8 @@ +set(QS_SOURCES_DEVICE_CONTROLLER_INPUTCONVERT_KEYMAP + keymap.h + keymap.cpp +) + +add_library(keymap ${QS_SOURCES_DEVICE_CONTROLLER_INPUTCONVERT_KEYMAP}) +target_include_directories(keymap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(keymap PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/QtScrcpy/device/controller/receiver/CMakeLists.txt b/QtScrcpy/device/controller/receiver/CMakeLists.txt new file mode 100755 index 0000000..ee6ced2 --- /dev/null +++ b/QtScrcpy/device/controller/receiver/CMakeLists.txt @@ -0,0 +1,14 @@ +SET(QS_SOURCES_DEVICE_CONTROLLER_RECEIVER + devicemsg.h + devicemsg.cpp + receiver.h + receiver.cpp + ) + +add_library(receiver ${QS_SOURCES_DEVICE_CONTROLLER_RECEIVER}) +target_include_directories(receiver PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(receiver PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Network + util + ) diff --git a/QtScrcpy/device/decoder/CMakeLists.txt b/QtScrcpy/device/decoder/CMakeLists.txt new file mode 100755 index 0000000..b2931a2 --- /dev/null +++ b/QtScrcpy/device/decoder/CMakeLists.txt @@ -0,0 +1,21 @@ +set(QS_SOURCES_DEVICE_DECODER + avframeconvert.h + avframeconvert.cpp + decoder.h + decoder.cpp + fpscounter.h + fpscounter.cpp + videobuffer.h + videobuffer.cpp +) + +add_library(decoder ${QS_SOURCES_DEVICE_DECODER}) +target_include_directories(decoder PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/include" + ) +target_link_libraries(decoder PUBLIC ${QS_EXTERNAL_LIBS_FFMPEG}) +target_link_libraries(decoder PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + util + ) diff --git a/QtScrcpy/device/filehandler/CMakeLists.txt b/QtScrcpy/device/filehandler/CMakeLists.txt new file mode 100755 index 0000000..17de9e2 --- /dev/null +++ b/QtScrcpy/device/filehandler/CMakeLists.txt @@ -0,0 +1,9 @@ +set(QS_SOURCES_DEVICE_FILEHANDLER + filehandler.h + filehandler.cpp +) + +add_library(filehandler ${QS_SOURCES_DEVICE_FILEHANDLER}) +target_include_directories(filehandler PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(filehandler PUBLIC adb) +target_link_libraries(filehandler PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/QtScrcpy/device/recorder/CMakeLists.txt b/QtScrcpy/device/recorder/CMakeLists.txt new file mode 100755 index 0000000..12144db --- /dev/null +++ b/QtScrcpy/device/recorder/CMakeLists.txt @@ -0,0 +1,14 @@ +set(QS_SOURCES_DEVICE_RECORDER + recorder.h + recorder.cpp +) + +add_library(recorder ${QS_SOURCES_DEVICE_RECORDER}) +target_include_directories(recorder PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/include" + ) +target_link_libraries(recorder PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + util + ) diff --git a/QtScrcpy/device/render/CMakeLists.txt b/QtScrcpy/device/render/CMakeLists.txt new file mode 100755 index 0000000..ee3a140 --- /dev/null +++ b/QtScrcpy/device/render/CMakeLists.txt @@ -0,0 +1,8 @@ +set(QS_SOURCES_DEVICE_RENDER + qyuvopenglwidget.h + qyuvopenglwidget.cpp +) + +add_library(render ${QS_SOURCES_DEVICE_RENDER}) +target_include_directories(render PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(render PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/QtScrcpy/device/server/CMakeLists.txt b/QtScrcpy/device/server/CMakeLists.txt new file mode 100755 index 0000000..eb7fe84 --- /dev/null +++ b/QtScrcpy/device/server/CMakeLists.txt @@ -0,0 +1,20 @@ +set(QS_SOURCES_DEVICE_SERVER + server.h + server.cpp + tcpserver.h + tcpserver.cpp + videosocket.h + videosocket.cpp +) + +add_library(server ${QS_SOURCES_DEVICE_SERVER}) +target_include_directories(server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(server PUBLIC + Qt${QT_VERSION_MAJOR}::Network + adb + ) +target_link_libraries(server PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + common + util + ) diff --git a/QtScrcpy/device/stream/CMakeLists.txt b/QtScrcpy/device/stream/CMakeLists.txt new file mode 100755 index 0000000..469d2d3 --- /dev/null +++ b/QtScrcpy/device/stream/CMakeLists.txt @@ -0,0 +1,20 @@ +set(QS_SOURCES_DEVICE_STREAM + stream.h + stream.cpp +) + +add_library(stream ${QS_SOURCES_DEVICE_STREAM}) +target_include_directories(stream PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/include" + ) + +target_link_libraries(stream PUBLIC ${QS_EXTERNAL_LIBS_FFMPEG}) +target_link_libraries(stream PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + #controller + decoder + recorder + server + util + ) diff --git a/QtScrcpy/device/ui/CMakeLists.txt b/QtScrcpy/device/ui/CMakeLists.txt new file mode 100755 index 0000000..f8f6325 --- /dev/null +++ b/QtScrcpy/device/ui/CMakeLists.txt @@ -0,0 +1,23 @@ +set(QS_SOURCES_DEVICE_UI + toolform.h + toolform.cpp + toolform.ui + videoform.h + videoform.cpp + videoform.ui +) + +add_library(ui ${QS_SOURCES_DEVICE_UI}) +target_include_directories(ui PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(ui PRIVATE "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/include") +target_link_libraries(ui PUBLIC + device + uibase + ) +target_link_libraries(ui PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + controller + render + fontawesome + util + ) diff --git a/QtScrcpy/device/ui/videoform.cpp b/QtScrcpy/device/ui/videoform.cpp index 2d75c9a..e752768 100644 --- a/QtScrcpy/device/ui/videoform.cpp +++ b/QtScrcpy/device/ui/videoform.cpp @@ -367,16 +367,6 @@ QRect VideoForm::getScreenRect() return screenRect; } -bool VideoForm::checkTrialExpire() -{ - static int trialTimes = 0; - if (++trialTimes > TRIAL_TIMES) { - QMessageBox::warning(this, "QtScrcpy", QStringLiteral("试用已结束,购买正式版本请联系作者"), QMessageBox::Ok); - return true; - } - return false; -} - void VideoForm::updateStyleSheet(bool vertical) { if (vertical) { @@ -534,12 +524,6 @@ void VideoForm::setDevice(Device *device) void VideoForm::mousePressEvent(QMouseEvent *event) { -#ifdef TRIAL_EXPIRE_CHECK - if (checkTrialExpire()) { - return; - } -#endif - if (event->button() == Qt::MiddleButton) { if (m_device && !m_device->isCurrentCustomKeymap()) { emit m_device->postGoHome(); diff --git a/QtScrcpy/device/ui/videoform.h b/QtScrcpy/device/ui/videoform.h index 0b07c0c..bda37a4 100644 --- a/QtScrcpy/device/ui/videoform.h +++ b/QtScrcpy/device/ui/videoform.h @@ -45,7 +45,6 @@ private: void moveCenter(); void installShortcut(); QRect getScreenRect(); - bool checkTrialExpire(); protected: void mousePressEvent(QMouseEvent *event); diff --git a/QtScrcpy/devicemanage/CMakeLists.txt b/QtScrcpy/devicemanage/CMakeLists.txt new file mode 100755 index 0000000..8ce0ab7 --- /dev/null +++ b/QtScrcpy/devicemanage/CMakeLists.txt @@ -0,0 +1,13 @@ +set(QS_SOURCES_DEVICEMANAGE + devicemanage.h + devicemanage.cpp +) + +add_library(devicemanage ${QS_SOURCES_DEVICEMANAGE}) +target_include_directories(devicemanage PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(devicemanage PUBLIC device) +target_link_libraries(devicemanage PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + server + ui + ) diff --git a/QtScrcpy/fontawesome/CMakeLists.txt b/QtScrcpy/fontawesome/CMakeLists.txt new file mode 100755 index 0000000..ead0947 --- /dev/null +++ b/QtScrcpy/fontawesome/CMakeLists.txt @@ -0,0 +1,8 @@ +set(QS_SOURCES_FONTAWESOME + iconhelper.h + iconhelper.cpp +) + +add_library(fontawesome ${QS_SOURCES_FONTAWESOME}) +target_include_directories(fontawesome PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(fontawesome PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index def7be0..4a3f582 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -135,11 +135,11 @@ void installTranslator() QString languagePath = ":/i18n/"; switch (language) { case QLocale::Chinese: - languagePath += "QtScrcpy_zh.qm"; + languagePath += "zh_CN.qm"; break; case QLocale::English: default: - languagePath += "QtScrcpy_en.qm"; + languagePath += "en_US.qm"; } translator.load(languagePath); diff --git a/QtScrcpy/res/i18n/QtScrcpy_en.qm b/QtScrcpy/res/i18n/en_US.qm similarity index 100% rename from QtScrcpy/res/i18n/QtScrcpy_en.qm rename to QtScrcpy/res/i18n/en_US.qm diff --git a/QtScrcpy/res/i18n/QtScrcpy_en.ts b/QtScrcpy/res/i18n/en_US.ts similarity index 88% rename from QtScrcpy/res/i18n/QtScrcpy_en.ts rename to QtScrcpy/res/i18n/en_US.ts index 2161044..a1f7210 100644 --- a/QtScrcpy/res/i18n/QtScrcpy_en.ts +++ b/QtScrcpy/res/i18n/en_US.ts @@ -49,48 +49,48 @@ Dialog - + Wireless Wireless - + wireless connect wireless connect - + wireless disconnect wireless disconnect - + Start Config Start Config - + record save path: record save path: - + select path select path - + record format: record format: - + record screen record screen - + frameless frameless @@ -124,59 +124,59 @@ Double click to connect: - + lock orientation: lock orientation: - + show fps show fps - + stay awake stay awake - + device name: device name: device name: - + update name update name update name - + stop all server stop all server - + adb command: adb command: - + terminate terminate - + execute execute - + clear clear - + reverse connection reverse connection @@ -185,57 +185,57 @@ auto enable - + background record background record - + screen-off screen-off - + apply apply - + max size: max size: - + always on top always on top - + refresh script refresh script - + get device IP get device IP - + USB line USB line - + stop server stop server - + start server start server - + device serial: device serial: @@ -244,17 +244,17 @@ Config - + bit rate: bit rate: - + start adbd start adbd - + refresh devices refresh devices @@ -362,7 +362,7 @@ You can download it at the following address: This software is completely open source and free.\nStrictly used for illegal purposes, or at your own risk.\nYou can download it at the following address: - + 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: 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: @@ -458,7 +458,7 @@ You can download it at the following address: file transfer failed - + file does not exist file does not exist diff --git a/QtScrcpy/res/i18n/QtScrcpy_zh.qm b/QtScrcpy/res/i18n/zh_CN.qm similarity index 100% rename from QtScrcpy/res/i18n/QtScrcpy_zh.qm rename to QtScrcpy/res/i18n/zh_CN.qm diff --git a/QtScrcpy/res/i18n/QtScrcpy_zh.ts b/QtScrcpy/res/i18n/zh_CN.ts similarity index 88% rename from QtScrcpy/res/i18n/QtScrcpy_zh.ts rename to QtScrcpy/res/i18n/zh_CN.ts index 8b6fcb4..03d4256 100644 --- a/QtScrcpy/res/i18n/QtScrcpy_zh.ts +++ b/QtScrcpy/res/i18n/zh_CN.ts @@ -49,48 +49,48 @@ Dialog - + Wireless 无线 - + wireless connect 无线连接 - + wireless disconnect 无线断开 - + Start Config 启动配置 - + record save path: 录像保存路径: - + select path 选择路径 - + record format: 录制格式: - + record screen 录制屏幕 - + frameless 无边框 @@ -124,59 +124,59 @@ 双击连接: - + lock orientation: 锁定方向: - + show fps 显示fps - + stay awake 保持唤醒 - + device name: 设备名称: 设备名称: - + update name 更新设置名称 更新设置名称 - + stop all server 停止所有服务 - + adb command: adb命令: - + terminate 终止 - + execute 执行 - + clear 清理 - + reverse connection 反向连接 @@ -185,57 +185,57 @@ 自动启用脚本 - + background record 后台录制 - + screen-off 自动息屏 - + apply 应用脚本 - + max size: 最大尺寸: - + always on top 窗口置顶 - + refresh script 刷新脚本 - + get device IP 获取设备IP - + USB line USB线 - + stop server 停止服务 - + start server 启动服务 - + device serial: 设备序列号: @@ -244,17 +244,17 @@ 配置 - + bit rate: 比特率: - + start adbd 启动adbd - + refresh devices 刷新设备列表 @@ -362,7 +362,7 @@ You can download it at the following address: 本软件完全开源免费.\n严禁用于非法用途,否则后果自负.\n你可以在下面地址下载: - + 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: 本软件完全开源免费,严禁用于非法用途,否则后果自负,你可以在下面地址下载: @@ -458,7 +458,7 @@ You can download it at the following address: 文件传输失败 - + file does not exist 文件不存在 diff --git a/QtScrcpy/res/res.qrc b/QtScrcpy/res/res.qrc index d2f53a4..05b447f 100644 --- a/QtScrcpy/res/res.qrc +++ b/QtScrcpy/res/res.qrc @@ -22,8 +22,8 @@ qss/psblack/radiobutton_checked_disable.png qss/psblack/radiobutton_unchecked.png qss/psblack/radiobutton_unchecked_disable.png - i18n/QtScrcpy_en.qm - i18n/QtScrcpy_zh.qm + i18n/en_US.qm + i18n/zh_CN.qm image/tray/logo.png diff --git a/QtScrcpy/uibase/CMakeLists.txt b/QtScrcpy/uibase/CMakeLists.txt new file mode 100755 index 0000000..861883a --- /dev/null +++ b/QtScrcpy/uibase/CMakeLists.txt @@ -0,0 +1,10 @@ +set(QS_SOURCES_UIBASE + keepratiowidget.h + keepratiowidget.cpp + magneticwidget.h + magneticwidget.cpp +) + +add_library(uibase ${QS_SOURCES_UIBASE}) +target_include_directories(uibase PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(uibase PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/QtScrcpy/util/CMakeLists.txt b/QtScrcpy/util/CMakeLists.txt new file mode 100755 index 0000000..2d92d13 --- /dev/null +++ b/QtScrcpy/util/CMakeLists.txt @@ -0,0 +1,21 @@ +set(QS_SUBDIRECTORIES_UTIL + mousetap +) + +set(QS_SOURCES_UTIL + bufferutil.h + bufferutil.cpp + compat.h + config.h + config.cpp +) + +add_library(util ${QS_SOURCES_UTIL}) + +target_include_directories(util PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(QS_SUBDIRECTORY_UTIL ${QS_SUBDIRECTORIES_UTIL}) + add_subdirectory (${QS_SUBDIRECTORY_UTIL}) +endforeach() + +target_link_libraries(util PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/QtScrcpy/util/mousetap/CMakeLists.txt b/QtScrcpy/util/mousetap/CMakeLists.txt new file mode 100755 index 0000000..846851b --- /dev/null +++ b/QtScrcpy/util/mousetap/CMakeLists.txt @@ -0,0 +1,50 @@ +set(QS_SOURCES_UTIL_MOUSETAP + mousetap.h + mousetap.cpp +) + +# Microsoft Windows +if(WIN32) + + list(APPEND QS_SOURCES_UTIL_MOUSETAP + winmousetap.h + winmousetap.cpp + ) + set(QS_EXTERNAL_LIBS_UTIL_MOUSETAP User32) + +elseif(UNIX) +# macOS + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + + find_library(APPKIT AppKit REQUIRED) + set(QS_EXTERNAL_LIBS_UTIL_MOUSETAP ${APPKIT}) + + list(APPEND QS_SOURCES_UTIL_MOUSETAP + cocoamousetap.h + cocoamousetap.mm + ) + + target_compile_options(mousetap "-mmacosx-version-min=10.6") + + # Linux, BSD, etc. + else() + + find_package(QT NAMES Qt6 Qt5 COMPONENTS X11Extras REQUIRED) + find_package(Qt${QT_VERSION_MAJOR} COMPONENTS X11Extras REQUIRED) + set(QS_EXTERNAL_LIBS_UTIL_MOUSETAP + Qt${QT_VERSION_MAJOR}::X11Extras + xcb + ) + + list(APPEND QS_SOURCES_UTIL_MOUSETAP + xmousetap.h + xmousetap.cpp + ) + + endif() +endif() + +add_library(mousetap ${QS_SOURCES_UTIL_MOUSETAP}) +target_link_libraries(mousetap PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + ${QS_EXTERNAL_LIBS_UTIL_MOUSETAP}) diff --git a/QtScrcpy/version b/QtScrcpy/version index 77d6f4c..dc1e644 100644 --- a/QtScrcpy/version +++ b/QtScrcpy/version @@ -1 +1 @@ -0.0.0 +1.6.0 diff --git a/README.md b/README.md index 8d6ea46..2ea53ab 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ cross-platform|self implemented|provided by Qt language|C|C++ style|sync|async keymap|no custom keymap|support custom keymap -build|meson+gradle|Qt Creator +build|meson+gradle|qmake or CMake - It's very easy to customize your GUI with Qt - Asynchronous programming of Qt-based signal slot mechanism improves performance @@ -246,9 +246,9 @@ There are several reasons listed as below according to importance (high to low). All the dependencies are provided and it is easy to compile. ### PC client -1. Set up the Qt development environment on the target platform (Qt == 5.15.2, vs == 2019 (mingw not supported)) +1. Set up the Qt development environment on the target platform (Qt == 5.15.2, VS == 2019, MinGW not supported) 2. Clone the project -3. Open the project root directory all.pro with QtCreator +3. Open the project root directory `all.pro` or `CMakeLists.txt` with QtCreator 4. Compile and run ### Android (If you do not have special requirements, you can directly use the built-in scrcpy-server.jar) @@ -310,4 +310,4 @@ Support this project with your organization. Your logo will show up here with a - \ No newline at end of file + diff --git a/README_zh.md b/README_zh.md index 4aba9f1..c684dd0 100644 --- a/README_zh.md +++ b/README_zh.md @@ -69,7 +69,7 @@ QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和 编程语言|C|C++ 编程方式|同步|异步 按键映射|不支持自定义|支持自定义按键映射 -编译方式|meson+gradle|Qt Creator +编译方式|meson+gradle|qmake or CMake - 使用Qt可以非常容易的定制自己的界面 - 基于Qt的信号槽机制的异步编程提高性能 @@ -243,9 +243,9 @@ Mac OS平台,你可以直接使用我编译好的可执行程序: 尽量提供了所有依赖资源,方便傻瓜式编译。 ### PC端 -1. 目标平台上搭建Qt开发环境(Qt == 5.15.2, vs == 2019 (**不支持mingw**)) +1. 目标平台上搭建Qt开发环境(Qt == 5.15.2, VS == 2019 (**不支持MinGW**)) 2. 克隆该项目 -3. 使用QtCreator打开项目根目录all.pro +3. 使用QtCreator打开项目根目录`all.pro`或`CMakeLists.txt` 4. 编译,运行即可 ### Android端 (没有修改需求的话直接使用自带的scrcpy-server即可) @@ -276,4 +276,4 @@ Mac OS平台,你可以直接使用我编译好的可执行程序: [Barry的CSDN](https://blog.csdn.net/rankun1) -一枚普通的程序员,工作中主要使用C++进行桌面客户端开发,一毕业在山东做过一年多钢铁仿真教育软件,后来转战上海先后从事安防,在线教育相关领域工作,对音视频比较熟悉,对音视频领域如语音通话,直播教育,视频会议等相关解决方案有所了解。同时具有android,linux服务器等开发经验。 \ No newline at end of file +一枚普通的程序员,工作中主要使用C++进行桌面客户端开发,一毕业在山东做过一年多钢铁仿真教育软件,后来转战上海先后从事安防,在线教育相关领域工作,对音视频比较熟悉,对音视频领域如语音通话,直播教育,视频会议等相关解决方案有所了解。同时具有android,linux服务器等开发经验。 diff --git a/all.pro b/all.pro index aa4e301..86c354d 100644 --- a/all.pro +++ b/all.pro @@ -3,5 +3,5 @@ SUBDIRS = QtScrcpy # 多语言翻译文件 TRANSLATIONS = \ - $$PWD/QtScrcpy/res/i18n/QtScrcpy_zh.ts \ - $$PWD/QtScrcpy/res/i18n/QtScrcpy_en.ts + $$PWD/QtScrcpy/res/i18n/zh_CN.ts \ + $$PWD/QtScrcpy/res/i18n/en_US.ts From cc87b204b21d5257891b8aedc6dcaf29a92d6c5f Mon Sep 17 00:00:00 2001 From: Zhang Xiang Date: Tue, 22 Jun 2021 08:48:52 +0800 Subject: [PATCH 07/15] Fix CMake problems about output path and qm files generation --- QtScrcpy/CMakeLists.txt | 74 +++++++++++++++++++----------- QtScrcpy/main.cpp | 10 ++--- QtScrcpy/res/i18n/en_US.qm | Bin 5300 -> 4808 bytes QtScrcpy/res/i18n/en_US.ts | 81 +++------------------------------ QtScrcpy/res/i18n/zh_CN.qm | Bin 4121 -> 4095 bytes QtScrcpy/res/i18n/zh_CN.ts | 89 +------------------------------------ 6 files changed, 59 insertions(+), 195 deletions(-) diff --git a/QtScrcpy/CMakeLists.txt b/QtScrcpy/CMakeLists.txt index 41ea0d5..dab412e 100755 --- a/QtScrcpy/CMakeLists.txt +++ b/QtScrcpy/CMakeLists.txt @@ -20,7 +20,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # ffmpeg cannot be compiled natively by MSVC version < 12.0 (2013) if(MSVC_VERSION LESS 1800) - message(FATAL_ERROR "[QtScrCpy] FATAL ERROR: MSVC version is older than 12.0 (2013).") + message(FATAL_ERROR "[QtScrcpy] FATAL ERROR: MSVC version is older than 12.0 (2013).") endif() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8") @@ -30,7 +30,8 @@ endif() # ******************** Microsoft Windows ******************** if(WIN32) - message(STATUS "[QtScrCpy] Make for Microsoft Windows.") + message(STATUS "[QtScrcpy] Make for Microsoft Windows.") + # 通过rc的方式的话,VERSION变量rc中获取不到,定义为宏方便rc中使用 # Define macros for .rc file add_compile_definitions( @@ -41,11 +42,21 @@ if(WIN32) ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit - message(STATUS "[QtScrCpy] 64-bit compiler detected.") + message(STATUS "[QtScrcpy] 64-bit compiler detected.") set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/debug") + else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release") + endif() elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit - message(STATUS "[QtScrCpy] 32-bit compiler detected.") + message(STATUS "[QtScrcpy] 32-bit compiler detected.") set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/debug") + else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release") + endif() endif() link_directories(${QS_DLL_PATH}) @@ -67,7 +78,7 @@ if(WIN32) swscale ) - set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrCpy.rc") + set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrcpy.rc") # ******************** Unix-like OSs ******************** elseif(UNIX) @@ -76,10 +87,16 @@ elseif(UNIX) # ==================== macOS ==================== if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - message(STATUS "[QtScrCpy] Make for macOS.") + message(STATUS "[QtScrcpy] Make for macOS.") + + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug") + else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release") + endif() # QS_MAC_RESOURCES: esource file list stored in Contents/MacOS - file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib)") + file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib") list(APPEND QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/scrcpy-server" "${PROJECT_SOURCE_DIR}/adb/mac/adb" @@ -89,7 +106,7 @@ elseif(UNIX) set(QS_MAC_CONFIG "${PROJECT_SOURCE_DIR}/config/config.ini") # Icon file stored in Contents/Resources - set(QS_MAC_ICON_NAME "QtScrCpy.icns") + set(QS_MAC_ICON_NAME "QtScrcpy.icns") set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}") set_source_files_properties(${QS_MAC_RESOURCES} PROPERTIES @@ -121,9 +138,15 @@ elseif(UNIX) # ========== Non-Mac Unix-like OS (Linux, BSD, etc.) ========== else() + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug") + else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release") + endif() + find_package(Threads REQUIRED) - message(STATUS "[QtScrCpy] Make for non-Apple Unix-like OS.") + message(STATUS "[QtScrcpy] Make for non-Apple Unix-like OS.") set(INSTALLED_FFMPEG_FOUND false) find_package(PkgConfig) @@ -131,14 +154,14 @@ elseif(UNIX) pkg_check_modules(FFmpeg ffmpeg>=4) if(FFmpeg_FOUND) set(INSTALLED_FFMPEG_FOUND true) - message(STATUS "[QtScrCpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") + message(STATUS "[QtScrcpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}") target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}") endif() endif() if(NOT INSTALLED_FFMPEG_FOUND) - message(STATUS "[QtScrCpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.") + message(STATUS "[QtScrcpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.") set(QS_EXTERNAL_LIBS_FFMPEG avformat avcodec @@ -150,20 +173,11 @@ elseif(UNIX) endif() endif() -set(QS_SUBDIRECTORIES_MAIN - adb - common - device - devicemanage - fontawesome - uibase - util -) - set(QS_TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/zh_CN.ts ${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/en_US.ts ) +set_source_files_properties(${QS_TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/res/i18n") set(QS_SOURCES_MAIN dialog.cpp @@ -174,7 +188,9 @@ set(QS_SOURCES_MAIN set(QS_QRC_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/res/res.qrc") -if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6 + qt_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES}) + if(WIN32) qt_add_executable(${CMAKE_PROJECT_NAME} WIN32 MANUAL_FINALIZATION main.cpp @@ -199,9 +215,9 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) endif() endif() - qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${QS_TS_FILES}) +else() # Qt version 5 + qt5_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES}) -else() if(WIN32) add_executable(${CMAKE_PROJECT_NAME} WIN32 main.cpp @@ -225,12 +241,20 @@ else() ) endif() endif() - qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${QS_TS_FILES}) endif() target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +set(QS_SUBDIRECTORIES_MAIN + adb + common + device + devicemanage + fontawesome + uibase + util +) foreach(QS_SUBDIRECTORY_MAIN ${QS_SUBDIRECTORIES_MAIN}) add_subdirectory(${QS_SUBDIRECTORY_MAIN}) endforeach() diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index 4a3f582..21e9dc2 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -108,13 +108,9 @@ int main(int argc, char *argv[]) g_mainDlg->setWindowTitle(Config::getInstance().getTitle()); g_mainDlg->show(); - qInfo( - "%s", - 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() - .data()); - qInfo() << QString("QtScrcpy %1 ").arg(QCoreApplication::applicationVersion()).toUtf8(); + qInfo() << QObject::tr("This software is completely open source and free. Use it at your own risk. You can download it at the " + "following address:"); + qInfo() << QString("QtScrcpy %1 ").arg(QCoreApplication::applicationVersion()); int ret = a.exec(); diff --git a/QtScrcpy/res/i18n/en_US.qm b/QtScrcpy/res/i18n/en_US.qm index 32fa7302b8384a4d26db165ddc6ad34db69ba0c9..b0be36628bcb5a55c9d03fc0425479fa3e16737b 100644 GIT binary patch delta 166 zcmdm@c|vu9oT3H;YYz(p15*tH>$VsM2HsExwr{2k416^V>^7kc417x`+KVyqr%w!* z6XH9^(4*oT32(YYz(p15*tH>$VsM27XHhwr{2k3<3!Z>^7kc3<8}K?Zub`y(fmt z2?=as=+Sg$U|^ZbX!+Cg91YV1IW+eON$ip%kvb9 zGK;hI6e9CW6_OM46jJib^K$YNQxq~wK&nbIQWetjb8_;_GxO3F5>rx&Qj3eN*cliY S*aQ8OvQm>vHZS1UUfile transfer failed - install apk install apk - file transfer file transfer - wait current %1 to complete wait current %1 to complete - %1 complete, save in %2 %1 complete, save in %2 @@ -41,7 +37,6 @@ %1 complete\n save in %2 - %1 failed %1 failed @@ -49,134 +44,108 @@ Dialog - Wireless Wireless - wireless connect wireless connect - wireless disconnect wireless disconnect - Start Config Start Config - record save path: record save path: - - select path select path - record format: record format: - record screen record screen - frameless frameless - Use Simple Mode Use Simple Mode Use Simple Mode - Simple Mode Simple Mode Simple Mode - WIFI Connect WIFI Connect WIFI Connect - USB Connect USB Connect USB Connect - Double click to connect: Double click to connect: - lock orientation: lock orientation: - show fps show fps - stay awake stay awake - device name: device name: device name: - update name update name update name - stop all server stop all server - adb command: adb command: - terminate terminate - execute execute - clear clear - reverse connection reverse connection @@ -185,57 +154,46 @@ auto enable - background record background record - screen-off screen-off - apply apply - max size: max size: - always on top always on top - refresh script refresh script - get device IP get device IP - USB line USB line - stop server stop server - start server start server - device serial: device serial: @@ -244,80 +202,66 @@ Config - bit rate: bit rate: - start adbd start adbd - refresh devices refresh devices - show show show - quit quit quit - original original - no lock no lock - warning Warning Warning - Quit or set tray? Quit or set tray? Quit or set tray? - Quit Quit Quit - Set tray Set tray Set tray - Cancel Cancel Cancel - Notice Notice Notice - Hidden here! Hidden here! Hidden here! @@ -326,17 +270,14 @@ InputConvertGame - current keymap mode: %1 - custom - normal @@ -344,7 +285,6 @@ KeyMap - Script updated, current keymap mode:normal, Press ~ key to switch keymap mode @@ -362,25 +302,25 @@ You can download it at the following address: This software is completely open source and free.\nStrictly used for illegal purposes, or at your own risk.\nYou can download it at the following address: - 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: - 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: + 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: + + + This software is completely open source and free. Use it at your own risk. You can download it at the following address: + ToolForm - Tool Tool - full screen full screen - expand notify expand notify @@ -393,52 +333,42 @@ You can download it at the following address: turn on - touch switch touch switch - close screen close screen - power power - volume up volume up - volume down volume down - app switch app switch - menu menu - home home - return return - screen shot screen shot @@ -458,7 +388,6 @@ You can download it at the following address: file transfer failed - file does not exist file does not exist diff --git a/QtScrcpy/res/i18n/zh_CN.qm b/QtScrcpy/res/i18n/zh_CN.qm index e8b1e2163287a218a0f30fb2929e4debeaafba48..a4c59488f8a70537555d48758b1c1f8355eee349 100644 GIT binary patch delta 253 zcmbQK@Lzs{o}eWI+c#4N1|As(cAHQJ1|H{$_Tr2WCx*)lW-#<n7ol%{!V6r@u3FGR`Axx26(E;f? z{rP_1qI&`};u-QL1p4+`{^#+JX<+r^jsEFhU#ijl6eRDryi~rd#g8F~J%lfPPOp5g zvH_ESLhyUPr{NlYPyM*V4Z(<2Ll6l1^Y9tM+^*{cI@9h;}{rtxF*LlrZe7{ ze4J5U@;uM$HAfj3Sgm>9TX``sFxvCHKib8>z!f_AJEJ;d*JODn6UL*PLzp7DLcP*; z`t$w1MfU_|#53eg2=wi>{Lka3TG?2t;nz1kF6U~g#src7JRxd9k|BKQa~fau%Kzu_ zPY8bR_cUC?k9&GjxIwssA9sH(gB1q@0|Nsa0|Ud1$sD{!YQZH%naL$Nl?tWBsVNF+ h`9%tuIXS86i8%@dr9}n##i_+Q3i(Bw9eDRM0RRI!S-AiJ diff --git a/QtScrcpy/res/i18n/zh_CN.ts b/QtScrcpy/res/i18n/zh_CN.ts index 03d4256..0c67d3a 100644 --- a/QtScrcpy/res/i18n/zh_CN.ts +++ b/QtScrcpy/res/i18n/zh_CN.ts @@ -16,22 +16,18 @@ 文件传输失败 - install apk 安装apk - file transfer 文件传输 - wait current %1 to complete 等待当前%1完成 - %1 complete, save in %2 %1完成,保存在%2 @@ -41,7 +37,6 @@ %1完成\n 保存在 %2 - %1 failed %1 失败 @@ -49,134 +44,108 @@ Dialog - Wireless 无线 - wireless connect 无线连接 - wireless disconnect 无线断开 - Start Config 启动配置 - record save path: 录像保存路径: - - select path 选择路径 - record format: 录制格式: - record screen 录制屏幕 - frameless 无边框 - Use Simple Mode 启用精简模式 启用精简模式 - Simple Mode 精简模式 精简模式 - WIFI Connect 一键WIFI连接 一键WIFI连接 - USB Connect 一键USB连接 一键USB连接 - Double click to connect: 双击连接: - lock orientation: 锁定方向: - show fps 显示fps - stay awake 保持唤醒 - device name: 设备名称: 设备名称: - update name 更新设置名称 更新设置名称 - stop all server 停止所有服务 - adb command: adb命令: - terminate 终止 - execute 执行 - clear 清理 - reverse connection 反向连接 @@ -185,57 +154,46 @@ 自动启用脚本 - background record 后台录制 - screen-off 自动息屏 - apply 应用脚本 - max size: 最大尺寸: - always on top 窗口置顶 - refresh script 刷新脚本 - get device IP 获取设备IP - USB line USB线 - stop server 停止服务 - start server 启动服务 - device serial: 设备序列号: @@ -244,80 +202,66 @@ 配置 - bit rate: 比特率: - start adbd 启动adbd - refresh devices 刷新设备列表 - show 显示 显示 - quit 退出 退出 - original 原始 - no lock 不锁定 - warning 警告 警告 - Quit or set tray? 退出还是最小化到托盘? 退出还是最小化到托盘? - Quit 退出 退出 - Set tray 最小化到系统托盘 最小化到系统托盘 - Cancel 取消 取消 - Notice 提示 提示 - Hidden here! 安卓录屏程序隐藏在这! 安卓录屏程序隐藏在这! @@ -326,17 +270,14 @@ InputConvertGame - current keymap mode: %1 - custom - normal @@ -344,7 +285,6 @@ KeyMap - Script updated, current keymap mode:normal, Press ~ key to switch keymap mode @@ -352,35 +292,21 @@ QObject - This software is completely open source and free, you can download it at the following address: - 本软件完全开源免费,你可以在下面的地址下载: - - - 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: - 本软件完全开源免费.\n严禁用于非法用途,否则后果自负.\n你可以在下面地址下载: - - - - 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: - 本软件完全开源免费,严禁用于非法用途,否则后果自负,你可以在下面地址下载: + This software is completely open source and free. Use it at your own risk. You can download it at the following address: + 本软件完全开源免费,作者不对使用该软件产生的一切后果负责。你可以在以下地址下载: ToolForm - Tool 工具 - full screen 全屏 - expand notify 下拉通知 @@ -393,52 +319,42 @@ You can download it at the following address: 解锁 - touch switch 触摸显示开关 - close screen 关闭屏幕 - power 电源 - volume up 音量加 - volume down 音量减 - app switch 切换应用 - menu 菜单 - home 主界面 - return 返回 - screen shot 截图 @@ -458,7 +374,6 @@ You can download it at the following address: 文件传输失败 - file does not exist 文件不存在 From 6547dc07ce393bb366a04e7d7b393da3db83614d Mon Sep 17 00:00:00 2001 From: ZXfxSIE Date: Thu, 24 Jun 2021 13:06:42 +0800 Subject: [PATCH 08/15] Fix several problems concerning CMake --- QtScrcpy/CMakeLists.txt | 321 ++++++++++++++++++++++------------------ README.md | 5 +- README_zh.md | 7 +- 3 files changed, 185 insertions(+), 148 deletions(-) diff --git a/QtScrcpy/CMakeLists.txt b/QtScrcpy/CMakeLists.txt index dab412e..0d55598 100755 --- a/QtScrcpy/CMakeLists.txt +++ b/QtScrcpy/CMakeLists.txt @@ -18,7 +18,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network LinguistTools REQU if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # ffmpeg cannot be compiled natively by MSVC version < 12.0 (2013) + # FFmpeg cannot be compiled natively by MSVC version < 12.0 (2013) if(MSVC_VERSION LESS 1800) message(FATAL_ERROR "[QtScrcpy] FATAL ERROR: MSVC version is older than 12.0 (2013).") endif() @@ -28,149 +28,18 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") endif() -# ******************** Microsoft Windows ******************** -if(WIN32) - message(STATUS "[QtScrcpy] Make for Microsoft Windows.") - # 通过rc的方式的话,VERSION变量rc中获取不到,定义为宏方便rc中使用 - # Define macros for .rc file - add_compile_definitions( - VERSION_MAJOR=${VERSION_MAJOR} - VERSION_MINOR=${VERSION_MINOR} - VERSION_PATCH=${VERSION_PATCH} - VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\" - ) - - if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit - message(STATUS "[QtScrcpy] 64-bit compiler detected.") - set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64") - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/debug") - else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release") - endif() - elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit - message(STATUS "[QtScrcpy] 32-bit compiler detected.") - set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86") - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/debug") - else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release") - endif() - endif() - - link_directories(${QS_DLL_PATH}) - - # 构建完成后复制DLL依赖库 - # Copy DLL dependencies after building - file(GLOB QS_DLL_FILES "${QS_DLL_PATH}/*.dll") - foreach(QS_DLL_FILE ${QS_DLL_FILES}) - add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND - ${CMAKE_COMMAND} -E copy_if_different - "${QS_DLL_FILE}" "${PROJECT_BINARY_DIR}" - ) - endforeach() - - set(QS_EXTERNAL_LIBS_FFMPEG - avformat - avcodec - avutil - swscale +# ==================== macOS ==================== +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + # QS_MAC_RESOURCES: esource file list stored in Contents/MacOS + file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib") + list(APPEND QS_MAC_RESOURCES + "${PROJECT_SOURCE_DIR}/third_party/scrcpy-server" + "${PROJECT_SOURCE_DIR}/adb/mac/adb" ) - set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrcpy.rc") - -# ******************** Unix-like OSs ******************** -elseif(UNIX) - set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib") - link_directories(${QS_LIB_PATH}) - - # ==================== macOS ==================== - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - message(STATUS "[QtScrcpy] Make for macOS.") - - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug") - else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release") - endif() - - # QS_MAC_RESOURCES: esource file list stored in Contents/MacOS - file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib") - list(APPEND QS_MAC_RESOURCES - "${PROJECT_SOURCE_DIR}/third_party/scrcpy-server" - "${PROJECT_SOURCE_DIR}/adb/mac/adb" - ) - - # QS_MAC_CONFIG: Config file stored in Contents/MacOS/config - set(QS_MAC_CONFIG "${PROJECT_SOURCE_DIR}/config/config.ini") - - # Icon file stored in Contents/Resources - set(QS_MAC_ICON_NAME "QtScrcpy.icns") - set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}") - - set_source_files_properties(${QS_MAC_RESOURCES} PROPERTIES - MACOSX_PACKAGE_LOCATION "MacOS" - ) - set_source_files_properties(${QS_MAC_CONFIG} PROPERTIES - MACOSX_PACKAGE_LOCATION "MacOS/config" - ) - - set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES - # The base plist template file - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist" - # The elements to be overwritten - MACOSX_BUNDLE_ICON_FILE "${QS_MAC_ICON_NAME}" - MACOSX_BUNDLE_BUNDLE_VERSION "${STRING_VERSION}" - MACOSX_BUNDLE_SHORT_VERSION_STRING "${STRING_VERSION}" - MACOSX_BUNDLE_LONG_VERSION_STRING "${STRING_VERSION}" - - # Copy file(s) to Contents/Resources - RESOURCE "${QS_MAC_ICON_PATH}" - ) - - set(QS_EXTERNAL_LIBS_FFMPEG - avformat.58 - avcodec.58 - avutil.56 - swscale.5 - ) - - # ========== Non-Mac Unix-like OS (Linux, BSD, etc.) ========== - else() - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug") - else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release") - endif() - - find_package(Threads REQUIRED) - - message(STATUS "[QtScrcpy] Make for non-Apple Unix-like OS.") - set(INSTALLED_FFMPEG_FOUND false) - - find_package(PkgConfig) - if(PkgConfig_FOUND) - pkg_check_modules(FFmpeg ffmpeg>=4) - if(FFmpeg_FOUND) - set(INSTALLED_FFMPEG_FOUND true) - message(STATUS "[QtScrcpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") - target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}") - target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}") - endif() - endif() - - if(NOT INSTALLED_FFMPEG_FOUND) - message(STATUS "[QtScrcpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.") - set(QS_EXTERNAL_LIBS_FFMPEG - avformat - avcodec - avutil - swscale - Threads::Threads - ) - endif() - endif() + # QS_MAC_CONFIG: Config file stored in Contents/MacOS/config + set(QS_MAC_CONFIG "${PROJECT_SOURCE_DIR}/config/config.ini") endif() set(QS_TS_FILES @@ -188,7 +57,7 @@ set(QS_SOURCES_MAIN set(QS_QRC_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/res/res.qrc") -if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6 +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6 qt_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES}) if(WIN32) @@ -197,6 +66,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6 ${QS_SOURCES_MAIN} ${QS_QRC_MAIN} ) + elseif(UNIX) if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") qt_add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE MANUAL_FINALIZATION @@ -206,16 +76,18 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6 ${QS_MAC_CONFIG} ${QS_QRC_MAIN} ) + else() qt_add_executable(${CMAKE_PROJECT_NAME} MANUAL_FINALIZATION main.cpp ${QS_SOURCES_MAIN} ${QS_QRC_MAIN} ) + endif() endif() -else() # Qt version 5 +else() # Qt version 5 qt5_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES}) if(WIN32) @@ -244,6 +116,169 @@ else() # Qt version 5 endif() +# ******************** Microsoft Windows ******************** +if(WIN32) + message(STATUS "[QtScrcpy] Make for Microsoft Windows.") + + # 通过rc的方式的话,VERSION变量rc中获取不到,定义为宏方便rc中使用 + # Define macros for .rc file + add_compile_definitions( + VERSION_MAJOR=${VERSION_MAJOR} + VERSION_MINOR=${VERSION_MINOR} + VERSION_PATCH=${VERSION_PATCH} + VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\" + ) + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit + message(STATUS "[QtScrcpy] 64-bit compiler detected.") + + set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + message(STATUS "[QtScrcpy] In debug mode.") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/debug" + ) + else() + message(STATUS "[QtScrcpy] In release mode.") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release") + endif() + + set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/bin/x64") + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit + message(STATUS "[QtScrcpy] 32-bit compiler detected.") + + set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + message(STATUS "[QtScrcpy] In debug mode.") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/debug") + else() + message(STATUS "[QtScrcpy] In release mode.") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release") + endif() + + set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/bin/x86") + endif() + + # 构建完成后复制DLL依赖库 + # Copy DLL dependencies after building + get_target_property(QS_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY) + file(GLOB QS_DLL_FILES "${QS_DLL_PATH}/*.dll") + foreach(QS_DLL_FILE ${QS_DLL_FILES}) + add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND + ${CMAKE_COMMAND} -E copy_if_different + "${QS_DLL_FILE}" "${QS_RUNTIME_OUTPUT_DIRECTORY}" + ) + endforeach() + + # If MinGW is used, it is not appropriate to link static MSVC libs. + # Instead, we link DLLs directly + if(MSVC) + message(STATUS "[QtScrcpy] Microsoft Visual C++ is used.") + link_directories(${QS_LIB_PATH}) + set(QS_EXTERNAL_LIBS_FFMPEG + avformat + avcodec + avutil + swscale + ) + elseif(MINGW) + message(STATUS "[QtScrcpy] MinGW GCC is used.") + target_link_options(${CMAKE_PROJECT_NAME} PRIVATE + "-static" + ${QS_DLL_FILES} + "-Wl,--enable-stdcall-fixup" + ) + endif() + + set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrcpy.rc") + +# ******************** Unix-like OSs ******************** +elseif(UNIX) + set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib") + link_directories(${QS_LIB_PATH}) + + # ==================== macOS ==================== + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + message(STATUS "[QtScrcpy] Make for macOS.") + + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug") + else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release") + endif() + + # Icon file stored in Contents/Resources + set(QS_MAC_ICON_NAME "QtScrcpy.icns") + set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}") + + set_source_files_properties(${QS_MAC_RESOURCES} PROPERTIES + MACOSX_PACKAGE_LOCATION "MacOS" + ) + set_source_files_properties(${QS_MAC_CONFIG} PROPERTIES + MACOSX_PACKAGE_LOCATION "MacOS/config" + ) + + set(QS_EXTERNAL_LIBS_FFMPEG + avformat.58 + avcodec.58 + avutil.56 + swscale.5 + ) + + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + # The base plist template file + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist" + # The elements to be overwritten + MACOSX_BUNDLE_ICON_FILE "${QS_MAC_ICON_NAME}" + MACOSX_BUNDLE_BUNDLE_VERSION "${STRING_VERSION}" + MACOSX_BUNDLE_SHORT_VERSION_STRING "${STRING_VERSION}" + MACOSX_BUNDLE_LONG_VERSION_STRING "${STRING_VERSION}" + + # Copy file(s) to Contents/Resources + RESOURCE "${QS_MAC_ICON_PATH}" + ) + + # =============== Non-Mac OSs (Linux, BSD, etc.) =============== + else() + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug") + else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release") + endif() + + find_package(Threads REQUIRED) + + message(STATUS "[QtScrcpy] Make for non-Apple Unix-like OS.") + set(INSTALLED_FFMPEG_FOUND false) + + find_package(PkgConfig) + if(PkgConfig_FOUND) + pkg_check_modules(FFmpeg ffmpeg>=4) + if(FFmpeg_FOUND) + set(INSTALLED_FFMPEG_FOUND true) + message(STATUS "[QtScrcpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") + target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}") + target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}") + set(QS_EXTERNAL_LIBS_FFMPEG PkgConfig::FFmpeg) + endif() + endif() + + if(NOT INSTALLED_FFMPEG_FOUND) + message(STATUS "[QtScrcpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.") + set(QS_EXTERNAL_LIBS_FFMPEG + avformat + avcodec + avutil + swscale + Threads::Threads + ) + endif() + endif() +endif() + target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) set(QS_SUBDIRECTORIES_MAIN diff --git a/README.md b/README.md index 2ea53ab..1b461b9 100644 --- a/README.md +++ b/README.md @@ -246,7 +246,8 @@ There are several reasons listed as below according to importance (high to low). All the dependencies are provided and it is easy to compile. ### PC client -1. Set up the Qt development environment on the target platform (Qt == 5.15.2, VS == 2019, MinGW not supported) +1. Set up the Qt development environment on the target platform. +An Up-to-date Qt5 (i.e. 5.15.2 or later) is recommended. For Windows, you can choose MSVC 2019 or MinGW 8.1.0, but please be noted that currently only **CMake** scripts support MinGW. 2. Clone the project 3. Open the project root directory `all.pro` or `CMakeLists.txt` with QtCreator 4. Compile and run @@ -280,7 +281,7 @@ Since it is based on scrcpy, respect its Licence [Barry CSDN](https://blog.csdn.net/rankun1) -An ordinary programmer, working mainly in C++ for desktop client development, graduated from Shandong for more than a year of steel simulation education software, and later moved to Shanghai to work in security, online education related fields, familiar with audio and video. I have an understanding of audio and video fields such as voice calls, live education, video conferencing and other related solutions. At the same time have android, linux server and other development experience. +An ordinary programmer, working mainly in C++ for desktop client development, graduated from Shandong for more than a year of steel simulation education software, and later moved to Shanghai to work in security, online education related fields, familiar with audio and video. I have an understanding of audio and video fields such as voice calls, live education, video conferencing and other related solutions. I also have experience in Android, Linux server and other kinds of development. ## Contributors diff --git a/README_zh.md b/README_zh.md index c684dd0..7e04c8f 100644 --- a/README_zh.md +++ b/README_zh.md @@ -243,10 +243,11 @@ Mac OS平台,你可以直接使用我编译好的可执行程序: 尽量提供了所有依赖资源,方便傻瓜式编译。 ### PC端 -1. 目标平台上搭建Qt开发环境(Qt == 5.15.2, VS == 2019 (**不支持MinGW**)) +1. 在目标平台上搭建Qt开发环境 +我们建议使用最新的Qt5版本(5.15.2或更高)。在Windows上你可以自由选择MSVC 2019或MinGW 8.1.0,但需要注意的是现阶段只有**CMake**脚本提供了对MinGW的支持。 2. 克隆该项目 3. 使用QtCreator打开项目根目录`all.pro`或`CMakeLists.txt` -4. 编译,运行即可 +4. 编译,运行 ### Android端 (没有修改需求的话直接使用自带的scrcpy-server即可) 1. 目标平台上搭建Android开发环境 @@ -276,4 +277,4 @@ Mac OS平台,你可以直接使用我编译好的可执行程序: [Barry的CSDN](https://blog.csdn.net/rankun1) -一枚普通的程序员,工作中主要使用C++进行桌面客户端开发,一毕业在山东做过一年多钢铁仿真教育软件,后来转战上海先后从事安防,在线教育相关领域工作,对音视频比较熟悉,对音视频领域如语音通话,直播教育,视频会议等相关解决方案有所了解。同时具有android,linux服务器等开发经验。 +一枚普通的程序员,工作中主要使用C++进行桌面客户端开发,一毕业在山东做过一年多钢铁仿真教育软件,后来转战上海先后从事安防,在线教育相关领域工作,对音视频比较熟悉,对音视频领域如语音通话,直播教育,视频会议等相关解决方案有所了解。同时具有Android,Linux服务器等开发经验。 From f18e4b38fae40f6dcd9c21c76f4bc30eb875b474 Mon Sep 17 00:00:00 2001 From: Zhang Xiang Date: Thu, 24 Jun 2021 13:41:25 +0800 Subject: [PATCH 09/15] Fix CMake errors under Linux --- QtScrcpy/CMakeLists.txt | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/QtScrcpy/CMakeLists.txt b/QtScrcpy/CMakeLists.txt index 0d55598..b70a7f8 100755 --- a/QtScrcpy/CMakeLists.txt +++ b/QtScrcpy/CMakeLists.txt @@ -198,16 +198,18 @@ if(WIN32) # ******************** Unix-like OSs ******************** elseif(UNIX) set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib") - link_directories(${QS_LIB_PATH}) # ==================== macOS ==================== if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") message(STATUS "[QtScrcpy] Make for macOS.") + target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${QS_LIB_PATH}) if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug") else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release") endif() # Icon file stored in Contents/Resources @@ -244,30 +246,33 @@ elseif(UNIX) # =============== Non-Mac OSs (Linux, BSD, etc.) =============== else() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug") else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release") endif() find_package(Threads REQUIRED) - message(STATUS "[QtScrcpy] Make for non-Apple Unix-like OS.") + message(STATUS "[QtScrcpy] Make for non-Mac Unix-like OS.") set(INSTALLED_FFMPEG_FOUND false) find_package(PkgConfig) if(PkgConfig_FOUND) - pkg_check_modules(FFmpeg ffmpeg>=4) + pkg_check_modules(FFmpeg libavformat>=58 libavcodec>=58 libavutil>=56 libswscale>=5) if(FFmpeg_FOUND) set(INSTALLED_FFMPEG_FOUND true) - message(STATUS "[QtScrcpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") - target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}") - target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}") - set(QS_EXTERNAL_LIBS_FFMPEG PkgConfig::FFmpeg) + message(STATUS "[QtScrcpy] Development files of FFmpeg were detected in your OS and will be used.") + target_link_options(${CMAKE_PROJECT_NAME} PRIVATE ${FFmpeg_LDFLAGS}) + target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE ${FFmpeg_CFLAGS}) + set(QS_EXTERNAL_LIBS_FFMPEG ${FFmpeg_LIBRARIES}) endif() endif() if(NOT INSTALLED_FFMPEG_FOUND) message(STATUS "[QtScrcpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.") + target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${QS_LIB_PATH}) set(QS_EXTERNAL_LIBS_FFMPEG avformat avcodec @@ -308,7 +313,6 @@ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE util ) - if(QT_VERSION_MAJOR EQUAL 6) qt_finalize_executable(${CMAKE_PROJECT_NAME}) endif() From d3539738f5b5ac22997dd782ef9b2fa277cc5a0a Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Sun, 27 Jun 2021 13:16:06 +0800 Subject: [PATCH 10/15] feat: nickname for videoform title --- QtScrcpy/device/device.cpp | 8 ++++++-- QtScrcpy/dialog.cpp | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/QtScrcpy/device/device.cpp b/QtScrcpy/device/device.cpp index 5005032..7c833a9 100644 --- a/QtScrcpy/device/device.cpp +++ b/QtScrcpy/device/device.cpp @@ -212,6 +212,7 @@ void Device::initSignals() } }); connect(m_server, &Server::connectToResult, this, [this](bool success, const QString &deviceName, const QSize &size) { + Q_UNUSED(deviceName); if (success) { double diff = m_startTimeCount.elapsed() / 1000.0; qInfo() << QString("server start finish in %1s").arg(diff).toStdString().c_str(); @@ -220,8 +221,11 @@ void Device::initSignals() if (m_videoForm) { // must be show before updateShowSize m_videoForm->show(); - - m_videoForm->setWindowTitle(Config::getInstance().getTitle() + "-" + deviceName); + QString name = Config::getInstance().getNickName(m_params.serial); + if (name.isEmpty()) { + name = Config::getInstance().getTitle(); + } + m_videoForm->setWindowTitle(name + "-" + m_params.serial); m_videoForm->updateShowSize(size); bool deviceVer = size.height() > size.width(); diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index bbea1b4..0667a0c 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -46,7 +46,7 @@ Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) ui->connectedPhoneList->clear(); for (auto &item : devices) { ui->serialBox->addItem(item); - ui->connectedPhoneList->addItem(item+"-"+Config::getInstance().getNickName(item)); + ui->connectedPhoneList->addItem(Config::getInstance().getNickName(item) + "-" + item); } } else if (args.contains("show") && args.contains("wlan0")) { QString ip = m_adb.getDeviceIPFromStdOut(); From 945117d4645a1ea8f689071999024ac1b8f51b85 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Sun, 27 Jun 2021 14:27:10 +0800 Subject: [PATCH 11/15] feat: quit to system tray --- QtScrcpy/dialog.cpp | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index 0667a0c..08aa86b 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -87,8 +87,12 @@ Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) m_menu->addAction(m_showWindow); m_menu->addAction(m_quit); m_hideIcon->setContextMenu(m_menu); + m_hideIcon->show(); connect(m_showWindow, &QAction::triggered, this, &Dialog::slotShow); - connect(m_quit, SIGNAL(triggered()), this, SLOT(close())); + connect(m_quit, &QAction::triggered, this, [this](){ + m_hideIcon->hide(); + qApp->quit(); + }); connect(m_hideIcon, &QSystemTrayIcon::activated,this,&Dialog::slotActivated); } @@ -240,26 +244,12 @@ void Dialog::slotActivated(QSystemTrayIcon::ActivationReason reason) void Dialog::closeEvent(QCloseEvent *event) { - int res = QMessageBox::question(this,tr("warning"),tr("Quit or set tray?"),tr("Quit"),tr("Set tray"),tr("Cancel")); - - if(res == 0) - { - event->accept(); - } - else if(res == 1) - { - this->hide(); - m_hideIcon->show(); - m_hideIcon->showMessage(tr("Notice"), - tr("Hidden here!"), - QSystemTrayIcon::Information, - 3000); - event->ignore(); - } - else - { - event->ignore(); - } + this->hide(); + m_hideIcon->showMessage(tr("Notice"), + tr("Hidden here!"), + QSystemTrayIcon::Information, + 3000); + event->ignore(); } void Dialog::on_updateDevice_clicked() From 47a416801c29a54d252d5f7f03249519750804b8 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Sun, 27 Jun 2021 20:22:22 +0800 Subject: [PATCH 12/15] feat: add steel wheel delay --- .../inputconvert/inputconvertgame.cpp | 116 +++++++++++++++--- .../inputconvert/inputconvertgame.h | 19 ++- 2 files changed, 114 insertions(+), 21 deletions(-) diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp index d568759..a09b121 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp @@ -2,12 +2,18 @@ #include #include #include +#include +#include #include "inputconvertgame.h" #define CURSOR_POS_CHECK 50 -InputConvertGame::InputConvertGame(Controller *controller) : InputConvertNormal(controller) {} +InputConvertGame::InputConvertGame(Controller *controller) : InputConvertNormal(controller) { + m_ctrlSteerWheel.delayData.timer = new QTimer(this); + m_ctrlSteerWheel.delayData.timer->setSingleShot(true); + connect(m_ctrlSteerWheel.delayData.timer, &QTimer::timeout, this, &InputConvertGame::onSteerWheelTimer); +} InputConvertGame::~InputConvertGame() {} @@ -138,8 +144,10 @@ void InputConvertGame::updateSize(const QSize &frameSize, const QSize &showSize) { if (showSize != m_showSize) { if (m_gameMap && m_keyMap.isValidMouseMoveMap()) { +#ifdef QT_NO_DEBUG // show size change, resize grab cursor emit grabCursor(true); +#endif } } m_frameSize = frameSize; @@ -237,6 +245,56 @@ int InputConvertGame::getTouchID(int key) // -------- steer wheel event -------- +void InputConvertGame::getDelayQueue(const QPointF& start, const QPointF& end, + const double& distanceStep, const double& posStepconst, const double& timerStep, + QQueue& queuePos, QQueue& queueTimer) { + double timerBase = 5.0f; // ms + double x1 = start.x(); + double y1 = start.y(); + double x2 = end.x(); + double y2 = end.y(); + + double dx=x2-x1; + double dy=y2-y1; + double e=(fabs(dx)>fabs(dy))?fabs(dx):fabs(dy); + e /= distanceStep; + dx/=e; + dy/=e; + + QQueue queue; + QQueue queue2; + for(int i=1;i<=e;i++) { + QPointF pos(x1+(QRandomGenerator::global()->bounded(posStepconst*2)-posStepconst), y1+(QRandomGenerator::global()->bounded(posStepconst*2)-posStepconst)); + queue.enqueue(pos); + queue2.enqueue(QRandomGenerator::global()->bounded(timerStep*2)-timerStep + timerBase); + x1+=dx; + y1+=dy; + } + + queuePos = queue; + queueTimer = queue2; +} + +void InputConvertGame::onSteerWheelTimer() { + if(m_ctrlSteerWheel.delayData.queuePos.empty()) { + return; + } + int id = getTouchID(m_ctrlSteerWheel.touchKey); + m_ctrlSteerWheel.delayData.currentPos = m_ctrlSteerWheel.delayData.queuePos.dequeue(); + sendTouchMoveEvent(id, m_ctrlSteerWheel.delayData.currentPos); + + if(m_ctrlSteerWheel.delayData.queuePos.empty() && m_ctrlSteerWheel.delayData.pressedNum == 0) { + sendTouchUpEvent(id, m_ctrlSteerWheel.delayData.currentPos); + detachTouchID(m_ctrlSteerWheel.touchKey); + qDebug() << "***************** detach:" << id; + return; + } + + if(!m_ctrlSteerWheel.delayData.queuePos.empty()) { + m_ctrlSteerWheel.delayData.timer->start(m_ctrlSteerWheel.delayData.queueTimer.dequeue()); + } +} + void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const QKeyEvent *from) { int key = from->key(); @@ -271,27 +329,46 @@ void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const Q ++pressedNum; offset.rx() -= node.data.steerWheel.left.extendOffset; } + m_ctrlSteerWheel.delayData.pressedNum = pressedNum; - // action + // last key release and timer no active, active timer to detouch if (pressedNum == 0) { - // touch up release all - int id = getTouchID(m_ctrlSteerWheel.touchKey); - sendTouchUpEvent(id, node.data.steerWheel.centerPos + m_ctrlSteerWheel.lastOffset); - detachTouchID(m_ctrlSteerWheel.touchKey); - } else { - int id; - // first press, get key and touch down - if (pressedNum == 1 && flag) { - m_ctrlSteerWheel.touchKey = from->key(); - id = attachTouchID(m_ctrlSteerWheel.touchKey); - sendTouchDownEvent(id, node.data.steerWheel.centerPos); - } else { - // jsut get touch id and move - id = getTouchID(m_ctrlSteerWheel.touchKey); + if (m_ctrlSteerWheel.delayData.timer->isActive()) { + m_ctrlSteerWheel.delayData.timer->stop(); + m_ctrlSteerWheel.delayData.queueTimer.clear(); + m_ctrlSteerWheel.delayData.queuePos.clear(); } - sendTouchMoveEvent(id, node.data.steerWheel.centerPos + offset); + + m_ctrlSteerWheel.delayData.queueTimer.enqueue(0); + m_ctrlSteerWheel.delayData.queuePos.enqueue(m_ctrlSteerWheel.delayData.currentPos); + m_ctrlSteerWheel.delayData.timer->start(); + + return; } - m_ctrlSteerWheel.lastOffset = offset; + + // process steer wheel key event + m_ctrlSteerWheel.delayData.timer->stop(); + m_ctrlSteerWheel.delayData.queueTimer.clear(); + m_ctrlSteerWheel.delayData.queuePos.clear(); + + // first press, get key and touch down + if (pressedNum == 1 && flag) { + m_ctrlSteerWheel.touchKey = from->key(); + int id = attachTouchID(m_ctrlSteerWheel.touchKey); + qDebug() << "***************** attach:" << id; + sendTouchDownEvent(id, node.data.steerWheel.centerPos); + + getDelayQueue(node.data.steerWheel.centerPos, node.data.steerWheel.centerPos+offset, + 0.01f, 0.002f, 3.0f, + m_ctrlSteerWheel.delayData.queuePos, + m_ctrlSteerWheel.delayData.queueTimer); + } else { + getDelayQueue(m_ctrlSteerWheel.delayData.currentPos, node.data.steerWheel.centerPos+offset, + 0.01f, 0.002f, 3.0f, + m_ctrlSteerWheel.delayData.queuePos, + m_ctrlSteerWheel.delayData.queueTimer); + } + m_ctrlSteerWheel.delayData.timer->start(); return; } @@ -509,9 +586,10 @@ bool InputConvertGame::switchGameMap() if (!m_keyMap.isValidMouseMoveMap()) { return m_gameMap; } - +#ifdef QT_NO_DEBUG // grab cursor and set cursor only mouse move map emit grabCursor(m_gameMap); +#endif hideMouseCursor(m_gameMap); if (!m_gameMap) { diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h index b286d77..9edef70 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h @@ -2,6 +2,7 @@ #define INPUTCONVERTGAME_H #include +#include #include "inputconvertnormal.h" #include "keymap.h" @@ -60,9 +61,16 @@ protected: bool checkCursorPos(const QMouseEvent *from); void hideMouseCursor(bool hide); + void getDelayQueue(const QPointF& start, const QPointF& end, + const double& distanceStep, const double& posStepconst, const double& timerStep, + QQueue& queuePos, QQueue& queueTimer); + protected: void timerEvent(QTimerEvent *event); +private slots: + void onSteerWheelTimer(); + private: QSize m_frameSize; QSize m_showSize; @@ -82,8 +90,15 @@ private: bool pressedDown = false; bool pressedLeft = false; bool pressedRight = false; - // for last up - QPointF lastOffset; + + // for delay + struct { + QPointF currentPos; + QTimer* timer = nullptr; + QQueue queuePos; + QQueue queueTimer; + int pressedNum = 0; + } delayData; } m_ctrlSteerWheel; // mouse move From 38199ec4523a297c718665a7b75d7591cf1e5a34 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Sun, 27 Jun 2021 22:08:47 +0800 Subject: [PATCH 13/15] fix: steer wheel delay bug --- .../device/controller/inputconvert/inputconvertgame.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp index a09b121..596285e 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp @@ -286,7 +286,6 @@ void InputConvertGame::onSteerWheelTimer() { if(m_ctrlSteerWheel.delayData.queuePos.empty() && m_ctrlSteerWheel.delayData.pressedNum == 0) { sendTouchUpEvent(id, m_ctrlSteerWheel.delayData.currentPos); detachTouchID(m_ctrlSteerWheel.touchKey); - qDebug() << "***************** detach:" << id; return; } @@ -339,10 +338,8 @@ void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const Q m_ctrlSteerWheel.delayData.queuePos.clear(); } - m_ctrlSteerWheel.delayData.queueTimer.enqueue(0); - m_ctrlSteerWheel.delayData.queuePos.enqueue(m_ctrlSteerWheel.delayData.currentPos); - m_ctrlSteerWheel.delayData.timer->start(); - + sendTouchUpEvent(getTouchID(m_ctrlSteerWheel.touchKey), m_ctrlSteerWheel.delayData.currentPos); + detachTouchID(m_ctrlSteerWheel.touchKey); return; } @@ -355,7 +352,6 @@ void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const Q if (pressedNum == 1 && flag) { m_ctrlSteerWheel.touchKey = from->key(); int id = attachTouchID(m_ctrlSteerWheel.touchKey); - qDebug() << "***************** attach:" << id; sendTouchDownEvent(id, node.data.steerWheel.centerPos); getDelayQueue(node.data.steerWheel.centerPos, node.data.steerWheel.centerPos+offset, From 6f33ea7cbcc6ce38aa87a19cc65d65780c5bfa42 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Mon, 28 Jun 2021 09:00:46 +0800 Subject: [PATCH 14/15] feat: add drag delay --- .../inputconvert/inputconvertgame.cpp | 59 +++++++++++++++++-- .../inputconvert/inputconvertgame.h | 10 ++++ 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp index 596285e..8ce74d9 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp @@ -422,18 +422,65 @@ void InputConvertGame::processKeyClickMulti(const KeyMap::DelayClickNode *nodes, } } +void InputConvertGame::onDragTimer() { + if(m_dragDelayData.queuePos.empty()) { + return; + } + int id = getTouchID(m_dragDelayData.pressKey); + m_dragDelayData.currentPos = m_dragDelayData.queuePos.dequeue(); + sendTouchMoveEvent(id, m_dragDelayData.currentPos); + + if(m_dragDelayData.queuePos.empty()) { + delete m_dragDelayData.timer; + m_dragDelayData.timer = nullptr; + + sendTouchUpEvent(id, m_dragDelayData.currentPos); + detachTouchID(m_dragDelayData.pressKey); + + m_dragDelayData.currentPos = QPointF(); + m_dragDelayData.pressKey = 0; + return; + } + + if(!m_dragDelayData.queuePos.empty()) { + m_dragDelayData.timer->start(m_dragDelayData.queueTimer.dequeue()); + } +} + void InputConvertGame::processKeyDrag(const QPointF &startPos, QPointF endPos, const QKeyEvent *from) { if (QEvent::KeyPress == from->type()) { + // stop last + if (m_dragDelayData.timer && m_dragDelayData.timer->isActive()) { + m_dragDelayData.timer->stop(); + delete m_dragDelayData.timer; + m_dragDelayData.timer = nullptr; + m_dragDelayData.queuePos.clear(); + m_dragDelayData.queueTimer.clear(); + + sendTouchUpEvent(getTouchID(m_dragDelayData.pressKey), m_dragDelayData.currentPos); + detachTouchID(m_dragDelayData.pressKey); + + m_dragDelayData.currentPos = QPointF(); + m_dragDelayData.pressKey = 0; + } + + // start this int id = attachTouchID(from->key()); sendTouchDownEvent(id, startPos); - sendTouchMoveEvent(id, endPos); - } - if (QEvent::KeyRelease == from->type()) { - int id = getTouchID(from->key()); - sendTouchUpEvent(id, endPos); - detachTouchID(from->key()); + m_dragDelayData.timer = new QTimer(this); + m_dragDelayData.timer->setSingleShot(true); + connect(m_dragDelayData.timer, &QTimer::timeout, this, &InputConvertGame::onDragTimer); + m_dragDelayData.pressKey = from->key(); + m_dragDelayData.currentPos = startPos; + m_dragDelayData.queuePos.clear(); + m_dragDelayData.queueTimer.clear(); + getDelayQueue(startPos, endPos, + 0.01f, 0.002f, 2.0f, + m_dragDelayData.queuePos, + m_dragDelayData.queueTimer); + m_dragDelayData.timer->start(); } } diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h index 9edef70..7b539f9 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h @@ -70,6 +70,7 @@ protected: private slots: void onSteerWheelTimer(); + void onDragTimer(); private: QSize m_frameSize; @@ -110,6 +111,15 @@ private: int timer = 0; bool smallEyes = false; } m_ctrlMouseMove; + + // for drag delay + struct { + QPointF currentPos; + QTimer* timer = nullptr; + QQueue queuePos; + QQueue queueTimer; + int pressKey = 0; + } m_dragDelayData; }; #endif // INPUTCONVERTGAME_H From e23c566c030b7a8509354bc04d5211dce8e0dae0 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Mon, 28 Jun 2021 09:13:39 +0800 Subject: [PATCH 15/15] fix: drag delay timer too big bug --- .../controller/inputconvert/inputconvertgame.cpp | 16 ++++++++-------- .../controller/inputconvert/inputconvertgame.h | 9 +++++---- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp index 8ce74d9..e0871f8 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.cpp @@ -246,9 +246,9 @@ int InputConvertGame::getTouchID(int key) // -------- steer wheel event -------- void InputConvertGame::getDelayQueue(const QPointF& start, const QPointF& end, - const double& distanceStep, const double& posStepconst, const double& timerStep, - QQueue& queuePos, QQueue& queueTimer) { - double timerBase = 5.0f; // ms + const double& distanceStep, const double& posStepconst, + quint32 lowestTimer, quint32 highestTimer, + QQueue& queuePos, QQueue& queueTimer) { double x1 = start.x(); double y1 = start.y(); double x2 = end.x(); @@ -262,11 +262,11 @@ void InputConvertGame::getDelayQueue(const QPointF& start, const QPointF& end, dy/=e; QQueue queue; - QQueue queue2; + QQueue queue2; for(int i=1;i<=e;i++) { QPointF pos(x1+(QRandomGenerator::global()->bounded(posStepconst*2)-posStepconst), y1+(QRandomGenerator::global()->bounded(posStepconst*2)-posStepconst)); queue.enqueue(pos); - queue2.enqueue(QRandomGenerator::global()->bounded(timerStep*2)-timerStep + timerBase); + queue2.enqueue(QRandomGenerator::global()->bounded(lowestTimer, highestTimer)); x1+=dx; y1+=dy; } @@ -355,12 +355,12 @@ void InputConvertGame::processSteerWheel(const KeyMap::KeyMapNode &node, const Q sendTouchDownEvent(id, node.data.steerWheel.centerPos); getDelayQueue(node.data.steerWheel.centerPos, node.data.steerWheel.centerPos+offset, - 0.01f, 0.002f, 3.0f, + 0.01f, 0.002f, 2, 8, m_ctrlSteerWheel.delayData.queuePos, m_ctrlSteerWheel.delayData.queueTimer); } else { getDelayQueue(m_ctrlSteerWheel.delayData.currentPos, node.data.steerWheel.centerPos+offset, - 0.01f, 0.002f, 3.0f, + 0.01f, 0.002f, 2, 8, m_ctrlSteerWheel.delayData.queuePos, m_ctrlSteerWheel.delayData.queueTimer); } @@ -477,7 +477,7 @@ void InputConvertGame::processKeyDrag(const QPointF &startPos, QPointF endPos, c m_dragDelayData.queuePos.clear(); m_dragDelayData.queueTimer.clear(); getDelayQueue(startPos, endPos, - 0.01f, 0.002f, 2.0f, + 0.01f, 0.002f, 0, 2, m_dragDelayData.queuePos, m_dragDelayData.queueTimer); m_dragDelayData.timer->start(); diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h index 7b539f9..d8ff4d1 100644 --- a/QtScrcpy/device/controller/inputconvert/inputconvertgame.h +++ b/QtScrcpy/device/controller/inputconvert/inputconvertgame.h @@ -62,8 +62,9 @@ protected: void hideMouseCursor(bool hide); void getDelayQueue(const QPointF& start, const QPointF& end, - const double& distanceStep, const double& posStepconst, const double& timerStep, - QQueue& queuePos, QQueue& queueTimer); + const double& distanceStep, const double& posStepconst, + quint32 lowestTimer, quint32 highestTimer, + QQueue& queuePos, QQueue& queueTimer); protected: void timerEvent(QTimerEvent *event); @@ -97,7 +98,7 @@ private: QPointF currentPos; QTimer* timer = nullptr; QQueue queuePos; - QQueue queueTimer; + QQueue queueTimer; int pressedNum = 0; } delayData; } m_ctrlSteerWheel; @@ -117,7 +118,7 @@ private: QPointF currentPos; QTimer* timer = nullptr; QQueue queuePos; - QQueue queueTimer; + QQueue queueTimer; int pressKey = 0; } m_dragDelayData; };