From 2912e378393111677a985a0bd4353a06fbabc5ee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Samuel=20R=C3=B8dal?= Date: Wed, 22 Feb 2012 10:52:54 +0100 Subject: [PATCH] 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 --- extensions/windowmanager.xml | 4 +++- .../compositor_api/waylandcompositor.cpp | 5 +++++ src/compositor/compositor_api/waylandcompositor.h | 2 ++ src/compositor/wayland_wrapper/wlcompositor.cpp | 5 +++++ src/compositor/wayland_wrapper/wlcompositor.h | 2 ++ .../waylandwindowmanagerintegration.cpp | 13 ++++++++++++- .../waylandwindowmanagerintegration.h | 3 ++- src/plugins/platforms/wayland/qwaylanddisplay.cpp | 1 + .../platforms/wayland/qwaylandintegration.cpp | 13 +++++++++++++ .../platforms/wayland/qwaylandintegration.h | 2 ++ src/plugins/platforms/wayland/qwaylandwindow.cpp | 18 +++++++++++++++++- src/plugins/platforms/wayland/qwaylandwindow.h | 1 + .../qwaylandwindowmanagerintegration.cpp | 22 ++++++++++++++++++++-- .../qwaylandwindowmanagerintegration.h | 8 ++++++++ 14 files changed, 93 insertions(+), 6 deletions(-) diff --git a/extensions/windowmanager.xml b/extensions/windowmanager.xml index a725e8d..b2226c4 100644 --- a/extensions/windowmanager.xml +++ b/extensions/windowmanager.xml @@ -45,6 +45,8 @@ - + + + diff --git a/src/compositor/compositor_api/waylandcompositor.cpp b/src/compositor/compositor_api/waylandcompositor.cpp index 4e1097c..301d422 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 8406298..c68cd6c 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 bd02b67..41445b6 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 d8acad2..be9b109 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 f7e08c8..75c6332 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(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 2077a73..d2e01b1 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 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 bf21e0b..e52e9dd 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 3b76abe..159c0cc 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 757510b..8d0c093 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 1142c31..b70860d 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 b67e11d..ad36181 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 a98ffdf..3e2507e 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 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(data); integration->d_ptr->m_waylandWindowManager = static_cast(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(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 af93eac..cfb4df7 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 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; }; -- 2.7.4