]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/utils.cpp
Set HTML data even in Unicode mode
[wxWidgets.git] / src / mac / carbon / utils.cpp
index be604f9e30debdf9c1e81e07c7008cc3800d1d87..5de1468e75f4326e7bab7cda6af2785c03a11213 100644 (file)
@@ -9,21 +9,18 @@
 // Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-// Note: this is done in utilscmn.cpp now.
-// #pragma implementation "utils.h"
-#endif
+#include "wx/wxprec.h"
 
-#include "wx/setup.h"
 #include "wx/utils.h"
 #include "wx/app.h"
 #include "wx/apptrait.h"
 
 #if wxUSE_GUI
     #include "wx/mac/uma.h"
-       #include "wx/font.h"
+    #include "wx/font.h"
+    #include "wx/toplevel.h"
 #else
-       #include "wx/intl.h"
+    #include "wx/intl.h"
 #endif
 
 #include <ctype.h>
 #include <Multiprocessing.h>
 #endif
 
+#ifdef __DARWIN__
+#include <Carbon/Carbon.h>
+#else
 #include <ATSUnicode.h>
 #include <TextCommon.h>
 #include <TextEncodingConverter.h>
+#endif
 #endif // wxUSE_GUI
 
 #include  "wx/mac/private.h"  // includes mac headers
@@ -91,7 +92,7 @@ static int DoGetOSVersion(int *majorVsn, int *minorVsn)
 // debugging support
 // ----------------------------------------------------------------------------
 
-#if defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
+#if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
 
 // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
 
@@ -260,7 +261,7 @@ bool wxGetHostName(wxChar *buf, int maxSize)
     else
         buf[0] = 0 ;
 
-  return TRUE;
+    return true;
 }
 
 // Get user ID e.g. jacs
@@ -298,10 +299,10 @@ bool wxGetUserName(wxChar *buf, int maxSize)
     else
         buf[0] = 0 ;
 
-  return TRUE;
+    return true;
 }
 
-int wxKill(long pid, wxSignal sig , wxKillError *rc )
+int wxKill(long pid, wxSignal sig , wxKillError *rc, int flags)
 {
     // TODO
     return 0;
@@ -313,7 +314,7 @@ WXDLLEXPORT bool wxGetEnv(const wxString& var, wxString *value)
     return false ;
 }
 
-// set the env var name to the given value, return TRUE on success
+// set the env var name to the given value, return true on success
 WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxChar *value)
 {
     // TODO : under classic there is no environement support, under X yes
@@ -326,34 +327,46 @@ WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxChar *value)
 bool wxShell(const wxString& command)
 {
     // TODO
-    return FALSE;
+    return false;
 }
 
 // Shutdown or reboot the PC
 bool wxShutdown(wxShutdownFlags wFlags)
 {
     // TODO
-    return FALSE;
+    return false;
+}
+
+wxPowerType wxGetPowerType()
+{
+    // TODO
+    return wxPOWER_UNKNOWN;
+}
+
+wxBatteryState wxGetBatteryState()
+{
+    // TODO
+    return wxBATTERY_UNKNOWN_STATE;
 }
 
 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
-long wxGetFreeMemory()
+wxMemorySize wxGetFreeMemory()
 {
-    return FreeMem() ;
+    return (wxMemorySize)FreeMem() ;
 }
 
 #ifndef __DARWIN__
 
 void wxMicroSleep(unsigned long microseconds)
 {
-       AbsoluteTime wakeup = AddDurationToAbsolute( microseconds * durationMicrosecond , UpTime());
-       MPDelayUntil( & wakeup);
+    AbsoluteTime wakeup = AddDurationToAbsolute( microseconds * durationMicrosecond , UpTime());
+    MPDelayUntil( & wakeup);
 }
 
 void wxMilliSleep(unsigned long milliseconds)
 {
-       AbsoluteTime wakeup = AddDurationToAbsolute( milliseconds, UpTime());
-       MPDelayUntil( & wakeup);
+    AbsoluteTime wakeup = AddDurationToAbsolute( milliseconds, UpTime());
+    MPDelayUntil( & wakeup);
 }
 
 void wxSleep(int nSecs)
@@ -406,7 +419,7 @@ wxToolkitInfo& wxGUIAppTraits::GetToolkitInfo()
 bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file)
 {
     // TODO
-    return FALSE;
+    return false;
 }
 
 bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file)
@@ -436,7 +449,7 @@ bool wxWriteResource(const wxString& section, const wxString& entry, int value,
 bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file)
 {
     // TODO
-    return FALSE;
+    return false;
 }
 
 bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file)
@@ -447,9 +460,9 @@ bool wxGetResource(const wxString& section, const wxString& entry, float *value,
     {
         *value = (float)strtod(s, NULL);
         delete[] s;
-        return TRUE;
+        return true;
     }
-    else return FALSE;
+    else return false;
 }
 
 bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file)
