]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/glcanvas.cpp
LocalToGlobal/GlobalToLocal Conversions with Carbon API, cleanup, hittesting correcte...
[wxWidgets.git] / src / mac / carbon / glcanvas.cpp
index 345fc2aeaf3a6ae42169cb09488275a277fcd203..14e64fe57245de4a230aa3454583551607a93f35 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        glcanvas.cpp
-// Purpose:     wxGLCanvas, for using OpenGL with wxWindows under Macintosh
+// Purpose:     wxGLCanvas, for using OpenGL with wxWidgets under Macintosh
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
 #include "wx/glcanvas.h"
 #include "wx/mac/uma.h"
 
+// DLL options compatibility check:
+#include "wx/build.h"
+WX_CHECK_BUILD_OPTIONS("wxGL")
+
 /*
 * GLContext implementation
 */
@@ -45,7 +49,7 @@ wxGLContext::wxGLContext(
 {
     m_window = win;
     
-    m_drawable = (AGLDrawable) UMAGetWindowPort(MAC_WXHWND(win->MacGetRootWindow()));
+    m_drawable = (AGLDrawable) UMAGetWindowPort(MAC_WXHWND(win->MacGetTopLevelWindowRef()));
     
     m_glContext = aglCreateContext(fmt, other ? other->m_glContext : NULL);
     wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") );
@@ -91,17 +95,14 @@ void wxGLContext::Update()
     }
 }
 
-void wxGLContext::SetColour(const char *colour)
+void wxGLContext::SetColour(const wxChar *colour)
 {
-    float r = 0.0;
-    float g = 0.0;
-    float b = 0.0;
-    wxColour *col = wxTheColourDatabase->FindColour(colour);
-    if (col)
+    wxColour col = wxTheColourDatabase->Find(colour);
+    if (col.Ok())
     {
-        r = (float)(col->Red()/256.0);
-        g = (float)(col->Green()/256.0);
-        b = (float)(col->Blue()/256.0);
+        float r = (float)(col.Red()/256.0);
+        float g = (float)(col.Green()/256.0);
+        float b = (float)(col.Blue()/256.0);
         glColor3f( r, g, b);
     }
 }
@@ -224,7 +225,7 @@ bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID
     wxCHECK_MSG( fmt, false, wxT("Couldn't create OpenGl pixel format") );
     
     m_glContext = new wxGLContext(fmt, this, palette, shared);
-    
+    m_macCanvasIsShown = true ;
     aglDestroyPixelFormat(fmt);
     
     return true;
@@ -249,18 +250,29 @@ void wxGLCanvas::SetViewport()
     int x = 0 ;
     int y = 0 ;
     
-    MacClientToRootWindow( &x , &y ) ;
-    int width, height;
-    GetClientSize(& width, & height);
-    Rect bounds ;
-    GetWindowPortBounds( MAC_WXHWND(MacGetRootWindow()) , &bounds ) ;
-    GLint parms[4] ;
-    parms[0] = x ;
-    parms[1] = bounds.bottom - bounds.top - ( y + height ) ;
-    parms[2] = width ;
-    parms[3] = height ;
+    wxWindow* iter = this ;
+    while( iter->GetParent() )
+    {
+       iter = iter->GetParent() ;
+    }
     
-       aglSetInteger( m_glContext->m_glContext , AGL_BUFFER_RECT , parms ) ;
+    if ( iter && iter->IsTopLevel() )
+    {
+           MacClientToRootWindow( &x , &y ) ;
+           int width, height;
+           GetClientSize(& width, & height);
+           Rect bounds ;
+           GetWindowPortBounds( MAC_WXHWND(MacGetTopLevelWindowRef()) , &bounds ) ;
+           GLint parms[4] ;
+           parms[0] = x ;
+           parms[1] = bounds.bottom - bounds.top - ( y + height ) ;
+           parms[2] = width ;
+           parms[3] = height ;
+           
+           if ( !m_macCanvasIsShown )
+               parms[0] += 20000 ;
+           aglSetInteger( m_glContext->m_glContext , AGL_BUFFER_RECT , parms ) ;
+       }
 }
 
 void wxGLCanvas::OnSize(wxSizeEvent& event)
@@ -298,12 +310,57 @@ void wxGLCanvas::SetCurrent()
     }
 }
 
-void wxGLCanvas::SetColour(const char *colour)
+void wxGLCanvas::SetColour(const wxChar *colour)
 {
     if (m_glContext)
         m_glContext->SetColour(colour);
 }
 
+bool wxGLCanvas::Show(bool show) 
+{
+    if ( !wxWindow::Show( show ) )
+        return FALSE ;
+/*        
+    if ( !show )
+    {
+        if ( m_macCanvasIsShown )
+        {
+            m_macCanvasIsShown = false ;
+            SetViewport() ;
+        }
+    }
+    else
+    {
+        if ( IsControlVisible( (ControlRef) m_macControl ) && !m_macCanvasIsShown )
+        {
+            m_macCanvasIsShown = true ;
+            SetViewport() ;
+        }
+    }
+*/
+    return TRUE ;
+}
+
+void wxGLCanvas::MacVisibilityChanged() 
+{
+    if ( !IsControlVisible( (ControlRef) m_macControl ) )
+    {
+        if ( m_macCanvasIsShown )
+        {
+            m_macCanvasIsShown = false ;
+            SetViewport() ;
+        }
+    }
+    else
+    {
+        if ( !m_macCanvasIsShown )
+        {
+            m_macCanvasIsShown = true ;
+            SetViewport() ;
+        }
+    }
+    wxWindowMac::MacVisibilityChanged() ;
+}
 
 //---------------------------------------------------------------------------
 // wxGLApp