diff options
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; |