Merge remote branch 'gerrit/master' into HEAD
authorSamuel Rødal <samuel.rodal@nokia.com>
Tue, 6 Sep 2011 08:49:40 +0000 (10:49 +0200)
committerPaul Olav Tvete <paul.tvete@nokia.com>
Mon, 12 Sep 2011 13:25:01 +0000 (15:25 +0200)
Conflicts:
src/plugins/platforms/wayland/qwaylandnativeinterface.cpp
src/plugins/platforms/wayland/qwaylandnativeinterface.h

Change-Id: I64cf2cefa532ba87a92f632e3595ce6914183e9b

1  2 
src/plugins/platforms/wayland/qwaylandnativeinterface.cpp
src/plugins/platforms/wayland/qwaylandnativeinterface.h
src/plugins/platforms/wayland/qwaylandwindow.cpp
src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp

  ****************************************************************************/
  
  #include "qwaylandnativeinterface.h"
  #include "qwaylanddisplay.h"
  #include "qwaylandwindow.h"
 +#include <QtGui/private/qguiapplication_p.h>
 +#include <QtGui/QScreen>
  
 -#include <QtGui/private/qapplication_p.h>
 -#include <QDebug>
 -
 -void *QWaylandNativeInterface::nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget)
+ #include "windowmanager_integration/qwaylandwindowmanagerintegration.h"
 +void *QWaylandNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window)
  {
      QByteArray lowerCaseResource = resourceString.toLower();
  
  class QWaylandNativeInterface : public QPlatformNativeInterface
  {
  public:
 -    void *nativeResourceForWidget(const QByteArray &resourceString,
 -                                QWidget *widget);
 +    void *nativeResourceForWindow(const QByteArray &resourceString,
 +                                QWindow *window);
  
+     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);
 +    static QWaylandScreen *qPlatformScreenForWindow(QWindow *window);
+ private:
+     QHash<QPlatformWindow*, QVariantMap> m_windowProperties;
  };
  
  
  ****************************************************************************/
  
  #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)
@@@ -120,3 -220,45 +219,45 @@@ void QWaylandWindowManagerIntegration::
      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;
+ }