From 39a60415222ac9767697c5cd00f188c344e3f28b Mon Sep 17 00:00:00 2001 From: wangcong Date: Thu, 7 Mar 2024 10:35:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E5=BA=94=E7=AD=94?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=EF=BC=8C=E4=BB=A5=E4=BF=9D=E8=AF=81=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=95=B0=E6=8D=AE=E9=87=8F=E5=A4=AA=E5=A4=A7=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=97=A0=E6=B3=95=E4=BF=9D=E5=AD=98=E5=88=B0=E5=89=AA?= =?UTF-8?q?=E5=88=87=E6=9D=BF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description: 同步主线提交29d68826cf1c5fef9afc288e80d717311272c7f0到当前分支 Log: 添加应答信号,以保证图片数据量太大时,无法保存到剪切板的问题 Bug: https://pms.uniontech.com/bug-view-246613.html --- src/main_window.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++ src/main_window.h | 15 ++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/main_window.cpp b/src/main_window.cpp index 962277cf..c6481b5c 100755 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -93,6 +93,10 @@ const int CURSOR_WIDTH = 8; const int CURSOR_HEIGHT = 18; const int INDICATOR_WIDTH = 110; } +const static QString ClipboardService = QStringLiteral("com.deepin.daemon.Clipboard"); +const static QString ClipboardPath = QStringLiteral("/com/deepin/dde/ClipboardLoader"); +const static QString ClipboardInterface = QStringLiteral("com.deepin.dde.ClipboardLoader"); +const static QString ClipboardSignal = QStringLiteral("dataComing"); //DWM_USE_NAMESPACE MainWindow::MainWindow(DWidget *parent) : @@ -1060,6 +1064,7 @@ void MainWindow::initScrollShot() if (Utils::isWaylandMode) { if (this->windowHandle()) { this->hide(); + this->setWindowFlag(Qt::WindowDoesNotAcceptFocus,false); //滚动截图需要焦点,才可以将数据传递剪切板 this->windowHandle()->setProperty("_d_dwayland_window-type", ""); qDebug() << "重设窗口属性 _d_dwayland_window-type: " << this->windowHandle()->property("_d_dwayland_window-type"); this->show(); @@ -1782,6 +1787,24 @@ void MainWindow::save2Clipboard(const QPixmap &pix) return; } if (Utils::is3rdInterfaceStart == false) { + //检测保存到剪切板是否完成 + qInfo() << "Connecting the clipboard feedback signal..." + << "\nClipboardService: " << ClipboardService + << "\nClipboardPath: " << ClipboardPath + << "\nClipboardInterface: " << ClipboardInterface + << "\nClipboardSignal: " << ClipboardSignal; + bool isSuccess = QDBusConnection::sessionBus().connect(ClipboardService, + ClipboardPath, + ClipboardInterface, + ClipboardSignal, + this, + SLOT(onSaveClipboardComing(const QByteArray &)) + ); + if(isSuccess){ + qInfo() << "The clipper feedback signal connection is successfully established!"; + }else{ + qWarning() << "Clipper feedback signal connection failed!"; + } QMimeData *t_imageData = new QMimeData; // Wayland 等待剪贴板dataChanged信号不可靠,出问题会导致整改系统不可用,评估去掉信号等待 受概率不能保存到剪切板影响,暂时需要还原 if (Utils::isWaylandMode) { @@ -1825,10 +1848,45 @@ void MainWindow::save2Clipboard(const QPixmap &pix) qInfo() << __FUNCTION__ << __LINE__ << "将数据传递到剪贴板!"; cb->setMimeData(t_imageData, QClipboard::Clipboard); } + //剪切板应答信号建立成功时,才会进行等待15s,不然不需要等待15s + if(isSuccess){ + if (!Utils::isWaylandMode) { + this->hide(); //隐藏主界面 + } + //等待15s如果数据还没有传递到剪切板,则退出程序 + time_t endTime = time(nullptr) + 15; + qInfo() << "Start Wait 15s for data to be saved to the clipboard..." << endTime; + time_t lastTime = 0; + while (1) { + time_t curTime = time(nullptr); + if (curTime != lastTime) { + qInfo() << lastTime << "==" << curTime; + lastTime = curTime; + } + if (curTime >= endTime) { + qInfo() << "15s delayed completion" << time(nullptr); + break; + } + if(m_isSaveClipboard){ + qInfo() << "Data has been passed to the clipboard"; + break; + } + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } + } } qInfo() << __FUNCTION__ << __LINE__ << "已保存到剪贴板!"; } +//监听剪切板的信号,确保数据已经传递到剪切板,应用才退出1070采用 +void MainWindow::onSaveClipboardComing(const QByteArray &msg) +{ + Q_UNUSED(msg); + qInfo() << "Received data transfer to the clipboard complete signal!" ; + emit saveClipboardComing(); + m_isSaveClipboard = true; +} + bool MainWindow::checkSuffix(const QString &str) { qInfo() << __FUNCTION__ << __LINE__ << "正在检查文件名称是否合法..."; diff --git a/src/main_window.h b/src/main_window.h index d26d27dc..63707ef7 100755 --- a/src/main_window.h +++ b/src/main_window.h @@ -344,6 +344,11 @@ class MainWindow : public DWidget void changeMicrophoneSelectEvent(bool checked); void changeSystemAudioSelectEvent(bool checked); void stopRecordArm(); + /** + * @brief saveClipboardComing 数据是否已传递到剪切板 + */ + void saveClipboardComing(); + public slots: void onExit(); /** @@ -518,6 +523,12 @@ public slots: */ void onLockScreenEvent(QDBusMessage msg); + /** + * @brief onSaveClipboardComing 监听剪切板的信号,确保数据已经传递到剪切板,应用才退出 + * @param msg + */ + void onSaveClipboardComing(const QByteArray &msg); + /** * @brief 打开截图录屏帮助文档并定位到滚动截图 */ @@ -1038,6 +1049,10 @@ public slots: bool m_isScreenVertical = false; // 判断多屏是否纵向布局 bool m_isLockedState = false; bool m_isScreenResolutionChanged = false; + /** + * @brief m_isSaveClipboard 是否已经保存到剪切板 + */ + bool m_isSaveClipboard = false; }; #endif //MAINWINDOW_H