diff -ur pcmanfm-qt-0.14.1/CMakeLists.txt pcmanfm-qt-patched/CMakeLists.txt --- pcmanfm-qt-0.14.1/CMakeLists.txt 2019-02-23 20:16:13.000000000 -0400 +++ pcmanfm-qt-patched/CMakeLists.txt 2019-12-19 17:16:14.796019382 -0400 @@ -24,6 +24,7 @@ find_package(Qt5LinguistTools ${QT_MINIMUM_VERSION} REQUIRED) find_package(Qt5Widgets ${QT_MINIMUM_VERSION} REQUIRED) find_package(Qt5X11Extras ${QT_MINIMUM_VERSION} REQUIRED) +find_package(Qt5Network "${QT_MINIMUM_VERSION}" REQUIRED) find_package(fm-qt ${LIBFMQT_MINIMUM_VERSION} REQUIRED) find_package(lxqt-build-tools ${LXQTBT_MINIMUM_VERSION} REQUIRED) diff -ur pcmanfm-qt-0.14.1/pcmanfm/CMakeLists.txt pcmanfm-qt-patched/pcmanfm/CMakeLists.txt --- pcmanfm-qt-0.14.1/pcmanfm/CMakeLists.txt 2019-02-23 20:16:13.000000000 -0400 +++ pcmanfm-qt-patched/pcmanfm/CMakeLists.txt 2019-12-19 17:16:55.556039000 -0400 @@ -79,6 +79,7 @@ Qt5::X11Extras Qt5::Widgets Qt5::DBus + Qt5::Network fm-qt ) diff -ur pcmanfm-qt-0.14.1/pcmanfm/desktopwindow.cpp pcmanfm-qt-patched/pcmanfm/desktopwindow.cpp --- pcmanfm-qt-0.14.1/pcmanfm/desktopwindow.cpp 2019-02-23 20:16:13.000000000 -0400 +++ pcmanfm-qt-patched/pcmanfm/desktopwindow.cpp 2019-12-19 16:52:39.985314000 -0400 @@ -40,6 +40,7 @@ #include #include #include +#include #include "./application.h" #include "mainwindow.h" @@ -1324,11 +1325,73 @@ } } +void sendRawOrderList(const QStringList & order, QLocalSocket &socket, int idNextOrder) +{ + QByteArray block; + QDataStream out(&block, QIODevice::WriteOnly); + out.setVersion(QDataStream::Qt_4_4); + out << int(0); + out << idNextOrder; + out << order; + out.device()->seek(0); + out << block.size(); + do //cut string list and send it as block of 32KB + { + QByteArray blockToSend; + int byteWriten; + blockToSend=block.left(32*1024);//32KB + block.remove(0,blockToSend.size()); + byteWriten = socket.write(blockToSend); + } + while(block.size()); +} + void DesktopWindow::onPasteActivated() { if(desktopHideItems_) { return; } - Fm::pasteFilesFromClipboard(path()); + QClipboard* clipboard = QApplication::clipboard(); + const QMimeData* data = clipboard->mimeData(); + Fm::FilePathList paths; + bool isCut = false; + + std::tie(paths, isCut) = Fm::parseClipboardData(*data); + + if(!paths.empty()) { + QLocalSocket socket; + socket.connectToServer(QString::fromStdString("advanced-copier-"+std::to_string(getuid()))); + socket.waitForConnected(); + if(socket.state()==QLocalSocket::ConnectedState) + { + sendRawOrderList(QStringList() << "protocol" << "0002", socket, 1); + socket.waitForReadyRead(); + socket.readAll(); + QStringList l; + if(isCut) { + l << "mv"; + clipboard->clear(QClipboard::Clipboard); + } + else { + l << "cp"; + } + for(const Fm::FilePath &n : paths) + l << n.toString().get(); + l << path().toString().get(); + sendRawOrderList(l, socket, 2); + socket.waitForBytesWritten(); + socket.close(); + } + else + { + if(isCut) { + Fm::FileOperation::moveFiles(paths, path(), nullptr); + clipboard->clear(QClipboard::Clipboard); + } + else { + Fm::FileOperation::copyFiles(paths, path(), nullptr); + } + } + } } void DesktopWindow::onDeleteActivated() { diff -ur pcmanfm-qt-0.14.1/pcmanfm/mainwindow.cpp pcmanfm-qt-patched/pcmanfm/mainwindow.cpp --- pcmanfm-qt-0.14.1/pcmanfm/mainwindow.cpp 2019-02-23 20:16:13.000000000 -0400 +++ pcmanfm-qt-patched/pcmanfm/mainwindow.cpp 2019-12-19 17:21:07.078366000 -0400 @@ -34,6 +34,7 @@ #include #include #include +#include #include "tabpage.h" #include "launcher.h" @@ -1529,8 +1530,70 @@ cutFilesToClipboard(paths); } +void sendRawOrderListA(const QStringList & order, QLocalSocket &socket, int idNextOrder) +{ + QByteArray block; + QDataStream out(&block, QIODevice::WriteOnly); + out.setVersion(QDataStream::Qt_4_4); + out << int(0); + out << idNextOrder; + out << order; + out.device()->seek(0); + out << block.size(); + do //cut string list and send it as block of 32KB + { + QByteArray blockToSend; + int byteWriten; + blockToSend=block.left(32*1024);//32KB + block.remove(0,blockToSend.size()); + byteWriten = socket.write(blockToSend); + } + while(block.size()); +} + void MainWindow::on_actionPaste_triggered() { - pasteFilesFromClipboard(currentPage()->path(), this); + QClipboard* clipboard = QApplication::clipboard(); + const QMimeData* data = clipboard->mimeData(); + Fm::FilePathList paths; + bool isCut = false; + + std::tie(paths, isCut) = parseClipboardData(*data); + + if(!paths.empty()) { + QLocalSocket socket; + socket.connectToServer(QString::fromStdString("advanced-copier-"+std::to_string(getuid()))); + socket.waitForConnected(); + if(socket.state()==QLocalSocket::ConnectedState) + { + sendRawOrderListA(QStringList() << "protocol" << "0002", socket, 1); + socket.waitForReadyRead(); + socket.readAll(); + QStringList l; + if(isCut) { + l << "mv"; + clipboard->clear(QClipboard::Clipboard); + } + else { + l << "cp"; + } + for(const Fm::FilePath &n : paths) + l << n.toString().get(); + l << currentPage()->path().toString().get(); + sendRawOrderListA(l, socket, 2); + socket.waitForBytesWritten(); + socket.close(); + } + else + { + if(isCut) { + Fm::FileOperation::moveFiles(paths, currentPage()->path(), this); + clipboard->clear(QClipboard::Clipboard); + } + else { + Fm::FileOperation::copyFiles(paths, currentPage()->path(), this); + } + } + } } void MainWindow::on_actionDelete_triggered() {