diff options
Diffstat (limited to 'src/plugins/platforms/xcb')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbcursor.cpp | 17 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbcursor.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbintegration.cpp | 5 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbnativeinterface.cpp | 19 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbnativeinterface.h | 4 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 18 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/xcb.pro | 5 |
7 files changed, 45 insertions, 25 deletions
diff --git a/src/plugins/platforms/xcb/qxcbcursor.cpp b/src/plugins/platforms/xcb/qxcbcursor.cpp index 0510c1db5b..c1cfbd02d6 100644 --- a/src/plugins/platforms/xcb/qxcbcursor.cpp +++ b/src/plugins/platforms/xcb/qxcbcursor.cpp @@ -508,16 +508,16 @@ xcb_cursor_t QXcbCursor::createBitmapCursor(QCursor *cursor) return c; } -void QXcbCursor::queryPointer(xcb_connection_t *conn, xcb_window_t *rootWin, QPoint *pos, int *keybMask) +void QXcbCursor::queryPointer(QXcbConnection *c, xcb_window_t *rootWin, QPoint *pos, int *keybMask) { if (pos) *pos = QPoint(); - xcb_screen_iterator_t it = xcb_setup_roots_iterator(xcb_get_setup(conn)); + xcb_screen_iterator_t it = xcb_setup_roots_iterator(c->setup()); while (it.rem) { xcb_window_t root = it.data->root; - xcb_query_pointer_cookie_t cookie = xcb_query_pointer(conn, root); + xcb_query_pointer_cookie_t cookie = xcb_query_pointer(c->xcb_connection(), root); xcb_generic_error_t *err = 0; - xcb_query_pointer_reply_t *reply = xcb_query_pointer_reply(conn, cookie, &err); + xcb_query_pointer_reply_t *reply = xcb_query_pointer_reply(c->xcb_connection(), cookie, &err); if (!err && reply) { if (pos) *pos = QPoint(reply->root_x, reply->root_y); @@ -537,17 +537,16 @@ void QXcbCursor::queryPointer(xcb_connection_t *conn, xcb_window_t *rootWin, QPo QPoint QXcbCursor::pos() const { QPoint p; - queryPointer(xcb_connection(), 0, &p); + queryPointer(connection(), 0, &p); return p; } void QXcbCursor::setPos(const QPoint &pos) { - xcb_connection_t *conn = xcb_connection(); xcb_window_t root; - queryPointer(conn, &root, 0); - xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0, pos.x(), pos.y()); - xcb_flush(conn); + queryPointer(connection(), &root, 0); + xcb_warp_pointer(xcb_connection(), XCB_NONE, root, 0, 0, 0, 0, pos.x(), pos.y()); + xcb_flush(xcb_connection()); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbcursor.h b/src/plugins/platforms/xcb/qxcbcursor.h index 9726c5955a..4c74034988 100644 --- a/src/plugins/platforms/xcb/qxcbcursor.h +++ b/src/plugins/platforms/xcb/qxcbcursor.h @@ -56,7 +56,7 @@ public: QPoint pos() const; void setPos(const QPoint &pos); - static void queryPointer(xcb_connection_t *conn, xcb_window_t *rootWin, QPoint *pos, int *keybMask = 0); + static void queryPointer(QXcbConnection *c, xcb_window_t *rootWin, QPoint *pos, int *keybMask = 0); private: xcb_cursor_t createFontCursor(int cshape); diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 5170ff9e10..2ffe53c04b 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -216,6 +216,7 @@ bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const #endif case ThreadedOpenGL: return false; case WindowMasks: return true; + case MultipleWindows: return true; default: return QPlatformIntegration::hasCapability(cap); } } @@ -275,8 +276,8 @@ QPlatformServices *QXcbIntegration::services() const Qt::KeyboardModifiers QXcbIntegration::queryKeyboardModifiers() const { int keybMask = 0; - QXcbConnection* conn = m_connections.at(0); - QXcbCursor::queryPointer(conn->xcb_connection(), 0, 0, &keybMask); + QXcbConnection *conn = m_connections.at(0); + QXcbCursor::queryPointer(conn, 0, 0, &keybMask); return conn->keyboard()->translateModifiers(keybMask); } diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp index 2a36fb7369..fa5f5f43d0 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp @@ -53,6 +53,8 @@ #if defined(XCB_USE_EGL) #include "QtPlatformSupport/private/qeglplatformcontext_p.h" +#elif defined (XCB_USE_GLX) +#include "qglxintegration.h" #endif QT_BEGIN_NAMESPACE @@ -68,6 +70,7 @@ public: insert("connection",QXcbNativeInterface::Connection); insert("screen",QXcbNativeInterface::Screen); insert("eglcontext",QXcbNativeInterface::EglContext); + insert("glxcontext",QXcbNativeInterface::GLXContext); } }; @@ -91,6 +94,9 @@ void *QXcbNativeInterface::nativeResourceForContext(const QByteArray &resourceSt case EglContext: result = eglContextForContext(context); break; + case GLXContext: + result = glxContextForContext(context); + break; default: break; } @@ -191,4 +197,17 @@ void * QXcbNativeInterface::eglContextForContext(QOpenGLContext *context) #endif } +void *QXcbNativeInterface::glxContextForContext(QOpenGLContext *context) +{ + Q_ASSERT(context); +#if defined(XCB_USE_GLX) + QGLXContext *glxPlatformContext = static_cast<QGLXContext *>(context->handle()); + return glxPlatformContext->glxContext(); +#else + Q_UNUSED(context); + return 0; +#endif + +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h index 1223fdc39c..c15d00255a 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.h +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h @@ -58,7 +58,8 @@ public: Connection, Screen, GraphicsDevice, - EglContext + EglContext, + GLXContext }; QXcbNativeInterface(); @@ -76,6 +77,7 @@ public: void *screenForWindow(QWindow *window); void *graphicsDeviceForWindow(QWindow *window); static void *eglContextForContext(QOpenGLContext *context); + static void *glxContextForContext(QOpenGLContext *context); private: const QByteArray m_genericEventFilterType; diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 48754b0a60..eab18e2435 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -542,16 +542,18 @@ void QXcbWindow::show() propagateSizeHints(); // update WM_TRANSIENT_FOR - if (window()->transientParent() && isTransient(window())) { - QXcbWindow *transientXcbParent = static_cast<QXcbWindow *>(window()->transientParent()->handle()); - if (transientXcbParent) { - // ICCCM 4.1.2.6 - xcb_window_t parentWindow = transientXcbParent->xcb_window(); - - // todo: set transient for group (wm_client_leader) if no parent, a la qwidget_x11.cpp + if (isTransient(window())) { + xcb_window_t transientXcbParent = 0; + if (const QWindow *tp = window()->transientParent()) + transientXcbParent = static_cast<const QXcbWindow *>(tp->handle())->winId(); + // Default to client leader if there is no transient parent, else modal dialogs can + // be hidden by their parents. + if (!transientXcbParent) + transientXcbParent = static_cast<QXcbScreen *>(screen())->clientLeader(); + if (transientXcbParent) { // ICCCM 4.1.2.6 Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window, XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32, - 1, &parentWindow)); + 1, &transientXcbParent)); } } diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro index 58521686aa..34f7c74675 100644 --- a/src/plugins/platforms/xcb/xcb.pro +++ b/src/plugins/platforms/xcb/xcb.pro @@ -1,7 +1,7 @@ TARGET = xcb +PLUGIN_TYPE = platforms load(qt_plugin) -QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms QT += core-private gui-private platformsupport-private @@ -110,6 +110,3 @@ LIBS += -ldbus-1 } OTHER_FILES += xcb.json - -target.path += $$[QT_INSTALL_PLUGINS]/platforms -INSTALLS += target |