X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/50c95f691c6a37db5ff545d2c477c4cf008e3432..e333075415c35d2e869ea585fa41f01a2c938897:/src/unix/glx11.cpp diff --git a/src/unix/glx11.cpp b/src/unix/glx11.cpp index d31f34c936..780029891d 100644 --- a/src/unix/glx11.cpp +++ b/src/unix/glx11.cpp @@ -68,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); } // ============================================================================ @@ -161,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: @@ -175,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: @@ -185,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; @@ -289,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 // ---------------------------------------------------------------------------- @@ -343,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