#include "wx/intl.h"
#include "wx/log.h"
#include "wx/app.h"
- #include "wx/module.h"
#endif
#include "wx/msw/private.h"
# pragma comment( lib, "glu32" )
#endif
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-static const wxChar *wxGLCanvasClassName = wxT("wxGLCanvasClass");
-static const wxChar *wxGLCanvasClassNameNoRedraw = wxT("wxGLCanvasClassNR");
-
-// ============================================================================
-// implementation
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// wxGLModule is responsible for unregistering wxGLCanvasClass Windows class
-// ----------------------------------------------------------------------------
-
-class wxGLModule : public wxModule
-{
-public:
- bool OnInit() { return true; }
- void OnExit() { UnregisterClasses(); }
-
- // register the GL classes if not done yet, return true if ok, false if
- // registration failed
- static bool RegisterClasses();
-
- // unregister the classes, done automatically on program termination
- static void UnregisterClasses();
-
-private:
- // wxGLCanvas is only used from the main thread so this is MT-ok
- static bool ms_registeredGLClasses;
-
- DECLARE_DYNAMIC_CLASS(wxGLModule)
-};
-
-IMPLEMENT_DYNAMIC_CLASS(wxGLModule, wxModule)
-
-bool wxGLModule::ms_registeredGLClasses = false;
-
-/* static */
-bool wxGLModule::RegisterClasses()
-{
- if ( ms_registeredGLClasses )
- return true;
-
- // We have to register a special window class because we need the CS_OWNDC
- // style for GLCanvas: some OpenGL drivers are buggy and don't work with
- // windows without this style
- WNDCLASS wndclass;
-
- // the fields which are common to all classes
- wndclass.lpfnWndProc = (WNDPROC)wxWndProc;
- wndclass.cbClsExtra = 0;
- wndclass.cbWndExtra = sizeof( DWORD ); // VZ: what is this DWORD used for?
- wndclass.hInstance = wxhInstance;
- wndclass.hIcon = (HICON) NULL;
- wndclass.hCursor = ::LoadCursor((HINSTANCE)NULL, IDC_ARROW);
- wndclass.lpszMenuName = NULL;
-
- // Register the GLCanvas class name
- wndclass.hbrBackground = (HBRUSH)NULL;
- wndclass.lpszClassName = wxGLCanvasClassName;
- wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC;
-
- if ( !::RegisterClass(&wndclass) )
- {
- wxLogLastError(wxT("RegisterClass(wxGLCanvasClass)"));
- return false;
- }
-
- // Register the GLCanvas class name for windows which don't do full repaint
- // on resize
- wndclass.lpszClassName = wxGLCanvasClassNameNoRedraw;
- wndclass.style &= ~(CS_HREDRAW | CS_VREDRAW);
-
- if ( !::RegisterClass(&wndclass) )
- {
- wxLogLastError(wxT("RegisterClass(wxGLCanvasClassNameNoRedraw)"));
-
- ::UnregisterClass(wxGLCanvasClassName, wxhInstance);
-
- return false;
- }
-
- ms_registeredGLClasses = true;
-
- return true;
-}
-
-/* static */
-void wxGLModule::UnregisterClasses()
-{
- // we need to unregister the classes in case we're in a DLL which is
- // unloaded and then loaded again because if we don't, the registration is
- // going to fail in wxGLCanvas::Create() the next time we're loaded
- if ( ms_registeredGLClasses )
- {
- ::UnregisterClass(wxGLCanvasClassName, wxhInstance);
- ::UnregisterClass(wxGLCanvasClassNameNoRedraw, wxhInstance);
-
- ms_registeredGLClasses = false;
- }
-}
-
// ----------------------------------------------------------------------------
// wxGLContext
// ----------------------------------------------------------------------------
if ( other )
{
if ( !wglShareLists(other->m_glContext, m_glContext) )
- wxLogLastError(_T("wglShareLists"));
+ {
+ wxLogLastError(wxT("wglShareLists"));
+ }
}
}
{
if ( !wglMakeCurrent(win.GetHDC(), m_glContext) )
{
- wxLogLastError(_T("wglMakeCurrent"));
+ wxLogLastError(wxT("wglMakeCurrent"));
return false;
}
return true;
IMPLEMENT_CLASS(wxGLCanvas, wxWindow)
BEGIN_EVENT_TABLE(wxGLCanvas, wxWindow)
+#if wxUSE_PALETTE
EVT_PALETTE_CHANGED(wxGLCanvas::OnPaletteChanged)
EVT_QUERY_NEW_PALETTE(wxGLCanvas::OnQueryNewPalette)
+#endif
END_EVENT_TABLE()
// ----------------------------------------------------------------------------
{
wxCHECK_MSG( parent, false, wxT("can't create wxWindow without parent") );
- if ( !wxGLModule::RegisterClasses() )
- {
- wxLogError(_("Failed to register OpenGL window class."));
-
- return false;
- }
-
if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
return false;
DWORD msflags = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
msflags |= MSWGetStyle(style, &exStyle);
- if ( !MSWCreate(wxGLCanvasClassName, NULL, pos, size, msflags, exStyle) )
+ if ( !MSWCreate(wxApp::GetRegisteredClassName(wxT("wxGLCanvas"), -1, CS_OWNDC),
+ NULL, pos, size, msflags, exStyle) )
return false;
m_hDC = ::GetDC(GetHwnd());
if ( !::SetPixelFormat(m_hDC, pixelFormat, &pfd) )
{
- wxLogLastError(_T("SetPixelFormat"));
+ wxLogLastError(wxT("SetPixelFormat"));
return false;
}
}
{
if ( !::SwapBuffers(m_hDC) )
{
- wxLogLastError(_T("SwapBuffers"));
+ wxLogLastError(wxT("SwapBuffers"));
return false;
}
int pf;
UINT numFormats = 0;
+
if ( !wglChoosePixelFormatARB(hdc, iAttributes, NULL, 1, &pf, &numFormats) )
{
- wxLogLastError(_T("wglChoosePixelFormatARB"));
+ wxLogLastError(wxT("wglChoosePixelFormatARB"));
return 0;
}
+ // Although TRUE is returned if no matching formats are found (see
+ // http://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt), pf is
+ // not initialized in this case so we need to check for numFormats being
+ // not 0 explicitly (however this is not an error so don't call
+ // wxLogLastError() here).
+ if ( !numFormats )
+ pf = 0;
+
return pf;
}
if ( !pixelFormat )
{
- wxLogLastError(_T("ChoosePixelFormat"));
+ wxLogLastError(wxT("ChoosePixelFormat"));
return 0;
}
if ( !::SetPixelFormat(m_hDC, pixelFormat, &pfd) )
{
- wxLogLastError(_T("SetPixelFormat"));
+ wxLogLastError(wxT("SetPixelFormat"));
return 0;
}
const int pixelFormat = ::GetPixelFormat(m_hDC);
if ( !pixelFormat )
{
- wxLogLastError(_T("GetPixelFormat"));
+ wxLogLastError(wxT("GetPixelFormat"));
return false;
}
PIXELFORMATDESCRIPTOR pfd;
if ( !::DescribePixelFormat(m_hDC, pixelFormat, sizeof(pfd), &pfd) )
{
- wxLogLastError(_T("DescribePixelFormat"));
+ wxLogLastError(wxT("DescribePixelFormat"));
return false;
}
m_palette = palette;
- if ( !m_palette.Ok() )
+ if ( !m_palette.IsOk() )
{
m_palette = CreateDefaultPalette();
- if ( !m_palette.Ok() )
+ if ( !m_palette.IsOk() )
return false;
}
if ( !::SelectPalette(m_hDC, GetHpaletteOf(m_palette), FALSE) )
{
- wxLogLastError(_T("SelectPalette"));
+ wxLogLastError(wxT("SelectPalette"));
return false;
}
if ( ::RealizePalette(m_hDC) == GDI_ERROR )
{
- wxLogLastError(_T("RealizePalette"));
+ wxLogLastError(wxT("RealizePalette"));
return false;
}
void wxGLCanvas::OnQueryNewPalette(wxQueryNewPaletteEvent& event)
{
/* realize palette if this is the current window */
- if ( GetPalette()->Ok() ) {
+ if ( GetPalette()->IsOk() ) {
::UnrealizeObject((HPALETTE) GetPalette()->GetHPALETTE());
::SelectPalette(GetHDC(), (HPALETTE) GetPalette()->GetHPALETTE(), FALSE);
::RealizePalette(GetHDC());
{
/* realize palette if this is *not* the current window */
if ( GetPalette() &&
- GetPalette()->Ok() && (this != event.GetChangedWindow()) )
+ GetPalette()->IsOk() && (this != event.GetChangedWindow()) )
{
::UnrealizeObject((HPALETTE) GetPalette()->GetHPALETTE());
::SelectPalette(GetHDC(), (HPALETTE) GetPalette()->GetHPALETTE(), FALSE);