applied wxGLApp patch (#464500)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11716 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-09-28 13:53:55 +00:00
parent b3e8d00ab0
commit a6f5aa49cf
8 changed files with 294 additions and 122 deletions

View File

@@ -32,7 +32,7 @@ class wxApp: public wxAppBase
{ {
public: public:
wxApp(); wxApp();
~wxApp(); virtual ~wxApp();
/* override for altering the way wxGTK intializes the GUI /* override for altering the way wxGTK intializes the GUI
* (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by * (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by
@@ -75,6 +75,10 @@ public:
#endif #endif
unsigned char *m_colorCube; unsigned char *m_colorCube;
// used by the the wxGLApp and wxGLCanvas class for GL-based X visual
// selection; this is actually an XVisualInfo*
void *m_glVisualInfo;
private: private:
// true if we're inside an assert modal dialog // true if we're inside an assert modal dialog
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__

View File

@@ -16,16 +16,17 @@
#ifndef _WX_GLCANVAS_H_ #ifndef _WX_GLCANVAS_H_
#define _WX_GLCANVAS_H_ #define _WX_GLCANVAS_H_
#include <wx/defs.h> #include "wx/defs.h"
#if wxUSE_GLCANVAS #if wxUSE_GLCANVAS
#include <wx/scrolwin.h> #include "wx/scrolwin.h"
#include "wx/app.h"
extern "C" { extern "C" {
#include "GL/gl.h" #include <GL/gl.h>
#include "GL/glx.h" #include <GL/glx.h>
#include "GL/glu.h" #include <GL/glu.h>
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -100,7 +101,7 @@ private:
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxGLContext // wxGLCanvas
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
class WXDLLEXPORT wxGLCanvas: public wxScrolledWindow class WXDLLEXPORT wxGLCanvas: public wxScrolledWindow
@@ -161,15 +162,43 @@ public:
wxGLContext *m_glContext, wxGLContext *m_glContext,
*m_sharedContext; *m_sharedContext;
wxGLCanvas *m_sharedContextOf; wxGLCanvas *m_sharedContextOf;
void *m_vi; void *m_vi; // actually an XVisualInfo*
bool m_canFreeVi;
GtkWidget *m_glWidget; GtkWidget *m_glWidget;
bool m_exposed; bool m_exposed;
// returns an XVisualInfo* based on desired GL attributes;
// returns NULL if an appropriate visual is not found. The
// caller is reponsible for using XFree() to deallocate
// the returned structure.
static void* ChooseGLVisual(int *attribList);
private: private:
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
DECLARE_CLASS(wxGLCanvas) DECLARE_CLASS(wxGLCanvas)
}; };
//---------------------------------------------------------------------------
// wxGLApp
//---------------------------------------------------------------------------
class WXDLLEXPORT wxGLApp: public wxApp
{
public:
wxGLApp() : wxApp() { }
~wxGLApp();
// use this in the constructor of the user-derived wxGLApp class to select
// an appropriate X visual for GL. Returns TRUE if an appropriate visual
// is found - and sets m_glVisualInfo; FALSE otherwise.
bool InitGLVisual(int *attribList);
private:
DECLARE_DYNAMIC_CLASS(wxGLApp)
};
#endif #endif
// wxUSE_GLCANVAS // wxUSE_GLCANVAS

View File

@@ -32,7 +32,7 @@ class wxApp: public wxAppBase
{ {
public: public:
wxApp(); wxApp();
~wxApp(); virtual ~wxApp();
/* override for altering the way wxGTK intializes the GUI /* override for altering the way wxGTK intializes the GUI
* (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by * (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by
@@ -75,6 +75,10 @@ public:
#endif #endif
unsigned char *m_colorCube; unsigned char *m_colorCube;
// used by the the wxGLApp and wxGLCanvas class for GL-based X visual
// selection; this is actually an XVisualInfo*
void *m_glVisualInfo;
private: private:
// true if we're inside an assert modal dialog // true if we're inside an assert modal dialog
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__

View File

@@ -16,16 +16,17 @@
#ifndef _WX_GLCANVAS_H_ #ifndef _WX_GLCANVAS_H_
#define _WX_GLCANVAS_H_ #define _WX_GLCANVAS_H_
#include <wx/defs.h> #include "wx/defs.h"
#if wxUSE_GLCANVAS #if wxUSE_GLCANVAS
#include <wx/scrolwin.h> #include "wx/scrolwin.h"
#include "wx/app.h"
extern "C" { extern "C" {
#include "GL/gl.h" #include <GL/gl.h>
#include "GL/glx.h" #include <GL/glx.h>
#include "GL/glu.h" #include <GL/glu.h>
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -100,7 +101,7 @@ private:
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxGLContext // wxGLCanvas
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
class WXDLLEXPORT wxGLCanvas: public wxScrolledWindow class WXDLLEXPORT wxGLCanvas: public wxScrolledWindow
@@ -161,15 +162,43 @@ public:
wxGLContext *m_glContext, wxGLContext *m_glContext,
*m_sharedContext; *m_sharedContext;
wxGLCanvas *m_sharedContextOf; wxGLCanvas *m_sharedContextOf;
void *m_vi; void *m_vi; // actually an XVisualInfo*
bool m_canFreeVi;
GtkWidget *m_glWidget; GtkWidget *m_glWidget;
bool m_exposed; bool m_exposed;
// returns an XVisualInfo* based on desired GL attributes;
// returns NULL if an appropriate visual is not found. The
// caller is reponsible for using XFree() to deallocate
// the returned structure.
static void* ChooseGLVisual(int *attribList);
private: private:
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
DECLARE_CLASS(wxGLCanvas) DECLARE_CLASS(wxGLCanvas)
}; };
//---------------------------------------------------------------------------
// wxGLApp
//---------------------------------------------------------------------------
class WXDLLEXPORT wxGLApp: public wxApp
{
public:
wxGLApp() : wxApp() { }
~wxGLApp();
// use this in the constructor of the user-derived wxGLApp class to select
// an appropriate X visual for GL. Returns TRUE if an appropriate visual
// is found - and sets m_glVisualInfo; FALSE otherwise.
bool InitGLVisual(int *attribList);
private:
DECLARE_DYNAMIC_CLASS(wxGLApp)
};
#endif #endif
// wxUSE_GLCANVAS // wxUSE_GLCANVAS

View File

@@ -37,6 +37,7 @@
#include <glib.h> #include <glib.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
@@ -335,6 +336,9 @@ wxApp::wxApp()
#endif #endif
m_colorCube = (unsigned char*) NULL; m_colorCube = (unsigned char*) NULL;
// this is NULL for a "regular" wxApp, but is set (and freed) by a wxGLApp
m_glVisualInfo = (void *) NULL;
} }
wxApp::~wxApp() wxApp::~wxApp()
@@ -355,11 +359,29 @@ bool wxApp::OnInitGui()
GdkVisual *visual = gdk_visual_get_system(); GdkVisual *visual = gdk_visual_get_system();
// if this is a wxGLApp (derived from wxApp), and we've already
// chosen a specific visual, then derive the GdkVisual from that
if (m_glVisualInfo != NULL) {
#ifdef __WXGTK20__
/* seems gtk_widget_set_default_visual no longer exists? */
GdkVisual* vis = gtk_widget_get_default_visual();
#else
GdkVisual* vis = gdkx_visual_get(
((XVisualInfo *) m_glVisualInfo) ->visualid );
gtk_widget_set_default_visual( vis );
#endif
GdkColormap *colormap = gdk_colormap_new( vis, FALSE );
gtk_widget_set_default_colormap( colormap );
visual = vis;
}
/* on some machines, the default visual is just 256 colours, so /* on some machines, the default visual is just 256 colours, so
we make sure we get the best. this can sometimes be wasteful, we make sure we get the best. this can sometimes be wasteful,
of course, but what do these guys pay $30.000 for? */ of course, but what do these guys pay $30.000 for? */
if ((gdk_visual_get_best() != gdk_visual_get_system()) && else if ((gdk_visual_get_best() != gdk_visual_get_system()) &&
(m_useBestVisual)) (m_useBestVisual))
{ {
#ifdef __WXGTK20__ #ifdef __WXGTK20__

View File

@@ -283,7 +283,6 @@ bool wxGLCanvas::Create( wxWindow *parent,
int *attribList, int *attribList,
const wxPalette& palette) const wxPalette& palette)
{ {
int data[512];
m_sharedContext = (wxGLContext*)shared; // const_cast m_sharedContext = (wxGLContext*)shared; // const_cast
m_sharedContextOf = (wxGLCanvas*)shared_context_of; // const_cast m_sharedContextOf = (wxGLCanvas*)shared_context_of; // const_cast
m_glContext = (wxGLContext*) NULL; m_glContext = (wxGLContext*) NULL;
@@ -292,6 +291,68 @@ bool wxGLCanvas::Create( wxWindow *parent,
m_noExpose = TRUE; m_noExpose = TRUE;
m_nativeSizeEvent = TRUE; m_nativeSizeEvent = TRUE;
XVisualInfo *vi = NULL;
if (wxTheApp->m_glVisualInfo != NULL) {
vi = (XVisualInfo *) wxTheApp->m_glVisualInfo;
m_canFreeVi = FALSE; // owned by wxTheApp - don't free upon destruction
} else {
vi = (XVisualInfo *) ChooseGLVisual(attribList);
m_canFreeVi = TRUE;
}
m_vi = vi; // save for later use
wxCHECK_MSG( m_vi, FALSE, "required visual couldn't be found" );
GdkVisual *visual = gdkx_visual_get( vi->visualid );
GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE );
gtk_widget_push_colormap( colormap );
gtk_widget_push_visual( visual );
wxScrolledWindow::Create( parent, id, pos, size, style, name );
m_glWidget = m_wxwindow;
gtk_pizza_set_clear( GTK_PIZZA(m_wxwindow), FALSE );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
GTK_SIGNAL_FUNC(gtk_glwindow_draw_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
gtk_widget_pop_visual();
gtk_widget_pop_colormap();
if (GTK_WIDGET_REALIZED(m_wxwindow))
gtk_glwindow_realized_callback( m_wxwindow, this );
if (GTK_WIDGET_MAPPED(m_wxwindow))
gtk_glwindow_map_callback( m_wxwindow, this );
return TRUE;
}
wxGLCanvas::~wxGLCanvas()
{
XVisualInfo *vi = (XVisualInfo *) m_vi;
if (vi && m_canFreeVi) XFree( vi );
if (m_glContext) delete m_glContext;
}
void* wxGLCanvas::ChooseGLVisual(int *attribList)
{
int data[512];
if (!attribList) if (!attribList)
{ {
// default settings if attriblist = 0 // default settings if attriblist = 0
@@ -355,57 +416,7 @@ bool wxGLCanvas::Create( wxWindow *parent,
Display *dpy = GDK_DISPLAY(); Display *dpy = GDK_DISPLAY();
XVisualInfo *vi = glXChooseVisual( dpy, DefaultScreen(dpy), attribList ); return glXChooseVisual( dpy, DefaultScreen(dpy), attribList );
m_vi = vi; // safe for later use
wxCHECK_MSG( m_vi, FALSE, "required visual couldn't be found" );
GdkVisual *visual = gdkx_visual_get( vi->visualid );
GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE );
gtk_widget_push_colormap( colormap );
gtk_widget_push_visual( visual );
wxScrolledWindow::Create( parent, id, pos, size, style, name );
m_glWidget = m_wxwindow;
gtk_pizza_set_clear( GTK_PIZZA(m_wxwindow), FALSE );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
GTK_SIGNAL_FUNC(gtk_glwindow_draw_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
gtk_widget_pop_visual();
gtk_widget_pop_colormap();
if (GTK_WIDGET_REALIZED(m_wxwindow))
gtk_glwindow_realized_callback( m_wxwindow, this );
if (GTK_WIDGET_MAPPED(m_wxwindow))
gtk_glwindow_map_callback( m_wxwindow, this );
return TRUE;
}
wxGLCanvas::~wxGLCanvas()
{
XVisualInfo *vi = (XVisualInfo *) m_vi;
if (vi) XFree( vi );
if (m_glContext) delete m_glContext;
} }
void wxGLCanvas::SwapBuffers() void wxGLCanvas::SwapBuffers()
@@ -455,6 +466,26 @@ void wxGLCanvas::OnInternalIdle()
wxWindow::OnInternalIdle(); wxWindow::OnInternalIdle();
} }
//---------------------------------------------------------------------------
// wxGLApp
//---------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGLApp, wxApp)
wxGLApp::~wxGLApp()
{
if (m_glVisualInfo) XFree(m_glVisualInfo);
}
bool wxGLApp::InitGLVisual(int *attribList)
{
if (m_glVisualInfo) XFree(m_glVisualInfo);
m_glVisualInfo = wxGLCanvas::ChooseGLVisual(attribList);
return (m_glVisualInfo != NULL);
}
#endif #endif
// wxUSE_GLCANVAS // wxUSE_GLCANVAS

View File

@@ -37,6 +37,7 @@
#include <glib.h> #include <glib.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
@@ -335,6 +336,9 @@ wxApp::wxApp()
#endif #endif
m_colorCube = (unsigned char*) NULL; m_colorCube = (unsigned char*) NULL;
// this is NULL for a "regular" wxApp, but is set (and freed) by a wxGLApp
m_glVisualInfo = (void *) NULL;
} }
wxApp::~wxApp() wxApp::~wxApp()
@@ -355,11 +359,29 @@ bool wxApp::OnInitGui()
GdkVisual *visual = gdk_visual_get_system(); GdkVisual *visual = gdk_visual_get_system();
// if this is a wxGLApp (derived from wxApp), and we've already
// chosen a specific visual, then derive the GdkVisual from that
if (m_glVisualInfo != NULL) {
#ifdef __WXGTK20__
/* seems gtk_widget_set_default_visual no longer exists? */
GdkVisual* vis = gtk_widget_get_default_visual();
#else
GdkVisual* vis = gdkx_visual_get(
((XVisualInfo *) m_glVisualInfo) ->visualid );
gtk_widget_set_default_visual( vis );
#endif
GdkColormap *colormap = gdk_colormap_new( vis, FALSE );
gtk_widget_set_default_colormap( colormap );
visual = vis;
}
/* on some machines, the default visual is just 256 colours, so /* on some machines, the default visual is just 256 colours, so
we make sure we get the best. this can sometimes be wasteful, we make sure we get the best. this can sometimes be wasteful,
of course, but what do these guys pay $30.000 for? */ of course, but what do these guys pay $30.000 for? */
if ((gdk_visual_get_best() != gdk_visual_get_system()) && else if ((gdk_visual_get_best() != gdk_visual_get_system()) &&
(m_useBestVisual)) (m_useBestVisual))
{ {
#ifdef __WXGTK20__ #ifdef __WXGTK20__

View File

@@ -283,7 +283,6 @@ bool wxGLCanvas::Create( wxWindow *parent,
int *attribList, int *attribList,
const wxPalette& palette) const wxPalette& palette)
{ {
int data[512];
m_sharedContext = (wxGLContext*)shared; // const_cast m_sharedContext = (wxGLContext*)shared; // const_cast
m_sharedContextOf = (wxGLCanvas*)shared_context_of; // const_cast m_sharedContextOf = (wxGLCanvas*)shared_context_of; // const_cast
m_glContext = (wxGLContext*) NULL; m_glContext = (wxGLContext*) NULL;
@@ -292,6 +291,68 @@ bool wxGLCanvas::Create( wxWindow *parent,
m_noExpose = TRUE; m_noExpose = TRUE;
m_nativeSizeEvent = TRUE; m_nativeSizeEvent = TRUE;
XVisualInfo *vi = NULL;
if (wxTheApp->m_glVisualInfo != NULL) {
vi = (XVisualInfo *) wxTheApp->m_glVisualInfo;
m_canFreeVi = FALSE; // owned by wxTheApp - don't free upon destruction
} else {
vi = (XVisualInfo *) ChooseGLVisual(attribList);
m_canFreeVi = TRUE;
}
m_vi = vi; // save for later use
wxCHECK_MSG( m_vi, FALSE, "required visual couldn't be found" );
GdkVisual *visual = gdkx_visual_get( vi->visualid );
GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE );
gtk_widget_push_colormap( colormap );
gtk_widget_push_visual( visual );
wxScrolledWindow::Create( parent, id, pos, size, style, name );
m_glWidget = m_wxwindow;
gtk_pizza_set_clear( GTK_PIZZA(m_wxwindow), FALSE );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
GTK_SIGNAL_FUNC(gtk_glwindow_draw_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
gtk_widget_pop_visual();
gtk_widget_pop_colormap();
if (GTK_WIDGET_REALIZED(m_wxwindow))
gtk_glwindow_realized_callback( m_wxwindow, this );
if (GTK_WIDGET_MAPPED(m_wxwindow))
gtk_glwindow_map_callback( m_wxwindow, this );
return TRUE;
}
wxGLCanvas::~wxGLCanvas()
{
XVisualInfo *vi = (XVisualInfo *) m_vi;
if (vi && m_canFreeVi) XFree( vi );
if (m_glContext) delete m_glContext;
}
void* wxGLCanvas::ChooseGLVisual(int *attribList)
{
int data[512];
if (!attribList) if (!attribList)
{ {
// default settings if attriblist = 0 // default settings if attriblist = 0
@@ -355,57 +416,7 @@ bool wxGLCanvas::Create( wxWindow *parent,
Display *dpy = GDK_DISPLAY(); Display *dpy = GDK_DISPLAY();
XVisualInfo *vi = glXChooseVisual( dpy, DefaultScreen(dpy), attribList ); return glXChooseVisual( dpy, DefaultScreen(dpy), attribList );
m_vi = vi; // safe for later use
wxCHECK_MSG( m_vi, FALSE, "required visual couldn't be found" );
GdkVisual *visual = gdkx_visual_get( vi->visualid );
GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE );
gtk_widget_push_colormap( colormap );
gtk_widget_push_visual( visual );
wxScrolledWindow::Create( parent, id, pos, size, style, name );
m_glWidget = m_wxwindow;
gtk_pizza_set_clear( GTK_PIZZA(m_wxwindow), FALSE );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
GTK_SIGNAL_FUNC(gtk_glwindow_draw_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
gtk_widget_pop_visual();
gtk_widget_pop_colormap();
if (GTK_WIDGET_REALIZED(m_wxwindow))
gtk_glwindow_realized_callback( m_wxwindow, this );
if (GTK_WIDGET_MAPPED(m_wxwindow))
gtk_glwindow_map_callback( m_wxwindow, this );
return TRUE;
}
wxGLCanvas::~wxGLCanvas()
{
XVisualInfo *vi = (XVisualInfo *) m_vi;
if (vi) XFree( vi );
if (m_glContext) delete m_glContext;
} }
void wxGLCanvas::SwapBuffers() void wxGLCanvas::SwapBuffers()
@@ -455,6 +466,26 @@ void wxGLCanvas::OnInternalIdle()
wxWindow::OnInternalIdle(); wxWindow::OnInternalIdle();
} }
//---------------------------------------------------------------------------
// wxGLApp
//---------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGLApp, wxApp)
wxGLApp::~wxGLApp()
{
if (m_glVisualInfo) XFree(m_glVisualInfo);
}
bool wxGLApp::InitGLVisual(int *attribList)
{
if (m_glVisualInfo) XFree(m_glVisualInfo);
m_glVisualInfo = wxGLCanvas::ChooseGLVisual(attribList);
return (m_glVisualInfo != NULL);
}
#endif #endif
// wxUSE_GLCANVAS // wxUSE_GLCANVAS