1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/toplevel.cpp 
   3 // Purpose:     implements wxTopLevelWindow for Mac 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) 2001-2004 Stefan Csomor 
   9 // License:     wxWindows licence 
  10 /////////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 // For compilers that support precompilation, includes "wx.h". 
  21 #include "wx/wxprec.h" 
  27 #include "wx/toplevel.h" 
  32     #include "wx/string.h" 
  35     #include "wx/settings.h" 
  36     #include "wx/strconv.h" 
  37     #include "wx/control.h" 
  40 #include "wx/mac/uma.h" 
  41 #include "wx/mac/aga.h" 
  42 #include "wx/tooltip.h" 
  45 #if wxUSE_SYSTEM_OPTIONS 
  46     #include "wx/sysopt.h" 
  50 #include <ToolUtils.h> 
  54 #include "wx/mac/private.h" 
  56 // ---------------------------------------------------------------------------- 
  58 // ---------------------------------------------------------------------------- 
  60 // unified title and toolbar constant - not in Tiger headers, so we duplicate it here 
  61 #define kWindowUnifiedTitleAndToolbarAttribute (1 << 7) 
  63 // trace mask for activation tracing messages 
  64 static const wxChar 
*TRACE_ACTIVATE 
= _T("activation"); 
  66 // ---------------------------------------------------------------------------- 
  68 // ---------------------------------------------------------------------------- 
  70 // list of all frames and modeless dialogs 
  71 wxWindowList       wxModelessWindows
; 
  73 static pascal long wxShapedMacWindowDef(short varCode
, WindowRef window
, SInt16 message
, SInt32 param
); 
  75 // ============================================================================ 
  76 // wxTopLevelWindowMac implementation 
  77 // ============================================================================ 
  79 BEGIN_EVENT_TABLE(wxTopLevelWindowMac
, wxTopLevelWindowBase
) 
  82 // --------------------------------------------------------------------------- 
  84 // --------------------------------------------------------------------------- 
  86 static const EventTypeSpec eventList
[] = 
  88     // TODO: remove control related event like key and mouse (except for WindowLeave events) 
  90     { kEventClassKeyboard
, kEventRawKeyDown 
} , 
  91     { kEventClassKeyboard
, kEventRawKeyRepeat 
} , 
  92     { kEventClassKeyboard
, kEventRawKeyUp 
} , 
  93     { kEventClassKeyboard
, kEventRawKeyModifiersChanged 
} , 
  95     { kEventClassTextInput
, kEventTextInputUnicodeForKeyEvent 
} , 
  96     { kEventClassTextInput
, kEventTextInputUpdateActiveInputArea 
} , 
  98     { kEventClassWindow 
, kEventWindowShown 
} , 
  99     { kEventClassWindow 
, kEventWindowActivated 
} , 
 100     { kEventClassWindow 
, kEventWindowDeactivated 
} , 
 101     { kEventClassWindow 
, kEventWindowBoundsChanging 
} , 
 102     { kEventClassWindow 
, kEventWindowBoundsChanged 
} , 
 103     { kEventClassWindow 
, kEventWindowClose 
} , 
 104     { kEventClassWindow 
, kEventWindowGetRegion 
} , 
 106     // we have to catch these events on the toplevel window level, 
 107     // as controls don't get the raw mouse events anymore 
 109     { kEventClassMouse 
, kEventMouseDown 
} , 
 110     { kEventClassMouse 
, kEventMouseUp 
} , 
 111     { kEventClassMouse 
, kEventMouseWheelMoved 
} , 
 112     { kEventClassMouse 
, kEventMouseMoved 
} , 
 113     { kEventClassMouse 
, kEventMouseDragged 
} , 
 116 static pascal OSStatus 
KeyboardEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 118     OSStatus result 
= eventNotHandledErr 
; 
 119     // call DoFindFocus instead of FindFocus, because for Composite Windows(like WxGenericListCtrl) 
 120     // FindFocus does not return the actual focus window, but the enclosing window 
 121     wxWindow
* focus 
= wxWindow::DoFindFocus(); 
 123         focus 
= (wxTopLevelWindowMac
*) data 
; 
 125     unsigned char charCode 
; 
 133     UInt32 when 
= EventTimeToTicks( GetEventTime( event 
) ) ; 
 136     ByteCount dataSize 
= 0 ; 
 137     if ( GetEventParameter( event
, kEventParamKeyUnicodes
, typeUnicodeText
, NULL
, 0 , &dataSize
, NULL 
) == noErr 
) 
 140         int numChars 
= dataSize 
/ sizeof( UniChar
) + 1; 
 142         UniChar
* charBuf 
= buf 
; 
 144         if ( numChars 
* 2 > 4 ) 
 145             charBuf 
= new UniChar
[ numChars 
] ; 
 146         GetEventParameter( event
, kEventParamKeyUnicodes
, typeUnicodeText
, NULL
, dataSize 
, NULL 
, charBuf 
) ; 
 147         charBuf
[ numChars 
- 1 ] = 0; 
 149 #if SIZEOF_WCHAR_T == 2 
 150         uniChar 
= charBuf
[0] ; 
 152         wxMBConvUTF16 converter 
; 
 153         converter
.MB2WC( uniChar 
, (const char*)charBuf 
, 2 ) ; 
 156         if ( numChars 
* 2 > 4 ) 
 161     GetEventParameter( event
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, sizeof(char), NULL
, &charCode 
); 
 162     GetEventParameter( event
, kEventParamKeyCode
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &keyCode 
); 
 163     GetEventParameter( event
, kEventParamKeyModifiers
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &modifiers 
); 
 164     GetEventParameter( event
, kEventParamMouseLocation
, typeQDPoint
, NULL
, sizeof(Point
), NULL
, &point 
); 
 166     UInt32 message 
= (keyCode 
<< 8) + charCode
; 
 167     switch ( GetEventKind( event 
) ) 
 169         case kEventRawKeyRepeat 
: 
 170         case kEventRawKeyDown 
: 
 172                 WXEVENTREF formerEvent 
= wxTheApp
->MacGetCurrentEvent() ; 
 173                 WXEVENTHANDLERCALLREF formerHandler 
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 174                 wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 175                 if ( /* focus && */ wxTheApp
->MacSendKeyDownEvent( 
 176                     focus 
, message 
, modifiers 
, when 
, point
.h 
, point
.v 
, uniChar
[0] ) ) 
 180                 wxTheApp
->MacSetCurrentEvent( formerEvent 
, formerHandler 
) ; 
 184         case kEventRawKeyUp 
: 
 185             if ( /* focus && */ wxTheApp
->MacSendKeyUpEvent( 
 186                 focus 
, message 
, modifiers 
, when 
, point
.h 
, point
.v 
, uniChar
[0] ) ) 
 192         case kEventRawKeyModifiersChanged 
: 
 194                 wxKeyEvent 
event(wxEVT_KEY_DOWN
); 
 196                 event
.m_shiftDown 
= modifiers 
& shiftKey
; 
 197                 event
.m_controlDown 
= modifiers 
& controlKey
; 
 198                 event
.m_altDown 
= modifiers 
& optionKey
; 
 199                 event
.m_metaDown 
= modifiers 
& cmdKey
; 
 204                 event
.m_uniChar 
= uniChar
[0] ; 
 207                 event
.SetTimestamp(when
); 
 208                 event
.SetEventObject(focus
); 
 210                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & controlKey 
) 
 212                     event
.m_keyCode 
= WXK_CONTROL 
; 
 213                     event
