diff options
Diffstat (limited to 'src')
10 files changed, 58 insertions, 2 deletions
diff --git a/src/compositor/compositor_api/waylandcompositor.cpp b/src/compositor/compositor_api/waylandcompositor.cpp index b1388cbee..9196a5741 100644 --- a/src/compositor/compositor_api/waylandcompositor.cpp +++ b/src/compositor/compositor_api/waylandcompositor.cpp @@ -157,6 +157,11 @@ void WaylandCompositor::setOutputGeometry(const QRect &geometry) m_compositor->setOutputGeometry(geometry); } +QRect WaylandCompositor::outputGeometry() const +{ + return m_compositor->outputGeometry(); +} + WaylandInputDevice *WaylandCompositor::defaultInputDevice() const { return m_compositor->defaultInputDevice()->handle(); diff --git a/src/compositor/compositor_api/waylandcompositor.h b/src/compositor/compositor_api/waylandcompositor.h index 3cc255a8b..220726590 100644 --- a/src/compositor/compositor_api/waylandcompositor.h +++ b/src/compositor/compositor_api/waylandcompositor.h @@ -82,7 +82,9 @@ public: const char *socketName() const; void setScreenOrientation(Qt::ScreenOrientation orientation); + void setOutputGeometry(const QRect &outputGeometry); + QRect outputGeometry() const; WaylandInputDevice *defaultInputDevice() const; diff --git a/src/compositor/compositor_api/waylandsurface.cpp b/src/compositor/compositor_api/waylandsurface.cpp index e9be748cd..7effff050 100644 --- a/src/compositor/compositor_api/waylandsurface.cpp +++ b/src/compositor/compositor_api/waylandsurface.cpp @@ -47,8 +47,12 @@ #include "wayland_wrapper/wlsubsurface.h" #include "wayland_wrapper/wlcompositor.h" +#include "waylandcompositor.h" #include "waylandwindowmanagerintegration.h" +#include <QtGui/QGuiApplication> +#include <QtGui/QScreen> + #ifdef QT_COMPOSITOR_QUICK #include "waylandsurfaceitem.h" #endif @@ -80,7 +84,7 @@ public: WaylandSurface::WaylandSurface(Wayland::Surface *surface) : QObject(*new WaylandSurfacePrivate(surface)) { - + connect(this, SIGNAL(windowOrientationChanged()), this, SIGNAL(windowRotationChanged())); } WaylandSurface *WaylandSurface::parentSurface() const @@ -159,7 +163,23 @@ Qt::ScreenOrientation WaylandSurface::windowOrientation() const return d->surface->extendedSurface()->windowOrientation(); } +/*! + \property windowRotation + + Convenience property to get the rotation required to map the surface to the screen + based on its windowOrientation. + */ +int WaylandSurface::windowRotation() const +{ + QRect geometry = compositor()->outputGeometry(); + Qt::ScreenOrientation compositorOrientation = geometry.width() >= geometry.height() ? Qt::LandscapeOrientation : Qt::PortraitOrientation; + Qt::ScreenOrientation wOrientation = windowOrientation(); + if (wOrientation == Qt::PrimaryOrientation) + return 0; + + return QGuiApplication::primaryScreen()->angleBetween(wOrientation, compositorOrientation); +} WaylandSurface::WindowFlags WaylandSurface::windowFlags() const { diff --git a/src/compositor/compositor_api/waylandsurface.h b/src/compositor/compositor_api/waylandsurface.h index 834906611..40b87017e 100644 --- a/src/compositor/compositor_api/waylandsurface.h +++ b/src/compositor/compositor_api/waylandsurface.h @@ -73,6 +73,9 @@ class Q_COMPOSITOR_EXPORT WaylandSurface : public QObject Q_PROPERTY(QSize size READ size WRITE setSize NOTIFY sizeChanged) Q_PROPERTY(QPointF pos READ pos WRITE setPos NOTIFY posChanged) Q_PROPERTY(WaylandSurface::WindowFlags windowFlags READ windowFlags NOTIFY windowFlagsChanged) + Q_PROPERTY(Qt::ScreenOrientation windowOrientation READ windowOrientation NOTIFY windowOrientationChanged) + Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation NOTIFY contentOrientationChanged) + Q_PROPERTY(int windowRotation READ windowRotation NOTIFY windowRotationChanged) Q_ENUMS(WindowFlag) Q_FLAGS(WindowFlag WindowFlags) @@ -107,6 +110,7 @@ public: Qt::ScreenOrientation contentOrientation() const; Qt::ScreenOrientation windowOrientation() const; + int windowRotation() const; WindowFlags windowFlags() const; @@ -147,6 +151,9 @@ signals: void posChanged(); void windowPropertyChanged(const QString &name, const QVariant &value); void windowFlagsChanged(WindowFlags flags); + void windowOrientationChanged(); + void contentOrientationChanged(); + void windowRotationChanged(); friend class Wayland::Surface; friend class Wayland::SurfacePrivate; diff --git a/src/compositor/compositor_api/waylandsurfaceitem.cpp b/src/compositor/compositor_api/waylandsurfaceitem.cpp index a080f836f..9418b4297 100644 --- a/src/compositor/compositor_api/waylandsurfaceitem.cpp +++ b/src/compositor/compositor_api/waylandsurfaceitem.cpp @@ -47,6 +47,8 @@ #include "wlextendedsurface.h" #include <QtGui/QKeyEvent> +#include <QtGui/QGuiApplication> +#include <QtGui/QScreen> #include <QtQuick/QSGSimpleTextureNode> #include <QtQuick/QSGSimpleRectNode> @@ -130,7 +132,11 @@ WaylandSurfaceItem::~WaylandSurfaceItem() void WaylandSurfaceItem::setSurface(WaylandSurface *surface) { + if (surface == m_surface) + return; + init(surface); + emit surfaceChanged(); } bool WaylandSurfaceItem::isYInverted() const diff --git a/src/compositor/compositor_api/waylandsurfaceitem.h b/src/compositor/compositor_api/waylandsurfaceitem.h index 73697ae22..0114f127c 100644 --- a/src/compositor/compositor_api/waylandsurfaceitem.h +++ b/src/compositor/compositor_api/waylandsurfaceitem.h @@ -56,7 +56,7 @@ Q_DECLARE_METATYPE(WaylandSurface*) class Q_COMPOSITOR_EXPORT WaylandSurfaceItem : public QQuickItem { Q_OBJECT - Q_PROPERTY(WaylandSurface* surface READ surface WRITE setSurface) + Q_PROPERTY(WaylandSurface* surface READ surface WRITE setSurface NOTIFY surfaceChanged) Q_PROPERTY(bool paintEnabled READ paintEnabled WRITE setPaintEnabled) Q_PROPERTY(bool useTextureAlpha READ useTextureAlpha WRITE setUseTextureAlpha NOTIFY useTextureAlphaChanged) Q_PROPERTY(bool clientRenderingEnabled READ clientRenderingEnabled WRITE setClientRenderingEnabled NOTIFY clientRenderingEnabledChanged) @@ -114,6 +114,7 @@ signals: void clientRenderingEnabledChanged(); void touchEventsEnabledChanged(); void yInvertedChanged(); + void surfaceChanged(); protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *); diff --git a/src/compositor/wayland_wrapper/wlcompositor.cpp b/src/compositor/wayland_wrapper/wlcompositor.cpp index 545d14e3d..27378f19f 100644 --- a/src/compositor/wayland_wrapper/wlcompositor.cpp +++ b/src/compositor/wayland_wrapper/wlcompositor.cpp @@ -360,6 +360,11 @@ void Compositor::setOutputGeometry(const QRect &geometry) m_output_global.setGeometry(geometry); } +QRect Compositor::outputGeometry() const +{ + return m_output_global.geometry(); +} + InputDevice* Compositor::defaultInputDevice() { return m_default_input_device; diff --git a/src/compositor/wayland_wrapper/wlcompositor.h b/src/compositor/wayland_wrapper/wlcompositor.h index 03cd1db55..b2d4ef6e7 100644 --- a/src/compositor/wayland_wrapper/wlcompositor.h +++ b/src/compositor/wayland_wrapper/wlcompositor.h @@ -117,6 +117,7 @@ public: void setScreenOrientation(Qt::ScreenOrientation orientation); Qt::ScreenOrientation screenOrientation() const; void setOutputGeometry(const QRect &geometry); + QRect outputGeometry() const; void enableTouchExtension(); TouchExtensionGlobal *touchExtension() { return m_touchExtension; } diff --git a/src/compositor/wayland_wrapper/wlextendedsurface.cpp b/src/compositor/wayland_wrapper/wlextendedsurface.cpp index c5bde2580..e4dd6bf45 100644 --- a/src/compositor/wayland_wrapper/wlextendedsurface.cpp +++ b/src/compositor/wayland_wrapper/wlextendedsurface.cpp @@ -154,7 +154,11 @@ void ExtendedSurface::set_window_orientation(struct wl_client *client, { Q_UNUSED(client); ExtendedSurface *extended_surface = static_cast<ExtendedSurface *>(extended_surface_resource->data); + + Qt::ScreenOrientation oldOrientation = extended_surface->m_windowOrientation; extended_surface->m_windowOrientation = screenOrientationFromWaylandOrientation(orientation); + if (extended_surface->m_windowOrientation != oldOrientation) + emit extended_surface->m_surface->waylandSurface()->windowOrientationChanged(); } void ExtendedSurface::set_content_orientation(struct wl_client *client, @@ -163,7 +167,11 @@ void ExtendedSurface::set_content_orientation(struct wl_client *client, { Q_UNUSED(client); ExtendedSurface *extended_surface = static_cast<ExtendedSurface *>(extended_surface_resource->data); + + Qt::ScreenOrientation oldOrientation = extended_surface->m_contentOrientation; extended_surface->m_contentOrientation = screenOrientationFromWaylandOrientation(orientation); + if (extended_surface->m_windowOrientation != oldOrientation) + emit extended_surface->m_surface->waylandSurface()->contentOrientationChanged(); } void ExtendedSurface::setWindowFlags(WaylandSurface::WindowFlags flags) diff --git a/src/compositor/wayland_wrapper/wloutput.h b/src/compositor/wayland_wrapper/wloutput.h index f678547a2..b637d2d3f 100644 --- a/src/compositor/wayland_wrapper/wloutput.h +++ b/src/compositor/wayland_wrapper/wloutput.h @@ -57,6 +57,7 @@ public: OutputGlobal(); void setGeometry(const QRect &geometry); + QRect geometry() const { return m_geometry; } int x() const { return m_geometry.x(); } int y() const { return m_geometry.y(); } |