File indexing completed on 2024-04-28 05:27:40

0001 /*
0002     Work sponsored by the LiMux project of the city of Munich:
0003     SPDX-FileCopyrightText: 2018 Kai Uwe Broulik <kde@broulik.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "kscreenapplet.h"
0009 
0010 #include <QMetaEnum>
0011 #include <QQmlEngine> // for qmlRegisterType
0012 
0013 #include <QDBusConnection>
0014 #include <QDBusMessage>
0015 
0016 #include <KScreen/Config>
0017 #include <KScreen/ConfigMonitor>
0018 #include <KScreen/GetConfigOperation>
0019 #include <KScreen/Mode>
0020 #include <KScreen/Output>
0021 #include <KScreen/SetConfigOperation>
0022 
0023 #include <algorithm>
0024 
0025 KScreenApplet::KScreenApplet(QObject *parent, const KPluginMetaData &data, const QVariantList &args)
0026     : Plasma::Applet(parent, data, args)
0027 {
0028     qmlRegisterUncreatableMetaObject(KScreen::OsdAction::staticMetaObject,
0029                                      "org.kde.private.kscreen",
0030                                      1,
0031                                      0,
0032                                      "OsdAction",
0033                                      QStringLiteral("Can't create OsdAction"));
0034 }
0035 
0036 KScreenApplet::~KScreenApplet() = default;
0037 
0038 void KScreenApplet::init()
0039 {
0040     connect(new KScreen::GetConfigOperation(KScreen::GetConfigOperation::NoEDID),
0041             &KScreen::ConfigOperation::finished,
0042             this,
0043             [this](KScreen::ConfigOperation *op) {
0044                 m_screenConfiguration = qobject_cast<KScreen::GetConfigOperation *>(op)->config();
0045 
0046                 KScreen::ConfigMonitor::instance()->addConfig(m_screenConfiguration);
0047                 connect(KScreen::ConfigMonitor::instance(), &KScreen::ConfigMonitor::configurationChanged, this, &KScreenApplet::checkOutputs);
0048 
0049                 checkOutputs();
0050             });
0051 }
0052 
0053 int KScreenApplet::connectedOutputCount() const
0054 {
0055     return m_connectedOutputCount;
0056 }
0057 
0058 void KScreenApplet::applyLayoutPreset(KScreen::OsdAction::Action action)
0059 {
0060     KScreen::OsdAction::applyAction(m_screenConfiguration, action);
0061 }
0062 
0063 void KScreenApplet::checkOutputs()
0064 {
0065     if (!m_screenConfiguration) {
0066         return;
0067     }
0068 
0069     const int oldConnectedOutputCount = m_connectedOutputCount;
0070 
0071     const auto outputs = m_screenConfiguration->outputs();
0072     m_connectedOutputCount = std::count_if(outputs.begin(), outputs.end(), [](const KScreen::OutputPtr &output) {
0073         return output->isConnected();
0074     });
0075 
0076     if (m_connectedOutputCount != oldConnectedOutputCount) {
0077         emit connectedOutputCountChanged();
0078     }
0079 }
0080 
0081 QVariant KScreenApplet::availableActions()
0082 {
0083     // Need to wrap it in a QVariant, otherwise QML doesn't like the return type
0084     return QVariant::fromValue(KScreen::OsdAction::availableActions());
0085 }
0086 
0087 K_PLUGIN_CLASS(KScreenApplet)
0088 
0089 #include "kscreenapplet.moc"
0090 
0091 #include "moc_kscreenapplet.cpp"