]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
LocalToGlobal/GlobalToLocal Conversions with Carbon API, cleanup, hittesting correcte...
[wxWidgets.git] / src / mac / carbon / window.cpp
index 9bac13b60f12b71b009f4d079bb6936c846de173..f9549fda4d223062d271e64e51c1383f2a830297 100644 (file)
@@ -559,6 +559,22 @@ pascal void wxMacLiveScrollbarActionProc( ControlRef control , ControlPartCode p
  // constructors and such
 // ----------------------------------------------------------------------------
 
+wxWindowMac::wxWindowMac()
+{ 
+    Init(); 
+}
+
+wxWindowMac::wxWindowMac(wxWindowMac *parent,
+            wxWindowID id,
+            const wxPoint& pos ,
+            const wxSize& size ,
+            long style ,
+            const wxString& name )
+{
+    Init();
+    Create(parent, id, pos, size, style, name);
+}
+
 void wxWindowMac::Init()
 {
     m_frozenness = 0 ;
@@ -1030,11 +1046,7 @@ void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y,
     if ( tlw )
     {
         Point tlworigin =  { 0 , 0  } ;
-        GrafPtr port ;
-        bool swapped = QDSwapPort( UMAGetWindowPort( (WindowRef) tlw->MacGetWindowRef() ) , &port ) ;
-        ::LocalToGlobal( &tlworigin ) ;
-        if ( swapped )
-            ::SetPort( port ) ;
+        QDLocalToGlobalPoint( UMAGetWindowPort( (WindowRef) tlw->MacGetWindowRef() ) , &tlworigin ) ;
         x = tlworigin.h ;
         y = tlworigin.v ;    
     }
@@ -1129,8 +1141,7 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
         if(x) localwhere.h = * x ;
         if(y) localwhere.v = * y ;
         
-        wxMacPortSaver s((GrafPtr)GetWindowPort( window )) ;
-        ::GlobalToLocal( &localwhere ) ;
+        QDGlobalToLocalPoint( GetWindowPort( window ) , &localwhere ) ;
         if(x)   *x = localwhere.h ;
         if(y)   *y = localwhere.v ;
 
@@ -1157,9 +1168,7 @@ void wxWindowMac::DoClientToScreen(int *x, int *y) const
         Point localwhere = { 0,0 };
         if(x)   localwhere.h = * x ;
         if(y)   localwhere.v = * y ;
-
-        wxMacPortSaver s((GrafPtr)GetWindowPort( window )) ;
-        ::LocalToGlobal( &localwhere ) ;
+        QDLocalToGlobalPoint( GetWindowPort( window ) , &localwhere ) ;
         if(x)   *x = localwhere.h ;
         if(y)   *y = localwhere.v ;
     }
@@ -1856,6 +1865,13 @@ bool wxWindowMac::MacIsReallyHilited()
     return IsControlActive( (ControlRef) m_macControl ) ;
 }
 
+void wxWindowMac::MacFlashInvalidAreas() 
+{
+#if TARGET_API_MAC_OSX
+    HIViewFlashDirtyArea( (WindowRef) MacGetTopLevelWindowRef() ) ;
+#endif
+}
+
 //
 //
 //
