diff --git a/dataengines/notifications/notificationaction.cpp b/dataengines/notifications/notificationaction.cpp index b197ccb24..4a8b3cb45 100644 --- a/dataengines/notifications/notificationaction.cpp +++ b/dataengines/notifications/notificationaction.cpp @@ -1,91 +1,93 @@ /* * Copyright © 2008 Rob Scheepmaker * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License version 2 as * published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "notificationaction.h" #include "notificationsengine.h" #include #include void NotificationAction::start() { //qDebug() << "Trying to perform the action " << operationName() << " on " << destination(); //qDebug() << "actionId: " << parameters()["actionId"].toString(); //qDebug() << "params: " << parameters(); if (!m_engine) { setErrorText(i18n("The notification dataEngine is not set.")); setError(-1); emitResult(); return; } const QStringList dest = destination().split(' '); uint id = 0; if (dest.count() > 1 && !dest[1].toInt()) { setErrorText(i18n("Invalid destination: %1", destination())); setError(-2); emitResult(); return; } else if (dest.count() > 1) { id = dest[1].toUInt(); } if (operationName() == QLatin1String("invokeAction")) { //qDebug() << "invoking action on " << id; emit m_engine->ActionInvoked(id, parameters()[QStringLiteral("actionId")].toString()); } else if (operationName() == QLatin1String("userClosed")) { //userClosedNotification deletes the job, so we have to invoke it queued, in this case emitResult() can be called m_engine->metaObject()->invokeMethod(m_engine, "removeNotification", Qt::QueuedConnection, Q_ARG(uint, id), Q_ARG(uint, 2)); } else if (operationName() == QLatin1String("expireNotification")) { //expireNotification deletes the job, so we have to invoke it queued, in this case emitResult() can be called m_engine->metaObject()->invokeMethod(m_engine, "removeNotification", Qt::QueuedConnection, Q_ARG(uint, id), Q_ARG(uint, 1)); } else if (operationName() == QLatin1String("createNotification")) { int expireTimeout = parameters().value(QStringLiteral("expireTimeout")).toInt(); bool isPersistent = parameters().value(QStringLiteral("isPersistent")).toBool(); QVariantMap hints; if (parameters().value(QStringLiteral("skipGrouping")).toBool()) { hints.insert(QStringLiteral("x-kde-skipGrouping"), true); } int rv = m_engine->createNotification(parameters().value(QStringLiteral("appName")).toString(), parameters().value(QStringLiteral("appIcon")).toString(), parameters().value(QStringLiteral("summary")).toString(), parameters().value(QStringLiteral("body")).toString(), isPersistent ? 0 : expireTimeout, parameters().value(QStringLiteral("actions")).toStringList(), hints); setResult(rv); + return; } else if (operationName() == QLatin1String("configureNotification")) { m_engine->configureNotification(parameters()[QStringLiteral("appRealName")].toString(), parameters()[QStringLiteral("eventId")].toString()); } else if (operationName() == QLatin1String("inhibit")) { const QString hint = parameters()[QStringLiteral("hint")].toString(); const QString value = parameters()[QStringLiteral("value")].toString(); auto t = m_engine->createInhibition(hint, value); setResult(QVariant::fromValue(t)); + return; } emitResult(); } diff --git a/klipper/clipboardjob.cpp b/klipper/clipboardjob.cpp index dd5112b52..b2052eb6e 100644 --- a/klipper/clipboardjob.cpp +++ b/klipper/clipboardjob.cpp @@ -1,209 +1,202 @@ /******************************************************************** This file is part of the KDE project. Copyright (C) 2014 Martin Gräßlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #include "clipboardjob.h" #include "klipper.h" #include "history.h" #include "historyitem.h" #include #include #include #include "klipper_debug.h" #include #ifdef HAVE_PRISON #include #endif const static QString s_iconKey = QStringLiteral("icon"); const static QString s_previewKey = QStringLiteral("preview"); const static QString s_previewWidthKey = QStringLiteral("previewWidth"); const static QString s_previewHeightKey = QStringLiteral("previewHeight"); const static QString s_urlKey = QStringLiteral("url"); ClipboardJob::ClipboardJob(Klipper *klipper, const QString &destination, const QString &operation, const QVariantMap ¶meters, QObject *parent) : Plasma::ServiceJob(destination, operation, parameters, parent) , m_klipper(klipper) { } void ClipboardJob::start() { const QString operation = operationName(); // first check for operations not needing an item if (operation == QLatin1String("clearHistory")) { m_klipper->slotAskClearHistory(); setResult(true); - emitResult(); return; } else if (operation == QLatin1String("configureKlipper")) { m_klipper->slotConfigure(); setResult(true); - emitResult(); return; } // other operations need the item HistoryItemConstPtr item = m_klipper->history()->find(QByteArray::fromBase64(destination().toUtf8())); if (item.isNull()) { setResult(false); - emitResult(); return; } if (operation == QLatin1String("select")) { m_klipper->history()->slotMoveToTop(item->uuid()); setResult(true); } else if (operation == QLatin1String("remove")) { m_klipper->history()->remove(item); setResult(true); } else if (operation == QLatin1String("edit")) { connect(m_klipper, &Klipper::editFinished, this, [this, item](HistoryItemConstPtr editedItem, int result) { if (item != editedItem) { // not our item return; } setResult(result); - emitResult(); } ); m_klipper->editData(item); return; } else if (operation == QLatin1String("barcode")) { #ifdef HAVE_PRISON int pixelWidth = parameters().value(QStringLiteral("width")).toInt(); int pixelHeight = parameters().value(QStringLiteral("height")).toInt(); Prison::AbstractBarcode *code = nullptr; switch (parameters().value(QStringLiteral("barcodeType")).toInt()) { case 1: { code = Prison::createBarcode(Prison::DataMatrix); const int size = qMin(pixelWidth, pixelHeight); pixelWidth = size; pixelHeight = size; break; } case 2: { code = Prison::createBarcode(Prison::Code39); break; } case 3: { code = Prison::createBarcode(Prison::Code93); break; } case 4: { code = Prison::createBarcode(Prison::Aztec); break; } case 0: default: { code = Prison::createBarcode(Prison::QRCode); const int size = qMin(pixelWidth, pixelHeight); pixelWidth = size; pixelHeight = size; break; } } if (code) { code->setData(item->text()); QFutureWatcher *watcher = new QFutureWatcher(this); connect(watcher, &QFutureWatcher::finished, this, [this, watcher, code] { setResult(watcher->result()); watcher->deleteLater(); delete code; - emitResult(); } ); auto future = QtConcurrent::run(code, &Prison::AbstractBarcode::toImage, QSizeF(pixelWidth, pixelHeight)); watcher->setFuture(future); return; } else { setResult(false); } #else setResult(false); #endif } else if (operation == QLatin1String("action")) { m_klipper->urlGrabber()->invokeAction(item); setResult(true); } else if (operation == s_previewKey) { const int pixelWidth = parameters().value(s_previewWidthKey).toInt(); const int pixelHeight = parameters().value(s_previewHeightKey).toInt(); QUrl url = parameters().value(s_urlKey).toUrl(); qCDebug(KLIPPER_LOG) << "URL: " << url; KFileItem item(url); if (pixelWidth <= 0 || pixelHeight <= 0) { qCWarning(KLIPPER_LOG) << "Preview size invalid: " << pixelWidth << "x" << pixelHeight; iconResult(item); return; } if (!url.isValid() || !url.isLocalFile()) { // no remote files qCWarning(KLIPPER_LOG) << "Invalid or non-local url for preview: " << url; iconResult(item); return; } KFileItemList urls; urls << item; KIO::PreviewJob* job = KIO::filePreview(urls, QSize(pixelWidth, pixelHeight)); job->setIgnoreMaximumSize(true); connect(job, &KIO::PreviewJob::gotPreview, this, [this](const KFileItem &item, const QPixmap &preview) { QVariantMap res; res.insert(s_urlKey, item.url()); res.insert(s_previewKey, preview); res.insert(s_iconKey, false); res.insert(s_previewWidthKey, preview.size().width()); res.insert(s_previewHeightKey, preview.size().height()); setResult(res); - emitResult(); } ); connect(job, &KIO::PreviewJob::failed, this, [this](const KFileItem &item) { iconResult(item); } ); job->start(); return; } else { setResult(false); } emitResult(); } void ClipboardJob::iconResult(const KFileItem& item) { QVariantMap res; res.insert(s_urlKey, item.url()); QPixmap pix = QIcon::fromTheme(item.determineMimeType().iconName()).pixmap(128, 128); res.insert(s_previewKey, pix); res.insert(s_iconKey, true); res.insert(QStringLiteral("iconName"), item.currentMimeType().iconName()); res.insert(s_previewWidthKey, pix.size().width()); res.insert(s_previewHeightKey, pix.size().height()); setResult(res); - emitResult(); }