Remove the window_manager_integration object.
authorJørgen Lind <jorgen.lind@nokia.com>
Tue, 13 Dec 2011 11:41:02 +0000 (12:41 +0100)
committerLaszlo Agocs <laszlo.p.agocs@nokia.com>
Tue, 13 Dec 2011 12:06:39 +0000 (13:06 +0100)
We don't need a wl_object anymore for registering the callbacks

Also did some additional cleanups, and removed the static instance since
we can just get the windowmamager instance from the compositor object

Change-Id: I772822f42006aba709f9f967ae293903415e21bc
Reviewed-by: Laszlo Agocs <laszlo.p.agocs@nokia.com>
src/compositor/wayland_wrapper/wlcompositor.cpp
src/compositor/wayland_wrapper/wlcompositor.h
src/compositor/wayland_wrapper/wlsurface.cpp
src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp
src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h

index 1680947..1dc2a87 100644 (file)
@@ -134,8 +134,8 @@ Compositor::Compositor(WaylandCompositor *qt_compositor)
     if (window && window->surfaceType() != QWindow::RasterSurface)
         m_graphics_hw_integration = GraphicsHardwareIntegration::createGraphicsHardwareIntegration(qt_compositor);
 #endif
-    m_windowManagerWaylandProtocol = new WindowManagerServerIntegration(this);
-    connect(m_windowManagerWaylandProtocol,
+    m_windowManagerIntegration = new WindowManagerServerIntegration(this);
+    connect(m_windowManagerIntegration,
             SIGNAL(windowPropertyChanged(wl_client*,wl_surface*,QString,QVariant)),
             SLOT(windowPropertyChanged(wl_client*,wl_surface*,QString,QVariant)));
 
@@ -195,7 +195,7 @@ void Compositor::createSurface(struct wl_client *client, int id)
     QList<struct wl_client *> prevClientList = clients();
     m_surfaces << surface;
     if (!prevClientList.contains(client)) {
-        m_windowManagerWaylandProtocol->setScreenOrientation(client, m_output.base(), m_orientation);
+        m_windowManagerIntegration->setScreenOrientation(client, m_output.base(), m_orientation);
         emit clientAdded(client);
     }
 
@@ -291,7 +291,7 @@ void Compositor::destroyClientForSurface(Surface *surface)
     wl_client *client = surface->base()->resource.client;
 
     if (client) {
-        m_windowManagerWaylandProtocol->removeClient(client);
+        m_windowManagerIntegration->removeClient(client);
         wl_client_destroy(client);
     }
 }
@@ -349,7 +349,7 @@ void Compositor::initializeHardwareIntegration()
 
 void Compositor::initializeWindowManagerProtocol()
 {
-    m_windowManagerWaylandProtocol->initialize(m_display);
+    m_windowManagerIntegration->initialize(m_display);
 }
 
 bool Compositor::setDirectRenderSurface(Surface *surface)
@@ -383,7 +383,7 @@ void Compositor::setScreenOrientation(Qt::ScreenOrientation orientation)
     QList<struct wl_client*> clientList = clients();
     for (int i = 0; i < clientList.length(); ++i) {
         struct wl_client *client = clientList.at(i);
-        m_windowManagerWaylandProtocol->setScreenOrientation(client, m_output.base(), orientation);
+        m_windowManagerIntegration->setScreenOrientation(client, m_output.base(), orientation);
     }
 }
 
index a95916d..bfe5d15 100644 (file)
@@ -104,12 +104,14 @@ public:
 
     WaylandCompositor *qtCompositor() const { return m_qt_compositor; }
 
-    struct wl_display *wl_display() { return m_display->handle(); }
+    struct wl_display *wl_display() const { return m_display->handle(); }
 
     static Compositor *instance();
 
     QList<struct wl_client *> clients() const;
 
+    WindowManagerServerIntegration *windowManagerIntegration() const { return m_windowManagerIntegration; }
+
     void setScreenOrientation(Qt::ScreenOrientation orientation);
     void setOutputGeometry(const QRect &geometry);
 
