summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2012-02-22 10:52:54 +0100
committerSamuel Rødal <samuel.rodal@nokia.com>2012-02-23 09:19:43 +0100
commit2912e378393111677a985a0bd4353a06fbabc5ee (patch)
tree5c451476f46da144ab2a5e15ad46befed1753e66
parentf9413889531c21b56e3b512c264c5dc9a85f8c74 (diff)
downloadqtwayland-2912e378393111677a985a0bd4353a06fbabc5ee.tar.gz
Support ShowIsFullScreen in plugin and compositor.
Added way of controlling client side style hint ShowIsFullScreen from compositor, and added support in plugin for the WindowFullScreen state. Change-Id: I60efa5692b26e9a4079c3c2fb66eb72b67badd02 Reviewed-by: Laszlo Agocs <laszlo.p.agocs@nokia.com>
-rw-r--r--extensions/windowmanager.xml4
-rw-r--r--src/compositor/compositor_api/waylandcompositor.cpp5
-rw-r--r--src/compositor/compositor_api/waylandcompositor.h2
-rw-r--r--src/compositor/wayland_wrapper/wlcompositor.cpp5
-rw-r--r--src/compositor/wayland_wrapper/wlcompositor.h2
-rw-r--r--src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp13
-rw-r--r--src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h3
-rw-r--r--src/plugins/platforms/wayland/qwaylanddisplay.cpp1
-rw-r--r--src/plugins/platforms/wayland/qwaylandintegration.cpp13
-rw-r--r--src/plugins/platforms/wayland/qwaylandintegration.h2
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.cpp18
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.h1
-rw-r--r--src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp22
-rw-r--r--src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h8
14 files changed, 93 insertions, 6 deletions
diff --git a/extensions/windowmanager.xml b/extensions/windowmanager.xml
index a725e8d8..b2226c4b 100644
--- a/extensions/windowmanager.xml
+++ b/extensions/windowmanager.xml
@@ -45,6 +45,8 @@
<request name="authenticate_with_token">
<arg name="processid" type="string" />
</request>
-
+ <event name="hints">
+ <arg name="show_is_fullscreen" type="int"/>
+ </event>
</interface>
</protocol>
diff --git a/src/compositor/compositor_api/waylandcompositor.cpp b/src/compositor/compositor_api/waylandcompositor.cpp
index 4e1097c4..301d422d 100644
--- a/src/compositor/compositor_api/waylandcompositor.cpp
+++ b/src/compositor/compositor_api/waylandcompositor.cpp
@@ -142,6 +142,11 @@ void WaylandCompositor::overrideSelection(QMimeData *data)
m_compositor->overrideSelection(data);
}
+void WaylandCompositor::setClientFullScreenHint(bool value)
+{
+ m_compositor->setClientFullScreenHint(value);
+}
+
const char *WaylandCompositor::socketName() const
{
if (m_socket_name.isEmpty())
diff --git a/src/compositor/compositor_api/waylandcompositor.h b/src/compositor/compositor_api/waylandcompositor.h
index 8406298b..c68cd6c9 100644
--- a/src/compositor/compositor_api/waylandcompositor.h
+++ b/src/compositor/compositor_api/waylandcompositor.h
@@ -80,6 +80,8 @@ public:
virtual void retainedSelectionReceived(QMimeData *mimeData);
void overrideSelection(QMimeData *data);
+ void setClientFullScreenHint(bool value);
+
const char *socketName() const;
void setScreenOrientation(Qt::ScreenOrientation orientation);
diff --git a/src/compositor/wayland_wrapper/wlcompositor.cpp b/src/compositor/wayland_wrapper/wlcompositor.cpp
index bd02b670..41445b6c 100644
--- a/src/compositor/wayland_wrapper/wlcompositor.cpp
+++ b/src/compositor/wayland_wrapper/wlcompositor.cpp
@@ -376,6 +376,11 @@ QRect Compositor::outputGeometry() const
return m_output_global.geometry();
}
+void Compositor::setClientFullScreenHint(bool value)
+{
+ m_windowManagerIntegration->setShowIsFullScreen(value);
+}
+
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 d8acad2b..be9b1092 100644
--- a/src/compositor/wayland_wrapper/wlcompositor.h
+++ b/src/compositor/wayland_wrapper/wlcompositor.h
@@ -120,6 +120,8 @@ public:
void setOutputGeometry(const QRect &geometry);
QRect outputGeometry() const;
+ void setClientFullScreenHint(bool value);
+
void enableTouchExtension();
TouchExtensionGlobal *touchExtension() { return m_touchExtension; }
void configureTouchExtension(int flags);
diff --git a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp
index f7e08c80..75c63324 100644
--- a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp
+++ b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp
@@ -48,6 +48,7 @@
WindowManagerServerIntegration::WindowManagerServerIntegration(QObject *parent)
: QObject(parent)
+ , m_showIsFullScreen(false)
{
}
@@ -94,13 +95,23 @@ void WindowManagerServerIntegration::authenticateWithToken(wl_client *client, co
emit clientAuthenticated(client);
}
+void WindowManagerServerIntegration::setShowIsFullScreen(bool value)
+{
+ m_showIsFullScreen = value;
+ struct wl_resource *resource;
+ wl_list_for_each(resource,&client_resources, link) {
+ wl_resource_post_event(resource, WL_WINDOWMANAGER_HINTS, int32_t(m_showIsFullScreen));
+ }
+}
+
void WindowManagerServerIntegration::bind_func(struct wl_client *client, void *data,
uint32_t version, uint32_t id)
{
Q_UNUSED(version);
WindowManagerServerIntegration *win_mgr = static_cast<WindowManagerServerIntegration *>(data);
- struct wl_resource *resource = wl_client_add_object(client,&wl_windowmanager_interface,&windowmanager_interface,id,data);
+ wl_resource *resource = wl_client_add_object(client,&wl_windowmanager_interface,&windowmanager_interface,id,data);
win_mgr->registerResource(resource);
+ wl_resource_post_event(resource, WL_WINDOWMANAGER_HINTS, int32_t(win_mgr->m_showIsFullScreen));
}
diff --git a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h
index 2077a733..d2e01b1e 100644
--- a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h
+++ b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h
@@ -73,7 +73,7 @@ public:
WaylandManagedClient *managedClient(wl_client *client) const;
- void setScreenOrientation(wl_client *client, struct wl_resource *output_resource, Qt::ScreenOrientation orientationInDegrees);
+ void setShowIsFullScreen(bool value);
signals:
void clientAuthenticated(wl_client *client);
@@ -83,6 +83,7 @@ private:
void authenticateWithToken(wl_client *client, const char *token);
private:
+ bool m_showIsFullScreen;
QMap<wl_client*, WaylandManagedClient*> m_managedClients;
static void bind_func(struct wl_client *client, void *data,
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index bf21e0b4..e52e9ddf 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -340,3 +340,4 @@ void QWaylandDisplay::forceRoundTrip()
readEvents();
}
}
+
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp
index 3b76abef..159c0cc4 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.cpp
+++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp
@@ -65,6 +65,10 @@
#include "gl_integration/qwaylandglintegration.h"
#endif
+#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT
+#include "windowmanager_integration/qwaylandwindowmanagerintegration.h"
+#endif
+
QWaylandIntegration::QWaylandIntegration()
: mFontDb(new QGenericUnixFontDatabase())
, mEventDispatcher(createUnixEventDispatcher())
@@ -151,3 +155,12 @@ QPlatformInputContext *QWaylandIntegration::inputContext() const
{
return mInputContext;
}
+
+QVariant QWaylandIntegration::styleHint(StyleHint hint) const
+{
+#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT
+ if (hint == ShowIsFullScreen && mDisplay->windowManagerIntegration())
+ return mDisplay->windowManagerIntegration()->showIsFullScreen();
+#endif
+ return QPlatformIntegration::styleHint(hint);
+}
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h
index 757510bd..8d0c0938 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.h
+++ b/src/plugins/platforms/wayland/qwaylandintegration.h
@@ -72,6 +72,8 @@ public:
QPlatformInputContext *inputContext() const;
+ QVariant styleHint(StyleHint hint) const;
+
private:
QPlatformFontDatabase *mFontDb;
QAbstractEventDispatcher *mEventDispatcher;
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index 1142c31f..b70860d5 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -147,7 +147,7 @@ void QWaylandWindow::attach(QWaylandBuffer *buffer)
{
mBuffer = buffer;
- if (window()->visible()) {
+ if (window()->isVisible()) {
wl_surface_attach(mSurface, mBuffer->buffer(),0,0);
if (buffer)
QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size()));
@@ -222,6 +222,22 @@ Qt::ScreenOrientation QWaylandWindow::requestWindowOrientation(Qt::ScreenOrienta
return Qt::PrimaryOrientation;
}
+Qt::WindowState QWaylandWindow::setWindowState(Qt::WindowState state)
+{
+ if (state == Qt::WindowFullScreen || state == Qt::WindowMaximized) {
+ QScreen *screen = window()->screen();
+
+ QRect geometry = screen->mapBetween(window()->windowOrientation(), screen->primaryOrientation(), screen->geometry());
+ setGeometry(geometry);
+
+ QWindowSystemInterface::handleGeometryChange(window(), geometry);
+
+ return state;
+ }
+
+ return Qt::WindowNoState;
+}
+
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 b67e11d5..ad361814 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -88,6 +88,7 @@ public:
void handleContentOrientationChange(Qt::ScreenOrientation orientation);
Qt::ScreenOrientation requestWindowOrientation(Qt::ScreenOrientation orientation);
+ Qt::WindowState setWindowState(Qt::WindowState state);
Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
protected:
diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp
index a98ffdfc..3e2507e8 100644
--- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp
+++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp
@@ -61,20 +61,20 @@ public:
QWaylandDisplay *m_waylandDisplay;
struct wl_windowmanager *m_waylandWindowManager;
QHash<QWindow*, QVariantMap> m_queuedProperties;
-
+ bool m_showIsFullScreen;
};
QWaylandWindowManagerIntegrationPrivate::QWaylandWindowManagerIntegrationPrivate(QWaylandDisplay *waylandDisplay)
: m_blockPropertyUpdates(false)
, m_waylandDisplay(waylandDisplay)
, m_waylandWindowManager(0)
+ , m_showIsFullScreen(false)
{
}
QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::m_instance = 0;
-
QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::createIntegration(QWaylandDisplay *waylandDisplay)
{
return new QWaylandWindowManagerIntegration(waylandDisplay);
@@ -106,6 +106,12 @@ struct wl_windowmanager *QWaylandWindowManagerIntegration::windowManager() const
return d->m_waylandWindowManager;
}
+bool QWaylandWindowManagerIntegration::showIsFullScreen() const
+{
+ Q_D(const QWaylandWindowManagerIntegration);
+ return d->m_showIsFullScreen;
+}
+
void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data)
{
Q_UNUSED(version);
@@ -113,9 +119,21 @@ void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *displa
QWaylandWindowManagerIntegration *integration = static_cast<QWaylandWindowManagerIntegration *>(data);
integration->d_ptr->m_waylandWindowManager =
static_cast<struct wl_windowmanager *>(wl_display_bind(display, id, &wl_windowmanager_interface));
+ wl_windowmanager_add_listener(integration->d_ptr->m_waylandWindowManager, &windowmanager_listener, integration);
}
}
+const struct wl_windowmanager_listener QWaylandWindowManagerIntegration::windowmanager_listener = {
+ QWaylandWindowManagerIntegration::handle_hints
+};
+
+void QWaylandWindowManagerIntegration::handle_hints(void *data, wl_windowmanager *ext, int32_t showIsFullScreen)
+{
+ Q_UNUSED(ext);
+ QWaylandWindowManagerIntegration *self = static_cast<QWaylandWindowManagerIntegration *>(data);
+ self->d_func()->m_showIsFullScreen = showIsFullScreen;
+}
+
void QWaylandWindowManagerIntegration::mapClientToProcess(long long processId)
{
Q_D(QWaylandWindowManagerIntegration);
diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h
index af93eac4..cfb4df79 100644
--- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h
+++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h
@@ -68,6 +68,8 @@ public:
void mapClientToProcess(long long processId);
void authenticateWithToken(const QByteArray &token = QByteArray());
+ bool showIsFullScreen() const;
+
private:
static void wlHandleListenerGlobal(wl_display *display, uint32_t id,
const char *interface, uint32_t version, void *data);
@@ -76,6 +78,12 @@ private:
QScopedPointer<QWaylandWindowManagerIntegrationPrivate> d_ptr;
static QWaylandWindowManagerIntegration *m_instance;
+ static const struct wl_windowmanager_listener windowmanager_listener;
+
+ static void handle_hints(void *data,
+ struct wl_windowmanager *ext,
+ int32_t showIsFullScreen);
+
static const struct wl_windowmanager_listener m_windowManagerListener;
};