Fixed non-GL applications crashing when GLX/EGL initialization fails on xcb.
authorSamuel Rødal <samuel.rodal@nokia.com>
Tue, 21 Aug 2012 15:36:03 +0000 (17:36 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 22 Aug 2012 07:08:02 +0000 (09:08 +0200)
Change-Id: I5a08d6067272575aa56074aaebe308c3d49299bb
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/plugins/platforms/xcb/qxcbwindow.cpp

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