From 151a17761334038181e3f3b36846757560deadf6 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Wed, 31 Aug 2011 09:55:11 +0200 Subject: Generic property support for platform windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QPlatformNativeInterface can now contain generic window properties in a QVariantMap, to facilitate communication with the compositor and clients for certain platforms. When window properties change, a signal is emitted from the respective QPlatformNativeInterface instance. The properties are intended to be read/writable from both client and server. Change-Id: I7b42f7910d03c0d309add6c7dbb1c9b66ad22a3f Reviewed-on: http://codereview.qt.nokia.com/3956 Reviewed-by: Samuel Rødal --- .../platforms/wayland/qwaylandnativeinterface.cpp | 34 +++- .../platforms/wayland/qwaylandnativeinterface.h | 10 +- src/plugins/platforms/wayland/qwaylandwindow.cpp | 3 + .../qwaylandwindowmanager-client-protocol.h | 106 ------------- .../qwaylandwindowmanagerintegration.cpp | 174 +++++++++++++++++++-- .../qwaylandwindowmanagerintegration.h | 33 +++- .../wayland-windowmanager-client-protocol.h | 96 ++++++++++++ .../wayland-windowmanager-protocol.c | 45 +++--- .../windowmanager_integration.pri | 2 +- 9 files changed, 345 insertions(+), 158 deletions(-) delete mode 100644 src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h create mode 100644 src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-client-protocol.h diff --git a/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp b/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp index 43be74a..1773696 100644 --- a/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp +++ b/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp @@ -40,10 +40,13 @@ ****************************************************************************/ #include "qwaylandnativeinterface.h" - #include "qwaylanddisplay.h" #include "qwaylandwindow.h" + +#include "windowmanager_integration/qwaylandwindowmanagerintegration.h" + #include +#include void *QWaylandNativeInterface::nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget) { @@ -70,3 +73,32 @@ QWaylandScreen * QWaylandNativeInterface::qPlatformScreenForWidget(QWidget *widg } return screen; } + +QVariantMap QWaylandNativeInterface::windowProperties(QPlatformWindow *window) const +{ + return m_windowProperties.value(window); +} + +QVariant QWaylandNativeInterface::windowProperty(QPlatformWindow *window, const QString &name) const +{ + const QVariantMap properties = m_windowProperties.value(window); + return properties.value(name); +} + +QVariant QWaylandNativeInterface::windowProperty(QPlatformWindow *window, const QString &name, const QVariant &defaultValue) const +{ + const QVariantMap properties = m_windowProperties.value(window); + return properties.value(name, defaultValue); +} + +void QWaylandNativeInterface::setWindowProperty(QPlatformWindow *window, const QString &name, const QVariant &value) +{ + QVariantMap props = m_windowProperties.value(window); + props.insert(name, value); + m_windowProperties.insert(window, props); + + QWaylandWindow *wlWindow = static_cast(window); + QWaylandWindowManagerIntegration::instance()->setWindowProperty(wlWindow, name, value); + + emit windowPropertyChanged(window, name); +} diff --git a/src/plugins/platforms/wayland/qwaylandnativeinterface.h b/src/plugins/platforms/wayland/qwaylandnativeinterface.h index d33a41b..c92b44e 100644 --- a/src/plugins/platforms/wayland/qwaylandnativeinterface.h +++ b/src/plugins/platforms/wayland/qwaylandnativeinterface.h @@ -43,7 +43,7 @@ #define QWAYLANDNATIVEINTERFACE_H #include "qwaylandscreen.h" - +#include #include class QWaylandNativeInterface : public QPlatformNativeInterface @@ -52,8 +52,16 @@ public: void *nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget); + QVariantMap windowProperties(QPlatformWindow *window) const; + QVariant windowProperty(QPlatformWindow *window, const QString &name) const; + QVariant windowProperty(QPlatformWindow *window, const QString &name, const QVariant &defaultValue) const; + void setWindowProperty(QPlatformWindow *window, const QString &name, const QVariant &value); + private: static QWaylandScreen *qPlatformScreenForWidget(QWidget *widget); + +private: + QHash m_windowProperties; }; diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index ef2047e..099ebab 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -147,6 +147,9 @@ void QWaylandWindow::newSurfaceCreated() // do not damage the surface here, as this leads to graphical corruptions in the compositor until // the first frame has been rendered } +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT + QWaylandWindowManagerIntegration::instance()->flushPropertyChanges(this); +#endif } void QWaylandWindow::frameCallback(struct wl_surface *surface, void *data, uint32_t time) diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h deleted file mode 100644 index e781b16..0000000 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright © 2010 Kristian Høgsberg - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of the copyright holders not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no representations - * about the suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - - -#ifndef WAYLAND_WINDOWMANAGER_CLIENT_PROTOCOL_H -#define WAYLAND_WINDOWMANAGER_CLIENT_PROTOCOL_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include "wayland-util.h" - -struct wl_client; - -struct wl_windowmanager; - -extern const struct wl_interface wl_windowmanager_interface; - -struct wl_windowmanager_listener { - void (*client_onscreen_visibility)(void *data, - struct wl_windowmanager *wl_windowmanager, - int visible); - void (*set_screen_rotation)(void *data, - struct wl_windowmanager *wl_windowmanager, - int rotation); -}; - -static inline int -wl_windowmanager_add_listener(struct wl_windowmanager *wl_windowmanager, - const struct wl_windowmanager_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) wl_windowmanager, - (void (**)(void)) listener, data); -} - -#define WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS 0 -#define WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN 1 - -static inline struct wl_windowmanager * -wl_windowmanager_create(struct wl_display *display, uint32_t id, uint32_t version) -{ - wl_display_bind(display, id, "wl_windowmanager", version); - - return (struct wl_windowmanager *) - wl_proxy_create_for_id(display, &wl_windowmanager_interface, id); -} - -static inline void -wl_windowmanager_set_user_data(struct wl_windowmanager *wl_windowmanager, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) wl_windowmanager, user_data); -} - -static inline void * -wl_windowmanager_get_user_data(struct wl_windowmanager *wl_windowmanager) -{ - return wl_proxy_get_user_data((struct wl_proxy *) wl_windowmanager); -} - -static inline void -wl_windowmanager_destroy(struct wl_windowmanager *wl_windowmanager) -{ - wl_proxy_destroy((struct wl_proxy *) wl_windowmanager); -} - -static inline void -wl_windowmanager_map_client_to_process(struct wl_windowmanager *wl_windowmanager, uint32_t processid) -{ - wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, - WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS, processid); -} - -static inline void -wl_windowmanager_authenticate_with_token(struct wl_windowmanager *wl_windowmanager, const char *processid) -{ - wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, - WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN, processid); -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp index 60b0a56..798900b 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp @@ -40,17 +40,44 @@ ****************************************************************************/ #include "qwaylandwindowmanagerintegration.h" -#include "qwaylandwindowmanager-client-protocol.h" +#include "wayland-windowmanager-client-protocol.h" +#include "qwaylandwindow.h" #include -#include -#include +#include +#include +#include +#include #include -#include +#include +#include + +#include + +class QWaylandWindowManagerIntegrationPrivate { +public: + QWaylandWindowManagerIntegrationPrivate(QWaylandDisplay *waylandDisplay); + bool m_blockPropertyUpdates; + QWaylandDisplay *m_waylandDisplay; + struct wl_windowmanager *m_waylandWindowManager; + QHash m_queuedProperties; -const struct wl_windowmanager_listener QWaylandWindowManagerIntegration::mWindowManagerListener = { +}; + +QWaylandWindowManagerIntegrationPrivate::QWaylandWindowManagerIntegrationPrivate(QWaylandDisplay *waylandDisplay) + : m_blockPropertyUpdates(false) + , m_waylandDisplay(waylandDisplay) + , m_waylandWindowManager(0) +{ + +} + +QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::m_instance = 0; + +const struct wl_windowmanager_listener QWaylandWindowManagerIntegration::m_windowManagerListener = { QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange, QWaylandWindowManagerIntegration::wlHandleScreenOrientationChange, + QWaylandWindowManagerIntegration::wlHandleWindowPropertyChange }; QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::createIntegration(QWaylandDisplay *waylandDisplay) @@ -59,10 +86,11 @@ QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::createIntegr } QWaylandWindowManagerIntegration::QWaylandWindowManagerIntegration(QWaylandDisplay *waylandDisplay) - : mWaylandDisplay(waylandDisplay) - , mWaylandWindowManager(0) + : d_ptr(new QWaylandWindowManagerIntegrationPrivate(waylandDisplay)) { - wl_display_add_global_listener(mWaylandDisplay->wl_display(), + m_instance = this; + + wl_display_add_global_listener(d_ptr->m_waylandDisplay->wl_display(), QWaylandWindowManagerIntegration::wlHandleListenerGlobal, this); } @@ -72,9 +100,15 @@ QWaylandWindowManagerIntegration::~QWaylandWindowManagerIntegration() } +QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::instance() +{ + return m_instance; +} + struct wl_windowmanager *QWaylandWindowManagerIntegration::windowManager() const { - return mWaylandWindowManager; + Q_D(const QWaylandWindowManagerIntegration); + return d->m_waylandWindowManager; } void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) @@ -82,29 +116,95 @@ void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *displa Q_UNUSED(version); if (strcmp(interface, "wl_windowmanager") == 0) { QWaylandWindowManagerIntegration *integration = static_cast(data); - integration->mWaylandWindowManager = wl_windowmanager_create(display, id, 1); - - wl_windowmanager_add_listener(integration->mWaylandWindowManager, &mWindowManagerListener, integration); + integration->d_ptr->m_waylandWindowManager = wl_windowmanager_create(display, id, 1); + wl_windowmanager *windowManager = integration->d_ptr->m_waylandWindowManager; + wl_windowmanager_add_listener(windowManager, &m_windowManagerListener, integration); } } void QWaylandWindowManagerIntegration::mapClientToProcess(long long processId) { - if (mWaylandWindowManager) - wl_windowmanager_map_client_to_process(mWaylandWindowManager, (uint32_t) processId); + Q_D(QWaylandWindowManagerIntegration); + if (d->m_waylandWindowManager) + wl_windowmanager_map_client_to_process(d->m_waylandWindowManager, (uint32_t) processId); } void QWaylandWindowManagerIntegration::authenticateWithToken(const QByteArray &token) { + Q_D(QWaylandWindowManagerIntegration); QByteArray authToken = token; if (authToken.isEmpty()) authToken = qgetenv("WL_AUTHENTICATION_TOKEN"); - if (mWaylandWindowManager && !authToken.isEmpty()) { - wl_windowmanager_authenticate_with_token(mWaylandWindowManager, authToken.constData()); + if (d->m_waylandWindowManager && !authToken.isEmpty()) { + wl_windowmanager_authenticate_with_token(d->m_waylandWindowManager, authToken.constData()); + } +} + +static wl_array writePropertyValue(const QVariant &value) +{ + QByteArray byteValue; + QDataStream ds(&byteValue, QIODevice::WriteOnly); + ds << value; + + wl_array data; + data.size = byteValue.size(); + data.data = (void*)byteValue.constData(); + data.alloc = 0; + + return data; +} + +void QWaylandWindowManagerIntegration::setWindowProperty(QWaylandWindow *window, const QString &propertyName, const QVariant &propertyValue) +{ + Q_D(QWaylandWindowManagerIntegration); + if (d->m_blockPropertyUpdates) + return; + + if (window->wl_surface()) { + wl_array data = writePropertyValue(propertyValue); + wl_windowmanager_update_generic_property(d->m_waylandWindowManager, window->wl_surface(), + propertyName.toLatin1().constData(), + &data); + } else { + QVariantMap props = d->m_queuedProperties.value(window); + props.insert(propertyName, propertyValue); + d->m_queuedProperties.insert(window, props); + // ### TODO we'll need to add listening to destroyed() of QWindow that owns QWaylandWindow + // once refactor changes are in, and connect to removeQueuedPropertiesForWindow(). } } +void QWaylandWindowManagerIntegration::flushPropertyChanges(QWaylandWindow *windowToFlush) +{ + // write all changes we got while we did not have a surface. + // this can happen during startup, for example, or while the window is hidden. + Q_D(QWaylandWindowManagerIntegration); + + if (!windowToFlush) + return; + + QVariantMap properties = d->m_queuedProperties.value(windowToFlush); + wl_surface *surface = windowToFlush->wl_surface(); + + QMapIterator pIt(properties); + while (pIt.hasNext()) { + pIt.next(); + wl_array data = writePropertyValue(pIt.value()); + wl_windowmanager_update_generic_property(d->m_waylandWindowManager, surface, pIt.key().toLatin1().constData(), &data); + } + + d->m_queuedProperties.clear(); +} + +void QWaylandWindowManagerIntegration::removeQueuedPropertiesForWindow() +{ + // TODO enable this later once refactor changes are in. +// Q_D(QWaylandWindowManagerIntegration); +// QWaylandWindow *window = 0; +// d->m_queuedProperties.remove(window); +} + void QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible) { Q_UNUSED(data); @@ -120,3 +220,45 @@ void QWaylandWindowManagerIntegration::wlHandleScreenOrientationChange(void *dat QScreenOrientationChangeEvent event(screenOrientation); QCoreApplication::sendEvent(QCoreApplication::instance(), &event); } + +void QWaylandWindowManagerIntegration::wlHandleWindowPropertyChange(void *data, struct wl_windowmanager *wl_windowmanager, + struct wl_surface *surface, + const char *propertyName, struct wl_array *propertyValue) +{ + // window manager changes a window property + Q_UNUSED(data); + Q_UNUSED(wl_windowmanager); + + QVariant variantValue; + QByteArray baValue = QByteArray((const char*)propertyValue->data, propertyValue->size); + QDataStream ds(&baValue, QIODevice::ReadOnly); + ds >> variantValue; + + QPlatformNativeInterface *nativeInterface = qApp->platformNativeInterface(); + QWaylandWindowManagerIntegration *inst = QWaylandWindowManagerIntegration::instance(); + + QWidgetList widgets = qApp->topLevelWidgets(); + foreach (QWidget *widget, widgets) { + QPlatformWindow *platformWindowForWidget = widget->platformWindow(); + if (!platformWindowForWidget) + continue; + QWaylandWindow *window = static_cast(platformWindowForWidget); + wl_surface *windowSurface = (wl_surface*)nativeInterface->nativeResourceForWidget(QByteArray("surface"), widget); + if (windowSurface == surface) { + inst->handleWindowPropertyChange(window, QString(propertyName), variantValue); + break; + } + } +} + +void QWaylandWindowManagerIntegration::handleWindowPropertyChange(QWaylandWindow *window, + const QString &propertyName, const QVariant &propertyValue) +{ + Q_D(QWaylandWindowManagerIntegration); + d->m_blockPropertyUpdates = true; + + QPlatformNativeInterface *nativeInterface = qApp->platformNativeInterface(); + nativeInterface->setWindowProperty(window, propertyName, propertyValue); + + d->m_blockPropertyUpdates = false; +} diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h index 6b4658c..1372fb8 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h @@ -42,21 +42,37 @@ #ifndef QWAYLANDWINDOWMANAGERINTEGRATION_H #define QWAYLANDWINDOWMANAGERINTEGRATION_H -#include +#include +#include + #include "wayland-client.h" #include "qwaylanddisplay.h" -class QWaylandWindowManagerIntegration +class QWaylandWindow; + +class QWaylandWindowManagerIntegrationPrivate; + +class QWaylandWindowManagerIntegration : public QObject { + Q_OBJECT + Q_DECLARE_PRIVATE(QWaylandWindowManagerIntegration) public: explicit QWaylandWindowManagerIntegration(QWaylandDisplay *waylandDisplay); virtual ~QWaylandWindowManagerIntegration(); static QWaylandWindowManagerIntegration *createIntegration(QWaylandDisplay *waylandDisplay); struct wl_windowmanager *windowManager() const; + static QWaylandWindowManagerIntegration *instance(); + void mapSurfaceToProcess(struct wl_surface *surface, long long processId); void mapClientToProcess(long long processId); void authenticateWithToken(const QByteArray &token = QByteArray()); + void setWindowProperty(QWaylandWindow *window, const QString &propertyName, const QVariant &propertyValue); + + void flushPropertyChanges(QWaylandWindow *windowToFlush); + +private slots: + void removeQueuedPropertiesForWindow(); private: static void wlHandleListenerGlobal(wl_display *display, uint32_t id, @@ -64,12 +80,17 @@ private: static void wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible); static void wlHandleScreenOrientationChange(void *data, struct wl_windowmanager *wl_windowmanager, int screenOrientation); -private: + static void wlHandleWindowPropertyChange(void *data, struct wl_windowmanager *wl_windowmanager, + struct wl_surface *surface, + const char *propertyName, struct wl_array *propertyValue); - QWaylandDisplay *mWaylandDisplay; - struct wl_windowmanager *mWaylandWindowManager; + void handleWindowPropertyChange(QWaylandWindow *window, const QString &propertyName, const QVariant &propertyValue); + +private: + QScopedPointer d_ptr; + static QWaylandWindowManagerIntegration *m_instance; - static const struct wl_windowmanager_listener mWindowManagerListener; + static const struct wl_windowmanager_listener m_windowManagerListener; }; #endif // QWAYLANDWINDOWMANAGERINTEGRATION_H diff --git a/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-client-protocol.h b/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-client-protocol.h new file mode 100644 index 0000000..034c08f --- /dev/null +++ b/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-client-protocol.h @@ -0,0 +1,96 @@ +#ifndef WAYLAND_WINDOWMANAGER_CLIENT_PROTOCOL_H +#define WAYLAND_WINDOWMANAGER_CLIENT_PROTOCOL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "wayland-util.h" + +struct wl_client; + +struct wl_windowmanager; + +extern const struct wl_interface wl_windowmanager_interface; + +struct wl_windowmanager_listener { + void (*client_onscreen_visibility)(void *data, + struct wl_windowmanager *wl_windowmanager, + int32_t visible); + void (*set_screen_rotation)(void *data, + struct wl_windowmanager *wl_windowmanager, + int32_t rotation); + void (*set_generic_property)(void *data, + struct wl_windowmanager *wl_windowmanager, + struct wl_surface *surface, + const char *name, + struct wl_array *value); +}; + +static inline int +wl_windowmanager_add_listener(struct wl_windowmanager *wl_windowmanager, + const struct wl_windowmanager_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) wl_windowmanager, + (void (**)(void)) listener, data); +} + +#define WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS 0 +#define WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN 1 +#define WL_WINDOWMANAGER_UPDATE_GENERIC_PROPERTY 2 + +static inline struct wl_windowmanager * +wl_windowmanager_create(struct wl_display *display, uint32_t id, uint32_t version) +{ + wl_display_bind(display, id, "wl_windowmanager", version); + + return (struct wl_windowmanager *) + wl_proxy_create_for_id(display, &wl_windowmanager_interface, id); +} + +static inline void +wl_windowmanager_set_user_data(struct wl_windowmanager *wl_windowmanager, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) wl_windowmanager, user_data); +} + +static inline void * +wl_windowmanager_get_user_data(struct wl_windowmanager *wl_windowmanager) +{ + return wl_proxy_get_user_data((struct wl_proxy *) wl_windowmanager); +} + +static inline void +wl_windowmanager_destroy(struct wl_windowmanager *wl_windowmanager) +{ + wl_proxy_destroy((struct wl_proxy *) wl_windowmanager); +} + +static inline void +wl_windowmanager_map_client_to_process(struct wl_windowmanager *wl_windowmanager, uint32_t processid) +{ + wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, + WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS, processid); +} + +static inline void +wl_windowmanager_authenticate_with_token(struct wl_windowmanager *wl_windowmanager, const char *processid) +{ + wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, + WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN, processid); +} + +static inline void +wl_windowmanager_update_generic_property(struct wl_windowmanager *wl_windowmanager, struct wl_surface *surface, const char *name, struct wl_array *value) +{ + wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, + WL_WINDOWMANAGER_UPDATE_GENERIC_PROPERTY, surface, name, value); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c b/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c index 8125dec..1d231f5 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c +++ b/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c @@ -1,38 +1,29 @@ -/* - * Copyright © 2010 Kristian Høgsberg - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of the copyright holders not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no representations - * about the suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - - #include #include #include "wayland-util.h" +extern const struct wl_interface wl_surface_interface; + +static const struct wl_interface *types[] = { + NULL, + &wl_surface_interface, + NULL, + NULL, + &wl_surface_interface, + NULL, + NULL, +}; + static const struct wl_message wl_windowmanager_requests[] = { - { "map_client_to_process", "u", NULL }, - { "authenticate_with_token", "s", NULL }, + { "map_client_to_process", "u", types + 0 }, + { "authenticate_with_token", "s", types + 0 }, + { "update_generic_property", "osa", types + 1 }, }; static const struct wl_message wl_windowmanager_events[] = { - { "client_onscreen_visibility", "i", NULL }, - { "set_screen_rotation", "i", NULL }, + { "client_onscreen_visibility", "i", types + 0 }, + { "set_screen_rotation", "i", types + 0 }, + { "set_generic_property", "osa", types + 4 }, }; WL_EXPORT const struct wl_interface wl_windowmanager_interface = { diff --git a/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri b/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri index a282182..45118b5 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri +++ b/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri @@ -3,7 +3,7 @@ DEFINES += QT_WAYLAND_WINDOWMANAGER_SUPPORT contains(DEFINES, QT_WAYLAND_WINDOWMANAGER_SUPPORT) { HEADERS += \ - $$PWD/qwaylandwindowmanager-client-protocol.h \ + $$PWD/wayland-windowmanager-client-protocol.h \ $$PWD/qwaylandwindowmanagerintegration.h SOURCES += \ -- cgit v1.2.3