@@ -163,7 +165,7 @@ private:
 #ifdef QT_COMPOSITOR_WAYLAND_GL
     GraphicsHardwareIntegration *m_graphics_hw_integration;
 #endif
-    WindowManagerServerIntegration *m_windowManagerWaylandProtocol;
+    WindowManagerServerIntegration *m_windowManagerIntegration;
 
     static void bind_func(struct wl_client *client, void *data,
                           uint32_t version, uint32_t id);
index 1edbeb7..28cbf5e 100644 (file)
@@ -327,7 +327,7 @@ void Surface::setProcessId(qint64 processId)
 QByteArray Surface::authenticationToken() const
 {
     Q_D(const Surface);
-    return WindowManagerServerIntegration::instance()->managedClient(d->client)->authenticationToken();
+    return d->compositor->windowManagerIntegration()->managedClient(d->client)->authenticationToken();
 }
 
 QVariantMap Surface::windowProperties() const
@@ -348,7 +348,7 @@ void Surface::setWindowProperty(const QString &name, const QVariant &value, bool
     Q_D(Surface);
     d->windowProperties.insert(name, value);
     if (writeUpdateToClient)
-        WindowManagerServerIntegration::instance()->setWindowProperty(d->client, base(), name, value);
+        d->compositor->windowManagerIntegration()->setWindowProperty(d->client, base(), name, value);
 }
 
 uint32_t toWaylandButton(Qt::MouseButton button)
@@ -502,7 +502,7 @@ void Surface::sendOnScreenVisibilityChange(bool visible)
 {
 #ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT
     Q_D(Surface);
-    WindowManagerServerIntegration::instance()->setVisibilityOnScreen(d->client, visible);
+    d->compositor->windowManagerIntegration()->setVisibilityOnScreen(d->client, visible);
 #endif
 }
 
index a461944..90375e1 100644 (file)
 #include "wayland-server.h"
 #include "wayland-windowmanager-server-protocol.h"
 
-class WindowManagerObject
-{
-public:
-
-    void mapClientToProcess(wl_client *client, uint32_t processId)
-    {
-        WindowManagerServerIntegration::instance()->mapClientToProcess(client, processId);
-    }
-
-    void authenticateWithToken(wl_client *client, const char *authenticationToken)
-    {
-        WindowManagerServerIntegration::instance()->authenticateWithToken(client, authenticationToken);
-    }
-
-    void changeScreenVisibility(wl_client *client, int visible)
-    {
-        WindowManagerServerIntegration::instance()->setVisibilityOnScreen(client, visible);
-    }
-
-    void updateWindowProperty(wl_client *client, wl_surface *surface, const char *name, struct wl_array *value)
-    {
-        WindowManagerServerIntegration::instance()->updateWindowProperty(client, surface, name, value);
-    }
-
-    static void bind_func(struct wl_client *client, void *data,
-                                          uint32_t version, uint32_t id);
-
-    static void destroy_resource(wl_resource *resource);
-
-    struct wl_resource *getWindowManagerResourceForClient(struct wl_client *client) {
-        for (int i = 0; i < m_client_resources.size(); i++) {
-            if (m_client_resources.at(i)->client == client) {
-                return m_client_resources.at(i);
-            }
-        }
-        return 0;
-    }
-
-private:
-    QList<struct wl_resource *>m_client_resources;
-
-};
-
-void map_client_to_process(wl_client *client, struct wl_resource *windowMgrResource, uint32_t processId)
+WindowManagerServerIntegration::WindowManagerServerIntegration(QObject *parent)
+    : QObject(parent)
 {
-    WindowManagerObject *windowMgr = static_cast<WindowManagerObject *>(windowMgrResource->data);
-    windowMgr->mapClientToProcess(client,processId);
 }
 
-void authenticate_with_token(wl_client *client, struct wl_resource *windowMgrResource, const char *wl_authentication_token)
+void WindowManagerServerIntegration::initialize(Wayland::Display *waylandDisplay)
 {
-    WindowManagerObject *windowMgr = static_cast<WindowManagerObject *>(windowMgrResource->data);
-    windowMgr->authenticateWithToken(client,wl_authentication_token);
+    wl_display_add_global(waylandDisplay->handle(),&wl_windowmanager_interface,this,WindowManagerServerIntegration::bind_func);
 }
 
