]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
splitted wxApp docs in wxApp+wxAppConsole docs; fix the signature of the documented...
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index d29746a500e26513e56857e0124aa9628bb044d3..12e9408f9b678213a283682557317f37b4a1b9b5 100644 (file)
@@ -57,6 +57,9 @@
 // constants
 // ----------------------------------------------------------------------------
 
 // constants
 // ----------------------------------------------------------------------------
 
+// unified title and toolbar constant - not in Tiger headers, so we duplicate it here
+#define kWindowUnifiedTitleAndToolbarAttribute (1 << 7)
+
 // trace mask for activation tracing messages
 static const wxChar *TRACE_ACTIVATE = _T("activation");
 
 // trace mask for activation tracing messages
 static const wxChar *TRACE_ACTIVATE = _T("activation");
 
@@ -76,7 +79,6 @@ static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16
 BEGIN_EVENT_TABLE(wxTopLevelWindowMac, wxTopLevelWindowBase)
 END_EVENT_TABLE()
 
 BEGIN_EVENT_TABLE(wxTopLevelWindowMac, wxTopLevelWindowBase)
 END_EVENT_TABLE()
 
-
 // ---------------------------------------------------------------------------
 // Carbon Events
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // Carbon Events
 // ---------------------------------------------------------------------------
@@ -99,6 +101,7 @@ static const EventTypeSpec eventList[] =
     { kEventClassWindow , kEventWindowBoundsChanging } ,
     { kEventClassWindow , kEventWindowBoundsChanged } ,
     { kEventClassWindow , kEventWindowClose } ,
     { kEventClassWindow , kEventWindowBoundsChanging } ,
     { kEventClassWindow , kEventWindowBoundsChanged } ,
     { kEventClassWindow , kEventWindowClose } ,
+    { kEventClassWindow , kEventWindowGetRegion } ,
 
     // we have to catch these events on the toplevel window level,
     // as controls don't get the raw mouse events anymore
 
     // we have to catch these events on the toplevel window level,
     // as controls don't get the raw mouse events anymore