.SetEventType( ( modifiers 
& controlKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 214                     focus
->GetEventHandler()->ProcessEvent( event 
) ; 
 216                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & shiftKey 
) 
 218                     event
.m_keyCode 
= WXK_SHIFT 
; 
 219                     event
.SetEventType( ( modifiers 
& shiftKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 220                     focus
->GetEventHandler()->ProcessEvent( event 
) ; 
 222                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & optionKey 
) 
 224                     event
.m_keyCode 
= WXK_ALT 
; 
 225                     event
.SetEventType( ( modifiers 
& optionKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 226                     focus
->GetEventHandler()->ProcessEvent( event 
) ; 
 228                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & cmdKey 
) 
 230                     event
.m_keyCode 
= WXK_COMMAND 
; 
 231                     event
.SetEventType( ( modifiers 
& cmdKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 232                     focus
->GetEventHandler()->ProcessEvent( event 
) ; 
 235                 wxApp::s_lastModifiers 
= modifiers 
; 
 246 // we don't interfere with foreign controls on our toplevel windows, therefore we always give back eventNotHandledErr 
 247 // for windows that we didn't create (like eg Scrollbars in a databrowser), or for controls where we did not handle the 
 250 // This handler can also be called from app level where data (ie target window) may be null or a non wx window 
 252 wxWindow
* g_MacLastWindow 
= NULL 
; 
 254 EventMouseButton g_lastButton 
= 0 ; 
 255 bool g_lastButtonWasFakeRight 
= false ; 
 257 void SetupMouseEvent( wxMouseEvent 
&wxevent 
, wxMacCarbonEvent 
&cEvent 
) 
 259     UInt32 modifiers 
= cEvent
.GetParameter
<UInt32
>(kEventParamKeyModifiers
, typeUInt32
) ; 
 260     Point screenMouseLocation 
= cEvent
.GetParameter
<Point
>(kEventParamMouseLocation
) ; 
 262     // these parameters are not given for all events 
 263     EventMouseButton button 
= 0 ; 
 264     UInt32 clickCount 
= 0 ; 
 265     UInt32 mouseChord 
= 0; 
 267     cEvent
.GetParameter
<EventMouseButton
>( kEventParamMouseButton
, typeMouseButton 
, &button 
) ; 
 268     cEvent
.GetParameter
<UInt32
>( kEventParamClickCount
, typeUInt32 
, &clickCount 
) ; 
 269     // the chord is the state of the buttons pressed currently 
 270     cEvent
.GetParameter
<UInt32
>( kEventParamMouseChord
, typeUInt32 
, &mouseChord 
) ; 
 272     wxevent
.m_x 
= screenMouseLocation
.h
; 
 273     wxevent
.m_y 
= screenMouseLocation
.v
; 
 274     wxevent
.m_shiftDown 
= modifiers 
& shiftKey
; 
 275     wxevent
.m_controlDown 
= modifiers 
& controlKey
; 
 276     wxevent
.m_altDown 
= modifiers 
& optionKey
; 
 277     wxevent
.m_metaDown 
= modifiers 
& cmdKey
; 
 278     wxevent
.m_clickCount 
= clickCount
; 
 279     wxevent
.SetTimestamp( cEvent
.GetTicks() ) ; 
 281     // a control click is interpreted as a right click 
 282     bool thisButtonIsFakeRight 
= false ; 
 283     if ( button 
== kEventMouseButtonPrimary 
&& (modifiers 
& controlKey
) ) 
 285         button 
= kEventMouseButtonSecondary 
; 
 286         thisButtonIsFakeRight 
= true ; 
 289     // otherwise we report double clicks by connecting a left click with a ctrl-left click 
 290     if ( clickCount 
> 1 && button 
!= g_lastButton 
) 
 293     // we must make sure that our synthetic 'right' button corresponds in 
 294     // mouse down, moved and mouse up, and does not deliver a right down and left up 
 296     if ( cEvent
.GetKind() == kEventMouseDown 
) 
 298         g_lastButton 
= button 
; 
 299         g_lastButtonWasFakeRight 
= thisButtonIsFakeRight 
; 
 305         g_lastButtonWasFakeRight 
= false ; 
 307     else if ( g_lastButton 
== kEventMouseButtonSecondary 
&& g_lastButtonWasFakeRight 
) 
 308         button 
= g_lastButton 
; 
 310     // Adjust the chord mask to remove the primary button and add the 
 311     // secondary button.  It is possible that the secondary button is 
 312     // already pressed, e.g. on a mouse connected to a laptop, but this 
 313     // possibility is ignored here: 
 314     if( thisButtonIsFakeRight 
&& ( mouseChord 
& 1U ) ) 
 315         mouseChord 
= ((mouseChord 
& ~1U) | 2U); 
 318                 wxevent
.m_leftDown 
= true ; 
 320                 wxevent
.m_rightDown 
= true ; 
 322                 wxevent
.m_middleDown 
= true ; 
 324     // translate into wx types 
 325     switch ( cEvent
.GetKind() ) 
 327         case kEventMouseDown 
: 
 330                 case kEventMouseButtonPrimary 
: 
 331                     wxevent
.SetEventType( clickCount 
> 1 ? wxEVT_LEFT_DCLICK 
: wxEVT_LEFT_DOWN 
)  ; 
 334                 case kEventMouseButtonSecondary 
: 
 335                     wxevent
.SetEventType( clickCount 
> 1 ? wxEVT_RIGHT_DCLICK 
: wxEVT_RIGHT_DOWN 
) ; 
 338                 case kEventMouseButtonTertiary 
: 
 339                     wxevent
.SetEventType( clickCount 
> 1 ? wxEVT_MIDDLE_DCLICK 
: wxEVT_MIDDLE_DOWN 
) ; 
 350                 case kEventMouseButtonPrimary 
: 
 351                     wxevent
.SetEventType( wxEVT_LEFT_UP 
)  ; 
 354                 case kEventMouseButtonSecondary 
: 
 355                     wxevent
.SetEventType( wxEVT_RIGHT_UP 
) ; 
 358                 case kEventMouseButtonTertiary 
: 
 359                     wxevent
.SetEventType( wxEVT_MIDDLE_UP 
) ; 
 367      case kEventMouseWheelMoved 
: 
 369             wxevent
.SetEventType( wxEVT_MOUSEWHEEL 
) ; 
 371             EventMouseWheelAxis axis 
= cEvent
.GetParameter
<EventMouseWheelAxis
>(kEventParamMouseWheelAxis
, typeMouseWheelAxis
) ; 
 372             SInt32 delta 
= cEvent
.GetParameter
<SInt32
>(kEventParamMouseWheelDelta
, typeSInt32
) ; 
 374             wxevent
.m_wheelRotation 
= delta
; 
 375             wxevent
.m_wheelDelta 
= 1; 
 376             wxevent
.m_linesPerAction 
= 1; 
 377             if ( axis 
== kEventMouseWheelAxisX 
) 
 378                 wxevent
.m_wheelAxis 
= 1; 
 382         case kEventMouseEntered 
: 
 383         case kEventMouseExited 
: 
 384         case kEventMouseDragged 
: 
 385         case kEventMouseMoved 
: 
 386             wxevent
.SetEventType( wxEVT_MOTION 
) ; 
 393 ControlRef 
wxMacFindSubControl( wxTopLevelWindowMac
* toplevelWindow
, const Point
& location 
, ControlRef superControl 
, ControlPartCode 
*outPart 
) 
 397         UInt16 childrenCount 
= 0 ; 
 398         ControlHandle sibling 
; 
 400         OSStatus err 
= CountSubControls( superControl 
, &childrenCount 
) ; 
 401         if ( err 
== errControlIsNotEmbedder 
) 
 404         wxASSERT_MSG( err 
== noErr 
, wxT("Unexpected error when accessing subcontrols") ) ; 
 406         for ( UInt16 i 
= childrenCount 
; i 
>=1  ; --i 
) 
 408             err 
= GetIndexedSubControl( superControl 
, i 
, & sibling 
) ; 
 409             if ( err 
== errControlIsNotEmbedder 
) 
 412             wxASSERT_MSG( err 
== noErr 
, wxT("Unexpected error when accessing subcontrols") ) ; 
 413             if ( IsControlVisible( sibling 
) ) 
 415                 UMAGetControlBoundsInWindowCoords( sibling 
, &r 
) ; 
 416                 if ( MacPtInRect( location 
, &r 
) ) 
 418                     ControlHandle child 
= wxMacFindSubControl( toplevelWindow 
, location 
, sibling 
, outPart 
) ; 
 425                         Point testLocation 
= location 
; 
 427                         if ( toplevelWindow 
) 
 429                             testLocation
.h 
-= r
.left 
; 
 430                             testLocation
.v 
-= r
.top 
; 
 433                         *outPart 
= TestControl( sibling 
, testLocation 
) ; 
 446 #define NEW_CAPTURE_HANDLING 1 
 449 wxMacTopLevelMouseEventHandler(EventHandlerCallRef 
WXUNUSED(handler
), 
 453     wxTopLevelWindowMac
* toplevelWindow 
= (wxTopLevelWindowMac
*) data 
; 
 455     OSStatus result 
= eventNotHandledErr 
; 
 457     wxMacCarbonEvent 
cEvent( event 
) ; 
 459     Point screenMouseLocation 
= cEvent
.GetParameter
<Point
>(kEventParamMouseLocation
) ; 
 460     Point windowMouseLocation 
= screenMouseLocation 
; 
 462     WindowRef window 
= NULL
; 
 463     short windowPart 
= ::FindWindow(screenMouseLocation
, &window
); 
 465     wxWindow
* currentMouseWindow 
= NULL 
; 
 466     ControlRef control 
= NULL 
; 
 468 #if NEW_CAPTURE_HANDLING 
 469     if ( wxApp::s_captureWindow 
) 
 471         window 
= (WindowRef
) wxApp::s_captureWindow
->MacGetTopLevelWindowRef() ; 
 472         windowPart 
= inContent 
; 
 478         wxMacGlobalToLocal( window
,  &windowMouseLocation 
) ; 
 480         if ( wxApp::s_captureWindow
 
 481 #if !NEW_CAPTURE_HANDLING 
 482              && wxApp::s_captureWindow
->MacGetTopLevelWindowRef() == (WXWindow
) window 
&& windowPart 
== inContent
 
 486             currentMouseWindow 
= wxApp::s_captureWindow 
; 
 488         else if ( (IsWindowActive(window
) && windowPart 
== inContent
) ) 
 490             ControlPartCode part 
; 
 491             control 
= FindControlUnderMouse( windowMouseLocation 
, window 
, &part 
) ; 
 492             // if there is no control below the mouse position, send the event to the toplevel window itself 
 495                 currentMouseWindow 
= (wxWindow
*) data 
; 
 499                 currentMouseWindow 
= (wxWindow
*) wxFindControlFromMacControl( control 
) ; 
 500 #ifndef __WXUNIVERSAL__ 
 501                 if ( currentMouseWindow 
== NULL 
&& cEvent
.GetKind() == kEventMouseMoved 
) 
 504                     // for wxToolBar to function we have to send certaint events to it 
 505                     // instead of its children (wxToolBarTools) 
 507                     GetSuperControl(control
, &parent 
); 
 508                     wxWindow 
*wxParent 
= (wxWindow
*) wxFindControlFromMacControl( parent 
) ; 
 509                     if ( wxParent 
&& wxParent
->IsKindOf( CLASSINFO( wxToolBar 
) ) ) 
 510                         currentMouseWindow 
= wxParent 
; 
 516             // disabled windows must not get any input messages 
 517             if ( currentMouseWindow 
&& !currentMouseWindow
->MacIsReallyEnabled() ) 
 518                 currentMouseWindow 
= NULL
; 
 522     wxMouseEvent 
wxevent(wxEVT_LEFT_DOWN
); 
 523     SetupMouseEvent( wxevent 
, cEvent 
) ; 
 525     // handle all enter / leave events 
 527     if ( currentMouseWindow 
!= g_MacLastWindow 
) 
 529         if ( g_MacLastWindow 
) 
 531             wxMouseEvent 
eventleave(wxevent
); 
 532             eventleave
.SetEventType( wxEVT_LEAVE_WINDOW 
); 
 533             g_MacLastWindow
->ScreenToClient( &eventleave
.m_x
, &eventleave
.m_y 
); 
 534             eventleave
.SetEventObject( g_MacLastWindow 
) ; 
 535             wxevent
.SetId( g_MacLastWindow
->GetId() ) ; 
 538             wxToolTip::RelayEvent( g_MacLastWindow 
, eventleave
); 
 541             g_MacLastWindow
->GetEventHandler()->ProcessEvent(eventleave
); 
 544         if ( currentMouseWindow 
) 
 546             wxMouseEvent 
evententer(wxevent
); 
 547             evententer
.SetEventType( wxEVT_ENTER_WINDOW 
); 
 548             currentMouseWindow
->ScreenToClient( &evententer
.m_x
, &evententer
.m_y 
); 
 549             evententer
.SetEventObject( currentMouseWindow 
) ; 
 550             wxevent
.SetId( currentMouseWindow
->GetId() ) ; 
 553             wxToolTip::RelayEvent( currentMouseWindow 
, evententer 
); 
 556             currentMouseWindow
->GetEventHandler()->ProcessEvent(evententer
); 
 559         g_MacLastWindow 
= currentMouseWindow 
; 
 562     if ( windowPart 
== inMenuBar 
) 
 564         // special case menu bar, as we are having a low-level runloop we must do it ourselves 
 565         if ( cEvent
.GetKind() == kEventMouseDown 
) 
 567             ::MenuSelect( screenMouseLocation 
) ; 
 572     else if ( currentMouseWindow 
) 
 574         wxWindow 
*currentMouseWindowParent 
= currentMouseWindow
->GetParent(); 
 576         currentMouseWindow
->ScreenToClient( &wxevent
.m_x 
, &wxevent
.m_y 
) ; 
 578         wxevent
.SetEventObject( currentMouseWindow 
) ; 
 579         wxevent
.SetId( currentMouseWindow
->GetId() ) ; 
 581         // make tooltips current 
 584         if ( wxevent
.GetEventType() == wxEVT_MOTION 
) 
 585             wxToolTip::RelayEvent( currentMouseWindow 
, wxevent 
); 
 588         if ( currentMouseWindow
->GetEventHandler()->ProcessEvent(wxevent
) ) 
 590             if ((currentMouseWindowParent 
!= NULL
) && 
 591                 (currentMouseWindowParent
->GetChildren().Find(currentMouseWindow
) == NULL
)) 
 592                 currentMouseWindow 
= NULL
; 
 598             // if the user code did _not_ handle the event, then perform the 
 599             // default processing 
 600             if ( wxevent
.GetEventType() == wxEVT_LEFT_DOWN 
) 
 602                 // ... that is set focus to this window 
 603                 if (currentMouseWindow
->CanAcceptFocus() && wxWindow::FindFocus()!=currentMouseWindow
) 
 604                     currentMouseWindow
->SetFocus(); 
 607             // if built-in find control is finding the wrong control (ie static box instead of overlaid 
 608             // button, we cannot let the standard handler do its job, but must handle manually 
 610             if ( cEvent
.GetKind() == kEventMouseDown 
) 
 612                 if ( currentMouseWindow
->MacIsReallyEnabled() ) 
 614                     EventModifiers modifiers 
= cEvent
.GetParameter
<EventModifiers
>(kEventParamKeyModifiers
, typeUInt32
) ; 
 615                     Point clickLocation 
= windowMouseLocation 
; 
 617                     currentMouseWindow
->MacRootWindowToWindow( &clickLocation
.h 
, &clickLocation
.v 
) ; 
 619                     HandleControlClick( (ControlRef
) currentMouseWindow
->GetHandle() , clickLocation 
, 
 620                         modifiers 
, (ControlActionUPP 
) -1 ) ; 
 622                     if ((currentMouseWindowParent 
!= NULL
) && 
 623                         (currentMouseWindowParent
->GetChildren().Find(currentMouseWindow
) == NULL
)) 
 625                         currentMouseWindow 
= NULL
; 
 633         if ( cEvent
.GetKind() == kEventMouseUp 
&& wxApp::s_captureWindow 
) 
 635             wxApp::s_captureWindow 
= NULL 
; 
 641         wxWindow
* cursorTarget 
= currentMouseWindow 
; 
 642         wxPoint 
cursorPoint( wxevent
.m_x 
, wxevent
.m_y 
) ; 
 644         while ( cursorTarget 
&& !cursorTarget
->MacSetupCursor( cursorPoint 
) ) 
 646             cursorTarget 
= cursorTarget
->GetParent() ; 
 648                 cursorPoint 
+= cursorTarget
->GetPosition(); 
 652     else // currentMouseWindow == NULL 
 654         // don't mess with controls we don't know about 
 655         // for some reason returning eventNotHandledErr does not lead to the correct behaviour 
 656         // so we try sending them the correct control directly 
 657         if ( cEvent
.GetKind() == kEventMouseDown 
&& toplevelWindow 
&& control 
) 
 659             EventModifiers modifiers 
= cEvent
.GetParameter
<EventModifiers
>(kEventParamKeyModifiers
, typeUInt32
) ; 
 660             Point clickLocation 
= windowMouseLocation 
; 
 663             hiPoint
.x 
= clickLocation
.h 
; 
 664             hiPoint
.y 
= clickLocation
.v 
; 
 665             HIViewConvertPoint( &hiPoint 
, (ControlRef
) toplevelWindow
->GetHandle() , control  
) ; 
 666             clickLocation
.h 
= (int)hiPoint
.x 
; 
 667             clickLocation
.v 
= (int)hiPoint
.y 
; 
 669             HandleControlClick( control 
, clickLocation 
, modifiers 
, (ControlActionUPP 
) -1 ) ; 
 677 static pascal OSStatus
 
 678 wxMacTopLevelWindowEventHandler(EventHandlerCallRef 
WXUNUSED(handler
), 
 682     OSStatus result 
= eventNotHandledErr 
; 
 684     wxMacCarbonEvent 
cEvent( event 
) ; 
 686     // WindowRef windowRef = cEvent.GetParameter<WindowRef>(kEventParamDirectObject) ; 
 687     wxTopLevelWindowMac
* toplevelWindow 
= (wxTopLevelWindowMac
*) data 
; 
 689     switch ( GetEventKind( event 
) ) 
 691         case kEventWindowActivated 
: 
 693             toplevelWindow
->MacActivate( cEvent
.GetTicks() , true) ; 
 694             wxActivateEvent 
wxevent(wxEVT_ACTIVATE
, true , toplevelWindow
->GetId()); 
 695             wxevent
.SetTimestamp( cEvent
.GetTicks() ) ; 
 696             wxevent
.SetEventObject(toplevelWindow
); 
 697             toplevelWindow
->GetEventHandler()->ProcessEvent(wxevent
); 
 698             // we still sending an eventNotHandledErr in order to allow for default processing 
 702         case kEventWindowDeactivated 
: 
 704             toplevelWindow
->MacActivate(cEvent
.GetTicks() , false) ; 
 705             wxActivateEvent 
wxevent(wxEVT_ACTIVATE
, false , toplevelWindow
->GetId()); 
 706             wxevent
.SetTimestamp( cEvent
.GetTicks() ) ; 
 707             wxevent
.SetEventObject(toplevelWindow
); 
 708             toplevelWindow
->GetEventHandler()->ProcessEvent(wxevent
); 
 709             // we still sending an eventNotHandledErr in order to allow for default processing 
 713         case kEventWindowShown 
: 
 714             toplevelWindow
->Refresh() ; 
 718         case kEventWindowClose 
: 
 719             toplevelWindow
->Close() ; 
 723         case kEventWindowBoundsChanged 
: 
 725             UInt32 attributes 
= cEvent
.GetParameter
<UInt32
>(kEventParamAttributes
, typeUInt32
) ; 
 726             Rect newRect 
= cEvent
.GetParameter
<Rect
>(kEventParamCurrentBounds
) ; 
 727             wxRect 
r( newRect
.left 
, newRect
.top 
, newRect
.right 
- newRect
.left 
, newRect
.bottom 
- newRect
.top 
) ; 
 728             if ( attributes 
& kWindowBoundsChangeSizeChanged 
) 
 730 #ifndef __WXUNIVERSAL__ 
 731                 // according to the other ports we handle this within the OS level 
 732                 // resize event, not within a wxSizeEvent 
 733                 wxFrame 
*frame 
= wxDynamicCast( toplevelWindow 
, wxFrame 
) ; 
 736                     frame
->PositionBars(); 
 739                 wxSizeEvent 
event( r
.GetSize() , toplevelWindow
->GetId() ) ; 
 740                 event
.SetEventObject( toplevelWindow 
) ; 
 742                 toplevelWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 743                 toplevelWindow
->wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
 746             if ( attributes 
& kWindowBoundsChangeOriginChanged 
) 
 748                 wxMoveEvent 
event( r
.GetLeftTop() , toplevelWindow
->GetId() ) ; 
 749                 event
.SetEventObject( toplevelWindow 
) ; 
 750                 toplevelWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 757         case kEventWindowBoundsChanging 
: 
 759             UInt32 attributes 
= cEvent
.GetParameter
<UInt32
>(kEventParamAttributes
,typeUInt32
) ; 
 760             Rect newRect 
= cEvent
.GetParameter
<Rect
>(kEventParamCurrentBounds
) ; 
 762             if ( (attributes 
& kWindowBoundsChangeSizeChanged
) || (attributes 
& kWindowBoundsChangeOriginChanged
) ) 
 764                 // all (Mac) rects are in content area coordinates, all wxRects in structure coordinates 
 765                 int left 
, top 
, right 
, bottom 
; 
 766                 toplevelWindow
->MacGetContentAreaInset( left 
, top 
, right 
, bottom 
) ; 
 771                     newRect
.right 
- newRect
.left 
+ left 
+ right
, 
 772                     newRect
.bottom 
- newRect
.top 
+ top 
+ bottom 
) ; 
 774                 // this is a EVT_SIZING not a EVT_SIZE type ! 
 775                 wxSizeEvent 
wxevent( r 
, toplevelWindow
->GetId() ) ; 
 776                 wxevent
.SetEventObject( toplevelWindow 
) ; 
 778                 if ( toplevelWindow
->GetEventHandler()->ProcessEvent(wxevent
) ) 
 779                     adjustR 
= wxevent
.GetRect() ; 
 781                 if ( toplevelWindow
->GetMaxWidth() != -1 && adjustR
.GetWidth() > toplevelWindow
->GetMaxWidth() ) 
 782                     adjustR
.SetWidth( toplevelWindow
->GetMaxWidth() ) ; 
 783                 if ( toplevelWindow
->GetMaxHeight() != -1 && adjustR
.GetHeight() > toplevelWindow
->GetMaxHeight() ) 
 784                     adjustR
.SetHeight( toplevelWindow
->GetMaxHeight() ) ; 
 785                 if ( toplevelWindow
->GetMinWidth() != -1 && adjustR
.GetWidth() < toplevelWindow
->GetMinWidth() ) 
 786                     adjustR
.SetWidth( toplevelWindow
->GetMinWidth() ) ; 
 787                 if ( toplevelWindow
->GetMinHeight() != -1 && adjustR
.GetHeight() < toplevelWindow
->GetMinHeight() ) 
 788                     adjustR
.SetHeight( toplevelWindow
->GetMinHeight() ) ; 
 789                 const Rect adjustedRect 
= { adjustR
.y 
+ top  
, adjustR
.x 
+ left 
, adjustR
.y 
+ adjustR
.height 
- bottom 
, adjustR
.x 
+ adjustR
.width 
- right 
} ; 
 790                 if ( !EqualRect( &newRect 
, &adjustedRect 
) ) 
 791                     cEvent
.SetParameter
<Rect
>( kEventParamCurrentBounds 
, &adjustedRect 
) ; 
 792                 toplevelWindow
->wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
 799         case kEventWindowGetRegion 
: 
 801                 if ( toplevelWindow
->GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT 
) 
 803                     WindowRegionCode windowRegionCode 
; 
 805                     // Fetch the region code that is being queried 
 806                     GetEventParameter( event
, 
 807                                        kEventParamWindowRegionCode
, 
 808                                        typeWindowRegionCode
, NULL
, 
 809                                        sizeof windowRegionCode
, NULL
, 
 810                                        &windowRegionCode 
) ; 
 812                     // If it is the opaque region code then set the 
 813                     // region to empty and return noErr to stop event 
 815                     if ( windowRegionCode 
== kWindowOpaqueRgn 
) { 
 817                         GetEventParameter( event
, 
 818                                            kEventParamRgnHandle
, 
 819                                            typeQDRgnHandle
, NULL
, 
 822                         SetEmptyRgn(region
) ; 
 836 // mix this in from window.cpp 
 837 pascal OSStatus 
wxMacUnicodeTextEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) ; 
 839 pascal OSStatus 
wxMacTopLevelEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 841     OSStatus result 
= eventNotHandledErr 
; 
 843     switch ( GetEventClass( event 
) ) 
 845         case kEventClassTextInput 
: 
 846             result 
= wxMacUnicodeTextEventHandler( handler
, event 
, data 
) ; 
 849         case kEventClassKeyboard 
: 
 850             result 
= KeyboardEventHandler( handler
, event 
, data 
) ; 
 853         case kEventClassWindow 
: 
 854             result 
= wxMacTopLevelWindowEventHandler( handler
, event 
, data 
) ; 
 857         case kEventClassMouse 
: 
 858             result 
= wxMacTopLevelMouseEventHandler( handler
, event 
, data 
) ; 
 868 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacTopLevelEventHandler 
) 
 870 // --------------------------------------------------------------------------- 
 871 // wxWindowMac utility functions 
 872 // --------------------------------------------------------------------------- 
 874 // Find an item given the Macintosh Window Reference 
 876 WX_DECLARE_HASH_MAP(WindowRef
, wxTopLevelWindowMac
*, wxPointerHash
, wxPointerEqual
, MacWindowMap
); 
 878 static MacWindowMap wxWinMacWindowList
; 
 880 wxTopLevelWindowMac 
*wxFindWinFromMacWindow(WindowRef inWindowRef
) 
 882     MacWindowMap::iterator node 
= wxWinMacWindowList
.find(inWindowRef
); 
 884     return (node 
== wxWinMacWindowList
.end()) ? NULL 
: node
->second
; 
 887 void wxAssociateWinWithMacWindow(WindowRef inWindowRef
, wxTopLevelWindowMac 
*win
) ; 
 888 void wxAssociateWinWithMacWindow(WindowRef inWindowRef
, wxTopLevelWindowMac 
*win
) 
 890     // adding NULL WindowRef is (first) surely a result of an error and 
 892     wxCHECK_RET( inWindowRef 
!= (WindowRef
) NULL
, wxT("attempt to add a NULL WindowRef to window list") ); 
 894     wxWinMacWindowList
[inWindowRef
] = win
; 
 897 void wxRemoveMacWindowAssociation(wxTopLevelWindowMac 
*win
) ; 
 898 void wxRemoveMacWindowAssociation(wxTopLevelWindowMac 
*win
) 
 900     MacWindowMap::iterator it
; 
 901     for ( it 
= wxWinMacWindowList
.begin(); it 
!= wxWinMacWindowList
.end(); ++it 
) 
 903         if ( it
->second 
== win 
) 
 905             wxWinMacWindowList
.erase(it
); 
 911 // ---------------------------------------------------------------------------- 
 912 // wxTopLevelWindowMac creation 
 913 // ---------------------------------------------------------------------------- 
 915 wxTopLevelWindowMac 
*wxTopLevelWindowMac::s_macDeactivateWindow 
= NULL
; 
 921     bool m_wasResizable 
; 
 924 void wxTopLevelWindowMac::Init() 
 927     m_maximizeOnShow 
= false; 
 930     m_macEventHandler 
= NULL 
; 
 931     m_macFullScreenData 
= NULL 
; 
 934 wxMacDeferredWindowDeleter::wxMacDeferredWindowDeleter( WindowRef windowRef 
) 
 936     m_macWindow 
= windowRef 
; 
 939 wxMacDeferredWindowDeleter::~wxMacDeferredWindowDeleter() 
 941     DisposeWindow( (WindowRef
) m_macWindow 
) ; 
 944 bool wxTopLevelWindowMac::Create(wxWindow 
*parent
, 
 946                                  const wxString
& title
, 
 950                                  const wxString
& name
) 
 955     m_windowStyle 
= style
; 
 959     m_windowId 
= id 
== -1 ? NewControlId() : id
; 
 960     wxWindow::SetLabel( title 
) ; 
 962     DoMacCreateRealWindow( parent
, title
, pos 
, size 
, style 
, name 
) ; 
 964     SetBackgroundColour(wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDialogBackgroundActive
))); 
 966     if (GetExtraStyle() & wxFRAME_EX_METAL
) 
 967         MacSetMetalAppearance(true); 
 969     wxTopLevelWindows
.Append(this); 
 972         parent
->AddChild(this); 
 977 wxTopLevelWindowMac::~wxTopLevelWindowMac() 
 982         wxToolTip::NotifyWindowDelete(m_macWindow
) ; 
 984         wxPendingDelete
.Append( new wxMacDeferredWindowDeleter( (WindowRef
) m_macWindow 
) ) ; 
 987     if ( m_macEventHandler 
) 
 989         ::RemoveEventHandler((EventHandlerRef
) m_macEventHandler
); 
 990         m_macEventHandler 
= NULL 
; 
 993     wxRemoveMacWindowAssociation( this ) ; 
 995     if ( wxModelessWindows
.Find(this) ) 
 996         wxModelessWindows
.DeleteObject(this); 
 998     FullScreenData 
*data 
= (FullScreenData 
*) m_macFullScreenData 
; 
1000     m_macFullScreenData 
= NULL 
; 
1002     // avoid dangling refs 
1003     if ( s_macDeactivateWindow 
== this ) 
1004         s_macDeactivateWindow 
= NULL
; 
1008 // ---------------------------------------------------------------------------- 
1009 // wxTopLevelWindowMac maximize/minimize 
1010 // ---------------------------------------------------------------------------- 
1012 void wxTopLevelWindowMac::Maximize(bool maximize
) 
1014     Point idealSize 
= { 0 , 0 } ; 
1017 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 
1019         HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
, 
1021         idealSize
.h 
= bounds
.size
.width
; 
1022         idealSize
.v 
= bounds
.size
.height
; 
1025         GetAvailableWindowPositioningBounds(GetMainDevice(),&rect
) ; 
1026         idealSize
.h 
= rect
.right 
- rect
.left 
; 
1027         idealSize
.v 
= rect
.bottom 
- rect
.top 
; 
1030     ZoomWindowIdeal( (WindowRef
)m_macWindow 
, maximize 
? inZoomOut 
: inZoomIn 
, &idealSize 
) ; 
1033 bool wxTopLevelWindowMac::IsMaximized() const 
1035     return IsWindowInStandardState( (WindowRef
)m_macWindow 
, NULL 
, NULL 
) ; 
1038 void wxTopLevelWindowMac::Iconize(bool iconize
) 
1040     if ( IsWindowCollapsable( (WindowRef
)m_macWindow
) ) 
1041         CollapseWindow( (WindowRef
)m_macWindow 
, iconize 
) ; 
1044 bool wxTopLevelWindowMac::IsIconized() const 
1046     return IsWindowCollapsed((WindowRef
)m_macWindow 
) ; 
1049 void wxTopLevelWindowMac::Restore() 
1051     if ( IsMaximized() ) 
1053     else if ( IsIconized() ) 
1057 // ---------------------------------------------------------------------------- 
1058 // wxTopLevelWindowMac misc 
1059 // ---------------------------------------------------------------------------- 
1061 wxPoint 
wxTopLevelWindowMac::GetClientAreaOrigin() const 
1063     return wxPoint(0, 0) ; 
1066 bool wxTopLevelWindowMac::SetBackgroundColour(const wxColour
& col 
) 
1068     if ( !wxTopLevelWindowBase::SetBackgroundColour(col
) && m_hasBgCol 
) 
1071     if ( col 
== wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW 
) ) 
1072         SetThemeWindowBackground( (WindowRef
) m_macWindow
,  kThemeBrushDocumentWindowBackground
, false ) ; 
1073     else if ( col 
== wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE 
) ) 
1074         SetThemeWindowBackground( (WindowRef
) m_macWindow
,  kThemeBrushDialogBackgroundActive
, false ) ; 
1075     // TODO BETTER THEME SUPPORT 
1079 void wxTopLevelWindowMacInstallTopLevelWindowEventHandler(WindowRef window
, EventHandlerRef
* handler
, void *ref
) 
1081     InstallWindowEventHandler(window
, GetwxMacTopLevelEventHandlerUPP(), 
1082         GetEventTypeCount(eventList
), eventList
, ref
, handler 
); 
1085 void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler() 
1087     if ( m_macEventHandler 
!= NULL 
) 
1089         verify_noerr( ::RemoveEventHandler( (EventHandlerRef
) m_macEventHandler 
) ) ; 
1091     wxTopLevelWindowMacInstallTopLevelWindowEventHandler(MAC_WXHWND(m_macWindow
),(EventHandlerRef 
*)&m_macEventHandler
,this); 
1094 void  wxTopLevelWindowMac::MacCreateRealWindow( 
1095     const wxString
& title
, 
1099     const wxString
& name 
) 
1101     DoMacCreateRealWindow( NULL
, title
, pos
, size
, style
, name 
); 
1104 void  wxTopLevelWindowMac::DoMacCreateRealWindow( 
1106     const wxString
& title
, 
1110     const wxString
& name 
) 
1112     OSStatus err 
= noErr 
; 
1114     m_windowStyle 
= style
; 
1122     wxRect display 
= wxGetClientDisplayRect() ; 
1124     if ( x 
== wxDefaultPosition
.x 
) 
1127     if ( y 
== wxDefaultPosition
.y 
) 
1130     int w 
= WidthDefault(size
.x
); 
1131     int h 
= HeightDefault(size
.y
); 
1133     ::SetRect(&theBoundsRect
, x
, y 
, x 
+ w
, y 
+ h
); 
1135     // translate the window attributes in the appropriate window class and attributes 
1136     WindowClass wclass 
= 0; 
1137     WindowAttributes attr 
= kWindowNoAttributes 
; 
1138     WindowGroupRef group 
= NULL 
; 
1139     bool activationScopeSet 
= false; 
1140     WindowActivationScope activationScope 
= kWindowActivationScopeNone
; 
1142     if ( HasFlag( wxFRAME_TOOL_WINDOW
) ) 
1145             HasFlag( wxMINIMIZE_BOX 
) || HasFlag( wxMAXIMIZE_BOX 
) || 
1146             HasFlag( wxSYSTEM_MENU 
) || HasFlag( wxCAPTION 
) || 
1147             HasFlag(wxTINY_CAPTION_HORIZ
) ||  HasFlag(wxTINY_CAPTION_VERT
) 
1150             if ( HasFlag( wxSTAY_ON_TOP 
) ) 
1151                 wclass 
= kUtilityWindowClass
; 
1153                 wclass 
= kFloatingWindowClass 
; 
1155             if ( HasFlag(wxTINY_CAPTION_VERT
) ) 
1156                 attr 
|= kWindowSideTitlebarAttribute 
; 
1160             wclass 
= kPlainWindowClass 
; 
1161             activationScopeSet 
= true; 
1162             activationScope 
= kWindowActivationScopeNone
; 
1165     else if ( HasFlag( wxPOPUP_WINDOW 
) ) 
1168         // Until we've got a real wxPopupWindow class on wxMac make it a 
1169         // little easier for wxFrame to be used to emulate it and workaround 
1170         // the lack of wxPopupWindow. 
1171         if ( HasFlag( wxBORDER_NONE 
) ) 
1172             wclass 
= kHelpWindowClass 
;   // has no border 
1174             wclass 
= kPlainWindowClass 
;  // has a single line border, it will have to do for now 
1175         //attr |= kWindowNoShadowAttribute; // turn off the shadow  Should we?? 
1176         group 
= GetWindowGroupOfClass(    // float above other windows 
1177             kFloatingWindowClass
) ; 
1179     else if ( HasFlag( wxCAPTION 
) ) 
1181         wclass 
= kDocumentWindowClass 
; 
1182         attr 
|= kWindowInWindowMenuAttribute 
; 
1184     else if ( HasFlag( wxFRAME_DRAWER 
) ) 
1186         wclass 
= kDrawerWindowClass
; 
1190         if ( HasFlag( wxMINIMIZE_BOX 
) || HasFlag( wxMAXIMIZE_BOX 
) || 
1191             HasFlag( wxCLOSE_BOX 
) || HasFlag( wxSYSTEM_MENU 
) ) 
1193             wclass 
= kDocumentWindowClass 
; 
1195         else if ( HasFlag( wxNO_BORDER 
) ) 
1197             wclass 
= kSimpleWindowClass 
; 
1201             wclass 
= kPlainWindowClass 
; 
1205     if ( wclass 
!= kPlainWindowClass 
) 
1207         if ( HasFlag( wxMINIMIZE_BOX 
) ) 
1208             attr 
|= kWindowCollapseBoxAttribute 
; 
1210         if ( HasFlag( wxMAXIMIZE_BOX 
) ) 
1211             attr 
|= kWindowFullZoomAttribute 
; 
1213         if ( HasFlag( wxRESIZE_BORDER 
) ) 
1214             attr 
|= kWindowResizableAttribute 
; 
1216         if ( HasFlag( wxCLOSE_BOX
) ) 
1217             attr 
|= kWindowCloseBoxAttribute 
; 
1219     attr 
|= kWindowLiveResizeAttribute
; 
1221     if ( HasFlag(wxSTAY_ON_TOP
) ) 
1222         group 
= GetWindowGroupOfClass(kUtilityWindowClass
) ; 
1224     if ( HasFlag( wxFRAME_FLOAT_ON_PARENT 
) ) 
1225         group 
= GetWindowGroupOfClass(kFloatingWindowClass
) ; 
1227     if ( group 
== NULL 
&& parent 
!= NULL 
) 
1229         WindowRef parenttlw 
= (WindowRef
) parent
->MacGetTopLevelWindowRef(); 
1231             group 
= GetWindowGroupParent( GetWindowGroup( parenttlw 
) ); 
1234     attr 
|= kWindowCompositingAttribute
; 
1235 #if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale) 
1236     attr 
|= kWindowFrameworkScaledAttribute
; 
1239     if ( HasFlag(wxFRAME_SHAPED
) ) 
1241         WindowDefSpec customWindowDefSpec
; 
1242         customWindowDefSpec
.defType 
= kWindowDefProcPtr
; 
1243         customWindowDefSpec
.u
.defProc 
= 
1245             (WindowDefUPP
) wxShapedMacWindowDef
; 
1247             NewWindowDefUPP(wxShapedMacWindowDef
); 
1249         err 
= ::CreateCustomWindow( &customWindowDefSpec
, wclass
, 
1250                               attr
, &theBoundsRect
, 
1251                               (WindowRef
*) &m_macWindow
); 
1255         err 
= ::CreateNewWindow( wclass 
, attr 
, &theBoundsRect 
, (WindowRef
*)&m_macWindow 
) ; 
1258     if ( err 
== noErr 
&& m_macWindow 
!= NULL 
&& group 
!= NULL 
) 
1259         SetWindowGroup( (WindowRef
) m_macWindow 
, group 
) ; 
1261     wxCHECK_RET( err 
== noErr
, wxT("Mac OS error when trying to create new window") ); 
1263     // setup a separate group for each window, so that overlays can be handled easily 
1265     WindowGroupRef overlaygroup 
= NULL
; 
1266     verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether 
| kWindowGroupAttrLayerTogether 
| kWindowGroupAttrHideOnCollapse
, &overlaygroup 
)); 
1267     verify_noerr( SetWindowGroupParent( overlaygroup
, GetWindowGroup( (WindowRef
) m_macWindow 
))); 
1268     verify_noerr( SetWindowGroup( (WindowRef
) m_macWindow 
, overlaygroup 
)); 
1270     if ( activationScopeSet 
) 
1272         verify_noerr( SetWindowActivationScope( (WindowRef
) m_macWindow 
, activationScope 
)); 
1275     // the create commands are only for content rect, 
1276     // so we have to set the size again as structure bounds 
1277     SetWindowBounds(  (WindowRef
) m_macWindow 
, kWindowStructureRgn 
, &theBoundsRect 
) ; 
1279     wxAssociateWinWithMacWindow( (WindowRef
) m_macWindow 
, this ) ; 
1280     SetWindowTitleWithCFString( (WindowRef
) m_macWindow 
, wxMacCFStringHolder( title 
, m_font
.GetEncoding() ) ); 
1281     m_peer 
= new wxMacControl(this , true /*isRootControl*/) ; 
1283     // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of 
1284     // the content view, so we have to retrieve it explicitly 
1285     HIViewFindByID( HIViewGetRoot( (WindowRef
) m_macWindow 
) , kHIViewWindowContentID 
, 
1286         m_peer
->GetControlRefAddr() ) ; 
1287     if ( !m_peer
->Ok() ) 
1289         // compatibility mode fallback 
1290         GetRootControl( (WindowRef
) m_macWindow 
, m_peer
->GetControlRefAddr() ) ; 
1293     // the root control level handler 
1294     MacInstallEventHandler( (WXWidget
) m_peer
->GetControlRef() ) ; 
1296     // Causes the inner part of the window not to be metal 
1297     // if the style is used before window creation. 
1298 #if 0 // TARGET_API_MAC_OSX 
1299     if ( m_macUsesCompositing 
&& m_macWindow 
!= NULL 
) 
1301         if ( GetExtraStyle() & wxFRAME_EX_METAL 
) 
1302             MacSetMetalAppearance( true ) ; 
1306     if ( m_macWindow 
!= NULL 
) 
1308         MacSetUnifiedAppearance( true ) ; 
1311     HIViewRef growBoxRef 
= 0 ; 
1312     err 
= HIViewFindByID( HIViewGetRoot( (WindowRef
)m_macWindow 
), kHIViewWindowGrowBoxID
, &growBoxRef  
); 
1313     if ( err 
== noErr 
&& growBoxRef 
!= 0 ) 
1314         HIGrowBoxViewSetTransparent( growBoxRef
, true ) ; 
1316     // the frame window event handler 
1317     InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow
)) ) ; 
1318     MacInstallTopLevelWindowEventHandler() ; 
1320     DoSetWindowVariant( m_windowVariant 
) ; 
1324     if ( HasFlag(wxFRAME_SHAPED
) ) 
1326         // default shape matches the window size 
1327         wxRegion 
rgn( 0, 0, w
, h 
); 
1331     wxWindowCreateEvent 
event(this); 
1332     GetEventHandler()->ProcessEvent(event
); 
1335 void wxTopLevelWindowMac::ClearBackground() 
1337     wxWindow::ClearBackground() ; 
1340 // Raise the window to the top of the Z order 
1341 void wxTopLevelWindowMac::Raise() 
1343     ::SelectWindow( (WindowRef
)m_macWindow 
) ; 
1346 // Lower the window to the bottom of the Z order 
1347 void wxTopLevelWindowMac::Lower() 
1349     ::SendBehind( (WindowRef
)m_macWindow 
, NULL 
) ; 
1352 void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp
) 
1354     if (s_macDeactivateWindow
) 
1356         wxLogTrace(TRACE_ACTIVATE
, 
1357                    wxT("Doing delayed deactivation of %p"), 
1358                    s_macDeactivateWindow
); 
1360         s_macDeactivateWindow
->MacActivate(timestamp
, false); 
1364 void wxTopLevelWindowMac::MacActivate( long timestamp 
, bool WXUNUSED(inIsActivating
) ) 
1366     wxLogTrace(TRACE_ACTIVATE
, wxT("TopLevel=%p::MacActivate"), this); 
1368     if (s_macDeactivateWindow 
== this) 
1369         s_macDeactivateWindow 
= NULL
; 
1371     MacDelayedDeactivation(timestamp
); 
1374 void wxTopLevelWindowMac::SetTitle(const wxString
& title
) 
1376     wxWindow::SetLabel( title 
) ; 
1377     SetWindowTitleWithCFString( (WindowRef
) m_macWindow 
, wxMacCFStringHolder( title 
, m_font
.GetEncoding() ) ) ; 
1380 wxString 
wxTopLevelWindowMac::GetTitle() const 
1382     return wxWindow::GetLabel(); 
1385 bool wxTopLevelWindowMac::Show(bool show
) 
1387     if ( !wxTopLevelWindowBase::Show(show
) ) 
1390     bool plainTransition 
= true; 
1392 #if wxUSE_SYSTEM_OPTIONS 
1393     if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION
) ) 
1394         plainTransition 
= ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION 
) == 1 ) ; 
1399         if ( plainTransition 
) 
1400            ::ShowWindow( (WindowRef
)m_macWindow 
); 
1402            ::TransitionWindow( (WindowRef
)m_macWindow
, kWindowZoomTransitionEffect
, kWindowShowTransitionAction
, NULL 
); 
1404         ::SelectWindow( (WindowRef
)m_macWindow 
) ; 
1406         // because apps expect a size event to occur at this moment 
1407         wxSizeEvent 
event(GetSize() , m_windowId
); 
1408         event
.SetEventObject(this); 
1409         GetEventHandler()->ProcessEvent(event
); 
1413         if ( plainTransition 
) 
1414            ::HideWindow( (WindowRef
)m_macWindow 
); 
1416            ::TransitionWindow( (WindowRef
)m_macWindow
, kWindowZoomTransitionEffect
, kWindowHideTransitionAction
, NULL 
); 
1422 bool wxTopLevelWindowMac::ShowWithEffect(wxShowEffect effect
, 
1426     // TODO factor common code 
1427     if ( !wxTopLevelWindowBase::Show(true) ) 
1430     WindowTransitionEffect transition 
= 0 ; 
1433         case wxSHOW_EFFECT_ROLL 
: 
1434         case wxSHOW_EFFECT_SLIDE 
: 
1435             transition 
= kWindowGenieTransitionEffect
; 
1437         case wxSHOW_EFFECT_BLEND 
: 
1438             transition 
= kWindowFadeTransitionEffect
; 
1440         case wxSHOW_EFFECT_EXPAND 
: 
1442             // having sheets would be fine, but this might lead to a repositioning 
1445                 transition 
= kWindowSheetTransitionEffect
; 
1448                 transition 
= kWindowZoomTransitionEffect
; 
1452     TransitionWindowOptions options
; 
1453     options
.version 
= 0; 
1454     options
.duration 
= timeout 
/ 1000.0; 
1455     options
.window 
= transition 
== kWindowSheetTransitionEffect 
? (WindowRef
) GetParent()->MacGetTopLevelWindowRef() :0; 
1456     options
.userData 
= 0; 
1458     wxSize size 
= wxGetDisplaySize(); 
1460     GetWindowBounds( (WindowRef
)m_macWindow
, kWindowStructureRgn
, &bounds 
); 
1461     CGRect hiBounds 
= CGRectMake( bounds
.left
, bounds
.top
, bounds
.right 
- bounds
.left
, bounds
.bottom 
- bounds
.top 
); 
1463     if ( dir 
& wxRIGHT 
) 
1465         hiBounds
.origin
.x 
= size
.x
; 
1466         hiBounds
.size
.width 
= 0; 
1470         hiBounds
.origin
.y 
= 0; 
1471         hiBounds
.size
.height 
= 0; 
1475         hiBounds
.origin
.y 
= size
.y
; 
1476         hiBounds
.size
.height 
= 0; 
1480         hiBounds
.origin
.x 
= 0; 
1481         hiBounds
.size
.width 
= 0; 
1484     ::TransitionWindowWithOptions( (WindowRef
)m_macWindow
, transition
, kWindowShowTransitionAction
, transition 
== kWindowGenieTransitionEffect 
? &hiBounds 
: NULL  
,   
1487     ::SelectWindow( (WindowRef
)m_macWindow 
) ; 
1489     // because apps expect a size event to occur at this moment 
1490     wxSizeEvent 
event(GetSize() , m_windowId
); 
1491     event
.SetEventObject(this); 
1492     GetEventHandler()->ProcessEvent(event
); 
1497 bool wxTopLevelWindowMac::HideWithEffect(wxShowEffect effect
, 
1501     if ( !wxTopLevelWindowBase::Show(false) ) 
1504     WindowTransitionEffect transition 
= 0 ; 
1507         case wxSHOW_EFFECT_ROLL 
: 
1508         case wxSHOW_EFFECT_SLIDE 
: 
1509             transition 
= kWindowGenieTransitionEffect
; 
1511         case wxSHOW_EFFECT_BLEND 
: 
1512             transition 
= kWindowFadeTransitionEffect
; 
1514         case wxSHOW_EFFECT_EXPAND 
: 
1518                 transition 
= kWindowSheetTransitionEffect
; 
1521                 transition 
= kWindowZoomTransitionEffect
; 
1524     TransitionWindowOptions options
; 
1525     options
.version 
= 0; 
1526     options
.duration 
= timeout 
/ 1000.0; 
1527     options
.window 
= transition 
== kWindowSheetTransitionEffect 
? (WindowRef
) GetParent()->MacGetTopLevelWindowRef() :0; 
1528     options
.userData 
= 0; 
1530     wxSize size 
= wxGetDisplaySize(); 
1532     GetWindowBounds( (WindowRef
)m_macWindow
, kWindowStructureRgn
, &bounds 
); 
1533     CGRect hiBounds 
= CGRectMake( bounds
.left
, bounds
.top
, bounds
.right 
- bounds
.left
, bounds
.bottom 
- bounds
.top 
); 
1535     if ( dir 
& wxRIGHT 
) 
1537         hiBounds
.origin
.x 
= size
.x
; 
1538         hiBounds
.size
.width 
= 0; 
1542         hiBounds
.origin
.y 
= 0; 
1543         hiBounds
.size
.height 
= 0; 
1547         hiBounds
.origin
.y 
= size
.y
; 
1548         hiBounds
.size
.height 
= 0; 
1552         hiBounds
.origin
.x 
= 0; 
1553         hiBounds
.size
.width 
= 0; 
1555     ::TransitionWindowWithOptions( (WindowRef
)m_macWindow
, transition
, kWindowHideTransitionAction
, transition 
== kWindowGenieTransitionEffect 
? &hiBounds 
: NULL  
,   
1561 bool wxTopLevelWindowMac::ShowFullScreen(bool show
, long style
) 
1565         FullScreenData 
*data 
= (FullScreenData 
*)m_macFullScreenData 
; 
1567         data 
= new FullScreenData() ; 
1569         m_macFullScreenData 
= data 
; 
1570         data
->m_position 
= GetPosition() ; 
1571         data
->m_size 
= GetSize() ; 
1572         data
->m_wasResizable 
= MacGetWindowAttributes() & kWindowResizableAttribute 
; 
1574         if ( style 
& wxFULLSCREEN_NOMENUBAR 
) 
1577         wxRect client 
= wxGetClientDisplayRect() ; 
1579         int left 
, top 
, right 
, bottom 
; 
1587         MacGetContentAreaInset( left 
, top 
, right 
, bottom 
) ; 
1589         if ( style 
& wxFULLSCREEN_NOCAPTION 
) 
1595         if ( style 
& wxFULLSCREEN_NOBORDER 
) 
1602         if ( style 
& wxFULLSCREEN_NOTOOLBAR 
) 
1607         if ( style 
& wxFULLSCREEN_NOSTATUSBAR 
) 
1612         SetSize( x 
, y 
, w
, h 
) ; 
1613         if ( data
->m_wasResizable 
) 
1614             MacChangeWindowAttributes( kWindowNoAttributes 
, kWindowResizableAttribute 
) ; 
1619         FullScreenData 
*data 
= (FullScreenData 
*) m_macFullScreenData 
; 
1620         if ( data
->m_wasResizable 
) 
1621             MacChangeWindowAttributes( kWindowResizableAttribute 
,  kWindowNoAttributes 
) ; 
1622         SetPosition( data
->m_position 
) ; 
1623         SetSize( data
->m_size 
) ; 
1626         m_macFullScreenData 
= NULL 
; 
1632 bool wxTopLevelWindowMac::IsFullScreen() const 
1634     return m_macFullScreenData 
!= NULL 
; 
1638 bool wxTopLevelWindowMac::SetTransparent(wxByte alpha
) 
1640     OSStatus result 
= SetWindowAlpha((WindowRef
)m_macWindow
, float(alpha
)/255.0); 
1641     return result 
== noErr
; 
1645 bool wxTopLevelWindowMac::CanSetTransparent() 
1651 void wxTopLevelWindowMac::SetExtraStyle(long exStyle
) 
1653     if ( GetExtraStyle() == exStyle 
) 
1656     wxTopLevelWindowBase::SetExtraStyle( exStyle 
) ; 
1658     if ( m_macWindow 
!= NULL 
) 
1660         bool metal 
= GetExtraStyle() & wxFRAME_EX_METAL 
; 
1662         if ( MacGetMetalAppearance() != metal 
) 
1664             if ( MacGetUnifiedAppearance() ) 
1665                 MacSetUnifiedAppearance( !metal 
) ; 
1667             MacSetMetalAppearance( metal 
) ; 
1672 bool wxTopLevelWindowMac::SetBackgroundStyle(wxBackgroundStyle style
) 
1674     if ( !wxTopLevelWindowBase::SetBackgroundStyle(style
) ) 
1677     WindowRef windowRef 
= HIViewGetWindow( (HIViewRef
)GetHandle() ); 
1679     if ( GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT 
) 
1681         OSStatus err 
= HIWindowChangeFeatures( windowRef
, 0, kWindowIsOpaque 
); 
1682         verify_noerr( err 
); 
1683         err 
= ReshapeCustomWindow( windowRef 
); 
1684         verify_noerr( err 
); 
1690 // TODO: switch to structure bounds - 
1691 // we are still using coordinates of the content view 
1693 void wxTopLevelWindowMac::MacGetContentAreaInset( int &left 
, int &top 
, int &right 
, int &bottom 
) 
1695     Rect content
, structure 
; 
1697     GetWindowBounds( (WindowRef
) m_macWindow
, kWindowStructureRgn 
, &structure 
) ; 
1698     GetWindowBounds( (WindowRef
) m_macWindow
, kWindowContentRgn 
, &content 
) ; 
1700     left 
= content
.left 
- structure
.left 
; 
1701     top 
= content
.top  
- structure
.top 
; 
1702     right 
= structure
.right 
- content
.right 
; 
1703     bottom 
= structure
.bottom 
- content
.bottom 
; 
1706 void wxTopLevelWindowMac::DoMoveWindow(int x
, int y
, int width
, int height
) 
1708     m_cachedClippedRectValid 
= false ; 
1709     Rect bounds 
= { y 
, x 
, y 
+ height 
, x 
+ width 
} ; 
1710     verify_noerr(SetWindowBounds( (WindowRef
) m_macWindow
, kWindowStructureRgn 
, &bounds 
)) ; 
1711     wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
1714 void wxTopLevelWindowMac::DoGetPosition( int *x
, int *y 
) const 
1718     verify_noerr(GetWindowBounds((WindowRef
) m_macWindow
, kWindowStructureRgn 
, &bounds 
)) ; 
1726 void wxTopLevelWindowMac::DoGetSize( int *width
, int *height 
) const 
1730     verify_noerr(GetWindowBounds((WindowRef
) m_macWindow
, kWindowStructureRgn 
, &bounds 
)) ; 
1733        *width 
= bounds
.right 
- bounds
.left 
; 
1735        *height 
= bounds
.bottom 
- bounds
.top 
; 
1738 void wxTopLevelWindowMac::DoGetClientSize( int *width
, int *height 
) const 
1742     verify_noerr(GetWindowBounds((WindowRef
) m_macWindow
, kWindowContentRgn 
, &bounds 
)) ; 
1745        *width 
= bounds
.right 
- bounds
.left 
; 
1747        *height 
= bounds
.bottom 
- bounds
.top 
; 
1750 void wxTopLevelWindowMac::DoCentre(int dir
) 
1752     if ( m_macWindow 
!= 0 ) 
1753         wxTopLevelWindowBase::DoCentre(dir
); 
1756 void wxTopLevelWindowMac::MacSetMetalAppearance( bool set 
) 
1758     if ( MacGetUnifiedAppearance() ) 
1759         MacSetUnifiedAppearance( false ) ; 
1761     MacChangeWindowAttributes( set 
? kWindowMetalAttribute 
: kWindowNoAttributes 
, 
1762         set 
? kWindowNoAttributes 
: kWindowMetalAttribute 
) ; 
1765 bool wxTopLevelWindowMac::MacGetMetalAppearance() const 
1767     return MacGetWindowAttributes() & kWindowMetalAttribute 
; 
1770 void wxTopLevelWindowMac::MacSetUnifiedAppearance( bool set 
) 
1772     if ( MacGetMetalAppearance() ) 
1773         MacSetMetalAppearance( false ) ; 
1775     MacChangeWindowAttributes( set 
? kWindowUnifiedTitleAndToolbarAttribute 
: kWindowNoAttributes 
, 
1776         set 
? kWindowNoAttributes 
: kWindowUnifiedTitleAndToolbarAttribute
) ; 
1778     // For some reason, Tiger uses white as the background color for this appearance, 
1779     // while most apps using it use the typical striped background. Restore that behavior 
1781     // TODO: Determine if we need this on Leopard as well. (should be harmless either way, 
1783     SetBackgroundColour( wxSYS_COLOUR_WINDOW 
) ; 
1786 bool wxTopLevelWindowMac::MacGetUnifiedAppearance() const 
1788     return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute 
; 
1791 void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet 
, wxUint32 attributesToClear 
) 
1793     ChangeWindowAttributes( (WindowRef
)m_macWindow
, attributesToSet
, attributesToClear 
) ; 
1796 wxUint32 
wxTopLevelWindowMac::MacGetWindowAttributes() const 
1799     GetWindowAttributes( (WindowRef
) m_macWindow
, &attr 
) ; 
1804 void wxTopLevelWindowMac::MacPerformUpdates() 
1806     // for composited windows this also triggers a redraw of all 
1807     // invalid views in the window 
1808     HIWindowFlush((WindowRef
) m_macWindow
) ; 
1811 // Attracts the users attention to this window if the application is 
1812 // inactive (should be called when a background event occurs) 
1814 static pascal void wxMacNMResponse( NMRecPtr ptr 
) 
1817     DisposePtr( (Ptr
)ptr 
) ; 
1820 void wxTopLevelWindowMac::RequestUserAttention(int WXUNUSED(flags
)) 
1822     NMRecPtr notificationRequest 
= (NMRecPtr
) NewPtr( sizeof( NMRec
) ) ; 
1823     static wxMacNMUPP 
nmupp( wxMacNMResponse 
); 
1825     memset( notificationRequest 
, 0 , sizeof(*notificationRequest
) ) ; 
1826     notificationRequest
->qType 
= nmType 
; 
1827     notificationRequest
->nmMark 
= 1 ; 
1828     notificationRequest
->nmIcon 
= 0 ; 
1829     notificationRequest
->nmSound 
= 0 ; 
1830     notificationRequest
->nmStr 
= NULL 
; 
1831     notificationRequest
->nmResp 
= nmupp 
; 
1833     verify_noerr( NMInstall( notificationRequest 
) ) ; 
1836 // --------------------------------------------------------------------------- 
1837 // Shape implementation 
1838 // --------------------------------------------------------------------------- 
1841 bool wxTopLevelWindowMac::SetShape(const wxRegion
& region
) 
1843     wxCHECK_MSG( HasFlag(wxFRAME_SHAPED
), false, 
1844                  _T("Shaped windows must be created with the wxFRAME_SHAPED style.")); 
1846     // The empty region signifies that the shape 
1847     // should be removed from the window. 
1848     if ( region
.IsEmpty() ) 
1850         wxSize sz 
= GetClientSize(); 
1851         wxRegion 
rgn(0, 0, sz
.x
, sz
.y
); 
1852         if ( rgn
.IsEmpty() ) 
1855             return SetShape(rgn
); 
1858     // Make a copy of the region 
1859     RgnHandle  shapeRegion 
= NewRgn(); 
1860     CopyRgn( (RgnHandle
)region
.GetWXHRGN(), shapeRegion 
); 
1862     // Dispose of any shape region we may already have 
1863     RgnHandle oldRgn 
= (RgnHandle
)GetWRefCon( (WindowRef
)MacGetWindowRef() ); 
1867     // Save the region so we can use it later 
1868     SetWRefCon((WindowRef
)MacGetWindowRef(), (URefCon
)shapeRegion
); 
1870     // inform the window manager that the window has changed shape 
1871     ReshapeCustomWindow((WindowRef
)MacGetWindowRef()); 
1876 // --------------------------------------------------------------------------- 
1877 // Support functions for shaped windows, based on Apple's CustomWindow sample at 
1878 // http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_High_Level_Toolbox/CustomWindow.htm 
1879 // --------------------------------------------------------------------------- 
1881 static void wxShapedMacWindowGetPos(WindowRef window
, Rect
* inRect
) 
1883     GetWindowPortBounds(window
, inRect
); 
1884     Point pt 
= { inRect
->top 
,inRect
->left 
}; 
1885     wxMacLocalToGlobal( window
, &pt 
) ; 
1886     inRect
->bottom 
+= pt
.v 
- inRect
->top
; 
1887     inRect
->right 
+= pt
.h 
- inRect
->left
; 
1889     inRect
->left 
= pt
.h
; 
1892 static SInt32 
wxShapedMacWindowGetFeatures(WindowRef 
WXUNUSED(window
), SInt32 param
) 
1894     /*------------------------------------------------------ 
1895         Define which options your custom window supports. 
1896     --------------------------------------------------------*/ 
1897     //just enable everything for our demo 
1898     *(OptionBits
*)param 
= 
1901         //kWindowCanCollapse | 
1902         //kWindowCanGetWindowRegion | 
1903         //kWindowHasTitleBar | 
1904         //kWindowSupportsDragHilite | 
1905         kWindowCanDrawInCurrentPort 
| 
1906         //kWindowCanMeasureTitle | 
1907         kWindowWantsDisposeAtProcessDeath 
| 
1908         kWindowSupportsGetGrowImageRegion 
| 
1909         kWindowDefSupportsColorGrafPort
; 
1914 // The content region is left as a rectangle matching the window size, this is 
1915 // so the origin in the paint event, and etc. still matches what the 
1916 // programmer expects. 
1917 static void wxShapedMacWindowContentRegion(WindowRef window
, RgnHandle rgn
) 
1920     wxTopLevelWindowMac
* win 
= wxFindWinFromMacWindow(window
); 
1924         wxShapedMacWindowGetPos( window
, &r 
) ; 
1925         RectRgn( rgn 
, &r 
) ; 
1929 // The structure region is set to the shape given to the SetShape method. 
1930 static void wxShapedMacWindowStructureRegion(WindowRef window
, RgnHandle rgn
) 
1932     RgnHandle cachedRegion 
= (RgnHandle
) GetWRefCon(window
); 
1938         wxShapedMacWindowGetPos(window
, &windowRect
);    // how big is the window 
1939         CopyRgn(cachedRegion
, rgn
);                      // make a copy of our cached region 
1940         OffsetRgn(rgn
, windowRect
.left
, windowRect
.top
); // position it over window 
1941         //MapRgn(rgn, &mMaskSize, &windowRect);          //scale it to our actual window size 
1945 static SInt32 
wxShapedMacWindowGetRegion(WindowRef window
, SInt32 param
) 
1947     GetWindowRegionPtr rgnRec 
= (GetWindowRegionPtr
)param
; 
1952     switch (rgnRec
->regionCode
) 
1954         case kWindowStructureRgn
: 
1955             wxShapedMacWindowStructureRegion(window
, rgnRec
->winRgn
); 
1958         case kWindowContentRgn
: 
1959             wxShapedMacWindowContentRegion(window
, rgnRec
->winRgn
); 
1963             SetEmptyRgn(rgnRec
->winRgn
); 
1970 // Determine the region of the window which was hit 
1972 static SInt32 
wxShapedMacWindowHitTest(WindowRef window
, SInt32 param
) 
1975     static RgnHandle tempRgn 
= NULL
; 
1977     if (tempRgn 
== NULL
) 
1980     // get the point clicked 
1981     SetPt( &hitPoint
, LoWord(param
), HiWord(param
) ); 
1983      // Mac OS 8.5 or later 
1984     wxShapedMacWindowStructureRegion(window
, tempRgn
); 
1985     if (PtInRgn( hitPoint
, tempRgn 
)) //in window content region? 
1988     // no significant area was hit 
1992 static pascal long wxShapedMacWindowDef(short WXUNUSED(varCode
), WindowRef window
, SInt16 message
, SInt32 param
) 
1996         case kWindowMsgHitTest
: 
1997             return wxShapedMacWindowHitTest(window
, param
); 
1999         case kWindowMsgGetFeatures
: 
2000             return wxShapedMacWindowGetFeatures(window
, param
); 
2002         // kWindowMsgGetRegion is sent during CreateCustomWindow and ReshapeCustomWindow 
2003         case kWindowMsgGetRegion
: 
2004             return wxShapedMacWindowGetRegion(window
, param
);