File indexing completed on 2024-12-29 05:00:16

0001 /*
0002  * SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "grabwidget.h"
0008 
0009 #include <QApplication>
0010 #include <QClipboard>
0011 #include <QDBusConnection>
0012 #include <QDBusMessage>
0013 #include <QDBusMetaType>
0014 #include <QDBusPendingCall>
0015 #include <QDBusPendingCallWatcher>
0016 #include <QDBusPendingReply>
0017 
0018 Q_DECLARE_METATYPE(QColor)
0019 
0020 QDBusArgument &operator<<(QDBusArgument &argument, const QColor &color)
0021 {
0022     argument.beginStructure();
0023     argument << color.rgba();
0024     argument.endStructure();
0025     return argument;
0026 }
0027 
0028 const QDBusArgument &operator>>(const QDBusArgument &argument, QColor &color)
0029 {
0030     argument.beginStructure();
0031     QRgb rgba;
0032     argument >> rgba;
0033     argument.endStructure();
0034     color = QColor::fromRgba(rgba);
0035     return argument;
0036 }
0037 
0038 GrabWidget::GrabWidget(QObject *parent)
0039     : QObject(parent)
0040 {
0041     qDBusRegisterMetaType<QColor>();
0042 }
0043 
0044 QColor GrabWidget::currentColor() const
0045 {
0046     return m_currentColor;
0047 }
0048 
0049 void GrabWidget::setCurrentColor(const QColor &color)
0050 {
0051     if (m_currentColor == color) {
0052         return;
0053     }
0054     m_currentColor = color;
0055 
0056     Q_EMIT currentColorChanged();
0057 }
0058 
0059 void GrabWidget::pick()
0060 {
0061     QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.KWin"),
0062                                                       QStringLiteral("/ColorPicker"),
0063                                                       QStringLiteral("org.kde.kwin.ColorPicker"),
0064                                                       QStringLiteral("pick"));
0065     auto call = QDBusConnection::sessionBus().asyncCall(msg);
0066     QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
0067     connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *watcher) {
0068         watcher->deleteLater();
0069         QDBusPendingReply<QColor> reply = *watcher;
0070         if (!reply.isError()) {
0071             setCurrentColor(reply.value());
0072         }
0073     });
0074 }
0075 
0076 void GrabWidget::copyToClipboard(const QString &text)
0077 {
0078     QApplication::clipboard()->setText(text);
0079 }