diff options
-rw-r--r-- | src/compositor/compositor_api/qwaylandoutput.cpp | 398 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandoutput.h | 20 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandoutput_p.h | 127 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandoutputspace_p.h | 14 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandview.cpp | 8 | ||||
-rw-r--r-- | src/compositor/extensions/qwlinputpanelsurface.cpp | 8 | ||||
-rw-r--r-- | src/compositor/extensions/qwlinputpanelsurface_p.h | 8 | ||||
-rw-r--r-- | src/compositor/extensions/qwlshellsurface.cpp | 2 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput.cpp | 420 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput_p.h | 183 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/wayland_wrapper.pri | 2 |
11 files changed, 483 insertions, 707 deletions
diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp index 5a77912d1..88f3a4e09 100644 --- a/src/compositor/compositor_api/qwaylandoutput.cpp +++ b/src/compositor/compositor_api/qwaylandoutput.cpp @@ -36,27 +36,180 @@ ****************************************************************************/ #include "qwaylandoutput.h" +#include "qwaylandoutput_p.h" #include "qwaylandcompositor.h" #include "qwaylandview.h" +#include <QtCompositor/private/qwaylandsurface_p.h> + #include <QtCore/QCoreApplication> #include <QtCore/QtMath> #include <QtGui/QWindow> #include <QtGui/QExposeEvent> #include <private/qobject_p.h> -#include "wayland_wrapper/qwloutput_p.h" - QT_BEGIN_NAMESPACE +static QtWaylandServer::wl_output::subpixel toWlSubpixel(const QWaylandOutput::Subpixel &value) +{ + switch (value) { + case QWaylandOutput::SubpixelUnknown: + return QtWaylandServer::wl_output::subpixel_unknown; + case QWaylandOutput::SubpixelNone: + return QtWaylandServer::wl_output::subpixel_none; + case QWaylandOutput::SubpixelHorizontalRgb: + return QtWaylandServer::wl_output::subpixel_horizontal_rgb; + case QWaylandOutput::SubpixelHorizontalBgr: + return QtWaylandServer::wl_output::subpixel_horizontal_bgr; + case QWaylandOutput::SubpixelVerticalRgb: + return QtWaylandServer::wl_output::subpixel_vertical_rgb; + case QWaylandOutput::SubpixelVerticalBgr: + return QtWaylandServer::wl_output::subpixel_vertical_bgr; + default: + break; + } + + return QtWaylandServer::wl_output::subpixel_unknown; +} + +static QtWaylandServer::wl_output::transform toWlTransform(const QWaylandOutput::Transform &value) +{ + switch (value) { + case QWaylandOutput::Transform90: + return QtWaylandServer::wl_output::transform_90; + case QWaylandOutput::Transform180: + return QtWaylandServer::wl_output::transform_180; + case QWaylandOutput::Transform270: + return QtWaylandServer::wl_output::transform_270; + case QWaylandOutput::TransformFlipped: + return QtWaylandServer::wl_output::transform_flipped; + case QWaylandOutput::TransformFlipped90: + return QtWaylandServer::wl_output::transform_flipped_90; + case QWaylandOutput::TransformFlipped180: + return QtWaylandServer::wl_output::transform_flipped_180; + case QWaylandOutput::TransformFlipped270: + return QtWaylandServer::wl_output::transform_flipped_270; + default: + break; + } + + return QtWaylandServer::wl_output::transform_normal; +} + +QWaylandOutputPrivate::QWaylandOutputPrivate(QWaylandCompositor *compositor, QWindow *window, const QString &manufacturer, const QString &model) + : QtWaylandServer::wl_output(compositor->display(), 2) + , compositor(compositor) + , outputSpace(Q_NULLPTR) + , window(window) + , manufacturer(manufacturer) + , model(model) + , subpixel(QWaylandOutput::SubpixelUnknown) + , transform(QWaylandOutput::TransformNormal) + , scaleFactor(1) + , sizeFollowsWindow(true) +{ + mode.size = window ? window->size() : QSize(); + mode.refreshRate = 60; + + qRegisterMetaType<QWaylandOutput::Mode>("WaylandOutput::Mode"); +} + +QWaylandOutputPrivate::~QWaylandOutputPrivate() +{ + Q_Q(QWaylandOutput); + if (outputSpace) { + outputSpace = Q_NULLPTR; + outputSpace->removeOutput(q); + } +} + +void QWaylandOutputPrivate::output_bind_resource(Resource *resource) +{ + send_geometry(resource->handle, + position.x(), position.y(), + physicalSize.width(), physicalSize.height(), + toWlSubpixel(subpixel), manufacturer, model, + toWlTransform(transform)); + + send_mode(resource->handle, mode_current | mode_preferred, + mode.size.width(), mode.size.height(), + mode.refreshRate); + + if (resource->version() >= 2) { + send_scale(resource->handle, scaleFactor); + send_done(resource->handle); + } +} + +void QWaylandOutputPrivate::sendGeometryInfo() +{ + Q_FOREACH (Resource *resource, resourceMap().values()) { + send_geometry(resource->handle, + position.x(), position.x(), + physicalSize.width(), physicalSize.height(), + toWlSubpixel(subpixel), manufacturer, model, + toWlTransform(transform)); + if (resource->version() >= 2) + send_done(resource->handle); + } +} + + +void QWaylandOutputPrivate::addView(QWaylandView *view) +{ + addView(view, view->surface()); +} + +void QWaylandOutputPrivate::addView(QWaylandView *view, QWaylandSurface *surface) +{ + for (int i = 0; i < surfaceViews.size(); i++) { + if (surface == surfaceViews.at(i).surface) { + if (!surfaceViews.at(i).views.contains(view)) { + surfaceViews[i].views.append(view); + } + return; + } + } + + surfaceViews.append(QWaylandSurfaceViewMapper(surface,view)); +} + +void QWaylandOutputPrivate::removeView(QWaylandView *view) +{ + removeView(view, view->surface()); +} + +void QWaylandOutputPrivate::removeView(QWaylandView *view, QWaylandSurface *surface) +{ + Q_Q(QWaylandOutput); + for (int i = 0; i < surfaceViews.size(); i++) { + if (surface == surfaceViews.at(i).surface) { + bool removed = surfaceViews[i].views.removeOne(view); + if (surfaceViews.at(i).views.isEmpty() && removed) { + if (surfaceViews.at(i).has_entered) + q->surfaceLeave(surface); + surfaceViews.remove(i); + } + return; + } + } + qWarning("%s Could not find view %p for surface %p to remove. Possible invalid state", Q_FUNC_INFO, view, surface); +} + +void QWaylandOutputPrivate::updateSurfaceForView(QWaylandView *view, QWaylandSurface *newSurface, QWaylandSurface *oldSurface) +{ + if (newSurface == oldSurface) + return; + removeView(view, oldSurface); + addView(view, newSurface); +} + QWaylandOutput::QWaylandOutput(QWaylandOutputSpace *outputSpace, QWindow *window, const QString &manufacturer, const QString &model) - : QObject() - , d_ptr(new QtWayland::Output(this, outputSpace, window)) + : QObject(*new QWaylandOutputPrivate(outputSpace->compositor(), window, manufacturer, model)) { - d_ptr->setManufacturer(manufacturer); - d_ptr->setModel(model); + setOutputSpace(outputSpace); QObject::connect(window, &QWindow::widthChanged, this, &QWaylandOutput::setWidth); QObject::connect(window, &QWindow::heightChanged, this, &QWaylandOutput::setHeight); QObject::connect(window, &QObject::destroyed, this, &QWaylandOutput::windowDestroyed); @@ -64,32 +217,46 @@ QWaylandOutput::QWaylandOutput(QWaylandOutputSpace *outputSpace, QWindow *window QWaylandOutput::~QWaylandOutput() { - d_ptr->outputSpace()->removeOutput(this); } QWaylandOutput *QWaylandOutput::fromResource(wl_resource *resource) { - QtWayland::OutputResource *outputResource = static_cast<QtWayland::OutputResource *>( - QtWayland::Output::Resource::fromResource(resource)); - if (!outputResource) - return Q_NULLPTR; + return static_cast<QWaylandOutputPrivate *>(QWaylandOutputPrivate::Resource::fromResource(resource)->output_object)->q_func(); +} - QtWayland::Output *output = static_cast<QtWayland::Output *>(outputResource->output_object); - if (!output) - return Q_NULLPTR; +struct ::wl_resource *QWaylandOutput::outputForClient(QWaylandClient *client) const +{ + Q_D(const QWaylandOutput); + QWaylandOutputPrivate::Resource *r = d->resourceMap().value(client->client()); + if (r) + return r->handle; - return output->waylandOutput(); + return Q_NULLPTR; } void QWaylandOutput::setOutputSpace(QWaylandOutputSpace *outputSpace) { Q_ASSERT(outputSpace); - d_ptr->setOutputSpace(outputSpace, true); + Q_D(QWaylandOutput); + if (d->outputSpace == outputSpace) + return; + + if (d->outputSpace) { + d->outputSpace->removeOutput(this); + } + + d->outputSpace = outputSpace; + + if (outputSpace) { + outputSpace->addOutput(this); + } + + emit outputSpaceChanged(); } QWaylandOutputSpace *QWaylandOutput::outputSpace() const { - return d_ptr->outputSpace(); + return d_func()->outputSpace; } void QWaylandOutput::update() @@ -102,66 +269,96 @@ void QWaylandOutput::update() QWaylandCompositor *QWaylandOutput::compositor() const { - return d_ptr->outputSpace()->compositor(); + return d_func()->compositor; } QString QWaylandOutput::manufacturer() const { - return d_ptr->manufacturer(); + return d_func()->manufacturer; } QString QWaylandOutput::model() const { - return d_ptr->model(); + return d_func()->model; } QPoint QWaylandOutput::position() const { - return d_ptr->position(); + return d_func()->position; } void QWaylandOutput::setPosition(const QPoint &pt) { - if (d_ptr->position() == pt) + Q_D(QWaylandOutput); + if (d->position == pt) return; - d_ptr->setPosition(pt); + d->position = pt; + + d->sendGeometryInfo(); + Q_EMIT positionChanged(); Q_EMIT geometryChanged(); } QWaylandOutput::Mode QWaylandOutput::mode() const { - return d_ptr->mode(); + return d_func()->mode; } void QWaylandOutput::setMode(const Mode &mode) { - if (d_ptr->mode().size == mode.size && d_ptr->mode().refreshRate == mode.refreshRate) + Q_D(QWaylandOutput); + if (d->mode.size == mode.size && d->mode.refreshRate == mode.refreshRate) return; - d_ptr->setMode(mode); + d->mode = mode; + + Q_FOREACH (QWaylandOutputPrivate::Resource *resource, d->resourceMap().values()) { + d->send_mode(resource->handle, d->mode_current, + d->mode.size.width(), d->mode.size.height(), + d->mode.refreshRate * 1000); + if (resource->version() >= 2) + d->send_done(resource->handle); + } + Q_EMIT modeChanged(); Q_EMIT geometryChanged(); - if (window()) { - window()->resize(mode.size); - window()->setMinimumSize(mode.size); - window()->setMaximumSize(mode.size); + if (d->window) { + d->window->resize(mode.size); + d->window->setMinimumSize(mode.size); + d->window->setMaximumSize(mode.size); } } QRect QWaylandOutput::geometry() const { - return d_ptr->geometry(); + Q_D(const QWaylandOutput); + return QRect(d->position, d->mode.size); } void QWaylandOutput::setGeometry(const QRect &geometry) { - if (d_ptr->geometry() == geometry) + Q_D(QWaylandOutput); + if (d->position == geometry.topLeft() && d->mode.size == geometry.size()) return; - d_ptr->setGeometry(geometry); + d->position = geometry.topLeft(); + d->mode.size = geometry.size(); + + Q_FOREACH (QWaylandOutputPrivate::Resource *resource, d->resourceMap().values()) { + d->send_geometry(resource->handle, + d->position.x(), d->position.y(), + d->physicalSize.width(), d->physicalSize.height(), + toWlSubpixel(d->subpixel), d->manufacturer, d->model, + toWlTransform(d->transform)); + d->send_mode(resource->handle, d->mode_current, + d->mode.size.width(), d->mode.size.height(), + d->mode.refreshRate * 1000); + if (resource->version() >= 2) + d->send_done(resource->handle); + } Q_EMIT positionChanged(); Q_EMIT modeChanged(); @@ -174,126 +371,175 @@ void QWaylandOutput::setGeometry(const QRect &geometry) QRect QWaylandOutput::availableGeometry() const { - if (!d_ptr->availableGeometry().isValid()) - return QRect(d_ptr->position(), d_ptr->mode().size); + Q_D(const QWaylandOutput); + if (!d->availableGeometry.isValid()) + return QRect(d->position, d->mode.size); - return d_ptr->availableGeometry(); + return d->availableGeometry; } void QWaylandOutput::setAvailableGeometry(const QRect &availableGeometry) { - if (d_ptr->availableGeometry() == availableGeometry) + Q_D(QWaylandOutput); + if (d->availableGeometry == availableGeometry) return; - d_ptr->setAvailableGeometry(availableGeometry); + d->availableGeometry = availableGeometry; + Q_EMIT availableGeometryChanged(); } QSize QWaylandOutput::physicalSize() const { - return d_ptr->physicalSize(); + return d_func()->physicalSize; } void QWaylandOutput::setPhysicalSize(const QSize &size) { - if (d_ptr->physicalSize() == size) + Q_D(QWaylandOutput); + if (d->physicalSize == size) return; - d_ptr->setPhysicalSize(size); + d->physicalSize = size; + + d->sendGeometryInfo(); + Q_EMIT physicalSizeChanged(); } QWaylandOutput::Subpixel QWaylandOutput::subpixel() const { - return d_ptr->subpixel(); + return d_func()->subpixel; } void QWaylandOutput::setSubpixel(const Subpixel &subpixel) { - if (d_ptr->subpixel() == subpixel) + Q_D(QWaylandOutput); + if (d->subpixel == subpixel) return; - d_ptr->setSubpixel(subpixel); + d->subpixel = subpixel; + + d->sendGeometryInfo(); + Q_EMIT subpixelChanged(); } QWaylandOutput::Transform QWaylandOutput::transform() const { - return d_ptr->transform(); + return d_func()->transform; } void QWaylandOutput::setTransform(const Transform &transform) { - if (d_ptr->transform() == transform) + Q_D(QWaylandOutput); + if (d->transform == transform) return; - d_ptr->setTransform(transform); + d->transform = transform; + + d->sendGeometryInfo(); + Q_EMIT transformChanged(); } int QWaylandOutput::scaleFactor() const { - return d_ptr->scaleFactor(); + return d_func()->scaleFactor; } void QWaylandOutput::setScaleFactor(int scale) { - if (d_ptr->scaleFactor() == scale) + Q_D(QWaylandOutput); + if (d->scaleFactor == scale) return; - d_ptr->setScaleFactor(scale); - Q_EMIT scaleFactorChanged(); + d->scaleFactor = scale; + Q_FOREACH (QWaylandOutputPrivate::Resource *resource, d->resourceMap().values()) { + if (resource->version() >= 2) { + d->send_scale(resource->handle, scale); + d->send_done(resource->handle); + } + } + + Q_EMIT scaleFactorChanged(); } bool QWaylandOutput::sizeFollowsWindow() const { - return d_ptr->sizeFollowsWindow(); + return d_func()->sizeFollowsWindow; } void QWaylandOutput::setSizeFollowsWindow(bool follow) { - d_ptr->setSizeFollowsWindow(follow); + Q_D(QWaylandOutput); + if (follow != d->sizeFollowsWindow) { + if (follow) { + QObject::connect(d->window, &QWindow::widthChanged, this, &QWaylandOutput::setWidth); + QObject::connect(d->window, &QWindow::heightChanged, this, &QWaylandOutput::setHeight); + } else { + QObject::disconnect(d->window, &QWindow::widthChanged, this, &QWaylandOutput::setWidth); + QObject::disconnect(d->window, &QWindow::heightChanged, this, &QWaylandOutput::setHeight); + } + d->sizeFollowsWindow = follow; + Q_EMIT sizeFollowsWindowChanged(); + } } QWindow *QWaylandOutput::window() const { - return d_ptr->window(); + return d_func()->window; } void QWaylandOutput::frameStarted() { - d_ptr->frameStarted(); + Q_D(QWaylandOutput); + for (int i = 0; i < d->surfaceViews.size(); i++) { + QWaylandSurfaceViewMapper &surfacemapper = d->surfaceViews[i]; + if (surfacemapper.maybeThrottelingView()) + QWaylandSurfacePrivate::get(surfacemapper.surface)->frameStarted(); + } } void QWaylandOutput::sendFrameCallbacks() { - d_ptr->sendFrameCallbacks(); + Q_D(QWaylandOutput); + for (int i = 0; i < d->surfaceViews.size(); i++) { + const QWaylandSurfaceViewMapper &surfacemapper = d->surfaceViews.at(i); + if (surfacemapper.surface && surfacemapper.surface->isMapped()) { + if (!surfacemapper.has_entered) { + surfaceEnter(surfacemapper.surface); + } + if (surfacemapper.maybeThrottelingView()) + QWaylandSurfacePrivate::get(surfacemapper.surface)->sendFrameCallback(); + } + } + wl_display_flush_clients(d->compositor->display()); } void QWaylandOutput::surfaceEnter(QWaylandSurface *surface) { - d_ptr->surfaceEnter(surface); + if (!surface) + return; + QWaylandSurfacePrivate::get(surface)->send_enter(outputForClient(surface->client())); } void QWaylandOutput::surfaceLeave(QWaylandSurface *surface) { - d_ptr->surfaceLeave(surface); -} - -QtWayland::Output *QWaylandOutput::handle() const -{ - return d_ptr.data(); + if (!surface) + return; + QWaylandSurfacePrivate::get(surface)->send_leave(outputForClient(surface->client())); } QWaylandView *QWaylandOutput::pickView(const QPointF &outputPosition) const { - const QVector<QtWayland::SurfaceViewMapper> surfaceViewMappers = d_ptr->surfaceMappers(); - for (int nSurface = 0; surfaceViewMappers.size(); nSurface++) { - const QWaylandSurface *surface = surfaceViewMappers.at(nSurface).surface; + Q_D(const QWaylandOutput); + for (int nSurface = 0; d->surfaceViews.size(); nSurface++) { + const QWaylandSurface *surface = d->surfaceViews.at(nSurface).surface; if (surface->isCursorSurface()) continue; - const QVector<QWaylandView *> views = surfaceViewMappers.at(nSurface).views; + const QVector<QWaylandView *> views = d->surfaceViews.at(nSurface).views; for (int nView = 0; views.size(); nView++) { if (QRectF(views.at(nView)->requestedPosition(), surface->size()).contains(outputPosition)) return views.at(nView); @@ -309,17 +555,29 @@ QPointF QWaylandOutput::mapToView(QWaylandView *view, const QPointF &outputPosit void QWaylandOutput::setWidth(int newWidth) { - d_ptr->setWidth(newWidth); + Q_D(QWaylandOutput); + if (d->mode.size.width() == newWidth) + return; + + QSize s = d->mode.size; + s.setWidth(newWidth); + setGeometry(QRect(d->position, s)); } void QWaylandOutput::setHeight(int newHeight) { - d_ptr->setHeight(newHeight); + Q_D(QWaylandOutput); + if (d->mode.size.height() == newHeight) + return; + + QSize s = d->mode.size; + s.setHeight(newHeight); + setGeometry(QRect(d->position, s)); } QPointF QWaylandOutput::mapToOutputSpace(const QPointF &point) { - return point + d_ptr->topLeft(); + return point + d_func()->position; } void QWaylandOutput::windowDestroyed() diff --git a/src/compositor/compositor_api/qwaylandoutput.h b/src/compositor/compositor_api/qwaylandoutput.h index f261f16a4..763bfa2ed 100644 --- a/src/compositor/compositor_api/qwaylandoutput.h +++ b/src/compositor/compositor_api/qwaylandoutput.h @@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE struct wl_resource; +class QWaylandOutputPrivate; class QWaylandCompositor; class QWindow; class QWaylandSurface; @@ -56,13 +57,10 @@ class QWaylandView; class QWaylandClient; class QWaylandOutputSpace; -namespace QtWayland { - class Output; -} - class Q_COMPOSITOR_EXPORT QWaylandOutput : public QObject, public QWaylandExtensionContainer { Q_OBJECT + Q_DECLARE_PRIVATE(QWaylandOutput) Q_PROPERTY(QString manufacturer READ manufacturer CONSTANT) Q_PROPERTY(QString model READ model CONSTANT) Q_PROPERTY(QPoint position READ position WRITE setPosition NOTIFY positionChanged) @@ -111,13 +109,14 @@ public: ~QWaylandOutput(); static QWaylandOutput *fromResource(wl_resource *resource); + struct ::wl_resource *outputForClient(QWaylandClient *client) const; + + QWaylandCompositor *compositor() const; + QWindow *window() const; void setOutputSpace(QWaylandOutputSpace *outputSpace); QWaylandOutputSpace *outputSpace() const; - virtual void update(); - - QWaylandCompositor *compositor() const; QString manufacturer() const; @@ -149,8 +148,6 @@ public: int scaleFactor() const; void setScaleFactor(int scale); - QWindow *window() const; - bool sizeFollowsWindow() const; void setSizeFollowsWindow(bool follow); @@ -163,7 +160,7 @@ public: void surfaceEnter(QWaylandSurface *surface); void surfaceLeave(QWaylandSurface *surface); - QtWayland::Output *handle() const; + virtual void update(); Q_INVOKABLE virtual QWaylandView *pickView(const QPointF &outputPosition) const; Q_INVOKABLE virtual QPointF mapToView(QWaylandView *view, const QPointF &surfacePosition) const; @@ -183,9 +180,6 @@ Q_SIGNALS: void physicalSizeFollowsSizeChanged(); void outputSpaceChanged(); -protected: - QScopedPointer<QtWayland::Output> d_ptr; - private Q_SLOTS: void windowDestroyed(); diff --git a/src/compositor/compositor_api/qwaylandoutput_p.h b/src/compositor/compositor_api/qwaylandoutput_p.h new file mode 100644 index 000000000..88d86d5f4 --- /dev/null +++ b/src/compositor/compositor_api/qwaylandoutput_p.h @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2014-2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> +** Copyright (C) 2013 Klarälvdalens Datakonsult AB (KDAB). +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtWaylandCompositor module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDOUTPUT_P_H +#define QWAYLANDOUTPUT_P_H + +#include <QtCompositor/qwaylandexport.h> +#include <QtCompositor/QWaylandOutput> +#include <QtCompositor/QWaylandClient> +#include <QtCompositor/QWaylandOutputSpace> +#include <QtCompositor/QWaylandSurface> + +#include <QtCompositor/private/qwayland-server-wayland.h> + +#include <QtCore/QRect> +#include <QtCore/QVector> + +#include <QtCore/private/qobject_p.h> + +QT_BEGIN_NAMESPACE + +struct QWaylandSurfaceViewMapper +{ + QWaylandSurfaceViewMapper() + : surface(0) + , views() + , has_entered(false) + {} + + QWaylandSurfaceViewMapper(QWaylandSurface *s, QWaylandView *v) + : surface(s) + , views(1, v) + , has_entered(false) + {} + + QWaylandView *maybeThrottelingView() const + { + for (int i = 0; i < views.size(); i++) { + if (surface && surface->throttlingView() == views.at(i)) + return views.at(i); + } + return Q_NULLPTR; + } + + QWaylandSurface *surface; + QVector<QWaylandView *> views; + bool has_entered; +}; + +class Q_COMPOSITOR_EXPORT QWaylandOutputPrivate : public QObjectPrivate, public QtWaylandServer::wl_output +{ +public: + QWaylandOutputPrivate(QWaylandCompositor *compositor, QWindow *window, const QString &manufacturer, const QString &model); + + ~QWaylandOutputPrivate(); + static QWaylandOutputPrivate *get(QWaylandOutput *output) { return output->d_func(); } + + void addView(QWaylandView *view); + void addView(QWaylandView *view, QWaylandSurface *surface); + void removeView(QWaylandView *view); + void removeView(QWaylandView *view, QWaylandSurface *surface); + void updateSurfaceForView(QWaylandView *view, QWaylandSurface *newSurface, QWaylandSurface *oldSurface); + void sendGeometryInfo(); + +protected: + void output_bind_resource(Resource *resource) Q_DECL_OVERRIDE; + + +private: + QWaylandCompositor *compositor; + QWaylandOutputSpace *outputSpace; + QWindow *window; + QString manufacturer; + QString model; + QPoint position; + QWaylandOutput::Mode mode; + QRect availableGeometry; + QVector<QWaylandSurfaceViewMapper> surfaceViews; + QSize physicalSize; + QWaylandOutput::Subpixel subpixel; + QWaylandOutput::Transform transform; + int scaleFactor; + bool sizeFollowsWindow; + + Q_DECLARE_PUBLIC(QWaylandOutput) + Q_DISABLE_COPY(QWaylandOutputPrivate) +}; + + +QT_END_NAMESPACE + +#endif /*QWAYLANDOUTPUT_P_H*/ diff --git a/src/compositor/compositor_api/qwaylandoutputspace_p.h b/src/compositor/compositor_api/qwaylandoutputspace_p.h index c10022ee9..127224bed 100644 --- a/src/compositor/compositor_api/qwaylandoutputspace_p.h +++ b/src/compositor/compositor_api/qwaylandoutputspace_p.h @@ -40,9 +40,11 @@ #include <QtCore/private/qobject_p.h> #include "qwaylandoutputspace.h" -#include "qwaylandcompositor.h" -#include "wayland_wrapper/qwloutput_p.h" + +#include <QtCompositor/QWaylandCompositor> +#include <QtCompositor/QWaylandOutput> #include <QtCompositor/private/qwaylandcompositor_p.h> +#include <QtCompositor/private/qwaylandoutput_p.h> QT_BEGIN_NAMESPACE @@ -95,17 +97,19 @@ public: { Q_Q(QWaylandOutputSpace); Q_ASSERT(output); - Q_ASSERT(!outputs.contains(output)); - output->handle()->setOutputSpace(q, false); + if (outputs.contains(output)) + return; if (primary) outputs.prepend(output); else outputs.append(output); adjustGeometry(); - q->outputsChanged(); + output->setOutputSpace(q); + + q->outputsChanged(); } static QWaylandOutputSpacePrivate *get(QWaylandOutputSpace *outputSpace) { return outputSpace->d_func(); } diff --git a/src/compositor/compositor_api/qwaylandview.cpp b/src/compositor/compositor_api/qwaylandview.cpp index 1dd570d94..c55bd5b5d 100644 --- a/src/compositor/compositor_api/qwaylandview.cpp +++ b/src/compositor/compositor_api/qwaylandview.cpp @@ -68,7 +68,7 @@ QWaylandView::~QWaylandView() { Q_D(QWaylandView); if (d->output) - d->output->handle()->removeView(this); + QWaylandOutputPrivate::get(d->output)->removeView(this); if (d->surface) { QWaylandInputDevice *i = d->surface->compositor()->defaultInputDevice(); if (i->mouseFocus() == this) @@ -230,7 +230,7 @@ void QWaylandView::waylandSurfaceChanged(QWaylandSurface *newSurface, QWaylandSu { Q_D(QWaylandView); if (d->output) - d->output->handle()->updateSurfaceForView(this, newSurface, oldSurface); + QWaylandOutputPrivate::get(d->output)->updateSurfaceForView(this, newSurface, oldSurface); } void QWaylandView::waylandSurfaceDestroyed() @@ -240,10 +240,10 @@ void QWaylandView::waylandSurfaceDestroyed() void QWaylandView::waylandOutputChanged(QWaylandOutput *newOutput, QWaylandOutput *oldOutput) { if (oldOutput) - oldOutput->handle()->removeView(this); + QWaylandOutputPrivate::get(oldOutput)->removeView(this); if (newOutput) - newOutput->handle()->addView(this); + QWaylandOutputPrivate::get(newOutput)->addView(this); } QT_END_NAMESPACE diff --git a/src/compositor/extensions/qwlinputpanelsurface.cpp b/src/compositor/extensions/qwlinputpanelsurface.cpp index 55c03eaae..17f6fe7ec 100644 --- a/src/compositor/extensions/qwlinputpanelsurface.cpp +++ b/src/compositor/extensions/qwlinputpanelsurface.cpp @@ -37,9 +37,8 @@ #include "qwlinputpanelsurface_p.h" -#include "qwloutput_p.h" - #include <QtCompositor/private/qwaylandsurface_p.h> +#include <QtCompositor/QWaylandOutput> QT_BEGIN_NAMESPACE @@ -60,7 +59,7 @@ InputPanelSurface::Type InputPanelSurface::type() const return m_type; } -Output *InputPanelSurface::output() const +QWaylandOutput *InputPanelSurface::output() const { return m_output; } @@ -78,8 +77,7 @@ void InputPanelSurface::input_panel_surface_set_overlay_panel(Resource *) void InputPanelSurface::input_panel_surface_set_toplevel(Resource *, wl_resource *output_resource, uint32_t position) { m_type = Toplevel; - OutputResource *output = static_cast<OutputResource *>(Output::Resource::fromResource(output_resource)); - m_output = static_cast<Output *>(output->output_object); + m_output = QWaylandOutput::fromResource(output_resource); m_position = static_cast<wl_input_panel_surface::position>(position); } diff --git a/src/compositor/extensions/qwlinputpanelsurface_p.h b/src/compositor/extensions/qwlinputpanelsurface_p.h index 947c9d95f..2992b803f 100644 --- a/src/compositor/extensions/qwlinputpanelsurface_p.h +++ b/src/compositor/extensions/qwlinputpanelsurface_p.h @@ -44,9 +44,9 @@ QT_BEGIN_NAMESPACE -namespace QtWayland { +class QWaylandOutput; -class Output; +namespace QtWayland { class InputPanelSurface : public QtWaylandServer::wl_input_panel_surface { @@ -61,7 +61,7 @@ public: Type type() const; - Output *output() const; + QWaylandOutput *output() const; wl_input_panel_surface::position position() const; protected: @@ -73,7 +73,7 @@ private: Type m_type; - Output *m_output; + QWaylandOutput *m_output; wl_input_panel_surface::position m_position; }; diff --git a/src/compositor/extensions/qwlshellsurface.cpp b/src/compositor/extensions/qwlshellsurface.cpp index fff4e888a..d74d01b16 100644 --- a/src/compositor/extensions/qwlshellsurface.cpp +++ b/src/compositor/extensions/qwlshellsurface.cpp @@ -38,8 +38,8 @@ #include "qwlshellsurface_p.h" #include <QtCompositor/QWaylandCompositor> +#include <QtCompositor/QWaylandOutputSpace> -#include "qwloutput_p.h" #include "qwlinputdevice_p.h" #include "qwlsubsurface_p.h" #include "qwlpointer_p.h" diff --git a/src/compositor/wayland_wrapper/qwloutput.cpp b/src/compositor/wayland_wrapper/qwloutput.cpp deleted file mode 100644 index d11d91ea4..000000000 --- a/src/compositor/wayland_wrapper/qwloutput.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtWaylandCompositor module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwloutput_p.h" - -#include <QtGui/QWindow> -#include <QRect> -#include <QtCompositor/QWaylandCompositor> -#include <QtCompositor/QWaylandSurface> -#include <QtCompositor/QWaylandOutput> - -#include <QtCompositor/QWaylandSurface> -#include <QtCompositor/QWaylandClient> -#include <QtCompositor/QWaylandView> -#include <QtCompositor/QWaylandOutput> - -#include <QtCompositor/private/qwaylandsurface_p.h> - -QT_BEGIN_NAMESPACE - -namespace QtWayland { - -static QtWaylandServer::wl_output::subpixel toWlSubpixel(const QWaylandOutput::Subpixel &value) -{ - switch (value) { - case QWaylandOutput::SubpixelUnknown: - return QtWaylandServer::wl_output::subpixel_unknown; - case QWaylandOutput::SubpixelNone: - return QtWaylandServer::wl_output::subpixel_none; - case QWaylandOutput::SubpixelHorizontalRgb: - return QtWaylandServer::wl_output::subpixel_horizontal_rgb; - case QWaylandOutput::SubpixelHorizontalBgr: - return QtWaylandServer::wl_output::subpixel_horizontal_bgr; - case QWaylandOutput::SubpixelVerticalRgb: - return QtWaylandServer::wl_output::subpixel_vertical_rgb; - case QWaylandOutput::SubpixelVerticalBgr: - return QtWaylandServer::wl_output::subpixel_vertical_bgr; - default: - break; - } - - return QtWaylandServer::wl_output::subpixel_unknown; -} - -static QtWaylandServer::wl_output::transform toWlTransform(const QWaylandOutput::Transform &value) -{ - switch (value) { - case QWaylandOutput::Transform90: - return QtWaylandServer::wl_output::transform_90; - case QWaylandOutput::Transform180: - return QtWaylandServer::wl_output::transform_180; - case QWaylandOutput::Transform270: - return QtWaylandServer::wl_output::transform_270; - case QWaylandOutput::TransformFlipped: - return QtWaylandServer::wl_output::transform_flipped; - case QWaylandOutput::TransformFlipped90: - return QtWaylandServer::wl_output::transform_flipped_90; - case QWaylandOutput::TransformFlipped180: - return QtWaylandServer::wl_output::transform_flipped_180; - case QWaylandOutput::TransformFlipped270: - return QtWaylandServer::wl_output::transform_flipped_270; - default: - break; - } - - return QtWaylandServer::wl_output::transform_normal; -} - -Output::Output(QWaylandOutput *output, QWaylandOutputSpace *outputSpace, QWindow *window) - : QtWaylandServer::wl_output(outputSpace->compositor()->display(), 2) - , m_window(window) - , m_output(output) - , m_outputSpace(Q_NULLPTR) - , m_position(QPoint()) - , m_availableGeometry(QRect()) - , m_physicalSize(QSize()) - , m_subpixel(QWaylandOutput::SubpixelUnknown) - , m_transform(QWaylandOutput::TransformNormal) - , m_scaleFactor(1) - , m_sizeFollowsWindow(true) -{ - m_mode.size = window ? window->size() : QSize(); - m_mode.refreshRate = 60; - setOutputSpace(outputSpace, false); - - qRegisterMetaType<QWaylandOutput::Mode>("WaylandOutput::Mode"); -} - -void Output::output_bind_resource(Resource *resource) -{ - send_geometry(resource->handle, - m_position.x(), m_position.y(), - m_physicalSize.width(), m_physicalSize.height(), - toWlSubpixel(m_subpixel), m_manufacturer, m_model, - toWlTransform(m_transform)); - - send_mode(resource->handle, mode_current | mode_preferred, - m_mode.size.width(), m_mode.size.height(), - m_mode.refreshRate); - - if (resource->version() >= 2) { - send_scale(resource->handle, m_scaleFactor); - send_done(resource->handle); - } -} - -void Output::setManufacturer(const QString &manufacturer) -{ - m_manufacturer = manufacturer; -} - -void Output::setModel(const QString &model) -{ - m_model = model; -} - -void Output::setPosition(const QPoint &position) -{ - if (m_position == position) - return; - - m_position = position; - - sendGeometryInfo(); -} - -void Output::setMode(const QWaylandOutput::Mode &mode) -{ - if (m_mode.size == mode.size && m_mode.refreshRate == mode.refreshRate) - return; - - m_mode = mode; - - Q_FOREACH (Resource *resource, resourceMap().values()) { - send_mode(resource->handle, mode_current, - m_mode.size.width(), m_mode.size.height(), - m_mode.refreshRate * 1000); - if (resource->version() >= 2) - send_done(resource->handle); - } -} - -QRect Output::geometry() const -{ - return QRect(m_position, m_mode.size); -} - -bool Output::sizeFollowsWindow() const -{ - return m_sizeFollowsWindow; -} - -void Output::setSizeFollowsWindow(bool follow) -{ - if (follow != m_sizeFollowsWindow) { - if (follow) { - QObject::connect(m_window, &QWindow::widthChanged, m_output, &QWaylandOutput::setWidth); - QObject::connect(m_window, &QWindow::heightChanged, m_output, &QWaylandOutput::setHeight); - } else { - QObject::disconnect(m_window, &QWindow::widthChanged, m_output, &QWaylandOutput::setWidth); - QObject::disconnect(m_window, &QWindow::heightChanged, m_output, &QWaylandOutput::setHeight); - } - m_sizeFollowsWindow = follow; - m_output->sizeFollowsWindowChanged(); - } -} - -void Output::setGeometry(const QRect &geometry) -{ - if (m_position == geometry.topLeft() && m_mode.size == geometry.size()) - return; - - m_position = geometry.topLeft(); - m_mode.size = geometry.size(); - - Q_FOREACH (Resource *resource, resourceMap().values()) { - send_geometry(resource->handle, - m_position.x(), m_position.y(), - m_physicalSize.width(), m_physicalSize.height(), - toWlSubpixel(m_subpixel), m_manufacturer, m_model, - toWlTransform(m_transform)); - send_mode(resource->handle, mode_current, - m_mode.size.width(), m_mode.size.height(), - m_mode.refreshRate * 1000); - if (resource->version() >= 2) - send_done(resource->handle); - } -} - -void Output::setWidth(int newWidth) -{ - if (m_mode.size.width() == newWidth) - return; - - QSize s = m_mode.size; - s.setWidth(newWidth); - setGeometry(QRect(m_position, s)); -} - -void Output::setHeight(int newHeight) -{ - if (m_mode.size.height() == newHeight) - return; - - QSize s = m_mode.size; - s.setHeight(newHeight); - setGeometry(QRect(m_position, s)); -} - -void Output::setAvailableGeometry(const QRect &availableGeometry) -{ - m_availableGeometry = availableGeometry; -} - -void Output::setPhysicalSize(const QSize &physicalSize) -{ - if (m_physicalSize == physicalSize) - return; - - m_physicalSize = physicalSize; - - sendGeometryInfo(); -} - -void Output::setSubpixel(const QWaylandOutput::Subpixel &subpixel) -{ - if (m_subpixel == subpixel) - return; - - m_subpixel = subpixel; - - sendGeometryInfo(); -} - -void Output::setTransform(const QWaylandOutput::Transform &transform) -{ - if (m_transform == transform) - return; - - m_transform = transform; - - sendGeometryInfo(); -} - -void Output::setScaleFactor(int scale) -{ - if (m_scaleFactor == scale) - return; - - m_scaleFactor = scale; - - Q_FOREACH (Resource *resource, resourceMap().values()) { - if (resource->version() >= 2) { - send_scale(resource->handle, m_scaleFactor); - send_done(resource->handle); - } - } -} - -void Output::setOutputSpace(QWaylandOutputSpace *outputSpace, bool setOutputSpace) -{ - if (m_outputSpace == outputSpace) - return; - - if (m_outputSpace) { - m_outputSpace->removeOutput(waylandOutput()); - } - - m_outputSpace = outputSpace; - - if (outputSpace && setOutputSpace) { - outputSpace->addOutput(waylandOutput()); - } - - waylandOutput()->outputSpaceChanged(); -} - -OutputResource *Output::outputForClient(wl_client *client) const -{ - return static_cast<OutputResource *>(resourceMap().value(client)); -} - -void Output::sendGeometryInfo() -{ - Q_FOREACH (Resource *resource, resourceMap().values()) { - send_geometry(resource->handle, - m_position.x(), m_position.x(), - m_physicalSize.width(), m_physicalSize.height(), - toWlSubpixel(m_subpixel), m_manufacturer, m_model, - toWlTransform(m_transform)); - if (resource->version() >= 2) - send_done(resource->handle); - } -} - - -void Output::frameStarted() -{ - for (int i = 0; i < m_surfaceViews.size(); i++) { - SurfaceViewMapper &surfacemapper = m_surfaceViews[i]; - if (surfacemapper.maybeThrottelingView()) - QWaylandSurfacePrivate::get(surfacemapper.surface)->frameStarted(); - } -} - -void Output::sendFrameCallbacks() -{ - for (int i = 0; i < m_surfaceViews.size(); i++) { - const SurfaceViewMapper &surfacemapper = m_surfaceViews.at(i); - if (surfacemapper.surface && surfacemapper.surface->isMapped()) { - if (!surfacemapper.has_entered) { - surfaceEnter(surfacemapper.surface); - } - if (surfacemapper.maybeThrottelingView()) - QWaylandSurfacePrivate::get(surfacemapper.surface)->sendFrameCallback(); - } - } - wl_display_flush_clients(compositor()->display()); -} - -void Output::surfaceEnter(QWaylandSurface *surface) -{ - if (!surface) - return; - QWaylandSurfacePrivate::get(surface)->send_enter(outputForClient(surface->client())->handle); -} - -void Output::surfaceLeave(QWaylandSurface *surface) -{ - if (!surface) - return; - QWaylandSurfacePrivate::get(surface)->send_leave(outputForClient(surface->client())->handle); -} - -void Output::addView(QWaylandView *view) -{ - addView(view, view->surface()); -} - -void Output::addView(QWaylandView *view, QWaylandSurface *surface) -{ - for (int i = 0; i < m_surfaceViews.size(); i++) { - if (surface == m_surfaceViews.at(i).surface) { - if (!m_surfaceViews.at(i).views.contains(view)) { - m_surfaceViews[i].views.append(view); - } - return; - } - } - - SurfaceViewMapper surfaceViewMapper; - surfaceViewMapper.surface = surface; - surfaceViewMapper.views.append(view); - m_surfaceViews.append(surfaceViewMapper); -} - -void Output::removeView(QWaylandView *view) -{ - removeView(view, view->surface()); -} - -void Output::removeView(QWaylandView *view, QWaylandSurface *surface) -{ - for (int i = 0; i < m_surfaceViews.size(); i++) { - if (surface == m_surfaceViews.at(i).surface) { - bool removed = m_surfaceViews[i].views.removeOne(view); - if (m_surfaceViews.at(i).views.isEmpty() && removed) { - if (m_surfaceViews.at(i).has_entered) - surfaceLeave(surface); - m_surfaceViews.remove(i); - } - return; - } - } - qWarning("%s Could not find view %p for surface %p to remove. Possible invalid state", Q_FUNC_INFO, view, surface); -} - -void Output::updateSurfaceForView(QWaylandView *view, QWaylandSurface *newSurface, QWaylandSurface *oldSurface) -{ - removeView(view, oldSurface); - addView(view, newSurface); -} - -} // namespace Wayland - -QT_END_NAMESPACE diff --git a/src/compositor/wayland_wrapper/qwloutput_p.h b/src/compositor/wayland_wrapper/qwloutput_p.h deleted file mode 100644 index 5ec9b1cbc..000000000 --- a/src/compositor/wayland_wrapper/qwloutput_p.h +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtWaylandCompositor module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef WL_OUTPUT_H -#define WL_OUTPUT_H - -#include <QtCompositor/qwaylandexport.h> - -#include <QtCompositor/QWaylandClient> -#include <QtCore/QRect> -#include <QtCore/QList> -#include <QtCore/QVector> - -#include <QtCompositor/QWaylandOutputSpace> -#include <QtCompositor/QWaylandSurface> - -#include <QtCompositor/private/qwayland-server-wayland.h> -#include <QtCompositor/qwaylandoutput.h> - -QT_BEGIN_NAMESPACE - -class QWindow; - -namespace QtWayland { - -class Compositor; - -struct SurfaceViewMapper -{ - SurfaceViewMapper() - : surface(0) - , views() - , has_entered(false) - {} - - QWaylandView *maybeThrottelingView() const - { - for (int i = 0; i < views.size(); i++) { - if (surface && surface->throttlingView() == views.at(i)) - return views.at(i); - } - return Q_NULLPTR; - } - - QWaylandSurface *surface; - QVector<QWaylandView *> views; - bool has_entered; -}; - -//Just for naming convenience -class OutputResource : public QtWaylandServer::wl_output::Resource -{ -}; - -class Output : public QtWaylandServer::wl_output -{ -public: - Output(QWaylandOutput *output, QWaylandOutputSpace *outputSpace, QWindow *window); - - QWaylandCompositor *compositor() const { return m_outputSpace->compositor(); } - - QWaylandOutput *waylandOutput() const { return m_output; } - - QString manufacturer() const { return m_manufacturer; } - void setManufacturer(const QString &manufacturer); - - QString model() const { return m_model; } - void setModel(const QString &model); - - QPoint position() const { return m_position; } - void setPosition(const QPoint &position); - - QRect geometry() const; - void setGeometry(const QRect &geometry); - void setWidth(int newWidth); - void setHeight(int newHeight); - QPoint topLeft() const { return geometry().topLeft(); } - - bool sizeFollowsWindow() const; - void setSizeFollowsWindow(bool follow); - - QWaylandOutput::Mode mode() const { return m_mode; } - void setMode(const QWaylandOutput::Mode &mode); - - QRect availableGeometry() const { return m_availableGeometry; } - void setAvailableGeometry(const QRect &availableGeometry); - - QSize physicalSize() const { return m_physicalSize; } - void setPhysicalSize(const QSize &physicalSize); - - QWaylandOutput::Subpixel subpixel() const { return m_subpixel; } - void setSubpixel(const QWaylandOutput::Subpixel &subpixel); - - QWaylandOutput::Transform transform() const { return m_transform; } - void setTransform(const QWaylandOutput::Transform &transform); - - int scaleFactor() const { return m_scaleFactor; } - void setScaleFactor(int scale); - - void setOutputSpace(QWaylandOutputSpace *outputSpace, bool setOutputSpace); - QWaylandOutputSpace *outputSpace() const { return m_outputSpace; } - - void frameStarted(); - void sendFrameCallbacks(); - - void surfaceEnter(QWaylandSurface *surface); - void surfaceLeave(QWaylandSurface *surface); - - void addView(QWaylandView *view); - void addView(QWaylandView *view, QWaylandSurface *surface); - void removeView(QWaylandView *view); - void removeView(QWaylandView *view, QWaylandSurface *surface); - void updateSurfaceForView(QWaylandView *view, QWaylandSurface *newSurface, QWaylandSurface *oldSurface); - - QWindow *window() const { return m_window; } - - OutputResource *outputForClient(QWaylandClient *client) const { return outputForClient(client->client()); } - OutputResource *outputForClient(struct wl_client *client) const; - - void output_bind_resource(Resource *resource) Q_DECL_OVERRIDE; - Resource *output_allocate() Q_DECL_OVERRIDE { return new OutputResource; } - - const QVector<SurfaceViewMapper> surfaceMappers() const { return m_surfaceViews; } -private: - friend class QT_PREPEND_NAMESPACE(QWaylandOutput); - - QWindow *m_window; - QWaylandOutput *m_output; - QWaylandOutputSpace *m_outputSpace; - QString m_manufacturer; - QString m_model; - QPoint m_position; - QWaylandOutput::Mode m_mode; - QRect m_availableGeometry; - QVector<SurfaceViewMapper> m_surfaceViews; - QSize m_physicalSize; - QWaylandOutput::Subpixel m_subpixel; - QWaylandOutput::Transform m_transform; - int m_scaleFactor; - bool m_sizeFollowsWindow; - - void sendGeometryInfo(); -}; - -} - -QT_END_NAMESPACE - -#endif //WL_OUTPUT_H diff --git a/src/compositor/wayland_wrapper/wayland_wrapper.pri b/src/compositor/wayland_wrapper/wayland_wrapper.pri index b32bf4cbb..66de019cc 100644 --- a/src/compositor/wayland_wrapper/wayland_wrapper.pri +++ b/src/compositor/wayland_wrapper/wayland_wrapper.pri @@ -13,7 +13,6 @@ HEADERS += \ wayland_wrapper/qwlinputmethod_p.h \ wayland_wrapper/qwlinputmethodcontext_p.h \ wayland_wrapper/qwlkeyboard_p.h \ - wayland_wrapper/qwloutput_p.h \ wayland_wrapper/qwlpointer_p.h \ wayland_wrapper/qwlregion_p.h \ wayland_wrapper/qwlsurfacebuffer_p.h \ @@ -29,7 +28,6 @@ SOURCES += \ wayland_wrapper/qwlinputmethod.cpp \ wayland_wrapper/qwlinputmethodcontext.cpp \ wayland_wrapper/qwlkeyboard.cpp \ - wayland_wrapper/qwloutput.cpp \ wayland_wrapper/qwlpointer.cpp \ wayland_wrapper/qwlregion.cpp \ wayland_wrapper/qwlsurfacebuffer.cpp \ |