@@ -208,25 +211,25 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
                 {
                     event.m_keyCode = WXK_CONTROL ;
                     event.SetEventType( ( modifiers & controlKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
                 {
                     event.m_keyCode = WXK_CONTROL ;
                     event.SetEventType( ( modifiers & controlKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
-                    focus->GetEventHandler()->ProcessEvent( event ) ;
+                    focus->HandleWindowEvent( event ) ;
                 }
                 if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & shiftKey )
                 {
                     event.m_keyCode = WXK_SHIFT ;
                     event.SetEventType( ( modifiers & shiftKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
                 }
                 if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & shiftKey )
                 {
                     event.m_keyCode = WXK_SHIFT ;
                     event.SetEventType( ( modifiers & shiftKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
-                    focus->GetEventHandler()->ProcessEvent( event ) ;
+                    focus->HandleWindowEvent( event ) ;
                 }
                 if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & optionKey )
                 {
                     event.m_keyCode = WXK_ALT ;
                     event.SetEventType( ( modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
                 }
                 if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & optionKey )
                 {
                     event.m_keyCode = WXK_ALT ;
                     event.SetEventType( ( modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
-                    focus->GetEventHandler()->ProcessEvent( event ) ;
+                    focus->HandleWindowEvent( event ) ;
                 }
                 if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & cmdKey )
                 {
                     event.m_keyCode = WXK_COMMAND ;
                     event.SetEventType( ( modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
                 }
                 if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & cmdKey )
                 {
                     event.m_keyCode = WXK_COMMAND ;
                     event.SetEventType( ( modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
-                    focus->GetEventHandler()->ProcessEvent( event ) ;
+                    focus->HandleWindowEvent( event ) ;
                 }
 
                 wxApp::s_lastModifiers = modifiers ;
                 }
 
                 wxApp::s_lastModifiers = modifiers ;
@@ -249,17 +252,22 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
 wxWindow* g_MacLastWindow = NULL ;
 
 EventMouseButton g_lastButton = 0 ;
 wxWindow* g_MacLastWindow = NULL ;
 
 EventMouseButton g_lastButton = 0 ;
+bool g_lastButtonWasFakeRight = false ;
 
 void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
 {
     UInt32 modifiers = cEvent.GetParameter<UInt32>(kEventParamKeyModifiers, typeUInt32) ;
     Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
 
 
 void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
 {
     UInt32 modifiers = cEvent.GetParameter<UInt32>(kEventParamKeyModifiers, typeUInt32) ;
     Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
 
-    // this parameter are not given for all events
+    // these parameters are not given for all events
     EventMouseButton button = 0 ;
     UInt32 clickCount = 0 ;
     EventMouseButton button = 0 ;
     UInt32 clickCount = 0 ;
+    UInt32 mouseChord = 0;
+
     cEvent.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton , &button ) ;
     cEvent.GetParameter<UInt32>( kEventParamClickCount, typeUInt32 , &clickCount ) ;
     cEvent.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton , &button ) ;
     cEvent.GetParameter<UInt32>( kEventParamClickCount, typeUInt32 , &clickCount ) ;
+    // the chord is the state of the buttons pressed currently
+    cEvent.GetParameter<UInt32>( kEventParamMouseChord, typeUInt32 , &mouseChord ) ;
 
     wxevent.m_x = screenMouseLocation.h;
     wxevent.m_y = screenMouseLocation.v;
 
     wxevent.m_x = screenMouseLocation.h;
     wxevent.m_y = screenMouseLocation.v;
@@ -267,11 +275,16 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     wxevent.m_controlDown = modifiers & controlKey;
     wxevent.m_altDown = modifiers & optionKey;
     wxevent.m_metaDown = modifiers & cmdKey;
     wxevent.m_controlDown = modifiers & controlKey;
     wxevent.m_altDown = modifiers & optionKey;
     wxevent.m_metaDown = modifiers & cmdKey;
+    wxevent.m_clickCount = clickCount;
     wxevent.SetTimestamp( cEvent.GetTicks() ) ;
 
     wxevent.SetTimestamp( cEvent.GetTicks() ) ;
 
-   // a control click is interpreted as a right click
+    // a control click is interpreted as a right click
+    bool thisButtonIsFakeRight = false ;
     if ( button == kEventMouseButtonPrimary && (modifiers & controlKey) )
     if ( button == kEventMouseButtonPrimary && (modifiers & controlKey) )
+    {
         button = kEventMouseButtonSecondary ;
         button = kEventMouseButtonSecondary ;
+        thisButtonIsFakeRight = true ;
+    }
 
     // otherwise we report double clicks by connecting a left click with a ctrl-left click
     if ( clickCount > 1 && button != g_lastButton )
 
     // otherwise we report double clicks by connecting a left click with a ctrl-left click
     if ( clickCount > 1 && button != g_lastButton )
@@ -281,35 +294,32 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     // mouse down, moved and mouse up, and does not deliver a right down and left up
 
     if ( cEvent.GetKind() == kEventMouseDown )
     // mouse down, moved and mouse up, and does not deliver a right down and left up
 
     if ( cEvent.GetKind() == kEventMouseDown )
+    {
         g_lastButton = button ;
         g_lastButton = button ;
+        g_lastButtonWasFakeRight = thisButtonIsFakeRight ;
+    }
 
     if ( button == 0 )
 
     if ( button == 0 )
+    {
         g_lastButton = 0 ;
         g_lastButton = 0 ;
-    else if ( g_lastButton )
+        g_lastButtonWasFakeRight = false ;
+    }
+    else if ( g_lastButton == kEventMouseButtonSecondary && g_lastButtonWasFakeRight )
         button = g_lastButton ;
 
         button = g_lastButton ;
 
-    // determine the correct down state, wx does not want a 'down' for a mouseUp event,
-    // while mac delivers this button
-    if ( button != 0 && cEvent.GetKind() != kEventMouseUp )
-    {
-        switch ( button )
-        {
-            case kEventMouseButtonPrimary :
-                wxevent.m_leftDown = true ;
-                break ;
+    // Adjust the chord mask to remove the primary button and add the
+    // secondary button.  It is possible that the secondary button is
+    // already pressed, e.g. on a mouse connected to a laptop, but this
+    // possibility is ignored here:
+    if( thisButtonIsFakeRight && ( mouseChord & 1U ) )
+        mouseChord = ((mouseChord & ~1U) | 2U);
 
 
-            case kEventMouseButtonSecondary :
+    if(mouseChord & 1U)
+                wxevent.m_leftDown = true ;
+    if(mouseChord & 2U)
                 wxevent.m_rightDown = true ;
                 wxevent.m_rightDown = true ;
-                break ;
-
-            case kEventMouseButtonTertiary :
+    if(mouseChord & 4U)
                 wxevent.m_middleDown = true ;
                 wxevent.m_middleDown = true ;
-                break ;
-
-            default:
-                break ;
-        }
-    }
 
     // translate into wx types
     switch ( cEvent.GetKind() )
 
     // translate into wx types
     switch ( cEvent.GetKind() )
@@ -369,80 +379,23 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
         }
         break ;
 
         }
         break ;
 
-        default :
+        case kEventMouseEntered :
+        case kEventMouseExited :
+        case kEventMouseDragged :
+        case kEventMouseMoved :
             wxevent.SetEventType( wxEVT_MOTION ) ;
             wxevent.SetEventType( wxEVT_MOTION ) ;
+            break;
+        default :
             break ;
     }
 }
 
             break ;
     }
 }
 
-ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point& location , ControlRef superControl , ControlPartCode *outPart )
-{
-    if ( superControl )
-    {
-        UInt16 childrenCount = 0 ;
-        ControlHandle sibling ;
-        Rect r ;
-        OSStatus err = CountSubControls( superControl , &childrenCount ) ;
-        if ( err == errControlIsNotEmbedder )
-            return NULL ;
-
-        wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
-
-        for ( UInt16 i = childrenCount ; i >=1  ; --i )
-        {
-            err = GetIndexedSubControl( superControl , i , & sibling ) ;
-            if ( err == errControlIsNotEmbedder )
-                return NULL ;
-
-            wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
-            if ( IsControlVisible( sibling ) )
-            {
-                UMAGetControlBoundsInWindowCoords( sibling , &r ) ;
-                if ( MacPtInRect( location , &r ) )
-                {
-                    ControlHandle child = wxMacFindSubControl( toplevelWindow , location , sibling , outPart ) ;
-                    if ( child )
-                    {
-                        return child ;
-                    }
-                    else
-                    {
-                        Point testLocation = location ;
-
-                        if ( toplevelWindow )
-                        {
-                            testLocation.h -= r.left ;
-                            testLocation.v -= r.top ;
-                        }
-
-                        *outPart = TestControl( sibling , testLocation ) ;
-
-                        return sibling ;
-                    }
-                }
-            }
-        }
-    }
-
-    return NULL ;
-}
-
-ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , const Point& location , WindowRef window , ControlPartCode *outPart )
-{
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1030 )
-        return FindControlUnderMouse( location , window , outPart ) ;
-#endif
-
-    ControlRef rootControl = NULL ;
-    verify_noerr( GetRootControl( window , &rootControl ) ) ;
-
-    return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ;
-}
-
 #define NEW_CAPTURE_HANDLING 1
 
 #define NEW_CAPTURE_HANDLING 1
 
-pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+pascal OSStatus
+wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
+                               EventRef event,
+                               void *data)
 {
     wxTopLevelWindowMac* toplevelWindow = (wxTopLevelWindowMac*) data ;
 
 {
     wxTopLevelWindowMac* toplevelWindow = (wxTopLevelWindowMac*) data ;
 
@@ -482,7 +435,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         else if ( (IsWindowActive(window) && windowPart == inContent) )
         {
             ControlPartCode part ;
         else if ( (IsWindowActive(window) && windowPart == inContent) )
         {
             ControlPartCode part ;
-            control = wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &part ) ;
+            control = FindControlUnderMouse( windowMouseLocation , window , &part ) ;
             // if there is no control below the mouse position, send the event to the toplevel window itself
             if ( control == 0 )
             {
             // if there is no control below the mouse position, send the event to the toplevel window itself
             if ( control == 0 )
             {
@@ -490,7 +443,8 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
             }
             else
             {
             }
             else
             {
-                currentMouseWindow = wxFindControlFromMacControl( control ) ;
+                currentMouseWindow = (wxWindow*) wxFindControlFromMacControl( control ) ;
+#ifndef __WXUNIVERSAL__
                 if ( currentMouseWindow == NULL && cEvent.GetKind() == kEventMouseMoved )
                 {
 #if wxUSE_TOOLBAR
                 if ( currentMouseWindow == NULL && cEvent.GetKind() == kEventMouseMoved )
                 {
 #if wxUSE_TOOLBAR
@@ -498,11 +452,12 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
                     // instead of its children (wxToolBarTools)
                     ControlRef parent ;
                     GetSuperControl(control, &parent );
                     // instead of its children (wxToolBarTools)
                     ControlRef parent ;
                     GetSuperControl(control, &parent );
-                    wxWindow *wxParent = wxFindControlFromMacControl( parent ) ;
+                    wxWindow *wxParent = (wxWindow*) wxFindControlFromMacControl( parent ) ;
                     if ( wxParent && wxParent->IsKindOf( CLASSINFO( wxToolBar ) ) )
                         currentMouseWindow = wxParent ;
 #endif
                 }
                     if ( wxParent && wxParent->IsKindOf( CLASSINFO( wxToolBar ) ) )
                         currentMouseWindow = wxParent ;
 #endif
                 }
+#endif
             }
 
             // disabled windows must not get any input messages
             }
 
             // disabled windows must not get any input messages
@@ -530,7 +485,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
             wxToolTip::RelayEvent( g_MacLastWindow , eventleave);
 #endif
 
             wxToolTip::RelayEvent( g_MacLastWindow , eventleave);
 #endif
 
-            g_MacLastWindow->GetEventHandler()->ProcessEvent(eventleave);
+            g_MacLastWindow->HandleWindowEvent(eventleave);
         }
 
         if ( currentMouseWindow )
         }
 
         if ( currentMouseWindow )
@@ -545,7 +500,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
             wxToolTip::RelayEvent( currentMouseWindow , evententer );
 #endif
 
             wxToolTip::RelayEvent( currentMouseWindow , evententer );
 #endif
 
-            currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
+            currentMouseWindow->HandleWindowEvent(evententer);
         }
 
         g_MacLastWindow = currentMouseWindow ;
         }
 
         g_MacLastWindow = currentMouseWindow ;
