1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/osx/carbon/nonownedwnd.cpp 
   3 // Purpose:     implementation of wxNonOwnedWindow 
   4 // Author:      Stefan Csomor 
   6 // RCS-ID:      $Id: nonownedwnd.cpp 50329 2007-11-29 17:00:58Z VS $ 
   7 // Copyright:   (c) Stefan Csomor 2008 
   8 // Licence:     wxWindows licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  11 // For compilers that support precompilation, includes "wx.h". 
  12 #include "wx/wxprec.h" 
  18 #include "wx/hashmap.h" 
  19 #include "wx/evtloop.h" 
  20 #include "wx/tooltip.h" 
  21 #include "wx/nonownedwnd.h" 
  23 #include "wx/osx/private.h" 
  24 #include "wx/settings.h" 
  27 #if wxUSE_SYSTEM_OPTIONS 
  28     #include "wx/sysopt.h" 
  31 // ============================================================================ 
  32 // wxNonOwnedWindow implementation 
  33 // ============================================================================ 
  35 // unified title and toolbar constant - not in Tiger headers, so we duplicate it here 
  36 #define kWindowUnifiedTitleAndToolbarAttribute (1 << 7) 
  38 IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCarbonImpl 
, wxNonOwnedWindowImpl 
) 
  40 WXWindow 
wxNonOwnedWindowCarbonImpl::GetWXWindow() const 
  42     return (WXWindow
) m_macWindow
; 
  44 void wxNonOwnedWindowCarbonImpl::Raise() 
  46     ::SelectWindow( m_macWindow 
) ; 
  49 void wxNonOwnedWindowCarbonImpl::Lower() 
  51     ::SendBehind( m_macWindow 
, NULL 
) ; 
  54 bool wxNonOwnedWindowCarbonImpl::Show(bool show
) 
  56     bool plainTransition 
= true; 
  58 #if wxUSE_SYSTEM_OPTIONS 
  59     if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION
) ) 
  60         plainTransition 
= ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION 
) == 1 ) ; 
  66         if ( plainTransition 
) 
  67            ::ShowWindow( (WindowRef
)m_macWindow 
); 
  69            ::TransitionWindow( (WindowRef
)m_macWindow
, kWindowZoomTransitionEffect
, kWindowShowTransitionAction
, NULL 
); 
  71         ::SelectWindow( (WindowRef
)m_macWindow 
) ; 
  77         if ( plainTransition 
) 
  78            ::HideWindow( (WindowRef
)m_macWindow 
); 
  80            ::TransitionWindow( (WindowRef
)m_macWindow
, kWindowZoomTransitionEffect
, kWindowHideTransitionAction
, NULL 
); 
  86 void wxNonOwnedWindowCarbonImpl::Update() 
  88     HIWindowFlush(m_macWindow
) ; 
  91 bool wxNonOwnedWindowCarbonImpl::SetTransparent(wxByte alpha
) 
  93     OSStatus result 
= SetWindowAlpha((WindowRef
)m_macWindow
, (CGFloat
)((alpha
)/255.0)); 
  94     return result 
== noErr
; 
  97 bool wxNonOwnedWindowCarbonImpl::SetBackgroundColour(const wxColour
& col 
) 
  99     if ( col 
== wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDocumentWindowBackground
)) ) 
 101         SetThemeWindowBackground( (WindowRef
) m_macWindow
,  kThemeBrushDocumentWindowBackground
, false ) ; 
 102         SetBackgroundStyle(wxBG_STYLE_SYSTEM
); 
 104     else if ( col 
== wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDialogBackgroundActive
)) ) 
 106         SetThemeWindowBackground( (WindowRef
) m_macWindow
,  kThemeBrushDialogBackgroundActive
, false ) ; 
 107         SetBackgroundStyle(wxBG_STYLE_SYSTEM
); 
 112 void wxNonOwnedWindowCarbonImpl::SetExtraStyle( long exStyle 
) 
 114     if ( m_macWindow 
!= NULL 
) 
 116         bool metal 
= exStyle 
& wxFRAME_EX_METAL 
; 
 118         if ( MacGetMetalAppearance() != metal 
) 
 120             if ( MacGetUnifiedAppearance() ) 
 121                 MacSetUnifiedAppearance( !metal 
) ; 
 123             MacSetMetalAppearance( metal 
) ; 
 128 bool wxNonOwnedWindowCarbonImpl::SetBackgroundStyle(wxBackgroundStyle style
) 
 130     if ( style 
== wxBG_STYLE_TRANSPARENT 
) 
 132         OSStatus err 
= HIWindowChangeFeatures( m_macWindow
, 0, kWindowIsOpaque 
); 
 134         err 
= ReshapeCustomWindow( m_macWindow 
); 
 141 bool wxNonOwnedWindowCarbonImpl::CanSetTransparent() 
 146 void wxNonOwnedWindowCarbonImpl::GetContentArea( int &left 
, int &top 
, int &width 
, int &height 
) const 
 148     Rect content
, structure 
; 
 150     GetWindowBounds( m_macWindow
, kWindowStructureRgn 
, &structure 
) ; 
 151     GetWindowBounds( m_macWindow
, kWindowContentRgn 
, &content 
) ; 
 153     left 
= content
.left 
- structure
.left 
; 
 154     top 
= content
.top  
- structure
.top 
; 
 155     width 
= content
.right 
- content
.left 
; 
 156     height 
= content
.bottom 
- content
.top 
; 
 159 void wxNonOwnedWindowCarbonImpl::MoveWindow(int x
, int y
, int width
, int height
) 
 161     Rect bounds 
= { y 
, x 
, y 
+ height 
, x 
+ width 
} ; 
 162     verify_noerr(SetWindowBounds( (WindowRef
) m_macWindow
, kWindowStructureRgn 
, &bounds 
)) ; 
 165 void wxNonOwnedWindowCarbonImpl::GetPosition( int &x
, int &y 
) const 
 169     verify_noerr(GetWindowBounds((WindowRef
) m_macWindow
, kWindowStructureRgn 
, &bounds 
)) ; 
 175 void wxNonOwnedWindowCarbonImpl::GetSize( int &width
, int &height 
) const 
 179     verify_noerr(GetWindowBounds((WindowRef
) m_macWindow
, kWindowStructureRgn 
, &bounds 
)) ; 
 181     width 
= bounds
.right 
- bounds
.left 
; 
 182     height 
= bounds
.bottom 
- bounds
.top 
; 
 185 bool wxNonOwnedWindowCarbonImpl::MacGetUnifiedAppearance() const 
 187     return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute 
; 
 190 void wxNonOwnedWindowCarbonImpl::MacChangeWindowAttributes( wxUint32 attributesToSet 
, wxUint32 attributesToClear 
) 
 192     ChangeWindowAttributes( m_macWindow
, attributesToSet
, attributesToClear 
) ; 
 195 wxUint32 
wxNonOwnedWindowCarbonImpl::MacGetWindowAttributes() const 
 198     GetWindowAttributes( m_macWindow
, &attr 
) ; 
 202 void wxNonOwnedWindowCarbonImpl::MacSetMetalAppearance( bool set 
) 
 204     if ( MacGetUnifiedAppearance() ) 
 205         MacSetUnifiedAppearance( false ) ; 
 207     MacChangeWindowAttributes( set 
? kWindowMetalAttribute 
: kWindowNoAttributes 
, 
 208         set 
? kWindowNoAttributes 
: kWindowMetalAttribute 
) ; 
 211 bool wxNonOwnedWindowCarbonImpl::MacGetMetalAppearance() const 
 213     return MacGetWindowAttributes() & kWindowMetalAttribute 
