]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/glx11.cpp
fix for glib critical errors when closing an mdi child
[wxWidgets.git] / src / unix / glx11.cpp
index 576c7c84fe9e5c0355760777a847fa93122bed8c..780029891d0de5e04b1e04e4a23a202935b105a4 100644 (file)
@@ -22,6 +22,7 @@
 #if wxUSE_GLCANVAS
 
 #ifndef WX_PRECOMP
+    #include "wx/log.h"
 #endif //WX_PRECOMP
 
 #include "wx/glcanvas.h"
@@ -67,26 +68,26 @@ wxGLContext::~wxGLContext()
     glXDestroyContext( wxGetX11Display(), m_glContext );
 }
 
-void wxGLContext::SetCurrent(const wxGLCanvas& win) const
+bool wxGLContext::SetCurrent(const wxGLCanvas& win) const
 {
     if ( !m_glContext )
-        return;
+        return false;
 
     const Window xid = win.GetXWindow();
-    wxCHECK_RET( xid, _T("window must be shown") );
+    wxCHECK2_MSG( xid, return false, _T("window must be shown") );
 
-    MakeCurrent(xid, m_glContext);
+    return MakeCurrent(xid, m_glContext);
 }
 
 // wrapper around glXMakeContextCurrent/glXMakeCurrent depending on GLX
 // version
 /* static */
-void wxGLContext::MakeCurrent(GLXDrawable drawable, GLXContext context)
+bool wxGLContext::MakeCurrent(GLXDrawable drawable, GLXContext context)
 {
     if (wxGLCanvas::GetGLXVersion() >= 13)
-        glXMakeContextCurrent( wxGetX11Display(), drawable, drawable, context);
+        return glXMakeContextCurrent( wxGetX11Display(), drawable, drawable, context);
     else // GLX <= 1.2 doesn't have glXMakeContextCurrent()
-        glXMakeCurrent( wxGetX11Display(), drawable, context);
+        return glXMakeCurrent( wxGetX11Display(), drawable, context);
 }
 
 // ============================================================================
@@ -160,9 +161,6 @@ wxGLCanvasX11::ConvertWXAttrsToGL(const int *wxattrs, int *glattrs, size_t n)
             if ( p >= n - 2 )
                 return false;
 
-            // notice that for boolean attributes we use "continue" in the
-            // switch to skip the assignment of the attribute value at the end
-            // of the loop which is done for integer attributes
             switch ( wxattrs[arg++] )
             {
                 case WX_GL_RGBA:
@@ -174,6 +172,9 @@ wxGLCanvasX11::ConvertWXAttrsToGL(const int *wxattrs, int *glattrs, size_t n)
                     {
                         glattrs[p++] = GLX_RGBA;
                     }
+
+                    // use "continue" to skip the assignment of the attribute
+                    // value at the end of the loop
                     continue;
 
                 case WX_GL_BUFFER_SIZE:
@@ -184,13 +185,21 @@ wxGLCanvasX11::ConvertWXAttrsToGL(const int *wxattrs, int *glattrs, size_t n)
                     glattrs[p++] = GLX_LEVEL;
                     break;
 
+                    // the following boolean attributes don't have values in wx
+                    // API (they're turned on if specified) but do have them in
+                    // OpenGL, so do put them into glattrs and also skip the
+                    // copy of wx value after switch by using "continue"
+                    // instead of "break"
                 case WX_GL_DOUBLEBUFFER:
                     glattrs[p++] = GLX_DOUBLEBUFFER;
+                    glattrs[p++] = True;
                     continue;
 
                 case WX_GL_STEREO:
                     glattrs[p++] = GLX_STEREO;
-                    break;
+                    glattrs[p++] = True;
+                    continue;
+
 
                 case WX_GL_AUX_BUFFERS:
                     glattrs[p++] = GLX_AUX_BUFFERS;
@@ -288,6 +297,24 @@ wxGLCanvasX11::InitXVisualInfo(const int *attribList,
     return *pXVisual != NULL;
 }
 
+/* static */
+bool
+wxGLCanvasBase::IsDisplaySupported(const int *attribList)
+{
+    GLXFBConfig *fbc = NULL;
+    XVisualInfo *vi = NULL;
+
+    const bool
+        isSupported = wxGLCanvasX11::InitXVisualInfo(attribList, &fbc, &vi);
+
+    if ( fbc )
+        XFree(fbc);
+    if ( vi )
+        XFree(vi);
+
+    return isSupported;
+}
+
 // ----------------------------------------------------------------------------
 // default visual management
 // ----------------------------------------------------------------------------
@@ -342,12 +369,13 @@ int wxGLCanvasX11::GetGLXVersion()
     return s_glxVersion;
 }
 
-void wxGLCanvasX11::SwapBuffers()
+bool wxGLCanvasX11::SwapBuffers()
 {
     const Window xid = GetXWindow();
-    wxCHECK_RET( xid, _T("window must be shown") );
+    wxCHECK2_MSG( xid, return false, _T("window must be shown") );
 
     glXSwapBuffers(wxGetX11Display(), xid);
+    return true;
 }
 
 bool wxGLCanvasX11::IsShownOnScreen() const