summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@nokia.com>2012-02-10 15:43:59 +0100
committerJørgen Lind <jorgen.lind@nokia.com>2012-02-10 16:04:33 +0100
commit20f10e77329651204d6c1152f45f5555f0c3ccf4 (patch)
treee8034b1d0f2fc024252548ea8e8b9dd266b5ca37
parentf089f453ae6ea3766a0ec41059371f6dc81ce9df (diff)
Added window flags to the surface-extension protocol
Change-Id: I1b53c5f0b0f908490dcd0ab30e46ab681f885954 Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
-rw-r--r--extensions/surface-extension.xml10
-rw-r--r--src/compositor/compositor_api/waylandcompositor.cpp2
-rw-r--r--src/compositor/compositor_api/waylandsurface.cpp9
-rw-r--r--src/compositor/compositor_api/waylandsurface.h16
-rw-r--r--src/compositor/wayland_wrapper/wlextendedsurface.cpp18
-rw-r--r--src/compositor/wayland_wrapper/wlextendedsurface.h9
-rw-r--r--src/compositor/wayland_wrapper/wlsurface.cpp6
-rw-r--r--src/compositor/wayland_wrapper/wlsurface.h2
-rw-r--r--src/plugins/platforms/wayland/qwaylandextendedsurface.cpp14
-rw-r--r--src/plugins/platforms/wayland/qwaylandextendedsurface.h2
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.cpp5
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.h2
12 files changed, 93 insertions, 2 deletions
diff --git a/extensions/surface-extension.xml b/extensions/surface-extension.xml
index 38c6590ce..dbbb85110 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 c86698bd4..03c0b8141 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 786c1f4b5..596dee8ba 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 debf6fe7c..e371237a6 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 38e4dff4f..a386b5967 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 5cbabe60d..cd2748947 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 be2eb14ba..223a350c4 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 b34d7c8cc..ecb4b5fe8 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 58dfac4b0..41ccdec95 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 184fc0d47..9efb638cf 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 2f2b78442..1142c31f3 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 d102f4e6e..b67e11d54 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;