Fixed non-GL applications crashing when GLX/EGL initialization fails on xcb.

Change-Id: I5a08d6067272575aa56074aaebe308c3d49299bb
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Samuel Rødal 2012-08-21 17:36:03 +02:00 committed by Qt by Nokia
parent 1ed8251667
commit 015a5e0dca

View File

@ -238,7 +238,7 @@ void QXcbWindow::create()
{ {
#if defined(XCB_USE_GLX) #if defined(XCB_USE_GLX)
XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber(), &m_format); XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber(), &m_format);
if (!visualInfo) if (!visualInfo && window()->surfaceType() == QSurface::OpenGLSurface)
qFatal("Could not initialize GLX"); qFatal("Could not initialize GLX");
#elif defined(XCB_USE_EGL) #elif defined(XCB_USE_EGL)
EGLDisplay eglDisplay = connection()->egl_display(); EGLDisplay eglDisplay = connection()->egl_display();
@ -254,26 +254,30 @@ void QXcbWindow::create()
XVisualInfo *visualInfo; XVisualInfo *visualInfo;
int matchingCount = 0; int matchingCount = 0;
visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount); visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount);
if (!visualInfo) if (!visualInfo && window()->surfaceType() == QSurface::OpenGLSurface)
qFatal("Could not initialize EGL"); qFatal("Could not initialize EGL");
#endif //XCB_USE_GLX #endif //XCB_USE_GLX
m_depth = visualInfo->depth; if (visualInfo) {
m_imageFormat = imageFormatForDepth(m_depth); m_depth = visualInfo->depth;
Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), xcb_parent_id, visualInfo->visual, AllocNone); m_imageFormat = imageFormatForDepth(m_depth);
Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), xcb_parent_id, visualInfo->visual, AllocNone);
XSetWindowAttributes a; XSetWindowAttributes a;
a.background_pixel = WhitePixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber()); a.background_pixel = WhitePixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber());
a.border_pixel = BlackPixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber()); a.border_pixel = BlackPixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber());
a.colormap = cmap; a.colormap = cmap;
m_visualId = visualInfo->visualid; m_visualId = visualInfo->visualid;
m_window = XCreateWindow(DISPLAY_FROM_XCB(this), xcb_parent_id, rect.x(), rect.y(), rect.width(), rect.height(), m_window = XCreateWindow(DISPLAY_FROM_XCB(this), xcb_parent_id, rect.x(), rect.y(), rect.width(), rect.height(),
0, visualInfo->depth, InputOutput, visualInfo->visual, 0, visualInfo->depth, InputOutput, visualInfo->visual,
CWBackPixel|CWBorderPixel|CWColormap, &a); CWBackPixel|CWBorderPixel|CWColormap, &a);
XFree(visualInfo); XFree(visualInfo);
} else }
}
if (!m_window)
#endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL) #endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
{ {
m_window = xcb_generate_id(xcb_connection()); m_window = xcb_generate_id(xcb_connection());
@ -409,6 +413,7 @@ void QXcbWindow::destroy()
} }
connection()->removeWindow(m_window); connection()->removeWindow(m_window);
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window)); Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
m_window = 0;
} }
m_mapped = false; m_mapped = false;