; 
 216 void wxNonOwnedWindowCarbonImpl::MacSetUnifiedAppearance( bool set 
) 
 218     if ( MacGetMetalAppearance() ) 
 219         MacSetMetalAppearance( false ) ; 
 221     MacChangeWindowAttributes( set 
? kWindowUnifiedTitleAndToolbarAttribute 
: kWindowNoAttributes 
, 
 222         set 
? kWindowNoAttributes 
: kWindowUnifiedTitleAndToolbarAttribute
) ; 
 224     // For some reason, Tiger uses white as the background color for this appearance, 
 225     // while most apps using it use the typical striped background. Restore that behavior 
 227     // TODO: Determine if we need this on Leopard as well. (should be harmless either way, 
 229     // since when creating the peering is not yet completely set-up we call both setters  
 231     m_wxPeer
->SetBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW
) ) ; 
 232     SetBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW
) ) ; 
 236 // ---------------------------------------------------------------------------- 
 238 // ---------------------------------------------------------------------------- 
 240 static pascal long wxShapedMacWindowDef(short varCode
, WindowRef window
, SInt16 message
, SInt32 param
); 
 243 // --------------------------------------------------------------------------- 
 245 // --------------------------------------------------------------------------- 
 247 static const EventTypeSpec eventList
[] = 
 249     // TODO: remove control related event like key and mouse (except for WindowLeave events) 
 251     { kEventClassKeyboard
, kEventRawKeyDown 
} , 
 252     { kEventClassKeyboard
, kEventRawKeyRepeat 
} , 
 253     { kEventClassKeyboard
, kEventRawKeyUp 
} , 
 254     { kEventClassKeyboard
, kEventRawKeyModifiersChanged 
} , 
 256     { kEventClassTextInput
, kEventTextInputUnicodeForKeyEvent 
} , 
 257     { kEventClassTextInput
, kEventTextInputUpdateActiveInputArea 
} , 
 259     { kEventClassWindow 
, kEventWindowShown 
} , 
 260     { kEventClassWindow 
, kEventWindowActivated 
} , 
 261     { kEventClassWindow 
, kEventWindowDeactivated 
} , 
 262     { kEventClassWindow 
, kEventWindowBoundsChanging 
} , 
 263     { kEventClassWindow 
, kEventWindowBoundsChanged 
} , 
 264     { kEventClassWindow 
, kEventWindowClose 
} , 
 265     { kEventClassWindow 
, kEventWindowGetRegion 
} , 
 267     // we have to catch these events on the toplevel window level, 
 268     // as controls don't get the raw mouse events anymore 
 270     { kEventClassMouse 
, kEventMouseDown 
} , 
 271     { kEventClassMouse 
, kEventMouseUp 
} , 
 272     { kEventClassMouse 
, kEventMouseWheelMoved 
} , 
 273     { kEventClassMouse 
, kEventMouseMoved 
} , 
 274     { kEventClassMouse 
, kEventMouseDragged 
} , 
 277 static pascal OSStatus 
KeyboardEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 279     OSStatus result 
= eventNotHandledErr 
; 
 280     // call DoFindFocus instead of FindFocus, because for Composite Windows(like WxGenericListCtrl) 
 281     // FindFocus does not return the actual focus window, but the enclosing window 
 282     wxWindow
* focus 
= wxWindow::DoFindFocus(); 
 284         focus 
= data 
? ((wxNonOwnedWindowImpl
*) data
)->GetWXPeer() : NULL 
; 
 286     unsigned char charCode 
; 
 294     UInt32 when 
= EventTimeToTicks( GetEventTime( event 
) ) ; 
 297     ByteCount dataSize 
= 0 ; 
 298     if ( GetEventParameter( event
, kEventParamKeyUnicodes
, typeUnicodeText
, NULL
, 0 , &dataSize
, NULL 
) == noErr 
) 
 301         int numChars 
= dataSize 
/ sizeof( UniChar
) + 1; 
 303         UniChar
* charBuf 
= buf 
; 
 305         if ( numChars 
* 2 > 4 ) 
 306             charBuf 
= new UniChar
[ numChars 
] ; 
 307         GetEventParameter( event
, kEventParamKeyUnicodes
, typeUnicodeText
, NULL
, dataSize 
, NULL 
, charBuf 
) ; 
 308         charBuf
[ numChars 
- 1 ] = 0; 
 310 #if SIZEOF_WCHAR_T == 2 
 311         uniChar 
= charBuf
[0] ; 
 313         wxMBConvUTF16 converter 
; 
 314         converter
.MB2WC( uniChar 
, (const char*)charBuf 
, 2 ) ; 
 317         if ( numChars 
* 2 > 4 ) 
 322     GetEventParameter( event
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, sizeof(char), NULL
, &charCode 
); 
 323     GetEventParameter( event
, kEventParamKeyCode
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &keyCode 
); 
 324     GetEventParameter( event
, kEventParamKeyModifiers
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &modifiers 
); 
 325     GetEventParameter( event
, kEventParamMouseLocation
, typeQDPoint
, NULL
, sizeof(Point
), NULL
, &point 
); 
 327     UInt32 message 
= (keyCode 
<< 8) + charCode
; 
 328     switch ( GetEventKind( event 
) ) 
 330         case kEventRawKeyRepeat 
: 
 331         case kEventRawKeyDown 
: 
 333                 WXEVENTREF formerEvent 
= wxTheApp
->MacGetCurrentEvent() ; 
 334                 WXEVENTHANDLERCALLREF formerHandler 
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 335                 wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 336                 if ( /* focus && */ wxTheApp
->MacSendKeyDownEvent( 
 337                     focus 
, message 
, modifiers 
, when 
, point
.h 
, point
.v 
, uniChar
[0] ) ) 
 341                 wxTheApp
->MacSetCurrentEvent( formerEvent 
, formerHandler 
) ; 
 345         case kEventRawKeyUp 
: 
 346             if ( /* focus && */ wxTheApp
->MacSendKeyUpEvent( 
 347                 focus 
, message 
, modifiers 
, when 
, point
.h 
, point
.v 
, uniChar
[0] ) ) 
 353         case kEventRawKeyModifiersChanged 
: 
 355                 wxKeyEvent 
event(wxEVT_KEY_DOWN
); 
 357                 event
.m_shiftDown 
= modifiers 
& shiftKey
; 
 358                 event
.m_controlDown 
= modifiers 
& controlKey
; 
 359                 event
.m_altDown 
= modifiers 
& optionKey
; 
 360                 event
.m_metaDown 
= modifiers 
& cmdKey
; 
 365                 event
.m_uniChar 
= uniChar
[0] ; 
 368                 event
.SetTimestamp(when
); 
 369                 event
.SetEventObject(focus
); 
 371                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & controlKey 
) 
 373                     event
.m_keyCode 
= WXK_CONTROL 
; 
 374                     event
