src/opengl/qgl_mac.mm
changeset 37 758a864f9613
parent 18 2f34d5167611
--- a/src/opengl/qgl_mac.mm	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/opengl/qgl_mac.mm	Mon Oct 04 01:19:32 2010 +0300
@@ -697,9 +697,17 @@
         QWidget *w = (QWidget *)d->paintDevice;
         NSView *view = qt_mac_nativeview_for(w);
 
-        // ideally we would use QWidget::isVisible(), but we get "invalid drawable" errors
-        if (![(NSWindow *)qt_mac_window_for(w) isVisible])
-            return;
+        // Trying to attach the GL context to the NSView will fail with
+        // "invalid drawable" if done too soon, but we have to make sure
+        // the connection is made before the first paint event. Using
+        // the NSView do to this check fails as the NSView is visible
+        // before it's safe to connect, and using the NSWindow fails as
+        // the NSWindow will become visible after the first paint event.
+        // This leaves us with the QWidget, who's visible state seems
+        // to match the point in time when it's safe to connect.
+        if (!w || !w->isVisible())
+            return; // Not safe to attach GL context to view yet
+
         if ([static_cast<NSOpenGLContext *>(d->cx) view] != view && ![view isHidden])
             [static_cast<NSOpenGLContext *>(d->cx) setView:view];
     } else if (d->paintDevice->devType() == QInternal::Pixmap) {
@@ -804,17 +812,22 @@
 static CFBundleRef qt_getOpenGLBundle()
 {
     CFBundleRef bundle = 0;
+    CFStringRef urlString = QCFString::toCFStringRef(QLatin1String("/System/Library/Frameworks/OpenGL.framework"));
     QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
-                 QCFString::toCFStringRef(QLatin1String("/System/Library/Frameworks/OpenGL.framework")), kCFURLPOSIXPathStyle, false);
+                 urlString, kCFURLPOSIXPathStyle, false);
     if (url)
         bundle = CFBundleCreate(kCFAllocatorDefault, url);
+    CFRelease(urlString);
     return bundle;
 }
 
 void *QGLContext::getProcAddress(const QString &proc) const
 {
-    return CFBundleGetFunctionPointerForName(QCFType<CFBundleRef>(qt_getOpenGLBundle()),
-                                             QCFString(proc));
+    CFStringRef procName = QCFString(proc).toCFStringRef(proc);
+    void *result = CFBundleGetFunctionPointerForName(QCFType<CFBundleRef>(qt_getOpenGLBundle()),
+                                             procName);
+    CFRelease(procName);
+    return result;
 }
 #ifndef QT_MAC_USE_COCOA
 /*****************************************************************************