@@ -557,6 +512,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         if ( cEvent.GetKind() == kEventMouseDown )
         {
             ::MenuSelect( screenMouseLocation ) ;
         if ( cEvent.GetKind() == kEventMouseDown )
         {
             ::MenuSelect( screenMouseLocation ) ;
+            ::HiliteMenu(0);
             result = noErr ;
         }
     }
             result = noErr ;
         }
     }
@@ -576,7 +532,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
             wxToolTip::RelayEvent( currentMouseWindow , wxevent );
 #endif
 
             wxToolTip::RelayEvent( currentMouseWindow , wxevent );
 #endif
 
-        if ( currentMouseWindow->GetEventHandler()->ProcessEvent(wxevent) )
+        if ( currentMouseWindow->HandleWindowEvent(wxevent) )
         {
             if ((currentMouseWindowParent != NULL) &&
                 (currentMouseWindowParent->GetChildren().Find(currentMouseWindow) == NULL))
         {
             if ((currentMouseWindowParent != NULL) &&
                 (currentMouseWindowParent->GetChildren().Find(currentMouseWindow) == NULL))
@@ -594,38 +550,6 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
                 if (currentMouseWindow->CanAcceptFocus() && wxWindow::FindFocus()!=currentMouseWindow)
                     currentMouseWindow->SetFocus();
             }
                 if (currentMouseWindow->CanAcceptFocus() && wxWindow::FindFocus()!=currentMouseWindow)
                     currentMouseWindow->SetFocus();
             }
-
-            ControlPartCode dummyPart ;
-            // if built-in find control is finding the wrong control (ie static box instead of overlaid
-            // button, we cannot let the standard handler do its job, but must handle manually
-
-            if ( ( cEvent.GetKind() == kEventMouseDown )
-#ifdef __WXMAC_OSX__
-                &&
-                (FindControlUnderMouse(windowMouseLocation , window , &dummyPart) !=
-                wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &dummyPart ) )
-#endif
-                )
-            {
-                if ( currentMouseWindow->MacIsReallyEnabled() )
-                {
-                    EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
-                    Point clickLocation = windowMouseLocation ;
-
-                    currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ;
-
-                    HandleControlClick( (ControlRef) currentMouseWindow->GetHandle() , clickLocation ,
-                        modifiers , (ControlActionUPP ) -1 ) ;
-
-                    if ((currentMouseWindowParent != NULL) &&
-                        (currentMouseWindowParent->GetChildren().Find(currentMouseWindow) == NULL))
-                    {
-                        currentMouseWindow = NULL;
-                    }
-                }
-
-                result = noErr ;
-            }
         }
 
         if ( cEvent.GetKind() == kEventMouseUp && wxApp::s_captureWindow )
         }
 
         if ( cEvent.GetKind() == kEventMouseUp && wxApp::s_captureWindow )
@@ -639,11 +563,16 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         wxWindow* cursorTarget = currentMouseWindow ;
         wxPoint cursorPoint( wxevent.m_x , wxevent.m_y ) ;
 
         wxWindow* cursorTarget = currentMouseWindow ;
         wxPoint cursorPoint( wxevent.m_x , wxevent.m_y ) ;
 
-        while ( cursorTarget && !cursorTarget->MacSetupCursor( cursorPoint ) )
+        extern wxCursor gGlobalCursor;
+
+        if (!gGlobalCursor.IsOk())
         {
         {
-            cursorTarget = cursorTarget->GetParent() ;
-            if ( cursorTarget )
-                cursorPoint += cursorTarget->GetPosition();
+            while ( cursorTarget && !cursorTarget->MacSetupCursor( cursorPoint ) )
+            {
+                cursorTarget = cursorTarget->GetParent() ;
+                if ( cursorTarget )
+                    cursorPoint += cursorTarget->GetPosition();
+            }
         }
 
     }
         }
 
     }
@@ -656,14 +585,13 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         {
             EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
             Point clickLocation = windowMouseLocation ;
         {
             EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
             Point clickLocation = windowMouseLocation ;
-#if TARGET_API_MAC_OSX
+
             HIPoint hiPoint ;
             hiPoint.x = clickLocation.h ;
             hiPoint.y = clickLocation.v ;
             HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control  ) ;
             clickLocation.h = (int)hiPoint.x ;
             clickLocation.v = (int)hiPoint.y ;
             HIPoint hiPoint ;
             hiPoint.x = clickLocation.h ;
             hiPoint.y = clickLocation.v ;
             HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control  ) ;
             clickLocation.h = (int)hiPoint.x ;
             clickLocation.v = (int)hiPoint.y ;
-#endif // TARGET_API_MAC_OSX
 
             HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ;
             result = noErr ;
 
             HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ;
             result = noErr ;
@@ -673,7 +601,10 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
     return result ;
 }
 
     return result ;
 }
 
-static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus
+wxMacTopLevelWindowEventHandler(EventHandlerCallRef WXUNUSED(handler),
+                                EventRef event,
+                                void *data)
 {
     OSStatus result = eventNotHandledErr ;
 
 {
     OSStatus result = eventNotHandledErr ;
 
@@ -690,7 +621,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
             wxActivateEvent wxevent(wxEVT_ACTIVATE, true , toplevelWindow->GetId());
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
             wxActivateEvent wxevent(wxEVT_ACTIVATE, true , toplevelWindow->GetId());
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
-            toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
+            toplevelWindow->HandleWindowEvent(wxevent);
             // we still sending an eventNotHandledErr in order to allow for default processing
         }
             break ;
             // we still sending an eventNotHandledErr in order to allow for default processing
         }
             break ;
