diff options
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbintegration.cpp')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbintegration.cpp | 146 |
1 files changed, 96 insertions, 50 deletions
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 12b63f36ea..7982f8dc0e 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -43,109 +43,155 @@ #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 <QtPlatformSupport/private/qgenericunixprintersupport_p.h> -#include <private/qpixmap_raster_p.h> +#include <xcb/xcb.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) +#define XCB_USE_IBUS +#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_printerSupport(new QGenericUnixPrinterSupport) + , 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 = new QIBusPlatformInputContext; } 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 +{ +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 + +QPlatformGLContext *QXcbIntegration::createPlatformGLContext(QGuiGLContext *context) const { - return new QRasterPixmapData(type); + 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 } -QPlatformWindow *QXcbIntegration::createPlatformWindow(QWidget *widget, WId winId) const +QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *window) const { - Q_UNUSED(winId); - return new QXcbWindow(widget); + return new QXcbBackingStore(window); } -QWindowSurface *QXcbIntegration::createWindowSurface(QWidget *widget, WId winId) const +bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const { - Q_UNUSED(winId); - return new QXcbWindowSurface(widget); + switch (cap) { + case ThreadedPixmaps: return true; + case OpenGL: return true; + default: return QPlatformIntegration::hasCapability(cap); + } } -QList<QPlatformScreen *> QXcbIntegration::screens() const +QAbstractEventDispatcher *QXcbIntegration::guiThreadEventDispatcher() const { - return m_screens; + return m_eventDispatcher; } -void QXcbIntegration::moveToScreen(QWidget *window, int screen) +void QXcbIntegration::moveToScreen(QWindow *window, int screen) { Q_UNUSED(window); Q_UNUSED(screen); } -bool QXcbIntegration::isVirtualDesktop() +QPlatformFontDatabase *QXcbIntegration::fontDatabase() const { - return false; + return m_fontDatabase; } -QPlatformFontDatabase *QXcbIntegration::fontDatabase() const +QPlatformNativeInterface * QXcbIntegration::nativeInterface() const { - return m_fontDatabase; + return m_nativeInterface; } -QPixmap QXcbIntegration::grabWindow(WId window, int x, int y, int width, int height) const +QPlatformPrinterSupport *QXcbIntegration::printerSupport() const { - Q_UNUSED(window); - Q_UNUSED(x); - Q_UNUSED(y); - Q_UNUSED(width); - Q_UNUSED(height); - return QPixmap(); + return m_printerSupport; } +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; } |