diff options
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbintegration.cpp')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbintegration.cpp | 147 |
1 files changed, 96 insertions, 51 deletions
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 12b63f36ea..a512fb2e19 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -43,76 +43,131 @@ #include "qxcbconnection.h" #include "qxcbscreen.h" #include "qxcbwindow.h" -#include "qxcbwindowsurface.h" +#include "qxcbbackingstore.h" #include "qxcbnativeinterface.h" +#include "qxcbclipboard.h" +#include "qxcbdrag.h" #include <xcb/xcb.h> -#include <private/qpixmap_raster_p.h> - -#include "qgenericunixfontdatabase.h" +#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h> +#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h> #include <stdio.h> +//this has to be included before egl, since egl pulls in X headers +#include <QtGui/private/qguiapplication_p.h> + #ifdef XCB_USE_EGL #include <EGL/egl.h> #endif -QXcbIntegration::QXcbIntegration() - : m_connection(new QXcbConnection) +#if defined(XCB_USE_IBUS) +#include "QtPlatformSupport/qibusplatforminputcontext.h" +#endif + +#if defined(XCB_USE_GLX) +#include "qglxintegration.h" +#elif defined(XCB_USE_EGL) +#include "qxcbeglsurface.h" +#include <QtPlatformSupport/private/qeglplatformcontext_p.h> +#endif + +#include <QtGui/QGuiGLContext> +#include <QtGui/QScreen> + +QXcbIntegration::QXcbIntegration(const QStringList ¶meters) + : m_eventDispatcher(createUnixEventDispatcher()) { - foreach (QXcbScreen *screen, m_connection->screens()) - m_screens << screen; + QGuiApplicationPrivate::instance()->setEventDispatcher(m_eventDispatcher); + + m_connections << new QXcbConnection; + + for (int i = 0; i < parameters.size() - 1; i += 2) { + qDebug() << parameters.at(i) << parameters.at(i+1); + QString display = parameters.at(i) + ':' + parameters.at(i+1); + m_connections << new QXcbConnection(display.toAscii().constData()); + } + + foreach (QXcbConnection *connection, m_connections) + foreach (QXcbScreen *screen, connection->screens()) + screenAdded(screen); m_fontDatabase = new QGenericUnixFontDatabase(); m_nativeInterface = new QXcbNativeInterface; + + m_inputContext = 0; +#if defined(XCB_USE_IBUS) + QIBusPlatformInputContext *context = new QIBusPlatformInputContext; + if (context->isValid()) { + m_inputContext = context; + } else { + delete context; + } +#endif } QXcbIntegration::~QXcbIntegration() { - delete m_connection; + qDeleteAll(m_connections); } -bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const +QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const { - switch (cap) { - case ThreadedPixmaps: return true; - case OpenGL: return hasOpenGL(); - default: return QPlatformIntegration::hasCapability(cap); - } + return new QXcbWindow(window); } -QPixmapData *QXcbIntegration::createPixmapData(QPixmapData::PixelType type) const +#if defined(XCB_USE_EGL) +class QEGLXcbPlatformContext : public QEGLPlatformContext { - return new QRasterPixmapData(type); -} +public: + QEGLXcbPlatformContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share, EGLDisplay display) + : QEGLPlatformContext(glFormat, share, display) + { + } + + EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) + { + return static_cast<QXcbWindow *>(surface)->eglSurface()->surface(); + } +}; +#endif -QPlatformWindow *QXcbIntegration::createPlatformWindow(QWidget *widget, WId winId) const +QPlatformGLContext *QXcbIntegration::createPlatformGLContext(QGuiGLContext *context) const { - Q_UNUSED(winId); - return new QXcbWindow(widget); + QXcbScreen *screen = static_cast<QXcbScreen *>(context->screen()->handle()); +#if defined(XCB_USE_GLX) + return new QGLXContext(screen, context->format(), context->shareHandle()); +#elif defined(XCB_USE_EGL) + return new QEGLXcbPlatformContext(context->format(), context->shareHandle(), screen->connection()->egl_display()); +#elif defined(XCB_USE_DRI2) + return new QDri2Context(context->format(), context->shareHandle()); +#endif } -QWindowSurface *QXcbIntegration::createWindowSurface(QWidget *widget, WId winId) const +QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *window) const { - Q_UNUSED(winId); - return new QXcbWindowSurface(widget); + return new QXcbBackingStore(window); } -QList<QPlatformScreen *> QXcbIntegration::screens() const +bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const { - return m_screens; + switch (cap) { + case ThreadedPixmaps: return true; + case OpenGL: return true; + default: return QPlatformIntegration::hasCapability(cap); + } } -void QXcbIntegration::moveToScreen(QWidget *window, int screen) +QAbstractEventDispatcher *QXcbIntegration::guiThreadEventDispatcher() const { - Q_UNUSED(window); - Q_UNUSED(screen); + return m_eventDispatcher; } -bool QXcbIntegration::isVirtualDesktop() +void QXcbIntegration::moveToScreen(QWindow *window, int screen) { - return false; + Q_UNUSED(window); + Q_UNUSED(screen); } QPlatformFontDatabase *QXcbIntegration::fontDatabase() const @@ -120,32 +175,22 @@ QPlatformFontDatabase *QXcbIntegration::fontDatabase() const return m_fontDatabase; } -QPixmap QXcbIntegration::grabWindow(WId window, int x, int y, int width, int height) const +QPlatformNativeInterface * QXcbIntegration::nativeInterface() const { - Q_UNUSED(window); - Q_UNUSED(x); - Q_UNUSED(y); - Q_UNUSED(width); - Q_UNUSED(height); - return QPixmap(); + return m_nativeInterface; } +QPlatformClipboard *QXcbIntegration::clipboard() const +{ + return m_connections.at(0)->clipboard(); +} -bool QXcbIntegration::hasOpenGL() const +QPlatformDrag *QXcbIntegration::drag() const { -#if defined(XCB_USE_GLX) - return true; -#elif defined(XCB_USE_EGL) - return m_connection->hasEgl(); -#elif defined(XCB_USE_DRI2) - if (m_connection->hasSupportForDri2()) { - return true; - } -#endif - return false; + return m_connections.at(0)->drag(); } -QPlatformNativeInterface * QXcbIntegration::nativeInterface() const +QPlatformInputContext *QXcbIntegration::inputContext() const { - return m_nativeInterface; + return m_inputContext; } |