Documente Academic
Documente Profesional
Documente Cultură
if (!m_server->tryConnect())
qFatal("Failed to connect to server");
- AmbienteScreen *screen = new AmbienteScreen();
- m_screens.append(screen);
+ m_screen = new AmbienteScreen();
}
bool AmbienteIntegration::hasCapability(QPlatformIntegration::Capability cap) c
onst
@@ -37,19 +36,27 @@ QPixmapData *AmbienteIntegration::createPixmapData(QPixmapDa
ta::PixelType type)
QPlatformWindow *AmbienteIntegration::createPlatformWindow(QWidget *widget, WId
winId) const
{
Q_UNUSED(winId);
+
AmbienteWindow *window = new AmbienteWindow(widget);
+ m_screen->addWindow(window);
return window;
}
#endif
diff --git a/platformplugin/ambientewindowsurface.cpp b/platformplugin/ambientew
indowsurface.cpp
index 10879d8..6744a21 100644
--- a/platformplugin/ambientewindowsurface.cpp
+++ b/platformplugin/ambientewindowsurface.cpp
@@ -3,6 +3,7 @@
// Own
#include "ambienteintegration.h"
+#include "ambientewindow.h"
#include "windowsystemserver.h"
#include "protocol.h"
@@ -14,6 +15,8 @@ AmbienteWindowSurface::AmbienteWindowSurface(QWidget *window,
AmbienteIntegratio
: QWindowSurface(window)
, m_integrator(integrator)
{
+ m_platformWindow = static_cast<AmbienteWindow *>(window->platformWindow());
+
WindowSystemServer *server = integrator->server();
Request request(Request::CreateWindowRequest, integrator->parentWindowId(wi
ndow));
@@ -40,6 +43,8 @@ void AmbienteWindowSurface::flush(QWidget *widget, const QRegi
on ®ion, const
Q_UNUSED(region);
Q_UNUSED(offset);
+ m_platformWindow->repaint(region);
+
Request request(Request::UpdateWindowRequest, m_id);
m_integrator->server()->sendRequest(request);
}
@@ -70,6 +75,9 @@ void AmbienteWindowSurface::resize(const QSize &size)
void AmbienteWindowSurface::beginPaint(const QRegion ®ion)
{
Q_UNUSED(region);
+
+ QWindowSurface::beginPaint(region);
+
if (m_shared.lock() && m_shared.data())
m_image = QImage((uchar*)m_shared.data(), geometry().width(), geometry(
).height(), m_integrator->screens().first()->format());
}
@@ -77,6 +85,9 @@ void AmbienteWindowSurface::beginPaint(const QRegion ®ion)
void AmbienteWindowSurface::endPaint(const QRegion ®ion)
{
Q_UNUSED(region);
+
+ QWindowSurface::endPaint(region);
+
if (m_shared.unlock())
m_image = QImage();
}
diff --git a/platformplugin/ambientewindowsurface.h b/platformplugin/ambientewin
dowsurface.h
index 3d7a80e..1727426 100644
--- a/platformplugin/ambientewindowsurface.h
+++ b/platformplugin/ambientewindowsurface.h
@@ -7,6 +7,7 @@
#include <QtGui/private/qwindowsurface_p.h>
class AmbienteIntegration;
+class AmbienteWindow;
class AmbienteWindowSurface: public QWindowSurface
{
@@ -24,6 +25,8 @@ public:
inline quint32 id() const { return m_id; }
private:
+ AmbienteWindow *m_platformWindow;
+
quint32 m_id;
AmbienteIntegration *m_integrator;
QSharedMemory m_shared;
diff --git a/platformplugin/windowsystemserver.cpp b/platformplugin/windowsystem
server.cpp
index d2d5287..cb8b10a 100644
--- a/platformplugin/windowsystemserver.cpp
+++ b/platformplugin/windowsystemserver.cpp
@@ -10,10 +10,13 @@
#include <QApplication>
#include <QDataStream>
#include <QWindowSystemInterface>
+#include <QtGui/private/qapplication_p.h>
-WindowSystemServer::WindowSystemServer(AmbienteIntegration *integrator)
- : QObject()
- , m_integrator(integrator)
+static WindowSystemServer *self = NULL;
+
+WindowSystemServer::WindowSystemServer():
+ QObject(),
+ m_integrator(NULL)
{
}
@@ -32,6 +35,9 @@ bool WindowSystemServer::tryConnect()
bool WindowSystemServer::sendRequest(const Request &request)
{
+ if (!m_integrator)
+ m_integrator = static_cast<AmbienteIntegration *>(QApplicationPrivate::
platformIntegration());
+
QDataStream s(&m_socket);
s << (*static_cast<const Message *>(&request));
return m_socket.isValid();
@@ -54,6 +60,13 @@ bool WindowSystemServer::waitForResponse(Response &response)
return false;
}
+WindowSystemServer *WindowSystemServer::instance()
+{
+ if (!self)
+ self = new WindowSystemServer;
+ return self;
+}
+
void WindowSystemServer::eventDispatcher()
{
while (m_socket.bytesAvailable())
diff --git a/platformplugin/windowsystemserver.h b/platformplugin/windowsystemse
rver.h
index 7469c98..805d3b1 100644
--- a/platformplugin/windowsystemserver.h
+++ b/platformplugin/windowsystemserver.h
@@ -12,13 +12,16 @@ class WindowSystemServer: public QObject
{
Q_OBJECT
-public:
- WindowSystemServer(AmbienteIntegration *integrator);
+private:
+ WindowSystemServer();
+public:
bool tryConnect();
bool sendRequest(const Request &request);
bool waitForResponse(Response &response);
+ static WindowSystemServer *instance();
+
private slots:
void eventDispatcher();