File indexing completed on 2024-12-01 05:02:02

0001 /*
0002     SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 #include "KWayland/Client/dpms.h"
0007 #include "KWayland/Client/connection_thread.h"
0008 #include "KWayland/Client/output.h"
0009 #include "KWayland/Client/registry.h"
0010 #include <QApplication>
0011 #include <QDialogButtonBox>
0012 #include <QFormLayout>
0013 #include <QLabel>
0014 #include <QPushButton>
0015 #include <QVBoxLayout>
0016 #include <QWidget>
0017 
0018 using namespace KWayland::Client;
0019 
0020 static QString modeToString(Dpms::Mode mode)
0021 {
0022     switch (mode) {
0023     case Dpms::Mode::On:
0024         return QStringLiteral("On");
0025     case Dpms::Mode::Standby:
0026         return QStringLiteral("Standby");
0027     case Dpms::Mode::Suspend:
0028         return QStringLiteral("Suspend");
0029     case Dpms::Mode::Off:
0030         return QStringLiteral("Off");
0031     default:
0032         Q_UNREACHABLE();
0033     }
0034 }
0035 
0036 QString supportedToString(bool supported)
0037 {
0038     return supported ? QStringLiteral("Yes") : QStringLiteral("No");
0039 }
0040 
0041 static QLayout *setupOutput(Registry::AnnouncedInterface outputInterface, Registry *registry, DpmsManager *manager)
0042 {
0043     Output *output = registry->createOutput(outputInterface.name, outputInterface.version, registry);
0044     QLabel *label = new QLabel(output->model());
0045     QObject::connect(
0046         output,
0047         &Output::changed,
0048         label,
0049         [label, output] {
0050             label->setText(output->model());
0051         },
0052         Qt::QueuedConnection);
0053 
0054     Dpms *dpms = nullptr;
0055     if (manager) {
0056         dpms = manager->getDpms(output, output);
0057     }
0058 
0059     QFormLayout *dpmsForm = new QFormLayout;
0060     bool supported = dpms ? dpms->isSupported() : false;
0061     QLabel *supportedLabel = new QLabel(supportedToString(supported));
0062     dpmsForm->addRow(QStringLiteral("Supported:"), supportedLabel);
0063     QLabel *modeLabel = new QLabel(modeToString(dpms ? dpms->mode() : Dpms::Mode::On));
0064     dpmsForm->addRow(QStringLiteral("Mode:"), modeLabel);
0065 
0066     QPushButton *standbyButton = new QPushButton(QStringLiteral("Standby"));
0067     QPushButton *suspendButton = new QPushButton(QStringLiteral("Suspend"));
0068     QPushButton *offButton = new QPushButton(QStringLiteral("Off"));
0069     standbyButton->setEnabled(supported);
0070     suspendButton->setEnabled(supported);
0071     offButton->setEnabled(supported);
0072     QDialogButtonBox *bg = new QDialogButtonBox;
0073     bg->addButton(standbyButton, QDialogButtonBox::ActionRole);
0074     bg->addButton(suspendButton, QDialogButtonBox::ActionRole);
0075     bg->addButton(offButton, QDialogButtonBox::ActionRole);
0076 
0077     if (dpms) {
0078         QObject::connect(
0079             dpms,
0080             &Dpms::supportedChanged,
0081             supportedLabel,
0082             [supportedLabel, dpms, standbyButton, suspendButton, offButton] {
0083                 const bool supported = dpms->isSupported();
0084                 supportedLabel->setText(supportedToString(supported));
0085                 standbyButton->setEnabled(supported);
0086                 suspendButton->setEnabled(supported);
0087                 offButton->setEnabled(supported);
0088             },
0089             Qt::QueuedConnection);
0090         QObject::connect(
0091             dpms,
0092             &Dpms::modeChanged,
0093             modeLabel,
0094             [modeLabel, dpms] {
0095                 modeLabel->setText(modeToString(dpms->mode()));
0096             },
0097             Qt::QueuedConnection);
0098         QObject::connect(standbyButton, &QPushButton::clicked, dpms, [dpms] {
0099             dpms->requestMode(Dpms::Mode::Standby);
0100         });
0101         QObject::connect(suspendButton, &QPushButton::clicked, dpms, [dpms] {
0102             dpms->requestMode(Dpms::Mode::Suspend);
0103         });
0104         QObject::connect(offButton, &QPushButton::clicked, dpms, [dpms] {
0105             dpms->requestMode(Dpms::Mode::Off);
0106         });
0107     }
0108 
0109     QVBoxLayout *layout = new QVBoxLayout;
0110     layout->addWidget(label);
0111     layout->addLayout(dpmsForm);
0112     layout->addWidget(bg);
0113     return layout;
0114 }
0115 
0116 int main(int argc, char **argv)
0117 {
0118     qputenv("QT_QPA_PLATFORM", QByteArrayLiteral("wayland"));
0119     QApplication app(argc, argv);
0120 
0121     QWidget window;
0122 
0123     ConnectionThread *connection = ConnectionThread::fromApplication();
0124     Registry registry;
0125     registry.create(connection);
0126     QObject::connect(
0127         &registry,
0128         &Registry::interfacesAnnounced,
0129         &app,
0130         [&registry, &window] {
0131             const bool hasDpms = registry.hasInterface(Registry::Interface::Dpms);
0132             QLabel *hasDpmsLabel = new QLabel(&window);
0133             if (hasDpms) {
0134                 hasDpmsLabel->setText(QStringLiteral("Compositor provides a DpmsManager"));
0135             } else {
0136                 hasDpmsLabel->setText(QStringLiteral("Compositor does not provide a DpmsManager"));
0137             }
0138 
0139             QVBoxLayout *layout = new QVBoxLayout;
0140             layout->addWidget(hasDpmsLabel);
0141             QFrame *hline = new QFrame;
0142             hline->setFrameShape(QFrame::HLine);
0143             layout->addWidget(hline);
0144 
0145             DpmsManager *dpmsManager = nullptr;
0146             if (hasDpms) {
0147                 const auto dpmsData = registry.interface(Registry::Interface::Dpms);
0148                 dpmsManager = registry.createDpmsManager(dpmsData.name, dpmsData.version);
0149             }
0150 
0151             // get all Outputs
0152             const auto outputs = registry.interfaces(Registry::Interface::Output);
0153             for (auto o : outputs) {
0154                 layout->addLayout(setupOutput(o, &registry, dpmsManager));
0155                 QFrame *hline = new QFrame;
0156                 hline->setFrameShape(QFrame::HLine);
0157                 layout->addWidget(hline);
0158             }
0159 
0160             window.setLayout(layout);
0161             window.show();
0162         },
0163         Qt::QueuedConnection);
0164     registry.setup();
0165 
0166     return app.exec();
0167 }