.SetEventType( ( modifiers 
& controlKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 375                     focus
->HandleWindowEvent( event 
) ; 
 377                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & shiftKey 
) 
 379                     event
.m_keyCode 
= WXK_SHIFT 
; 
 380                     event
.SetEventType( ( modifiers 
& shiftKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 381                     focus
->HandleWindowEvent( event 
) ; 
 383                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & optionKey 
) 
 385                     event
.m_keyCode 
= WXK_ALT 
; 
 386                     event
.SetEventType( ( modifiers 
& optionKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 387                     focus
->HandleWindowEvent( event 
) ; 
 389                 if ( /* focus && */ (modifiers 
^ wxApp::s_lastModifiers 
) & cmdKey 
) 
 391                     event
.m_keyCode 
= WXK_COMMAND 
; 
 392                     event
.SetEventType( ( modifiers 
& cmdKey 
) ? wxEVT_KEY_DOWN 
: wxEVT_KEY_UP 
) ; 
 393                     focus
->HandleWindowEvent( event 
) ; 
 396                 wxApp::s_lastModifiers 
= modifiers 
; 
 407 // we don't interfere with foreign controls on our toplevel windows, therefore we always give back eventNotHandledErr 
 408 // for windows that we didn't create (like eg Scrollbars in a databrowser), or for controls where we did not handle the 
 411 // This handler can also be called from app level where data (ie target window) may be null or a non wx window 
 413 EventMouseButton g_lastButton 
= 0 ; 
 414 bool g_lastButtonWasFakeRight 
= false ; 
 416 void SetupMouseEvent( wxMouseEvent 
&wxevent 
, wxMacCarbonEvent 
&cEvent 
) 
 418     UInt32 modifiers 
= cEvent
.GetParameter
<UInt32
>(kEventParamKeyModifiers
, typeUInt32
) ; 
 419     Point screenMouseLocation 
= cEvent
.GetParameter
<Point
>(kEventParamMouseLocation
) ; 
 421     // these parameters are not given for all events 
 422     EventMouseButton button 
= 0 ; 
 423     UInt32 clickCount 
= 0 ; 
 424     UInt32 mouseChord 
= 0; 
 426     cEvent
.GetParameter
<EventMouseButton
>( kEventParamMouseButton
, typeMouseButton 
, &button 
) ; 
 427     cEvent
.GetParameter
<UInt32
>( kEventParamClickCount
, typeUInt32 
, &clickCount 
) ; 
 428     // the chord is the state of the buttons pressed currently 
 429     cEvent
.GetParameter
<UInt32
>( kEventParamMouseChord
, typeUInt32 
, &mouseChord 
) ; 
 431     wxevent
.m_x 
= screenMouseLocation
.h
; 
 432     wxevent
.m_y 
= screenMouseLocation
.v
; 
 433     wxevent
.m_shiftDown 
= modifiers 
& shiftKey
; 
 434     wxevent
.m_controlDown 
= modifiers 
& controlKey
; 
 435     wxevent
.m_altDown 
= modifiers 
& optionKey
; 
 436     wxevent
.m_metaDown 
= modifiers 
& cmdKey
; 
 437     wxevent
.m_clickCount 
= clickCount
; 
 438     wxevent
.SetTimestamp( cEvent
.GetTicks() ) ; 
 440     // a control click is interpreted as a right click 
 441     bool thisButtonIsFakeRight 
= false ; 
 442     if ( button 
== kEventMouseButtonPrimary 
&& (modifiers 
& controlKey
) ) 
 444         button 
= kEventMouseButtonSecondary 
; 
 445         thisButtonIsFakeRight 
= true ; 
 448     // otherwise we report double clicks by connecting a left click with a ctrl-left click 
 449     if ( clickCount 
> 1 && button 
!= g_lastButton 
) 
 452     // we must make sure that our synthetic 'right' button corresponds in 
 453     // mouse down, moved and mouse up, and does not deliver a right down and left up 
 455     if ( cEvent
.GetKind() == kEventMouseDown 
) 
 457         g_lastButton 
= button 
; 
 458         g_lastButtonWasFakeRight 
= thisButtonIsFakeRight 
; 
 464         g_lastButtonWasFakeRight 
= false ; 
 466     else if ( g_lastButton 
== kEventMouseButtonSecondary 
&& g_lastButtonWasFakeRight 
) 
 467         button 
= g_lastButton 
; 
 469     // Adjust the chord mask to remove the primary button and add the 
 470     // secondary button.  It is possible that the secondary button is 
 471     // already pressed, e.g. on a mouse connected to a laptop, but this 
 472     // possibility is ignored here: 
 473     if( thisButtonIsFakeRight 
&& ( mouseChord 
& 1U ) ) 
 474         mouseChord 
= ((mouseChord 
& ~1U) | 2U); 
 477                 wxevent
.m_leftDown 
= true ; 
 479                 wxevent
.m_rightDown 
= true ; 
 481                 wxevent
.m_middleDown 
= true ; 
 483     // translate into wx types 
 484     switch ( cEvent
.GetKind() ) 
 486         case kEventMouseDown 
: 
 489                 case kEventMouseButtonPrimary 
: 
 490                     wxevent
.SetEventType( clickCount 
> 1 ? wxEVT_LEFT_DCLICK 
: wxEVT_LEFT_DOWN 
)  ; 
 493                 case kEventMouseButtonSecondary 
: 
 494                     wxevent
.SetEventType( clickCount 
> 1 ? wxEVT_RIGHT_DCLICK 
: wxEVT_RIGHT_DOWN 
) ; 
 497                 case kEventMouseButtonTertiary 
: 
 498                     wxevent
.SetEventType( clickCount 
> 1 ? wxEVT_MIDDLE_DCLICK 
: wxEVT_MIDDLE_DOWN 
) ; 
 509                 case kEventMouseButtonPrimary 
: 
 510                     wxevent
.SetEventType( wxEVT_LEFT_UP 
)  ; 
 513                 case kEventMouseButtonSecondary 
: 
 514                     wxevent
.SetEventType( wxEVT_RIGHT_UP 
) ; 
 517                 case kEventMouseButtonTertiary 
: 
 518                     wxevent
.SetEventType( wxEVT_MIDDLE_UP 
) ; 
 526      case kEventMouseWheelMoved 
: 
 528             wxevent
.SetEventType( wxEVT_MOUSEWHEEL 
) ; 
 530             EventMouseWheelAxis axis 
= cEvent
.GetParameter
<EventMouseWheelAxis
>(kEventParamMouseWheelAxis
, typeMouseWheelAxis
) ; 
 531             SInt32 delta 
= cEvent
.GetParameter
<SInt32
>(kEventParamMouseWheelDelta
, typeSInt32
) ; 
 533             wxevent
.m_wheelRotation 
= delta
; 
 534             wxevent
.m_wheelDelta 
= 1; 
 535             wxevent
.m_linesPerAction 
= 1; 
 536             if ( axis 
== kEventMouseWheelAxisX 
) 
 537                 wxevent
.m_wheelAxis 
= 1; 
 541         case kEventMouseEntered 
: 
 542         case kEventMouseExited 
: 
 543         case kEventMouseDragged 
: 
 544         case kEventMouseMoved 
: 
 545             wxevent
.SetEventType( wxEVT_MOTION 
) ; 
 552 #define NEW_CAPTURE_HANDLING 1 
 555 wxMacTopLevelMouseEventHandler(EventHandlerCallRef 
WXUNUSED(handler
), 
 559     wxNonOwnedWindow
* toplevelWindow 
= data 
? ((wxNonOwnedWindowImpl
*) data
)->GetWXPeer() : NULL 
; 
 561     OSStatus result 
= eventNotHandledErr 
; 
 563     wxMacCarbonEvent 
cEvent( event 
) ; 
 565     Point screenMouseLocation 
= cEvent
.GetParameter
<Point
>(kEventParamMouseLocation
) ; 
 566     Point windowMouseLocation 
= screenMouseLocation 
; 
 568     WindowRef window 
= NULL
; 
 569     short windowPart 
= ::FindWindow(screenMouseLocation
, &window
); 
 571     wxWindow
* currentMouseWindow 
= NULL 
; 
 572     ControlRef control 
= NULL 
; 
 574 #if NEW_CAPTURE_HANDLING 
 575     if ( wxApp::s_captureWindow 
) 
 577         window 
= (WindowRef
) wxApp::s_captureWindow
->MacGetTopLevelWindowRef() ; 
 578         windowPart 
= inContent 
; 
 584         QDGlobalToLocalPoint( GetWindowPort( window 
), &windowMouseLocation 
); 
 586         if ( wxApp::s_captureWindow
 
 587 #if !NEW_CAPTURE_HANDLING 
 588              && wxApp::s_captureWindow
->MacGetTopLevelWindowRef() == (WXWindow
) window 
&& windowPart 
== inContent
 
 592             currentMouseWindow 
= wxApp::s_captureWindow 
; 
 594         else if ( (IsWindowActive(window
) && windowPart 
== inContent
) ) 
 596             ControlPartCode part 
; 
 597             control 
= FindControlUnderMouse( windowMouseLocation 
, window 
, &part 
) ; 
 598             // if there is no control below the mouse position, send the event to the toplevel window itself 
 601                 currentMouseWindow 
= (wxWindow
*) toplevelWindow 
; 
 605                 currentMouseWindow 
= (wxWindow
*) wxFindWindowFromWXWidget( (WXWidget
) control 
) ; 
 606 #ifndef __WXUNIVERSAL__ 
 607                 if ( currentMouseWindow 
== NULL 
&& cEvent
.GetKind() == kEventMouseMoved 
) 
 610                     // for wxToolBar to function we have to send certaint events to it 
 611                     // instead of its children (wxToolBarTools) 
 613                     GetSuperControl(control
, &parent 
); 
 614                     wxWindow 
*wxParent 
= (wxWindow
*) wxFindWindowFromWXWidget((WXWidget
) parent 
) ; 
 615                     if ( wxParent 
&& wxParent
->IsKindOf( CLASSINFO( wxToolBar 
) ) ) 
 616                         currentMouseWindow 
= wxParent 
; 
 622             // disabled windows must not get any input messages 
 623             if ( currentMouseWindow 
&& !currentMouseWindow
->MacIsReallyEnabled() ) 
 624                 currentMouseWindow 
= NULL
; 
 628     wxMouseEvent 
wxevent(wxEVT_LEFT_DOWN
); 
 629     SetupMouseEvent( wxevent 
, cEvent 
) ; 
 631     // handle all enter / leave events 
 633     if ( currentMouseWindow 
!= g_MacLastWindow 
) 
 635         if ( g_MacLastWindow 
) 
 637             wxMouseEvent 
eventleave(wxevent
); 
 638             eventleave
.SetEventType( wxEVT_LEAVE_WINDOW 
); 
 639             g_MacLastWindow
->ScreenToClient( &eventleave
.m_x
, &eventleave
.m_y 
); 
 640             eventleave
.SetEventObject( g_MacLastWindow 
) ; 
 641             wxevent
.SetId( g_MacLastWindow
->GetId() ) ; 
 644             wxToolTip::RelayEvent( g_MacLastWindow 
, eventleave
); 
 647             g_MacLastWindow
->HandleWindowEvent(eventleave
); 
 650         if ( currentMouseWindow 
) 
 652             wxMouseEvent 
evententer(wxevent
); 
 653             evententer
.SetEventType( wxEVT_ENTER_WINDOW 
); 
 654             currentMouseWindow
->ScreenToClient( &evententer
.m_x
, &evententer
.m_y 
); 
 655             evententer
.SetEventObject( currentMouseWindow 
) ; 
 656             wxevent
.SetId( currentMouseWindow
->GetId() ) ; 
 659             wxToolTip::RelayEvent( currentMouseWindow 
, evententer 
); 
 662             currentMouseWindow
->HandleWindowEvent(evententer
); 
 665         g_MacLastWindow 
= currentMouseWindow 
; 
 668     if ( windowPart 
== inMenuBar 
) 
 670         // special case menu bar, as we are having a low-level runloop we must do it ourselves 
 671         if ( cEvent
.GetKind() == kEventMouseDown 
) 
 673             ::MenuSelect( screenMouseLocation 
) ; 
 678     else if ( window 
&& windowPart 
== inProxyIcon 
) 
 680         // special case proxy icon bar, as we are having a low-level runloop we must do it ourselves 
 681         if ( cEvent
.GetKind() == kEventMouseDown 
) 
 683             if ( ::TrackWindowProxyDrag( window
, screenMouseLocation 
) != errUserWantsToDragWindow 
) 
 685                 // TODO Track change of file path and report back 
 690     else if ( currentMouseWindow 
) 
 692         wxWindow 
*currentMouseWindowParent 
= currentMouseWindow
->GetParent(); 
 694         currentMouseWindow
->ScreenToClient( &wxevent
.m_x 
, &wxevent
.m_y 
) ; 
 696         wxevent
.SetEventObject( currentMouseWindow 
) ; 
 697         wxevent
.SetId( currentMouseWindow
->GetId() ) ; 
 699         // make tooltips current 
 702         if ( wxevent
.GetEventType() == wxEVT_MOTION 
) 
 703             wxToolTip::RelayEvent( currentMouseWindow 
, wxevent 
); 
 706         if ( currentMouseWindow
->HandleWindowEvent(wxevent
) ) 
 708             if ((currentMouseWindowParent 
!= NULL
) && 
 709                 (currentMouseWindowParent
->GetChildren().Find(currentMouseWindow
) == NULL
)) 
 710                 currentMouseWindow 
= NULL
; 
 716             // if the user code did _not_ handle the event, then perform the 
 717             // default processing 
 718             if ( wxevent
.GetEventType() == wxEVT_LEFT_DOWN 
) 
 720                 // ... that is set focus to this window 
 721                 if (currentMouseWindow
->CanAcceptFocus() && wxWindow::FindFocus()!=currentMouseWindow
) 
 722                     currentMouseWindow
->SetFocus(); 
 726         if ( cEvent
.GetKind() == kEventMouseUp 
&& wxApp::s_captureWindow 
) 
 728             wxApp::s_captureWindow 
= NULL 
; 
 734         wxWindow
* cursorTarget 
= currentMouseWindow 
; 
 735         wxPoint 
cursorPoint( wxevent
.m_x 
, wxevent
.m_y 
) ; 
 737         extern wxCursor gGlobalCursor
; 
 739         if (!gGlobalCursor
.IsOk()) 
 741             while ( cursorTarget 
&& !cursorTarget
->MacSetupCursor( cursorPoint 
) ) 
 743                 cursorTarget 
= cursorTarget
->GetParent() ; 
 745                     cursorPoint 
+= cursorTarget
->GetPosition(); 
 750     else // currentMouseWindow == NULL 
 752         // don't mess with controls we don't know about 
 753         // for some reason returning eventNotHandledErr does not lead to the correct behaviour 
 754         // so we try sending them the correct control directly 
 755         if ( cEvent
.GetKind() == kEventMouseDown 
&& toplevelWindow 
&& control 
) 
 757             EventModifiers modifiers 
= cEvent
.GetParameter
<EventModifiers
>(kEventParamKeyModifiers
, typeUInt32
) ; 
 758             Point clickLocation 
= windowMouseLocation 
; 
 761             hiPoint
.x 
= clickLocation
.h 
; 
 762             hiPoint
.y 
= clickLocation
.v 
; 
 763             HIViewConvertPoint( &hiPoint 
, (ControlRef
) toplevelWindow
->GetHandle() , control  
) ; 
 764             clickLocation
.h 
= (int)hiPoint
.x 
; 
 765             clickLocation
.v 
= (int)hiPoint
.y 
; 
 767             HandleControlClick( control 
, clickLocation 
, modifiers 
, (ControlActionUPP 
) -1 ) ; 
 775 static pascal OSStatus
 
 776 wxNonOwnedWindowEventHandler(EventHandlerCallRef 
WXUNUSED(handler
), 
 780     OSStatus result 
= eventNotHandledErr 
; 
 782     wxMacCarbonEvent 
cEvent( event 
) ; 
 784     // WindowRef windowRef = cEvent.GetParameter<WindowRef>(kEventParamDirectObject) ; 
 785     wxNonOwnedWindow
* toplevelWindow 
= data 
? ((wxNonOwnedWindowImpl
*) data
)->GetWXPeer() : NULL
; 
 787     switch ( GetEventKind( event 
) ) 
 789         case kEventWindowActivated 
: 
 791             toplevelWindow
->HandleActivated( cEvent
.GetTicks() , true) ; 
 792             // we still sending an eventNotHandledErr in order to allow for default processing 
 796         case kEventWindowDeactivated 
: 
 798             toplevelWindow
->HandleActivated( cEvent
.GetTicks() , false) ; 
 799             // we still sending an eventNotHandledErr in order to allow for default processing 
 803         case kEventWindowShown 
: 
 804             toplevelWindow
->Refresh() ; 
 808         case kEventWindowClose 
: 
 809             toplevelWindow
->Close() ; 
 813         case kEventWindowBoundsChanged 
: 
 815             UInt32 attributes 
= cEvent
.GetParameter
<UInt32
>(kEventParamAttributes
, typeUInt32
) ; 
 816             Rect newRect 
= cEvent
.GetParameter
<Rect
>(kEventParamCurrentBounds
) ; 
 817             wxRect 
r( newRect
.left 
, newRect
.top 
, newRect
.right 
- newRect
.left 
, newRect
.bottom 
- newRect
.top 
) ; 
 818             if ( attributes 
& kWindowBoundsChangeSizeChanged 
) 
 820                 toplevelWindow
->HandleResized(cEvent
.GetTicks() ) ; 
 823             if ( attributes 
& kWindowBoundsChangeOriginChanged 
) 
 825                 toplevelWindow
->HandleMoved(cEvent
.GetTicks() ) ; 
 832         case kEventWindowBoundsChanging 
: 
 834             UInt32 attributes 
= cEvent
.GetParameter
<UInt32
>(kEventParamAttributes
,typeUInt32
) ; 
 835             Rect newRect 
= cEvent
.GetParameter
<Rect
>(kEventParamCurrentBounds
) ; 
 837             if ( (attributes 
& kWindowBoundsChangeSizeChanged
) || (attributes 
& kWindowBoundsChangeOriginChanged
) ) 
 839                 // all (Mac) rects are in content area coordinates, all wxRects in structure coordinates 
 840                 int left 
, top 
, width 
, height 
; 
 844                 toplevelWindow
->GetNonOwnedPeer()->GetContentArea(left
, top
, width
, height
); 
 845                 toplevelWindow
->GetNonOwnedPeer()->GetSize(swidth
, sheight
); 
 846                 int deltawidth 
= swidth 
- width
; 
 847                 int deltaheight 
= sheight 
- height
; 
 851                     newRect
.right 
- newRect
.left 
+ deltawidth
, 
 852                     newRect
.bottom 
- newRect
.top 
+ deltaheight 
) ; 
 854                 toplevelWindow
->HandleResizing( cEvent
.GetTicks(), &adjustR 
); 
 856                 const Rect adjustedRect 
= { adjustR
.y 
+ top  
, adjustR
.x 
+ left 
, adjustR
.y 
+ top 
+ adjustR
.height 
- deltaheight 
,  
 857                     adjustR
.x 
+ left 
+ adjustR
.width 
- deltawidth 
} ; 
 858                 if ( !EqualRect( &newRect 
, &adjustedRect 
) ) 
 859                     cEvent
.SetParameter
<Rect
>( kEventParamCurrentBounds 
, &adjustedRect 
) ; 
 866         case kEventWindowGetRegion 
: 
 868                 if ( toplevelWindow
->GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT 
) 
 870                     WindowRegionCode windowRegionCode 
; 
 872                     // Fetch the region code that is being queried 
 873                     GetEventParameter( event
, 
 874                                        kEventParamWindowRegionCode
, 
 875                                        typeWindowRegionCode
, NULL
, 
 876                                        sizeof windowRegionCode
, NULL
, 
 877                                        &windowRegionCode 
) ; 
 879                     // If it is the opaque region code then set the 
 880                     // region to empty and return noErr to stop event 
 882                     if ( windowRegionCode 
== kWindowOpaqueRgn 
) { 
 884                         GetEventParameter( event
, 
 885                                            kEventParamRgnHandle
, 
 886                                            typeQDRgnHandle
, NULL
, 
 889                         SetEmptyRgn(region
) ; 
 903 // mix this in from window.cpp 
 904 pascal OSStatus 
wxMacUnicodeTextEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) ; 
 906 pascal OSStatus 
wxNonOwnedEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 908     OSStatus result 
= eventNotHandledErr 
; 
 910     switch ( GetEventClass( event 
) ) 
 912         case kEventClassTextInput 
: 
 914             // TODO remove as soon as all events are on implementation classes only 
 915             wxNonOwnedWindow
* toplevelWindow 
= data 
? ((wxNonOwnedWindowImpl
*) data
)->GetWXPeer() : NULL
; 
 917             result 
= wxMacUnicodeTextEventHandler( handler
, event 
, toplevelWindow 
) ; 
 921         case kEventClassKeyboard 
: 
 922             result 
= KeyboardEventHandler( handler
, event 
, data 
) ; 
 925         case kEventClassWindow 
: 
 926             result 
= wxNonOwnedWindowEventHandler( handler
, event 
, data 
) ; 
 929         case kEventClassMouse 
: 
 930             result 
= wxMacTopLevelMouseEventHandler( handler
, event 
, data 
) ; 
 940 DEFINE_ONE_SHOT_HANDLER_GETTER( wxNonOwnedEventHandler 
) 
 942 // --------------------------------------------------------------------------- 
 943 // Support functions for shaped windows, based on Apple's CustomWindow sample at 
 944 // http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_High_Level_Toolbox/CustomWindow.htm 
 945 // --------------------------------------------------------------------------- 
 947 static void wxShapedMacWindowGetPos(WindowRef window
, Rect
* inRect
) 
 949     GetWindowPortBounds(window
, inRect
); 
 950     Point pt 
= { inRect
->top 
,inRect
->left 
}; 
 951     QDLocalToGlobalPoint( GetWindowPort( window 
), &pt 
); 
 952     inRect
->bottom 
+= pt
.v 
- inRect
->top
; 
 953     inRect
->right 
+= pt
.h 
- inRect
->left
; 
 958 static SInt32 
wxShapedMacWindowGetFeatures(WindowRef 
WXUNUSED(window
), SInt32 param
) 
 960     /*------------------------------------------------------ 
 961         Define which options your custom window supports. 
 962     --------------------------------------------------------*/ 
 963     //just enable everything for our demo 
 964     *(OptionBits
*)param 
= 
 968         //kWindowCanGetWindowRegion | 
 969         //kWindowHasTitleBar | 
 970         //kWindowSupportsDragHilite | 
 971         kWindowCanDrawInCurrentPort 
| 
 972         //kWindowCanMeasureTitle | 
 973         kWindowWantsDisposeAtProcessDeath 
| 
 974         kWindowSupportsGetGrowImageRegion 
| 
 975         kWindowDefSupportsColorGrafPort
; 
 980 // The content region is left as a rectangle matching the window size, this is 
 981 // so the origin in the paint event, and etc. still matches what the 
 982 // programmer expects. 
 983 static void wxShapedMacWindowContentRegion(WindowRef window
, RgnHandle rgn
) 
 986     wxNonOwnedWindow
* win 
= wxNonOwnedWindow::GetFromWXWindow((WXWindow
)window
); 
 990         wxShapedMacWindowGetPos( window
, &r 
) ; 
 991         RectRgn( rgn 
, &r 
) ; 
 995 // The structure region is set to the shape given to the SetShape method. 
 996 static void wxShapedMacWindowStructureRegion(WindowRef window
, RgnHandle rgn
) 
 998     RgnHandle cachedRegion 
= (RgnHandle
) GetWRefCon(window
); 
1004         wxShapedMacWindowGetPos(window
, &windowRect
);    // how big is the window 
1005         CopyRgn(cachedRegion
, rgn
);                      // make a copy of our cached region 
1006         OffsetRgn(rgn
, windowRect
.left
, windowRect
.top
); // position it over window 
1007         //MapRgn(rgn, &mMaskSize, &windowRect);          //scale it to our actual window size 
1011 static SInt32 
wxShapedMacWindowGetRegion(WindowRef window
, SInt32 param
) 
1013     GetWindowRegionPtr rgnRec 
= (GetWindowRegionPtr
)param
; 
1018     switch (rgnRec
->regionCode
) 
1020         case kWindowStructureRgn
: 
1021             wxShapedMacWindowStructureRegion(window
, rgnRec
->winRgn
); 
1024         case kWindowContentRgn
: 
1025             wxShapedMacWindowContentRegion(window
, rgnRec
->winRgn
); 
1029             SetEmptyRgn(rgnRec
->winRgn
); 
1036 // Determine the region of the window which was hit 
1038 static SInt32 
wxShapedMacWindowHitTest(WindowRef window
, SInt32 param
) 
1041     static RgnHandle tempRgn 
= NULL
; 
1043     if (tempRgn 
== NULL
) 
1046     // get the point clicked 
1047     SetPt( &hitPoint
, LoWord(param
), HiWord(param
) ); 
1049      // Mac OS 8.5 or later 
1050     wxShapedMacWindowStructureRegion(window
, tempRgn
); 
1051     if (PtInRgn( hitPoint
, tempRgn 
)) //in window content region? 
1054     // no significant area was hit 
1058 static pascal long wxShapedMacWindowDef(short WXUNUSED(varCode
), WindowRef window
, SInt16 message
, SInt32 param
) 
1062         case kWindowMsgHitTest
: 
1063             return wxShapedMacWindowHitTest(window
, param
); 
1065         case kWindowMsgGetFeatures
: 
1066             return wxShapedMacWindowGetFeatures(window
, param
); 
1068         // kWindowMsgGetRegion is sent during CreateCustomWindow and ReshapeCustomWindow 
1069         case kWindowMsgGetRegion
: 
1070             return wxShapedMacWindowGetRegion(window
, param
); 
1083     wxPoint m_position 
; 
1085     bool m_wasResizable 
; 
1088 wxNonOwnedWindowCarbonImpl::wxNonOwnedWindowCarbonImpl() 
1092 wxNonOwnedWindowCarbonImpl::wxNonOwnedWindowCarbonImpl( wxNonOwnedWindow
* nonownedwnd
) : wxNonOwnedWindowImpl( nonownedwnd
) 
1094     m_macEventHandler 
= NULL
; 
1096     m_macFullScreenData 
= NULL 
; 
1099 wxNonOwnedWindowCarbonImpl::~wxNonOwnedWindowCarbonImpl() 
1102         wxToolTip::NotifyWindowDelete(m_macWindow
) ; 
1105     if ( m_macEventHandler 
) 
1107         ::RemoveEventHandler((EventHandlerRef
) m_macEventHandler
); 
1108         m_macEventHandler 
= NULL 
; 
1112         DisposeWindow( m_macWindow 
); 
1114     FullScreenData 
*data 
= (FullScreenData 
*) m_macFullScreenData 
; 
1116     m_macFullScreenData 
= NULL 
; 
1122 void wxNonOwnedWindowCarbonImpl::Destroy() 
1124     if ( m_macEventHandler 
) 
1126         ::RemoveEventHandler((EventHandlerRef
) m_macEventHandler
); 
1127         m_macEventHandler 
= NULL 
; 
1130     wxPendingDelete
.Append( new wxDeferredObjectDeleter( this ) ) ; 
1133 void wxNonOwnedWindowInstallTopLevelWindowEventHandler(WindowRef window
, EventHandlerRef
* handler
, void *ref
) 
1135     InstallWindowEventHandler(window
, GetwxNonOwnedEventHandlerUPP(), 
1136         GetEventTypeCount(eventList
), eventList
, ref
, handler 
); 
1139 bool wxNonOwnedWindowCarbonImpl::SetShape(const wxRegion
& region
) 
1141     // Make a copy of the region 
1142     RgnHandle  shapeRegion 
= NewRgn(); 
1143     HIShapeGetAsQDRgn( region
.GetWXHRGN(), shapeRegion 
); 
1145     // Dispose of any shape region we may already have 
1146     RgnHandle oldRgn 
= (RgnHandle
)GetWRefCon( (WindowRef
) m_wxPeer
->GetWXWindow() ); 
1150     // Save the region so we can use it later 
1151     SetWRefCon((WindowRef
) m_wxPeer
->GetWXWindow(), (URefCon
)shapeRegion
); 
1153     // inform the window manager that the window has changed shape 
1154     ReshapeCustomWindow((WindowRef
) m_wxPeer
->GetWXWindow()); 
1160 void wxNonOwnedWindowCarbonImpl::MacInstallTopLevelWindowEventHandler() 
1162     if ( m_macEventHandler 
!= NULL 
) 
1164         verify_noerr( ::RemoveEventHandler( (EventHandlerRef
) m_macEventHandler 
) ) ; 
1166     wxNonOwnedWindowInstallTopLevelWindowEventHandler(MAC_WXHWND(m_macWindow
),(EventHandlerRef 
*)&m_macEventHandler
,this); 
1169 void wxNonOwnedWindowCarbonImpl::Create( 
1173     long style
, long extraStyle
,  
1174     const wxString
& name 
) 
1177     OSStatus err 
= noErr 
; 
1186     ::SetRect(&theBoundsRect
, x
, y 
, x 
+ w
, y 
+ h
); 
1188     // translate the window attributes in the appropriate window class and attributes 
1189     WindowClass wclass 
= 0; 
1190     WindowAttributes attr 
= kWindowNoAttributes 
; 
1191     WindowGroupRef group 
= NULL 
; 
1192     bool activationScopeSet 
= false; 
1193     WindowActivationScope activationScope 
= kWindowActivationScopeNone
; 
1195     if ( style 
& wxFRAME_TOOL_WINDOW 
) 
1198             ( style 
& wxMINIMIZE_BOX 
) || ( style 
& wxMAXIMIZE_BOX 
) || 
1199             ( style 
& wxSYSTEM_MENU 
) || ( style 
& wxCAPTION 
) || 
1200             ( style 
&wxTINY_CAPTION_HORIZ
) ||  ( style 
&wxTINY_CAPTION_VERT
) 
1203             if ( ( style 
& wxSTAY_ON_TOP 
) ) 
1204                 wclass 
= kUtilityWindowClass
; 
1206                 wclass 
= kFloatingWindowClass 
; 
1208             if ( ( style 
&wxTINY_CAPTION_VERT
) ) 
1209                 attr 
|= kWindowSideTitlebarAttribute 
; 
1213             if ( style 
& wxNO_BORDER 
) 
1215                 wclass 
= kSimpleWindowClass 
; 
1219                 wclass 
= kPlainWindowClass 
; 
1221             activationScopeSet 
= true; 
1222             activationScope 
= kWindowActivationScopeNone
; 
1225     else if ( ( style 
& wxPOPUP_WINDOW 
) ) 
1227         if ( ( style 
& wxBORDER_NONE 
) ) 
1229             wclass 
= kHelpWindowClass 
;   // has no border 
1230             attr 
|= kWindowNoShadowAttribute
; 
1234             wclass 
= kPlainWindowClass 
;  // has a single line border, it will have to do for now 
1236         group 
= GetWindowGroupOfClass(kFloatingWindowClass
) ; 
1237         // make sure we don't deactivate something 
1238         activationScopeSet 
= true; 
1239         activationScope 
= kWindowActivationScopeNone
; 
1241     else if ( ( style 
& wxCAPTION 
) ) 
1243         wclass 
= kDocumentWindowClass 
; 
1244         attr 
|= kWindowInWindowMenuAttribute 
; 
1246     else if ( ( style 
& wxFRAME_DRAWER 
) ) 
1248         wclass 
= kDrawerWindowClass
; 
1252         if ( ( style 
& wxMINIMIZE_BOX 
) || ( style 
& wxMAXIMIZE_BOX 
) || 
1253             ( style 
& wxCLOSE_BOX 
) || ( style 
& wxSYSTEM_MENU 
) ) 
1255             wclass 
= kDocumentWindowClass 
; 
1257         else if ( ( style 
& wxNO_BORDER 
) ) 
1259             wclass 
= kSimpleWindowClass 
; 
1263             wclass 
= kPlainWindowClass 
; 
1267     if ( wclass 
!= kPlainWindowClass 
) 
1269         if ( ( style 
& wxMINIMIZE_BOX 
) ) 
1270             attr 
|= kWindowCollapseBoxAttribute 
; 
1272         if ( ( style 
& wxMAXIMIZE_BOX 
) ) 
1273             attr 
|= kWindowFullZoomAttribute 
; 
1275         if ( ( style 
& wxRESIZE_BORDER 
) ) 
1276             attr 
|= kWindowResizableAttribute 
; 
1278         if ( ( style 
& wxCLOSE_BOX
) ) 
1279             attr 
|= kWindowCloseBoxAttribute 
; 
1281     attr 
|= kWindowLiveResizeAttribute
; 
1283     if ( ( style 
&wxSTAY_ON_TOP
) ) 
1284         group 
= GetWindowGroupOfClass(kUtilityWindowClass
) ; 
1286     if ( ( style 
& wxFRAME_FLOAT_ON_PARENT 
) ) 
1287         group 
= GetWindowGroupOfClass(kFloatingWindowClass
) ; 
1289     if ( group 
== NULL 
&& parent 
!= NULL 
) 
1291         WindowRef parenttlw 
= (WindowRef
) parent
->MacGetTopLevelWindowRef(); 
1293             group 
= GetWindowGroupParent( GetWindowGroup( parenttlw 
) ); 
1296     attr 
|= kWindowCompositingAttribute
; 
1297 #if 0 // TODO : decide on overall handling of high dpi screens (pixel vs userscale) 
1298     attr 
|= kWindowFrameworkScaledAttribute
; 
1301     if ( ( style 
&wxFRAME_SHAPED
) ) 
1303         WindowDefSpec customWindowDefSpec
; 
1304         customWindowDefSpec
.defType 
= kWindowDefProcPtr
; 
1305         customWindowDefSpec
.u
.defProc 
= 
1307             (WindowDefUPP
) wxShapedMacWindowDef
; 
1309             NewWindowDefUPP(wxShapedMacWindowDef
); 
1311         err 
= ::CreateCustomWindow( &customWindowDefSpec
, wclass
, 
1312                               attr
, &theBoundsRect
, 
1313                               (WindowRef
*) &m_macWindow
); 
1317         err 
= ::CreateNewWindow( wclass 
, attr 
, &theBoundsRect 
, (WindowRef
*)&m_macWindow 
) ; 
1320     if ( err 
== noErr 
&& m_macWindow 
!= NULL 
&& group 
!= NULL 
) 
1321         SetWindowGroup( (WindowRef
) m_macWindow 
, group 
) ; 
1323     wxCHECK_RET( err 
== noErr
, wxT("Mac OS error when trying to create new window") ); 
1325     // setup a separate group for each window, so that overlays can be handled easily 
1327     WindowGroupRef overlaygroup 
= NULL
; 
1328     verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether 
| kWindowGroupAttrLayerTogether 
| kWindowGroupAttrHideOnCollapse
, &overlaygroup 
)); 
1329     verify_noerr( SetWindowGroupParent( overlaygroup
, GetWindowGroup( (WindowRef
) m_macWindow 
))); 
1330     verify_noerr( SetWindowGroup( (WindowRef
) m_macWindow 
, overlaygroup 
)); 
1332     if ( activationScopeSet 
) 
1334         verify_noerr( SetWindowActivationScope( (WindowRef
) m_macWindow 
, activationScope 
)); 
1337     // the create commands are only for content rect, 
1338     // so we have to set the size again as structure bounds 
1339     SetWindowBounds( m_macWindow 
, kWindowStructureRgn 
, &theBoundsRect 
) ; 
1341     // Causes the inner part of the window not to be metal 
1342     // if the style is used before window creation. 
1343 #if 0 // TARGET_API_MAC_OSX 
1344     if ( m_macUsesCompositing 
&& m_macWindow 
!= NULL 
) 
1346         if ( GetExtraStyle() & wxFRAME_EX_METAL 
) 
1347             MacSetMetalAppearance( true ) ; 
1351     if ( m_macWindow 
!= NULL 
) 
1353         MacSetUnifiedAppearance( true ) ; 
1356     HIViewRef growBoxRef 
= 0 ; 
1357     err 
= HIViewFindByID( HIViewGetRoot( m_macWindow 
), kHIViewWindowGrowBoxID
, &growBoxRef  
); 
1358     if ( err 
== noErr 
&& growBoxRef 
!= 0 ) 
1359         HIGrowBoxViewSetTransparent( growBoxRef
, true ) ; 
1361     // the frame window event handler 
1362     InstallStandardEventHandler( GetWindowEventTarget(m_macWindow
) ) ; 
1363     MacInstallTopLevelWindowEventHandler() ; 
1365     if ( extraStyle 
& wxFRAME_EX_METAL
) 
1366         MacSetMetalAppearance(true); 
1368     if ( ( style 
&wxFRAME_SHAPED
) ) 
1370         // default shape matches the window size 
1371         wxRegion 
rgn( 0, 0, w
, h 
); 
1376 bool wxNonOwnedWindowCarbonImpl::ShowWithEffect(bool show
, 
1377                                          wxShowEffect effect
, 
1380     WindowTransitionEffect transition 
= 0 ; 
1383         case wxSHOW_EFFECT_ROLL_TO_LEFT
: 
1384         case wxSHOW_EFFECT_ROLL_TO_RIGHT
: 
1385         case wxSHOW_EFFECT_ROLL_TO_TOP
: 
1386         case wxSHOW_EFFECT_ROLL_TO_BOTTOM
: 
1387         case wxSHOW_EFFECT_SLIDE_TO_LEFT
: 
1388         case wxSHOW_EFFECT_SLIDE_TO_RIGHT
: 
1389         case wxSHOW_EFFECT_SLIDE_TO_TOP
: 
1390         case wxSHOW_EFFECT_SLIDE_TO_BOTTOM
: 
1391             transition 
= kWindowGenieTransitionEffect
; 
1393         case wxSHOW_EFFECT_BLEND
: 
1394             transition 
= kWindowFadeTransitionEffect
; 
1396         case wxSHOW_EFFECT_EXPAND
: 
1397             // having sheets would be fine, but this might lead to a repositioning 
1400                 transition 
= kWindowSheetTransitionEffect
; 
1403                 transition 
= kWindowZoomTransitionEffect
; 
1406         case wxSHOW_EFFECT_MAX
: 
1407             wxFAIL_MSG( "invalid effect flag" ); 
1411     TransitionWindowOptions options
; 
1412     options
.version 
= 0; 
1413     options
.duration 
= timeout 
/ 1000.0; 
1414     options
.window 
= transition 
== kWindowSheetTransitionEffect 
? (WindowRef
) m_wxPeer
->GetParent()->MacGetTopLevelWindowRef() :0; 
1415     options
.userData 
= 0; 
1417     wxSize size 
= wxGetDisplaySize(); 
1419     GetWindowBounds( (WindowRef
)m_macWindow
, kWindowStructureRgn
, &bounds 
); 
1420     CGRect hiBounds 
= CGRectMake( bounds
.left
, bounds
.top
, bounds
.right 
- bounds
.left
, bounds
.bottom 
- bounds
.top 
); 
1424         case wxSHOW_EFFECT_ROLL_TO_RIGHT
: 
1425         case wxSHOW_EFFECT_SLIDE_TO_RIGHT
: 
1426             hiBounds
.origin
.x 
= 0; 
1427             hiBounds
.size
.width 
= 0; 
1430         case wxSHOW_EFFECT_ROLL_TO_LEFT
: 
1431         case wxSHOW_EFFECT_SLIDE_TO_LEFT
: 
1432             hiBounds
.origin
.x 
= size
.x
; 
1433             hiBounds
.size
.width 
= 0; 
1436         case wxSHOW_EFFECT_ROLL_TO_TOP
: 
1437         case wxSHOW_EFFECT_SLIDE_TO_TOP
: 
1438             hiBounds
.origin
.y 
= size
.y
; 
1439             hiBounds
.size
.height 
= 0; 
1442         case wxSHOW_EFFECT_ROLL_TO_BOTTOM
: 
1443         case wxSHOW_EFFECT_SLIDE_TO_BOTTOM
: 
1444             hiBounds
.origin
.y 
= 0; 
1445             hiBounds
.size
.height 
= 0; 
1449             break; // direction doesn't make sense 
1452     ::TransitionWindowWithOptions
 
1454         (WindowRef
)m_macWindow
, 
1456         show 
? kWindowShowTransitionAction 
: kWindowHideTransitionAction
, 
1457         transition 
== kWindowGenieTransitionEffect 
? &hiBounds 
: NULL
, 
1464         ::SelectWindow( (WindowRef
)m_macWindow 
) ; 
1470 void wxNonOwnedWindowCarbonImpl::SetTitle( const wxString
& title
, wxFontEncoding encoding 
)  
1472     SetWindowTitleWithCFString( m_macWindow 
, wxCFStringRef( title 
, encoding 
) ) ; 
1475 bool wxNonOwnedWindowCarbonImpl::IsMaximized() const 
1477     return IsWindowInStandardState( m_macWindow 
, NULL 
, NULL 
) ; 
1480 bool wxNonOwnedWindowCarbonImpl::IsIconized() const 
1482     return IsWindowCollapsed((WindowRef
)GetWXWindow() ) ; 
1485 void wxNonOwnedWindowCarbonImpl::Iconize( bool iconize 
) 
1487     if ( IsWindowCollapsable( m_macWindow 
) ) 
1488         CollapseWindow( m_macWindow 
, iconize 
) ; 
1491 void wxNonOwnedWindowCarbonImpl::Maximize(bool maximize
) 
1493     Point idealSize 
= { 0 , 0 } ; 
1496 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 
1498         HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
, 
1500         idealSize
.h 
= bounds
.size
.width
; 
1501         idealSize
.v 
= bounds
.size
.height
; 
1504         GetAvailableWindowPositioningBounds(GetMainDevice(),&rect
) ; 
1505         idealSize
.h 
= rect
.right 
- rect
.left 
; 
1506         idealSize
.v 
= rect
.bottom 
- rect
.top 
; 
1509     ZoomWindowIdeal( (WindowRef
)GetWXWindow() , maximize 
? inZoomOut 
: inZoomIn 
, &idealSize 
) ; 
1512 bool wxNonOwnedWindowCarbonImpl::IsFullScreen() const 
1514     return m_macFullScreenData 
!= NULL 
; 
1517 bool wxNonOwnedWindowCarbonImpl::ShowFullScreen(bool show
, long style
) 
1521         FullScreenData 
*data 
= (FullScreenData 
*)m_macFullScreenData 
; 
1523         data 
= new FullScreenData() ; 
1525         m_macFullScreenData 
= data 
; 
1526         data
->m_position 
= m_wxPeer
->GetPosition() ; 
1527         data
->m_size 
= m_wxPeer
->GetSize() ; 
1528 #if wxOSX_USE_CARBON 
1529         WindowAttributes attr 
= 0; 
1530         GetWindowAttributes((WindowRef
) GetWXWindow(), &attr
); 
1531         data
->m_wasResizable 
= attr 
& kWindowResizableAttribute
; 
1532         if ( style 
& wxFULLSCREEN_NOMENUBAR 
) 
1536         wxRect client 
= wxGetClientDisplayRect() ; 
1538         int left 
, top 
, right 
, bottom 
; 
1546         GetContentArea( left 
, top 
, right 
, bottom 
) ; 
1548         if ( style 
& wxFULLSCREEN_NOCAPTION 
) 
1554         if ( style 
& wxFULLSCREEN_NOBORDER 
) 
1561         if ( style 
& wxFULLSCREEN_NOTOOLBAR 
) 
1566         if ( style 
& wxFULLSCREEN_NOSTATUSBAR 
) 
1571         m_wxPeer
->SetSize( x 
, y 
, w
, h 
) ; 
1572         if ( data
->m_wasResizable 
) 
1574 #if wxOSX_USE_CARBON 
1575             ChangeWindowAttributes( (WindowRef
) GetWXWindow() , kWindowNoAttributes 
, kWindowResizableAttribute 
) ; 
1579     else if ( m_macFullScreenData 
!= NULL 
) 
1581         FullScreenData 
*data 
= (FullScreenData 
*) m_macFullScreenData 
; 
1582 #if wxOSX_USE_CARBON 
1584         if ( data
->m_wasResizable 
) 
1585             ChangeWindowAttributes( (WindowRef
) GetWXWindow() , kWindowResizableAttribute 
,  kWindowNoAttributes 
) ; 
1587         m_wxPeer
->SetPosition( data
->m_position 
) ; 
1588         m_wxPeer
->SetSize( data
->m_size 
) ; 
1591         m_macFullScreenData 
= NULL 
; 
1597 // Attracts the users attention to this window if the application is 
1598 // inactive (should be called when a background event occurs) 
1600 static pascal void wxMacNMResponse( NMRecPtr ptr 
) 
1603     DisposePtr( (Ptr
)ptr 
) ; 
1606 void wxNonOwnedWindowCarbonImpl::RequestUserAttention(int WXUNUSED(flags
)) 
1608     NMRecPtr notificationRequest 
= (NMRecPtr
) NewPtr( sizeof( NMRec
) ) ; 
1610     memset( notificationRequest 
, 0 , sizeof(*notificationRequest
) ) ; 
1611     notificationRequest
->qType 
= nmType 
; 
1612     notificationRequest
->nmMark 
= 1 ; 
1613     notificationRequest
->nmIcon 
= 0 ; 
1614     notificationRequest
->nmSound 
= 0 ; 
1615     notificationRequest
->nmStr 
= NULL 
; 
1616     notificationRequest
->nmResp 
= wxMacNMResponse 
; 
1618     verify_noerr( NMInstall( notificationRequest 
) ) ; 
1621 void wxNonOwnedWindowCarbonImpl::ScreenToWindow( int *x
, int *y 
) 
1623     HIPoint p 
= CGPointMake(  (x 
? *x 
: 0), (y 
? *y 
: 0) ); 
1624     HIViewRef contentView 
; 
1625     // TODO check toolbar offset 
1626     HIViewFindByID( HIViewGetRoot( m_macWindow 
), kHIViewWindowContentID 
, &contentView
) ; 
1627     HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView 
); 
1634 void wxNonOwnedWindowCarbonImpl::WindowToScreen( int *x
, int *y 
) 
1636     HIPoint p 
= CGPointMake(  (x 
? *x 
: 0), (y 
? *y 
: 0) ); 
1637     HIViewRef contentView 
; 
1638     // TODO check toolbar offset 
1639     HIViewFindByID( HIViewGetRoot( m_macWindow 
), kHIViewWindowContentID 
, &contentView
) ; 
1640     HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL 
); 
1647 wxNonOwnedWindowImpl
* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow
* wxpeer
, wxWindow
* parent
, const wxPoint
& pos
, const wxSize
& size
, 
1648     long style
, long extraStyle
, const wxString
& name 
) 
1650     wxNonOwnedWindowImpl
* now 
= new wxNonOwnedWindowCarbonImpl( wxpeer 
); 
1651     now
->Create( parent
, pos
, size
, style 
, extraStyle
, name 
);