@@ -701,7 +632,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
             wxActivateEvent wxevent(wxEVT_ACTIVATE, false , toplevelWindow->GetId());
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
             wxActivateEvent wxevent(wxEVT_ACTIVATE, false , toplevelWindow->GetId());
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
-            toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
+            toplevelWindow->HandleWindowEvent(wxevent);
             // we still sending an eventNotHandledErr in order to allow for default processing
         }
             break ;
             // we still sending an eventNotHandledErr in order to allow for default processing
         }
             break ;
@@ -723,6 +654,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
             wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ;
             if ( attributes & kWindowBoundsChangeSizeChanged )
             {
             wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ;
             if ( attributes & kWindowBoundsChangeSizeChanged )
             {
+#ifndef __WXUNIVERSAL__
                 // according to the other ports we handle this within the OS level
                 // resize event, not within a wxSizeEvent
                 wxFrame *frame = wxDynamicCast( toplevelWindow , wxFrame ) ;
                 // according to the other ports we handle this within the OS level
                 // resize event, not within a wxSizeEvent
                 wxFrame *frame = wxDynamicCast( toplevelWindow , wxFrame ) ;
@@ -730,11 +662,11 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
                 {
                     frame->PositionBars();
                 }
                 {
                     frame->PositionBars();
                 }
-
+#endif
                 wxSizeEvent event( r.GetSize() , toplevelWindow->GetId() ) ;
                 event.SetEventObject( toplevelWindow ) ;
 
                 wxSizeEvent event( r.GetSize() , toplevelWindow->GetId() ) ;
                 event.SetEventObject( toplevelWindow ) ;
 
-                toplevelWindow->GetEventHandler()->ProcessEvent(event) ;
+                toplevelWindow->HandleWindowEvent(event) ;
                 toplevelWindow->wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
             }
 
                 toplevelWindow->wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
             }
 
@@ -742,7 +674,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
             {
                 wxMoveEvent event( r.GetLeftTop() , toplevelWindow->GetId() ) ;
                 event.SetEventObject( toplevelWindow ) ;
             {
                 wxMoveEvent event( r.GetLeftTop() , toplevelWindow->GetId() ) ;
                 event.SetEventObject( toplevelWindow ) ;
-                toplevelWindow->GetEventHandler()->ProcessEvent(event) ;
+                toplevelWindow->HandleWindowEvent(event) ;
             }
 
             result = noErr ;
             }
 
             result = noErr ;
@@ -770,7 +702,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
                 wxSizeEvent wxevent( r , toplevelWindow->GetId() ) ;
                 wxevent.SetEventObject( toplevelWindow ) ;
                 wxRect adjustR = r ;
                 wxSizeEvent wxevent( r , toplevelWindow->GetId() ) ;
                 wxevent.SetEventObject( toplevelWindow ) ;
                 wxRect adjustR = r ;
-                if ( toplevelWindow->GetEventHandler()->ProcessEvent(wxevent) )
+                if ( toplevelWindow->HandleWindowEvent(wxevent) )
                     adjustR = wxevent.GetRect() ;
 
                 if ( toplevelWindow->GetMaxWidth() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxWidth() )
                     adjustR = wxevent.GetRect() ;
 
                 if ( toplevelWindow->GetMaxWidth() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxWidth() )
@@ -791,6 +723,36 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
         }
             break ;
 
         }
             break ;
 
+        case kEventWindowGetRegion :
+            {
+                if ( toplevelWindow->GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
+                {
+                    WindowRegionCode windowRegionCode ;
+
+                    // Fetch the region code that is being queried
+                    GetEventParameter( event,
+                                       kEventParamWindowRegionCode,
+                                       typeWindowRegionCode, NULL,
+                                       sizeof windowRegionCode, NULL,
+                                       &windowRegionCode ) ;
+
+                    // If it is the opaque region code then set the
+                    // region to empty and return noErr to stop event
+                    // propagation
+                    if ( windowRegionCode == kWindowOpaqueRgn ) {
+                        RgnHandle region;
+                        GetEventParameter( event,
+                                           kEventParamRgnHandle,
+                                           typeQDRgnHandle, NULL,
+                                           sizeof region, NULL,
+                                           &region) ;
+                        SetEmptyRgn(region) ;
+                        result = noErr ;
+                    }
+                }
+            }
+            break ;
+
         default :
             break ;
     }
         default :
             break ;
     }
@@ -896,22 +858,15 @@ void wxTopLevelWindowMac::Init()
     m_macFullScreenData = NULL ;
 }
 
     m_macFullScreenData = NULL ;
 }
 
-class wxMacDeferredWindowDeleter : public wxObject
+wxMacDeferredWindowDeleter::wxMacDeferredWindowDeleter( WindowRef windowRef )
 {
 {
-public :
-    wxMacDeferredWindowDeleter( WindowRef windowRef )
-    {
-        m_macWindow = windowRef ;
-    }
-
-    virtual ~wxMacDeferredWindowDeleter()
-    {
-        UMADisposeWindow( (WindowRef) m_macWindow ) ;
-    }
+    m_macWindow = windowRef ;
+}
 
 
-protected :
-    WindowRef m_macWindow ;
-} ;
+wxMacDeferredWindowDeleter::~wxMacDeferredWindowDeleter()
+{
+    DisposeWindow( (WindowRef) m_macWindow ) ;
+}
 
 bool wxTopLevelWindowMac::Create(wxWindow *parent,
                                  wxWindowID id,
 
 bool wxTopLevelWindowMac::Create(wxWindow *parent,
                                  wxWindowID id,
@@ -931,9 +886,9 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent,
     m_windowId = id == -1 ? NewControlId() : id;
     wxWindow::SetLabel( title ) ;
 
     m_windowId = id == -1 ? NewControlId() : id;
     wxWindow::SetLabel( title ) ;
 
-    MacCreateRealWindow( title, pos , size , style , name ) ;
+    DoMacCreateRealWindow( parent, title, pos , size , style , name ) ;
 
 
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
+    SetBackgroundColour(wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE ));
 
     if (GetExtraStyle() & wxFRAME_EX_METAL)
         MacSetMetalAppearance(true);
 
     if (GetExtraStyle() & wxFRAME_EX_METAL)
         MacSetMetalAppearance(true);
@@ -970,6 +925,10 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac()
     FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
     delete data ;
     m_macFullScreenData = NULL ;
     FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
     delete data ;
     m_macFullScreenData = NULL ;
+
+    // avoid dangling refs
+    if ( s_macDeactivateWindow == this )
+        s_macDeactivateWindow = NULL;
 }
 
 
 }
 
 
@@ -1031,20 +990,34 @@ wxPoint wxTopLevelWindowMac::GetClientAreaOrigin() const
     return wxPoint(0, 0) ;
 }
 
     return wxPoint(0, 0) ;
 }
 
