Advance Wayland and KDE package bring-up
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#include "KWayland/Client/dpms.h"
|
||||
#include "KWayland/Client/connection_thread.h"
|
||||
#include "KWayland/Client/output.h"
|
||||
#include "KWayland/Client/registry.h"
|
||||
#include <QApplication>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QFormLayout>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWidget>
|
||||
|
||||
using namespace KWayland::Client;
|
||||
|
||||
static QString modeToString(Dpms::Mode mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case Dpms::Mode::On:
|
||||
return QStringLiteral("On");
|
||||
case Dpms::Mode::Standby:
|
||||
return QStringLiteral("Standby");
|
||||
case Dpms::Mode::Suspend:
|
||||
return QStringLiteral("Suspend");
|
||||
case Dpms::Mode::Off:
|
||||
return QStringLiteral("Off");
|
||||
default:
|
||||
Q_UNREACHABLE();
|
||||
}
|
||||
}
|
||||
|
||||
QString supportedToString(bool supported)
|
||||
{
|
||||
return supported ? QStringLiteral("Yes") : QStringLiteral("No");
|
||||
}
|
||||
|
||||
static QLayout *setupOutput(Registry::AnnouncedInterface outputInterface, Registry *registry, DpmsManager *manager)
|
||||
{
|
||||
Output *output = registry->createOutput(outputInterface.name, outputInterface.version, registry);
|
||||
QLabel *label = new QLabel(output->model());
|
||||
QObject::connect(
|
||||
output,
|
||||
&Output::changed,
|
||||
label,
|
||||
[label, output] {
|
||||
label->setText(output->model());
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
|
||||
Dpms *dpms = nullptr;
|
||||
if (manager) {
|
||||
dpms = manager->getDpms(output, output);
|
||||
}
|
||||
|
||||
QFormLayout *dpmsForm = new QFormLayout;
|
||||
bool supported = dpms ? dpms->isSupported() : false;
|
||||
QLabel *supportedLabel = new QLabel(supportedToString(supported));
|
||||
dpmsForm->addRow(QStringLiteral("Supported:"), supportedLabel);
|
||||
QLabel *modeLabel = new QLabel(modeToString(dpms ? dpms->mode() : Dpms::Mode::On));
|
||||
dpmsForm->addRow(QStringLiteral("Mode:"), modeLabel);
|
||||
|
||||
QPushButton *standbyButton = new QPushButton(QStringLiteral("Standby"));
|
||||
QPushButton *suspendButton = new QPushButton(QStringLiteral("Suspend"));
|
||||
QPushButton *offButton = new QPushButton(QStringLiteral("Off"));
|
||||
standbyButton->setEnabled(supported);
|
||||
suspendButton->setEnabled(supported);
|
||||
offButton->setEnabled(supported);
|
||||
QDialogButtonBox *bg = new QDialogButtonBox;
|
||||
bg->addButton(standbyButton, QDialogButtonBox::ActionRole);
|
||||
bg->addButton(suspendButton, QDialogButtonBox::ActionRole);
|
||||
bg->addButton(offButton, QDialogButtonBox::ActionRole);
|
||||
|
||||
if (dpms) {
|
||||
QObject::connect(
|
||||
dpms,
|
||||
&Dpms::supportedChanged,
|
||||
supportedLabel,
|
||||
[supportedLabel, dpms, standbyButton, suspendButton, offButton] {
|
||||
const bool supported = dpms->isSupported();
|
||||
supportedLabel->setText(supportedToString(supported));
|
||||
standbyButton->setEnabled(supported);
|
||||
suspendButton->setEnabled(supported);
|
||||
offButton->setEnabled(supported);
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
QObject::connect(
|
||||
dpms,
|
||||
&Dpms::modeChanged,
|
||||
modeLabel,
|
||||
[modeLabel, dpms] {
|
||||
modeLabel->setText(modeToString(dpms->mode()));
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
QObject::connect(standbyButton, &QPushButton::clicked, dpms, [dpms] {
|
||||
dpms->requestMode(Dpms::Mode::Standby);
|
||||
});
|
||||
QObject::connect(suspendButton, &QPushButton::clicked, dpms, [dpms] {
|
||||
dpms->requestMode(Dpms::Mode::Suspend);
|
||||
});
|
||||
QObject::connect(offButton, &QPushButton::clicked, dpms, [dpms] {
|
||||
dpms->requestMode(Dpms::Mode::Off);
|
||||
});
|
||||
}
|
||||
|
||||
QVBoxLayout *layout = new QVBoxLayout;
|
||||
layout->addWidget(label);
|
||||
layout->addLayout(dpmsForm);
|
||||
layout->addWidget(bg);
|
||||
return layout;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
qputenv("QT_QPA_PLATFORM", QByteArrayLiteral("wayland"));
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QWidget window;
|
||||
|
||||
ConnectionThread *connection = ConnectionThread::fromApplication();
|
||||
Registry registry;
|
||||
registry.create(connection);
|
||||
QObject::connect(
|
||||
®istry,
|
||||
&Registry::interfacesAnnounced,
|
||||
&app,
|
||||
[®istry, &window] {
|
||||
const bool hasDpms = registry.hasInterface(Registry::Interface::Dpms);
|
||||
QLabel *hasDpmsLabel = new QLabel(&window);
|
||||
if (hasDpms) {
|
||||
hasDpmsLabel->setText(QStringLiteral("Compositor provides a DpmsManager"));
|
||||
} else {
|
||||
hasDpmsLabel->setText(QStringLiteral("Compositor does not provide a DpmsManager"));
|
||||
}
|
||||
|
||||
QVBoxLayout *layout = new QVBoxLayout;
|
||||
layout->addWidget(hasDpmsLabel);
|
||||
QFrame *hline = new QFrame;
|
||||
hline->setFrameShape(QFrame::HLine);
|
||||
layout->addWidget(hline);
|
||||
|
||||
DpmsManager *dpmsManager = nullptr;
|
||||
if (hasDpms) {
|
||||
const auto dpmsData = registry.interface(Registry::Interface::Dpms);
|
||||
dpmsManager = registry.createDpmsManager(dpmsData.name, dpmsData.version);
|
||||
}
|
||||
|
||||
// get all Outputs
|
||||
const auto outputs = registry.interfaces(Registry::Interface::Output);
|
||||
for (auto o : outputs) {
|
||||
layout->addLayout(setupOutput(o, ®istry, dpmsManager));
|
||||
QFrame *hline = new QFrame;
|
||||
hline->setFrameShape(QFrame::HLine);
|
||||
layout->addWidget(hline);
|
||||
}
|
||||
|
||||
window.setLayout(layout);
|
||||
window.show();
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
registry.setup();
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
Reference in New Issue
Block a user