diff --git a/extensions/surface-extension.xml b/extensions/surface-extension.xml index 38c6590ce61673903a9c2caf6c87e334b7d31cc8..dbbb85110d4818e28511cde440083bd038c46aea 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 c86698bd4e14b4451f5f37c066d25653b4ef5440..03c0b8141794e5a650cf3cea511db3bc3de7f24e 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 786c1f4b540f0de1f0e4ac6904fbb4a7c6178fdc..596dee8bafb4c8bf6cde71c733cc93326ff05e8c 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 debf6fe7c326c14ed43d355ddd86ad9e4c704e9c..e371237a6adce2c0ddb36acbc0a4e960f57fdcdc 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 38e4dff4fbac3620eb5cd87cc812778cfb4b55ad..a386b5967b97c56f3263f7b5bbd938f79fdeda81 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 5cbabe60d27d2d9b136971f66c5b2867c8be2e98..cd2748947d522ad1845ddfeb826c6e2cc7f1424b 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 be2eb14ba81fb220e83d3af2890aa0aa4251c3c0..223a350c42027f135d77ebabff77947d99b676ff 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 b34d7c8cce7ac2178120ff961cd56bd66e0f9f41..ecb4b5fe826f512ae3e5a475b843a819da7fc45a 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 58dfac4b01b5281bd40126670002b33243611cb9..41ccdec9555fa476888012410830a0d22eed9ea6 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 184fc0d471e0ccbf4b3d9fb3e1e4ed2852856a9c..9efb638cf0df8fdc7d47a032cf15f38fafa91e51 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 2f2b784427a6d9dbf4ac4ee2c42481315878dd94..1142c31f35867d04c507f0410a292d4d10ebf87c 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 d102f4e6ebb0023172d20031433913482a411306..b67e11d546b4264e85ebead1b770751a99f07ede 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;