-void wxTopLevelWindowMac::SetIcon(const wxIcon& icon)
+bool wxTopLevelWindowMac::SetBackgroundColour(const wxColour& c )
 {
 {
-    // this sets m_icon
-    wxTopLevelWindowBase::SetIcon(icon);
-}
-
-void  wxTopLevelWindowMac::MacSetBackgroundBrush( const wxBrush &brush )
-{
-    wxTopLevelWindowBase::MacSetBackgroundBrush( brush ) ;
-
-    if ( m_macBackgroundBrush.Ok() && m_macBackgroundBrush.GetStyle() != wxTRANSPARENT && m_macBackgroundBrush.MacGetBrushKind() == kwxMacBrushTheme )
+    wxColour col = c;
+    if ( col == wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) )
+        col = wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDocumentWindowBackground));
+    else if ( col == wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE ) )
+        col = wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDialogBackgroundActive));
+        
+    if ( !wxTopLevelWindowBase::SetBackgroundColour(col) && m_hasBgCol )
+        return false ;
+    
+    if ( col == wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDocumentWindowBackground)) )
     {
     {
-        SetThemeWindowBackground( (WindowRef) m_macWindow , m_macBackgroundBrush.MacGetTheme() , false ) ;
+        SetThemeWindowBackground( (WindowRef) m_macWindow,  kThemeBrushDocumentWindowBackground, false ) ;
+        SetBackgroundStyle(wxBG_STYLE_CUSTOM);
     }
     }
+    else if ( col == wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDialogBackgroundActive)) )
+    {
+        SetThemeWindowBackground( (WindowRef) m_macWindow,  kThemeBrushDialogBackgroundActive, false ) ;
+        SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+    }
+    return true;
+}    
+
+void wxTopLevelWindowMacInstallTopLevelWindowEventHandler(WindowRef window, EventHandlerRef* handler, void *ref)
+{
+    InstallWindowEventHandler(window, GetwxMacTopLevelEventHandlerUPP(),
+        GetEventTypeCount(eventList), eventList, ref, handler );
 }
 
 void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
 }
 
 void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
@@ -1053,10 +1026,7 @@ void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
     {
         verify_noerr( ::RemoveEventHandler( (EventHandlerRef) m_macEventHandler ) ) ;
     }
     {
         verify_noerr( ::RemoveEventHandler( (EventHandlerRef) m_macEventHandler ) ) ;
     }
-
-    InstallWindowEventHandler(
-        MAC_WXHWND(m_macWindow), GetwxMacTopLevelEventHandlerUPP(),
-        GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler );
+    wxTopLevelWindowMacInstallTopLevelWindowEventHandler(MAC_WXHWND(m_macWindow),(EventHandlerRef *)&m_macEventHandler,this);
 }
 
 void  wxTopLevelWindowMac::MacCreateRealWindow(
 }
 
 void  wxTopLevelWindowMac::MacCreateRealWindow(
@@ -1065,6 +1035,17 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     const wxSize& size,
     long style,
     const wxString& name )
     const wxSize& size,
     long style,
     const wxString& name )
+{
+    DoMacCreateRealWindow( NULL, title, pos, size, style, name );
+}
+
+void  wxTopLevelWindowMac::DoMacCreateRealWindow(
+    wxWindow* parent,
+    const wxString& title,
+    const wxPoint& pos,
+    const wxSize& size,
+    long style,
+    const wxString& name )
 {
     OSStatus err = noErr ;
     SetName(name);
 {
     OSStatus err = noErr ;
     SetName(name);
@@ -1093,6 +1074,8 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     WindowClass wclass = 0;
     WindowAttributes attr = kWindowNoAttributes ;
     WindowGroupRef group = NULL ;
     WindowClass wclass = 0;
     WindowAttributes attr = kWindowNoAttributes ;
     WindowGroupRef group = NULL ;
+    bool activationScopeSet = false;
+    WindowActivationScope activationScope = kWindowActivationScopeNone;
 
     if ( HasFlag( wxFRAME_TOOL_WINDOW) )
     {
 
     if ( HasFlag( wxFRAME_TOOL_WINDOW) )
     {
@@ -1102,7 +1085,10 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
             HasFlag(wxTINY_CAPTION_HORIZ) ||  HasFlag(wxTINY_CAPTION_VERT)
             )
         {
             HasFlag(wxTINY_CAPTION_HORIZ) ||  HasFlag(wxTINY_CAPTION_VERT)
             )
         {
-            wclass = kFloatingWindowClass ;
+            if ( HasFlag( wxSTAY_ON_TOP ) )
+                wclass = kUtilityWindowClass;
+            else
+                wclass = kFloatingWindowClass ;
 
             if ( HasFlag(wxTINY_CAPTION_VERT) )
                 attr |= kWindowSideTitlebarAttribute ;
 
             if ( HasFlag(wxTINY_CAPTION_VERT) )
                 attr |= kWindowSideTitlebarAttribute ;
@@ -1110,6 +1096,8 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         else
         {
             wclass = kPlainWindowClass ;
         else
         {
             wclass = kPlainWindowClass ;
+            activationScopeSet = true;
+            activationScope = kWindowActivationScopeNone;
         }
     }
     else if ( HasFlag( wxPOPUP_WINDOW ) )
         }
     }
     else if ( HasFlag( wxPOPUP_WINDOW ) )
@@ -1123,7 +1111,7 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         else
             wclass = kPlainWindowClass ;  // has a single line border, it will have to do for now
         //attr |= kWindowNoShadowAttribute; // turn off the shadow  Should we??
         else
             wclass = kPlainWindowClass ;  // has a single line border, it will have to do for now
         //attr |= kWindowNoShadowAttribute; // turn off the shadow  Should we??
-        group = GetWindowGroupOfClass(    // float above other windows   
+        group = GetWindowGroupOfClass(    // float above other windows
             kFloatingWindowClass) ;
     }
     else if ( HasFlag( wxCAPTION ) )
             kFloatingWindowClass) ;
     }
     else if ( HasFlag( wxCAPTION ) )
@@ -1131,12 +1119,10 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         wclass = kDocumentWindowClass ;
         attr |= kWindowInWindowMenuAttribute ;
     }
         wclass = kDocumentWindowClass ;
         attr |= kWindowInWindowMenuAttribute ;
     }
-#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 )
     else if ( HasFlag( wxFRAME_DRAWER ) )
     {
         wclass = kDrawerWindowClass;
     }
     else if ( HasFlag( wxFRAME_DRAWER ) )
     {
         wclass = kDrawerWindowClass;
     }
