X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/82bf63a08ca2c5e2d500557550449cad219991c9..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/msw/glcanvas.cpp?ds=sidebyside diff --git a/src/msw/glcanvas.cpp b/src/msw/glcanvas.cpp index 9ef0f75d0c..a16f03e7b8 100644 --- a/src/msw/glcanvas.cpp +++ b/src/msw/glcanvas.cpp @@ -29,7 +29,6 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/app.h" - #include "wx/module.h" #endif #include "wx/msw/private.h" @@ -104,110 +103,6 @@ LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, # 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 // ---------------------------------------------------------------------------- @@ -222,7 +117,9 @@ wxGLContext::wxGLContext(wxGLCanvas *win, const wxGLContext* other) if ( other ) { if ( !wglShareLists(other->m_glContext, m_glContext) ) - wxLogLastError(_T("wglShareLists")); + { + wxLogLastError(wxT("wglShareLists")); + } } } @@ -236,7 +133,7 @@ bool wxGLContext::SetCurrent(const wxGLCanvas& win) const { if ( !wglMakeCurrent(win.GetHDC(), m_glContext) ) { - wxLogLastError(_T("wglMakeCurrent")); + wxLogLastError(wxT("wglMakeCurrent")); return false; } return true; @@ -249,8 +146,10 @@ bool wxGLContext::SetCurrent(const wxGLCanvas& win) const 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() // ---------------------------------------------------------------------------- @@ -297,13 +196,6 @@ bool wxGLCanvas::CreateWindow(wxWindow *parent, { 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; @@ -319,7 +211,8 @@ bool wxGLCanvas::CreateWindow(wxWindow *parent, 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()); @@ -386,7 +279,7 @@ bool wxGLCanvas::Create(wxWindow *parent, if ( !::SetPixelFormat(m_hDC, pixelFormat, &pfd) ) { - wxLogLastError(_T("SetPixelFormat")); + wxLogLastError(wxT("SetPixelFormat")); return false; } } @@ -410,7 +303,7 @@ bool wxGLCanvas::SwapBuffers() { if ( !::SwapBuffers(m_hDC) ) { - wxLogLastError(_T("SwapBuffers")); + wxLogLastError(wxT("SwapBuffers")); return false; } @@ -602,12 +495,21 @@ static int ChoosePixelFormatARB(HDC hdc, const int *attribList) 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; } @@ -792,13 +694,13 @@ int wxGLCanvas::DoSetup(PIXELFORMATDESCRIPTOR &pfd, const int *attribList) if ( !pixelFormat ) { - wxLogLastError(_T("ChoosePixelFormat")); + wxLogLastError(wxT("ChoosePixelFormat")); return 0; } if ( !::SetPixelFormat(m_hDC, pixelFormat, &pfd) ) { - wxLogLastError(_T("SetPixelFormat")); + wxLogLastError(wxT("SetPixelFormat")); return 0; } @@ -816,14 +718,14 @@ bool wxGLCanvas::SetupPalette(const wxPalette& palette) 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; } @@ -832,22 +734,22 @@ bool wxGLCanvas::SetupPalette(const wxPalette& palette) 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; } @@ -897,7 +799,7 @@ wxPalette wxGLCanvas::CreateDefaultPalette() 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()); @@ -912,7 +814,7 @@ void wxGLCanvas::OnPaletteChanged(wxPaletteChangedEvent& event) { /* 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);