From 87f765245d5060940a9299eb1910b6a76f15d5cf Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Sun, 17 Dec 2017 19:59:16 +0100 Subject: [PATCH] Add external screenshotter support for wayland!! --- src/screenshotter.cpp | 16 ++++++-- src/settingsdialog.cpp | 10 +++++ src/settingsdialog.hpp | 6 +-- src/settingsdialog.ui | 90 ++++++++++++++++++++++++++---------------- src/utils.cpp | 66 ++++++++++++++++++++++++++++++- src/utils.hpp | 6 ++- 6 files changed, 150 insertions(+), 44 deletions(-) diff --git a/src/screenshotter.cpp b/src/screenshotter.cpp index 3f7a6d4..19635b7 100644 --- a/src/screenshotter.cpp +++ b/src/screenshotter.cpp @@ -8,11 +8,18 @@ #include #include -void screenshotter::area() { - CropEditor *editor = new CropEditor(utils::fullscreen(settings::settings().value("captureCursor", true).toBool())); +void areaScreenshotCallback(QPixmap p) { + CropEditor *editor = new CropEditor(p); QObject::connect(editor, &CropEditor::cropped, [&](QPixmap pixmap) { UploaderSingleton::inst().upload(pixmap); }); } +void screenshotter::area() { + if (!settings::settings().value("command/fullscreenCommand", "").toString().isEmpty()) + utils::externalScreenshot(areaScreenshotCallback); + else + areaScreenshotCallback(utils::fullscreen(settings::settings().value("captureCursor", true).toBool())); +} + void screenshotter::fullscreen() { UploaderSingleton::inst().upload(utils::fullscreen(settings::settings().value("captureCursor", true).toBool())); } @@ -31,6 +38,9 @@ void screenshotter::activeDelayed() { void screenshotter::active() { #ifdef PLATFORM_CAPABILITY_ACTIVEWINDOW - UploaderSingleton::inst().upload(utils::window(PlatformBackend::inst().getActiveWID())); + if (!settings::settings().value("command/activeCommand", "").toString().isEmpty()) + utils::externalScreenshotActive([](QPixmap p) { UploaderSingleton::inst().upload(p); }); + else + UploaderSingleton::inst().upload(utils::window(PlatformBackend::inst().getActiveWID())); #endif } diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 8aeb47b..0e40e84 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -84,6 +84,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Se ui->captureCursor->setText(tr("Capture cursor (disabled: implementation missing)")); #endif ui->fpsMax->setValue(settings::settings().value("recording/framerate", 30).toInt()); + ui->focusedCapture->setText(settings::settings().value("command/activeCommand", "").toString()); + ui->fullscreenCapture->setText(settings::settings().value("command/fullscreenCommand", 0).toString()); } void SettingsDialog::setScheme(QString scheme) { @@ -173,6 +175,14 @@ void SettingsDialog::on_cropY_valueChanged(int arg1) { settings::settings().setValue("cropy", arg1); } +void SettingsDialog::on_focusedCapture_textChanged(QString arg1) { + settings::settings().setValue("command/activeCommand", arg1); +} + +void SettingsDialog::on_fullscreenCapture_textChanged(QString arg1) { + settings::settings().setValue("command/fullscreenCommand", arg1); +} + void SettingsDialog::on_fpsMax_valueChanged(int arg1) { settings::settings().setValue("recording/framerate", arg1); } diff --git a/src/settingsdialog.hpp b/src/settingsdialog.hpp index 59cf62d..d1b57ac 100644 --- a/src/settingsdialog.hpp +++ b/src/settingsdialog.hpp @@ -33,13 +33,11 @@ private slots: void newUploader(Uploader *u); void uploaderChanged(QString newName); void on_saveLocation_currentIndexChanged(int index); - void on_cropX_valueChanged(int arg1); - void on_cropY_valueChanged(int arg1); - void on_fpsMax_valueChanged(int arg1); - + void on_fullscreenCapture_textChanged(QString newVal); + void on_focusedCapture_textChanged(QString newVal); private: Ui::SettingsDialog *ui; }; diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index a10374b..5ff0980 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -6,8 +6,8 @@ 0 0 - 485 - 655 + 650 + 759 @@ -17,19 +17,8 @@ - - - - Quick mode (mouse release screenshots) - - - - - - - Delay before taking a screenshot - - + + @@ -44,11 +33,19 @@ - - + + + + Quick mode (mouse release screenshots) + + - - + + + + Fullscreen capture command (save to %FILE_PATH or print to stdout) + + @@ -64,6 +61,16 @@ + + + + + + + Delay before taking a screenshot + + + @@ -109,20 +116,6 @@ - - - - Open settings directory - - - - - - - Destination: - - - @@ -137,7 +130,21 @@ - + + + + Open settings directory + + + + + + + Destination: + + + + Qt::Horizontal @@ -154,7 +161,7 @@ - + Advanced @@ -223,6 +230,19 @@ + + + + + + + Focused capture command (save to %FILE_PATH or print to stdout) + + + + + + diff --git a/src/utils.cpp b/src/utils.cpp index c3f392a..50db503 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -5,9 +5,10 @@ #include #include #include +#include #include #include - +#include QColor utils::invertColor(QColor color) { return QColor(255 - color.red(), 255 - color.green(), 255 - color.blue()); @@ -113,3 +114,66 @@ QPixmap utils::renderText(QString toRender, int padding, QColor background, QCol painter.end(); return renderred; } + +QString utils::randomString(int length) { + QString str; + str.resize(length); + for (int s = 0; s < length; s++) str[s] = QChar('A' + char(qrand() % ('Z' - 'A'))); + return str; +} + +void utils::externalScreenshot(std::function callback) { + QString cmd = settings::settings().value("command/fullscreenCommand", "").toString(); + QStringList args = cmd.split(' '); + QString tempPath; + for (QString &arg : args) { + if (arg == "%FILE_PATH") { + if (tempPath.isEmpty()) tempPath = "KShare-Ext-Screenshot." + randomString(5); + arg = tempPath; + } + } + QProcess *process = new QProcess; + QObject::connect(process, QOverload::of(&QProcess::finished), + [callback, process, tempPath](int code, QProcess::ExitStatus) { + if (code != 0) { + qCritical().noquote() << "Failed to take external screenshot: \n" + << process->readAllStandardError(); + return; + } + QPixmap pixmap; + if (!tempPath.isEmpty()) + pixmap.load(tempPath); + else + pixmap.loadFromData(process->readAllStandardOutput()); + callback(pixmap); + }); + process->start(args.takeFirst(), args); +} + +void utils::externalScreenshotActive(std::function callback) { + QString cmd = settings::settings().value("command/activeCommand", "").toString(); + QStringList args = cmd.split(' '); + QString tempPath; + for (QString &arg : args) { + if (arg == "%FILE_PATH") { + if (tempPath.isEmpty()) tempPath = "KShare-Ext-Screenshot." + randomString(5); + arg = tempPath; + } + } + QProcess *process = new QProcess; + QObject::connect(process, QOverload::of(&QProcess::finished), + [callback, process, tempPath](int code, QProcess::ExitStatus) { + if (code != 0) { + qCritical().noquote() << "Failed to take external screenshot: \n" + << process->readAllStandardError(); + return; + } + QPixmap pixmap; + if (!tempPath.isEmpty()) + pixmap.load(tempPath); + else + pixmap.loadFromData(process->readAllStandardOutput()); + callback(pixmap); + }); + process->start(args.takeFirst(), args); +} diff --git a/src/utils.hpp b/src/utils.hpp index ded3cba..263b9b5 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -3,8 +3,9 @@ #include #include -#include #include +#include +#include namespace utils { QColor invertColor(QColor color); @@ -16,6 +17,9 @@ namespace utils { QPoint smallestScreenCoordinate(); QPixmap renderText(QString toRender, int padding = 5, QColor background = Qt::transparent, QColor pen = Qt::white, QFont font = QFont()); + void externalScreenshot(std::function callback); + void externalScreenshotActive(std::function callback); + QString randomString(int length); } #endif // UTILS_HPP