-void update_generic_property(wl_client *client, struct wl_resource *windowMgrResource, wl_resource *surfaceResource, const char *name, struct wl_array *value)
+void WindowManagerServerIntegration::removeClient(wl_client *client)
 {
-    WindowManagerObject *windowMgr = static_cast<WindowManagerObject *>(windowMgrResource->data);
-    struct wl_surface *surface = static_cast<struct wl_surface *>(surfaceResource->data);
-    windowMgr->updateWindowProperty(client,surface,name,value);
+    WaylandManagedClient *managedClient = m_managedClients.take(client);
+    delete managedClient;
 }
 
-const static struct wl_windowmanager_interface windowmanager_interface = {
-    map_client_to_process,
-    authenticate_with_token,
-    update_generic_property
-};
-
-void WindowManagerObject::bind_func(struct wl_client *client, void *data,
-                                      uint32_t version, uint32_t id)
+WaylandManagedClient *WindowManagerServerIntegration::managedClient(wl_client *client) const
 {
-    Q_UNUSED(version);
-    WindowManagerObject *win_mgr_object= static_cast<WindowManagerObject *>(data);
-    struct wl_resource *resource = wl_client_add_object(client,&wl_windowmanager_interface,&windowmanager_interface,id,data);
-    resource->destroy = destroy_resource;
-    win_mgr_object->m_client_resources.append(resource);
-    qDebug("wm bind client %p resource %p", client, resource);
+    return m_managedClients.value(client, 0);
 }
 
-void WindowManagerObject::destroy_resource(wl_resource *resource)
+void WindowManagerServerIntegration::setVisibilityOnScreen(wl_client *client, bool visible)
 {
-    qDebug("wm destroy resource %p", resource);
-    WindowManagerObject *win_mgr_object = static_cast<WindowManagerObject *>(resource->data);
-    win_mgr_object->m_client_resources.removeOne(resource);
-    free(resource);
+    struct wl_resource *win_mgr_resource  = getWindowManagerResourceForClient(client);
+    wl_resource_post_event(win_mgr_resource,WL_WINDOWMANAGER_CLIENT_ONSCREEN_VISIBILITY,visible);
 }
 
-WindowManagerServerIntegration *WindowManagerServerIntegration::m_instance = 0;
-
-WindowManagerServerIntegration::WindowManagerServerIntegration(QObject *parent)
-    : QObject(parent)
+void WindowManagerServerIntegration::setScreenOrientation(wl_client *client, wl_object *output, Qt::ScreenOrientation orientation)
 {
-    m_instance = this;
+    struct wl_resource *win_mgr_resource  = getWindowManagerResourceForClient(client);
+    wl_resource_post_event(win_mgr_resource,WL_WINDOWMANAGER_SET_SCREEN_ROTATION,output, qint32(orientation));
 }
 
-void WindowManagerServerIntegration::initialize(Wayland::Display *waylandDisplay)
+// client -> server
+void WindowManagerServerIntegration::updateWindowProperty(wl_client *client, wl_surface *surface, const char *name, struct wl_array *value)
 {
-    m_windowManagerObject = new WindowManagerObject();
-    wl_display_add_global(waylandDisplay->handle(),&wl_windowmanager_interface,m_windowManagerObject,WindowManagerObject::bind_func);
+    QVariant variantValue;
+    QByteArray byteValue((const char*)value->data, value->size);
+    QDataStream ds(&byteValue, QIODevice::ReadOnly);
+    ds >> variantValue;
+
+    emit windowPropertyChanged(client, surface, QString(name), variantValue);
 }
 