@@ -460,9 +473,9 @@ bool wxGetResource(const wxString& section, const wxString& entry, long *value,
     {
         *value = strtol(s, NULL, 10);
         delete[] s;
-        return TRUE;
+        return true;
     }
-    else return FALSE;
+    else return false;
 }
 
 bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file)
@@ -473,9 +486,9 @@ bool wxGetResource(const wxString& section, const wxString& entry, int *value, c
     {
         *value = (int)strtol(s, NULL, 10);
         delete[] s;
-        return TRUE;
+        return true;
     }
-    else return FALSE;
+    else return false;
 }
 #endif // wxUSE_RESOURCES
 
@@ -507,7 +520,7 @@ void wxEndBusyCursor()
     }
 }
 
-// TRUE if we're between the above two calls
+// true if we're between the above two calls
 bool wxIsBusy()
 {
     return (gs_wxBusyCursorCount > 0);
@@ -521,7 +534,7 @@ wxString wxMacFindFolder( short        vol,
               OSType       folderType,
               Boolean      createFolder)
 {
-    FSRef fsRef ;    
+    FSRef fsRef ;
     wxString strDir ;
 
     if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr)
@@ -539,7 +552,7 @@ wxString wxMacFindFolder( short        vol,
 bool wxCheckForInterrupt(wxWindow *wnd)
 {
     // TODO
-    return FALSE;
+    return false;
 }
 
 void wxGetMousePosition( int* x, int* y )
@@ -552,10 +565,10 @@ void wxGetMousePosition( int* x, int* y )
     *y = pt.v ;
 };
 
-// Return TRUE if we have a colour display
+// Return true if we have a colour display
 bool wxColourDisplay()
 {
-    return TRUE;
+    return true;
 }
 
 // Returns depth of screen
@@ -644,7 +657,7 @@ wxChar *wxGetUserHome (const wxString& user)
 bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
 {
     if ( path.empty() )
-        return FALSE;
+        return false;
 
     wxString p = path ;
     if (p[0u] == ':' ) {
@@ -659,7 +672,7 @@ bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
     p = p + wxT(":") ;
 
     OSErr err = noErr ;
-    
+
     FSRef fsRef ;
     err = wxMacPathToFSRef( p , &fsRef ) ;
     if ( noErr == err )
@@ -672,14 +685,14 @@ bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
             err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes ) ;
             if ( noErr == err )
             {
-                if ( pTotal ) 
+                if ( pTotal )
                     *pTotal = wxLongLong( totalBytes ) ;
                 if ( pFree )
                     *pFree = wxLongLong( freeBytes ) ;
             }
         }
     }
-    
+
     return err == noErr ;
 }
 #endif // !__DARWIN__
@@ -722,14 +735,21 @@ void wxMacWakeUp()
     if ( isSame )
     {
 #if TARGET_CARBON
-        EventRef dummyEvent ;
-        OSStatus err = MacCreateEvent(nil, 'WXMC', 'WXMC', GetCurrentEventTime(),
-                        kEventAttributeNone, &dummyEvent);
-        if (err == noErr) 
+        static wxMacCarbonEvent s_wakeupEvent ;
+        OSStatus err = noErr ;
+        if ( !s_wakeupEvent.IsValid() )
         {
-            err = PostEventToQueue(GetMainEventQueue(), dummyEvent,
+           err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
+                        kEventAttributeNone ) ;
+        }
+        if ( err == noErr )
+        {
+            if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) )
+                return ;
+            s_wakeupEvent.SetCurrentTime() ;
+            err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent,
                                   kEventPriorityHigh);
-        } 
+        }
 #else
         PostEvent( nullEvent , 0 ) ;
 #endif
@@ -744,6 +764,38 @@ void wxMacWakeUp()
 
 #if wxUSE_GUI
 
+// ----------------------------------------------------------------------------
+// Native Struct Conversions
+// ----------------------------------------------------------------------------
+
+
+void wxMacRectToNative( const wxRect *wx , Rect *n ) 
+{
+    n->left = wx->x ;
+    n->top = wx->y ;
+    n->right = wx->x + wx->width ;
+    n->bottom = wx->y + wx->height ;
+}
+
+void wxMacNativeToRect( const Rect *n , wxRect* wx ) 
+{
+    wx->x = n->left ;
+    wx->y = n->top ;
+    wx->width = n->right - n->left ;
+    wx->height = n->bottom - n->top ;
+}
+
+void wxMacPointToNative( const wxPoint* wx , Point *n ) 
+{
+    n->h = wx->x ;
+    n->v = wx->y ;
+}
+
+void wxMacNativeToPoint( const Point *n , wxPoint* wx ) 
+{
+    wx->x = n->h ;
+    wx->y = n->v ;
+}
 
 // ----------------------------------------------------------------------------
 // Carbon Event Support
