****************************************************************************/
#include "qwaylandwindowmanagerintegration.h"
- #include "qwaylandwindowmanager-client-protocol.h"
+ #include "wayland-windowmanager-client-protocol.h"
+ #include "qwaylandwindow.h"
#include <stdint.h>
- #include <QDebug>
- #include <QEvent>
+ #include <QtCore/QEvent>
+ #include <QtCore/QHash>
+ #include <QtGui/QPlatformNativeInterface>
+ #include <QtGui/QPlatformWindow>
#include <QtGui/QtEvents>
- #include <QCoreApplication>
-#include <QtGui/QWidget>
-#include <QtGui/QApplication>
++#include <QtGui/QGuiApplication>
+
+ #include <QDebug>
+
+ class QWaylandWindowManagerIntegrationPrivate {
+ public:
+ QWaylandWindowManagerIntegrationPrivate(QWaylandDisplay *waylandDisplay);
+ bool m_blockPropertyUpdates;
+ QWaylandDisplay *m_waylandDisplay;
+ struct wl_windowmanager *m_waylandWindowManager;
+ QHash<QWaylandWindow*,QVariantMap> 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)
QScreenOrientationChangeEvent event(screenOrientation);
QCoreApplication::sendEvent(QCoreApplication::instance(), &event);
}
- QWidgetList widgets = qApp->topLevelWidgets();
- foreach (QWidget *widget, widgets) {
- QPlatformWindow *platformWindowForWidget = widget->platformWindow();
- if (!platformWindowForWidget)
+
+ 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();
+
- QWaylandWindow *window = static_cast<QWaylandWindow*>(platformWindowForWidget);
- wl_surface *windowSurface = (wl_surface*)nativeInterface->nativeResourceForWidget(QByteArray("surface"), widget);
++ QList<QWindow *> windows = qApp->topLevelWindows();
++ foreach (QWindow *window, windows) {
++ QPlatformWindow *platformWindowForWindow = window->handle();
++ if (!platformWindowForWindow)
+ continue;
- inst->handleWindowPropertyChange(window, QString(propertyName), variantValue);
++ QWaylandWindow *waylandWindow = static_cast<QWaylandWindow*>(platformWindowForWindow);
++ wl_surface *windowSurface = (wl_surface*)nativeInterface->nativeResourceForWindow(QByteArray("surface"), window);
+ if (windowSurface == surface) {
++ inst->handleWindowPropertyChange(waylandWindow, 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;
+ }