-#endif  //10.2 and up
     else
     {
         if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
     else
     {
         if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
@@ -1144,6 +1130,10 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         {
             wclass = kDocumentWindowClass ;
         }
         {
             wclass = kDocumentWindowClass ;
         }
+        else if ( HasFlag( wxNO_BORDER ) )
+        {
+            wclass = kSimpleWindowClass ;
+        }
         else
         {
             wclass = kPlainWindowClass ;
         else
         {
             wclass = kPlainWindowClass ;
@@ -1164,17 +1154,21 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         if ( HasFlag( wxCLOSE_BOX) )
             attr |= kWindowCloseBoxAttribute ;
     }
         if ( HasFlag( wxCLOSE_BOX) )
             attr |= kWindowCloseBoxAttribute ;
     }
-
-    // turn on live resizing (OS X only)
-    if (UMAGetSystemVersion() >= 0x1000)
-        attr |= kWindowLiveResizeAttribute;
+    attr |= kWindowLiveResizeAttribute;
 
     if ( HasFlag(wxSTAY_ON_TOP) )
         group = GetWindowGroupOfClass(kUtilityWindowClass) ;
 
     if ( HasFlag( wxFRAME_FLOAT_ON_PARENT ) )
         group = GetWindowGroupOfClass(kFloatingWindowClass) ;
 
     if ( HasFlag(wxSTAY_ON_TOP) )
         group = GetWindowGroupOfClass(kUtilityWindowClass) ;
 
     if ( HasFlag( wxFRAME_FLOAT_ON_PARENT ) )
         group = GetWindowGroupOfClass(kFloatingWindowClass) ;
-        
+
+    if ( group == NULL && parent != NULL )
+    {
+        WindowRef parenttlw = (WindowRef) parent->MacGetTopLevelWindowRef();
+        if( parenttlw )
+            group = GetWindowGroupParent( GetWindowGroup( parenttlw ) );
+    }
+
     attr |= kWindowCompositingAttribute;
 #if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale)
     attr |= kWindowFrameworkScaledAttribute;
     attr |= kWindowCompositingAttribute;
 #if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale)
     attr |= kWindowFrameworkScaledAttribute;
@@ -1184,7 +1178,7 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     {
         WindowDefSpec customWindowDefSpec;
         customWindowDefSpec.defType = kWindowDefProcPtr;
     {
         WindowDefSpec customWindowDefSpec;
         customWindowDefSpec.defType = kWindowDefProcPtr;
-        customWindowDefSpec.u.defProc = 
+        customWindowDefSpec.u.defProc =
 #ifdef __LP64__
             (WindowDefUPP) wxShapedMacWindowDef;
 #else
 #ifdef __LP64__
             (WindowDefUPP) wxShapedMacWindowDef;
 #else
@@ -1205,16 +1199,23 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
 
     // setup a separate group for each window, so that overlays can be handled easily
     wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
 
     // setup a separate group for each window, so that overlays can be handled easily
-    verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &group ));
-    verify_noerr( SetWindowGroupParent( group, GetWindowGroup( (WindowRef) m_macWindow )));
-    verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , group ));
-  
+
+    WindowGroupRef overlaygroup = NULL;
+    verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &overlaygroup ));
+    verify_noerr( SetWindowGroupParent( overlaygroup, GetWindowGroup( (WindowRef) m_macWindow )));
+    verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , overlaygroup ));
+
+    if ( activationScopeSet )
+    {
+        verify_noerr( SetWindowActivationScope( (WindowRef) m_macWindow , activationScope ));
+    }
+
     // the create commands are only for content rect,
     // so we have to set the size again as structure bounds
     SetWindowBounds(  (WindowRef) m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
 
     wxAssociateWinWithMacWindow( (WindowRef) m_macWindow , this ) ;
     // the create commands are only for content rect,
     // so we have to set the size again as structure bounds
     SetWindowBounds(  (WindowRef) m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
 
     wxAssociateWinWithMacWindow( (WindowRef) m_macWindow , this ) ;
-    UMASetWTitle( (WindowRef) m_macWindow , title , m_font.GetEncoding() ) ;
+    SetWindowTitleWithCFString( (WindowRef) m_macWindow , wxCFStringRef( title , GetFont().GetEncoding() ) );
     m_peer = new wxMacControl(this , true /*isRootControl*/) ;
 
     // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of
     m_peer = new wxMacControl(this , true /*isRootControl*/) ;
 
     // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of
@@ -1240,6 +1241,16 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     }
 #endif
 
     }
 #endif
 
+    if ( m_macWindow != NULL )
+    {
+        MacSetUnifiedAppearance( true ) ;
+    }
+
+    HIViewRef growBoxRef = 0 ;
+    err = HIViewFindByID( HIViewGetRoot( (WindowRef)m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef  );
+    if ( err == noErr && growBoxRef != 0 )
+        HIGrowBoxViewSetTransparent( growBoxRef, true ) ;
+
     // the frame window event handler
     InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
     MacInstallTopLevelWindowEventHandler() ;
     // the frame window event handler
     InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
     MacInstallTopLevelWindowEventHandler() ;
@@ -1256,7 +1267,7 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     }
 
     wxWindowCreateEvent event(this);
     }
 
     wxWindowCreateEvent event(this);
-    GetEventHandler()->ProcessEvent(event);
+    HandleWindowEvent(event);
 }
 
 void wxTopLevelWindowMac::ClearBackground()
 }
 
 void wxTopLevelWindowMac::ClearBackground()
@@ -1288,7 +1299,7 @@ void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp)
     }
 }
 
     }
 }
 
-void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating )
+void wxTopLevelWindowMac::MacActivate( long timestamp , bool WXUNUSED(inIsActivating) )
 {
     wxLogTrace(TRACE_ACTIVATE, wxT("TopLevel=%p::MacActivate"), this);
 
 {
     wxLogTrace(TRACE_ACTIVATE, wxT("TopLevel=%p::MacActivate"), this);
 
@@ -1296,13 +1307,12 @@ void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating )
         s_macDeactivateWindow = NULL;
 
     MacDelayedDeactivation(timestamp);
         s_macDeactivateWindow = NULL;
 
     MacDelayedDeactivation(timestamp);
-    MacPropagateHiliteChanged() ;
 }
 
 void wxTopLevelWindowMac::SetTitle(const wxString& title)
 {
     wxWindow::SetLabel( title ) ;
 }
 
 void wxTopLevelWindowMac::SetTitle(const wxString& title)
 {
     wxWindow::SetLabel( title ) ;
-    UMASetWTitle( (WindowRef)m_macWindow , title , m_font.GetEncoding() ) ;
+    SetWindowTitleWithCFString( (WindowRef) m_macWindow , wxCFStringRef( title , GetFont().GetEncoding() ) ) ;
 }
 
 wxString wxTopLevelWindowMac::GetTitle() const
 }
 
 wxString wxTopLevelWindowMac::GetTitle() const