@@ -752,63 +804,100 @@ void wxMacWakeUp()
 
 OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData)
 {
-    return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ) ;   
+    return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ) ;
 }
 
 OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData)
 {
-    return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ) ;   
+    return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ) ;
 }
 
 // ----------------------------------------------------------------------------
 // Control Access Support
 // ----------------------------------------------------------------------------
 
+wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl )
+{
+    Init() ;
+    m_peer = peer ;
+    m_isRootControl = isRootControl ;
+    m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing() ;
+}
+
+wxMacControl::wxMacControl( wxWindow* peer , ControlRef control ) 
+{
+    Init() ;
+    m_peer = peer ;
+    m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing() ;
+    m_controlRef = control ;
+}
+
+wxMacControl::wxMacControl( wxWindow* peer , WXWidget control )
+{
+    Init() ;
+    m_peer = peer ;
+    m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing() ;
+    m_controlRef = (ControlRef) control ;
+}
+
+wxMacControl::~wxMacControl()
+{
+}
+
+void wxMacControl::Init()
+{
+    m_peer = NULL ;
+    m_controlRef = NULL ;
+    m_needsFocusRect = false ;
+    m_isCompositing = false ;
+    m_isRootControl = false ;
+}
+
 void wxMacControl::Dispose()
 {
     ::DisposeControl( m_controlRef ) ;
     m_controlRef = NULL ;
 }
 
-void wxMacControl::SetReference( SInt32 data ) 
+void wxMacControl::SetReference( SInt32 data )
 {
     SetControlReference( m_controlRef , data ) ;
 }
 
 OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const
 {
-    return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize ) ;   
+    return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize ) ;
 }
 
 OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const
 {
-    return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize ) ;   
+    return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize ) ;
 }
 
 OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData)
 {
-    return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData ) ;   
+    return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData ) ;
 }
 
-OSStatus wxMacControl::SendEvent(  EventRef event , OptionBits inOptions ) 
+OSStatus wxMacControl::SendEvent(  EventRef event , OptionBits inOptions )
 {
 #if TARGET_API_MAC_OSX
-    return SendEventToEventTargetWithOptions( event, 
-        HIObjectGetEventTarget(  (HIObjectRef) m_controlRef ), inOptions );        
+    return SendEventToEventTargetWithOptions( event,
+        HIObjectGetEventTarget(  (HIObjectRef) m_controlRef ), inOptions );
 #else
-    #pragma unused(inOptions) 
+    #pragma unused(inOptions)
     return SendEventToEventTarget(event,GetControlEventTarget( m_controlRef ) ) ;
 #endif
 }
 
-OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions ) 
+OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions )
 {
     wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess ) ;
     event.SetParameter<HICommand>(kEventParamDirectObject,command) ;
-    return SendEvent( event , inOptions ) ;     
+    return SendEvent( event , inOptions ) ;
 }
 
-OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions  ) 
+OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions  )
 {
     HICommand command ;
     memset( &command, 0 , sizeof(command) ) ;
@@ -816,7 +905,7 @@ OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions  )
     return SendHICommand( command , inOptions ) ;
 }
 
-void wxMacControl::Flash( ControlPartCode part , UInt32 ticks ) 
+void wxMacControl::Flash( ControlPartCode part , UInt32 ticks )
 {
     HiliteControl( m_controlRef , part ) ;
     unsigned long finalTicks ;
@@ -825,86 +914,95 @@ void wxMacControl::Flash( ControlPartCode part , UInt32 ticks )
 }
 
 SInt32 wxMacControl::GetValue() const
