+ DisposeWindow( (WindowRef) m_macWindow ) ;
+}
+
+bool wxTopLevelWindowMac::Create(wxWindow *parent,
+ wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
+{
+ // init our fields
+ Init();
+
+ m_windowStyle = style;
+
+ SetName( name );
+
+ m_windowId = id == -1 ? NewControlId() : id;
+ wxWindow::SetLabel( title ) ;
+
+ DoMacCreateRealWindow( parent, title, pos , size , style , name ) ;
+
+ SetBackgroundColour(wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE ));
+
+ if (GetExtraStyle() & wxFRAME_EX_METAL)
+ MacSetMetalAppearance(true);
+
+ wxTopLevelWindows.Append(this);
+
+ if ( parent )
+ parent->AddChild(this);
+
+ return true;
+}
+
+wxTopLevelWindowMac::~wxTopLevelWindowMac()
+{
+ if ( m_macWindow )
+ {
+#if wxUSE_TOOLTIPS
+ wxToolTip::NotifyWindowDelete(m_macWindow) ;
+#endif
+ wxPendingDelete.Append( new wxMacDeferredWindowDeleter( (WindowRef) m_macWindow ) ) ;
+ }
+
+ if ( m_macEventHandler )
+ {
+ ::RemoveEventHandler((EventHandlerRef) m_macEventHandler);
+ m_macEventHandler = NULL ;
+ }
+
+ wxRemoveMacWindowAssociation( this ) ;
+
+ if ( wxModelessWindows.Find(this) )
+ wxModelessWindows.DeleteObject(this);
+
+ FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
+ delete data ;
+ m_macFullScreenData = NULL ;
+
+ // avoid dangling refs
+ if ( s_macDeactivateWindow == this )
+ s_macDeactivateWindow = NULL;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxTopLevelWindowMac maximize/minimize
+// ----------------------------------------------------------------------------
+
+void wxTopLevelWindowMac::Maximize(bool maximize)
+{
+ Point idealSize = { 0 , 0 } ;
+ if ( maximize )
+ {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+ HIRect bounds ;
+ HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
+ &bounds);
+ idealSize.h = bounds.size.width;
+ idealSize.v = bounds.size.height;
+#else
+ Rect rect ;
+ GetAvailableWindowPositioningBounds(GetMainDevice(),&rect) ;
+ idealSize.h = rect.right - rect.left ;
+ idealSize.v = rect.bottom - rect.top ;
+#endif
+ }
+ ZoomWindowIdeal( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , &idealSize ) ;
+}
+
+bool wxTopLevelWindowMac::IsMaximized() const
+{
+ return IsWindowInStandardState( (WindowRef)m_macWindow , NULL , NULL ) ;
+}
+
+void wxTopLevelWindowMac::Iconize(bool iconize)
+{
+ if ( IsWindowCollapsable( (WindowRef)m_macWindow) )
+ CollapseWindow( (WindowRef)m_macWindow , iconize ) ;
+}
+
+bool wxTopLevelWindowMac::IsIconized() const
+{
+ return IsWindowCollapsed((WindowRef)m_macWindow ) ;
+}
+
+void wxTopLevelWindowMac::Restore()
+{
+ if ( IsMaximized() )
+ Maximize(false);
+ else if ( IsIconized() )
+ Iconize(false);
+}
+
+// ----------------------------------------------------------------------------
+// wxTopLevelWindowMac misc
+// ----------------------------------------------------------------------------
+
+wxPoint wxTopLevelWindowMac::GetClientAreaOrigin() const
+{
+ return wxPoint(0, 0) ;
+}
+
+bool wxTopLevelWindowMac::SetBackgroundColour(const wxColour& col )
+{
+ if ( !wxTopLevelWindowBase::SetBackgroundColour(col) && m_hasBgCol )
+ return false ;
+
+ if ( col == wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) || col == wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDocumentWindowBackground)) )
+ {
+ SetThemeWindowBackground( (WindowRef) m_macWindow, kThemeBrushDocumentWindowBackground, false ) ;
+ SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+ }
+ else if ( col == wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE ) || col == wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDialogBackgroundActive)) )
+ {
+ SetThemeWindowBackground( (WindowRef) m_macWindow, kThemeBrushDialogBackgroundActive, false ) ;
+ SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+ }
+ return true;
+}
+
+void wxTopLevelWindowMacInstallTopLevelWindowEventHandler(WindowRef window, EventHandlerRef* handler, void *ref)
+{
+ InstallWindowEventHandler(window, GetwxMacTopLevelEventHandlerUPP(),
+ GetEventTypeCount(eventList), eventList, ref, handler );
+}
+
+void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
+{
+ if ( m_macEventHandler != NULL )
+ {
+ verify_noerr( ::RemoveEventHandler( (EventHandlerRef) m_macEventHandler ) ) ;
+ }
+ wxTopLevelWindowMacInstallTopLevelWindowEventHandler(MAC_WXHWND(m_macWindow),(EventHandlerRef *)&m_macEventHandler,this);
+}
+
+void wxTopLevelWindowMac::MacCreateRealWindow(
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name )
+{
+ DoMacCreateRealWindow( NULL, title, pos, size, style, name );
+}
+
+void wxTopLevelWindowMac::DoMacCreateRealWindow(
+ wxWindow* parent,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name )
+{
+ OSStatus err = noErr ;
+ SetName(name);
+ m_windowStyle = style;
+ m_isShown = false;
+
+ // create frame.
+ int x = (int)pos.x;
+ int y = (int)pos.y;
+
+ Rect theBoundsRect;
+ wxRect display = wxGetClientDisplayRect() ;
+
+ if ( x == wxDefaultPosition.x )
+ x = display.x ;
+
+ if ( y == wxDefaultPosition.y )
+ y = display.y ;
+
+ int w = WidthDefault(size.x);
+ int h = HeightDefault(size.y);
+
+ ::SetRect(&theBoundsRect, x, y , x + w, y + h);
+
+ // translate the window attributes in the appropriate window class and attributes
+ WindowClass wclass = 0;
+ WindowAttributes attr = kWindowNoAttributes ;
+ WindowGroupRef group = NULL ;
+ bool activationScopeSet = false;
+ WindowActivationScope activationScope = kWindowActivationScopeNone;
+
+ if ( HasFlag( wxFRAME_TOOL_WINDOW) )
+ {
+ if (
+ HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
+ HasFlag( wxSYSTEM_MENU ) || HasFlag( wxCAPTION ) ||
+ HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT)
+ )
+ {
+ if ( HasFlag( wxSTAY_ON_TOP ) )
+ wclass = kUtilityWindowClass;
+ else
+ wclass = kFloatingWindowClass ;
+
+ if ( HasFlag(wxTINY_CAPTION_VERT) )
+ attr |= kWindowSideTitlebarAttribute ;
+ }
+ else
+ {
+ wclass = kPlainWindowClass ;
+ activationScopeSet = true;
+ activationScope = kWindowActivationScopeNone;
+ }
+ }
+ else if ( HasFlag( wxPOPUP_WINDOW ) )
+ {
+ // TEMPORARY HACK!
+ // Until we've got a real wxPopupWindow class on wxMac make it a
+ // little easier for wxFrame to be used to emulate it and workaround
+ // the lack of wxPopupWindow.
+ if ( HasFlag( wxBORDER_NONE ) )
+ wclass = kHelpWindowClass ; // has no border
+ else
+ wclass = kPlainWindowClass ; // has a single line border, it will have to do for now
+ //attr |= kWindowNoShadowAttribute; // turn off the shadow Should we??
+ group = GetWindowGroupOfClass( // float above other windows
+ kFloatingWindowClass) ;
+ }
+ else if ( HasFlag( wxCAPTION ) )
+ {
+ wclass = kDocumentWindowClass ;
+ attr |= kWindowInWindowMenuAttribute ;
+ }
+ else if ( HasFlag( wxFRAME_DRAWER ) )
+ {
+ wclass = kDrawerWindowClass;
+ }
+ else
+ {
+ if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
+ HasFlag( wxCLOSE_BOX ) || HasFlag( wxSYSTEM_MENU ) )
+ {
+ wclass = kDocumentWindowClass ;
+ }
+ else if ( HasFlag( wxNO_BORDER ) )
+ {
+ wclass = kSimpleWindowClass ;
+ }
+ else
+ {
+ wclass = kPlainWindowClass ;
+ }
+ }
+
+ if ( wclass != kPlainWindowClass )
+ {
+ if ( HasFlag( wxMINIMIZE_BOX ) )
+ attr |= kWindowCollapseBoxAttribute ;
+
+ if ( HasFlag( wxMAXIMIZE_BOX ) )
+ attr |= kWindowFullZoomAttribute ;
+
+ if ( HasFlag( wxRESIZE_BORDER ) )
+ attr |= kWindowResizableAttribute ;
+
+ if ( HasFlag( wxCLOSE_BOX) )
+ attr |= kWindowCloseBoxAttribute ;
+ }
+ attr |= kWindowLiveResizeAttribute;
+
+ if ( HasFlag(wxSTAY_ON_TOP) )
+ group = GetWindowGroupOfClass(kUtilityWindowClass) ;
+
+ if ( HasFlag( wxFRAME_FLOAT_ON_PARENT ) )
+ group = GetWindowGroupOfClass(kFloatingWindowClass) ;
+
+ if ( group == NULL && parent != NULL )
+ {
+ WindowRef parenttlw = (WindowRef) parent->MacGetTopLevelWindowRef();
+ if( parenttlw )
+ group = GetWindowGroupParent( GetWindowGroup( parenttlw ) );
+ }
+
+ attr |= kWindowCompositingAttribute;
+#if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale)
+ attr |= kWindowFrameworkScaledAttribute;
+#endif
+
+ if ( HasFlag(wxFRAME_SHAPED) )
+ {
+ WindowDefSpec customWindowDefSpec;
+ customWindowDefSpec.defType = kWindowDefProcPtr;
+ customWindowDefSpec.u.defProc =
+#ifdef __LP64__
+ (WindowDefUPP) wxShapedMacWindowDef;
+#else
+ NewWindowDefUPP(wxShapedMacWindowDef);
+#endif
+ err = ::CreateCustomWindow( &customWindowDefSpec, wclass,
+ attr, &theBoundsRect,
+ (WindowRef*) &m_macWindow);
+ }
+ else
+ {
+ err = ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ;
+ }
+
+ if ( err == noErr && m_macWindow != NULL && group != NULL )
+ SetWindowGroup( (WindowRef) m_macWindow , group ) ;
+
+ wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
+
+ // setup a separate group for each window, so that overlays can be handled easily
+
+ WindowGroupRef overlaygroup = NULL;
+ verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &overlaygroup ));
+ verify_noerr( SetWindowGroupParent( overlaygroup, GetWindowGroup( (WindowRef) m_macWindow )));
+ verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , overlaygroup ));
+
+ if ( activationScopeSet )
+ {
+ verify_noerr( SetWindowActivationScope( (WindowRef) m_macWindow , activationScope ));
+ }
+
+ // the create commands are only for content rect,
+ // so we have to set the size again as structure bounds
+ SetWindowBounds( (WindowRef) m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
+
+ wxAssociateWinWithMacWindow( (WindowRef) m_macWindow , this ) ;
+ SetWindowTitleWithCFString( (WindowRef) m_macWindow , wxCFStringRef( title , GetFont().GetEncoding() ) );
+ m_peer = new wxMacControl(this , true /*isRootControl*/) ;
+
+ // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of
+ // the content view, so we have to retrieve it explicitly
+ HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID ,
+ m_peer->GetControlRefAddr() ) ;
+ if ( !m_peer->Ok() )
+ {
+ // compatibility mode fallback
+ GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ;
+ }
+
+ // the root control level handler
+ MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ) ;
+
+ // Causes the inner part of the window not to be metal
+ // if the style is used before window creation.
+#if 0 // TARGET_API_MAC_OSX
+ if ( m_macUsesCompositing && m_macWindow != NULL )
+ {
+ if ( GetExtraStyle() & wxFRAME_EX_METAL )
+ MacSetMetalAppearance( true ) ;
+ }
+#endif
+
+ if ( m_macWindow != NULL )
+ {
+ MacSetUnifiedAppearance( true ) ;
+ }
+
+ HIViewRef growBoxRef = 0 ;
+ err = HIViewFindByID( HIViewGetRoot( (WindowRef)m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef );
+ if ( err == noErr && growBoxRef != 0 )
+ HIGrowBoxViewSetTransparent( growBoxRef, true ) ;
+
+ // the frame window event handler
+ InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
+ MacInstallTopLevelWindowEventHandler() ;
+
+ DoSetWindowVariant( m_windowVariant ) ;
+
+ m_macFocus = NULL ;
+
+ if ( HasFlag(wxFRAME_SHAPED) )
+ {
+ // default shape matches the window size
+ wxRegion rgn( 0, 0, w, h );
+ SetShape( rgn );
+ }
+
+ wxWindowCreateEvent event(this);
+ HandleWindowEvent(event);
+}
+
+void wxTopLevelWindowMac::ClearBackground()
+{
+ wxWindow::ClearBackground() ;
+}
+
+// Raise the window to the top of the Z order
+void wxTopLevelWindowMac::Raise()
+{
+ ::SelectWindow( (WindowRef)m_macWindow ) ;
+}
+
+// Lower the window to the bottom of the Z order
+void wxTopLevelWindowMac::Lower()
+{
+ ::SendBehind( (WindowRef)m_macWindow , NULL ) ;
+}
+
+void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp)
+{
+ if (s_macDeactivateWindow)
+ {
+ wxLogTrace(TRACE_ACTIVATE,
+ wxT("Doing delayed deactivation of %p"),
+ s_macDeactivateWindow);
+
+ s_macDeactivateWindow->MacActivate(timestamp, false);
+ }
+}
+
+void wxTopLevelWindowMac::MacActivate( long timestamp , bool WXUNUSED(inIsActivating) )
+{
+ wxLogTrace(TRACE_ACTIVATE, wxT("TopLevel=%p::MacActivate"), this);
+
+ if (s_macDeactivateWindow == this)
+ s_macDeactivateWindow = NULL;
+
+ MacDelayedDeactivation(timestamp);
+}
+
+void wxTopLevelWindowMac::SetTitle(const wxString& title)
+{
+ wxWindow::SetLabel( title ) ;
+ SetWindowTitleWithCFString( (WindowRef) m_macWindow , wxCFStringRef( title , GetFont().GetEncoding() ) ) ;
+}
+
+wxString wxTopLevelWindowMac::GetTitle() const
+{
+ return wxWindow::GetLabel();
+}
+
+bool wxTopLevelWindowMac::Show(bool show)
+{
+ if ( !wxTopLevelWindowBase::Show(show) )
+ return false;
+
+ bool plainTransition = true;
+
+#if wxUSE_SYSTEM_OPTIONS
+ if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
+ plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
+#endif
+
+ if (show)
+ {
+ if ( plainTransition )
+ ::ShowWindow( (WindowRef)m_macWindow );
+ else
+ ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL );
+
+ ::SelectWindow( (WindowRef)m_macWindow ) ;
+
+ // because apps expect a size event to occur at this moment
+ wxSizeEvent event(GetSize() , m_windowId);
+ event.SetEventObject(this);
+ HandleWindowEvent(event);
+ }
+ else
+ {
+ if ( plainTransition )
+ ::HideWindow( (WindowRef)m_macWindow );
+ else
+ ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
+ }
+
+ return true ;
+}
+
+bool wxTopLevelWindowMac::ShowWithEffect(wxShowEffect effect,
+ unsigned timeout,
+ wxDirection dir)
+{
+ // TODO factor common code
+ if ( !wxTopLevelWindowBase::Show(true) )
+ return false;
+
+ WindowTransitionEffect transition = 0 ;
+ switch( effect )
+ {
+ case wxSHOW_EFFECT_ROLL :
+ case wxSHOW_EFFECT_SLIDE :
+ transition = kWindowGenieTransitionEffect;
+ break;
+ case wxSHOW_EFFECT_BLEND :
+ transition = kWindowFadeTransitionEffect;
+ break;
+ case wxSHOW_EFFECT_EXPAND :
+ default :
+ // having sheets would be fine, but this might lead to a repositioning
+#if 0
+ if ( GetParent() )
+ transition = kWindowSheetTransitionEffect;
+ else
+#endif
+ transition = kWindowZoomTransitionEffect;
+ break;
+ }
+
+ TransitionWindowOptions options;
+ options.version = 0;
+ options.duration = timeout / 1000.0;
+ options.window = transition == kWindowSheetTransitionEffect ? (WindowRef) GetParent()->MacGetTopLevelWindowRef() :0;
+ options.userData = 0;
+
+ wxSize size = wxGetDisplaySize();
+ Rect bounds;
+ GetWindowBounds( (WindowRef)m_macWindow, kWindowStructureRgn, &bounds );
+ CGRect hiBounds = CGRectMake( bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top );
+
+ if ( dir & wxRIGHT )
+ {
+ hiBounds.origin.x = size.x;
+ hiBounds.size.width = 0;
+ }
+ if ( dir & wxUP )
+ {
+ hiBounds.origin.y = 0;
+ hiBounds.size.height = 0;
+ }
+ if ( dir & wxDOWN )
+ {
+ hiBounds.origin.y = size.y;
+ hiBounds.size.height = 0;
+ }
+ if ( dir & wxLEFT )
+ {
+ hiBounds.origin.x = 0;
+ hiBounds.size.width = 0;
+ }
+
+ ::TransitionWindowWithOptions( (WindowRef)m_macWindow, transition, kWindowShowTransitionAction, transition == kWindowGenieTransitionEffect ? &hiBounds : NULL ,
+ false, &options );
+
+ ::SelectWindow( (WindowRef)m_macWindow ) ;
+
+ // because apps expect a size event to occur at this moment
+ wxSizeEvent event(GetSize() , m_windowId);
+ event.SetEventObject(this);
+ HandleWindowEvent(event);
+
+ return true;
+}
+
+bool wxTopLevelWindowMac::HideWithEffect(wxShowEffect effect,
+ unsigned timeout ,
+ wxDirection dir )
+{
+ if ( !wxTopLevelWindowBase::Show(false) )
+ return false;
+
+ WindowTransitionEffect transition = 0 ;
+ switch( effect )
+ {
+ case wxSHOW_EFFECT_ROLL :
+ case wxSHOW_EFFECT_SLIDE :
+ transition = kWindowGenieTransitionEffect;
+ break;
+ case wxSHOW_EFFECT_BLEND :
+ transition = kWindowFadeTransitionEffect;
+ break;
+ case wxSHOW_EFFECT_EXPAND :
+ default:
+#if 0
+ if ( GetParent() )
+ transition = kWindowSheetTransitionEffect;
+ else
+#endif
+ transition = kWindowZoomTransitionEffect;
+ break;
+ }
+ TransitionWindowOptions options;
+ options.version = 0;
+ options.duration = timeout / 1000.0;
+ options.window = transition == kWindowSheetTransitionEffect ? (WindowRef) GetParent()->MacGetTopLevelWindowRef() :0;
+ options.userData = 0;
+
+ wxSize size = wxGetDisplaySize();
+ Rect bounds;
+ GetWindowBounds( (WindowRef)m_macWindow, kWindowStructureRgn, &bounds );
+ CGRect hiBounds = CGRectMake( bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top );
+
+ if ( dir & wxRIGHT )
+ {
+ hiBounds.origin.x = size.x;
+ hiBounds.size.width = 0;
+ }
+ if ( dir & wxUP )
+ {
+ hiBounds.origin.y = 0;
+ hiBounds.size.height = 0;
+ }
+ if ( dir & wxDOWN )
+ {
+ hiBounds.origin.y = size.y;
+ hiBounds.size.height = 0;
+ }
+ if ( dir & wxLEFT )
+ {
+ hiBounds.origin.x = 0;
+ hiBounds.size.width = 0;
+ }
+ ::TransitionWindowWithOptions( (WindowRef)m_macWindow, transition, kWindowHideTransitionAction, transition == kWindowGenieTransitionEffect ? &hiBounds : NULL ,
+ false, &options );
+
+ return true;
+}
+
+bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style)
+{
+ if ( show )
+ {
+ FullScreenData *data = (FullScreenData *)m_macFullScreenData ;
+ delete data ;
+ data = new FullScreenData() ;
+
+ m_macFullScreenData = data ;
+ data->m_position = GetPosition() ;
+ data->m_size = GetSize() ;
+ data->m_wasResizable = MacGetWindowAttributes() & kWindowResizableAttribute ;
+
+ if ( style & wxFULLSCREEN_NOMENUBAR )
+ HideMenuBar() ;
+
+ wxRect client = wxGetClientDisplayRect() ;
+
+ int left , top , right , bottom ;
+ int x, y, w, h ;
+
+ x = client.x ;
+ y = client.y ;
+ w = client.width ;
+ h = client.height ;
+
+ MacGetContentAreaInset( left , top , right , bottom ) ;
+
+ if ( style & wxFULLSCREEN_NOCAPTION )
+ {
+ y -= top ;
+ h += top ;
+ }
+
+ if ( style & wxFULLSCREEN_NOBORDER )
+ {
+ x -= left ;
+ w += left + right ;
+ h += bottom ;
+ }
+
+ if ( style & wxFULLSCREEN_NOTOOLBAR )
+ {
+ // TODO
+ }
+
+ if ( style & wxFULLSCREEN_NOSTATUSBAR )
+ {
+ // TODO
+ }
+
+ SetSize( x , y , w, h ) ;
+ if ( data->m_wasResizable )
+ MacChangeWindowAttributes( kWindowNoAttributes , kWindowResizableAttribute ) ;
+ }
+ else
+ {
+ ShowMenuBar() ;
+ FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
+ if ( data->m_wasResizable )
+ MacChangeWindowAttributes( kWindowResizableAttribute , kWindowNoAttributes ) ;
+ SetPosition( data->m_position ) ;
+ SetSize( data->m_size ) ;
+
+ delete data ;
+ m_macFullScreenData = NULL ;
+ }
+
+ return false;
+}
+
+bool wxTopLevelWindowMac::IsFullScreen() const
+{
+ return m_macFullScreenData != NULL ;
+}
+
+
+bool wxTopLevelWindowMac::SetTransparent(wxByte alpha)
+{
+ OSStatus result = SetWindowAlpha((WindowRef)m_macWindow, float(alpha)/255.0);
+ return result == noErr;
+}
+
+
+bool wxTopLevelWindowMac::CanSetTransparent()
+{
+ return true;
+}
+
+
+void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
+{
+ if ( GetExtraStyle() == exStyle )
+ return ;
+
+ wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;
+
+ if ( m_macWindow != NULL )
+ {
+ bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;
+
+ if ( MacGetMetalAppearance() != metal )
+ {
+ if ( MacGetUnifiedAppearance() )
+ MacSetUnifiedAppearance( !metal ) ;
+
+ MacSetMetalAppearance( metal ) ;
+ }
+ }
+}
+
+bool wxTopLevelWindowMac::SetBackgroundStyle(wxBackgroundStyle style)
+{
+ if ( !wxTopLevelWindowBase::SetBackgroundStyle(style) )
+ return false ;
+
+ WindowRef windowRef = HIViewGetWindow( (HIViewRef)GetHandle() );
+
+ if ( GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
+ {
+ OSStatus err = HIWindowChangeFeatures( windowRef, 0, kWindowIsOpaque );
+ verify_noerr( err );
+ err = ReshapeCustomWindow( windowRef );
+ verify_noerr( err );
+ }
+
+ return true ;
+}
+
+// TODO: switch to structure bounds -
+// we are still using coordinates of the content view
+//
+void wxTopLevelWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom )
+{
+ Rect content, structure ;
+
+ GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;
+ GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;
+
+ left = content.left - structure.left ;
+ top = content.top - structure.top ;
+ right = structure.right - content.right ;
+ bottom = structure.bottom - content.bottom ;
+}
+
+void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height)
+{
+ m_cachedClippedRectValid = false ;
+ Rect bounds = { y , x , y + height , x + width } ;
+ verify_noerr(SetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;
+ wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
+}
+
+void wxTopLevelWindowMac::DoGetPosition( int *x, int *y ) const
+{
+ Rect bounds ;
+
+ verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;
+
+ if (x)
+ *x = bounds.left ;
+ if (y)
+ *y = bounds.top ;
+}
+
+void wxTopLevelWindowMac::DoGetSize( int *width, int *height ) const
+{
+ Rect bounds ;
+
+ verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;
+
+ if (width)
+ *width = bounds.right - bounds.left ;
+ if (height)
+ *height = bounds.bottom - bounds.top ;
+}
+
+void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const
+{
+ Rect bounds ;
+
+ verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowContentRgn , &bounds )) ;
+
+ if (width)
+ *width = bounds.right - bounds.left ;
+ if (height)
+ *height = bounds.bottom - bounds.top ;
+}
+
+void wxTopLevelWindowMac::DoCentre(int dir)
+{
+ if ( m_macWindow != 0 )
+ wxTopLevelWindowBase::DoCentre(dir);
+}
+
+void wxTopLevelWindowMac::MacSetMetalAppearance( bool set )
+{
+ if ( MacGetUnifiedAppearance() )
+ MacSetUnifiedAppearance( false ) ;
+
+ MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,
+ set ? kWindowNoAttributes : kWindowMetalAttribute ) ;
+}
+
+bool wxTopLevelWindowMac::MacGetMetalAppearance() const
+{
+ return MacGetWindowAttributes() & kWindowMetalAttribute ;
+}
+
+void wxTopLevelWindowMac::MacSetUnifiedAppearance( bool set )
+{
+ if ( MacGetMetalAppearance() )
+ MacSetMetalAppearance( false ) ;
+
+ MacChangeWindowAttributes( set ? kWindowUnifiedTitleAndToolbarAttribute : kWindowNoAttributes ,
+ set ? kWindowNoAttributes : kWindowUnifiedTitleAndToolbarAttribute) ;
+
+ // For some reason, Tiger uses white as the background color for this appearance,
+ // while most apps using it use the typical striped background. Restore that behavior
+ // for wx.
+ // TODO: Determine if we need this on Leopard as well. (should be harmless either way,
+ // though)
+ SetBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW) ) ;
+}
+
+bool wxTopLevelWindowMac::MacGetUnifiedAppearance() const
+{
+ return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ;
+}
+
+void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )
+{
+ ChangeWindowAttributes( (WindowRef)m_macWindow, attributesToSet, attributesToClear ) ;
+}
+
+wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const
+{
+ UInt32 attr = 0 ;
+ GetWindowAttributes( (WindowRef) m_macWindow, &attr ) ;
+
+ return attr ;
+}
+
+void wxTopLevelWindowMac::MacPerformUpdates()
+{
+ // for composited windows this also triggers a redraw of all
+ // invalid views in the window
+ HIWindowFlush((WindowRef) m_macWindow) ;
+}
+
+// Attracts the users attention to this window if the application is
+// inactive (should be called when a background event occurs)
+
+static pascal void wxMacNMResponse( NMRecPtr ptr )
+{
+ NMRemove( ptr ) ;
+ DisposePtr( (Ptr)ptr ) ;
+}
+
+void wxTopLevelWindowMac::RequestUserAttention(int WXUNUSED(flags))
+{
+ NMRecPtr notificationRequest = (NMRecPtr) NewPtr( sizeof( NMRec) ) ;
+ static wxMacNMUPP nmupp( wxMacNMResponse );
+
+ memset( notificationRequest , 0 , sizeof(*notificationRequest) ) ;
+ notificationRequest->qType = nmType ;
+ notificationRequest->nmMark = 1 ;
+ notificationRequest->nmIcon = 0 ;
+ notificationRequest->nmSound = 0 ;
+ notificationRequest->nmStr = NULL ;
+ notificationRequest->nmResp = nmupp ;
+
+ verify_noerr( NMInstall( notificationRequest ) ) ;
+}
+
+// ---------------------------------------------------------------------------
+// Shape implementation
+// ---------------------------------------------------------------------------
+
+
+bool wxTopLevelWindowMac::SetShape(const wxRegion& region)
+{
+ wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
+ _T("Shaped windows must be created with the wxFRAME_SHAPED style."));
+
+ // The empty region signifies that the shape
+ // should be removed from the window.
+ if ( region.IsEmpty() )
+ {
+ wxSize sz = GetClientSize();
+ wxRegion rgn(0, 0, sz.x, sz.y);
+ if ( rgn.IsEmpty() )
+ return false ;
+ else
+ return SetShape(rgn);
+ }
+
+ // Make a copy of the region
+ RgnHandle shapeRegion = NewRgn();
+ HIShapeGetAsQDRgn( region.GetWXHRGN(), shapeRegion );
+
+ // Dispose of any shape region we may already have
+ RgnHandle oldRgn = (RgnHandle)GetWRefCon( (WindowRef)MacGetWindowRef() );
+ if ( oldRgn )
+ DisposeRgn(oldRgn);
+
+ // Save the region so we can use it later
+ SetWRefCon((WindowRef)MacGetWindowRef(), (URefCon)shapeRegion);
+
+ // inform the window manager that the window has changed shape
+ ReshapeCustomWindow((WindowRef)MacGetWindowRef());
+
+ return true;
+}
+
+// ---------------------------------------------------------------------------
+// Support functions for shaped windows, based on Apple's CustomWindow sample at
+// http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_High_Level_Toolbox/CustomWindow.htm
+// ---------------------------------------------------------------------------
+
+static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect)
+{
+ GetWindowPortBounds(window, inRect);
+ Point pt = { inRect->top ,inRect->left };
+ wxMacLocalToGlobal( window, &pt ) ;
+ inRect->bottom += pt.v - inRect->top;
+ inRect->right += pt.h - inRect->left;
+ inRect->top = pt.v;
+ inRect->left = pt.h;
+}
+
+static SInt32 wxShapedMacWindowGetFeatures(WindowRef WXUNUSED(window), SInt32 param)
+{
+ /*------------------------------------------------------
+ Define which options your custom window supports.
+ --------------------------------------------------------*/
+ //just enable everything for our demo
+ *(OptionBits*)param =
+ //kWindowCanGrow |
+ //kWindowCanZoom |
+ kWindowCanCollapse |
+ //kWindowCanGetWindowRegion |
+ //kWindowHasTitleBar |
+ //kWindowSupportsDragHilite |
+ kWindowCanDrawInCurrentPort |
+ //kWindowCanMeasureTitle |
+ kWindowWantsDisposeAtProcessDeath |
+ kWindowSupportsGetGrowImageRegion |
+ kWindowDefSupportsColorGrafPort;
+
+ return 1;
+}
+
+// The content region is left as a rectangle matching the window size, this is
+// so the origin in the paint event, and etc. still matches what the
+// programmer expects.
+static void wxShapedMacWindowContentRegion(WindowRef window, RgnHandle rgn)
+{
+ SetEmptyRgn(rgn);
+ wxTopLevelWindowMac* win = wxFindWinFromMacWindow(window);
+ if (win)
+ {
+ Rect r ;
+ wxShapedMacWindowGetPos( window, &r ) ;
+ RectRgn( rgn , &r ) ;
+ }
+}
+
+// The structure region is set to the shape given to the SetShape method.
+static void wxShapedMacWindowStructureRegion(WindowRef window, RgnHandle rgn)
+{
+ RgnHandle cachedRegion = (RgnHandle) GetWRefCon(window);
+
+ SetEmptyRgn(rgn);
+ if (cachedRegion)
+ {
+ Rect windowRect;
+ wxShapedMacWindowGetPos(window, &windowRect); // how big is the window
+ CopyRgn(cachedRegion, rgn); // make a copy of our cached region
+ OffsetRgn(rgn, windowRect.left, windowRect.top); // position it over window
+ //MapRgn(rgn, &mMaskSize, &windowRect); //scale it to our actual window size
+ }
+}
+
+static SInt32 wxShapedMacWindowGetRegion(WindowRef window, SInt32 param)
+{
+ GetWindowRegionPtr rgnRec = (GetWindowRegionPtr)param;
+
+ if (rgnRec == NULL)
+ return paramErr;
+
+ switch (rgnRec->regionCode)
+ {
+ case kWindowStructureRgn:
+ wxShapedMacWindowStructureRegion(window, rgnRec->winRgn);
+ break;
+
+ case kWindowContentRgn:
+ wxShapedMacWindowContentRegion(window, rgnRec->winRgn);
+ break;
+
+ default:
+ SetEmptyRgn(rgnRec->winRgn);
+ break;
+ }
+
+ return noErr;
+}
+
+// Determine the region of the window which was hit
+//
+static SInt32 wxShapedMacWindowHitTest(WindowRef window, SInt32 param)
+{
+ Point hitPoint;
+ static RgnHandle tempRgn = NULL;
+
+ if (tempRgn == NULL)
+ tempRgn = NewRgn();
+
+ // get the point clicked
+ SetPt( &hitPoint, LoWord(param), HiWord(param) );
+
+ // Mac OS 8.5 or later
+ wxShapedMacWindowStructureRegion(window, tempRgn);
+ if (PtInRgn( hitPoint, tempRgn )) //in window content region?
+ return wInContent;
+
+ // no significant area was hit
+ return wNoHit;
+}
+
+static pascal long wxShapedMacWindowDef(short WXUNUSED(varCode), WindowRef window, SInt16 message, SInt32 param)
+{
+ switch (message)
+ {
+ case kWindowMsgHitTest:
+ return wxShapedMacWindowHitTest(window, param);
+
+ case kWindowMsgGetFeatures:
+ return wxShapedMacWindowGetFeatures(window, param);
+
+ // kWindowMsgGetRegion is sent during CreateCustomWindow and ReshapeCustomWindow
+ case kWindowMsgGetRegion:
+ return wxShapedMacWindowGetRegion(window, param);
+
+ default:
+ break;
+ }
+
+ return 0;