@@ -1315,11 +1325,9 @@ bool wxTopLevelWindowMac::Show(bool show)
     if ( !wxTopLevelWindowBase::Show(show) )
         return false;
 
     if ( !wxTopLevelWindowBase::Show(show) )
         return false;
 
-    bool plainTransition = false;
+    bool plainTransition = true;
 
 #if wxUSE_SYSTEM_OPTIONS
 
 #if wxUSE_SYSTEM_OPTIONS
-    // code contributed by Ryan Wilcox December 18, 2003
-    plainTransition = UMAGetSystemVersion() >= 0x1000 ;
     if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
         plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
 #endif
     if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
         plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
 #endif
@@ -1336,7 +1344,7 @@ bool wxTopLevelWindowMac::Show(bool show)
         // because apps expect a size event to occur at this moment
         wxSizeEvent event(GetSize() , m_windowId);
         event.SetEventObject(this);
         // because apps expect a size event to occur at this moment
         wxSizeEvent event(GetSize() , m_windowId);
         event.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(event);
+        HandleWindowEvent(event);
     }
     else
     {
     }
     else
     {
@@ -1346,11 +1354,148 @@ bool wxTopLevelWindowMac::Show(bool show)
            ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
     }
 
            ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
     }
 
-    MacPropagateVisibilityChanged() ;
-
     return true ;
 }
 
     return true ;
 }
 
+bool wxTopLevelWindowMac::ShowWithEffect(wxShowEffect effect,
+                            unsigned timeout,
+                            wxDirection dir)
+{
+    // TODO factor common code
+    if ( !wxTopLevelWindowBase::Show(true) )
+        return false;
+    WindowTransitionEffect transition = 0 ;
+    switch( effect )
+    {
+        case wxSHOW_EFFECT_ROLL :
+        case wxSHOW_EFFECT_SLIDE :
+            transition = kWindowGenieTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_BLEND :
+            transition = kWindowFadeTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_EXPAND :
+        default :
+            // having sheets would be fine, but this might lead to a repositioning
+#if 0
+            if ( GetParent() )
+                transition = kWindowSheetTransitionEffect;
+            else
+#endif
+                transition = kWindowZoomTransitionEffect;
+            break;
+    }
+    
+    TransitionWindowOptions options;
+    options.version = 0;
+    options.duration = timeout / 1000.0;
+    options.window = transition == kWindowSheetTransitionEffect ? (WindowRef) GetParent()->MacGetTopLevelWindowRef() :0;
+    options.userData = 0;
+    
+    wxSize size = wxGetDisplaySize();
+    Rect bounds;
+    GetWindowBounds( (WindowRef)m_macWindow, kWindowStructureRgn, &bounds );
+    CGRect hiBounds = CGRectMake( bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top );
+
+    if ( dir & wxRIGHT )
+    {
+        hiBounds.origin.x = size.x;
+        hiBounds.size.width = 0;
+    }
+    if ( dir & wxUP )
+    {
+        hiBounds.origin.y = 0;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxDOWN )
+    {
+        hiBounds.origin.y = size.y;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxLEFT )
+    {
+        hiBounds.origin.x = 0;
+        hiBounds.size.width = 0;
+    }
+    
+    ::TransitionWindowWithOptions( (WindowRef)m_macWindow, transition, kWindowShowTransitionAction, transition == kWindowGenieTransitionEffect ? &hiBounds : NULL  ,  
+                                  false, &options );
+
+    ::SelectWindow( (WindowRef)m_macWindow ) ;
+    
+    // because apps expect a size event to occur at this moment
+    wxSizeEvent event(GetSize() , m_windowId);
+    event.SetEventObject(this);
+    HandleWindowEvent(event);
+    
+    return true;
+}
+
+bool wxTopLevelWindowMac::HideWithEffect(wxShowEffect effect,
+                            unsigned timeout ,
+                            wxDirection dir )
+{
+    if ( !wxTopLevelWindowBase::Show(false) )
+        return false;
+    
+    WindowTransitionEffect transition = 0 ;
+    switch( effect )
+    {
+        case wxSHOW_EFFECT_ROLL :
+        case wxSHOW_EFFECT_SLIDE :
+            transition = kWindowGenieTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_BLEND :
+            transition = kWindowFadeTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_EXPAND :
+        default:
+#if 0
+            if ( GetParent() )
+                transition = kWindowSheetTransitionEffect;
+            else
+#endif
+                transition = kWindowZoomTransitionEffect;
+            break;
+    }
+    TransitionWindowOptions options;
+    options.version = 0;
+    options.duration = timeout / 1000.0;
+    options.window = transition == kWindowSheetTransitionEffect ? (WindowRef) GetParent()->MacGetTopLevelWindowRef() :0;
+    options.userData = 0;
+    
+    wxSize size = wxGetDisplaySize();
+    Rect bounds;
+    GetWindowBounds( (WindowRef)m_macWindow, kWindowStructureRgn, &bounds );
+    CGRect hiBounds = CGRectMake( bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top );
+    
+    if ( dir & wxRIGHT )
+    {
+        hiBounds.origin.x = size.x;
+        hiBounds.size.width = 0;
+    }
+    if ( dir & wxUP )
+    {
+        hiBounds.origin.y = 0;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxDOWN )
+    {
+        hiBounds.origin.y = size.y;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxLEFT )
+    {
+        hiBounds.origin.x = 0;
+        hiBounds.size.width = 0;
+    }
+    ::TransitionWindowWithOptions( (WindowRef)m_macWindow, transition, kWindowHideTransitionAction, transition == kWindowGenieTransitionEffect ? &hiBounds : NULL  ,  
+                                  false, &options );
+
+    return true;
+}
+
 bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style)
 {
     if ( show )
 bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style)
 {
     if ( show )
@@ -1448,14 +1593,36 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
 
     wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;
 
 
     wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;
 
-#if TARGET_API_MAC_OSX
     if ( m_macWindow != NULL )
     {
         bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;
     if ( m_macWindow != NULL )
     {
         bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;
+
         if ( MacGetMetalAppearance() != metal )
         if ( MacGetMetalAppearance() != metal )
+        {
+            if ( MacGetUnifiedAppearance() )
+                MacSetUnifiedAppearance( !metal ) ;
+
             MacSetMetalAppearance( metal ) ;
             MacSetMetalAppearance( metal ) ;
+        }
     }
     }
-#endif
+}
+
+bool wxTopLevelWindowMac::SetBackgroundStyle(wxBackgroundStyle style)
+{
+    if ( !wxTopLevelWindowBase::SetBackgroundStyle(style) )
+        return false ;
+
+    WindowRef windowRef = HIViewGetWindow( (HIViewRef)GetHandle() );
+
+    if ( GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
+    {
+        OSStatus err = HIWindowChangeFeatures( windowRef, 0, kWindowIsOpaque );
+        verify_noerr( err );
+        err = ReshapeCustomWindow( windowRef );
+        verify_noerr( err );
+    }
+
+    return true ;
 }
 
 // TODO: switch to structure bounds -
 }
 
 // TODO: switch to structure bounds -