-{ 
-    return ::GetControl32BitValue( m_controlRef ) ; 
+{
+    return ::GetControl32BitValue( m_controlRef ) ;
 }
 
 SInt32 wxMacControl::GetMaximum() const
-{ 
-    return ::GetControl32BitMaximum( m_controlRef ) ; 
+{
+    return ::GetControl32BitMaximum( m_controlRef ) ;
 }
 
 SInt32 wxMacControl::GetMinimum() const
-{ 
-    return ::GetControl32BitMinimum( m_controlRef ) ; 
+{
+    return ::GetControl32BitMinimum( m_controlRef ) ;
 }
 
-void wxMacControl::SetValue( SInt32 v ) 
-{ 
-    ::SetControl32BitValue( m_controlRef , v ) ; 
+void wxMacControl::SetValue( SInt32 v )
+{
+    ::SetControl32BitValue( m_controlRef , v ) ;
 }
 
-void wxMacControl::SetMinimum( SInt32 v ) 
-{ 
-    ::SetControl32BitMinimum( m_controlRef , v ) ; 
+void wxMacControl::SetMinimum( SInt32 v )
+{
+    ::SetControl32BitMinimum( m_controlRef , v ) ;
 }
 
-void wxMacControl::SetMaximum( SInt32 v ) 
-{ 
+void wxMacControl::SetMaximum( SInt32 v )
+{
     ::SetControl32BitMaximum( m_controlRef , v ) ;
 }
 
 void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum )
 {
     ::SetControl32BitMinimum( m_controlRef , minimum ) ;
-    ::SetControl32BitMaximum( m_controlRef , maximum ) ; 
+    ::SetControl32BitMaximum( m_controlRef , maximum ) ;
     ::SetControl32BitValue( m_controlRef , value ) ;
 }
 
-OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart ) 
+OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart )
 {
-    return SetKeyboardFocus(  GetControlOwner( m_controlRef )  , 
+    return SetKeyboardFocus(  GetControlOwner( m_controlRef )  ,
         m_controlRef , focusPart ) ;
 }
 
-bool wxMacControl::HasFocus() const 
+bool wxMacControl::HasFocus() const
 {
     ControlRef control ;
     GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
     return control == m_controlRef ;
 }
 
-bool wxMacControl::NeedsFocusRect() const 
+void wxMacControl::SetNeedsFocusRect( bool needs ) 
 {
-    return false ;
+    m_needsFocusRect = needs ;
 }
 
-void wxMacControl::VisibilityChanged(bool shown) 
+bool wxMacControl::NeedsFocusRect() const
 {
+    return m_needsFocusRect ;
 }
 
-void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) 
+void wxMacControl::VisibilityChanged(bool shown)
+{
+}
+
+void wxMacControl::SuperChangedPosition()
+{
+}
+
+void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
 {
     m_font = font ;
-       ControlFontStyleRec     fontStyle;
-       if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
-       {
-           switch( font.MacGetThemeFontID() )
-           {
-               case kThemeSmallSystemFont :    fontStyle.font = kControlFontSmallSystemFont ;  break ;
-               case 109 /*mini font */ :       fontStyle.font = -5 ;                           break ;
-               case kThemeSystemFont :         fontStyle.font = kControlFontBigSystemFont ;    break ;
-               default :                       fontStyle.font = kControlFontBigSystemFont ;    break ;
-           }
-           fontStyle.flags = kControlUseFontMask ; 
-       }
-       else
-       {
-           fontStyle.font = font.MacGetFontNum() ;
-           fontStyle.style = font.MacGetFontStyle() ;
-           fontStyle.size = font.MacGetFontSize() ;
-           fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask ;
-       }
+    ControlFontStyleRec fontStyle;
+    if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
+    {
+        switch( font.MacGetThemeFontID() )
+        {
+            case kThemeSmallSystemFont :    fontStyle.font = kControlFontSmallSystemFont ;  break ;
+            case 109 /*mini font */ :       fontStyle.font = -5 ;                           break ;
+            case kThemeSystemFont :         fontStyle.font = kControlFontBigSystemFont ;    break ;
+            default :                       fontStyle.font = kControlFontBigSystemFont ;    break ;
+        }
+        fontStyle.flags = kControlUseFontMask ;
+    }
+    else
+    {
+        fontStyle.font = font.MacGetFontNum() ;
+        fontStyle.style = font.MacGetFontStyle() ;
+        fontStyle.size = font.MacGetFontSize() ;
+        fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask ;
+    }
 
     fontStyle.just = teJustLeft ;
     fontStyle.flags |= kControlUseJustMask ;
@@ -913,32 +1011,32 @@ void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , l
     else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
         fontStyle.just = teJustRight ;
 
-    
+
     // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
     // won't get grayed out by the system anymore
-    
+
     if ( foreground != *wxBLACK )
     {
         fontStyle.foreColor = MAC_WXCOLORREF(foreground.GetPixel() ) ;
         fontStyle.flags |= kControlUseForeColorMask ;
     }
-       
-       ::SetControlFontStyle( m_controlRef , &fontStyle );
+
+    ::SetControlFontStyle( m_controlRef , &fontStyle );
 }
 
-void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) ) 
+void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
 {
-    // TODO 
+    // TODO
     // setting up a color proc is not recommended anymore
 }
 
 void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
 {
     ::SetControl32BitMinimum( m_controlRef , minimum ) ;
-    ::SetControl32BitMaximum( m_controlRef , maximum ) ; 
+    ::SetControl32BitMaximum( m_controlRef , maximum ) ;
 }
 
-short wxMacControl::HandleKey(  SInt16 keyCode,  SInt16 charCode, EventModifiers modifiers ) 
+short wxMacControl::HandleKey(  SInt16 keyCode,  SInt16 charCode, EventModifiers modifiers )
 {
     return HandleControlKey( m_controlRef , keyCode , charCode , modifiers ) ;
 }
@@ -958,17 +1056,17 @@ SInt32 wxMacControl::GetViewSize() const
     return GetControlViewSize( m_controlRef ) ;
 }
 
