]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
correct hhp2cached path
[wxWidgets.git] / src / mac / carbon / window.cpp
index 9e1334d4ce17c247cafe0b10a379829bd0fc02f7..acb4a6b6cbb97ee3573a82936da9374a3cd498e7 100644 (file)
@@ -232,17 +232,21 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                     bool created = false ;
                     CGContextRef cgContext = NULL ;
                     OSStatus err = cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, &cgContext) ;
-                    wxASSERT_MSG( err == noErr , wxT("Unable to retrieve CGContextRef") ) ;
+                    if ( err != noErr )
+                    {
+                        wxFAIL_MSG("Unable to retrieve CGContextRef");
+                    }
+
                     thisWindow->MacSetCGContextRef( cgContext ) ;
 
                     {
                         wxMacCGContextStateSaver sg( cgContext ) ;
-                        float alpha = 1.0 ;
+                        CGFloat alpha = (CGFloat)1.0 ;
                         {
                             wxWindow* iter = thisWindow ;
                             while ( iter )
                             {
-                                alpha *= (float) iter->GetTransparent()/255.0 ;
+                                alpha *= (CGFloat)( iter->GetTransparent()/255.0 ) ;
                                 if ( iter->IsTopLevel() )
                                     iter = NULL ;
                                 else
@@ -276,7 +280,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
             break ;
 
         case kEventControlVisibilityChanged :
-            thisWindow->MacVisibilityChanged() ;
+            // we might have two native controls attributed to the same wxWindow instance
+            // eg a scrollview and an embedded textview, make sure we only fire for the 'outer'
+            // control, as otherwise native and wx visibility are different
+            if ( thisWindow->GetPeer() != NULL && thisWindow->GetPeer()->GetControlRef() == controlRef )
+            {
+                thisWindow->MacVisibilityChanged() ;
+            }
             break ;
 
         case kEventControlEnabledStateChanged :
@@ -879,9 +889,6 @@ void wxWindowMac::Init()
     m_macIsUserPane = true;
     m_clipChildren = false ;
     m_cachedClippedRectValid = false ;
-
-    // we need a valid font for the encodings
-    wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
 }
 
 wxWindowMac::~wxWindowMac()
@@ -1108,7 +1115,7 @@ void wxWindowMac::MacUpdateControlFont()
 {
     m_peer->SetFont( GetFont() , GetForegroundColour() , GetWindowStyle() ) ;
     // do not trigger refreshes upon invisible and possible partly created objects
-    if ( MacIsReallyShown() )
+    if ( IsShownOnScreen() )
         Refresh() ;
 }
 
@@ -1673,7 +1680,7 @@ void wxWindowMac::MacInvalidateBorders()
     if ( m_peer == NULL )
         return ;
 
-    bool vis = MacIsReallyShown() ;
+    bool vis = IsShownOnScreen() ;
     if ( !vis )
         return ;
 
@@ -1942,7 +1949,7 @@ void wxWindowMac::SetLabel(const wxString& title)
         m_peer->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics) ) ;
 
     // do not trigger refreshes upon invisible and possible partly created objects
-    if ( MacIsReallyShown() )
+    if ( IsShownOnScreen() )
         Refresh() ;
 }
 
@@ -1988,31 +1995,6 @@ void wxWindowMac::MacEnabledStateChanged()
 // status queries on the inherited window's state
 //
 
-bool wxWindowMac::MacIsReallyShown()
-{
-    // only under OSX the visibility of the TLW is taken into account
-    if ( m_isBeingDeleted )
-        return false ;
-
-#if TARGET_API_MAC_OSX
-    if ( m_peer && m_peer->Ok() )
-        return m_peer->IsVisible();
-#endif
-
-    wxWindow* win = this ;
-    while ( win->IsShown() )
-    {
-        if ( win->IsTopLevel() )
-            return true ;
-
-        win = win->GetParent() ;
-        if ( win == NULL )
-            return true ;
-    }
-
-    return false ;
-}
-
 bool wxWindowMac::MacIsReallyEnabled()
 {
     return m_peer->IsEnabled() ;
@@ -2074,7 +2056,7 @@ void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect)
     if ( m_peer == NULL )
         return ;
 
-    if ( !MacIsReallyShown() )
+    if ( !IsShownOnScreen() )
         return ;
 
     if ( rect )
@@ -2137,6 +2119,12 @@ void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
     {
         event.GetDC()->Clear() ;
     }
+    else if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+    {
+        // don't skip the event here, custom background means that the app
+        // is drawing it itself in its OnPaint(), so don't draw it at all
+        // now to avoid flicker
+    }
     else
     {
         event.Skip() ;
@@ -2263,7 +2251,7 @@ void  wxWindowMac::MacPaintGrowBox()
         }
         else
         {
-            CGContextSetRGBFillColor( cgContext, 1.0, 1.0 , 1.0 , 1.0 );
+            CGContextSetRGBFillColor( cgContext, (CGFloat) 1.0, (CGFloat)1.0 ,(CGFloat) 1.0 , (CGFloat)1.0 );
         }
         CGContextFillRect( cgContext, cgrect );
         CGContextRestoreGState( cgContext );
@@ -2614,7 +2602,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures )
 {
     static wxRegion emptyrgn ;
 
-    if ( !m_isBeingDeleted && MacIsReallyShown() /*m_peer->IsVisible() */ )
+    if ( !m_isBeingDeleted && IsShownOnScreen() )
     {
         MacUpdateClippedRects() ;
         if ( includeOuterStructures )
@@ -3222,5 +3210,26 @@ wxByte wxWindowMac::GetTransparent() const
 
 bool wxWindowMac::IsShownOnScreen() const
 {
-    return ((wxWindowMac*)this)->MacIsReallyShown();
+#if TARGET_API_MAC_OSX
+    if ( m_peer && m_peer->Ok() )
+    {
+        bool peerVis = m_peer->IsVisible();
+        bool wxVis = wxWindowBase::IsShownOnScreen();
+        if( peerVis != wxVis )
+        {
+            // CS : put a breakpoint here to investigate differences
+            // between native an wx visibilities
+            // the only place where I've encountered them until now
+            // are the hiding/showing sequences where the vis-changed event is
+            // first sent to the innermost control, while wx does things
+            // from the outmost control
+            wxVis = wxWindowBase::IsShownOnScreen();
+            return wxVis;
+        }
+
+        return m_peer->IsVisible();
+    }
+#endif
+
+    return wxWindowBase::IsShownOnScreen();
 }