@@ -1518,21 +1685,45 @@ void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const
        *height = bounds.bottom - bounds.top ;
 }
 
        *height = bounds.bottom - bounds.top ;
 }
 
+void wxTopLevelWindowMac::DoCentre(int dir)
+{
+    if ( m_macWindow != 0 )
+        wxTopLevelWindowBase::DoCentre(dir);
+}
+
 void wxTopLevelWindowMac::MacSetMetalAppearance( bool set )
 {
 void wxTopLevelWindowMac::MacSetMetalAppearance( bool set )
 {
-#if TARGET_API_MAC_OSX
+    if ( MacGetUnifiedAppearance() )
+        MacSetUnifiedAppearance( false ) ;
+
     MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,
         set ? kWindowNoAttributes : kWindowMetalAttribute ) ;
     MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,
         set ? kWindowNoAttributes : kWindowMetalAttribute ) ;
-#endif
 }
 
 bool wxTopLevelWindowMac::MacGetMetalAppearance() const
 {
 }
 
 bool wxTopLevelWindowMac::MacGetMetalAppearance() const
 {
-#if TARGET_API_MAC_OSX
     return MacGetWindowAttributes() & kWindowMetalAttribute ;
     return MacGetWindowAttributes() & kWindowMetalAttribute ;
-#else
-    return false ;
-#endif
+}
+
+void wxTopLevelWindowMac::MacSetUnifiedAppearance( bool set )
+{
+    if ( MacGetMetalAppearance() )
+        MacSetMetalAppearance( false ) ;
+
+    MacChangeWindowAttributes( set ? kWindowUnifiedTitleAndToolbarAttribute : kWindowNoAttributes ,
+        set ? kWindowNoAttributes : kWindowUnifiedTitleAndToolbarAttribute) ;
+
+    // For some reason, Tiger uses white as the background color for this appearance,
+    // while most apps using it use the typical striped background. Restore that behavior
+    // for wx.
+    // TODO: Determine if we need this on Leopard as well. (should be harmless either way,
+    // though)
+    SetBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW) ) ;
+}
+
+bool wxTopLevelWindowMac::MacGetUnifiedAppearance() const
+{
+    return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ;
 }
 
 void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )
 }
 
 void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )
@@ -1550,32 +1741,9 @@ wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const
 
 void wxTopLevelWindowMac::MacPerformUpdates()
 {
 
 void wxTopLevelWindowMac::MacPerformUpdates()
 {
-#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
     // for composited windows this also triggers a redraw of all
     // invalid views in the window
-    if ( UMAGetSystemVersion() >= 0x1030 )
-        HIWindowFlush((WindowRef) m_macWindow) ;
-    else
-#endif
-    {
-        // the only way to trigger the redrawing on earlier systems is to call
-        // ReceiveNextEvent
-
-        EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ;
-        UInt32 currentEventClass = 0 ;
-        if ( currentEvent != NULL )
-        {
-            currentEventClass = ::GetEventClass( currentEvent ) ;
-            ::GetEventKind( currentEvent ) ;
-        }
-
-        if ( currentEventClass != kEventClassMenu )
-        {
-            // when tracking a menu, strange redraw errors occur if we flush now, so leave..
-            EventRef theEvent;
-            ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ;
-        }
-    }
+    HIWindowFlush((WindowRef) m_macWindow) ;
 }
 
 // Attracts the users attention to this window if the application is
 }
 
 // Attracts the users attention to this window if the application is
@@ -1587,7 +1755,7 @@ static pascal void wxMacNMResponse( NMRecPtr ptr )
     DisposePtr( (Ptr)ptr ) ;
 }
 
     DisposePtr( (Ptr)ptr ) ;
 }
 
-void wxTopLevelWindowMac::RequestUserAttention(int flags )
+void wxTopLevelWindowMac::RequestUserAttention(int WXUNUSED(flags))
 {
     NMRecPtr notificationRequest = (NMRecPtr) NewPtr( sizeof( NMRec) ) ;
     static wxMacNMUPP nmupp( wxMacNMResponse );
 {
     NMRecPtr notificationRequest = (NMRecPtr) NewPtr( sizeof( NMRec) ) ;
     static wxMacNMUPP nmupp( wxMacNMResponse );
@@ -1627,7 +1795,7 @@ bool wxTopLevelWindowMac::SetShape(const wxRegion& region)
 
     // Make a copy of the region
     RgnHandle  shapeRegion = NewRgn();
 
     // Make a copy of the region
     RgnHandle  shapeRegion = NewRgn();
-    CopyRgn( (RgnHandle)region.GetWXHRGN(), shapeRegion );
+    HIShapeGetAsQDRgn( region.GetWXHRGN(), shapeRegion );
 
     // Dispose of any shape region we may already have
     RgnHandle oldRgn = (RgnHandle)GetWRefCon( (WindowRef)MacGetWindowRef() );
 
     // Dispose of any shape region we may already have
     RgnHandle oldRgn = (RgnHandle)GetWRefCon( (WindowRef)MacGetWindowRef() );
@@ -1659,7 +1827,7 @@ static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect)
     inRect->left = pt.h;
 }
 
     inRect->left = pt.h;
 }
 
-static SInt32 wxShapedMacWindowGetFeatures(WindowRef window, SInt32 param)
+static SInt32 wxShapedMacWindowGetFeatures(WindowRef WXUNUSED(window), SInt32 param)
 {
     /*------------------------------------------------------
         Define which options your custom window supports.
 {
     /*------------------------------------------------------
         Define which options your custom window supports.
@@ -1668,7 +1836,7 @@ static SInt32 wxShapedMacWindowGetFeatures(WindowRef window, SInt32 param)
     *(OptionBits*)param =
         //kWindowCanGrow |
         //kWindowCanZoom |
     *(OptionBits*)param =
         //kWindowCanGrow |
         //kWindowCanZoom |
-        //kWindowCanCollapse |
+        kWindowCanCollapse |
         //kWindowCanGetWindowRegion |
         //kWindowHasTitleBar |
         //kWindowSupportsDragHilite |
         //kWindowCanGetWindowRegion |
         //kWindowHasTitleBar |
         //kWindowSupportsDragHilite |
@@ -1759,7 +1927,7 @@ static SInt32 wxShapedMacWindowHitTest(WindowRef window, SInt32 param)
     return wNoHit;
 }
 
     return wNoHit;
 }
 
-static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16 message, SInt32 param)
+static pascal long wxShapedMacWindowDef(short WXUNUSED(varCode), WindowRef window, SInt16 message, SInt32 param)
 {
     switch (message)
     {
 {
     switch (message)
     {