74 m_connection = connection;
77 const xcb_query_extension_reply_t *reply = xcb_get_extension_data(m_connection->xcb_connection(), &xcb_glx_id);
78 if (!reply || !reply->present)
81 m_glx_first_event = reply->first_event;
83 auto xglx_query = Q_XCB_REPLY(xcb_glx_query_version, m_connection->xcb_connection(),
84 XCB_GLX_MAJOR_VERSION,
85 XCB_GLX_MINOR_VERSION);
87 || (QVersionNumber(xglx_query->major_version, xglx_query->minor_version)
88 < QVersionNumber(QT_XCB_GLX_REQUIRED_MAJOR, QT_XCB_GLX_REQUIRED_MINOR))) {
89 qCWarning(lcQpaGl) <<
"QXcbConnection: Failed to initialize GLX";
94 m_native_interface_handler.reset(
new QXcbGlxNativeInterfaceHandler(connection->nativeInterface()));
96 qCDebug(lcQpaGl) <<
"Xcb GLX gl-integration successfully initialized";
102 bool handled =
false;
105 Display *xdisplay =
static_cast<Display *>(m_connection->xlib_display());
106 XLockDisplay(xdisplay);
108 Bool (*proc)(Display*, XEvent*, xEvent*) = XESetWireToEvent(xdisplay, responseType,
nullptr);
110 XESetWireToEvent(xdisplay, responseType, proc);
112 event->sequence = LastKnownRequestProcessed(xdisplay);
113 if (proc(xdisplay, &dummy, (xEvent*)event)) {
114#if QT_CONFIG(xcb_glx)
120 const uint swap_complete = m_glx_first_event + XCB_GLX_BUFFER_SWAP_COMPLETE;
121 QAbstractEventDispatcher* dispatcher = QAbstractEventDispatcher::instance();
122 if (dispatcher && uint(dummy.type) == swap_complete && responseType != swap_complete) {
123 QGLXBufferSwapComplete *xev =
reinterpret_cast<QGLXBufferSwapComplete *>(&dummy);
124 xcb_glx_buffer_swap_complete_event_t ev;
125 memset(&ev, 0,
sizeof(xcb_glx_buffer_swap_complete_event_t));
126 ev.response_type = xev->type;
127 ev.sequence = xev->serial;
128 ev.event_type = xev->event_type;
129 ev.drawable = xev->drawable;
130 ev.ust_hi = xev->ust >> 32;
131 ev.ust_lo = xev->ust & 0xffffffff;
132 ev.msc_hi = xev->msc >> 32;
133 ev.msc_lo = xev->msc & 0xffffffff;
134 ev.sbc = xev->sbc & 0xffffffff;
136 XUnlockDisplay(xdisplay);
138 auto eventType = m_connection->nativeInterface()->nativeEventType();
140 handled = dispatcher->filterNativeEvent(eventType, &ev, &result);
146 XUnlockDisplay(xdisplay);
162QOpenGLContext *
QXcbGlxIntegration::createOpenGLContext(GLXContext glxContext,
void *visualInfo, QOpenGLContext *shareContext)
const
167 QPlatformOpenGLContext *shareHandle = shareContext ? shareContext->handle() :
nullptr;
169 auto *context =
new QOpenGLContext;
170 auto *contextPrivate = QOpenGLContextPrivate::get(context);
171 auto *display =
static_cast<Display *>(m_connection->xlib_display());
172 contextPrivate->adopt(
new QGLXContext(display, glxContext, visualInfo, shareHandle));
206 static bool vendorChecked =
false;
207 static bool isSwitchableWidgetCompositionAvailable =
true;
208 if (!vendorChecked) {
209 vendorChecked =
true;
210 Display *display = glXGetCurrentDisplay();
212 display =
static_cast<Display *>(m_connection->xlib_display());
214 const char *glxvendor = glXGetClientString(display, GLX_VENDOR);
216 if (!strcmp(glxvendor,
"Parallels Inc"))
217 isSwitchableWidgetCompositionAvailable =
false;
221 return isSwitchableWidgetCompositionAvailable;