-void WindowManagerServerIntegration::removeClient(wl_client *client)
+// server -> client
+void WindowManagerServerIntegration::setWindowProperty(wl_client *client, wl_surface *surface, const QString &name, const QVariant &value)
 {
-    WaylandManagedClient *managedClient = m_managedClients.take(client);
-    delete managedClient;
+    QByteArray byteValue;
+    QDataStream ds(&byteValue, QIODevice::WriteOnly);
+    ds << value;
+    wl_array data;
+    data.size = byteValue.size();
+    data.data = (void*) byteValue.constData();
+    data.alloc = 0;
+
+    struct wl_resource *win_mgr_resource = getWindowManagerResourceForClient(client);
+    wl_resource_post_event(win_mgr_resource,WL_WINDOWMANAGER_SET_GENERIC_PROPERTY,surface, name.toLatin1().constData(),&data);
 }
 
+
 void WindowManagerServerIntegration::mapClientToProcess(wl_client *client, uint32_t processId)
 {
     WaylandManagedClient *managedClient = m_managedClients.value(client, new WaylandManagedClient);
@@ -173,54 +126,67 @@ void WindowManagerServerIntegration::authenticateWithToken(wl_client *client, co
     emit clientAuthenticated(client);
 }
 
-void WindowManagerServerIntegration::setVisibilityOnScreen(wl_client *client, bool visible)
+struct wl_resource *WindowManagerServerIntegration::getWindowManagerResourceForClient(wl_client *client) const
 {
-    struct wl_resource *win_mgr_resource  = m_windowManagerObject->getWindowManagerResourceForClient(client);
-    wl_resource_post_event(win_mgr_resource,WL_WINDOWMANAGER_CLIENT_ONSCREEN_VISIBILITY,visible);
+    for (int i = 0; i < m_client_resources.size(); i++) {
+        if (m_client_resources.at(i)->client == client) {
+            return m_client_resources.at(i);
+        }
+    }
+    return 0;
 }
 
-void WindowManagerServerIntegration::setScreenOrientation(wl_client *client, wl_object *output, Qt::ScreenOrientation orientation)
+void WindowManagerServerIntegration::bind_func(struct wl_client *client, void *data,
+                                      uint32_t version, uint32_t id)
 {
-    struct wl_resource *win_mgr_resource  = m_windowManagerObject->getWindowManagerResourceForClient(client);
-    wl_resource_post_event(win_mgr_resource,WL_WINDOWMANAGER_SET_SCREEN_ROTATION,output, qint32(orientation));
+    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);
+    resource->destroy = destroy_resource;
+    win_mgr->m_client_resources.append(resource);
 }
 
-// client -> server
-void WindowManagerServerIntegration::updateWindowProperty(wl_client *client, wl_surface *surface, const char *name, struct wl_array *value)
+void WindowManagerServerIntegration::destroy_resource(wl_resource *win_mgr_integration_resource)
 {
-    QVariant variantValue;
-    QByteArray byteValue((const char*)value->data, value->size);
-    QDataStream ds(&byteValue, QIODevice::ReadOnly);
-    ds >> variantValue;
-
-    emit windowPropertyChanged(client, surface, QString(name), variantValue);
+    WindowManagerServerIntegration *win_mgr = static_cast<WindowManagerServerIntegration *>(win_mgr_integration_resource->data);
+    win_mgr->m_client_resources.removeOne(win_mgr_integration_resource);
+    free(win_mgr_integration_resource);
 }
 
-// server -> client
-void WindowManagerServerIntegration::setWindowProperty(wl_client *client, wl_surface *surface, const QString &name, const QVariant &value)
+void WindowManagerServerIntegration::map_client_to_process(struct wl_client *client,
+                                                           struct wl_resource *window_mgr_resource,
+                                                           uint32_t process_id)
 {
-    QByteArray byteValue;
-    QDataStream ds(&byteValue, QIODevice::WriteOnly);
-    ds << value;
-    wl_array data;
-    data.size = byteValue.size();
-    data.data = (void*) byteValue.constData();
-    data.alloc = 0;
-
-    struct wl_resource *win_mgr_resource = m_windowManagerObject->getWindowManagerResourceForClient(client);
-    wl_resource_post_event(win_mgr_resource,WL_WINDOWMANAGER_SET_GENERIC_PROPERTY,surface, name.toLatin1().constData(),&data);
+    WindowManagerServerIntegration *window_mgr = static_cast<WindowManagerServerIntegration *>(window_mgr_resource->data);
+    window_mgr->mapClientToProcess(client,process_id);
 }
 
