summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/wayland/qml-compositor/main.cpp5
-rw-r--r--examples/wayland/qwindow-compositor/qwindowcompositor.cpp9
-rw-r--r--examples/wayland/server-buffer/compositor/main.cpp5
-rw-r--r--src/compositor/compositor_api/compositor_api.pri4
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.cpp77
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.h20
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.cpp246
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.h164
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.cpp32
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.h12
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.cpp78
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.h74
-rw-r--r--src/compositor/compositor_api/qwaylandquicksurface.cpp7
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp8
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h3
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp106
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor_p.h20
-rw-r--r--src/compositor/wayland_wrapper/qwlextendedoutput.cpp4
-rw-r--r--src/compositor/wayland_wrapper/qwlextendedoutput_p.h4
-rw-r--r--src/compositor/wayland_wrapper/qwlinputpanelsurface.cpp6
-rw-r--r--src/compositor/wayland_wrapper/qwlinputpanelsurface_p.h3
-rw-r--r--src/compositor/wayland_wrapper/qwloutput.cpp239
-rw-r--r--src/compositor/wayland_wrapper/qwloutput_p.h98
-rw-r--r--src/compositor/wayland_wrapper/qwlshellsurface.cpp57
-rw-r--r--src/compositor/wayland_wrapper/qwlshellsurface_p.h4
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp7
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h4
-rw-r--r--src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp3
-rw-r--r--src/hardwareintegration/compositor/libhybris-egl-server/libhybriseglserverbufferintegration.cpp3
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp2
-rw-r--r--src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp4
-rw-r--r--src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp2
-rw-r--r--src/hardwareintegration/compositor/xcomposite_share/xcompositehandler.cpp4
33 files changed, 1078 insertions, 236 deletions
diff --git a/examples/wayland/qml-compositor/main.cpp b/examples/wayland/qml-compositor/main.cpp
index 26e730d43..06961dfc0 100644
--- a/examples/wayland/qml-compositor/main.cpp
+++ b/examples/wayland/qml-compositor/main.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -42,6 +43,7 @@
#include "qwaylandquicksurface.h"
#include <QtCompositor/qwaylandsurfaceitem.h>
+#include <QtCompositor/qwaylandoutput.h>
#include <QGuiApplication>
#include <QTimer>
@@ -60,7 +62,7 @@ class QmlCompositor : public QQuickView, public QWaylandQuickCompositor
public:
QmlCompositor()
- : QWaylandQuickCompositor(this, 0, DefaultExtensions | SubSurfaceExtension)
+ : QWaylandQuickCompositor(0, DefaultExtensions | SubSurfaceExtension)
, m_fullscreenSurface(0)
{
setSource(QUrl("main.qml"));
@@ -68,6 +70,7 @@ public:
setColor(Qt::black);
winId();
addDefaultShell();
+ createOutput(this, "", "");
connect(this, SIGNAL(afterRendering()), this, SLOT(sendCallbacks()));
}
diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
index c933152d8..8801ad14f 100644
--- a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
+++ b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -55,6 +56,7 @@
#include <QtCompositor/qwaylandinput.h>
#include <QtCompositor/qwaylandbufferref.h>
#include <QtCompositor/qwaylandsurfaceview.h>
+#include <QtCompositor/qwaylandoutput.h>
QT_BEGIN_NAMESPACE
@@ -108,7 +110,7 @@ public:
};
QWindowCompositor::QWindowCompositor(CompositorWindow *window)
- : QWaylandCompositor(window, 0, DefaultExtensions | SubSurfaceExtension)
+ : QWaylandCompositor(0, DefaultExtensions | SubSurfaceExtension)
, m_window(window)
, m_backgroundTexture(0)
, m_textureBlitter(0)
@@ -134,8 +136,7 @@ QWindowCompositor::QWindowCompositor(CompositorWindow *window)
setRetainedSelectionEnabled(true);
- setOutputGeometry(QRect(QPoint(0, 0), window->size()));
- setOutputRefreshRate(qRound(qGuiApp->primaryScreen()->refreshRate() * 1000.0));
+ createOutput(window, "", "");
addDefaultShell();
}
@@ -321,7 +322,7 @@ void QWindowCompositor::render()
// Draw the background image texture
m_textureBlitter->drawTexture(m_backgroundTexture->textureId(),
QRect(QPoint(0, 0), m_backgroundImage.size()),
- window()->size(),
+ m_window->size(),
0, false, true);
foreach (QWaylandSurface *surface, m_surfaces) {
diff --git a/examples/wayland/server-buffer/compositor/main.cpp b/examples/wayland/server-buffer/compositor/main.cpp
index 9f0108fa1..0bf6408c0 100644
--- a/examples/wayland/server-buffer/compositor/main.cpp
+++ b/examples/wayland/server-buffer/compositor/main.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -54,6 +55,7 @@
#include <QQuickView>
#include "qwayland-server-share-buffer.h"
+#include <QtCompositor/qwaylandoutput.h>
#include <QtCompositor/private/qwlcompositor_p.h>
#include <QtCompositor/private/qwlserverbufferintegration_p.h>
@@ -70,7 +72,7 @@ class QmlCompositor
public:
QmlCompositor()
- : QWaylandQuickCompositor(this, 0, DefaultExtensions | SubSurfaceExtension)
+ : QWaylandQuickCompositor(0, DefaultExtensions | SubSurfaceExtension)
, QtWaylandServer::qt_share_buffer(QWaylandCompositor::handle()->wl_display(), 1)
, m_server_buffer_32_bit(0)
, m_server_buffer_item_32_bit(0)
@@ -82,6 +84,7 @@ public:
setColor(Qt::black);
create();
grabWindow();
+ createOutput(this, "", "");
addDefaultShell();
connect(this, SIGNAL(afterRendering()), this, SLOT(sendCallbacks()));
diff --git a/src/compositor/compositor_api/compositor_api.pri b/src/compositor/compositor_api/compositor_api.pri
index 931d6c8f0..ac356b8fa 100644
--- a/src/compositor/compositor_api/compositor_api.pri
+++ b/src/compositor/compositor_api/compositor_api.pri
@@ -7,6 +7,7 @@ HEADERS += \
compositor_api/qwaylandsurface_p.h \
compositor_api/qwaylandinput.h \
compositor_api/qwaylandinputpanel.h \
+ compositor_api/qwaylandoutput.h \
compositor_api/qwaylanddrag.h \
compositor_api/qwaylandbufferref.h \
compositor_api/qwaylandsurfaceview.h \
@@ -19,6 +20,7 @@ SOURCES += \
compositor_api/qwaylandsurface.cpp \
compositor_api/qwaylandinput.cpp \
compositor_api/qwaylandinputpanel.cpp \
+ compositor_api/qwaylandoutput.cpp \
compositor_api/qwaylanddrag.cpp \
compositor_api/qwaylandbufferref.cpp \
compositor_api/qwaylandsurfaceview.cpp \
@@ -31,11 +33,13 @@ qtHaveModule(quick) {
SOURCES += \
compositor_api/qwaylandquickcompositor.cpp \
compositor_api/qwaylandquicksurface.cpp \
+ compositor_api/qwaylandquickoutput.cpp \
compositor_api/qwaylandsurfaceitem.cpp
HEADERS += \
compositor_api/qwaylandquickcompositor.h \
compositor_api/qwaylandquicksurface.h \
+ compositor_api/qwaylandquickoutput.h \
compositor_api/qwaylandsurfaceitem.h
QT += qml quick
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp
index 25ceb6e85..1839832e8 100644
--- a/src/compositor/compositor_api/qwaylandcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandcompositor.cpp
@@ -41,6 +41,7 @@
#include "qwaylandcompositor.h"
#include "qwaylandinput.h"
+#include "qwaylandoutput.h"
#include "qwaylandglobalinterface.h"
#include "qwaylandsurfaceview.h"
@@ -55,22 +56,21 @@
#include <QtCore/QStringList>
#include <QtGui/QDesktopServices>
+#include <QtGui/QScreen>
#include <QDebug>
QT_BEGIN_NAMESPACE
-QWaylandCompositor::QWaylandCompositor(QWindow *window, const char *socketName, ExtensionFlags extensions)
+QWaylandCompositor::QWaylandCompositor(const char *socketName, ExtensionFlags extensions)
: m_compositor(new QtWayland::Compositor(this, extensions))
- , m_toplevel_window(window)
{
m_compositor->m_socket_name = socketName;
m_compositor->init();
}
-QWaylandCompositor::QWaylandCompositor(QWindow *window, const char *socketName, QtWayland::Compositor *dptr)
+QWaylandCompositor::QWaylandCompositor(const char *socketName, QtWayland::Compositor *dptr)
: m_compositor(dptr)
- , m_toplevel_window(window)
{
m_compositor->m_socket_name = socketName;
m_compositor->init();
@@ -143,9 +143,24 @@ QList<QWaylandSurface *> QWaylandCompositor::surfaces() const
return surfs;
}
-QWindow * QWaylandCompositor::window() const
+QList<QWaylandOutput *> QWaylandCompositor::outputs() const
{
- return m_toplevel_window;
+ return m_compositor->outputs();
+}
+
+QWaylandOutput *QWaylandCompositor::output(QWindow *window)
+{
+ return m_compositor->output(window);
+}
+
+QWaylandOutput *QWaylandCompositor::primaryOutput() const
+{
+ return m_compositor->primaryOutput();
+}
+
+void QWaylandCompositor::setPrimaryOutput(QWaylandOutput *output)
+{
+ m_compositor->setPrimaryOutput(output);
}
void QWaylandCompositor::cleanupGraphicsResources()
@@ -221,33 +236,66 @@ const char *QWaylandCompositor::socketName() const
return m_compositor->m_socket_name.constData();
}
+#if QT_DEPRECATED_SINCE(5, 5)
/*!
Set the screen orientation based on accelerometer data or similar.
*/
void QWaylandCompositor::setScreenOrientation(Qt::ScreenOrientation orientation)
{
- m_compositor->setScreenOrientation(orientation);
+ QWaylandOutput *output = primaryOutput();
+ if (output) {
+ bool isPortrait = output->window()->screen()->primaryOrientation() == Qt::PortraitOrientation;
+
+ switch (orientation) {
+ case Qt::PrimaryOrientation:
+ output->setTransform(QWaylandOutput::TransformNormal);
+ break;
+ case Qt::LandscapeOrientation:
+ output->setTransform(isPortrait ? QWaylandOutput::Transform270 : QWaylandOutput::TransformNormal);
+ break;
+ case Qt::PortraitOrientation:
+ output->setTransform(isPortrait ? QWaylandOutput::TransformNormal : QWaylandOutput::Transform90);
+ break;
+ case Qt::InvertedLandscapeOrientation:
+ output->setTransform(isPortrait ? QWaylandOutput::Transform90 : QWaylandOutput::Transform180);
+ break;
+ case Qt::InvertedPortraitOrientation:
+ output->setTransform(isPortrait ? QWaylandOutput::Transform180 : QWaylandOutput::Transform270);
+ break;
+ }
+ }
}
void QWaylandCompositor::setOutputGeometry(const QRect &geometry)
{
- m_compositor->setOutputGeometry(geometry);
+ QWaylandOutput *output = primaryOutput();
+ if (output)
+ output->setGeometry(geometry);
}
QRect QWaylandCompositor::outputGeometry() const
{
- return m_compositor->outputGeometry();
+ QWaylandOutput *output = primaryOutput();
+ if (output)
+ return output->geometry();
+ return QRect();
}
void QWaylandCompositor::setOutputRefreshRate(int rate)
{
- m_compositor->setOutputRefreshRate(rate);
+ QWaylandOutput *output = primaryOutput();
+ if (output)
+ output->setMode({output->mode().size, rate});
}
int QWaylandCompositor::outputRefreshRate() const
{
- return m_compositor->outputRefreshRate();
+ QWaylandOutput *output = primaryOutput();
+ if (output)
+ return output->mode().refreshRate;
+ return 0;
}
+#endif
QWaylandInputDevice *QWaylandCompositor::defaultInputDevice() const
{
@@ -302,4 +350,11 @@ QWaylandInputDevice *QWaylandCompositor::inputDeviceFor(QInputEvent *inputEvent)
return m_compositor->inputDeviceFor(inputEvent);
}
+QWaylandOutput *QWaylandCompositor::createOutput(QWindow *window,
+ const QString &manufacturer,
+ const QString &model)
+{
+ return new QWaylandOutput(this, window, manufacturer, model);
+}
+
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandcompositor.h b/src/compositor/compositor_api/qwaylandcompositor.h
index 2c73a1d3e..c1c785517 100644
--- a/src/compositor/compositor_api/qwaylandcompositor.h
+++ b/src/compositor/compositor_api/qwaylandcompositor.h
@@ -63,6 +63,7 @@ class QWaylandInputPanel;
class QWaylandDrag;
class QWaylandGlobalInterface;
class QWaylandSurfaceView;
+class QWaylandOutput;
namespace QtWayland
{
@@ -86,7 +87,7 @@ public:
};
Q_DECLARE_FLAGS(ExtensionFlags, ExtensionFlag)
- QWaylandCompositor(QWindow *window = 0, const char *socketName = 0, ExtensionFlags extensions = DefaultExtensions);
+ QWaylandCompositor(const char *socketName = 0, ExtensionFlags extensions = DefaultExtensions);
virtual ~QWaylandCompositor();
void addGlobalInterface(QWaylandGlobalInterface *interface);
@@ -102,7 +103,11 @@ public:
QList<QWaylandSurface *> surfacesForClient(QWaylandClient* client) const;
QList<QWaylandSurface *> surfaces() const;
- QWindow *window()const;
+ QList<QWaylandOutput *> outputs() const;
+ QWaylandOutput *output(QWindow *window);
+
+ QWaylandOutput *primaryOutput() const;
+ void setPrimaryOutput(QWaylandOutput *output);
virtual void surfaceCreated(QWaylandSurface *surface) = 0;
virtual void surfaceAboutToBeDestroyed(QWaylandSurface *surface);
@@ -122,6 +127,7 @@ public:
const char *socketName() const;
+#if QT_DEPRECATED_SINCE(5, 5)
void setScreenOrientation(Qt::ScreenOrientation orientation);
void setOutputGeometry(const QRect &outputGeometry);
@@ -129,6 +135,7 @@ public:
void setOutputRefreshRate(int refreshRate);
int outputRefreshRate() const;
+#endif
QWaylandInputDevice *defaultInputDevice() const;
@@ -154,14 +161,15 @@ public:
QWaylandInputDevice *inputDeviceFor(QInputEvent *inputEvent);
protected:
- QWaylandCompositor(QWindow *window, const char *socketName, QtWayland::Compositor *dptr);
+ QWaylandCompositor(const char *socketName, QtWayland::Compositor *dptr);
virtual void retainedSelectionReceived(QMimeData *mimeData);
+ virtual QWaylandOutput *createOutput(QWindow *window,
+ const QString &manufacturer,
+ const QString &model);
+
friend class QtWayland::Compositor;
QtWayland::Compositor *m_compositor;
-
-private:
- QWindow *m_toplevel_window;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWaylandCompositor::ExtensionFlags)
diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp
new file mode 100644
index 000000000..ab2ee526e
--- /dev/null
+++ b/src/compositor/compositor_api/qwaylandoutput.cpp
@@ -0,0 +1,246 @@
+/****************************************************************************
+**
+** Copyright (C) 2014-2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
+** Copyright (C) 2013 Klarälvdalens Datakonsult AB (KDAB).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Compositor.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+** of its contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QtMath>
+#include <QtGui/QWindow>
+#include <QtGui/QExposeEvent>
+#include <private/qobject_p.h>
+
+#include "wayland_wrapper/qwlcompositor_p.h"
+#include "wayland_wrapper/qwloutput_p.h"
+#include "qwaylandcompositor.h"
+#include "qwaylandoutput.h"
+
+QWaylandOutput::QWaylandOutput(QWaylandCompositor *compositor, QWindow *window,
+ const QString &manufacturer, const QString &model)
+ : QObject()
+ , d_ptr(new QtWayland::Output(compositor->handle(), window))
+{
+ d_ptr->m_output = this;
+ d_ptr->setManufacturer(manufacturer);
+ d_ptr->setModel(model);
+ d_ptr->compositor()->addOutput(this);
+}
+
+QWaylandOutput::~QWaylandOutput()
+{
+ d_ptr->compositor()->removeOutput(this);
+ delete d_ptr;
+}
+
+QWaylandOutput *QWaylandOutput::fromResource(wl_resource *resource)
+{
+ QtWayland::OutputResource *outputResource = static_cast<QtWayland::OutputResource *>(
+ QtWayland::Output::Resource::fromResource(resource));
+ if (!outputResource)
+ return Q_NULLPTR;
+
+ QtWayland::Output *output = static_cast<QtWayland::Output *>(outputResource->output_object);
+ if (!output)
+ return Q_NULLPTR;
+
+ return output->output();
+}
+
+void QWaylandOutput::update()
+{
+ QRect rect(QPoint(0, 0), window()->size());
+ QRegion region(rect);
+ QExposeEvent *event = new QExposeEvent(region);
+ QCoreApplication::postEvent(window(), event);
+}
+
+QWaylandCompositor *QWaylandOutput::compositor() const
+{
+ return d_ptr->compositor()->waylandCompositor();
+}
+
+QString QWaylandOutput::manufacturer() const
+{
+ return d_ptr->manufacturer();
+}
+
+QString QWaylandOutput::model() const
+{
+ return d_ptr->model();
+}
+
+QPoint QWaylandOutput::position() const
+{
+ return d_ptr->position();
+}
+
+void QWaylandOutput::setPosition(const QPoint &pt)
+{
+ if (d_ptr->position() == pt)
+ return;
+
+ d_ptr->setPosition(pt);
+ Q_EMIT positionChanged();
+ Q_EMIT geometryChanged();
+}
+
+QWaylandOutput::Mode QWaylandOutput::mode() const
+{
+ return d_ptr->mode();
+}
+
+void QWaylandOutput::setMode(const Mode &mode)
+{
+ if (d_ptr->mode().size == mode.size && d_ptr->mode().refreshRate == mode.refreshRate)
+ return;
+
+ d_ptr->setMode(mode);
+ Q_EMIT modeChanged();
+ Q_EMIT geometryChanged();
+
+ if (window()) {
+ window()->resize(mode.size);
+ window()->setMinimumSize(mode.size);
+ window()->setMaximumSize(mode.size);
+ }
+}
+
+QRect QWaylandOutput::geometry() const
+{
+ return d_ptr->geometry();
+}
+
+void QWaylandOutput::setGeometry(const QRect &geometry)
+{
+ if (d_ptr->geometry() == geometry)
+ return;
+
+ d_ptr->setGeometry(geometry);
+ Q_EMIT positionChanged();
+ Q_EMIT modeChanged();
+
+ if (window()) {
+ window()->resize(geometry.size());
+ window()->setMinimumSize(geometry.size());
+ window()->setMaximumSize(geometry.size());
+ }
+}
+
+QRect QWaylandOutput::availableGeometry() const
+{
+ if (!d_ptr->availableGeometry().isValid())
+ return QRect(d_ptr->position(), d_ptr->mode().size);
+
+ return d_ptr->availableGeometry();
+}
+
+void QWaylandOutput::setAvailableGeometry(const QRect &availableGeometry)
+{
+ if (d_ptr->availableGeometry() == availableGeometry)
+ return;
+
+ d_ptr->setAvailableGeometry(availableGeometry);
+ Q_EMIT availableGeometryChanged();
+}
+
+QSize QWaylandOutput::physicalSize() const
+{
+ return d_ptr->physicalSize();
+}
+
+void QWaylandOutput::setPhysicalSize(const QSize &size)
+{
+ if (d_ptr->physicalSize() == size)
+ return;
+
+ d_ptr->setPhysicalSize(size);
+ Q_EMIT physicalSizeChanged();
+}
+
+QWaylandOutput::Subpixel QWaylandOutput::subpixel() const
+{
+ return d_ptr->subpixel();
+}
+
+void QWaylandOutput::setSubpixel(const Subpixel &subpixel)
+{
+ if (d_ptr->subpixel() == subpixel)
+ return;
+
+ d_ptr->setSubpixel(subpixel);
+ Q_EMIT subpixelChanged();
+}
+
+QWaylandOutput::Transform QWaylandOutput::transform() const
+{
+ return d_ptr->transform();
+}
+
+void QWaylandOutput::setTransform(const Transform &transform)
+{
+ if (d_ptr->transform() == transform)
+ return;
+
+ d_ptr->setTransform(transform);
+ Q_EMIT transformChanged();
+}
+
+int QWaylandOutput::scaleFactor() const
+{
+ return d_ptr->scaleFactor();
+}
+
+void QWaylandOutput::setScaleFactor(int scale)
+{
+ if (d_ptr->scaleFactor() == scale)
+ return;
+
+ d_ptr->setScaleFactor(scale);
+ Q_EMIT scaleFactorChanged();
+
+}
+
+QWindow *QWaylandOutput::window() const
+{
+ return d_ptr->window();
+}
+
+QtWayland::Output *QWaylandOutput::handle()
+{
+ return d_ptr;
+}
diff --git a/src/compositor/compositor_api/qwaylandoutput.h b/src/compositor/compositor_api/qwaylandoutput.h
new file mode 100644
index 000000000..5c31be9df
--- /dev/null
+++ b/src/compositor/compositor_api/qwaylandoutput.h
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 2014-2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
+** Copyright (C) 2013 Klarälvdalens Datakonsult AB (KDAB).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Compositor.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+** of its contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDOUTPUT_H
+#define QWAYLANDOUTPUT_H
+
+#include <QtCompositor/qwaylandexport.h>
+
+#include <QObject>
+#include <QRect>
+#include <QSize>
+
+QT_BEGIN_NAMESPACE
+
+struct wl_resource;
+
+class QWaylandCompositor;
+class QWindow;
+
+namespace QtWayland {
+ class Output;
+}
+
+class Q_COMPOSITOR_EXPORT QWaylandOutput : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString manufacturer READ manufacturer CONSTANT)
+ Q_PROPERTY(QString model READ model CONSTANT)
+ Q_PROPERTY(QPoint position READ position WRITE setPosition NOTIFY positionChanged)
+ Q_PROPERTY(QWaylandOutput::Mode mode READ mode WRITE setMode NOTIFY modeChanged)
+ Q_PROPERTY(QRect geometry READ geometry NOTIFY geometryChanged)
+ Q_PROPERTY(QRect availableGeometry READ availableGeometry WRITE setAvailableGeometry NOTIFY availableGeometryChanged)
+ Q_PROPERTY(QSize physicalSize READ physicalSize WRITE setPhysicalSize NOTIFY physicalSizeChanged)
+ Q_PROPERTY(QWaylandOutput::Subpixel subpixel READ subpixel WRITE setSubpixel NOTIFY subpixelChanged)
+ Q_PROPERTY(QWaylandOutput::Transform transform READ transform WRITE setTransform NOTIFY transformChanged)
+ Q_PROPERTY(int scaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged)
+ Q_PROPERTY(QWindow *window READ window CONSTANT)
+ Q_ENUMS(Subpixel Transform)
+public:
+ enum Subpixel {
+ SubpixelUnknown = 0,
+ SubpixelNone,
+ SubpixelHorizontalRgb,
+ SubpixelHorizontalBgr,
+ SubpixelVerticalRgb,
+ SubpixelVerticalBgr
+ };
+
+ enum Transform {
+ TransformNormal = 0,
+ Transform90,
+ Transform180,
+ Transform270,
+ TransformFlipped,
+ TransformFlipped90,
+ TransformFlipped180,
+ TransformFlipped270
+ };
+
+ struct Mode
+ {
+ QSize size;
+ int refreshRate;
+ };
+
+ QWaylandOutput(QWaylandCompositor *compositor, QWindow *window,
+ const QString &manufacturer, const QString &model);
+ ~QWaylandOutput();
+
+ static QWaylandOutput *fromResource(wl_resource *resource);
+
+ virtual void update();
+
+ QWaylandCompositor *compositor() const;
+
+ QString manufacturer() const;
+
+ QString model() const;
+
+ QPoint position() const;
+ void setPosition(const QPoint &pt);
+
+ Mode mode() const;
+ void setMode(const Mode &mode);
+
+ QRect geometry() const;
+ void setGeometry(const QRect &geometry);
+
+ QRect availableGeometry() const;
+ void setAvailableGeometry(const QRect &availableGeometry);
+
+ QSize physicalSize() const;
+ void setPhysicalSize(const QSize &size);
+
+ Subpixel subpixel() const;
+ void setSubpixel(const Subpixel &subpixel);
+
+ Transform transform() const;
+ void setTransform(const Transform &transform);
+
+ int scaleFactor() const;
+ void setScaleFactor(int scale);
+
+ QWindow *window() const;
+
+ QtWayland::Output *handle();
+
+Q_SIGNALS:
+ void positionChanged();
+ void geometryChanged();
+ void modeChanged();
+ void availableGeometryChanged();
+ void physicalSizeChanged();
+ void scaleFactorChanged();
+ void subpixelChanged();
+ void transformChanged();
+
+private:
+ QtWayland::Output *const d_ptr;
+};
+
+Q_DECLARE_METATYPE(QWaylandOutput::Mode)
+
+QT_END_NAMESPACE
+
+#endif // QWAYLANDOUTPUT_H
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.cpp b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
index 1333100c6..bd053a93d 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
@@ -39,14 +39,13 @@
**
****************************************************************************/
-#include <QQuickWindow>
-
#include <QtCompositor/private/qwlcompositor_p.h>
#include "qwaylandclient.h"
#include "qwaylandquickcompositor.h"
#include "qwaylandquicksurface.h"
#include "qwaylandsurfaceitem.h"
+#include "qwaylandquickoutput.h"
QT_BEGIN_NAMESPACE
@@ -78,32 +77,29 @@ public:
};
-QWaylandQuickCompositor::QWaylandQuickCompositor(QQuickWindow *window, const char *socketName, ExtensionFlags extensions)
- : QWaylandCompositor(window, socketName, new QWaylandQuickCompositorPrivate(this, extensions))
+QWaylandQuickCompositor::QWaylandQuickCompositor(const char *socketName, ExtensionFlags extensions)
+ : QWaylandCompositor(socketName, new QWaylandQuickCompositorPrivate(this, extensions))
{
- window->connect(window, &QQuickWindow::beforeSynchronizing, d_ptr(), &QWaylandQuickCompositorPrivate::updateStarted, Qt::DirectConnection);
-
qmlRegisterUncreatableType<QWaylandSurfaceItem>("QtCompositor", 1, 0, "WaylandSurfaceItem", QObject::tr("Cannot create instance of WaylandSurfaceItem"));
qmlRegisterUncreatableType<QWaylandQuickSurface>("QtCompositor", 1, 0, "WaylandQuickSurface", QObject::tr("Cannot create instance of WaylandQuickSurface"));
qmlRegisterUncreatableType<QWaylandClient>("QtCompositor", 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient"));
+ qmlRegisterUncreatableType<QWaylandOutput>("QtCompositor", 1, 0, "WaylandOutput", QObject::tr("Cannot create instance of WaylandOutput"));
}
-QWaylandQuickCompositorPrivate *QWaylandQuickCompositor::d_ptr()
-{
- return static_cast<QWaylandQuickCompositorPrivate *>(m_compositor);
-}
-
-void QWaylandQuickCompositor::update()
+QWaylandSurfaceView *QWaylandQuickCompositor::createView(QWaylandSurface *surf)
{
- if (!d_ptr()->updateScheduled) {
- static_cast<QQuickWindow *>(window())->update();
- d_ptr()->updateScheduled = true;
- }
+ return new QWaylandSurfaceItem(static_cast<QWaylandQuickSurface *>(surf));
}
-QWaylandSurfaceView *QWaylandQuickCompositor::createView(QWaylandSurface *surf)
+QWaylandOutput *QWaylandQuickCompositor::createOutput(QWindow *window,
+ const QString &manufacturer,
+ const QString &model)
{
- return new QWaylandSurfaceItem(static_cast<QWaylandQuickSurface *>(surf));
+ QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(window);
+ if (!quickWindow)
+ qFatal("%s: couldn't cast QWindow to QQuickWindow. All output windows must "
+ "be QQuickWindow derivates when using QWaylandQuickCompositor", Q_FUNC_INFO);
+ return new QWaylandQuickOutput(this, quickWindow, manufacturer, model);
}
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.h b/src/compositor/compositor_api/qwaylandquickcompositor.h
index 0e252ba0f..9d9a54e51 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.h
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.h
@@ -49,19 +49,17 @@ QT_BEGIN_NAMESPACE
class QQuickWindow;
class QWaylandQuickCompositorPrivate;
class QWaylandSurfaceView;
+class QWaylandOutput;
class Q_COMPOSITOR_EXPORT QWaylandQuickCompositor : public QWaylandCompositor
{
public:
- QWaylandQuickCompositor(QQuickWindow *window = 0, const char *socketName = 0, QWaylandCompositor::ExtensionFlags extensions = DefaultExtensions);
-
- void update();
+ QWaylandQuickCompositor(const char *socketName = 0, QWaylandCompositor::ExtensionFlags extensions = DefaultExtensions);
QWaylandSurfaceView *createView(QWaylandSurface *surf) Q_DECL_OVERRIDE;
-
-private:
- friend class QWaylandQuickCompositorPrivate;
- QWaylandQuickCompositorPrivate *d_ptr();
+ QWaylandOutput *createOutput(QWindow *window,
+ const QString &manufacturer,
+ const QString &model) Q_DECL_OVERRIDE;
};
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.cpp b/src/compositor/compositor_api/qwaylandquickoutput.cpp
new file mode 100644
index 000000000..6dfe1e04d
--- /dev/null
+++ b/src/compositor/compositor_api/qwaylandquickoutput.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 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 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandquickoutput.h"
+#include "qwaylandquickcompositor.h"
+
+QT_BEGIN_NAMESPACE
+
+QWaylandQuickOutput::QWaylandQuickOutput(QWaylandCompositor *compositor, QQuickWindow *window,
+ const QString &manufacturer, const QString &model)
+ : QWaylandOutput(compositor, window, manufacturer, model)
+ , m_updateScheduled(false)
+{
+ connect(window, &QQuickWindow::beforeSynchronizing,
+ this, &QWaylandQuickOutput::updateStarted,
+ Qt::DirectConnection);
+}
+
+QQuickWindow *QWaylandQuickOutput::quickWindow() const
+{
+ return static_cast<QQuickWindow *>(window());
+}
+
+void QWaylandQuickOutput::update()
+{
+ if (!m_updateScheduled) {
+ quickWindow()->update();
+ m_updateScheduled = true;
+ }
+}
+
+void QWaylandQuickOutput::updateStarted()
+{
+ m_updateScheduled = false;
+ frameStarted();
+ compositor()->cleanupGraphicsResources();
+}
+
+QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.h b/src/compositor/compositor_api/qwaylandquickoutput.h
new file mode 100644
index 000000000..141f6e131
--- /dev/null
+++ b/src/compositor/compositor_api/qwaylandquickoutput.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 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 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDQUICKOUTPUT_H
+#define QWAYLANDQUICKOUTPUT_H
+
+#include <QtQuick/QQuickWindow>
+#include <QtCompositor/qwaylandoutput.h>
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandQuickCompositor;
+class QQuickWindow;
+
+class Q_COMPOSITOR_EXPORT QWaylandQuickOutput : public QWaylandOutput
+{
+ Q_OBJECT
+public:
+ QWaylandQuickOutput(QWaylandCompositor *compositor, QQuickWindow *window,
+ const QString &manufacturer, const QString &model);
+
+ QQuickWindow *quickWindow() const;
+
+ void update() Q_DECL_OVERRIDE;
+
+public Q_SLOTS:
+ void updateStarted();
+
+private:
+ bool m_updateScheduled;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp
index 40cd8b749..83b37da51 100644
--- a/src/compositor/compositor_api/qwaylandquicksurface.cpp
+++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp
@@ -48,6 +48,7 @@
#include "qwaylandquicksurface.h"
#include "qwaylandquickcompositor.h"
#include "qwaylandsurfaceitem.h"
+#include "qwaylandoutput.h"
#include <QtCompositor/qwaylandbufferref.h>
#include <QtCompositor/private/qwaylandsurface_p.h>
@@ -84,7 +85,7 @@ public:
bufferRef.destroyTexture();
bufferRef = nextBuffer;
- QQuickWindow *window = static_cast<QQuickWindow *>(surface->compositor()->window());
+ QQuickWindow *window = static_cast<QQuickWindow *>(surface->output()->window());
// If the next buffer is NULL do not delete the current texture. If the client called
// attach(0) the surface is going to be unmapped anyway, if instead the client attached
// a valid buffer but died before we got here we want to keep the old buffer around
@@ -149,7 +150,7 @@ public:
}
QWaylandSurfacePrivate::surface_commit(resource);
- compositor->update();
+ output()->waylandOutput()->update();
}
BufferAttacher *buffer;
@@ -166,7 +167,7 @@ QWaylandQuickSurface::QWaylandQuickSurface(wl_client *client, quint32 id, int ve
d->buffer->surface = this;
setBufferAttacher(d->buffer);
- QQuickWindow *window = static_cast<QQuickWindow *>(compositor->window());
+ QQuickWindow *window = static_cast<QQuickWindow *>(output()->window());
connect(window, &QQuickWindow::beforeSynchronizing, this, &QWaylandQuickSurface::updateTexture, Qt::DirectConnection);
connect(window, &QQuickWindow::sceneGraphInvalidated, this, &QWaylandQuickSurface::invalidateTexture, Qt::DirectConnection);
connect(this, &QWaylandSurface::windowPropertyChanged, d->windowPropertyMap, &QQmlPropertyMap::insert);
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index 8dacc8ec3..b504d2f44 100644
--- a/src/compositor/compositor_api/qwaylandsurface.cpp
+++ b/src/compositor/compositor_api/qwaylandsurface.cpp
@@ -239,6 +239,14 @@ QWaylandCompositor *QWaylandSurface::compositor() const
return d->compositor()->waylandCompositor();
}
+QWaylandOutput *QWaylandSurface::output() const
+{
+ Q_D(const QWaylandSurface);
+ if (!d->output())
+ return Q_NULLPTR;
+ return d->output()->waylandOutput();
+}
+
QWindow::Visibility QWaylandSurface::visibility() const
{
Q_D(const QWaylandSurface);
diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h
index 4b802d778..1294d4f9e 100644
--- a/src/compositor/compositor_api/qwaylandsurface.h
+++ b/src/compositor/compositor_api/qwaylandsurface.h
@@ -62,6 +62,7 @@ class QWaylandBufferRef;
class QWaylandSurfaceView;
class QWaylandSurfaceInterface;
class QWaylandSurfaceOp;
+class QWaylandOutput;
namespace QtWayland {
class Surface;
@@ -162,6 +163,8 @@ public:
QWaylandCompositor *compositor() const;
+ QWaylandOutput *output() const;
+
QString className() const;
QString title() const;
diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp
index 6eee0770c..aa772d93e 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor.cpp
+++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp
@@ -63,6 +63,7 @@
#include "qwaylandglobalinterface.h"
#include "qwaylandsurfaceview.h"
#include "qwaylandshmformathelper.h"
+#include "qwaylandoutput.h"
#include <QWindow>
#include <QSocketNotifier>
@@ -150,8 +151,6 @@ void Compositor::init()
foreach (wl_shm_format format, formats)
wl_display_add_shm_format(m_display->handle(), format);
- m_output_global = new OutputGlobal(m_display->handle());
-
if (wl_display_add_socket(m_display->handle(), m_qt_compositor->socketName())) {
fprintf(stderr, "Fatal: Failed to open server socket\n");
exit(EXIT_FAILURE);
@@ -184,6 +183,7 @@ Compositor::~Compositor()
qWarning("QWaylandCompositor::cleanupGraphicsResources() must be called manually");
qDeleteAll(m_clients);
+ qDeleteAll(m_outputs);
delete m_outputExtension;
delete m_surfaceExtension;
@@ -195,7 +195,6 @@ Compositor::~Compositor()
delete m_default_wayland_input_device;
delete m_data_device_manager;
- delete m_output_global;
delete m_display;
}
@@ -212,6 +211,57 @@ uint Compositor::currentTimeMsecs() const
return m_timer.elapsed();
}
+QList<QWaylandOutput *> Compositor::outputs() const
+{
+ return m_outputs;
+}
+
+QWaylandOutput *Compositor::output(QWindow *window) const
+{
+ Q_FOREACH (QWaylandOutput *output, m_outputs) {
+ if (output->window() == window)
+ return output;
+ }
+
+ return Q_NULLPTR;
+}
+
+void Compositor::addOutput(QWaylandOutput *output)
+{
+ Q_ASSERT(output->handle());
+
+ if (m_outputs.contains(output))
+ return;
+
+ m_outputs.append(output);
+}
+
+void Compositor::removeOutput(QWaylandOutput *output)
+{
+ Q_ASSERT(output->handle());
+
+ m_outputs.removeOne(output);
+}
+
+QWaylandOutput *Compositor::primaryOutput() const
+{
+ if (m_outputs.size() == 0)
+ return Q_NULLPTR;
+ return m_outputs.at(0);
+}
+
+void Compositor::setPrimaryOutput(QWaylandOutput *output)
+{
+ Q_ASSERT(output->handle());
+
+ int i = m_outputs.indexOf(output);
+ if (i <= 0)
+ return;
+
+ m_outputs.removeAt(i);
+ m_outputs.prepend(output);
+}
+
void Compositor::processWaylandEvents()
{
int ret = wl_event_loop_dispatch(m_loop, 0);
@@ -271,11 +321,6 @@ void Compositor::destroyClient(QWaylandClient *client)
wl_client_destroy(client->client());
}
-QWindow *Compositor::window() const
-{
- return m_qt_compositor->window();
-}
-
ClientBufferIntegration * Compositor::clientBufferIntegration() const
{
#ifdef QT_COMPOSITOR_WAYLAND_GL
@@ -299,11 +344,9 @@ void Compositor::initializeHardwareIntegration()
#ifdef QT_COMPOSITOR_WAYLAND_GL
if (m_extensions & QWaylandCompositor::HardwareIntegrationExtension)
m_hw_integration.reset(new HardwareIntegration(this));
- QWindow *window = m_qt_compositor->window();
- if (window && window->surfaceType() != QWindow::RasterSurface) {
- loadClientBufferIntegration();
- loadServerBufferIntegration();
- }
+
+ loadClientBufferIntegration();
+ loadServerBufferIntegration();
if (m_client_buffer_integration)
m_client_buffer_integration->initializeHardware(m_display);
@@ -345,43 +388,6 @@ QList<QWaylandClient *> Compositor::clients() const
return m_clients;
}
-void Compositor::setScreenOrientation(Qt::ScreenOrientation orientation)
-{
- m_orientation = orientation;
- m_output_global->sendOutputOrientation(orientation);
-}
-
-Qt::ScreenOrientation Compositor::screenOrientation() const
-{
- return m_orientation;
-}
-
-void Compositor::setOutputGeometry(const QRect &geometry)
-{
- if (m_output_global)
- m_output_global->setGeometry(geometry);
-}
-
-QRect Compositor::outputGeometry() const
-{
- if (m_output_global)
- return m_output_global->geometry();
- return QRect();
-}
-
-void Compositor::setOutputRefreshRate(int rate)
-{
- if (m_output_global)
- m_output_global->setRefreshRate(rate);
-}
-
-int Compositor::outputRefreshRate() const
-{
- if (m_output_global)
- return m_output_global->refreshRate();
- return 0;
-}
-
void Compositor::setClientFullScreenHint(bool value)
{
if (m_windowManagerIntegration)
diff --git a/src/compositor/wayland_wrapper/qwlcompositor_p.h b/src/compositor/wayland_wrapper/qwlcompositor_p.h
index 9c3a0f9de..85f020d47 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor_p.h
+++ b/src/compositor/wayland_wrapper/qwlcompositor_p.h
@@ -49,7 +49,6 @@
#include <QtCore/QElapsedTimer>
#include <QtCore/QSet>
-#include <QtGui/QWindow>
#include <private/qwldisplay_p.h>
@@ -111,7 +110,14 @@ public:
uint currentTimeMsecs() const;
- QWindow *window() const;
+ QList<QWaylandOutput *> outputs() const;
+ QWaylandOutput *output(QWindow *window) const;
+
+ void addOutput(QWaylandOutput *output);
+ void removeOutput(QWaylandOutput *output);
+
+ QWaylandOutput *primaryOutput() const;
+ void setPrimaryOutput(QWaylandOutput *output);
ClientBufferIntegration *clientBufferIntegration() const;
ServerBufferIntegration *serverBufferIntegration() const;
@@ -133,13 +139,6 @@ public:
WindowManagerServerIntegration *windowManagerIntegration() const { return m_windowManagerIntegration; }
- void setScreenOrientation(Qt::ScreenOrientation orientation);
- Qt::ScreenOrientation screenOrientation() const;
- void setOutputGeometry(const QRect &geometry);
- QRect outputGeometry() const;
- void setOutputRefreshRate(int rate);
- int outputRefreshRate() const;
-
void setClientFullScreenHint(bool value);
QWaylandCompositor::ExtensionFlags extensions() const;
@@ -189,8 +188,7 @@ protected:
QList<QWaylandInputDevice *> m_inputDevices;
/* Output */
- //make this a list of the available screens
- OutputGlobal *m_output_global;
+ QList<QWaylandOutput *> m_outputs;
DataDeviceManager *m_data_device_manager;
diff --git a/src/compositor/wayland_wrapper/qwlextendedoutput.cpp b/src/compositor/wayland_wrapper/qwlextendedoutput.cpp
index 8bf69ff41..edb4f5537 100644
--- a/src/compositor/wayland_wrapper/qwlextendedoutput.cpp
+++ b/src/compositor/wayland_wrapper/qwlextendedoutput.cpp
@@ -56,10 +56,10 @@ OutputExtensionGlobal::OutputExtensionGlobal(Compositor *compositor)
void OutputExtensionGlobal::output_extension_get_extended_output(qt_output_extension::Resource *resource, uint32_t id, wl_resource *output_resource)
{
- Output *output = static_cast<Output *>(OutputGlobal::Resource::fromResource(output_resource));
+ OutputResource *output = static_cast<OutputResource *>(Output::Resource::fromResource(output_resource));
Q_ASSERT(output->extendedOutput == 0);
- ExtendedOutput *extendedOutput = static_cast<ExtendedOutput *>(qt_extended_output::add(resource->client(), id, resource->version()));
+ ExtendedOutput *extendedOutput = static_cast<ExtendedOutput *>(qt_extended_output::add(resource->client(), id));
Q_ASSERT(!output->extendedOutput);
output->extendedOutput = extendedOutput;
diff --git a/src/compositor/wayland_wrapper/qwlextendedoutput_p.h b/src/compositor/wayland_wrapper/qwlextendedoutput_p.h
index 5f620cd86..f0772e118 100644
--- a/src/compositor/wayland_wrapper/qwlextendedoutput_p.h
+++ b/src/compositor/wayland_wrapper/qwlextendedoutput_p.h
@@ -54,14 +54,14 @@ QT_BEGIN_NAMESPACE
namespace QtWayland {
class Compositor;
-class Output;
+class OutputResource;
class ExtendedOutput : public QtWaylandServer::qt_extended_output::Resource
{
public:
ExtendedOutput() : output(0) {}
- Output *output;
+ OutputResource *output;
};
class OutputExtensionGlobal : public QtWaylandServer::qt_output_extension, public QtWaylandServer::qt_extended_output
diff --git a/src/compositor/wayland_wrapper/qwlinputpanelsurface.cpp b/src/compositor/wayland_wrapper/qwlinputpanelsurface.cpp
index 138e57032..f92d2bf3e 100644
--- a/src/compositor/wayland_wrapper/qwlinputpanelsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlinputpanelsurface.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2013 Klarälvdalens Datakonsult AB (KDAB).
** Contact: http://www.qt-project.org/legal
**
@@ -77,10 +78,11 @@ void InputPanelSurface::input_panel_surface_set_overlay_panel(Resource *)
m_type = OverlayPanel;
}
-void InputPanelSurface::input_panel_surface_set_toplevel(Resource *, wl_resource *output, uint32_t position)
+void InputPanelSurface::input_panel_surface_set_toplevel(Resource *, wl_resource *output_resource, uint32_t position)
{
m_type = Toplevel;
- m_output = static_cast<Output *>(Output::Resource::fromResource(output));
+ OutputResource *output = static_cast<OutputResource *>(Output::Resource::fromResource(output_resource));
+ m_output = static_cast<Output *>(output->output_object);
m_position = static_cast<wl_input_panel_surface::position>(position);
}
diff --git a/src/compositor/wayland_wrapper/qwlinputpanelsurface_p.h b/src/compositor/wayland_wrapper/qwlinputpanelsurface_p.h
index 89c85895f..88bd5f63f 100644
--- a/src/compositor/wayland_wrapper/qwlinputpanelsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlinputpanelsurface_p.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2013 Klarälvdalens Datakonsult AB (KDAB).
** Contact: http://www.qt-project.org/legal
**
@@ -68,7 +69,7 @@ public:
protected:
void input_panel_surface_set_overlay_panel(Resource *resource) Q_DECL_OVERRIDE;
- void input_panel_surface_set_toplevel(Resource *resource, wl_resource *output, uint32_t position) Q_DECL_OVERRIDE;
+ void input_panel_surface_set_toplevel(Resource *resource, wl_resource *output_resource, uint32_t position) Q_DECL_OVERRIDE;
private:
Surface *m_surface;
diff --git a/src/compositor/wayland_wrapper/qwloutput.cpp b/src/compositor/wayland_wrapper/qwloutput.cpp
index 7638370bc..1659a63cc 100644
--- a/src/compositor/wayland_wrapper/qwloutput.cpp
+++ b/src/compositor/wayland_wrapper/qwloutput.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -39,100 +40,222 @@
****************************************************************************/
#include "qwloutput_p.h"
+
+#include "qwlcompositor_p.h"
#include "qwlextendedoutput_p.h"
-#include <QGuiApplication>
-#include <QtGui/QScreen>
+
+#include <QtGui/QWindow>
#include <QRect>
QT_BEGIN_NAMESPACE
namespace QtWayland {
-OutputGlobal::OutputGlobal(struct ::wl_display *display)
- : QtWaylandServer::wl_output(display, 2)
- , m_displayId(-1)
- , m_numQueued(0)
- , m_transform(WL_OUTPUT_TRANSFORM_NORMAL)
+static QtWaylandServer::wl_output::subpixel toWlSubpixel(const QWaylandOutput::Subpixel &value)
{
- QScreen *screen = QGuiApplication::primaryScreen();
- m_geometry = QRect(QPoint(0, 0), screen->availableGeometry().size());
- m_refreshRate = qRound(screen->refreshRate() * 1000.0);
+ 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;
}
-OutputGlobal::~OutputGlobal()
+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;
}
-void OutputGlobal::output_bind_resource(Resource *resource)
+Output::Output(Compositor *compositor, QWindow *window)
+ : QtWaylandServer::wl_output(compositor->wl_display(), 2)
+ , m_compositor(compositor)
+ , m_window(window)
+ , m_output(Q_NULLPTR)
+ , m_position(QPoint())
+ , m_availableGeometry(QRect())
+ , m_physicalSize(QSize())
+ , m_subpixel(QWaylandOutput::SubpixelUnknown)
+ , m_transform(QWaylandOutput::TransformNormal)
+ , m_scaleFactor(1)
{
- wl_output_send_geometry(resource->handle, 0, 0,
- m_physicalSize.width(), m_physicalSize.height(), 0, "", "", m_transform);
+ m_mode.size = window ? window->size() : QSize();
+ m_mode.refreshRate = 60;
- wl_output_send_mode(resource->handle, WL_OUTPUT_MODE_CURRENT|WL_OUTPUT_MODE_PREFERRED,
- size().width(), size().height(), refreshRate());
+ qRegisterMetaType<QWaylandOutput::Mode>("WaylandOutput::Mode");
+}
- if (resource->version() >= 2)
- wl_output_send_done(resource->handle);
+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);
+
+ send_scale(resource->handle, m_scaleFactor);
+
+ send_done(resource->handle);
}
-void OutputGlobal::setPhysicalSize(const QSize &size)
+void Output::setManufacturer(const QString &manufacturer)
{
- if (m_physicalSize != size) {
- m_physicalSize = size;
+ m_manufacturer = manufacturer;
+}
- foreach (Resource *res, resourceMap()) {
- wl_output_send_geometry(res->handle, 0, 0,
- m_physicalSize.width(), m_physicalSize.height(), 0, "", "", m_transform);
+void Output::setModel(const QString &model)
+{
+ m_model = model;
+}
- if (res->version() >= 2)
- wl_output_send_done(res->handle);
- }
- }
+void Output::setPosition(const QPoint &position)
+{
+ if (m_position == position)
+ return;
+
+ m_position = position;
+
+ sendGeometryInfo();
}
-void OutputGlobal::setGeometry(const QRect &geometry)
+void Output::setMode(const QWaylandOutput::Mode &mode)
{
- m_geometry = geometry;
+ 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);
+ send_done(resource->handle);
+ }
}
-void OutputGlobal::setRefreshRate(int rate)
+QRect Output::geometry() const
{
- m_refreshRate = rate;
+ return QRect(m_position, m_mode.size);
}
-void OutputGlobal::sendOutputOrientation(Qt::ScreenOrientation orientation)
+void Output::setGeometry(const QRect &geometry)
{
- QScreen *screen = QGuiApplication::primaryScreen();
- bool isPortrait = screen->primaryOrientation() == Qt::PortraitOrientation;
- switch (orientation) {
- case Qt::PrimaryOrientation:
- m_transform = WL_OUTPUT_TRANSFORM_NORMAL;
- break;
- case Qt::PortraitOrientation:
- m_transform = isPortrait ? WL_OUTPUT_TRANSFORM_NORMAL : WL_OUTPUT_TRANSFORM_90;
- break;
- case Qt::LandscapeOrientation:
- m_transform = isPortrait ? WL_OUTPUT_TRANSFORM_270 : WL_OUTPUT_TRANSFORM_NORMAL;
- break;
- case Qt::InvertedPortraitOrientation:
- m_transform = isPortrait ? WL_OUTPUT_TRANSFORM_180 : WL_OUTPUT_TRANSFORM_270;
- break;
- case Qt::InvertedLandscapeOrientation:
- m_transform = isPortrait ? WL_OUTPUT_TRANSFORM_90 : WL_OUTPUT_TRANSFORM_180;
- break;
+ 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);
+ send_done(resource->handle);
}
+}
- foreach (Resource *res, resourceMap()) {
- wl_output_send_geometry(res->handle, 0, 0,
- m_physicalSize.width(), m_physicalSize.height(), 0, "", "", m_transform);
- if (res->version() >= 2)
- wl_output_send_done(res->handle);
+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()) {
+ send_scale(resource->handle, m_scaleFactor);
+ send_done(resource->handle);
}
}
-Output *OutputGlobal::outputForClient(wl_client *client) const
+OutputResource *Output::outputForClient(wl_client *client) const
+{
+ return static_cast<OutputResource *>(resourceMap().value(client));
+}
+
+void Output::sendGeometryInfo()
{
- return static_cast<Output *>(resourceMap().value(client));
+ 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));
+ send_done(resource->handle);
+ }
}
} // namespace Wayland
diff --git a/src/compositor/wayland_wrapper/qwloutput_p.h b/src/compositor/wayland_wrapper/qwloutput_p.h
index 9d90550e3..027cc55b4 100644
--- a/src/compositor/wayland_wrapper/qwloutput_p.h
+++ b/src/compositor/wayland_wrapper/qwloutput_p.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -41,74 +42,95 @@
#ifndef WL_OUTPUT_H
#define WL_OUTPUT_H
+#include <QtCompositor/qwaylandexport.h>
+
#include <QtCore/QRect>
#include <QtCore/QList>
#include <QtCompositor/private/qwayland-server-wayland.h>
+#include <QtCompositor/qwaylandoutput.h>
QT_BEGIN_NAMESPACE
+class QWindow;
+
namespace QtWayland {
+class Compositor;
class ExtendedOutput;
-struct Output : public QtWaylandServer::wl_output::Resource
+struct OutputResource : public QtWaylandServer::wl_output::Resource
{
- Output() : extendedOutput(0) {}
+ OutputResource() : extendedOutput(0) {}
ExtendedOutput *extendedOutput;
};
-class OutputGlobal : public QtWaylandServer::wl_output
+class Output : public QtWaylandServer::wl_output
{
public:
- OutputGlobal(struct ::wl_display *display);
- ~OutputGlobal();
+ explicit Output(Compositor *compositor, QWindow *window = 0);
+
+ Compositor *compositor() const { return m_compositor; }
+
+ QWaylandOutput *output() 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);
- QRect geometry() const { return m_geometry; }
- int x() const { return m_geometry.x(); }
- int y() const { return m_geometry.y(); }
- QSize size() const { return m_geometry.size(); }
+ QWaylandOutput::Mode mode() const { return m_mode; }
+ void setMode(const QWaylandOutput::Mode &mode);
- void setPhysicalSize(const QSize &size);
- void setRefreshRate(int rate);
- int refreshRate() const { return m_refreshRate; }
- void sendOutputOrientation(Qt::ScreenOrientation orientation);
+ QRect availableGeometry() const { return m_availableGeometry; }
+ void setAvailableGeometry(const QRect &availableGeometry);
- Output *outputForClient(struct wl_client *client) const;
+ QSize physicalSize() const { return m_physicalSize; }
+ void setPhysicalSize(const QSize &physicalSize);
- void output_bind_resource(Resource *resource) Q_DECL_OVERRIDE;
- Resource *output_allocate() Q_DECL_OVERRIDE { return new Output; }
+ QWaylandOutput::Subpixel subpixel() const { return m_subpixel; }
+ void setSubpixel(const QWaylandOutput::Subpixel &subpixel);
-private:
- QRect m_geometry;
- QSize m_physicalSize;
- int m_refreshRate;
- int m_displayId;
- int m_numQueued;
- wl_output_transform m_transform;
-};
+ QWaylandOutput::Transform transform() const { return m_transform; }
+ void setTransform(const QWaylandOutput::Transform &transform);
-#if 0
-class Output
-{
-public:
- Output(OutputGlobal *outputGlobal, struct ::wl_resource *resource);
- ~Output();
+ int scaleFactor() const { return m_scaleFactor; }
+ void setScaleFactor(int scale);
+
+ QWindow *window() const { return m_window; }
- OutputGlobal *outputGlobal() const;
+ OutputResource *outputForClient(struct wl_client *client) const;
- ExtendedOutput *extendedOutput() const;
- void setExtendedOutput(ExtendedOutput *extendedOutput);
+ QWaylandOutput *waylandOutput() const { return m_output; }
+
+ void output_bind_resource(Resource *resource) Q_DECL_OVERRIDE;
+ Resource *output_allocate() Q_DECL_OVERRIDE { return new OutputResource; }
- struct wl_resource *handle() const;
private:
- struct wl_resource *m_output_resource;
- OutputGlobal *m_output_global;
- ExtendedOutput *m_extended_output;
+ friend class QT_PREPEND_NAMESPACE(QWaylandOutput);
+
+ Compositor *m_compositor;
+ QWindow *m_window;
+ QWaylandOutput *m_output;
+ QString m_manufacturer;
+ QString m_model;
+ QPoint m_position;
+ QWaylandOutput::Mode m_mode;
+ QRect m_availableGeometry;
+ QSize m_physicalSize;
+ QWaylandOutput::Subpixel m_subpixel;
+ QWaylandOutput::Transform m_transform;
+ int m_scaleFactor;
+
+ void sendGeometryInfo();
};
-#endif
}
diff --git a/src/compositor/wayland_wrapper/qwlshellsurface.cpp b/src/compositor/wayland_wrapper/qwlshellsurface.cpp
index 80304f3cb..ed8e148c3 100644
--- a/src/compositor/wayland_wrapper/qwlshellsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlshellsurface.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -42,11 +43,13 @@
#include "qwlcompositor_p.h"
#include "qwlsurface_p.h"
+#include "qwloutput_p.h"
#include "qwlinputdevice_p.h"
#include "qwlsubsurface_p.h"
#include "qwlpointer_p.h"
#include "qwlextendedsurface_p.h"
+#include "qwaylandoutput.h"
#include "qwaylandsurfaceview.h"
#include <QtCore/qglobal.h>
@@ -278,14 +281,33 @@ void ShellSurface::shell_surface_set_transient(Resource *resource,
void ShellSurface::shell_surface_set_fullscreen(Resource *resource,
uint32_t method,
uint32_t framerate,
- struct wl_resource *output)
+ struct wl_resource *output_resource)
{
Q_UNUSED(resource);
Q_UNUSED(method);
Q_UNUSED(framerate);
- Q_UNUSED(output);
- QSize defaultScreenSize = m_surface->compositor()->outputGeometry().size();
- send_configure(resize_bottom_right, defaultScreenSize.width(), defaultScreenSize.height());
+
+ QWaylandOutput *output = output_resource
+ ? QWaylandOutput::fromResource(output_resource)
+ : Q_NULLPTR;
+ if (!output) {
+ // Look for an output that can contain this surface
+ Q_FOREACH (QWaylandOutput *curOutput, m_surface->compositor()->outputs()) {
+ if (curOutput->geometry().size().width() >= m_surface->size().width() &&
+ curOutput->geometry().size().height() >= m_surface->size().height()) {
+ output = curOutput;
+ break;
+ }
+ }
+ }
+ if (!output) {
+ qWarning() << "Unable to resize surface full screen, cannot determine output";
+ return;
+ }
+ QSize outputSize = output->geometry().size();
+
+ m_view->setPos(output->geometry().topLeft());
+ send_configure(resize_bottom_right, outputSize.width(), outputSize.height());
if (m_surface->extendedSurface())
m_surface->extendedSurface()->setVisibility(QWindow::FullScreen, false);
@@ -311,12 +333,31 @@ void ShellSurface::shell_surface_set_popup(Resource *resource, wl_resource *inpu
}
void ShellSurface::shell_surface_set_maximized(Resource *resource,
- struct wl_resource *output)
+ struct wl_resource *output_resource)
{
Q_UNUSED(resource);
- Q_UNUSED(output);
- QSize defaultScreenSize = m_surface->compositor()->outputGeometry().size();
- send_configure(resize_bottom_right, defaultScreenSize.width(), defaultScreenSize.height());
+
+ QWaylandOutput *output = output_resource
+ ? QWaylandOutput::fromResource(output_resource)
+ : Q_NULLPTR;
+ if (!output) {
+ // Look for an output that can contain this surface
+ Q_FOREACH (QWaylandOutput *curOutput, m_surface->compositor()->outputs()) {
+ if (curOutput->geometry().size().width() >= m_surface->size().width() &&
+ curOutput->geometry().size().height() >= m_surface->size().height()) {
+ output = curOutput;
+ break;
+ }
+ }
+ }
+ if (!output) {
+ qWarning() << "Unable to maximize surface, cannot determine output";
+ return;
+ }
+ QSize outputSize = output->availableGeometry().size();
+
+ m_view->setPos(output->availableGeometry().topLeft());
+ send_configure(resize_bottom_right, outputSize.width(), outputSize.height());
if (m_surface->extendedSurface())
m_surface->extendedSurface()->setVisibility(QWindow::Maximized, false);
diff --git a/src/compositor/wayland_wrapper/qwlshellsurface_p.h b/src/compositor/wayland_wrapper/qwlshellsurface_p.h
index 92405bbc9..5d0b29dbb 100644
--- a/src/compositor/wayland_wrapper/qwlshellsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlshellsurface_p.h
@@ -139,7 +139,7 @@ private:
void shell_surface_set_fullscreen(Resource *resource,
uint32_t method,
uint32_t framerate,
- struct wl_resource *output) Q_DECL_OVERRIDE;
+ struct wl_resource *output_resource) Q_DECL_OVERRIDE;
void shell_surface_set_popup(Resource *resource,
struct wl_resource *input_device,
uint32_t time,
@@ -148,7 +148,7 @@ private:
int32_t y,
uint32_t flags) Q_DECL_OVERRIDE;
void shell_surface_set_maximized(Resource *resource,
- struct wl_resource *output) Q_DECL_OVERRIDE;
+ struct wl_resource *output_resource) Q_DECL_OVERRIDE;
void shell_surface_pong(Resource *resource,
uint32_t serial) Q_DECL_OVERRIDE;
void shell_surface_set_title(Resource *resource,
diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp
index ee8197013..a24aa7e3b 100644
--- a/src/compositor/wayland_wrapper/qwlsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurface.cpp
@@ -48,6 +48,7 @@
#include "qwlsubsurface_p.h"
#include "qwlsurfacebuffer_p.h"
#include "qwaylandsurfaceview.h"
+#include "qwaylandoutput.h"
#include <QtCore/QDebug>
#include <QTouchEvent>
@@ -113,6 +114,7 @@ Surface::Surface(struct wl_client *client, uint32_t id, int version, QWaylandCom
: QtWaylandServer::wl_surface(client, id, version)
, m_compositor(compositor->handle())
, m_waylandSurface(surface)
+ , m_output(m_compositor->primaryOutput()->handle())
, m_buffer(0)
, m_surfaceMapped(false)
, m_attacher(0)
@@ -276,6 +278,11 @@ Compositor *Surface::compositor() const
return m_compositor;
}
+Output *Surface::output() const
+{
+ return m_output;
+}
+
/*!
* Sets the backbuffer for this surface. The back buffer is not yet on
* screen and will become live during the next swapBuffers().
diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h
index bbab57a4d..07eb358ff 100644
--- a/src/compositor/wayland_wrapper/qwlsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurface_p.h
@@ -44,6 +44,7 @@
#include <QtCompositor/qwaylandexport.h>
#include <private/qwlsurfacebuffer_p.h>
+#include <private/qwloutput_p.h>
#include <QtCompositor/qwaylandsurface.h>
#include <QtCompositor/qwaylandbufferref.h>
@@ -112,6 +113,8 @@ public:
Compositor *compositor() const;
+ Output *output() const;
+
QString className() const { return m_className; }
void setClassName(const QString &className);
@@ -159,6 +162,7 @@ protected:
Compositor *m_compositor;
QWaylandSurface *m_waylandSurface;
+ Output *m_output;
QRegion m_damage;
SurfaceBuffer *m_buffer;
diff --git a/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp b/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp
index 4e9a04495..e4f0a3b81 100644
--- a/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp
@@ -127,10 +127,9 @@ DrmEglServerBufferIntegration::~DrmEglServerBufferIntegration()
void DrmEglServerBufferIntegration::initializeHardware(QWaylandCompositor *compositor)
{
- QWindow *window = compositor->window();
Q_ASSERT(QGuiApplication::platformNativeInterface());
- m_egl_display = static_cast<EGLDisplay>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("egldisplay", window));
+ m_egl_display = static_cast<EGLDisplay>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("egldisplay"));
if (!m_egl_display) {
qWarning("Cant initialize drm egl server buffer integration. Missing egl display from platformplugin");
return;
diff --git a/src/hardwareintegration/compositor/libhybris-egl-server/libhybriseglserverbufferintegration.cpp b/src/hardwareintegration/compositor/libhybris-egl-server/libhybriseglserverbufferintegration.cpp
index 7e7a14ab8..9882083c3 100644
--- a/src/hardwareintegration/compositor/libhybris-egl-server/libhybriseglserverbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/libhybris-egl-server/libhybriseglserverbufferintegration.cpp
@@ -131,10 +131,9 @@ LibHybrisEglServerBufferIntegration::~LibHybrisEglServerBufferIntegration()
void LibHybrisEglServerBufferIntegration::initializeHardware(QWaylandCompositor *compositor)
{
- QWindow *window = compositor->window();
Q_ASSERT(QGuiApplication::platformNativeInterface());
- m_egl_display = static_cast<EGLDisplay>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("egldisplay", window));
+ m_egl_display = static_cast<EGLDisplay>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("egldisplay"));
if (!m_egl_display) {
qWarning("Cant initialize libhybris egl server buffer integration. Missing egl display from platformplugin");
return;
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
index 3f7487c40..c1634a234 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
@@ -119,7 +119,7 @@ void WaylandEglClientBufferIntegration::initializeHardware(QtWayland::Display *w
return;
}
- d->egl_display = nativeInterface->nativeResourceForWindow("EglDisplay", m_compositor->window());
+ d->egl_display = nativeInterface->nativeResourceForIntegration("EglDisplay");
if (!d->egl_display) {
qWarning("QtCompositor: Failed to initialize EGL display. Could not get EglDisplay for window.");
return;
diff --git a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp
index 2401d6710..60b17283d 100644
--- a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp
+++ b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.cpp
@@ -78,10 +78,10 @@ void XCompositeEglClientBufferIntegration::initializeHardware(QtWayland::Display
{
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
if (nativeInterface) {
- mDisplay = static_cast<Display *>(nativeInterface->nativeResourceForWindow("Display",m_compositor->window()));
+ mDisplay = static_cast<Display *>(nativeInterface->nativeResourceForIntegration("Display"));
if (!mDisplay)
qFatal("could not retireve Display from platform integration");
- mEglDisplay = static_cast<EGLDisplay>(nativeInterface->nativeResourceForWindow("EGLDisplay",m_compositor->window()));
+ mEglDisplay = static_cast<EGLDisplay>(nativeInterface->nativeResourceForIntegration("EGLDisplay"));
if (!mEglDisplay)
qFatal("could not retrieve EGLDisplay from platform integration");
} else {
diff --git a/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp b/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp
index bd5ddef9a..d02840e24 100644
--- a/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp
+++ b/src/hardwareintegration/compositor/xcomposite-glx/xcompositeglxintegration.cpp
@@ -89,7 +89,7 @@ void XCompositeGLXClientBufferIntegration::initializeHardware(QtWayland::Display
qDebug() << "Initializing GLX integration";
QPlatformNativeInterface *nativeInterface = QGuiApplicationPrivate::platformIntegration()->nativeInterface();
if (nativeInterface) {
- mDisplay = static_cast<Display *>(nativeInterface->nativeResourceForWindow("Display",m_compositor->window()));
+ mDisplay = static_cast<Display *>(nativeInterface->nativeResourceForIntegration("Display"));
if (!mDisplay)
qFatal("could not retireve Display from platform integration");
} else {
diff --git a/src/hardwareintegration/compositor/xcomposite_share/xcompositehandler.cpp b/src/hardwareintegration/compositor/xcomposite_share/xcompositehandler.cpp
index 5e002377e..13f2e65c1 100644
--- a/src/hardwareintegration/compositor/xcomposite_share/xcompositehandler.cpp
+++ b/src/hardwareintegration/compositor/xcomposite_share/xcompositehandler.cpp
@@ -50,9 +50,7 @@ QT_BEGIN_NAMESPACE
XCompositeHandler::XCompositeHandler(QtWayland::Compositor *compositor, Display *display)
: QtWaylandServer::qt_xcomposite(compositor->wl_display(), 1)
{
- compositor->window()->create();
-
- mFakeRootWindow = new QWindow(compositor->window());
+ mFakeRootWindow = new QWindow();
mFakeRootWindow->setGeometry(QRect(-1,-1,1,1));
mFakeRootWindow->create();
mFakeRootWindow->show();