-bool wxMacControl::IsVisible() const 
+bool wxMacControl::IsVisible() const
 {
     return IsControlVisible( m_controlRef ) ;
 }
 
-void wxMacControl::SetVisibility( bool visible , bool redraw ) 
+void wxMacControl::SetVisibility( bool visible , bool redraw )
 {
     SetControlVisibility( m_controlRef , visible , redraw ) ;
 }
 
-bool wxMacControl::IsEnabled() const 
+bool wxMacControl::IsEnabled() const
 {
 #if TARGET_API_MAC_OSX
     return IsControlEnabled( m_controlRef ) ;
@@ -977,12 +1075,12 @@ bool wxMacControl::IsEnabled() const
 #endif
 }
 
-bool wxMacControl::IsActive() const 
+bool wxMacControl::IsActive() const
 {
     return IsControlActive( m_controlRef ) ;
 }
 
-void wxMacControl::Enable( bool enable ) 
+void wxMacControl::Enable( bool enable )
 {
 #if TARGET_API_MAC_OSX
     if ( enable )
@@ -997,74 +1095,206 @@ void wxMacControl::Enable( bool enable )
 #endif
 }
 
-void wxMacControl::SetDrawingEnabled( bool enable ) 
+void wxMacControl::SetDrawingEnabled( bool enable )
 {
 #if TARGET_API_MAC_OSX
     HIViewSetDrawingEnabled( m_controlRef , enable ) ;
 #endif
 }
 
-bool wxMacControl::GetNeedsDisplay() const 
+#if TARGET_API_MAC_OSX
+bool wxMacControl::GetNeedsDisplay() const
 {
 #if TARGET_API_MAC_OSX
-    return HIViewGetNeedsDisplay( m_controlRef ) ;
-#else
-    return false ;
+    if ( m_isCompositing )
+    {
+        return HIViewGetNeedsDisplay( m_controlRef ) ;
+       }
+       else
 #endif
+       {
+               if ( !IsVisible() )
+            return false ;
+                       
+           Rect controlBounds ; 
+           GetControlBounds( m_controlRef, &controlBounds ) ;
+           RgnHandle rgn = NewRgn() ;
+               GetWindowRegion ( GetControlOwner( m_controlRef ) , kWindowUpdateRgn , rgn ) ;
+               Boolean intersect = RectInRgn ( &controlBounds , rgn ) ;
+               DisposeRgn( rgn ) ;
+               return intersect ;
+       }
+
 }
+#endif
 
-void wxMacControl::SetNeedsDisplay( bool needsDisplay , RgnHandle where ) 
+void wxMacControl::SetNeedsDisplay( RgnHandle where )
 {
+    if ( !IsVisible() )
+        return ;
+        
 #if TARGET_API_MAC_OSX
-    if ( where != NULL )
-        HIViewSetNeedsDisplayInRegion( m_controlRef , where , needsDisplay ) ;
+    if ( m_isCompositing )
+    {
+        HIViewSetNeedsDisplayInRegion( m_controlRef , where , true ) ;
+    }
     else
-        HIViewSetNeedsDisplay( m_controlRef , needsDisplay ) ;
 #endif
+    {
+        Rect controlBounds ; 
+        GetControlBounds( m_controlRef, &controlBounds ) ;
+        RgnHandle update = NewRgn() ;
+        CopyRgn( where , update ) ;
+        OffsetRgn( update , controlBounds.left , controlBounds.top ) ;
+        InvalWindowRgn( GetControlOwner( m_controlRef) , update ) ; 
+    }
 }
 
-void  wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to ) 
+void wxMacControl::SetNeedsDisplay( Rect* where )
 {
+    if ( !IsVisible() )
+        return ;
+
 #if TARGET_API_MAC_OSX
-    HIPoint hiPoint ;
-    hiPoint.x = pt->x ;
-    hiPoint.y = pt->y ;
-    HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef  ) ;
-    pt->x = (int)hiPoint.x ;
-    pt->y = (int)hiPoint.y ;
+    if ( m_isCompositing )
+    {
+        if ( where != NULL )
+        {
+            RgnHandle update = NewRgn() ;
+            RectRgn( update , where ) ;
+            HIViewSetNeedsDisplayInRegion( m_controlRef , update , true ) ;
+            DisposeRgn( update ) ;
+        }
+        else
+            HIViewSetNeedsDisplay( m_controlRef , true ) ;
+    }
+    else
 #endif
+    {
+        Rect controlBounds ; 
+        GetControlBounds( m_controlRef, &controlBounds ) ;
+        if ( where )
+        {
+            Rect whereLocal = *where ;
+            OffsetRect( &whereLocal , controlBounds.left , controlBounds.top ) ;
+            SectRect( &controlBounds , &whereLocal, &controlBounds ) ;
+        }
+        InvalWindowRect( GetControlOwner( m_controlRef) , &controlBounds ) ; 
+    }
 }
 
