From dcffea679f702736d1660fd1ac0ad86bae8d4222 Mon Sep 17 00:00:00 2001 From: Barry <870709864@qq.com> Date: Wed, 19 Jun 2019 18:05:17 +0800 Subject: [PATCH] =?UTF-8?q?update:=E5=90=8C=E6=AD=A5scrcpy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QtScrcpy/dialog.cpp | 15 ++- QtScrcpy/dialog.h | 2 + QtScrcpy/dialog.ui | 7 ++ QtScrcpy/inputcontrol/controlmsg.cpp | 88 ++++++++++-------- QtScrcpy/inputcontrol/controlmsg.h | 25 +++-- QtScrcpy/inputcontrol/receiver.cpp | 1 + QtScrcpy/server/server.cpp | 42 ++++----- QtScrcpy/server/server.h | 19 ++-- QtScrcpy/stream/stream.cpp | 4 +- QtScrcpy/videoform.cpp | 27 +++++- QtScrcpy/videoform.h | 4 +- TODO.txt | 8 +- .../com/genymobile/scrcpy/ControlMessage.java | 15 ++- .../scrcpy/ControlMessageReader.java | 34 ++++--- .../com/genymobile/scrcpy/Controller.java | 23 +++-- .../java/com/genymobile/scrcpy/Device.java | 15 +++ .../main/java/com/genymobile/scrcpy/Ln.java | 11 ++- .../java/com/genymobile/scrcpy/Options.java | 9 ++ .../java/com/genymobile/scrcpy/Server.java | 15 ++- .../scrcpy/wrappers/SurfaceControl.java | 26 ++++++ third_party/scrcpy-server.jar | Bin 52649 -> 52889 bytes 21 files changed, 277 insertions(+), 113 deletions(-) diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index 5388a1d..c7603df 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -105,7 +105,8 @@ void Dialog::on_startServerBtn_clicked() quint32 bitRate = ui->bitRateBox->currentText().trimmed().toUInt(); // this is ok that "native" toUshort is 0 quint16 videoSize = ui->videoSizeBox->currentText().trimmed().toUShort(); - m_videoForm = new VideoForm(ui->serialBox->currentText().trimmed(), videoSize, bitRate, absFilePath); + m_videoForm = new VideoForm(ui->serialBox->currentText().trimmed(), videoSize, bitRate, + absFilePath, ui->closeScreenCheck->isChecked()); if (ui->alwaysTopCheck->isChecked()) { m_videoForm->staysOnTop(); } @@ -238,3 +239,15 @@ void Dialog::on_alwaysTopCheck_stateChanged(int arg1) m_videoForm->staysOnTop(false); } } + +void Dialog::on_closeScreenCheck_stateChanged(int arg1) +{ + if (!m_videoForm) { + return; + } + if (ui->closeScreenCheck->isChecked()) { + m_videoForm->setScreenPowerMode(ControlMsg::SPM_OFF); + } else { + m_videoForm->setScreenPowerMode(ControlMsg::SPM_NORMAL); + } +} diff --git a/QtScrcpy/dialog.h b/QtScrcpy/dialog.h index 1d81f8d..43e1f63 100644 --- a/QtScrcpy/dialog.h +++ b/QtScrcpy/dialog.h @@ -43,6 +43,8 @@ private slots: void on_alwaysTopCheck_stateChanged(int arg1); + void on_closeScreenCheck_stateChanged(int arg1); + private: bool checkAdbRun(); void initUI(); diff --git a/QtScrcpy/dialog.ui b/QtScrcpy/dialog.ui index bf6b04b..18ceff5 100644 --- a/QtScrcpy/dialog.ui +++ b/QtScrcpy/dialog.ui @@ -230,6 +230,13 @@ + + + + close screen + + + diff --git a/QtScrcpy/inputcontrol/controlmsg.cpp b/QtScrcpy/inputcontrol/controlmsg.cpp index 9226ec4..45147ff 100644 --- a/QtScrcpy/inputcontrol/controlmsg.cpp +++ b/QtScrcpy/inputcontrol/controlmsg.cpp @@ -12,21 +12,21 @@ ControlMsg::ControlMsg(ControlMsgType controlMsgType) ControlMsg::~ControlMsg() { if (CMT_SET_CLIPBOARD == m_data.type - && Q_NULLPTR != m_data.setClipboardMsg.text) { - delete m_data.setClipboardMsg.text; - m_data.setClipboardMsg.text = Q_NULLPTR; + && Q_NULLPTR != m_data.setClipboard.text) { + delete m_data.setClipboard.text; + m_data.setClipboard.text = Q_NULLPTR; } else if (CMT_INJECT_TEXT == m_data.type - && Q_NULLPTR != m_data.injectTextMsg.text){ - delete m_data.injectTextMsg.text; - m_data.injectTextMsg.text = Q_NULLPTR; + && Q_NULLPTR != m_data.injectText.text){ + delete m_data.injectText.text; + m_data.injectText.text = Q_NULLPTR; } } void ControlMsg::setInjectKeycodeMsgData(AndroidKeyeventAction action, AndroidKeycode keycode, AndroidMetastate metastate) { - m_data.injectKeycodeMsg.action = action; - m_data.injectKeycodeMsg.keycode = keycode; - m_data.injectKeycodeMsg.metastate = metastate; + m_data.injectKeycode.action = action; + m_data.injectKeycode.keycode = keycode; + m_data.injectKeycode.metastate = metastate; } void ControlMsg::setInjectTextMsgData(QString& text) @@ -37,30 +37,30 @@ void ControlMsg::setInjectTextMsgData(QString& text) text = text.left(CONTROL_MSG_TEXT_MAX_LENGTH); } QByteArray tmp = text.toUtf8(); - m_data.injectTextMsg.text = new char[tmp.length() + 1]; - memcpy(m_data.injectTextMsg.text, tmp.data(), tmp.length()); - m_data.injectTextMsg.text[tmp.length()] = '\0'; + m_data.injectText.text = new char[tmp.length() + 1]; + memcpy(m_data.injectText.text, tmp.data(), tmp.length()); + m_data.injectText.text[tmp.length()] = '\0'; } void ControlMsg::setInjectMouseMsgData(AndroidMotioneventAction action, AndroidMotioneventButtons buttons, QRect position) { - m_data.injectMouseMsg.action = action; - m_data.injectMouseMsg.buttons = buttons; - m_data.injectMouseMsg.position = position; + m_data.injectMouse.action = action; + m_data.injectMouse.buttons = buttons; + m_data.injectMouse.position = position; } void ControlMsg::setInjectTouchMsgData(quint32 id, AndroidMotioneventAction action, QRect position) { - m_data.injectTouchMsg.action = action; - m_data.injectTouchMsg.id = id; - m_data.injectTouchMsg.position = position; + m_data.injectTouch.action = action; + m_data.injectTouch.id = id; + m_data.injectTouch.position = position; } void ControlMsg::setInjectScrollMsgData(QRect position, qint32 hScroll, qint32 vScroll) { - m_data.injectScrollMsg.position = position; - m_data.injectScrollMsg.hScroll = hScroll; - m_data.injectScrollMsg.vScroll = vScroll; + m_data.injectScroll.position = position; + m_data.injectScroll.hScroll = hScroll; + m_data.injectScroll.vScroll = vScroll; } void ControlMsg::setSetClipboardMsgData(QString &text) @@ -73,9 +73,14 @@ void ControlMsg::setSetClipboardMsgData(QString &text) } QByteArray tmp = text.toUtf8(); - m_data.setClipboardMsg.text = new char[tmp.length() + 1]; - memcpy(m_data.setClipboardMsg.text, tmp.data(), tmp.length()); - m_data.setClipboardMsg.text[tmp.length()] = '\0'; + m_data.setClipboard.text = new char[tmp.length() + 1]; + memcpy(m_data.setClipboard.text, tmp.data(), tmp.length()); + m_data.setClipboard.text[tmp.length()] = '\0'; +} + +void ControlMsg::setSetScreenPowerModeData(ControlMsg::ScreenPowerMode mode) +{ + m_data.setScreenPowerMode.mode = mode; } void ControlMsg::writePosition(QBuffer &buffer, const QRect& value) @@ -95,32 +100,35 @@ QByteArray ControlMsg::serializeData() switch (m_data.type) { case CMT_INJECT_KEYCODE: - buffer.putChar(m_data.injectKeycodeMsg.action); - BufferUtil::write32(buffer, m_data.injectKeycodeMsg.keycode); - BufferUtil::write32(buffer, m_data.injectKeycodeMsg.metastate); + buffer.putChar(m_data.injectKeycode.action); + BufferUtil::write32(buffer, m_data.injectKeycode.keycode); + BufferUtil::write32(buffer, m_data.injectKeycode.metastate); break; case CMT_INJECT_TEXT: - BufferUtil::write16(buffer, strlen(m_data.injectTextMsg.text)); - buffer.write(m_data.injectTextMsg.text, strlen(m_data.injectTextMsg.text)); + BufferUtil::write16(buffer, strlen(m_data.injectText.text)); + buffer.write(m_data.injectText.text, strlen(m_data.injectText.text)); break; case CMT_INJECT_MOUSE: - buffer.putChar(m_data.injectMouseMsg.action); - BufferUtil::write32(buffer, m_data.injectMouseMsg.buttons); - writePosition(buffer, m_data.injectMouseMsg.position); + buffer.putChar(m_data.injectMouse.action); + BufferUtil::write32(buffer, m_data.injectMouse.buttons); + writePosition(buffer, m_data.injectMouse.position); break; case CMT_INJECT_TOUCH: - buffer.putChar(m_data.injectTouchMsg.id); - buffer.putChar(m_data.injectTouchMsg.action); - writePosition(buffer, m_data.injectTouchMsg.position); + buffer.putChar(m_data.injectTouch.id); + buffer.putChar(m_data.injectTouch.action); + writePosition(buffer, m_data.injectTouch.position); break; case CMT_INJECT_SCROLL: - writePosition(buffer, m_data.injectScrollMsg.position); - BufferUtil::write32(buffer, m_data.injectScrollMsg.hScroll); - BufferUtil::write32(buffer, m_data.injectScrollMsg.vScroll); + writePosition(buffer, m_data.injectScroll.position); + BufferUtil::write32(buffer, m_data.injectScroll.hScroll); + BufferUtil::write32(buffer, m_data.injectScroll.vScroll); break; case CMT_SET_CLIPBOARD: - BufferUtil::write16(buffer, strlen(m_data.setClipboardMsg.text)); - buffer.write(m_data.setClipboardMsg.text, strlen(m_data.setClipboardMsg.text)); + BufferUtil::write16(buffer, strlen(m_data.setClipboard.text)); + buffer.write(m_data.setClipboard.text, strlen(m_data.setClipboard.text)); + break; + case CMT_SET_SCREEN_POWER_MODE: + buffer.putChar(m_data.setScreenPowerMode.mode); break; case CMT_BACK_OR_SCREEN_ON: case CMT_EXPAND_NOTIFICATION_PANEL: diff --git a/QtScrcpy/inputcontrol/controlmsg.h b/QtScrcpy/inputcontrol/controlmsg.h index d137475..e226428 100644 --- a/QtScrcpy/inputcontrol/controlmsg.h +++ b/QtScrcpy/inputcontrol/controlmsg.h @@ -26,9 +26,16 @@ public: CMT_COLLAPSE_NOTIFICATION_PANEL, CMT_GET_CLIPBOARD, CMT_SET_CLIPBOARD, + CMT_SET_SCREEN_POWER_MODE, CMT_INJECT_TOUCH, - }; + }; + + enum ScreenPowerMode { + // see + SPM_OFF = 0, + SPM_NORMAL = 2, + }; ControlMsg(ControlMsgType controlMsgType); virtual ~ControlMsg(); @@ -42,6 +49,7 @@ public: void setInjectTouchMsgData(quint32 id, AndroidMotioneventAction action, QRect position); void setInjectScrollMsgData(QRect position, qint32 hScroll, qint32 vScroll); void setSetClipboardMsgData(QString& text); + void setSetScreenPowerModeData(ControlMsg::ScreenPowerMode mode); QByteArray serializeData(); @@ -56,28 +64,31 @@ private: AndroidKeyeventAction action; AndroidKeycode keycode; AndroidMetastate metastate; - } injectKeycodeMsg; + } injectKeycode; struct { char* text = Q_NULLPTR; - } injectTextMsg; + } injectText; struct { AndroidMotioneventAction action; AndroidMotioneventButtons buttons; QRect position; - } injectMouseMsg; + } injectMouse; struct { quint32 id; AndroidMotioneventAction action; QRect position; - } injectTouchMsg; + } injectTouch; struct { QRect position; qint32 hScroll; qint32 vScroll; - } injectScrollMsg; + } injectScroll; struct { char *text = Q_NULLPTR; - } setClipboardMsg; + } setClipboard; + struct { + ScreenPowerMode mode; + } setScreenPowerMode; }; ControlMsgData(){} diff --git a/QtScrcpy/inputcontrol/receiver.cpp b/QtScrcpy/inputcontrol/receiver.cpp index d59a443..af5dead 100644 --- a/QtScrcpy/inputcontrol/receiver.cpp +++ b/QtScrcpy/inputcontrol/receiver.cpp @@ -41,6 +41,7 @@ void Receiver::processMsg(DeviceMsg *deviceMsg) switch (deviceMsg->type()) { case DeviceMsg::DMT_GET_CLIPBOARD: { + qInfo("Device clipboard copied"); QClipboard *board = QApplication::clipboard(); QString text; deviceMsg->getClipboardMsgData(text); diff --git a/QtScrcpy/server/server.cpp b/QtScrcpy/server/server.cpp index f042ba1..04d68ad 100644 --- a/QtScrcpy/server/server.cpp +++ b/QtScrcpy/server/server.cpp @@ -65,7 +65,7 @@ bool Server::pushServer() if (m_workProcess.isRuning()) { m_workProcess.kill(); } - m_workProcess.push(m_serial, getServerPath(), DEVICE_SERVER_PATH); + m_workProcess.push(m_params.serial, getServerPath(), DEVICE_SERVER_PATH); return true; } @@ -74,7 +74,7 @@ bool Server::enableTunnelReverse() if (m_workProcess.isRuning()) { m_workProcess.kill(); } - m_workProcess.reverse(m_serial, SOCKET_NAME, m_localPort); + m_workProcess.reverse(m_params.serial, SOCKET_NAME, m_params.localPort); return true; } @@ -89,7 +89,7 @@ bool Server::disableTunnelReverse() sender()->deleteLater(); } }); - adb->reverseRemove(m_serial, SOCKET_NAME); + adb->reverseRemove(m_params.serial, SOCKET_NAME); return true; } @@ -98,7 +98,7 @@ bool Server::enableTunnelForward() if (m_workProcess.isRuning()) { m_workProcess.kill(); } - m_workProcess.forward(m_serial, m_localPort, SOCKET_NAME); + m_workProcess.forward(m_params.serial, m_params.localPort, SOCKET_NAME); return true; } bool Server::disableTunnelForward() @@ -112,7 +112,7 @@ bool Server::disableTunnelForward() sender()->deleteLater(); } }); - adb->forwardRemove(m_serial, m_localPort); + adb->forwardRemove(m_params.serial, m_params.localPort); return true; } @@ -127,31 +127,27 @@ bool Server::execute() args << "app_process"; args << "/"; // unused; args << "com.genymobile.scrcpy.Server"; - args << QString::number(m_maxSize); - args << QString::number(m_bitRate); + args << QString::number(m_params.maxSize); + args << QString::number(m_params.bitRate); args << (m_tunnelForward ? "true" : "false"); - if (m_crop.isEmpty()) { + if (m_params.crop.isEmpty()) { args << "-"; } else { - args << m_crop; + args << m_params.crop; } - args << (m_sendFrameMeta ? "true" : "false"); + args << (m_params.sendFrameMeta ? "true" : "false"); + args << (m_params.control ? "true" : "false"); + // adb -s P7C0218510000537 shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 0 8000000 false // mark: crop input format: "width:height:x:y" or - for no crop, for example: "100:200:0:0" // 这条adb命令是阻塞运行的,m_serverProcess进程不会退出了 - m_serverProcess.execute(m_serial, args); + m_serverProcess.execute(m_params.serial, args); return true; } -bool Server::start(const QString& serial, quint16 localPort, quint16 maxSize, quint32 bitRate, const QString& crop, bool sendFrameMeta) +bool Server::start(Server::ServerParams params) { - m_serial = serial; - m_localPort = localPort; - m_maxSize = maxSize; - m_bitRate = bitRate; - m_crop = crop; - m_sendFrameMeta = sendFrameMeta; - + m_params = params; m_serverStartStep = SSS_PUSH; return startServerByStep(); } @@ -179,7 +175,7 @@ bool Server::connectTo() // video socket m_videoSocket = new VideoSocket(); - m_videoSocket->connectToHost(QHostAddress::LocalHost, m_localPort); + m_videoSocket->connectToHost(QHostAddress::LocalHost, m_params.localPort); if (!m_videoSocket->waitForConnected(1000)) { stop(); qWarning("video socket connect to server failed"); @@ -206,7 +202,7 @@ bool Server::connectTo() // control socket m_controlSocket = new QTcpSocket(); - m_controlSocket->connectToHost(QHostAddress::LocalHost, m_localPort); + m_controlSocket->connectToHost(QHostAddress::LocalHost, m_params.localPort); if (!m_controlSocket->waitForConnected(1000)) { stop(); qWarning("control socket connect to server failed"); @@ -294,8 +290,8 @@ bool Server::startServerByStep() // client can listen before starting the server app, so there is no need to // try to connect until the server socket is listening on the device. m_serverSocket.setMaxPendingConnections(2); - if (!m_serverSocket.listen(QHostAddress::LocalHost, m_localPort)) { - qCritical(QString("Could not listen on port %1").arg(m_localPort).toStdString().c_str()); + if (!m_serverSocket.listen(QHostAddress::LocalHost, m_params.localPort)) { + qCritical(QString("Could not listen on port %1").arg(m_params.localPort).toStdString().c_str()); m_serverStartStep = SSS_NULL; if (m_tunnelForward) { disableTunnelForward(); diff --git a/QtScrcpy/server/server.h b/QtScrcpy/server/server.h index bccad71..00d7a87 100644 --- a/QtScrcpy/server/server.h +++ b/QtScrcpy/server/server.h @@ -22,10 +22,20 @@ class Server : public QObject SSS_RUNNING, }; public: + struct ServerParams { + QString serial = ""; + quint16 localPort = 27183; + quint16 maxSize = 0; + quint32 bitRate = 8000000; + QString crop = "-"; + bool sendFrameMeta = false; + bool control = true; + }; + explicit Server(QObject *parent = nullptr); virtual ~Server(); - bool start(const QString& serial, quint16 localPort, quint16 maxSize, quint32 bitRate, const QString& crop, bool sendFrameMeta = false); + bool start(Server::ServerParams params); bool connectTo(); VideoSocket* getVideoSocket(); @@ -61,21 +71,16 @@ private: private: QString m_serverPath = ""; AdbProcess m_workProcess; - QString m_serial = ""; AdbProcess m_serverProcess; TcpServer m_serverSocket; // only used if !tunnel_forward QPointer m_videoSocket = Q_NULLPTR; QPointer m_controlSocket = Q_NULLPTR; - quint16 m_localPort = 0; bool m_tunnelEnabled = false; bool m_tunnelForward = false; // use "adb forward" instead of "adb reverse" - bool m_sendFrameMeta = false; - quint16 m_maxSize = 0; - quint32 m_bitRate = 0; - QString m_crop = ""; quint32 m_acceptTimeoutTimer = 0; QString m_deviceName = ""; QSize m_deviceSize = QSize(); + ServerParams m_params; SERVER_START_STEP m_serverStartStep = SSS_NULL; }; diff --git a/QtScrcpy/stream/stream.cpp b/QtScrcpy/stream/stream.cpp index 46110c3..42938e5 100644 --- a/QtScrcpy/stream/stream.cpp +++ b/QtScrcpy/stream/stream.cpp @@ -145,7 +145,7 @@ static qint32 readPacketWithMeta(void *opaque, uint8_t *buf, int bufSize) { quint8 header[HEADER_SIZE]; qint32 r = stream->recvData(header, HEADER_SIZE); if (r == -1) { - return AVERROR(errno); + return errno ? AVERROR(errno) : AVERROR_EOF; } if (r == 0) { return AVERROR_EOF; @@ -173,7 +173,7 @@ static qint32 readPacketWithMeta(void *opaque, uint8_t *buf, int bufSize) { qint32 r = stream->recvData(buf, bufSize); if (r == -1) { - return AVERROR(errno); + return errno ? AVERROR(errno) : AVERROR_EOF; } if (r == 0) { return AVERROR_EOF; diff --git a/QtScrcpy/videoform.cpp b/QtScrcpy/videoform.cpp index 4546d9d..55cc744 100644 --- a/QtScrcpy/videoform.cpp +++ b/QtScrcpy/videoform.cpp @@ -23,7 +23,7 @@ #include "controlmsg.h" #include "mousetap/mousetap.h" -VideoForm::VideoForm(const QString& serial, quint16 maxSize, quint32 bitRate, const QString& fileName, QWidget *parent) : +VideoForm::VideoForm(const QString& serial, quint16 maxSize, quint32 bitRate, const QString& fileName, bool closeScreen, QWidget *parent) : QWidget(parent), ui(new Ui::videoForm), m_serial(serial), @@ -33,6 +33,7 @@ VideoForm::VideoForm(const QString& serial, quint16 maxSize, quint32 bitRate, co ui->setupUi(this); initUI(); + m_closeScreen = closeScreen; m_server = new Server(); m_vb = new VideoBuffer(); m_vb->init(); @@ -55,7 +56,15 @@ VideoForm::VideoForm(const QString& serial, quint16 maxSize, quint32 bitRate, co // only one devices, serial can be null // mark: crop input format: "width:height:x:y" or - for no crop, for example: "100:200:0:0" // sendFrameMeta for recorder mp4 - m_server->start(m_serial, 27183, m_maxSize, m_bitRate, "-", sendFrameMeta); + Server::ServerParams params; + params.serial = m_serial; + params.localPort = 27183; + params.maxSize = m_maxSize; + params.bitRate = m_bitRate; + params.crop = "-"; + params.sendFrameMeta = sendFrameMeta; + params.control = true; + m_server->start(params); }); updateShowSize(size()); @@ -177,6 +186,10 @@ void VideoForm::initSignals() // init controller m_inputConvert.setControlSocket(m_server->getControlSocket()); + + if (m_closeScreen) { + setScreenPowerMode(ControlMsg::SPM_OFF); + } } }); @@ -404,6 +417,16 @@ void VideoForm::postTextInput(QString& text) m_inputConvert.sendControlMsg(controlMsg); } +void VideoForm::setScreenPowerMode(ControlMsg::ScreenPowerMode mode) +{ + ControlMsg* controlMsg = new ControlMsg(ControlMsg::CMT_SET_SCREEN_POWER_MODE); + if (!controlMsg) { + return; + } + controlMsg->setSetScreenPowerModeData(mode); + m_inputConvert.sendControlMsg(controlMsg); +} + void VideoForm::staysOnTop(bool top) { bool needShow = false; diff --git a/QtScrcpy/videoform.h b/QtScrcpy/videoform.h index 1b229c7..edb8deb 100644 --- a/QtScrcpy/videoform.h +++ b/QtScrcpy/videoform.h @@ -24,7 +24,7 @@ class VideoForm : public QWidget Q_OBJECT public: - explicit VideoForm(const QString& serial, quint16 maxSize = 720, quint32 bitRate = 8000000, const QString& fileName = "", QWidget *parent = 0); + explicit VideoForm(const QString& serial, quint16 maxSize = 720, quint32 bitRate = 8000000, const QString& fileName = "", bool closeScreen = false, QWidget *parent = 0); ~VideoForm(); void switchFullScreen(); @@ -43,6 +43,7 @@ public: void setDeviceClipboard(); void clipboardPaste(); void postTextInput(QString& text); + void setScreenPowerMode(ControlMsg::ScreenPowerMode mode); void staysOnTop(bool top = true); @@ -89,6 +90,7 @@ private: Recorder* m_recorder = Q_NULLPTR; QTime m_startTimeCount; QPointer m_loadingWidget; + bool m_closeScreen = false; }; #endif // VIDEOFORM_H diff --git a/TODO.txt b/TODO.txt index dcbd103..85b82f3 100644 --- a/TODO.txt +++ b/TODO.txt @@ -5,11 +5,17 @@ Mac 루serverҪΪapkΪһ뷨ݲʵ֣ -scrcpy 7764a836f1ee02a4540cfc4118c20729018daaac +ͬscrcpy b91ecf52256da73f5c8dca04fb82c13ec826cbd7 b35733edb6df2a00b6af9b1c98627d344c377963 ¼ϵ ֻ¼ƲڣعĿǰvideoform +֡Ϊ̬ãǾ̬ https://github.com/Genymobile/scrcpy/commit/ebccb9f6cc111e8acfbe10d656cac5c1f1b744a0 +ճԱ +ճIJ +ʻ +̴߳ӡ֡ https://github.com/Genymobile/scrcpy/commit/e2a272bf99ecf48fcb050177113f903b3fb323c4 + mark: diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java index 73bb4b5..0a8fe7c 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java @@ -14,14 +14,15 @@ public final class ControlMessage { public static final int TYPE_COLLAPSE_NOTIFICATION_PANEL = 6; public static final int TYPE_GET_CLIPBOARD = 7; public static final int TYPE_SET_CLIPBOARD = 8; + public static final int TYPE_SET_SCREEN_POWER_MODE = 9; - public static final int TYPE_INJECT_TOUCH = 9; + public static final int TYPE_INJECT_TOUCH = 10; private int type; private String text; private int metaState; // KeyEvent.META_* - private int action; // KeyEvent.ACTION_* or MotionEvent.ACTION_* + private int action; // KeyEvent.ACTION_* or MotionEvent.ACTION_* or POWER_MODE_* private int keycode; // KeyEvent.KEYCODE_* private int buttons; // MotionEvent.BUTTON_* private int id; @@ -82,6 +83,16 @@ public final class ControlMessage { return event; } + /** + * @param mode one of the {@code Device.SCREEN_POWER_MODE_*} constants + */ + public static ControlMessage createSetScreenPowerMode(int mode) { + ControlMessage event = new ControlMessage(); + event.type = TYPE_SET_SCREEN_POWER_MODE; + event.action = mode; + return event; + } + public static ControlMessage createEmpty(int type) { ControlMessage event = new ControlMessage(); event.type = type; diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java index c06b599..2d1d96f 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java @@ -12,6 +12,7 @@ public class ControlMessageReader { private static final int INJECT_MOUSE_PAYLOAD_LENGTH = 13; private static final int INJECT_SCROLL_PAYLOAD_LENGTH = 16; private static final int INJECT_TOUCH_PAYLOAD_LENGTH = 10; + private static final int SET_SCREEN_POWER_MODE_PAYLOAD_LENGTH = 1; public static final int TEXT_MAX_LENGTH = 300; public static final int CLIPBOARD_TEXT_MAX_LENGTH = 4093; @@ -50,43 +51,46 @@ public class ControlMessageReader { } int savedPosition = buffer.position(); int type = buffer.get(); - ControlMessage controlEvent; + ControlMessage msg; switch (type) { case ControlMessage.TYPE_INJECT_KEYCODE: - controlEvent = parseInjectKeycode(); + msg = parseInjectKeycode(); break; case ControlMessage.TYPE_INJECT_TEXT: - controlEvent = parseInjectText(); + msg = parseInjectText(); break; case ControlMessage.TYPE_INJECT_MOUSE: - controlEvent = parseInjectMouse(); + msg = parseInjectMouse(); break; case ControlMessage.TYPE_INJECT_TOUCH: - controlEvent = parseInjectMouseTouch(); + msg = parseInjectMouseTouch(); break; case ControlMessage.TYPE_INJECT_SCROLL: - controlEvent = parseInjectScroll(); + msg = parseInjectScroll(); break; case ControlMessage.TYPE_SET_CLIPBOARD: - controlEvent = parseSetClipboard(); + msg = parseSetClipboard(); + break; + case ControlMessage.TYPE_SET_SCREEN_POWER_MODE: + msg = parseSetScreenPowerMode(); break; case ControlMessage.TYPE_BACK_OR_SCREEN_ON: case ControlMessage.TYPE_EXPAND_NOTIFICATION_PANEL: case ControlMessage.TYPE_COLLAPSE_NOTIFICATION_PANEL: case ControlMessage.TYPE_GET_CLIPBOARD: - controlEvent = ControlMessage.createEmpty(type); + msg = ControlMessage.createEmpty(type); break; default: Ln.w("Unknown event type: " + type); - controlEvent = null; + msg = null; break; } - if (controlEvent == null) { + if (msg == null) { // failure, reset savedPosition buffer.position(savedPosition); } - return controlEvent; + return msg; } private ControlMessage parseInjectKeycode() { @@ -157,6 +161,14 @@ public class ControlMessageReader { return ControlMessage.createSetClipboard(text); } + private ControlMessage parseSetScreenPowerMode() { + if (buffer.remaining() < SET_SCREEN_POWER_MODE_PAYLOAD_LENGTH) { + return null; + } + int mode = buffer.get(); + return ControlMessage.createSetScreenPowerMode(mode); + } + private static Position readPosition(ByteBuffer buffer) { int x = toUnsigned(buffer.getShort()); int y = toUnsigned(buffer.getShort()); diff --git a/server/src/main/java/com/genymobile/scrcpy/Controller.java b/server/src/main/java/com/genymobile/scrcpy/Controller.java index 5aeb252..490ce05 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Controller.java +++ b/server/src/main/java/com/genymobile/scrcpy/Controller.java @@ -102,9 +102,21 @@ public class Controller { return sender; } + @SuppressWarnings("checkstyle:MagicNumber") public void control() throws IOException { - // on start, turn screen on - turnScreenOn(); + // on start, power on the device + if (!device.isScreenOn()) { + injectKeycode(KeyEvent.KEYCODE_POWER); + + // dirty hack + // After POWER is injected, the device is powered on asynchronously. + // To turn the device screen off while mirroring, the client will send a message that + // would be handled before the device is actually powered on, so its effect would + // be "canceled" once the device is turned back on. + // Adding this delay prevents to handle the message before the device is actually + // powered on. + SystemClock.sleep(500); + } while (true) { handleEvent(); @@ -145,6 +157,9 @@ public class Controller { case ControlMessage.TYPE_SET_CLIPBOARD: device.setClipboardText(msg.getText()); break; + case ControlMessage.TYPE_SET_SCREEN_POWER_MODE: + device.setScreenPowerMode(msg.getAction()); + break; default: // do nothing } @@ -309,10 +324,6 @@ public class Controller { return device.injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } - private boolean turnScreenOn() { - return device.isScreenOn() || injectKeycode(KeyEvent.KEYCODE_POWER); - } - private boolean pressBackOrTurnScreenOn() { int keycode = device.isScreenOn() ? KeyEvent.KEYCODE_BACK : KeyEvent.KEYCODE_POWER; return injectKeycode(keycode); diff --git a/server/src/main/java/com/genymobile/scrcpy/Device.java b/server/src/main/java/com/genymobile/scrcpy/Device.java index 93b0302..0420587 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Device.java +++ b/server/src/main/java/com/genymobile/scrcpy/Device.java @@ -1,16 +1,21 @@ package com.genymobile.scrcpy; import com.genymobile.scrcpy.wrappers.ServiceManager; +import com.genymobile.scrcpy.wrappers.SurfaceControl; import android.graphics.Point; import android.graphics.Rect; import android.os.Build; +import android.os.IBinder; import android.os.RemoteException; import android.view.IRotationWatcher; import android.view.InputEvent; public final class Device { + public static final int POWER_MODE_OFF = SurfaceControl.POWER_MODE_OFF; + public static final int POWER_MODE_NORMAL = SurfaceControl.POWER_MODE_NORMAL; + public interface RotationListener { void onRotationChanged(int rotation); } @@ -190,6 +195,16 @@ public final class Device { public void setClipboardText(String text) { serviceManager.getClipboardManager().setText(text); + Ln.i("Device clipboard set"); + } + + /** + * @param mode one of the {@code SCREEN_POWER_MODE_*} constants + */ + public void setScreenPowerMode(int mode) { + IBinder d = SurfaceControl.getBuiltInDisplay(0); + SurfaceControl.setDisplayPowerMode(d, mode); + Ln.i("Device screen turned " + (mode == Device.POWER_MODE_OFF ? "off" : "on")); } static Rect flipRect(Rect crop) { diff --git a/server/src/main/java/com/genymobile/scrcpy/Ln.java b/server/src/main/java/com/genymobile/scrcpy/Ln.java index cd466b3..d991419 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Ln.java +++ b/server/src/main/java/com/genymobile/scrcpy/Ln.java @@ -8,7 +8,8 @@ import android.util.Log; */ public final class Ln { - private static final String TAG = "scrcpy"; + private static final String TAG = "qtscrcpy"; + private static final String PREFIX = "[server] "; enum Level { DEBUG, @@ -30,28 +31,28 @@ public final class Ln { public static void d(String message) { if (isEnabled(Level.DEBUG)) { Log.d(TAG, message); - System.out.println("DEBUG: " + message); + System.out.println(PREFIX + "DEBUG: " + message); } } public static void i(String message) { if (isEnabled(Level.INFO)) { Log.i(TAG, message); - System.out.println("INFO: " + message); + System.out.println(PREFIX + "INFO: " + message); } } public static void w(String message) { if (isEnabled(Level.WARN)) { Log.w(TAG, message); - System.out.println("WARN: " + message); + System.out.println(PREFIX + "WARN: " + message); } } public static void e(String message, Throwable throwable) { if (isEnabled(Level.ERROR)) { Log.e(TAG, message, throwable); - System.out.println("ERROR: " + message); + System.out.println(PREFIX + "ERROR: " + message); if (throwable != null) { throwable.printStackTrace(); } diff --git a/server/src/main/java/com/genymobile/scrcpy/Options.java b/server/src/main/java/com/genymobile/scrcpy/Options.java index 0d02451..697cc96 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Options.java +++ b/server/src/main/java/com/genymobile/scrcpy/Options.java @@ -8,6 +8,7 @@ public class Options { private boolean tunnelForward; private Rect crop; private boolean sendFrameMeta; + private boolean control; public int getMaxSize() { return maxSize; @@ -48,4 +49,12 @@ public class Options { public void setSendFrameMeta(boolean sendFrameMeta) { this.sendFrameMeta = sendFrameMeta; } + + public boolean getControl() { + return control; + } + + public void setControl(boolean control) { + this.control = control; + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index 95dbdb3..1c76afd 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -20,11 +20,13 @@ public final class Server { try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) { ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate()); - Controller controller = new Controller(device, connection); + if (options.getControl()) { + Controller controller = new Controller(device, connection); - // asynchronous - startController(controller); - startDeviceMessageSender(controller.getSender()); + // asynchronous + startController(controller); + startDeviceMessageSender(controller.getSender()); + } try { // synchronous @@ -66,7 +68,7 @@ public final class Server { @SuppressWarnings("checkstyle:MagicNumber") private static Options createOptions(String... args) { - if (args.length != 5) { + if (args.length != 6) { throw new IllegalArgumentException("Expecting 5 parameters"); } @@ -88,6 +90,9 @@ public final class Server { boolean sendFrameMeta = Boolean.parseBoolean(args[4]); options.setSendFrameMeta(sendFrameMeta); + boolean control = Boolean.parseBoolean(args[5]); + options.setControl(control); + return options; } diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/SurfaceControl.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/SurfaceControl.java index 8573386..5b5586f 100644 --- a/server/src/main/java/com/genymobile/scrcpy/wrappers/SurfaceControl.java +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/SurfaceControl.java @@ -2,6 +2,7 @@ package com.genymobile.scrcpy.wrappers; import android.annotation.SuppressLint; import android.graphics.Rect; +import android.os.Build; import android.os.IBinder; import android.view.Surface; @@ -10,6 +11,10 @@ public final class SurfaceControl { private static final Class CLASS; + // see + public static final int POWER_MODE_OFF = 0; + public static final int POWER_MODE_NORMAL = 2; + static { try { CLASS = Class.forName("android.view.SurfaceControl"); @@ -71,6 +76,27 @@ public final class SurfaceControl { } } + public static IBinder getBuiltInDisplay(int builtInDisplayId) { + try { + // the method signature has changed in Android Q + // + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + return (IBinder) CLASS.getMethod("getBuiltInDisplay", int.class).invoke(null, builtInDisplayId); + } + return (IBinder) CLASS.getMethod("getPhysicalDisplayToken", long.class).invoke(null, builtInDisplayId); + } catch (Exception e) { + throw new AssertionError(e); + } + } + + public static void setDisplayPowerMode(IBinder displayToken, int mode) { + try { + CLASS.getMethod("setDisplayPowerMode", IBinder.class, int.class).invoke(null, displayToken, mode); + } catch (Exception e) { + throw new AssertionError(e); + } + } + public static void destroyDisplay(IBinder displayToken) { try { CLASS.getMethod("destroyDisplay", IBinder.class).invoke(null, displayToken); diff --git a/third_party/scrcpy-server.jar b/third_party/scrcpy-server.jar index aaad381392003c928cd698c6db555351e26ae007..7abbf27a82c24d565c25b7f3917f24b9a20d2c65 100644 GIT binary patch delta 26986 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