diff --git a/autotests/client/test_xdg_output.cpp b/autotests/client/test_xdg_output.cpp --- a/autotests/client/test_xdg_output.cpp +++ b/autotests/client/test_xdg_output.cpp @@ -68,6 +68,9 @@ m_serverXdgOutput = m_serverXdgOutputManager->createXdgOutput(m_serverOutput, this); m_serverXdgOutput->setLogicalSize(QSize(1280, 720)); //a 1.5 scale factor m_serverXdgOutput->setLogicalPosition(QPoint(11,12)); //not a sensible value for one monitor, but works for this test + m_serverXdgOutput->setName("testName"); + m_serverXdgOutput->setDescription("testDescription"); + m_serverXdgOutput->done(); // setup connection @@ -144,10 +147,15 @@ xdgOutputChanged.clear(); QCOMPARE(xdgOutput->logicalPosition(), QPoint(11,12)); QCOMPARE(xdgOutput->logicalSize(), QSize(1280,720)); + QCOMPARE(xdgOutput->name(), "testName"); + QCOMPARE(xdgOutput->description(), "testDescription"); + - //dynamic updates + // dynamic updates m_serverXdgOutput->setLogicalPosition(QPoint(1000, 2000)); m_serverXdgOutput->setLogicalSize(QSize(100,200)); + // names cannot dynamically change according to the spec + m_serverXdgOutput->done(); QVERIFY(xdgOutputChanged.wait()); diff --git a/src/client/registry.cpp b/src/client/registry.cpp --- a/src/client/registry.cpp +++ b/src/client/registry.cpp @@ -346,7 +346,7 @@ &Registry::serverSideDecorationPaletteManagerRemoved }}, {Registry::Interface::XdgOutputUnstableV1, { - 1, + 2, QByteArrayLiteral("zxdg_output_manager_v1"), &zxdg_output_manager_v1_interface, &Registry::xdgOutputAnnounced, diff --git a/src/client/xdgoutput.h b/src/client/xdgoutput.h --- a/src/client/xdgoutput.h +++ b/src/client/xdgoutput.h @@ -195,9 +195,21 @@ */ QSize logicalSize() const; + /** + * A consistent unique name for this monitor + * @since 5.XDGOUTPUT + */ + QString name() const; + + /** + * A longer human readable description + * @since 5.XDGOUTPUT + */ + QString description() const; + Q_SIGNALS: /** - * Emitted when the logical position or size changes + * Emitted when any of the attributes have changed */ void changed(); diff --git a/src/client/xdgoutput.cpp b/src/client/xdgoutput.cpp --- a/src/client/xdgoutput.cpp +++ b/src/client/xdgoutput.cpp @@ -101,6 +101,8 @@ { QPoint logicalPosition; QSize logicalSize; + QString name; + QString description; }; class XdgOutput::Private @@ -122,14 +124,18 @@ static void logical_positionCallback(void *data, zxdg_output_v1 *zxdg_output_v1, int32_t x, int32_t y); static void logical_sizeCallback(void *data, zxdg_output_v1 *zxdg_output_v1, int32_t width, int32_t height); static void doneCallback(void *data, zxdg_output_v1 *zxdg_output_v1); + static void nameCallback(void *data, zxdg_output_v1 *zxdg_output_v1, const char *name); + static void descriptionCallback(void *data, zxdg_output_v1 *zxdg_output_v1, const char *description); static const zxdg_output_v1_listener s_listener; }; const zxdg_output_v1_listener XdgOutput::Private::s_listener = { logical_positionCallback, logical_sizeCallback, - doneCallback + doneCallback, + nameCallback, + descriptionCallback }; void XdgOutput::Private::logical_positionCallback(void *data, zxdg_output_v1 *zxdg_output_v1, int32_t x, int32_t y) @@ -146,16 +152,28 @@ p->pending.logicalSize = QSize(width,height); } +void XdgOutput::Private::nameCallback(void *data, zxdg_output_v1 *zxdg_output_v1, const char *name) +{ + auto p = reinterpret_cast(data); + Q_ASSERT(p->xdgoutput == zxdg_output_v1); + p->pending.name = name; +} + +void XdgOutput::Private::descriptionCallback(void *data, zxdg_output_v1 *zxdg_output_v1, const char *description) +{ + auto p = reinterpret_cast(data); + Q_ASSERT(p->xdgoutput == zxdg_output_v1); + p->pending.description = description; +} + + void XdgOutput::Private::doneCallback(void *data, zxdg_output_v1 *zxdg_output_v1) { auto p = reinterpret_cast(data); Q_ASSERT(p->xdgoutput == zxdg_output_v1); std::swap(p->current, p->pending); - if (p->current.logicalSize != p->pending.logicalSize || - p->current.logicalPosition != p->pending.logicalPosition) { - emit p->q->changed(); - } + emit p->q->changed(); } XdgOutput::Private::Private(XdgOutput *qptr) @@ -207,6 +225,16 @@ return d->current.logicalPosition; } +QString XdgOutput::name() const +{ + return d->current.name; +} + +QString XdgOutput::description() const +{ + return d->current.description; +} + XdgOutput::operator zxdg_output_v1*() { return d->xdgoutput; } diff --git a/src/server/xdgoutput_interface.h b/src/server/xdgoutput_interface.h --- a/src/server/xdgoutput_interface.h +++ b/src/server/xdgoutput_interface.h @@ -87,6 +87,32 @@ */ QPoint logicalPosition() const; + /** + * @brief Sets a short name of the output + * This should be consistent across reboots for the same monitor + * It should be set once before the first done call + * @since 5.XDGOUTPUT + */ + void setName(const QString &name); + /** + * The last set name + * @since 5.XDGOUTPUT + */ + void name() const; + + /** + * @brief Sets a longer description of the output + * This should be consistent across reboots for the same monitor + * It should be set once before the first done call + * @since 5.XDGOUTPUT + */ + void setDescription(const QString &description); + /** + * The last set description + * @since 5.XDGOUTPUT + */ + void description() const; + /** * Submit changes to all clients */ diff --git a/src/server/xdgoutput_interface.cpp b/src/server/xdgoutput_interface.cpp --- a/src/server/xdgoutput_interface.cpp +++ b/src/server/xdgoutput_interface.cpp @@ -40,7 +40,7 @@ static const quint32 s_version; }; -const quint32 XdgOutputManagerInterface::Private::s_version = 1; +const quint32 XdgOutputManagerInterface::Private::s_version = 2; #ifndef K_DOXYGEN const struct zxdg_output_manager_v1_interface XdgOutputManagerInterface::Private::s_interface = { @@ -56,6 +56,8 @@ ~XdgOutputV1Interface(); void setLogicalSize(const QSize &size); void setLogicalPosition(const QPoint &pos); + void setName(const QString &name); + void setDescription(const QString &description); void done(); private: class Private; @@ -68,6 +70,8 @@ void resourceDisconnected(XdgOutputV1Interface *resource); QPoint pos; QSize size; + QString name; + QString description; bool dirty = false; bool doneOnce = false; QList resources; @@ -204,6 +208,16 @@ return d->pos; } +void XdgOutputInterface::setName(const QString &name) +{ + d->name = name; +} + +void XdgOutputInterface::setDescription(const QString &description) +{ + d->description = description; +} + void XdgOutputInterface::done() { d->doneOnce = true; @@ -220,6 +234,8 @@ { resource->setLogicalPosition(pos); resource->setLogicalSize(size); + resource->setName(name); + resource->setDescription(description); if (doneOnce) { resource->done(); } @@ -270,6 +286,28 @@ zxdg_output_v1_send_logical_position(d->resource, pos.x(), pos.y()); } +void XdgOutputV1Interface::setName(const QString &name) +{ + if (!d->resource) { + return; + } + if (wl_resource_get_version(d->resource) < ZXDG_OUTPUT_V1_NAME_SINCE_VERSION) { + return; + } + zxdg_output_v1_send_name(d->resource, name.toUtf8().constData()); +} + +void XdgOutputV1Interface::setDescription(const QString &description) +{ + if (!d->resource) { + return; + } + if (wl_resource_get_version(d->resource) < ZXDG_OUTPUT_V1_DESCRIPTION_SINCE_VERSION) { + return; + } + zxdg_output_v1_send_description(d->resource, description.toUtf8().constData()); +} + void XdgOutputV1Interface::done() { if (!d->resource) {