2007-04-15 19:06:45 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: wx/unix/glx11.h
|
|
|
|
// Purpose: class common for all X11-based wxGLCanvas implementations
|
|
|
|
// Author: Vadim Zeitlin
|
|
|
|
// Created: 2007-04-15
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwindows.org>
|
|
|
|
// Licence: wxWindows licence
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#ifndef _WX_UNIX_GLX11_H_
|
|
|
|
#define _WX_UNIX_GLX11_H_
|
|
|
|
|
|
|
|
#include <GL/glx.h>
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxGLContext
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2007-07-06 11:40:45 -04:00
|
|
|
class WXDLLIMPEXP_GL wxGLContext : public wxGLContextBase
|
2007-04-15 19:06:45 -04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxGLContext(wxGLCanvas *win, const wxGLContext *other = NULL);
|
|
|
|
virtual ~wxGLContext();
|
|
|
|
|
|
|
|
virtual void SetCurrent(const wxGLCanvas& win) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
// attach context to the drawable or unset it (if NULL)
|
|
|
|
static void MakeCurrent(GLXDrawable drawable, GLXContext context);
|
|
|
|
|
|
|
|
GLXContext m_glContext;
|
|
|
|
|
|
|
|
DECLARE_CLASS(wxGLContext)
|
|
|
|
};
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxGLCanvasX11
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2007-07-06 11:40:45 -04:00
|
|
|
class WXDLLIMPEXP_GL wxGLCanvasX11 : public wxGLCanvasBase
|
2007-04-15 19:06:45 -04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
// initialization and dtor
|
|
|
|
// -----------------------
|
|
|
|
|
|
|
|
// default ctor doesn't do anything, InitVisual() must be called
|
|
|
|
wxGLCanvasX11();
|
|
|
|
|
|
|
|
// initializes the XVisualInfo corresponding to the given attributes
|
|
|
|
bool InitVisual(const int *attribList);
|
|
|
|
|
|
|
|
// frees XVisualInfo info
|
|
|
|
virtual ~wxGLCanvasX11();
|
|
|
|
|
|
|
|
|
|
|
|
// implement wxGLCanvasBase methods
|
|
|
|
// --------------------------------
|
|
|
|
|
|
|
|
virtual void SwapBuffers();
|
|
|
|
|
|
|
|
|
|
|
|
// X11-specific methods
|
|
|
|
// --------------------
|
|
|
|
|
|
|
|
// return GLX version: 13 means 1.3 &c
|
|
|
|
static int GetGLXVersion();
|
|
|
|
|
|
|
|
// get the X11 handle of this window
|
|
|
|
virtual Window GetXWindow() const = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// override some wxWindow methods
|
|
|
|
// ------------------------------
|
|
|
|
|
|
|
|
// return true only if the window is realized: OpenGL context can't be
|
|
|
|
// created until we are
|
|
|
|
virtual bool IsShownOnScreen() const;
|
|
|
|
|
|
|
|
|
|
|
|
// implementation only from now on
|
|
|
|
// -------------------------------
|
|
|
|
|
|
|
|
// get the GLXFBConfig/XVisualInfo we use
|
|
|
|
GLXFBConfig *GetGLXFBConfig() const { return m_fbc; }
|
|
|
|
XVisualInfo *GetXVisualInfo() const { return m_vi; }
|
|
|
|
|
|
|
|
// initialize the global default GL visual, return false if matching visual
|
|
|
|
// not found
|
|
|
|
static bool InitDefaultVisualInfo(const int *attribList);
|
|
|
|
|
|
|
|
// get the default GL X11 visual (may be NULL, shouldn't be freed by caller)
|
|
|
|
static XVisualInfo *GetDefaultXVisualInfo() { return ms_glVisualInfo; }
|
|
|
|
|
|
|
|
// free the global GL visual, called by wxGLApp
|
|
|
|
static void FreeDefaultVisualInfo();
|
|
|
|
|
|
|
|
private:
|
|
|
|
// fills in glattrs with attributes defined by wxattrs which must be
|
|
|
|
// 0-terminated if it is non-NULL
|
|
|
|
//
|
|
|
|
// n is the max size of glattrs, false is returned if we overflow it, it
|
|
|
|
// should be at least 16 to accommodate the default attributes
|
|
|
|
static bool ConvertWXAttrsToGL(const int *wxattrs, int *glattrs, size_t n);
|
|
|
|
|
|
|
|
// initializes XVisualInfo (in any case) and, if supported, GLXFBConfig
|
|
|
|
//
|
|
|
|
// returns false if XVisualInfo couldn't be initialized, otherwise caller
|
|
|
|
// is responsible for freeing the pointers
|
|
|
|
static bool InitXVisualInfo(const int *attribList,
|
|
|
|
GLXFBConfig **pFBC, XVisualInfo **pXVisual);
|
|
|
|
|
|
|
|
|
|
|
|
// this is only used if it's supported i.e. if GL >= 1.3
|
|
|
|
GLXFBConfig *m_fbc;
|
|
|
|
|
|
|
|
// used for all GL versions, obtained from GLXFBConfig for GL >= 1.3
|
|
|
|
XVisualInfo *m_vi;
|
|
|
|
|
|
|
|
// the global/default versions of the above
|
|
|
|
static GLXFBConfig *ms_glFBCInfo;
|
|
|
|
static XVisualInfo *ms_glVisualInfo;
|
|
|
|
};
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxGLApp
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// this is used in wx/glcanvas.h, prevent it from defining a generic wxGLApp
|
|
|
|
#define wxGL_APP_DEFINED
|
|
|
|
|
2007-07-06 11:40:45 -04:00
|
|
|
class WXDLLIMPEXP_GL wxGLApp : public wxGLAppBase
|
2007-04-15 19:06:45 -04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxGLApp();
|
|
|
|
|
|
|
|
// implement wxGLAppBase method
|
|
|
|
virtual bool InitGLVisual(const int *attribList)
|
|
|
|
{
|
|
|
|
return wxGLCanvasX11::InitDefaultVisualInfo(attribList);
|
|
|
|
}
|
|
|
|
|
|
|
|
// and implement this wxGTK::wxApp method too
|
|
|
|
virtual void *GetXVisualInfo()
|
|
|
|
{
|
|
|
|
return wxGLCanvasX11::GetDefaultXVisualInfo();
|
|
|
|
}
|
|
|
|
|
|
|
|
// and override this wxApp method to clean up
|
|
|
|
virtual int OnExit()
|
|
|
|
{
|
|
|
|
wxGLCanvasX11::FreeDefaultVisualInfo();
|
|
|
|
|
|
|
|
return wxGLAppBase::OnExit();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2007-04-20 04:16:48 -04:00
|
|
|
DECLARE_DYNAMIC_CLASS(wxGLApp)
|
2007-04-15 19:06:45 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _WX_UNIX_GLX11_H_
|
|
|
|
|