@@ -2274,57 +2290,62 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         
 
     {
-        wxClientDC dc(this) ;
-        wxMacPortSetter helper(&dc) ;
 
         int width , height ;
         GetClientSize( &width , &height ) ;
-
+#if TARGET_API_MAC_OSX
+        // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control
+        // area is scrolled, this does not occur if width and height are 2 pixels less, 
+        // TODO write optimal workaround
+        HIRect scrollrect = CGRectMake( MacGetLeftBorderSize() , MacGetTopBorderSize() , width , height ) ;       
+        if ( rect ) 
+        {
+            HIRect scrollarea = CGRectMake( rect->x , rect->y , rect->width , rect->height) ;
+            scrollrect = CGRectIntersection( scrollrect , scrollarea ) ;
+        }
+        if ( HIViewGetNeedsDisplay( (ControlRef) m_macControl ) )
+        {
+            // becuase HIViewScrollRect does not scroll the already invalidated area we have two options
+            // either immediate redraw or full invalidate
+#if 1
+            // is the better overall solution, as it does not slow down scrolling
+            HIViewSetNeedsDisplay( (ControlRef) m_macControl , true ) ;
+#else
+            // this would be the preferred version for fast drawing controls       
+            if( UMAGetSystemVersion() < 0x1030 )
+                Update() ;
+            else
+                HIViewRender((ControlRef) m_macControl) ;
+#endif
+        }
+        HIViewScrollRect ( (ControlRef) m_macControl , &scrollrect , dx ,dy ) ;
+#else
 
         wxPoint pos;
         pos.x = pos.y = 0; 
+
         Rect scrollrect;
-        // TODO take out the boundaries
-        GetControlBounds( (ControlRef) m_macControl, &scrollrect);
-        
         RgnHandle updateRgn = NewRgn() ;
-        if ( rect )
-        {
-            Rect r = { dc.YLOG2DEVMAC(rect->y) , dc.XLOG2DEVMAC(rect->x) , dc.YLOG2DEVMAC(rect->y + rect->height) ,
-                dc.XLOG2DEVMAC(rect->x + rect->width) } ;
-            SectRect( &scrollrect , &r , &scrollrect ) ;
-        }
-        ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
-#if TARGET_CARBON
-        //KO: The docs say ScrollRect creates an update region, which thus calls an update event
-        // but it seems the update only refreshes the background of the control, rather than calling 
-        // kEventControlDraw, so we need to force a proper update here. There has to be a better 
-        // way of doing this... (Note that code below under !TARGET_CARBON does not work either...)
-        Update();
-#endif        
-        // we also have to scroll the update rgn in this rectangle 
-        // in order not to loose updates
-#if !TARGET_CARBON
-        WindowRef rootWindow = (WindowRef) MacGetTopLevelWindowRef() ;
-        RgnHandle formerUpdateRgn = NewRgn() ;
-        RgnHandle scrollRgn = NewRgn() ;
-        RectRgn( scrollRgn , &scrollrect ) ;
-        GetWindowUpdateRgn( rootWindow , formerUpdateRgn ) ;
-        Point pt = {0,0} ;
-        LocalToGlobal( &pt ) ;
-        OffsetRgn( formerUpdateRgn , -pt.h , -pt.v ) ;
-        SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ;
-        if ( !EmptyRgn( formerUpdateRgn ) )
-        {
-            MacOffsetRgn( formerUpdateRgn , dx , dy ) ;
-            SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ;
-            InvalWindowRgn(rootWindow  ,  formerUpdateRgn ) ;
+
+       {
+            wxClientDC dc(this) ;
+            wxMacPortSetter helper(&dc) ;
+        
+            GetControlBounds( (ControlRef) m_macControl, &scrollrect);
+            scrollrect.top += MacGetTopBorderSize() ;
+            scrollrect.left += MacGetLeftBorderSize() ;
+            scrollrect.bottom = scrollrect.top + height ;
+            scrollrect.right = scrollrect.left + width ;
+            
+            if ( rect )
+            {
+                Rect r = { dc.YLOG2DEVMAC(rect->y) , dc.XLOG2DEVMAC(rect->x) , dc.YLOG2DEVMAC(rect->y + rect->height) ,
+                    dc.XLOG2DEVMAC(rect->x + rect->width) } ;
+                SectRect( &scrollrect , &r , &scrollrect ) ;
+            }
+            ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
         }
-        InvalWindowRgn(rootWindow  ,  updateRgn ) ;
-        DisposeRgn( updateRgn ) ;
-        DisposeRgn( formerUpdateRgn ) ;
-        DisposeRgn( scrollRgn ) ;
+        // ScrollWindowRect( (WindowRef) MacGetTopLevelWindowRef() , &scrollrect , dx , dy ,  kScrollWindowInvalidate, updateRgn ) ;
 #endif
     }
 
@@ -2350,9 +2371,6 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
             child->SetSize( x+dx, y+dy, w, h );                
         }        
     }
-    
-// TODO remove, was moved higher up    Update() ;
-
 }
 
 void wxWindowMac::MacOnScroll(wxScrollEvent &event )
@@ -2490,7 +2508,37 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt )
 void wxWindowMac::Update()
 {
 #if TARGET_API_MAC_OSX
-    HIViewSetNeedsDisplay( (ControlRef) m_macControl , true ) ;
+    WindowRef window = (WindowRef)MacGetTopLevelWindowRef() ;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
+    // for composited windows this also triggers a redraw of all
+    // invalid views in the window
+    if( UMAGetSystemVersion() >= 0x1030 )
+        HIWindowFlush(window) ;       
+    else                   
+#endif
+    {
+        // the only way to trigger the redrawing on earlier systems is to call
+        // ReceiveNextEvent
+
+        EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ;
+        UInt32 currentEventClass = 0 ;
+        UInt32 currentEventKind = 0 ;
+        if ( currentEvent != NULL )
+        {
+            currentEventClass = ::GetEventClass( currentEvent ) ;
+            currentEventKind = ::GetEventKind( currentEvent ) ;
+        }       
+        if ( currentEventClass != kEventClassMenu )
+        {
+            // when tracking a menu, strange redraw errors occur if we flush now, so leave..
+
+            EventRef theEvent;
+            OSStatus status = noErr ;
+            status = ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ;
+        }
+        else
+            HIViewSetNeedsDisplay( (ControlRef) m_macControl , true ) ;
+    }
 #else
     ::Draw1Control( (ControlRef) m_macControl ) ;
 #endif