-WaylandManagedClient *WindowManagerServerIntegration::managedClient(wl_client *client) const
+void WindowManagerServerIntegration::authenticate_with_token(struct wl_client *client,
+                                                             struct wl_resource *window_mgr_resource,
+                                                             const char *wl_authentication_token)
 {
-    return m_managedClients.value(client, 0);
+    WindowManagerServerIntegration *window_mgr = static_cast<WindowManagerServerIntegration *>(window_mgr_resource->data);
+    window_mgr->authenticateWithToken(client,wl_authentication_token);
 }
 
-WindowManagerServerIntegration *WindowManagerServerIntegration::instance()
+void WindowManagerServerIntegration::update_generic_property(struct wl_client *client,
+                                                             struct wl_resource *window_mgr_resource,
+                                                             wl_resource *surface_resource,
+                                                             const char *name,
+                                                             struct wl_array *value)
 {
-    return m_instance;
+    WindowManagerServerIntegration *window_mgr = static_cast<WindowManagerServerIntegration *>(window_mgr_resource->data);
+    struct wl_surface *surface = static_cast<struct wl_surface *>(surface_resource->data);
+    window_mgr->updateWindowProperty(client,surface,name,value);
 }
 
+const struct wl_windowmanager_interface WindowManagerServerIntegration::windowmanager_interface = {
+    WindowManagerServerIntegration::map_client_to_process,
+    WindowManagerServerIntegration::authenticate_with_token,
+    WindowManagerServerIntegration::update_generic_property
+};
+
+
 /// ///
 /// / WaylandManagedClient
 /// ///
index 201bece..1ac4496 100644 (file)
@@ -66,7 +66,6 @@ class Q_COMPOSITOR_EXPORT WindowManagerServerIntegration : public QObject
     Q_OBJECT
 public:
     WindowManagerServerIntegration(QObject *parent = 0);
-    static WindowManagerServerIntegration *instance();
     void initialize(Wayland::Display *waylandDisplay);
     void removeClient(wl_client *client);
 
@@ -74,7 +73,6 @@ public:
 
     void setVisibilityOnScreen(wl_client *client, bool visible);
     void setScreenOrientation(wl_client *client, wl_object *output, Qt::ScreenOrientation orientationInDegrees);
-    void updateOrientation(wl_client *client);
 
     void updateWindowProperty(wl_client *client, struct wl_surface *surface, const char *name, struct wl_array *value);
     void setWindowProperty(wl_client *client, struct wl_surface *surface, const QString &name, const QVariant &value);
@@ -89,13 +87,28 @@ private:
 
 private:
     QMap<wl_client*, WaylandManagedClient*> m_managedClients;
-    static WindowManagerServerIntegration *m_instance;
 
-    WindowManagerObject *m_windowManagerObject;
-
-    friend class WindowManagerObject;
+    QList<struct wl_resource *>m_client_resources;
+    struct wl_resource *getWindowManagerResourceForClient(struct wl_client *client) const;
+
+    static void bind_func(struct wl_client *client, void *data,
+                                          uint32_t version, uint32_t id);
+
+    static void destroy_resource(wl_resource *resource);
+    static void map_client_to_process(struct wl_client *client,
+                                      struct wl_resource *windowMgrResource,
+                                      uint32_t processId);
+    static void authenticate_with_token(struct wl_client *client,
+                                        struct wl_resource *windowMgrResource,
+                                        const char *wl_authentication_token);
+    static void update_generic_property(struct wl_client *client,
+                                        struct wl_resource *windowMgrResource,
+                                        struct wl_resource *surfaceResource,
+                                        const char *name, struct wl_array *value);
+    static const struct wl_windowmanager_interface windowmanager_interface;
 };
 
+
 class WaylandManagedClient
 {
 public: