From 20f10e77329651204d6c1152f45f5555f0c3ccf4 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta <gunnar.sletta@nokia.com> Date: Fri, 10 Feb 2012 15:43:59 +0100 Subject: [PATCH] Added window flags to the surface-extension protocol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I1b53c5f0b0f908490dcd0ab30e46ab681f885954 Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com> --- extensions/surface-extension.xml | 10 ++++++++++ .../compositor_api/waylandcompositor.cpp | 2 ++ .../compositor_api/waylandsurface.cpp | 9 +++++++++ src/compositor/compositor_api/waylandsurface.h | 16 +++++++++++++++- .../wayland_wrapper/wlextendedsurface.cpp | 18 +++++++++++++++++- .../wayland_wrapper/wlextendedsurface.h | 9 +++++++++ src/compositor/wayland_wrapper/wlsurface.cpp | 6 ++++++ src/compositor/wayland_wrapper/wlsurface.h | 2 ++ .../wayland/qwaylandextendedsurface.cpp | 14 ++++++++++++++ .../wayland/qwaylandextendedsurface.h | 2 ++ .../platforms/wayland/qwaylandwindow.cpp | 5 +++++ src/plugins/platforms/wayland/qwaylandwindow.h | 2 ++ 12 files changed, 93 insertions(+), 2 deletions(-) diff --git a/extensions/surface-extension.xml b/extensions/surface-extension.xml index 38c6590c..dbbb8511 100644 --- a/extensions/surface-extension.xml +++ b/extensions/surface-extension.xml @@ -75,5 +75,15 @@ <request name="set_content_orientation"> <arg name="orientation" type="int"/> </request> + + <enum name="windowflag"> + <entry name="OverridesSystemGestures" value="1"/> + <entry name="StaysOnTop" value="2"/> + </enum> + + <request name="set_window_flags"> + <arg name="flags" type="int"/> + </request> + </interface> </protocol> diff --git a/src/compositor/compositor_api/waylandcompositor.cpp b/src/compositor/compositor_api/waylandcompositor.cpp index c86698bd..03c0b814 100644 --- a/src/compositor/compositor_api/waylandcompositor.cpp +++ b/src/compositor/compositor_api/waylandcompositor.cpp @@ -68,6 +68,8 @@ WaylandCompositor::WaylandCompositor(QWindow *window, const char *socketName) m_compositor = new Wayland::Compositor(this); #ifdef QT_COMPOSITOR_QUICK qmlRegisterType<WaylandSurfaceItem>("WaylandCompositor", 1, 0, "WaylandSurfaceItem"); + qmlRegisterType<WaylandSurface>("WaylandCompositor", 1, 0, "WaylandSurface"); +#else qRegisterMetaType<WaylandSurface*>("WaylandSurface*"); #endif m_compositor->initializeHardwareIntegration(); diff --git a/src/compositor/compositor_api/waylandsurface.cpp b/src/compositor/compositor_api/waylandsurface.cpp index 786c1f4b..596dee8b 100644 --- a/src/compositor/compositor_api/waylandsurface.cpp +++ b/src/compositor/compositor_api/waylandsurface.cpp @@ -153,6 +153,15 @@ Qt::ScreenOrientation WaylandSurface::windowOrientation() const return d->surface->windowOrientation(); } + + +WaylandSurface::WindowFlags WaylandSurface::windowFlags() const +{ + Q_D(const WaylandSurface); + return d->surface->windowFlags(); +} + + QImage WaylandSurface::image() const { Q_D(const WaylandSurface); diff --git a/src/compositor/compositor_api/waylandsurface.h b/src/compositor/compositor_api/waylandsurface.h index debf6fe7..e371237a 100644 --- a/src/compositor/compositor_api/waylandsurface.h +++ b/src/compositor/compositor_api/waylandsurface.h @@ -72,14 +72,25 @@ class Q_COMPOSITOR_EXPORT WaylandSurface : public QObject Q_DECLARE_PRIVATE(WaylandSurface) 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_ENUMS(WindowFlag) + Q_FLAGS(WindowFlag WindowFlags) + public: + enum WindowFlag { + OverridesSystemGestures = 0x0001, + StaysOnTop = 0x0002 + }; + Q_DECLARE_FLAGS(WindowFlags, WindowFlag) + enum Type { Invalid, Shm, Texture }; - WaylandSurface(Wayland::Surface *surface); + WaylandSurface(Wayland::Surface *surface = 0); WaylandSurface *parentSurface() const; QLinkedList<WaylandSurface *> subSurfaces() const; @@ -97,6 +108,8 @@ public: Qt::ScreenOrientation contentOrientation() const; Qt::ScreenOrientation windowOrientation() const; + WindowFlags windowFlags() const; + QImage image() const; #ifdef QT_COMPOSITOR_WAYLAND_GL GLuint texture(QOpenGLContext *context) const; @@ -133,6 +146,7 @@ signals: void sizeChanged(); void posChanged(); void windowPropertyChanged(const QString &name, const QVariant &value); + void windowFlagsChanged(WindowFlags flags); friend class Wayland::Surface; friend class Wayland::SurfacePrivate; diff --git a/src/compositor/wayland_wrapper/wlextendedsurface.cpp b/src/compositor/wayland_wrapper/wlextendedsurface.cpp index 38e4dff4..a386b596 100644 --- a/src/compositor/wayland_wrapper/wlextendedsurface.cpp +++ b/src/compositor/wayland_wrapper/wlextendedsurface.cpp @@ -79,6 +79,7 @@ ExtendedSurface::ExtendedSurface(struct wl_client *client, uint32_t id, Surface : m_surface(surface) , m_windowOrientation(Qt::PrimaryOrientation) , m_contentOrientation(Qt::PrimaryOrientation) + , m_windowFlags(0) { Q_ASSERT(surface->extendedSurface() == 0); surface->setExtendedSurface(this); @@ -165,10 +166,25 @@ void ExtendedSurface::set_content_orientation(struct wl_client *client, extended_surface->m_contentOrientation = screenOrientationFromWaylandOrientation(orientation); } +void ExtendedSurface::setWindowFlags(WaylandSurface::WindowFlags flags) +{ + if (flags == m_windowFlags) + return; + m_windowFlags = flags; + emit m_surface->handle()->windowFlagsChanged(flags); +} + +void ExtendedSurface::set_window_flags(wl_client *client, wl_resource *resource, int32_t flags) +{ + ExtendedSurface *extended_surface = static_cast<ExtendedSurface *>(resource->data); + extended_surface->setWindowFlags(WaylandSurface::WindowFlags(flags)); +} + const struct wl_extended_surface_interface ExtendedSurface::extended_surface_interface = { ExtendedSurface::update_generic_property, ExtendedSurface::set_window_orientation, - ExtendedSurface::set_content_orientation + ExtendedSurface::set_content_orientation, + ExtendedSurface::set_window_flags }; } diff --git a/src/compositor/wayland_wrapper/wlextendedsurface.h b/src/compositor/wayland_wrapper/wlextendedsurface.h index 5cbabe60..cd274894 100644 --- a/src/compositor/wayland_wrapper/wlextendedsurface.h +++ b/src/compositor/wayland_wrapper/wlextendedsurface.h @@ -90,6 +90,9 @@ public: Qt::ScreenOrientation windowOrientation() const; Qt::ScreenOrientation contentOrientation() const; + void setWindowFlags(WaylandSurface::WindowFlags flags); + WaylandSurface::WindowFlags windowFlags() const { return m_windowFlags; } + private: struct wl_resource *m_extended_surface_resource; Surface *m_surface; @@ -97,6 +100,8 @@ private: Qt::ScreenOrientation m_windowOrientation; Qt::ScreenOrientation m_contentOrientation; + WaylandSurface::WindowFlags m_windowFlags; + static void update_generic_property(struct wl_client *client, struct wl_resource *resource, const char *name, @@ -110,6 +115,10 @@ private: struct wl_resource *resource, int32_t orientation); + static void set_window_flags(struct wl_client *client, + struct wl_resource *resource, + int32_t flags); + static const struct wl_extended_surface_interface extended_surface_interface; }; diff --git a/src/compositor/wayland_wrapper/wlsurface.cpp b/src/compositor/wayland_wrapper/wlsurface.cpp index be2eb14b..223a350c 100644 --- a/src/compositor/wayland_wrapper/wlsurface.cpp +++ b/src/compositor/wayland_wrapper/wlsurface.cpp @@ -623,6 +623,12 @@ Qt::ScreenOrientation Surface::contentOrientation() const return d->extendedSurface ? d->extendedSurface->contentOrientation() : Qt::PrimaryOrientation; } +WaylandSurface::WindowFlags Surface::windowFlags() const +{ + Q_D(const Surface); + return d->extendedSurface ? d->extendedSurface->windowFlags() : WaylandSurface::WindowFlags(0); +} + QPoint Surface::lastMousePos() const { Q_D(const Surface); diff --git a/src/compositor/wayland_wrapper/wlsurface.h b/src/compositor/wayland_wrapper/wlsurface.h index b34d7c8c..ecb4b5fe 100644 --- a/src/compositor/wayland_wrapper/wlsurface.h +++ b/src/compositor/wayland_wrapper/wlsurface.h @@ -117,6 +117,8 @@ public: Qt::ScreenOrientation contentOrientation() const; Qt::ScreenOrientation windowOrientation() const; + WaylandSurface::WindowFlags windowFlags() const; + QPoint lastMousePos() const; void setExtendedSurface(ExtendedSurface *extendedSurface); diff --git a/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp b/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp index 58dfac4b..41ccdec9 100644 --- a/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp @@ -162,6 +162,20 @@ void QWaylandExtendedSurface::set_generic_property(void *data, wl_extended_surfa nativeInterface->emitWindowPropertyChanged(extended_window->m_window,QString::fromLatin1(name)); } +Qt::WindowFlags QWaylandExtendedSurface::setWindowFlags(Qt::WindowFlags flags) +{ + uint wlFlags = 0; + if (flags & Qt::WindowStaysOnTopHint) wlFlags |= WL_EXTENDED_SURFACE_WINDOWFLAG_STAYSONTOP; + if (flags & Qt::WindowOverridesSystemGestures) wlFlags |= WL_EXTENDED_SURFACE_WINDOWFLAG_OVERRIDESSYSTEMGESTURES; + + wl_extended_surface_set_window_flags(m_extended_surface, wlFlags); + + return flags & ( + Qt::WindowStaysOnTopHint + | Qt::WindowOverridesSystemGestures + ); +} + const struct wl_extended_surface_listener QWaylandExtendedSurface::extended_surface_listener = { QWaylandExtendedSurface::onscreen_visibility, QWaylandExtendedSurface::set_generic_property diff --git a/src/plugins/platforms/wayland/qwaylandextendedsurface.h b/src/plugins/platforms/wayland/qwaylandextendedsurface.h index 184fc0d4..9efb638c 100644 --- a/src/plugins/platforms/wayland/qwaylandextendedsurface.h +++ b/src/plugins/platforms/wayland/qwaylandextendedsurface.h @@ -74,6 +74,8 @@ public: QVariant property(const QString &name); QVariant property(const QString &name, const QVariant &defaultValue); + Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags); + private: QWaylandWindow *m_window; struct wl_extended_surface *m_extended_surface; diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index 2f2b7844..1142c31f 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -221,3 +221,8 @@ Qt::ScreenOrientation QWaylandWindow::requestWindowOrientation(Qt::ScreenOrienta return Qt::PrimaryOrientation; } + +Qt::WindowFlags QWaylandWindow::setWindowFlags(Qt::WindowFlags flags) +{ + return mExtendedWindow->setWindowFlags(flags); +} diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h index d102f4e6..b67e11d5 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.h +++ b/src/plugins/platforms/wayland/qwaylandwindow.h @@ -88,6 +88,8 @@ public: void handleContentOrientationChange(Qt::ScreenOrientation orientation); Qt::ScreenOrientation requestWindowOrientation(Qt::ScreenOrientation orientation); + Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags); + protected: QWaylandDisplay *mDisplay; struct wl_surface *mSurface; -- GitLab