-void wxMacControl::SetRect( Rect *r ) 
+void  wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
 {
 #if TARGET_API_MAC_OSX
-       //A HIRect is actually a CGRect on OSX - which consists of two structures -
-       //CGPoint and CGSize, which have two floats each
-    HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } } ;
-    HIViewSetFrame ( m_controlRef , &hir ) ;
-#else
-    SetControlBounds( m_controlRef , r ) ;
+    if ( from->m_peer->MacGetTopLevelWindow()->MacUsesCompositing() )
+    {
+        HIPoint hiPoint ;
+        hiPoint.x = pt->x ;
+        hiPoint.y = pt->y ;
+        HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef  ) ;
+        pt->x = (int)hiPoint.x ;
+        pt->y = (int)hiPoint.y ;
+    }
+    else
 #endif
+    {
+        Rect fromRect ;
+        Rect toRect ;
+        GetControlBounds( from->m_controlRef , &fromRect ) ;
+        GetControlBounds( to->m_controlRef , &toRect ) ;
+        if ( from->m_isRootControl )
+            fromRect.left = fromRect.top = 0 ;
+        if ( to->m_isRootControl )
+            toRect.left = toRect.top = 0 ; 
+                    
+        pt->x = pt->x + fromRect.left - toRect.left ;
+        pt->y = pt->y + fromRect.top - toRect.top ;
+    }
+}
 
+void wxMacControl::SetRect( Rect *r )
+{
+#if TARGET_API_MAC_OSX
+    if ( m_isCompositing )
+    {
+        //A HIRect is actually a CGRect on OSX - which consists of two structures -
+        //CGPoint and CGSize, which have two floats each
+        HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } } ;
+        HIViewSetFrame ( m_controlRef , &hir ) ;
+        // eventuall we might have to do a SetVisibility( false , true ) ;
+        // before and a SetVisibility( true , true ) ; after
+    }
+    else
+#endif
+    {
+        bool vis = IsVisible() ;
+        if ( vis )
+        {
+            Rect former ;
+            GetControlBounds( m_controlRef , &former ) ;
+            InvalWindowRect( GetControlOwner( m_controlRef ) , &former ) ;
+        }
+        
+        Rect controlBounds = *r ;
+        
+        // since the rect passed in is always (even in non-compositing) relative
+        // to the (native) parent, we have to adjust to window relative here
+        wxMacControl* parent = m_peer->GetParent()->GetPeer() ;
+        if( parent->m_isRootControl == false )
+        {
+            Rect superRect ;
+            GetControlBounds( parent->m_controlRef , &superRect ) ;
+            OffsetRect( &controlBounds , superRect.left , superRect.top ) ;
+        }
+        
+        SetControlBounds( m_controlRef , &controlBounds ) ;
+        if ( vis )
+        {
+            InvalWindowRect( GetControlOwner( m_controlRef ) , &controlBounds ) ;
+        }
+    }
 }
 
-void wxMacControl::GetRect( Rect *r ) 
+void wxMacControl::GetRect( Rect *r )
 {
     GetControlBounds( m_controlRef , r ) ;
+    if ( m_isCompositing == false )
+    {
+        // correct the case of the root control 
+        if ( m_isRootControl )
+        {
+            WindowRef wr = GetControlOwner( m_controlRef ) ;
+            GetWindowBounds( wr , kWindowContentRgn , r ) ;
+            r->right -= r->left ;
+            r->bottom -= r->top ;
+            r->left = 0 ;
+            r->top = 0 ;
+        }
+        else 
+        {
+            wxMacControl* parent = m_peer->GetParent()->GetPeer() ;
+            if( parent->m_isRootControl == false )
+            {
+                Rect superRect ;
+                GetControlBounds( parent->m_controlRef , &superRect ) ;
+                OffsetRect( r , -superRect.left , -superRect.top ) ;
+            }
+        }
+    }
 }
 
-void wxMacControl::GetRectInWindowCoords( Rect *r ) 
+void wxMacControl::GetRectInWindowCoords( Rect *r )
 {
     UMAGetControlBoundsInWindowCoords( m_controlRef , r ) ;
 }
 
-void wxMacControl::GetBestRect( Rect *r ) 
+void wxMacControl::GetBestRect( Rect *r )
 {
     short   baselineoffset ;
     GetBestControlRect( m_controlRef , r , &baselineoffset ) ;
 }
 
-void wxMacControl::SetTitle( const wxString &title ) 
+void wxMacControl::SetTitle( const wxString &title )
 {
     wxFontEncoding encoding;
 
@@ -1072,7 +1302,7 @@ void wxMacControl::SetTitle( const wxString &title )
         encoding = m_font.GetEncoding();
     else
         encoding = wxFont::GetDefaultEncoding();
-    
+
     UMASetControlTitle(  m_controlRef , title , encoding ) ;
 }
 
