Update to changes in Plasma WaylandProtocols to support primary displays
Adds support for kde-primary-output. Ports to changes in kde-output-management-v2.
This commit is contained in:
parent
4da5fff033
commit
07a1db9b51
8 changed files with 165 additions and 4 deletions
|
@ -42,6 +42,7 @@ set(SERVER_LIB_SRCS
|
||||||
pointer_interface.cpp
|
pointer_interface.cpp
|
||||||
pointerconstraints_v1_interface.cpp
|
pointerconstraints_v1_interface.cpp
|
||||||
pointergestures_v1_interface.cpp
|
pointergestures_v1_interface.cpp
|
||||||
|
primaryoutput_v1_interface.cpp
|
||||||
primaryselectiondevice_v1_interface.cpp
|
primaryselectiondevice_v1_interface.cpp
|
||||||
primaryselectiondevicemanager_v1_interface.cpp
|
primaryselectiondevicemanager_v1_interface.cpp
|
||||||
primaryselectionoffer_v1_interface.cpp
|
primaryselectionoffer_v1_interface.cpp
|
||||||
|
@ -90,6 +91,11 @@ ecm_add_qtwayland_server_protocol_kde(SERVER_LIB_SRCS
|
||||||
BASENAME kde-output-device-v2
|
BASENAME kde-output-device-v2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ecm_add_qtwayland_server_protocol_kde(SERVER_LIB_SRCS
|
||||||
|
PROTOCOL ${PLASMA_WAYLAND_PROTOCOLS_DIR}/kde-primary-output-v1.xml
|
||||||
|
BASENAME kde-primary-output-v1
|
||||||
|
)
|
||||||
|
|
||||||
ecm_add_qtwayland_server_protocol_kde(SERVER_LIB_SRCS
|
ecm_add_qtwayland_server_protocol_kde(SERVER_LIB_SRCS
|
||||||
PROTOCOL ${PLASMA_WAYLAND_PROTOCOLS_DIR}/kde-output-management-v2.xml
|
PROTOCOL ${PLASMA_WAYLAND_PROTOCOLS_DIR}/kde-output-management-v2.xml
|
||||||
BASENAME kde-output-management-v2
|
BASENAME kde-output-management-v2
|
||||||
|
@ -363,6 +369,7 @@ set(SERVER_LIB_HEADERS
|
||||||
pointer_interface.h
|
pointer_interface.h
|
||||||
pointerconstraints_v1_interface.h
|
pointerconstraints_v1_interface.h
|
||||||
pointergestures_v1_interface.h
|
pointergestures_v1_interface.h
|
||||||
|
primaryoutput_v1_interface.h
|
||||||
primaryselectiondevice_v1_interface.h
|
primaryselectiondevice_v1_interface.h
|
||||||
primaryselectiondevicemanager_v1_interface.h
|
primaryselectiondevicemanager_v1_interface.h
|
||||||
primaryselectionoffer_v1_interface.h
|
primaryselectionoffer_v1_interface.h
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include "qwayland-server-kde-output-management-v2.h"
|
#include "qwayland-server-kde-output-management-v2.h"
|
||||||
#include "qwayland-server-kde-output-device-v2.h"
|
#include "qwayland-server-kde-output-device-v2.h"
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
namespace KWaylandServer
|
namespace KWaylandServer
|
||||||
{
|
{
|
||||||
class OutputConfigurationV2InterfacePrivate : public QtWaylandServer::kde_output_configuration_v2
|
class OutputConfigurationV2InterfacePrivate : public QtWaylandServer::kde_output_configuration_v2
|
||||||
|
@ -31,6 +33,7 @@ public:
|
||||||
|
|
||||||
OutputManagementV2Interface *outputManagement;
|
OutputManagementV2Interface *outputManagement;
|
||||||
QHash<OutputDeviceV2Interface *, OutputChangeSetV2 *> changes;
|
QHash<OutputDeviceV2Interface *, OutputChangeSetV2 *> changes;
|
||||||
|
std::optional<OutputDeviceV2Interface *> primaryOutput;
|
||||||
OutputConfigurationV2Interface *q;
|
OutputConfigurationV2Interface *q;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -45,6 +48,7 @@ protected:
|
||||||
void kde_output_configuration_v2_overscan(Resource *resource, wl_resource *outputdevice, uint32_t overscan) override;
|
void kde_output_configuration_v2_overscan(Resource *resource, wl_resource *outputdevice, uint32_t overscan) override;
|
||||||
void kde_output_configuration_v2_set_vrr_policy(Resource *resource, struct ::wl_resource *outputdevice, uint32_t policy) override;
|
void kde_output_configuration_v2_set_vrr_policy(Resource *resource, struct ::wl_resource *outputdevice, uint32_t policy) override;
|
||||||
void kde_output_configuration_v2_set_rgb_range(Resource *resource, wl_resource *outputdevice, uint32_t rgbRange) override;
|
void kde_output_configuration_v2_set_rgb_range(Resource *resource, wl_resource *outputdevice, uint32_t rgbRange) override;
|
||||||
|
void kde_output_configuration_v2_set_primary_output(Resource *resource, struct ::wl_resource *output) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
void OutputConfigurationV2InterfacePrivate::kde_output_configuration_v2_enable(Resource *resource, wl_resource *outputdevice, int32_t enable)
|
void OutputConfigurationV2InterfacePrivate::kde_output_configuration_v2_enable(Resource *resource, wl_resource *outputdevice, int32_t enable)
|
||||||
|
@ -155,6 +159,12 @@ void OutputConfigurationV2InterfacePrivate::kde_output_configuration_v2_set_rgb_
|
||||||
pendingChanges(output)->d->rgbRange = static_cast<OutputDeviceV2Interface::RgbRange>(rgbRange);
|
pendingChanges(output)->d->rgbRange = static_cast<OutputDeviceV2Interface::RgbRange>(rgbRange);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OutputConfigurationV2InterfacePrivate::kde_output_configuration_v2_set_primary_output(Resource *resource, struct ::wl_resource *output)
|
||||||
|
{
|
||||||
|
Q_UNUSED(resource);
|
||||||
|
primaryOutput = OutputDeviceV2Interface::get(output);
|
||||||
|
}
|
||||||
|
|
||||||
void OutputConfigurationV2InterfacePrivate::kde_output_configuration_v2_destroy(Resource *resource)
|
void OutputConfigurationV2InterfacePrivate::kde_output_configuration_v2_destroy(Resource *resource)
|
||||||
{
|
{
|
||||||
wl_resource_destroy(resource->handle);
|
wl_resource_destroy(resource->handle);
|
||||||
|
@ -183,6 +193,17 @@ QHash<OutputDeviceV2Interface*, OutputChangeSetV2*> OutputConfigurationV2Interfa
|
||||||
return d->changes;
|
return d->changes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool OutputConfigurationV2Interface::primaryChanged() const
|
||||||
|
{
|
||||||
|
return d->primaryOutput.has_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputDeviceV2Interface *OutputConfigurationV2Interface::primary() const
|
||||||
|
{
|
||||||
|
Q_ASSERT(d->primaryOutput.has_value());
|
||||||
|
return *d->primaryOutput;
|
||||||
|
}
|
||||||
|
|
||||||
void OutputConfigurationV2Interface::setApplied()
|
void OutputConfigurationV2Interface::setApplied()
|
||||||
{
|
{
|
||||||
d->clearPendingChanges();
|
d->clearPendingChanges();
|
||||||
|
|
|
@ -60,6 +60,9 @@ public:
|
||||||
*/
|
*/
|
||||||
QHash<OutputDeviceV2Interface *, OutputChangeSetV2 *> changes() const;
|
QHash<OutputDeviceV2Interface *, OutputChangeSetV2 *> changes() const;
|
||||||
|
|
||||||
|
bool primaryChanged() const;
|
||||||
|
OutputDeviceV2Interface *primary() const;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
* Called by the compositor once the changes have successfully been applied.
|
* Called by the compositor once the changes have successfully been applied.
|
||||||
|
|
|
@ -19,8 +19,7 @@
|
||||||
|
|
||||||
namespace KWaylandServer
|
namespace KWaylandServer
|
||||||
{
|
{
|
||||||
|
static const quint32 s_version = 2;
|
||||||
static const quint32 s_version = 1;
|
|
||||||
|
|
||||||
class OutputDeviceV2InterfacePrivate : public QtWaylandServer::kde_output_device_v2
|
class OutputDeviceV2InterfacePrivate : public QtWaylandServer::kde_output_device_v2
|
||||||
{
|
{
|
||||||
|
@ -49,6 +48,7 @@ public:
|
||||||
void sendEnabled(Resource *resource);
|
void sendEnabled(Resource *resource);
|
||||||
void sendScale(Resource *resource);
|
void sendScale(Resource *resource);
|
||||||
void sendEisaId(Resource *resource);
|
void sendEisaId(Resource *resource);
|
||||||
|
void sendName(Resource *resource);
|
||||||
void sendSerialNumber(Resource *resource);
|
void sendSerialNumber(Resource *resource);
|
||||||
void sendCapabilities(Resource *resource);
|
void sendCapabilities(Resource *resource);
|
||||||
void sendOverscan(Resource *resource);
|
void sendOverscan(Resource *resource);
|
||||||
|
@ -62,6 +62,7 @@ public:
|
||||||
qreal scale = 1.0;
|
qreal scale = 1.0;
|
||||||
QString serialNumber;
|
QString serialNumber;
|
||||||
QString eisaId;
|
QString eisaId;
|
||||||
|
QString name;
|
||||||
OutputDeviceV2Interface::SubPixel subPixel = OutputDeviceV2Interface::SubPixel::Unknown;
|
OutputDeviceV2Interface::SubPixel subPixel = OutputDeviceV2Interface::SubPixel::Unknown;
|
||||||
OutputDeviceV2Interface::Transform transform = OutputDeviceV2Interface::Transform::Normal;
|
OutputDeviceV2Interface::Transform transform = OutputDeviceV2Interface::Transform::Normal;
|
||||||
|
|
||||||
|
@ -270,6 +271,7 @@ void OutputDeviceV2InterfacePrivate::kde_output_device_v2_bind_resource(Resource
|
||||||
sendGeometry(resource);
|
sendGeometry(resource);
|
||||||
sendScale(resource);
|
sendScale(resource);
|
||||||
sendEisaId(resource);
|
sendEisaId(resource);
|
||||||
|
sendName(resource);
|
||||||
sendSerialNumber(resource);
|
sendSerialNumber(resource);
|
||||||
|
|
||||||
auto currentModeIt = modes.end();
|
auto currentModeIt = modes.end();
|
||||||
|
@ -345,6 +347,13 @@ void OutputDeviceV2InterfacePrivate::sendEisaId(Resource *resource)
|
||||||
send_eisa_id(resource->handle, eisaId);
|
send_eisa_id(resource->handle, eisaId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OutputDeviceV2InterfacePrivate::sendName(Resource *resource)
|
||||||
|
{
|
||||||
|
if (resource->version() >= KDE_OUTPUT_DEVICE_V2_NAME_SINCE_VERSION) {
|
||||||
|
send_name(resource->handle, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void OutputDeviceV2InterfacePrivate::sendDone(Resource *resource)
|
void OutputDeviceV2InterfacePrivate::sendDone(Resource *resource)
|
||||||
{
|
{
|
||||||
send_done(resource->handle);
|
send_done(resource->handle);
|
||||||
|
@ -422,6 +431,15 @@ void OutputDeviceV2Interface::setEisaId(const QString &arg)
|
||||||
Q_EMIT eisaIdChanged(d->eisaId);
|
Q_EMIT eisaIdChanged(d->eisaId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OutputDeviceV2Interface::setName(const QString &arg)
|
||||||
|
{
|
||||||
|
if (d->name == arg) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
d->name = arg;
|
||||||
|
Q_EMIT nameChanged(d->name);
|
||||||
|
}
|
||||||
|
|
||||||
void OutputDeviceV2Interface::setSubPixel(SubPixel arg)
|
void OutputDeviceV2Interface::setSubPixel(SubPixel arg)
|
||||||
{
|
{
|
||||||
if (d->subPixel == arg) {
|
if (d->subPixel == arg) {
|
||||||
|
@ -479,6 +497,11 @@ QString OutputDeviceV2Interface::eisaId() const
|
||||||
return d->eisaId;
|
return d->eisaId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString OutputDeviceV2Interface::name() const
|
||||||
|
{
|
||||||
|
return d->name;
|
||||||
|
}
|
||||||
|
|
||||||
qreal OutputDeviceV2Interface::scale() const
|
qreal OutputDeviceV2Interface::scale() const
|
||||||
{
|
{
|
||||||
return d->scale;
|
return d->scale;
|
||||||
|
@ -747,6 +770,11 @@ void OutputDeviceV2InterfacePrivate::updateRgbRange()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wl_resource *OutputDeviceV2Interface::resource() const
|
||||||
|
{
|
||||||
|
return d->resource()->handle;
|
||||||
|
}
|
||||||
|
|
||||||
OutputDeviceV2Interface *OutputDeviceV2Interface::get(wl_resource *native)
|
OutputDeviceV2Interface *OutputDeviceV2Interface::get(wl_resource *native)
|
||||||
{
|
{
|
||||||
if (auto devicePrivate = resource_cast<OutputDeviceV2InterfacePrivate *>(native)) {
|
if (auto devicePrivate = resource_cast<OutputDeviceV2InterfacePrivate *>(native)) {
|
||||||
|
|
|
@ -41,6 +41,7 @@ class KWAYLANDSERVER_EXPORT OutputDeviceV2Interface : public QObject
|
||||||
Q_PROPERTY(QString model READ model WRITE setModel NOTIFY modelChanged)
|
Q_PROPERTY(QString model READ model WRITE setModel NOTIFY modelChanged)
|
||||||
Q_PROPERTY(QString serialNumber READ serialNumber WRITE setSerialNumber NOTIFY serialNumberChanged)
|
Q_PROPERTY(QString serialNumber READ serialNumber WRITE setSerialNumber NOTIFY serialNumberChanged)
|
||||||
Q_PROPERTY(QString eisaId READ eisaId WRITE setEisaId NOTIFY eisaIdChanged)
|
Q_PROPERTY(QString eisaId READ eisaId WRITE setEisaId NOTIFY eisaIdChanged)
|
||||||
|
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
|
||||||
Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged)
|
Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged)
|
||||||
Q_PROPERTY(QByteArray edid READ edid WRITE setEdid NOTIFY edidChanged)
|
Q_PROPERTY(QByteArray edid READ edid WRITE setEdid NOTIFY edidChanged)
|
||||||
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
|
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
|
||||||
|
@ -101,6 +102,7 @@ public:
|
||||||
QString model() const;
|
QString model() const;
|
||||||
QString serialNumber() const;
|
QString serialNumber() const;
|
||||||
QString eisaId() const;
|
QString eisaId() const;
|
||||||
|
QString name() const;
|
||||||
QSize pixelSize() const;
|
QSize pixelSize() const;
|
||||||
int refreshRate() const;
|
int refreshRate() const;
|
||||||
|
|
||||||
|
@ -123,6 +125,7 @@ public:
|
||||||
void setModel(const QString &model);
|
void setModel(const QString &model);
|
||||||
void setSerialNumber(const QString &serialNumber);
|
void setSerialNumber(const QString &serialNumber);
|
||||||
void setEisaId(const QString &eisaId);
|
void setEisaId(const QString &eisaId);
|
||||||
|
void setName(const QString &name);
|
||||||
|
|
||||||
void setScale(qreal scale);
|
void setScale(qreal scale);
|
||||||
void setSubPixel(SubPixel subPixel);
|
void setSubPixel(SubPixel subPixel);
|
||||||
|
@ -146,6 +149,7 @@ public:
|
||||||
void setVrrPolicy(VrrPolicy policy);
|
void setVrrPolicy(VrrPolicy policy);
|
||||||
void setRgbRange(RgbRange rgbRange);
|
void setRgbRange(RgbRange rgbRange);
|
||||||
|
|
||||||
|
wl_resource *resource() const;
|
||||||
static OutputDeviceV2Interface *get(wl_resource *native);
|
static OutputDeviceV2Interface *get(wl_resource *native);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
|
@ -155,6 +159,7 @@ Q_SIGNALS:
|
||||||
void modelChanged(const QString&);
|
void modelChanged(const QString&);
|
||||||
void serialNumberChanged(const QString&);
|
void serialNumberChanged(const QString&);
|
||||||
void eisaIdChanged(const QString &);
|
void eisaIdChanged(const QString &);
|
||||||
|
void nameChanged(const QString &name);
|
||||||
void scaleChanged(qreal);
|
void scaleChanged(qreal);
|
||||||
void subPixelChanged(SubPixel);
|
void subPixelChanged(SubPixel);
|
||||||
void transformChanged(Transform);
|
void transformChanged(Transform);
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
|
|
||||||
namespace KWaylandServer
|
namespace KWaylandServer
|
||||||
{
|
{
|
||||||
|
static const quint32 s_version = 2;
|
||||||
static const quint32 s_version = 1;
|
|
||||||
|
|
||||||
class OutputManagementV2InterfacePrivate : public QtWaylandServer::kde_output_management_v2
|
class OutputManagementV2InterfacePrivate : public QtWaylandServer::kde_output_management_v2
|
||||||
{
|
{
|
||||||
|
|
61
src/wayland/primaryoutput_v1_interface.cpp
Normal file
61
src/wayland/primaryoutput_v1_interface.cpp
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||||
|
|
||||||
|
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "primaryoutput_v1_interface.h"
|
||||||
|
|
||||||
|
#include "display.h"
|
||||||
|
#include "outputconfiguration_v2_interface.h"
|
||||||
|
#include "outputmanagement_v2_interface.h"
|
||||||
|
|
||||||
|
#include "qwayland-server-kde-primary-output-v1.h"
|
||||||
|
#include <wayland-server.h>
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
namespace KWaylandServer
|
||||||
|
{
|
||||||
|
static const quint32 s_version = 1;
|
||||||
|
|
||||||
|
class PrimaryOutputV1InterfacePrivate : public QtWaylandServer::kde_primary_output_v1
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PrimaryOutputV1InterfacePrivate(Display *display)
|
||||||
|
: QtWaylandServer::kde_primary_output_v1(*display, s_version)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void kde_primary_output_v1_bind_resource(Resource *resource) override
|
||||||
|
{
|
||||||
|
if (!m_outputName.isEmpty()) {
|
||||||
|
send_primary_output(resource->handle, m_outputName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString m_outputName;
|
||||||
|
};
|
||||||
|
|
||||||
|
PrimaryOutputV1Interface::PrimaryOutputV1Interface(KWaylandServer::Display *display, QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, d(new PrimaryOutputV1InterfacePrivate(display))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PrimaryOutputV1Interface::~PrimaryOutputV1Interface() = default;
|
||||||
|
|
||||||
|
void PrimaryOutputV1Interface::setPrimaryOutput(const QString &outputName)
|
||||||
|
{
|
||||||
|
if (outputName == d->m_outputName) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
d->m_outputName = outputName;
|
||||||
|
|
||||||
|
const auto resources = d->resourceMap();
|
||||||
|
for (auto *resource : resources) {
|
||||||
|
d->send_primary_output(resource->handle, outputName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
37
src/wayland/primaryoutput_v1_interface.h
Normal file
37
src/wayland/primaryoutput_v1_interface.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||||
|
|
||||||
|
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include <KWaylandServer/kwaylandserver_export.h>
|
||||||
|
|
||||||
|
namespace KWaylandServer
|
||||||
|
{
|
||||||
|
class Display;
|
||||||
|
class OutputDeviceV2Interface;
|
||||||
|
class PrimaryOutputV1InterfacePrivate;
|
||||||
|
|
||||||
|
class KWAYLANDSERVER_EXPORT PrimaryOutputV1Interface : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PrimaryOutputV1Interface(Display *display, QObject *parent = nullptr);
|
||||||
|
~PrimaryOutputV1Interface() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a primary output's @p outputName for the current display configuration
|
||||||
|
*
|
||||||
|
* It's up to the compositor to decide what the semantics are for it.
|
||||||
|
*/
|
||||||
|
void setPrimaryOutput(const QString &outputName);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QScopedPointer<PrimaryOutputV1InterfacePrivate> d;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue