diff options
author | Tezkerek <andrei.ancuta@gmail.com> | 2020-04-09 15:02:13 +0300 |
---|---|---|
committer | Janek Bevendorff <janek@jbev.net> | 2020-04-09 16:46:44 +0300 |
commit | 6128e5d58294f26411160f44da91087ebe7f4b07 (patch) | |
tree | 7d03fe3529cffed57f278a8de6d5d875345c13a7 | |
parent | ef668f552ed20b801f62b9cd2b6cf395c01bab0c (diff) |
[CLI] On Unix, copy to clipboard using wl-clipboard if xclip is not available.
-rw-r--r-- | src/cli/Utils.cpp | 61 | ||||
-rw-r--r-- | tests/TestCli.cpp | 4 |
2 files changed, 42 insertions, 23 deletions
diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp index c20f30ee1..ab7c23186 100644 --- a/src/cli/Utils.cpp +++ b/src/cli/Utils.cpp @@ -273,48 +273,63 @@ namespace Utils { TextStream err(Utils::STDERR); - QString programName = ""; - QStringList arguments; + // List of programs and their arguments + QList<QPair<QString, QString>> clipPrograms; #ifdef Q_OS_UNIX - programName = "xclip"; - arguments << "-i" - << "-selection" - << "clipboard"; + if (QProcessEnvironment::systemEnvironment().contains("WAYLAND_DISPLAY")) { + clipPrograms << qMakePair(QStringLiteral("wl-copy"), QStringLiteral("")); + } else { + clipPrograms << qMakePair(QStringLiteral("xclip"), QStringLiteral("-selection clipboard -i")); + } #endif #ifdef Q_OS_MACOS - programName = "pbcopy"; + clipPrograms << qMakePair(QStringLiteral("pbcopy"), QStringLiteral("")); #endif #ifdef Q_OS_WIN - programName = "clip"; + clipPrograms << qMakePair(QStringLiteral("clip"), QStringLiteral("")); #endif - if (programName.isEmpty()) { + if (clipPrograms.isEmpty()) { err << QObject::tr("No program defined for clipboard manipulation"); err.flush(); return EXIT_FAILURE; } - QScopedPointer<QProcess> clipProcess(new QProcess(nullptr)); - clipProcess->start(programName, arguments); - clipProcess->waitForStarted(); + QStringList failedProgramNames; - if (clipProcess->state() != QProcess::Running) { - err << QObject::tr("Unable to start program %1").arg(programName); - err.flush(); - return EXIT_FAILURE; - } + for (auto prog : clipPrograms) { + QScopedPointer<QProcess> clipProcess(new QProcess(nullptr)); + + // Skip empty parts, otherwise the program may clip the empty string + QStringList progArgs = prog.second.split(" ", QString::SkipEmptyParts); - if (clipProcess->write(text.toLatin1()) == -1) { - qDebug("Unable to write to process : %s", qPrintable(clipProcess->errorString())); + clipProcess->start(prog.first, progArgs); + clipProcess->waitForStarted(); + + if (clipProcess->state() != QProcess::Running) { + failedProgramNames.append(prog.first); + continue; + } + + if (clipProcess->write(text.toLatin1()) == -1) { + qDebug("Unable to write to process : %s", qPrintable(clipProcess->errorString())); + } + clipProcess->waitForBytesWritten(); + clipProcess->closeWriteChannel(); + clipProcess->waitForFinished(); + + if (clipProcess->exitCode() == EXIT_SUCCESS) { + return EXIT_SUCCESS; + } } - clipProcess->waitForBytesWritten(); - clipProcess->closeWriteChannel(); - clipProcess->waitForFinished(); - return clipProcess->exitCode(); + // No clipping program worked + err << QObject::tr("All clipping programs failed. Tried %1\n").arg(failedProgramNames.join(", ")); + err.flush(); + return EXIT_FAILURE; } /** diff --git a/tests/TestCli.cpp b/tests/TestCli.cpp index 31e090bee..4ebc2f4e6 100644 --- a/tests/TestCli.cpp +++ b/tests/TestCli.cpp @@ -473,6 +473,10 @@ void TestCli::testClip() m_stdoutFile->reset(); QString errorOutput(m_stderrFile->readAll()); + if (QProcessEnvironment::systemEnvironment().contains("WAYLAND_DISPLAY")) { + QSKIP("Clip test skipped due to QClipboard and Wayland issues"); + } + if (errorOutput.contains("Unable to start program") || errorOutput.contains("No program defined for clipboard manipulation")) { QSKIP("Clip test skipped due to missing clipboard tool"); |