summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/qml-compositor/WindowContainer.qml22
-rw-r--r--examples/qml-compositor/main.cpp7
-rw-r--r--examples/qml-compositor/main.qml4
-rw-r--r--examples/qwindow-compositor/qwindowcompositor.cpp120
-rw-r--r--examples/qwindow-compositor/qwindowcompositor.h14
-rw-r--r--examples/server-buffer/compositor/main.cpp6
-rw-r--r--examples/server-buffer/compositor/qml/main.qml14
-rw-r--r--src/compositor/compositor_api/compositor_api.pri6
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.cpp15
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.h7
-rw-r--r--src/compositor/compositor_api/qwaylanddrag.cpp5
-rw-r--r--src/compositor/compositor_api/qwaylanddrag.h5
-rw-r--r--src/compositor/compositor_api/qwaylandinput.cpp18
-rw-r--r--src/compositor/compositor_api/qwaylandinput.h7
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.cpp7
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.h3
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp54
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h12
-rw-r--r--src/compositor/compositor_api/qwaylandsurface_p.h2
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.cpp126
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.h15
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceview.cpp89
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceview.h73
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp13
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor_p.h3
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevice.cpp21
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevice_p.h10
-rw-r--r--src/compositor/wayland_wrapper/qwlinputdevice.cpp13
-rw-r--r--src/compositor/wayland_wrapper/qwlinputdevice_p.h7
-rw-r--r--src/compositor/wayland_wrapper/qwlpointer.cpp21
-rw-r--r--src/compositor/wayland_wrapper/qwlpointer_p.h16
-rw-r--r--src/compositor/wayland_wrapper/qwlqttouch.cpp7
-rw-r--r--src/compositor/wayland_wrapper/qwlqttouch_p.h3
-rw-r--r--src/compositor/wayland_wrapper/qwlshellsurface.cpp53
-rw-r--r--src/compositor/wayland_wrapper/qwlshellsurface_p.h10
-rw-r--r--src/compositor/wayland_wrapper/qwlsubsurface.cpp4
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp24
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h9
-rw-r--r--src/compositor/wayland_wrapper/qwltouch.cpp9
-rw-r--r--src/compositor/wayland_wrapper/qwltouch_p.h6
40 files changed, 462 insertions, 398 deletions
diff --git a/examples/qml-compositor/WindowContainer.qml b/examples/qml-compositor/WindowContainer.qml
index 77dd1d4dc..8d25327cc 100644
--- a/examples/qml-compositor/WindowContainer.qml
+++ b/examples/qml-compositor/WindowContainer.qml
@@ -57,16 +57,6 @@ Item {
console.log("visibility changed: " + visible);
}
- WaylandSurfaceItem {
- id: surfaceItem
- anchors.fill: parent
- touchEventsEnabled: true
-
- onSurfaceDestroyed: {
- destroyAnimation.start();
- }
- }
-
opacity: 0
property real targetX
@@ -75,7 +65,7 @@ Item {
property real targetHeight
property real targetScale
- property variant child: surfaceItem
+ property variant child: null
property variant chrome: null
property bool animationsEnabled: false
property bool isFullscreen: state === "fullscreen"
@@ -116,7 +106,7 @@ Item {
ContrastEffect {
id: effect
source: child
- anchors.fill: child
+ anchors.fill: parent
blend: { if (child && chrome && (chrome.selected || child.focus)) 0.0; else 0.6 }
opacity: 1.0
z: 1
@@ -188,9 +178,15 @@ Item {
}
Connections {
- target: container.child.surface
+ target: container.child ? container.child.surface : null
onUnmapped: unmapAnimation.start()
}
+ Connections {
+ target: container.child
+ onSurfaceDestroyed: {
+ destroyAnimation.start();
+ }
+ }
Image {
source: "closebutton.png"
diff --git a/examples/qml-compositor/main.cpp b/examples/qml-compositor/main.cpp
index dbabc9d04..91bc6677f 100644
--- a/examples/qml-compositor/main.cpp
+++ b/examples/qml-compositor/main.cpp
@@ -41,6 +41,8 @@
#include "qwaylandquickcompositor.h"
#include "qwaylandquicksurface.h"
+#include <QtCompositor/qwaylandsurfaceitem.h>
+
#include <QGuiApplication>
#include <QTimer>
#include <QPainter>
@@ -74,6 +76,11 @@ public:
return m_fullscreenSurface;
}
+ Q_INVOKABLE QWaylandSurfaceItem *item(QWaylandSurface *surf)
+ {
+ return static_cast<QWaylandSurfaceItem *>(surf->views().first());
+ }
+
signals:
void windowAdded(QVariant window);
void windowDestroyed(QVariant window);
diff --git a/examples/qml-compositor/main.qml b/examples/qml-compositor/main.qml
index 120c92bdb..9fafccb86 100644
--- a/examples/qml-compositor/main.qml
+++ b/examples/qml-compositor/main.qml
@@ -87,7 +87,9 @@ Item {
var windowContainer = windowContainerComponent.createObject(root);
console.log(windowContainerComponent.errorString());
- windowContainer.child.surface = window;
+ windowContainer.child = compositor.item(window);
+ windowContainer.child.parent = windowContainer;
+ windowContainer.child.touchEventsEnabled = true;
windowContainer.targetWidth = window.size.width;
windowContainer.targetHeight = window.size.height;
diff --git a/examples/qwindow-compositor/qwindowcompositor.cpp b/examples/qwindow-compositor/qwindowcompositor.cpp
index b485064f1..925e3214f 100644
--- a/examples/qwindow-compositor/qwindowcompositor.cpp
+++ b/examples/qwindow-compositor/qwindowcompositor.cpp
@@ -53,6 +53,7 @@
#include <QtCompositor/qwaylandinput.h>
#include <QtCompositor/qwaylandbufferref.h>
+#include <QtCompositor/qwaylandsurfaceview.h>
static GLuint textureFromImage(const QImage &image)
{
@@ -187,7 +188,8 @@ void QWindowCompositor::surfaceMapped()
py = 1 + (qrand() % (m_window->height() - surface->size().height() - 2));
}
pos = QPoint(px, py);
- surface->setPos(pos);
+ QWaylandSurfaceView *view = surface->views().first();
+ view->setPos(pos);
} else {
m_surfaces.removeOne(surface);
}
@@ -232,7 +234,6 @@ void QWindowCompositor::surfaceCreated(QWaylandSurface *surface)
connect(surface, SIGNAL(unmapped()), this, SLOT(surfaceUnmapped()));
connect(surface, SIGNAL(redraw()), this, SLOT(surfaceCommitted()));
connect(surface, SIGNAL(extendedSurfaceReady()), this, SLOT(sendExpose()));
- connect(surface, SIGNAL(posChanged()), this, SLOT(surfacePosChanged()));
m_renderScheduler.start(0);
surface->setBufferAttacher(new BufferAttacher);
@@ -262,9 +263,9 @@ void QWindowCompositor::updateCursor(bool hasBuffer)
}
}
-QPointF QWindowCompositor::toSurface(QWaylandSurface *surface, const QPointF &pos) const
+QPointF QWindowCompositor::toView(QWaylandSurfaceView *view, const QPointF &pos) const
{
- return pos - surface->pos();
+ return pos - view->pos();
}
void QWindowCompositor::setCursorSurface(QWaylandSurface *surface, int hotspotX, int hotspotY)
@@ -279,62 +280,22 @@ void QWindowCompositor::setCursorSurface(QWaylandSurface *surface, int hotspotX,
m_cursorSurface->setBufferAttacher(new BufferAttacher);
}
-QWaylandSurface *QWindowCompositor::surfaceAt(const QPointF &point, QPointF *local)
+QWaylandSurfaceView *QWindowCompositor::viewAt(const QPointF &point, QPointF *local)
{
for (int i = m_surfaces.size() - 1; i >= 0; --i) {
QWaylandSurface *surface = m_surfaces.at(i);
- QRectF geo(surface->pos(), surface->size());
- if (geo.contains(point)) {
- if (local)
- *local = toSurface(surface, point);
- return surface;
+ foreach (QWaylandSurfaceView *view, surface->views()) {
+ QRectF geo(view->pos(), surface->size());
+ if (geo.contains(point)) {
+ if (local)
+ *local = toView(view, point);
+ return view;
+ }
}
}
return 0;
}
-GLuint QWindowCompositor::composeSurface(QWaylandSurface *surface)
-{
- QSize windowSize = surface->size();
-
- QOpenGLFunctions *functions = QOpenGLContext::currentContext()->functions();
- functions->glBindFramebuffer(GL_FRAMEBUFFER, m_surface_fbo);
-
- GLuint texture = static_cast<BufferAttacher *>(surface->bufferAttacher())->texture;
-
- functions->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, texture, 0);
- paintChildren(surface, surface,windowSize);
- functions->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D,0, 0);
-
- functions->glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
-
- return texture;
-}
-
-void QWindowCompositor::paintChildren(QWaylandSurface *surface, QWaylandSurface *window, const QSize &windowSize) {
-
- if (surface->subSurfaces().size() == 0)
- return;
-
- QLinkedListIterator<QWaylandSurface *> i(surface->subSurfaces());
- while (i.hasNext()) {
- QWaylandSurface *subSurface = i.next();
- QPointF p = subSurface->mapTo(window,QPointF(0,0));
- QSize subSize = subSurface->size();
- if (subSize.isValid()) {
- GLuint texture = static_cast<BufferAttacher *>(subSurface->bufferAttacher())->texture;
- QRect geo(p.toPoint(),subSize);
- if (texture > 0)
- m_textureBlitter->drawTexture(texture,geo,windowSize,0,window->isYInverted(),subSurface->isYInverted());
- }
- paintChildren(subSurface,window,windowSize);
- }
-}
-
-
void QWindowCompositor::render()
{
m_window->makeCurrent();
@@ -355,9 +316,14 @@ void QWindowCompositor::render()
foreach (QWaylandSurface *surface, m_surfaces) {
if (!surface->visible())
continue;
- GLuint texture = composeSurface(surface);
- QRect geo(surface->pos().toPoint(),surface->size());
- m_textureBlitter->drawTexture(texture,geo,m_window->size(),0,false,surface->isYInverted());
+ GLuint texture = static_cast<BufferAttacher *>(surface->bufferAttacher())->texture;
+ foreach (QWaylandSurfaceView *view, surface->views()) {
+ QRect geo(view->pos().toPoint(),surface->size());
+ m_textureBlitter->drawTexture(texture,geo,m_window->size(),0,false,surface->isYInverted());
+ foreach (QWaylandSurface *child, surface->subSurfaces()) {
+ drawSubSurface(view->pos().toPoint(), child);
+ }
+ }
}
m_textureBlitter->release();
@@ -367,6 +333,18 @@ void QWindowCompositor::render()
m_window->swapBuffers();
}
+void QWindowCompositor::drawSubSurface(const QPoint &offset, QWaylandSurface *surface)
+{
+ GLuint texture = static_cast<BufferAttacher *>(surface->bufferAttacher())->texture;
+ QWaylandSurfaceView *view = surface->views().first();
+ QPoint pos = view->pos().toPoint() + offset;
+ QRect geo(pos, surface->size());
+ m_textureBlitter->drawTexture(texture, geo, m_window->size(), 0, false, surface->isYInverted());
+ foreach (QWaylandSurface *child, surface->subSurfaces()) {
+ drawSubSurface(pos, child);
+ }
+}
+
bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
{
if (obj != m_window)
@@ -394,15 +372,15 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
case QEvent::MouseButtonPress: {
QPointF local;
QMouseEvent *me = static_cast<QMouseEvent *>(event);
- QWaylandSurface *targetSurface = surfaceAt(me->localPos(), &local);
- if (m_dragKeyIsPressed && targetSurface) {
- m_draggingWindow = targetSurface;
+ QWaylandSurfaceView *target = viewAt(me->localPos(), &local);
+ if (m_dragKeyIsPressed && target) {
+ m_draggingWindow = target;
m_drag_diff = local;
} else {
- if (targetSurface && input->keyboardFocus() != targetSurface) {
- input->setKeyboardFocus(targetSurface);
- m_surfaces.removeOne(targetSurface);
- m_surfaces.append(targetSurface);
+ if (target && input->keyboardFocus() != target->surface()) {
+ input->setKeyboardFocus(target->surface());
+ m_surfaces.removeOne(target->surface());
+ m_surfaces.append(target->surface());
m_renderScheduler.start(0);
}
input->sendMousePressEvent(me->button(), local, me->localPos());
@@ -410,15 +388,15 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
return true;
}
case QEvent::MouseButtonRelease: {
- QWaylandSurface *targetSurface = input->mouseFocus();
+ QWaylandSurfaceView *target = input->mouseFocus();
if (m_draggingWindow) {
m_draggingWindow = 0;
m_drag_diff = QPointF();
} else {
QMouseEvent *me = static_cast<QMouseEvent *>(event);
QPointF localPos;
- if (targetSurface)
- localPos = toSurface(targetSurface, me->localPos());
+ if (target)
+ localPos = toView(target, me->localPos());
input->sendMouseReleaseEvent(me->button(), localPos, me->localPos());
}
return true;
@@ -430,8 +408,8 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
m_renderScheduler.start(0);
} else {
QPointF local;
- QWaylandSurface *targetSurface = surfaceAt(me->localPos(), &local);
- input->sendMouseMoveEvent(targetSurface, local, me->localPos());
+ QWaylandSurfaceView *target = viewAt(me->localPos(), &local);
+ input->sendMouseMoveEvent(target, local, me->localPos());
}
break;
}
@@ -466,16 +444,16 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
{
- QWaylandSurface *targetSurface = 0;
+ QWaylandSurfaceView *target = 0;
QTouchEvent *te = static_cast<QTouchEvent *>(event);
QList<QTouchEvent::TouchPoint> points = te->touchPoints();
QPoint pointPos;
if (!points.isEmpty()) {
pointPos = points.at(0).pos().toPoint();
- targetSurface = surfaceAt(pointPos);
+ target = viewAt(pointPos);
}
- if (targetSurface && targetSurface != input->mouseFocus())
- input->setMouseFocus(targetSurface, pointPos, pointPos);
+ if (target && target != input->mouseFocus())
+ input->setMouseFocus(target, pointPos, pointPos);
if (input->mouseFocus())
input->sendFullTouchEvent(te);
break;
diff --git a/examples/qwindow-compositor/qwindowcompositor.h b/examples/qwindow-compositor/qwindowcompositor.h
index c84bb9145..a366b8951 100644
--- a/examples/qwindow-compositor/qwindowcompositor.h
+++ b/examples/qwindow-compositor/qwindowcompositor.h
@@ -50,6 +50,8 @@
#include <QObject>
#include <QTimer>
+class QWaylandSurfaceView;
+
class QWindowCompositor : public QObject, public QWaylandCompositor
{
Q_OBJECT
@@ -69,14 +71,10 @@ protected:
void surfaceCommitted(QWaylandSurface *surface);
void surfaceCreated(QWaylandSurface *surface);
- QWaylandSurface* surfaceAt(const QPointF &point, QPointF *local = 0);
-
- GLuint composeSurface(QWaylandSurface *surface);
- void paintChildren(QWaylandSurface *surface, QWaylandSurface *window, const QSize &windowSize);
-
+ QWaylandSurfaceView* viewAt(const QPointF &point, QPointF *local = 0);
bool eventFilter(QObject *obj, QEvent *event);
- QPointF toSurface(QWaylandSurface *surface, const QPointF &pos) const;
+ QPointF toView(QWaylandSurfaceView *view, const QPointF &pos) const;
void setCursorSurface(QWaylandSurface *surface, int hotspotX, int hotspotY);
@@ -88,6 +86,8 @@ private slots:
void updateCursor(bool hasBuffer);
private:
+ void drawSubSurface(const QPoint &offset, QWaylandSurface *surface);
+
QOpenGLWindow *m_window;
QImage m_backgroundImage;
GLuint m_backgroundTexture;
@@ -97,7 +97,7 @@ private:
QTimer m_renderScheduler;
//Dragging windows around
- QWaylandSurface *m_draggingWindow;
+ QWaylandSurfaceView *m_draggingWindow;
bool m_dragKeyIsPressed;
QPointF m_drag_diff;
diff --git a/examples/server-buffer/compositor/main.cpp b/examples/server-buffer/compositor/main.cpp
index a30ea0895..77c3a1a08 100644
--- a/examples/server-buffer/compositor/main.cpp
+++ b/examples/server-buffer/compositor/main.cpp
@@ -40,6 +40,7 @@
#include "qwaylandquickcompositor.h"
#include "qwaylandsurface.h"
+#include "qwaylandsurfaceitem.h"
#include <QGuiApplication>
#include <QTimer>
@@ -88,6 +89,11 @@ public:
connect(this, SIGNAL(serverBuffersCreated()), this, SLOT(createServerBufferItems()));
}
+ Q_INVOKABLE QWaylandSurfaceItem *item(QWaylandSurface *surf)
+ {
+ return static_cast<QWaylandSurfaceItem *>(surf->views().first());
+ }
+
signals:
void windowAdded(QVariant window);
void windowDestroyed(QVariant window);
diff --git a/examples/server-buffer/compositor/qml/main.qml b/examples/server-buffer/compositor/qml/main.qml
index 1beddbf1d..c9d62be55 100644
--- a/examples/server-buffer/compositor/qml/main.qml
+++ b/examples/server-buffer/compositor/qml/main.qml
@@ -59,18 +59,10 @@ Item {
anchors.fill: parent
}
- Component {
- id: windowItem
- WaylandSurfaceItem {
- onSurfaceDestroyed: {
- destroy();
- }
- }
- }
-
function windowAdded(window) {
- var item = windowItem.createObject(root);
- item.surface = window;
+ var item = compositor.item(window);
+ item.parent = root;
+ item.surfaceDestroyed.connect(item.destroy);
}
function windowResized(window) {
diff --git a/src/compositor/compositor_api/compositor_api.pri b/src/compositor/compositor_api/compositor_api.pri
index 8e7fd3ace..bc7260d00 100644
--- a/src/compositor/compositor_api/compositor_api.pri
+++ b/src/compositor/compositor_api/compositor_api.pri
@@ -8,7 +8,8 @@ HEADERS += \
compositor_api/qwaylandinput.h \
compositor_api/qwaylandinputpanel.h \
compositor_api/qwaylanddrag.h \
- compositor_api/qwaylandbufferref.h
+ compositor_api/qwaylandbufferref.h \
+ compositor_api/qwaylandsurfaceview.h
SOURCES += \
compositor_api/qwaylandcompositor.cpp \
@@ -16,7 +17,8 @@ SOURCES += \
compositor_api/qwaylandinput.cpp \
compositor_api/qwaylandinputpanel.cpp \
compositor_api/qwaylanddrag.cpp \
- compositor_api/qwaylandbufferref.cpp
+ compositor_api/qwaylandbufferref.cpp \
+ compositor_api/qwaylandsurfaceview.cpp
QT += core-private
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp
index 2135a0e94..8225c4a56 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 "qwaylandsurfaceview.h"
#include "wayland_wrapper/qwlcompositor_p.h"
#include "wayland_wrapper/qwldatadevice_p.h"
@@ -149,17 +150,18 @@ void QWaylandCompositor::surfaceAboutToBeDestroyed(QWaylandSurface *surface)
Q_UNUSED(surface);
}
-QWaylandSurface *QWaylandCompositor::pickSurface(const QPointF &globalPosition) const
+QWaylandSurfaceView *QWaylandCompositor::pickView(const QPointF &globalPosition) const
{
Q_FOREACH (QtWayland::Surface *surface, m_compositor->surfaces()) {
- if (QRectF(surface->pos(), surface->size()).contains(globalPosition))
- return surface->waylandSurface();
+ foreach (QWaylandSurfaceView *view, surface->waylandSurface()->views())
+ if (QRectF(view->pos(), surface->size()).contains(globalPosition))
+ return view;
}
return 0;
}
-QPointF QWaylandCompositor::mapToSurface(QWaylandSurface *surface, const QPointF &globalPosition) const
+QPointF QWaylandCompositor::mapToView(QWaylandSurfaceView *surface, const QPointF &globalPosition) const
{
return globalPosition - surface->pos();
}
@@ -282,4 +284,9 @@ void QWaylandCompositor::configureTouchExtension(TouchExtensionFlags flags)
m_compositor->configureTouchExtension(flags);
}
+QWaylandSurfaceView *QWaylandCompositor::createView(QWaylandSurface *surface)
+{
+ return new QWaylandSurfaceView(surface);
+}
+
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandcompositor.h b/src/compositor/compositor_api/qwaylandcompositor.h
index 85f10b281..732d6821d 100644
--- a/src/compositor/compositor_api/qwaylandcompositor.h
+++ b/src/compositor/compositor_api/qwaylandcompositor.h
@@ -56,6 +56,7 @@ class QWaylandSurface;
class QWaylandInputDevice;
class QWaylandInputPanel;
class QWaylandDrag;
+class QWaylandSurfaceView;
namespace QtWayland
{
@@ -98,8 +99,8 @@ public:
virtual void surfaceCreated(QWaylandSurface *surface) = 0;
virtual void surfaceAboutToBeDestroyed(QWaylandSurface *surface);
- virtual QWaylandSurface *pickSurface(const QPointF &globalPosition) const;
- virtual QPointF mapToSurface(QWaylandSurface *surface, const QPointF &surfacePosition) const;
+ virtual QWaylandSurfaceView *pickView(const QPointF &globalPosition) const;
+ virtual QPointF mapToView(QWaylandSurfaceView *view, const QPointF &surfacePosition) const;
virtual void openUrl(WaylandClient *client, const QUrl &url);
@@ -140,6 +141,8 @@ public:
Q_DECLARE_FLAGS(TouchExtensionFlags, TouchExtensionFlag)
void configureTouchExtension(TouchExtensionFlags flags);
+ virtual QWaylandSurfaceView *createView(QWaylandSurface *surface);
+
protected:
QWaylandCompositor(QWindow *window, const char *socketName, QtWayland::Compositor *dptr);
virtual void retainedSelectionReceived(QMimeData *mimeData);
diff --git a/src/compositor/compositor_api/qwaylanddrag.cpp b/src/compositor/compositor_api/qwaylanddrag.cpp
index def763929..8916b0d71 100644
--- a/src/compositor/compositor_api/qwaylanddrag.cpp
+++ b/src/compositor/compositor_api/qwaylanddrag.cpp
@@ -46,6 +46,7 @@
#include "qwlinputdevice_p.h"
#include "qwldatadevice_p.h"
#include "qwlsurface_p.h"
+#include "qwaylandsurfaceview.h"
QT_BEGIN_NAMESPACE
@@ -66,7 +67,7 @@ QWaylandDrag::QWaylandDrag(QtWayland::InputDevice *inputDevice)
{
}
-QWaylandSurface *QWaylandDrag::icon() const
+QWaylandSurfaceView *QWaylandDrag::icon() const
{
Q_D(const QWaylandDrag);
@@ -74,7 +75,7 @@ QWaylandSurface *QWaylandDrag::icon() const
if (!dataDevice)
return 0;
- return dataDevice->dragIcon() ? dataDevice->dragIcon()->waylandSurface() : 0;
+ return dataDevice->dragIcon();
}
bool QWaylandDrag::visible() const
diff --git a/src/compositor/compositor_api/qwaylanddrag.h b/src/compositor/compositor_api/qwaylanddrag.h
index 888a48a92..329391bd8 100644
--- a/src/compositor/compositor_api/qwaylanddrag.h
+++ b/src/compositor/compositor_api/qwaylanddrag.h
@@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE
class QWaylandDragPrivate;
class QWaylandSurface;
+class QWaylandSurfaceView;
namespace QtWayland {
class InputDevice;
@@ -58,13 +59,13 @@ class Q_COMPOSITOR_EXPORT QWaylandDrag : public QObject
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandDrag)
- Q_PROPERTY(QWaylandSurface* icon READ icon NOTIFY iconChanged)
+ Q_PROPERTY(QWaylandSurfaceView* icon READ icon NOTIFY iconChanged)
Q_PROPERTY(bool visible READ visible NOTIFY iconChanged)
public:
explicit QWaylandDrag(QtWayland::InputDevice *inputDevice);
- QWaylandSurface *icon() const;
+ QWaylandSurfaceView *icon() const;
bool visible() const;
Q_SIGNALS:
diff --git a/src/compositor/compositor_api/qwaylandinput.cpp b/src/compositor/compositor_api/qwaylandinput.cpp
index 14c3221f7..de1df4965 100644
--- a/src/compositor/compositor_api/qwaylandinput.cpp
+++ b/src/compositor/compositor_api/qwaylandinput.cpp
@@ -45,6 +45,7 @@
#include "qwaylandcompositor.h"
#include "qwlsurface_p.h"
#include "qwlcompositor_p.h"
+#include "qwaylandsurfaceview.h"
QT_BEGIN_NAMESPACE
@@ -87,10 +88,9 @@ void QWaylandInputDevice::sendMouseMoveEvent(const QPointF &localPos, const QPoi
/** Convenience function that will set the mouse focus to the surface, then send the mouse move event.
* If the mouse focus is the same surface as the surface passed in, then only the move event is sent
**/
-void QWaylandInputDevice::sendMouseMoveEvent(QWaylandSurface *surface, const QPointF &localPos, const QPointF &globalPos)
+void QWaylandInputDevice::sendMouseMoveEvent(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos)
{
- QtWayland::Surface *wlsurface = surface? surface->handle():0;
- d->sendMouseMoveEvent(wlsurface,localPos,globalPos);
+ d->sendMouseMoveEvent(surface,localPos,globalPos);
}
void QWaylandInputDevice::sendMouseWheelEvent(Qt::Orientation orientation, int delta)
@@ -158,18 +158,14 @@ void QWaylandInputDevice::setKeymap(const QWaylandKeymap &keymap)
handle()->keyboardDevice()->setKeymap(keymap);
}
-QWaylandSurface *QWaylandInputDevice::mouseFocus() const
+QWaylandSurfaceView *QWaylandInputDevice::mouseFocus() const
{
- QtWayland::Surface *wlsurface = d->mouseFocus();
- if (wlsurface)
- return wlsurface->waylandSurface();
- return 0;
+ return d->mouseFocus();
}
-void QWaylandInputDevice::setMouseFocus(QWaylandSurface *surface, const QPointF &localPos, const QPointF &globalPos)
+void QWaylandInputDevice::setMouseFocus(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos)
{
- QtWayland::Surface *wlsurface = surface?surface->handle():0;
- d->setMouseFocus(wlsurface,localPos,globalPos);
+ d->setMouseFocus(surface,localPos,globalPos);
}
QWaylandCompositor *QWaylandInputDevice::compositor() const
diff --git a/src/compositor/compositor_api/qwaylandinput.h b/src/compositor/compositor_api/qwaylandinput.h
index 92255518a..2b42690a5 100644
--- a/src/compositor/compositor_api/qwaylandinput.h
+++ b/src/compositor/compositor_api/qwaylandinput.h
@@ -51,6 +51,7 @@ class QWaylandCompositor;
class QWaylandSurface;
class QKeyEvent;
class QTouchEvent;
+class QWaylandSurfaceView;
QT_BEGIN_NAMESPACE
@@ -87,7 +88,7 @@ public:
void sendMousePressEvent(Qt::MouseButton button, const QPointF &localPos, const QPointF &globalPos = QPointF());
void sendMouseReleaseEvent(Qt::MouseButton button, const QPointF &localPos, const QPointF &globalPos = QPointF());
void sendMouseMoveEvent(const QPointF &localPos, const QPointF &globalPos = QPointF());
- void sendMouseMoveEvent(QWaylandSurface *surface , const QPointF &localPos, const QPointF &globalPos = QPointF());
+ void sendMouseMoveEvent(QWaylandSurfaceView *surface , const QPointF &localPos, const QPointF &globalPos = QPointF());
void sendMouseWheelEvent(Qt::Orientation orientation, int delta);
void sendKeyPressEvent(uint code);
@@ -106,8 +107,8 @@ public:
bool setKeyboardFocus(QWaylandSurface *surface);
void setKeymap(const QWaylandKeymap &keymap);
- QWaylandSurface *mouseFocus() const;
- void setMouseFocus(QWaylandSurface *surface, const QPointF &local_pos, const QPointF &global_pos = QPointF());
+ QWaylandSurfaceView *mouseFocus() const;
+ void setMouseFocus(QWaylandSurfaceView *surface, const QPointF &local_pos, const QPointF &global_pos = QPointF());
QWaylandCompositor *compositor() const;
QtWayland::InputDevice *handle() const;
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.cpp b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
index bc475f1c5..8b3467c98 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
@@ -82,7 +82,7 @@ QWaylandQuickCompositor::QWaylandQuickCompositor(QQuickWindow *window, const cha
{
window->connect(window, &QQuickWindow::beforeSynchronizing, d_ptr(), &QWaylandQuickCompositorPrivate::updateStarted, Qt::DirectConnection);
- qmlRegisterType<QWaylandSurfaceItem>("QtCompositor", 1, 0, "WaylandSurfaceItem");
+ 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"));
}
@@ -99,4 +99,9 @@ void QWaylandQuickCompositor::update()
}
}
+QWaylandSurfaceView *QWaylandQuickCompositor::createView(QWaylandSurface *surf)
+{
+ return new QWaylandSurfaceItem(static_cast<QWaylandQuickSurface *>(surf));
+}
+
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.h b/src/compositor/compositor_api/qwaylandquickcompositor.h
index c87585221..546dd469f 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.h
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.h
@@ -48,6 +48,7 @@ QT_BEGIN_NAMESPACE
class QQuickWindow;
class QWaylandQuickCompositorPrivate;
+class QWaylandSurfaceView;
class Q_COMPOSITOR_EXPORT QWaylandQuickCompositor : public QWaylandCompositor
{
@@ -56,6 +57,8 @@ public:
void update();
+ QWaylandSurfaceView *createView(QWaylandSurface *surf) Q_DECL_OVERRIDE;
+
private:
friend class QWaylandQuickCompositorPrivate;
QWaylandQuickCompositorPrivate *d_ptr();
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index 80b37e419..ed06425cf 100644
--- a/src/compositor/compositor_api/qwaylandsurface.cpp
+++ b/src/compositor/compositor_api/qwaylandsurface.cpp
@@ -134,18 +134,6 @@ bool QWaylandSurface::isMapped() const
return d->mapped();
}
-QPointF QWaylandSurface::pos() const
-{
- Q_D(const QWaylandSurface);
- return d->pos();
-}
-
-void QWaylandSurface::setPos(const QPointF &pos)
-{
- Q_D(QWaylandSurface);
- d->setPos(pos);
-}
-
QSize QWaylandSurface::size() const
{
Q_D(const QWaylandSurface);
@@ -221,26 +209,6 @@ void QWaylandSurface::setWindowProperty(const QString &name, const QVariant &val
d->extendedSurface()->setWindowProperty(name, value);
}
-QPointF QWaylandSurface::mapToParent(const QPointF &pos) const
-{
- return pos + this->pos();
-}
-
-QPointF QWaylandSurface::mapTo(QWaylandSurface *parent, const QPointF &pos) const
-{
- QPointF p = pos;
- if (parent) {
- const QWaylandSurface * surface = this;
- while (surface != parent) {
- Q_ASSERT_X(surface, "WaylandSurface::mapTo(WaylandSurface *parent, const QPoint &pos)",
- "parent must be in parent hierarchy");
- p = surface->mapToParent(p);
- surface = surface->parentSurface();
- }
- }
- return p;
-}
-
QWaylandCompositor *QWaylandSurface::compositor() const
{
Q_D(const QWaylandSurface);
@@ -251,7 +219,7 @@ QWaylandSurface *QWaylandSurface::transientParent() const
{
Q_D(const QWaylandSurface);
if (d->shellSurface() && d->shellSurface()->transientParent())
- return d->shellSurface()->transientParent()->surface()->waylandSurface();
+ return d->shellSurface()->transientParent()->waylandSurface();
return 0;
}
@@ -271,6 +239,13 @@ void QWaylandSurface::setVisibility(QWindow::Visibility visibility)
d->extendedSurface()->setVisibility(visibility);
}
+void QWaylandSurface::ping()
+{
+ Q_D(QWaylandSurface);
+ if (d->shellSurface())
+ d->shellSurface()->ping();
+}
+
void QWaylandSurface::sendOnScreenVisibilityChange(bool visible)
{
setVisibility(visible ? QWindow::AutomaticVisibility : QWindow::Hidden);
@@ -328,13 +303,6 @@ void QWaylandSurface::destroySurfaceByForce()
wl_resource_destroy(surface_resource);
}
-void QWaylandSurface::ping()
-{
- Q_D(QWaylandSurface);
- if (d->shellSurface())
- d->shellSurface()->ping();
-}
-
/*!
Updates the surface with the compositor's retained clipboard selection. While this
is done automatically when the surface receives keyboard focus, this function is
@@ -371,4 +339,10 @@ QWaylandBufferAttacher *QWaylandSurface::bufferAttacher() const
return d->m_attacher;
}
+QList<QWaylandSurfaceView *> QWaylandSurface::views() const
+{
+ Q_D(const QWaylandSurface);
+ return d->views;
+}
+
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h
index d5a30551c..1e835180a 100644
--- a/src/compositor/compositor_api/qwaylandsurface.h
+++ b/src/compositor/compositor_api/qwaylandsurface.h
@@ -56,6 +56,7 @@ class QTouchEvent;
class QWaylandSurfacePrivate;
class QWaylandCompositor;
class QWaylandBufferRef;
+class QWaylandSurfaceView;
namespace QtWayland {
class Surface;
@@ -79,7 +80,6 @@ class Q_COMPOSITOR_EXPORT QWaylandSurface : public QObject
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandSurface)
Q_PROPERTY(QSize size READ size NOTIFY sizeChanged)
- Q_PROPERTY(QPointF pos READ pos WRITE setPos NOTIFY posChanged)
Q_PROPERTY(QWaylandSurface::WindowFlags windowFlags READ windowFlags NOTIFY windowFlagsChanged)
Q_PROPERTY(QWaylandSurface::WindowType windowType READ windowType NOTIFY windowTypeChanged)
Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation NOTIFY contentOrientationChanged)
@@ -127,8 +127,6 @@ public:
bool visible() const;
bool isMapped() const;
- QPointF pos() const;
- void setPos(const QPointF &pos);
QSize size() const;
Q_INVOKABLE void requestSize(const QSize &size);
@@ -152,9 +150,6 @@ public:
QVariantMap windowProperties() const;
void setWindowProperty(const QString &name, const QVariant &value);
- QPointF mapToParent(const QPointF &) const;
- QPointF mapTo(QWaylandSurface *, const QPointF &) const;
-
QWaylandCompositor *compositor() const;
QString className() const;
@@ -175,6 +170,8 @@ public:
void setBufferAttacher(QWaylandBufferAttacher *attacher);
QWaylandBufferAttacher *bufferAttacher() const;
+ QList<QWaylandSurfaceView *> views() const;
+
public slots:
void updateSelection();
@@ -187,7 +184,6 @@ signals:
void damaged(const QRegion &rect);
void parentChanged(QWaylandSurface *newParent, QWaylandSurface *oldParent);
void sizeChanged();
- void posChanged();
void windowPropertyChanged(const QString &name, const QVariant &value);
void windowFlagsChanged(WindowFlags flags);
void windowTypeChanged(WindowType type);
@@ -204,6 +200,8 @@ signals:
void configure(bool hasBuffer);
void redraw();
+
+ friend class QWaylandSurfaceView;
};
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandsurface_p.h b/src/compositor/compositor_api/qwaylandsurface_p.h
index aff0a8758..e53b084c0 100644
--- a/src/compositor/compositor_api/qwaylandsurface_p.h
+++ b/src/compositor/compositor_api/qwaylandsurface_p.h
@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE
class QWaylandCompositor;
class QWaylandSurface;
+class QWaylandSurfaceView;
class Q_COMPOSITOR_EXPORT QWaylandSurfacePrivate : public QObjectPrivate, public QtWayland::Surface
{
@@ -59,6 +60,7 @@ public:
bool closing;
int refCount;
+ QList<QWaylandSurfaceView *> views;
friend class QWaylandSurface;
};
diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
index f000e7f8b..415c25e70 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
+++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
@@ -73,52 +73,25 @@ public:
QSGTexture *t;
};
-QWaylandSurfaceItem::QWaylandSurfaceItem(QQuickItem *parent)
+QWaylandSurfaceItem::QWaylandSurfaceItem(QWaylandQuickSurface *surface, QQuickItem *parent)
: QQuickItem(parent)
- , m_surface(0)
+ , QWaylandSurfaceView(surface)
, m_provider(0)
, m_paintEnabled(true)
, m_touchEventsEnabled(false)
, m_resizeSurfaceToItem(false)
, m_newTexture(false)
+
{
if (!mutex)
mutex = new QMutex;
- setFlag(ItemHasContents);
-}
+ setFlag(ItemHasContents);
-QWaylandSurfaceItem::QWaylandSurfaceItem(QWaylandQuickSurface *surface, QQuickItem *parent)
- : QQuickItem(parent)
- , m_surface(0)
- , m_provider(0)
- , m_paintEnabled(true)
- , m_touchEventsEnabled(false)
- , m_resizeSurfaceToItem(false)
-{
- init(surface);
-}
-
-void QWaylandSurfaceItem::init(QWaylandQuickSurface *surface)
-{
- if (m_surface)
- m_surface->destroy();
-
- if (!surface)
- return;
-
- m_surface = surface;
- surface->ref();
update();
- if (m_resizeSurfaceToItem) {
- updateSurfaceSize();
- } else {
- setWidth(surface->size().width());
- setHeight(surface->size().height());
- }
-
- updatePosition();
+ setWidth(surface->size().width());
+ setHeight(surface->size().height());
setSmooth(true);
@@ -133,12 +106,12 @@ void QWaylandSurfaceItem::init(QWaylandQuickSurface *surface)
connect(surface, &QWaylandSurface::surfaceDestroyed, this, &QWaylandSurfaceItem::surfaceDestroyed);
connect(surface, &QWaylandSurface::parentChanged, this, &QWaylandSurfaceItem::parentChanged);
connect(surface, &QWaylandSurface::sizeChanged, this, &QWaylandSurfaceItem::updateSize);
- connect(surface, &QWaylandSurface::posChanged, this, &QWaylandSurfaceItem::updatePosition);
connect(surface, &QWaylandSurface::configure, this, &QWaylandSurfaceItem::updateBuffer);
connect(surface, &QWaylandSurface::redraw, this, &QQuickItem::update);
connect(this, &QWaylandSurfaceItem::widthChanged, this, &QWaylandSurfaceItem::updateSurfaceSize);
connect(this, &QWaylandSurfaceItem::heightChanged, this, &QWaylandSurfaceItem::updateSurfaceSize);
+
m_yInverted = surface ? surface->isYInverted() : true;
emit yInvertedChanged();
}
@@ -146,21 +119,10 @@ void QWaylandSurfaceItem::init(QWaylandQuickSurface *surface)
QWaylandSurfaceItem::~QWaylandSurfaceItem()
{
QMutexLocker locker(mutex);
- if (m_surface)
- m_surface->destroy();
if (m_provider)
m_provider->deleteLater();
}
-void QWaylandSurfaceItem::setSurface(QWaylandQuickSurface *surface)
-{
- if (surface == m_surface)
- return;
-
- init(surface);
- emit surfaceChanged();
-}
-
bool QWaylandSurfaceItem::isYInverted() const
{
return m_yInverted;
@@ -175,65 +137,55 @@ QSGTextureProvider *QWaylandSurfaceItem::textureProvider() const
void QWaylandSurfaceItem::mousePressEvent(QMouseEvent *event)
{
- if (m_surface) {
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
- if (inputDevice->mouseFocus() != m_surface)
- inputDevice->setMouseFocus(m_surface, event->localPos(), event->windowPos());
- inputDevice->sendMousePressEvent(event->button(), event->localPos(), event->windowPos());
- }
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
+ if (inputDevice->mouseFocus() != this)
+ inputDevice->setMouseFocus(this, event->localPos(), event->windowPos());
+ inputDevice->sendMousePressEvent(event->button(), event->localPos(), event->windowPos());
}
void QWaylandSurfaceItem::mouseMoveEvent(QMouseEvent *event)
{
- if (m_surface){
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
- inputDevice->sendMouseMoveEvent(m_surface, event->localPos(), event->windowPos());
- }
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
+ inputDevice->sendMouseMoveEvent(this, event->localPos(), event->windowPos());
}
void QWaylandSurfaceItem::mouseReleaseEvent(QMouseEvent *event)
{
- if (m_surface){
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
- inputDevice->sendMouseReleaseEvent(event->button(), event->localPos(), event->windowPos());
- }
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
+ inputDevice->sendMouseReleaseEvent(event->button(), event->localPos(), event->windowPos());
}
void QWaylandSurfaceItem::wheelEvent(QWheelEvent *event)
{
- if (m_surface) {
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
- inputDevice->sendMouseWheelEvent(event->orientation(), event->delta());
- }
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
+ inputDevice->sendMouseWheelEvent(event->orientation(), event->delta());
}
void QWaylandSurfaceItem::keyPressEvent(QKeyEvent *event)
{
- if (m_surface && hasFocus()) {
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
- inputDevice->sendFullKeyEvent(event);
- }
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
+ inputDevice->sendFullKeyEvent(event);
}
void QWaylandSurfaceItem::keyReleaseEvent(QKeyEvent *event)
{
- if (m_surface && hasFocus()) {
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
+ if (surface() && hasFocus()) {
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
inputDevice->sendFullKeyEvent(event);
}
}
void QWaylandSurfaceItem::touchEvent(QTouchEvent *event)
{
- if (m_touchEventsEnabled && m_surface) {
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
+ if (m_touchEventsEnabled) {
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
event->accept();
- if (inputDevice->mouseFocus() != m_surface) {
+ if (inputDevice->mouseFocus() != this) {
QPoint pointPos;
QList<QTouchEvent::TouchPoint> points = event->touchPoints();
if (!points.isEmpty())
pointPos = points.at(0).pos().toPoint();
- inputDevice->setMouseFocus(m_surface, pointPos, pointPos);
+ inputDevice->setMouseFocus(this, pointPos, pointPos);
}
inputDevice->sendFullTouchEvent(event);
} else {
@@ -245,10 +197,8 @@ void QWaylandSurfaceItem::takeFocus()
{
setFocus(true);
- if (m_surface) {
- QWaylandInputDevice *inputDevice = m_surface->compositor()->defaultInputDevice();
- inputDevice->setKeyboardFocus(m_surface);
- }
+ QWaylandInputDevice *inputDevice = compositor()->defaultInputDevice();
+ inputDevice->setKeyboardFocus(surface());
}
void QWaylandSurfaceItem::surfaceMapped()
@@ -275,19 +225,24 @@ void QWaylandSurfaceItem::parentChanged(QWaylandSurface *newParent, QWaylandSurf
void QWaylandSurfaceItem::updateSize()
{
- setSize(m_surface->size());
+ setSize(surface()->size());
}
void QWaylandSurfaceItem::updateSurfaceSize()
{
if (m_resizeSurfaceToItem) {
- m_surface->requestSize(QSize(width(), height()));
+ surface()->requestSize(QSize(width(), height()));
}
}
-void QWaylandSurfaceItem::updatePosition()
+void QWaylandSurfaceItem::setPos(const QPointF &pos)
+{
+ setPosition(pos);
+}
+
+QPointF QWaylandSurfaceItem::pos() const
{
- setPosition(m_surface->pos());
+ return position();
}
/*!
@@ -323,19 +278,14 @@ void QWaylandSurfaceItem::updateBuffer(bool hasBuffer)
QSGNode *QWaylandSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
- if (!m_surface) {
- delete oldNode;
- return 0;
- }
-
if (!m_provider)
m_provider = new QWaylandSurfaceTextureProvider();
// Order here is important, as the state of visible is that of the pending
// buffer but will be replaced after we advance the buffer queue.
- bool mapped = m_surface->isMapped();
+ bool mapped = surface()->isMapped();
if (mapped)
- m_provider->t = surface()->texture();
+ m_provider->t = static_cast<QWaylandQuickSurface *>(surface())->texture();
m_provider->smooth = smooth();
if (m_newTexture)
emit m_provider->textureChanged();
diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.h b/src/compositor/compositor_api/qwaylandsurfaceitem.h
index 1e6363305..abc3e6906 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceitem.h
+++ b/src/compositor/compositor_api/qwaylandsurfaceitem.h
@@ -48,6 +48,7 @@
#include <QtQuick/qsgtextureprovider.h>
+#include "qwaylandsurfaceview.h"
#include "qwaylandquicksurface.h"
QT_BEGIN_NAMESPACE
@@ -57,23 +58,19 @@ class QMutex;
Q_DECLARE_METATYPE(QWaylandQuickSurface*)
-class QWaylandSurfaceItem : public QQuickItem
+class QWaylandSurfaceItem : public QQuickItem, public QWaylandSurfaceView
{
Q_OBJECT
- Q_PROPERTY(QWaylandQuickSurface* surface READ surface WRITE setSurface NOTIFY surfaceChanged)
+ Q_PROPERTY(QWaylandSurface* surface READ surface CONSTANT)
Q_PROPERTY(bool paintEnabled READ paintEnabled WRITE setPaintEnabled)
Q_PROPERTY(bool touchEventsEnabled READ touchEventsEnabled WRITE setTouchEventsEnabled NOTIFY touchEventsEnabledChanged)
Q_PROPERTY(bool isYInverted READ isYInverted NOTIFY yInvertedChanged)
Q_PROPERTY(bool resizeSurfaceToItem READ resizeSurfaceToItem WRITE setResizeSurfaceToItem NOTIFY resizeSurfaceToItemChanged)
public:
- QWaylandSurfaceItem(QQuickItem *parent = 0);
QWaylandSurfaceItem(QWaylandQuickSurface *surface, QQuickItem *parent = 0);
~QWaylandSurfaceItem();
- void setSurface(QWaylandQuickSurface *surface);
- QWaylandQuickSurface *surface() const {return m_surface; }
-
Q_INVOKABLE bool isYInverted() const;
bool isTextureProvider() const { return true; }
@@ -86,6 +83,9 @@ public:
void setTouchEventsEnabled(bool enabled);
void setResizeSurfaceToItem(bool enabled);
+ void setPos(const QPointF &pos) Q_DECL_OVERRIDE;
+ QPointF pos() const Q_DECL_OVERRIDE;
+
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
@@ -107,13 +107,11 @@ private slots:
void parentChanged(QWaylandSurface *newParent, QWaylandSurface *oldParent);
void updateSize();
void updateSurfaceSize();
- void updatePosition();
void updateBuffer(bool hasBuffer);
signals:
void touchEventsEnabledChanged();
void yInvertedChanged();
- void surfaceChanged();
void resizeSurfaceToItemChanged();
void surfaceDestroyed();
@@ -127,7 +125,6 @@ private:
static QMutex *mutex;
- QWaylandQuickSurface *m_surface;
mutable QWaylandSurfaceTextureProvider *m_provider;
bool m_paintEnabled;
bool m_touchEventsEnabled;
diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.cpp b/src/compositor/compositor_api/qwaylandsurfaceview.cpp
new file mode 100644
index 000000000..60db20c9e
--- /dev/null
+++ b/src/compositor/compositor_api/qwaylandsurfaceview.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Jolla Ltd, author: <giulio.camuffo@jollamobile.com>
+** 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 "qwaylandsurfaceview.h"
+#include "qwaylandsurface.h"
+#include "qwaylandsurface_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandSurfaceViewPrivate
+{
+public:
+ QWaylandSurface *surface;
+ QPointF pos;
+};
+
+QWaylandSurfaceView::QWaylandSurfaceView(QWaylandSurface *surf)
+ : d(new QWaylandSurfaceViewPrivate)
+{
+ d->surface = surf;
+ surf->d_func()->views << this;
+ surf->ref();
+}
+
+QWaylandSurfaceView::~QWaylandSurfaceView()
+{
+ d->surface->destroy();
+ delete d;
+}
+
+QWaylandSurface *QWaylandSurfaceView::surface() const
+{
+ return d->surface;
+}
+
+QWaylandCompositor *QWaylandSurfaceView::compositor() const
+{
+ return d->surface->compositor();
+}
+
+void QWaylandSurfaceView::setPos(const QPointF &pos)
+{
+ d->pos = pos;
+}
+
+QPointF QWaylandSurfaceView::pos() const
+{
+ return d->pos;
+}
+
+QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.h b/src/compositor/compositor_api/qwaylandsurfaceview.h
new file mode 100644
index 000000000..6b45b6954
--- /dev/null
+++ b/src/compositor/compositor_api/qwaylandsurfaceview.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Jolla Ltd, author: <giulio.camuffo@jollamobile.com>
+** 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 QWAYLANDSURFACEVIEW_H
+#define QWAYLANDSURFACEVIEW_H
+
+#include <QPointF>
+
+#include <QtCompositor/qwaylandexport.h>
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandSurface;
+class QWaylandCompositor;
+
+class Q_COMPOSITOR_EXPORT QWaylandSurfaceView
+{
+public:
+ QWaylandSurfaceView(QWaylandSurface *surface);
+ virtual ~QWaylandSurfaceView();
+
+ QWaylandCompositor *compositor() const;
+ QWaylandSurface *surface() const;
+
+ virtual void setPos(const QPointF &pos);
+ virtual QPointF pos() const;
+
+private:
+ class QWaylandSurfaceViewPrivate *const d;
+ friend class QWaylandSurfaceViewPrivate;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp
index a6ec62caa..68f47d8ab 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor.cpp
+++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp
@@ -58,6 +58,7 @@
#include "qwlregion_p.h"
#include "qwlpointer_p.h"
#include "qwltextinputmanager_p.h"
+#include "qwaylandsurfaceview.h"
#include <QWindow>
#include <QSocketNotifier>
@@ -169,6 +170,7 @@ void Compositor::init()
qRegisterMetaType<SurfaceBuffer*>("SurfaceBuffer*");
qRegisterMetaType<QWaylandSurface*>("WaylandSurface*");
+ qRegisterMetaType<QWaylandSurfaceView*>("WaylandSurfaceView*");
//initialize distancefieldglyphcache here
initializeHardwareIntegration();
@@ -416,17 +418,6 @@ QList<QtWayland::Surface *> Compositor::surfacesForClient(wl_client *client)
return ret;
}
-Surface *Compositor::pickSurface(const QPointF &globalPosition)
-{
- QWaylandSurface *surface = m_qt_compositor->pickSurface(globalPosition);
- return surface ? surface->handle() : 0;
-}
-
-QPointF Compositor::mapToSurface(Surface *surface, const QPointF &globalPosition)
-{
- return m_qt_compositor->mapToSurface(surface->waylandSurface(), globalPosition);
-}
-
void Compositor::configureTouchExtension(int flags)
{
if (m_touchExtension)
diff --git a/src/compositor/wayland_wrapper/qwlcompositor_p.h b/src/compositor/wayland_wrapper/qwlcompositor_p.h
index 835fa1fd8..1bef32008 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor_p.h
+++ b/src/compositor/wayland_wrapper/qwlcompositor_p.h
@@ -115,9 +115,6 @@ public:
QList<Surface*> surfacesForClient(wl_client* client);
QWaylandCompositor *waylandCompositor() const { return m_qt_compositor; }
- Surface *pickSurface(const QPointF &globalPosition);
- QPointF mapToSurface(Surface *surface, const QPointF &globalPosition);
-
struct wl_display *wl_display() const { return m_display->handle(); }
Display *display() const { return m_display; }
diff --git a/src/compositor/wayland_wrapper/qwldatadevice.cpp b/src/compositor/wayland_wrapper/qwldatadevice.cpp
index f7ba9c4e6..9003e03e2 100644
--- a/src/compositor/wayland_wrapper/qwldatadevice.cpp
+++ b/src/compositor/wayland_wrapper/qwldatadevice.cpp
@@ -51,6 +51,7 @@
#include "qwldatadevicemanager_p.h"
#include "qwaylanddrag.h"
+#include "qwaylandsurfaceview.h"
#include <QDebug>
@@ -87,7 +88,7 @@ void DataDevice::setFocus(QtWaylandServer::wl_keyboard::Resource *focusResource)
}
}
-void DataDevice::setDragFocus(Surface *focus, const QPointF &localPosition)
+void DataDevice::setDragFocus(QWaylandSurfaceView *focus, const QPointF &localPosition)
{
if (m_dragFocusResource) {
send_leave(m_dragFocusResource->handle);
@@ -98,10 +99,10 @@ void DataDevice::setDragFocus(Surface *focus, const QPointF &localPosition)
if (!focus)
return;
- if (!m_dragDataSource && m_dragClient != focus->resource()->client())
+ if (!m_dragDataSource && m_dragClient != focus->surface()->handle()->resource()->client())
return;
- Resource *resource = resourceMap().value(focus->resource()->client());
+ Resource *resource = resourceMap().value(focus->surface()->handle()->resource()->client());
if (!resource)
return;
@@ -113,7 +114,7 @@ void DataDevice::setDragFocus(Surface *focus, const QPointF &localPosition)
if (m_dragDataSource && !offer)
return;
- send_enter(resource->handle, serial, focus->resource()->handle,
+ send_enter(resource->handle, serial, focus->surface()->handle()->resource()->handle,
wl_fixed_from_double(localPosition.x()), wl_fixed_from_double(localPosition.y()),
offer->resource()->handle);
@@ -121,7 +122,7 @@ void DataDevice::setDragFocus(Surface *focus, const QPointF &localPosition)
m_dragFocusResource = resource;
}
-Surface *DataDevice::dragIcon() const
+QWaylandSurfaceView *DataDevice::dragIcon() const
{
return m_dragIcon;
}
@@ -134,10 +135,10 @@ void DataDevice::sourceDestroyed(DataSource *source)
void DataDevice::focus()
{
- Surface *focus = m_compositor->pickSurface(m_pointer->currentPosition());
+ QWaylandSurfaceView *focus = m_compositor->waylandCompositor()->pickView(m_pointer->currentPosition());
if (focus != m_dragFocus)
- setDragFocus(focus, m_compositor->mapToSurface(focus, m_pointer->currentPosition()));
+ setDragFocus(focus, m_compositor->waylandCompositor()->mapToView(focus, m_pointer->currentPosition()));
}
void DataDevice::motion(uint32_t time)
@@ -147,7 +148,7 @@ void DataDevice::motion(uint32_t time)
}
if (m_dragFocusResource && m_dragFocus) {
- const QPointF &surfacePoint = m_compositor->mapToSurface(m_dragFocus, m_pointer->currentPosition());
+ const QPointF &surfacePoint = m_compositor->waylandCompositor()->mapToView(m_dragFocus, m_pointer->currentPosition());
qDebug() << Q_FUNC_INFO << m_pointer->currentPosition() << surfacePoint;
send_motion(m_dragFocusResource->handle, time,
wl_fixed_from_double(surfacePoint.x()), wl_fixed_from_double(surfacePoint.y()));
@@ -180,12 +181,12 @@ void DataDevice::data_device_start_drag(Resource *resource, struct ::wl_resource
{
if (m_inputDevice->pointerDevice()->grabSerial() == serial) {
if (!m_inputDevice->pointerDevice()->buttonPressed() ||
- m_inputDevice->pointerDevice()->focusSurface() != Surface::fromResource(origin))
+ m_inputDevice->pointerDevice()->focusSurface()->surface()->handle() != Surface::fromResource(origin))
return;
m_dragClient = resource->client();
m_dragDataSource = source != 0 ? DataSource::fromResource(source) : 0;
- m_dragIcon = icon != 0 ? Surface::fromResource(icon) : 0;
+ m_dragIcon = icon != 0 ? m_compositor->waylandCompositor()->createView(Surface::fromResource(icon)->waylandSurface()) : 0;
Q_EMIT m_inputDevice->dragHandle()->iconChanged();
m_inputDevice->pointerDevice()->setFocus(0, QPointF());
diff --git a/src/compositor/wayland_wrapper/qwldatadevice_p.h b/src/compositor/wayland_wrapper/qwldatadevice_p.h
index fb4bbcdbd..520d231f4 100644
--- a/src/compositor/wayland_wrapper/qwldatadevice_p.h
+++ b/src/compositor/wayland_wrapper/qwldatadevice_p.h
@@ -46,6 +46,8 @@
QT_BEGIN_NAMESPACE
+class QWaylandSurfaceView;
+
namespace QtWayland {
class Compositor;
@@ -60,9 +62,9 @@ public:
void setFocus(QtWaylandServer::wl_keyboard::Resource *focusResource);
- void setDragFocus(Surface *focus, const QPointF &localPosition);
+ void setDragFocus(QWaylandSurfaceView *focus, const QPointF &localPosition);
- Surface *dragIcon() const;
+ QWaylandSurfaceView *dragIcon() const;
void sourceDestroyed(DataSource *source);
@@ -82,10 +84,10 @@ private:
struct ::wl_client *m_dragClient;
DataSource *m_dragDataSource;
- Surface *m_dragFocus;
+ QWaylandSurfaceView *m_dragFocus;
Resource *m_dragFocusResource;
- Surface *m_dragIcon;
+ QWaylandSurfaceView *m_dragIcon;
};
}
diff --git a/src/compositor/wayland_wrapper/qwlinputdevice.cpp b/src/compositor/wayland_wrapper/qwlinputdevice.cpp
index 0f3fce94f..bcfadbdcd 100644
--- a/src/compositor/wayland_wrapper/qwlinputdevice.cpp
+++ b/src/compositor/wayland_wrapper/qwlinputdevice.cpp
@@ -51,6 +51,7 @@
#include "qwlpointer_p.h"
#include "qwlkeyboard_p.h"
#include "qwltouch_p.h"
+#include "qwaylandsurfaceview.h"
#include <QtGui/QTouchEvent>
@@ -154,7 +155,7 @@ void InputDevice::sendMouseMoveEvent(const QPointF &localPos, const QPointF &glo
pointerDevice()->sendMouseMoveEvent(localPos, globalPos);
}
-void InputDevice::sendMouseMoveEvent(Surface *surface, const QPointF &localPos, const QPointF &globalPos)
+void InputDevice::sendMouseMoveEvent(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos)
{
setMouseFocus(surface,localPos,globalPos);
sendMouseMoveEvent(localPos,globalPos);
@@ -269,21 +270,21 @@ bool InputDevice::setKeyboardFocus(Surface *surface)
return true;
}
-Surface *InputDevice::mouseFocus() const
+QWaylandSurfaceView *InputDevice::mouseFocus() const
{
return m_pointer->focusSurface();
}
-void InputDevice::setMouseFocus(Surface *surface, const QPointF &localPos, const QPointF &globalPos)
+void InputDevice::setMouseFocus(QWaylandSurfaceView *view, const QPointF &localPos, const QPointF &globalPos)
{
- if (surface && surface->isDestroyed())
+ if (view && view->surface()->handle()->isDestroyed())
return;
- m_pointer->setMouseFocus(surface, localPos, globalPos);
+ m_pointer->setMouseFocus(view, localPos, globalPos);
// We have no separate touch focus management so make it match the pointer focus always.
// No wl_touch_set_focus() is available so set it manually.
- m_touch->setFocus(surface);
+ m_touch->setFocus(view);
}
void InputDevice::clientRequestedDataDevice(DataDeviceManager *, struct wl_client *client, uint32_t id)
diff --git a/src/compositor/wayland_wrapper/qwlinputdevice_p.h b/src/compositor/wayland_wrapper/qwlinputdevice_p.h
index 01f68c3f3..aff6e2bdb 100644
--- a/src/compositor/wayland_wrapper/qwlinputdevice_p.h
+++ b/src/compositor/wayland_wrapper/qwlinputdevice_p.h
@@ -61,6 +61,7 @@ class QKeyEvent;
class QTouchEvent;
class QWaylandInputDevice;
class QWaylandDrag;
+class QWaylandSurfaceView;
namespace QtWayland {
@@ -82,7 +83,7 @@ public:
void sendMousePressEvent(Qt::MouseButton button, const QPointF &localPos, const QPointF &globalPos = QPointF());
void sendMouseReleaseEvent(Qt::MouseButton button, const QPointF &localPos, const QPointF &globalPos = QPointF());
void sendMouseMoveEvent(const QPointF &localPos, const QPointF &globalPos = QPointF());
- void sendMouseMoveEvent(Surface *surface, const QPointF &localPos, const QPointF &globalPos = QPointF());
+ void sendMouseMoveEvent(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos = QPointF());
void sendMouseWheelEvent(Qt::Orientation orientation, int delta);
void sendTouchPointEvent(int id, double x, double y, Qt::TouchPointState state);
@@ -97,8 +98,8 @@ public:
Surface *keyboardFocus() const;
bool setKeyboardFocus(Surface *surface);
- Surface *mouseFocus() const;
- void setMouseFocus(Surface *surface, const QPointF &localPos, const QPointF &globalPos);
+ QWaylandSurfaceView *mouseFocus() const;
+ void setMouseFocus(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos);
void clientRequestedDataDevice(DataDeviceManager *dndSelection, struct wl_client *client, uint32_t id);
const DataDevice *dataDevice() const;
diff --git a/src/compositor/wayland_wrapper/qwlpointer.cpp b/src/compositor/wayland_wrapper/qwlpointer.cpp
index 60082e325..4c3cc3b41 100644
--- a/src/compositor/wayland_wrapper/qwlpointer.cpp
+++ b/src/compositor/wayland_wrapper/qwlpointer.cpp
@@ -46,6 +46,7 @@
#include "qwlkeyboard_p.h"
#include "qwlsurface_p.h"
#include "qwaylandcompositor.h"
+#include "qwaylandsurfaceview.h"
namespace QtWayland {
@@ -99,28 +100,28 @@ Pointer::Pointer(Compositor *compositor, InputDevice *seat)
connect(&m_focusDestroyListener, &WlListener::fired, this, &Pointer::focusDestroyed);
}
-void Pointer::setFocus(Surface *surface, const QPointF &position)
+void Pointer::setFocus(QWaylandSurfaceView *surface, const QPointF &position)
{
if (m_focusResource && m_focus != surface) {
uint32_t serial = wl_display_next_serial(m_compositor->wl_display());
- send_leave(m_focusResource->handle, serial, m_focus->resource()->handle);
+ send_leave(m_focusResource->handle, serial, m_focus->surface()->handle()->resource()->handle);
m_focusDestroyListener.reset();
}
- Resource *resource = surface ? resourceMap().value(surface->resource()->client()) : 0;
+ Resource *resource = surface ? resourceMap().value(surface->surface()->handle()->resource()->client()) : 0;
if (resource && (m_focus != surface || resource != m_focusResource)) {
uint32_t serial = wl_display_next_serial(m_compositor->wl_display());
Keyboard *keyboard = m_seat->keyboardDevice();
if (keyboard) {
- wl_keyboard::Resource *kr = keyboard->resourceMap().value(surface->resource()->client());
+ wl_keyboard::Resource *kr = keyboard->resourceMap().value(surface->surface()->handle()->resource()->client());
if (kr)
keyboard->sendKeyModifiers(kr, serial);
}
- send_enter(resource->handle, serial, surface->resource()->handle,
+ send_enter(resource->handle, serial, surface->surface()->handle()->resource()->handle,
wl_fixed_from_double(position.x()), wl_fixed_from_double(position.y()));
- m_focusDestroyListener.listenForDestruction(surface->resource()->handle);
+ m_focusDestroyListener.listenForDestruction(surface->surface()->handle()->resource()->handle);
}
m_focusResource = resource;
@@ -152,7 +153,7 @@ void Pointer::endGrab()
m_grab->focus();
}
-void Pointer::setCurrent(Surface *surface, const QPointF &point)
+void Pointer::setCurrent(QWaylandSurfaceView *surface, const QPointF &point)
{
m_current = surface;
m_currentPoint = point;
@@ -183,12 +184,12 @@ uint32_t Pointer::grabSerial() const
return m_grabSerial;
}
-Surface *Pointer::focusSurface() const
+QWaylandSurfaceView *Pointer::focusSurface() const
{
return m_focus;
}
-Surface *Pointer::current() const
+QWaylandSurfaceView *Pointer::current() const
{
return m_current;
}
@@ -214,7 +215,7 @@ void Pointer::pointer_destroy_resource(wl_pointer::Resource *resource)
m_focusResource = 0;
}
-void Pointer::setMouseFocus(Surface *surface, const QPointF &localPos, const QPointF &globalPos)
+void Pointer::setMouseFocus(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos)
{
m_position = globalPos;
diff --git a/src/compositor/wayland_wrapper/qwlpointer_p.h b/src/compositor/wayland_wrapper/qwlpointer_p.h
index e125ab323..f24b7c038 100644
--- a/src/compositor/wayland_wrapper/qwlpointer_p.h
+++ b/src/compositor/wayland_wrapper/qwlpointer_p.h
@@ -56,6 +56,8 @@
QT_BEGIN_NAMESPACE
+class QWaylandSurfaceView;
+
namespace QtWayland {
class Compositor;
@@ -79,7 +81,7 @@ class Q_COMPOSITOR_EXPORT Pointer : public QObject, public QtWaylandServer::wl_p
public:
Pointer(Compositor *compositor, InputDevice *seat);
- void setFocus(Surface *surface, const QPointF &position);
+ void setFocus(QWaylandSurfaceView *surface, const QPointF &position);
void startGrab(PointerGrabber *currentGrab);
void endGrab();
@@ -88,8 +90,8 @@ public:
uint32_t grabTime() const;
uint32_t grabSerial() const;
- void setCurrent(Surface *surface, const QPointF &point);
- void setMouseFocus(Surface *surface, const QPointF &localPos, const QPointF &globalPos);
+ void setCurrent(QWaylandSurfaceView *surface, const QPointF &point);
+ void setMouseFocus(QWaylandSurfaceView *surface, const QPointF &localPos, const QPointF &globalPos);
void sendButton(uint32_t time, Qt::MouseButton button, uint32_t state);
@@ -98,8 +100,8 @@ public:
void sendMouseMoveEvent(const QPointF &localPos, const QPointF &globalPos);
void sendMouseWheelEvent(Qt::Orientation orientation, int delta);
- Surface *focusSurface() const;
- Surface *current() const;
+ QWaylandSurfaceView *focusSurface() const;
+ QWaylandSurfaceView *current() const;
QPointF position() const;
QPointF currentPosition() const;
Resource *focusResource() const;
@@ -127,10 +129,10 @@ private:
QPointF m_position;
- Surface *m_focus;
+ QWaylandSurfaceView *m_focus;
Resource *m_focusResource;
- Surface *m_current;
+ QWaylandSurfaceView *m_current;
QPointF m_currentPoint;
int m_buttonCount;
diff --git a/src/compositor/wayland_wrapper/qwlqttouch.cpp b/src/compositor/wayland_wrapper/qwlqttouch.cpp
index 2b97bef72..335ee1489 100644
--- a/src/compositor/wayland_wrapper/qwlqttouch.cpp
+++ b/src/compositor/wayland_wrapper/qwlqttouch.cpp
@@ -40,6 +40,7 @@
#include "qwlqttouch_p.h"
#include "qwlsurface_p.h"
+#include "qwaylandsurfaceview.h"
#include <QTouchEvent>
#include <QWindow>
@@ -67,15 +68,15 @@ static inline int toFixed(qreal f)
return int(f * 10000);
}
-bool TouchExtensionGlobal::postTouchEvent(QTouchEvent *event, Surface *surface)
+bool TouchExtensionGlobal::postTouchEvent(QTouchEvent *event, QWaylandSurfaceView *view)
{
const QList<QTouchEvent::TouchPoint> points = event->touchPoints();
const int pointCount = points.count();
if (!pointCount)
return false;
- QPointF surfacePos = surface->pos();
- wl_client *surfaceClient = surface->resource()->client();
+ QPointF surfacePos = view->pos();
+ wl_client *surfaceClient = view->surface()->handle()->resource()->client();
uint32_t time = m_compositor->currentTimeMsecs();
const int rescount = m_resources.count();
diff --git a/src/compositor/wayland_wrapper/qwlqttouch_p.h b/src/compositor/wayland_wrapper/qwlqttouch_p.h
index f2729c995..720bc83e5 100644
--- a/src/compositor/wayland_wrapper/qwlqttouch_p.h
+++ b/src/compositor/wayland_wrapper/qwlqttouch_p.h
@@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE
class Compositor;
class Surface;
class QTouchEvent;
+class QWaylandSurfaceView;
namespace QtWayland {
@@ -59,7 +60,7 @@ public:
TouchExtensionGlobal(Compositor *compositor);
~TouchExtensionGlobal();
- bool postTouchEvent(QTouchEvent *event, Surface *surface);
+ bool postTouchEvent(QTouchEvent *event, QWaylandSurfaceView *view);
void setFlags(int flags) { m_flags = flags; }
diff --git a/src/compositor/wayland_wrapper/qwlshellsurface.cpp b/src/compositor/wayland_wrapper/qwlshellsurface.cpp
index ce8e84757..168799fd3 100644
--- a/src/compositor/wayland_wrapper/qwlshellsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlshellsurface.cpp
@@ -47,6 +47,8 @@
#include "qwlpointer_p.h"
#include "qwlextendedsurface_p.h"
+#include "qwaylandsurfaceview.h"
+
#include <QtCore/qglobal.h>
#include <QtCore/QDebug>
@@ -103,6 +105,7 @@ ShellSurface::ShellSurface(Shell *shell, wl_client *client, uint32_t id, Surface
, m_popupSerial()
{
surface->setShellSurface(this);
+ m_view = surface->compositor()->waylandCompositor()->createView(surface->waylandSurface());
connect(surface->waylandSurface(), &QWaylandSurface::configure, this, &ShellSurface::configure);
}
@@ -113,7 +116,7 @@ void ShellSurface::sendConfigure(uint32_t edges, int32_t width, int32_t height)
void ShellSurface::ping()
{
- uint32_t serial = wl_display_next_serial(m_surface->compositor()->wl_display());
+ uint32_t serial = wl_display_next_serial(m_view->surface()->compositor()->waylandDisplay());
m_pings.insert(serial);
send_ping(serial);
}
@@ -132,23 +135,14 @@ void ShellSurface::adjustPosInResize()
int bottomLeftX = m_resizeGrabber->point.x() + m_resizeGrabber->width;
int bottomLeftY = m_resizeGrabber->point.y() + m_resizeGrabber->height;
- qreal x = surface()->pos().x();
- qreal y = surface()->pos().y();
+ qreal x = m_view->pos().x();
+ qreal y = m_view->pos().y();
if (m_resizeGrabber->resize_edges & WL_SHELL_SURFACE_RESIZE_TOP)
- y = bottomLeftY - surface()->size().height();
+ y = bottomLeftY - m_view->surface()->size().height();
if (m_resizeGrabber->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT)
- x = bottomLeftX - surface()->size().width();
+ x = bottomLeftX - m_view->surface()->size().width();
QPointF newPos(x,y);
- surface()->setPos(newPos);
-}
-
-QPointF ShellSurface::adjustedPosToTransientParent() const
-{
- if (!m_transientParent ||
- (m_surface->subSurface() && m_surface->subSurface()->parent()))
- return m_surface->nonAdjustedPos();
-
- return m_transientParent->surface()->pos() + QPoint(m_xOffset,m_yOffset);
+ m_view->setPos(newPos);
}
void ShellSurface::resetResizeGrabber()
@@ -161,7 +155,7 @@ void ShellSurface::resetMoveGrabber()
m_moveGrabber = 0;
}
-ShellSurface *ShellSurface::transientParent() const
+Surface *ShellSurface::transientParent() const
{
return m_transientParent;
}
@@ -215,7 +209,7 @@ void ShellSurface::shell_surface_move(Resource *resource,
InputDevice *input_device = InputDevice::fromSeatResource(input_device_super);
Pointer *pointer = input_device->pointerDevice();
- m_moveGrabber = new ShellSurfaceMoveGrabber(this, pointer->position() - surface()->pos());
+ m_moveGrabber = new ShellSurfaceMoveGrabber(this, pointer->position() - m_view->pos());
pointer->startGrab(m_moveGrabber);
}
@@ -241,8 +235,8 @@ void ShellSurface::shell_surface_resize(Resource *resource,
m_resizeGrabber->point = pointer->position();
m_resizeGrabber->resize_edges = static_cast<wl_shell_surface_resize>(edges);
- m_resizeGrabber->width = surface()->size().width();
- m_resizeGrabber->height = surface()->size().height();
+ m_resizeGrabber->width = m_view->surface()->size().width();
+ m_resizeGrabber->height = m_view->surface()->size().height();
pointer->startGrab(m_resizeGrabber);
}
@@ -273,11 +267,11 @@ void ShellSurface::shell_surface_set_transient(Resource *resource,
Q_UNUSED(resource);
Q_UNUSED(flags);
Surface *parent_surface = Surface::fromResource(parent_surface_resource);
- m_transientParent = parent_surface->shellSurface();
+ m_transientParent = parent_surface;
m_xOffset = x;
m_yOffset = y;
if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE)
- surface()->setTransientInactive(true);
+ m_surface->setTransientInactive(true);
if (m_windowType != QWaylandSurface::Transient) {
m_windowType = QWaylandSurface::Transient;
@@ -314,7 +308,7 @@ void ShellSurface::shell_surface_set_popup(Resource *resource, wl_resource *inpu
m_popupGrabber = m_shell->getPopupGrabber(input);
m_popupSerial = serial;
- m_transientParent = Surface::fromResource(parent)->shellSurface();
+ m_transientParent = Surface::fromResource(parent);
m_popupLocation = QPointF(x, y);
if (m_windowType != QWaylandSurface::Popup) {
@@ -352,14 +346,14 @@ void ShellSurface::shell_surface_set_title(Resource *resource,
const QString &title)
{
Q_UNUSED(resource);
- surface()->setTitle(title);
+ m_surface->setTitle(title);
}
void ShellSurface::shell_surface_set_class(Resource *resource,
const QString &className)
{
Q_UNUSED(resource);
- surface()->setClassName(className);
+ m_surface->setClassName(className);
}
ShellSurfaceGrabber::ShellSurfaceGrabber(ShellSurface *shellSurface)
@@ -429,9 +423,12 @@ void ShellSurfaceMoveGrabber::motion(uint32_t time)
Q_UNUSED(time);
QPointF pos(m_pointer->position() - m_offset);
- shell_surface->surface()->setPos(pos);
- if (shell_surface->transientParent())
- shell_surface->setOffset(pos - shell_surface->transientParent()->surface()->pos());
+ shell_surface->m_view->setPos(pos);
+ if (shell_surface->m_transientParent) {
+ QWaylandSurfaceView *view = shell_surface->m_transientParent->waylandSurface()->views().first();
+ if (view)
+ shell_surface->setOffset(pos - view->pos());
+ }
}
@@ -498,7 +495,7 @@ void ShellSurfacePopupGrabber::removePopup(ShellSurface *surface)
void ShellSurfacePopupGrabber::focus()
{
- if (m_pointer->current() && m_pointer->current()->resource()->client() == m_client)
+ if (m_pointer->current() && m_pointer->current()->surface()->handle()->resource()->client() == m_client)
m_pointer->setFocus(m_pointer->current(), m_pointer->currentPosition());
else
m_pointer->setFocus(0, QPointF());
diff --git a/src/compositor/wayland_wrapper/qwlshellsurface_p.h b/src/compositor/wayland_wrapper/qwlshellsurface_p.h
index c9b21aba9..64a2dba70 100644
--- a/src/compositor/wayland_wrapper/qwlshellsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlshellsurface_p.h
@@ -54,6 +54,8 @@
QT_BEGIN_NAMESPACE
+class QWaylandSurfaceView;
+
namespace QtWayland {
class Compositor;
@@ -92,11 +94,10 @@ public:
Surface *surface() const;
void adjustPosInResize();
- QPointF adjustedPosToTransientParent() const;
void resetResizeGrabber();
void resetMoveGrabber();
- ShellSurface *transientParent() const;
+ Surface *transientParent() const;
void setOffset(const QPointF &offset);
QWaylandSurface::WindowType windowType() const;
@@ -107,12 +108,13 @@ public:
private:
Shell *m_shell;
Surface *m_surface;
+ QWaylandSurfaceView *m_view;
ShellSurfaceResizeGrabber *m_resizeGrabber;
ShellSurfaceMoveGrabber *m_moveGrabber;
ShellSurfacePopupGrabber *m_popupGrabber;
- ShellSurface *m_transientParent;
+ Surface *m_transientParent;
int32_t m_xOffset;
int32_t m_yOffset;
@@ -158,6 +160,8 @@ private:
const QString &title) Q_DECL_OVERRIDE;
void shell_surface_set_class(Resource *resource,
const QString &class_) Q_DECL_OVERRIDE;
+
+ friend class ShellSurfaceMoveGrabber;
};
class ShellSurfaceGrabber : public PointerGrabber
diff --git a/src/compositor/wayland_wrapper/qwlsubsurface.cpp b/src/compositor/wayland_wrapper/qwlsubsurface.cpp
index 82ecbcfe4..3c866a1d2 100644
--- a/src/compositor/wayland_wrapper/qwlsubsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsubsurface.cpp
@@ -42,6 +42,7 @@
#include "qwlcompositor_p.h"
#include "qwaylandsurface.h"
+#include "qwaylandsurfaceview.h"
QT_BEGIN_NAMESPACE
@@ -101,7 +102,8 @@ void SubSurface::setSubSurface(SubSurface *subSurface, int x, int y)
m_sub_surfaces.append(subSurface->m_surface->waylandSurface());
subSurface->setParent(this);
}
- subSurface->m_surface->setPos(QPointF(x,y));
+ foreach (QWaylandSurfaceView *view, subSurface->m_surface->waylandSurface()->views())
+ view->setPos(QPointF(x,y));
}
void SubSurface::removeSubSurface(SubSurface *subSurfaces)
diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp
index 5767bf20c..a0d159387 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 "qwlshellsurface_p.h"
+#include "qwaylandsurfaceview.h"
#include <QtCore/QDebug>
#include <QTouchEvent>
@@ -176,24 +177,6 @@ bool Surface::mapped() const
return m_buffer ? bool(m_buffer->waylandBufferHandle()) : false;
}
-QPointF Surface::pos() const
-{
- return m_shellSurface ? m_shellSurface->adjustedPosToTransientParent() : m_position;
-}
-
-QPointF Surface::nonAdjustedPos() const
-{
- return m_position;
-}
-
-void Surface::setPos(const QPointF &pos)
-{
- bool emitChange = pos != m_position;
- m_position = pos;
- if (emitChange)
- m_waylandSurface->posChanged();
-}
-
QSize Surface::size() const
{
return m_size;
@@ -205,9 +188,6 @@ void Surface::setSize(const QSize &size)
m_opaqueRegion = QRegion();
m_inputRegion = QRegion(QRect(QPoint(), size));
m_size = size;
- if (m_shellSurface) {
- m_shellSurface->adjustPosInResize();
- }
m_waylandSurface->sizeChanged();
}
}
@@ -317,7 +297,7 @@ void Surface::setBackBuffer(SurfaceBuffer *buffer)
InputDevice *inputDevice = m_compositor->defaultInputDevice();
if (inputDevice->keyboardFocus() == this)
inputDevice->setKeyboardFocus(0);
- if (inputDevice->mouseFocus() == this)
+ if (inputDevice->mouseFocus() && inputDevice->mouseFocus()->surface() == waylandSurface())
inputDevice->setMouseFocus(0, QPointF(), QPointF());
}
m_damage = QRegion();
diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h
index b88a78030..1d89695a4 100644
--- a/src/compositor/wayland_wrapper/qwlsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurface_p.h
@@ -88,10 +88,6 @@ public:
using QtWaylandServer::wl_surface::resource;
- QPointF pos() const;
- QPointF nonAdjustedPos() const;
- void setPos(const QPointF &pos);
-
QSize size() const;
void setSize(const QSize &size);
@@ -161,6 +157,7 @@ protected:
QRegion m_damage;
SurfaceBuffer *m_buffer;
+ ShellSurface *m_shellSurface;
QWaylandBufferRef m_bufferRef;
bool m_surfaceMapped;
QWaylandBufferAttacher *m_attacher;
@@ -180,7 +177,6 @@ protected:
ExtendedSurface *m_extendedSurface;
SubSurface *m_subSurface;
- ShellSurface *m_shellSurface;
InputPanelSurface *m_inputPanelSurface;
QRegion m_inputRegion;
@@ -188,7 +184,6 @@ protected:
QVector<SurfaceBuffer *> m_bufferPool;
- QPointF m_position;
QSize m_size;
QString m_className;
QString m_title;
@@ -198,6 +193,8 @@ protected:
void setBackBuffer(SurfaceBuffer *buffer);
SurfaceBuffer *createSurfaceBuffer(struct ::wl_resource *buffer);
+
+ friend QWaylandSurface;
};
}
diff --git a/src/compositor/wayland_wrapper/qwltouch.cpp b/src/compositor/wayland_wrapper/qwltouch.cpp
index d160bc4bf..8824cd09c 100644
--- a/src/compositor/wayland_wrapper/qwltouch.cpp
+++ b/src/compositor/wayland_wrapper/qwltouch.cpp
@@ -43,6 +43,7 @@
#include "qwlcompositor_p.h"
#include "qwlsurface_p.h"
+#include "qwaylandsurfaceview.h"
namespace QtWayland {
@@ -57,14 +58,14 @@ Touch::Touch(Compositor *compositor)
connect(&m_focusDestroyListener, &WlListener::fired, this, &Touch::focusDestroyed);
}
-void Touch::setFocus(Surface *surface)
+void Touch::setFocus(QWaylandSurfaceView *surface)
{
m_focusDestroyListener.reset();
if (surface)
- m_focusDestroyListener.listenForDestruction(surface->resource()->handle);
+ m_focusDestroyListener.listenForDestruction(surface->surface()->handle()->resource()->handle);
m_focus = surface;
- m_focusResource = surface ? resourceMap().value(surface->resource()->client()) : 0;
+ m_focusResource = surface ? resourceMap().value(surface->surface()->handle()->resource()->client()) : 0;
}
void Touch::startGrab(TouchGrabber *grab)
@@ -121,7 +122,7 @@ void Touch::down(uint32_t time, int touch_id, const QPointF &position)
uint32_t serial = wl_display_next_serial(m_compositor->wl_display());
- send_down(m_focusResource->handle, serial, time, m_focus->resource()->handle, touch_id,
+ send_down(m_focusResource->handle, serial, time, m_focus->surface()->handle()->resource()->handle, touch_id,
wl_fixed_from_double(position.x()), wl_fixed_from_double(position.y()));
}
diff --git a/src/compositor/wayland_wrapper/qwltouch_p.h b/src/compositor/wayland_wrapper/qwltouch_p.h
index fc6b4d0e3..a6404c36e 100644
--- a/src/compositor/wayland_wrapper/qwltouch_p.h
+++ b/src/compositor/wayland_wrapper/qwltouch_p.h
@@ -53,6 +53,8 @@
QT_BEGIN_NAMESPACE
+class QWaylandSurfaceView;
+
namespace QtWayland {
class Compositor;
@@ -81,7 +83,7 @@ class Q_COMPOSITOR_EXPORT Touch : public QObject, public QtWaylandServer::wl_tou
public:
explicit Touch(Compositor *compositor);
- void setFocus(Surface *surface);
+ void setFocus(QWaylandSurfaceView *surface);
void startGrab(TouchGrabber *grab);
void endGrab();
@@ -102,7 +104,7 @@ private:
Compositor *m_compositor;
- Surface *m_focus;
+ QWaylandSurfaceView *m_focus;
Resource *m_focusResource;
WlListener m_focusDestroyListener;