@@ -1081,15 +1311,26 @@ void wxMacControl::GetFeatures( UInt32 * features )
     GetControlFeatures( m_controlRef , features ) ;
 }
 
-OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region ) 
+OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
 {
-    return GetControlRegion( m_controlRef , partCode , region ) ;
+    OSStatus err = GetControlRegion( m_controlRef , partCode , region ) ;
+    if ( m_isCompositing == false )
+    {
+        if ( !m_isRootControl )
+        {
+            Rect r ;
+            GetControlBounds(m_controlRef, &r ) ;
+            if ( !EmptyRgn( region ) )
+                OffsetRgn( region , -r.left , -r.top ) ; 
+        }
+    }
+    return err ;
 }
 
-OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other ) 
+OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
 {
 #if TARGET_API_MAC_OSX
-    return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow, 
+    return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
        (other != NULL) ? other->m_controlRef : NULL) ;
 #else
     return 0 ;
@@ -1103,7 +1344,7 @@ static void InvalidateControlAndChildren( HIViewRef control )
 {
     HIViewSetNeedsDisplay( control , true ) ;
     UInt16 childrenCount = 0 ;
-    OSStatus err = CountSubControls( control , &childrenCount ) ; 
+    OSStatus err = CountSubControls( control , &childrenCount ) ;
     if ( err == errControlIsNotEmbedder )
         return ;
     wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
@@ -1119,19 +1360,36 @@ static void InvalidateControlAndChildren( HIViewRef control )
 }
 #endif
 
-void wxMacControl::InvalidateWithChildren() 
+void wxMacControl::InvalidateWithChildren()
 {
 #if TARGET_API_MAC_OSX
     InvalidateControlAndChildren( m_controlRef ) ;
 #endif
 }
 
-void wxMacControl::ScrollRect( const wxRect &r , int dx , int dy ) 
+void wxMacControl::ScrollRect( wxRect *r , int dx , int dy ) 
 {
+       wxASSERT( r != NULL ) ;
 #if TARGET_API_MAC_OSX
-    HIRect scrollarea = CGRectMake( r.x , r.y , r.width , r.height) ;
-    HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ) ;
+       if ( m_isCompositing )
+       {
+               HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height) ;
+        HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ) ;
+       }
+       else
 #endif
+       {
+               Rect bounds ;
+               GetControlBounds( m_controlRef , &bounds ) ;
+               bounds.left += r->x ;
+               bounds.top += r->y ;
+               bounds.bottom = bounds.top + r->height ;
+               bounds.right = bounds.left + r->width ;
+               wxMacWindowClipper clip( m_peer ) ;
+               RgnHandle updateRgn = NewRgn() ;
+               ::ScrollRect( &bounds , dx , dy , updateRgn ) ;
+               InvalWindowRgn( GetControlOwner( m_controlRef )  ,  updateRgn ) ;
+       }
 }
 
 
@@ -1141,13 +1399,13 @@ void wxMacControl::ScrollRect( const wxRect &r , int dx , int dy )
 // Databrowser
 //
 
-OSStatus wxMacControl::SetSelectionFlags( DataBrowserSelectionFlags options ) 
+OSStatus wxMacControl::SetSelectionFlags( DataBrowserSelectionFlags options )
 {
     return SetDataBrowserSelectionFlags( m_controlRef , options ) ;
 }
 
 OSStatus wxMacControl::AddListViewColumn( DataBrowserListViewColumnDesc *columnDesc,
-        DataBrowserTableViewColumnIndex position ) 
+        DataBrowserTableViewColumnIndex position )
 {
     return AddDataBrowserListViewColumn( m_controlRef , columnDesc, position ) ;
 }
@@ -1157,7 +1415,7 @@ OSStatus wxMacControl::AutoSizeListViewColumns()
     return AutoSizeDataBrowserListViewColumns(m_controlRef) ;
 }
 
-OSStatus wxMacControl::SetHasScrollBars( bool horiz , bool vert ) 
+OSStatus wxMacControl::SetHasScrollBars( bool horiz , bool vert )
 {
     return SetDataBrowserHasScrollBars( m_controlRef , horiz , vert ) ;
 }
@@ -1167,58 +1425,58 @@ OSStatus wxMacControl::SetTableViewHiliteStyle( DataBrowserTableViewHiliteStyle
     return SetDataBrowserTableViewHiliteStyle( m_controlRef , hiliteStyle ) ;
 }
 
-OSStatus wxMacControl::SetListViewHeaderBtnHeight(UInt16 height) 
+OSStatus wxMacControl::SetListViewHeaderBtnHeight(UInt16 height)
 {
     return SetDataBrowserListViewHeaderBtnHeight( m_controlRef ,height ) ;
 }
 
-OSStatus wxMacControl::SetCallbacks(const DataBrowserCallbacks *  callbacks) 
+OSStatus wxMacControl::SetCallbacks(const DataBrowserCallbacks *  callbacks)
 {
     return SetDataBrowserCallbacks( m_controlRef , callbacks ) ;
 }
 
 OSStatus wxMacControl::UpdateItems( DataBrowserItemID container, UInt32 numItems,
-        const DataBrowserItemID* items,                
+        const DataBrowserItemID* items,
         DataBrowserPropertyID preSortProperty,
-        DataBrowserPropertyID propertyID ) 
+        DataBrowserPropertyID propertyID )
 {
     return UpdateDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty, propertyID ) ;
 }
 
-bool wxMacControl::IsItemSelected( DataBrowserItemID item ) 
+bool wxMacControl::IsItemSelected( DataBrowserItemID item )
 {
     return IsDataBrowserItemSelected( m_controlRef , item ) ;
 }
 
 OSStatus wxMacControl::AddItems( DataBrowserItemID container, UInt32 numItems,
-            const DataBrowserItemID* items,                
-            DataBrowserPropertyID preSortProperty ) 
+            const DataBrowserItemID* items,
+            DataBrowserPropertyID preSortProperty )
 {
     return AddDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty ) ;
 }
 
 OSStatus wxMacControl::RemoveItems( DataBrowserItemID container, UInt32 numItems,
-            const DataBrowserItemID* items,                
-            DataBrowserPropertyID preSortProperty ) 
+            const DataBrowserItemID* items,
+            DataBrowserPropertyID preSortProperty )
 {
     return RemoveDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty ) ;
 }
 
 OSStatus wxMacControl::RevealItem( DataBrowserItemID item,
             DataBrowserPropertyID propertyID,
-            DataBrowserRevealOptions options ) 
+            DataBrowserRevealOptions options )
 {
     return RevealDataBrowserItem( m_controlRef , item , propertyID , options ) ;
 }
 
 OSStatus wxMacControl::SetSelectedItems(UInt32 numItems,
             const DataBrowserItemID * items,
-            DataBrowserSetOption operation ) 
+            DataBrowserSetOption operation )
 {
     return SetDataBrowserSelectedItems( m_controlRef , numItems , items, operation ) ;
 }
 
-OSStatus wxMacControl::GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last ) 
+OSStatus wxMacControl::GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last )
 {
     return GetDataBrowserSelectionAnchor( m_controlRef , first , last ) ;
 }
@@ -1226,11 +1484,79 @@ OSStatus wxMacControl::GetSelectionAnchor( DataBrowserItemID * first, DataBrowse
 //
 // Tab Control
 //
-OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable ) 
+
+OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
 {
     return ::SetTabEnabled( m_controlRef , tabNo , enable ) ;
 }
+
+//
+// Quartz Support
+//
+
+#ifdef __WXMAC_OSX__
+// snippets from Sketch Sample from Apple :
+
+#define        kGenericRGBProfilePathStr       "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
+/*
+    This function locates, opens, and returns the profile reference for the calibrated 
+    Generic RGB color space. It is up to the caller to call CMCloseProfile when done
+    with the profile reference this function returns.
+*/
+CMProfileRef wxMacOpenGenericProfile(void)
+{
+    static CMProfileRef cachedRGBProfileRef = NULL;
+    
+    // we only create the profile reference once
+    if (cachedRGBProfileRef == NULL)
+    {
+               CMProfileLocation       loc;
+       
+               loc.locType = cmPathBasedProfile;
+               strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr);
+       
+               verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) );
+    }
+
+    if (cachedRGBProfileRef)
+    {
+               // clone the profile reference so that the caller has their own reference, not our cached one
+               CMCloneProfileRef(cachedRGBProfileRef);   
+    }
+
+    return cachedRGBProfileRef;
+}
+
+/*
+    Return the generic RGB color space. This is a 'get' function and the caller should
+    not release the returned value unless the caller retains it first. Usually callers
+    of this routine will immediately use the returned colorspace with CoreGraphics
+    so they typically do not need to retain it themselves.
+    
+    This function creates the generic RGB color space once and hangs onto it so it can
+    return it whenever this function is called.
+*/
+
+CGColorSpaceRef wxMacGetGenericRGBColorSpace()
+{
+    static CGColorSpaceRef genericRGBColorSpace = NULL;
+
+       if (genericRGBColorSpace == NULL)
+       {
+               CMProfileRef genericRGBProfile = wxMacOpenGenericProfile();
+       
+               if (genericRGBProfile)
+               {
+                       genericRGBColorSpace = CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile);
+                       wxASSERT_MSG( genericRGBColorSpace != NULL, wxT("couldn't create the generic RGB color space") ) ;
+                       
+                       // we opened the profile so it is up to us to close it
+                       CMCloseProfile(genericRGBProfile); 
+               }
+       }
+    return genericRGBColorSpace;
+}
+#endif
+
 #endif // wxUSE_GUI