diff --git a/include/wx/mac/carbon/toplevel.h b/include/wx/mac/carbon/toplevel.h index 269854359e..79cfcc7b6d 100644 --- a/include/wx/mac/carbon/toplevel.h +++ b/include/wx/mac/carbon/toplevel.h @@ -104,6 +104,7 @@ public: virtual void MacInstallTopLevelWindowEventHandler() ; bool MacGetMetalAppearance() const ; + bool MacGetUnifiedAppearance() const ; void MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear ) ; wxUint32 MacGetWindowAttributes() const ; @@ -141,6 +142,7 @@ private : // This is because the ExtraStyle flags get out of sync with the metal appearance and the metal // logic & checks cease to work as expected. To set the metal appearance, use SetExtraStyle. void MacSetMetalAppearance( bool on ) ; + void MacSetUnifiedAppearance( bool on ) ; WXEVENTHANDLERREF m_macEventHandler ; diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 0fe00286e4..7c9b6b0191 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -57,6 +57,9 @@ // constants // ---------------------------------------------------------------------------- +// unified title and toolbar constant - not in Tiger headers, so we duplicate it here +#define kWindowUnifiedTitleAndToolbarAttribute (1 << 7) + // trace mask for activation tracing messages static const wxChar *TRACE_ACTIVATE = _T("activation"); @@ -1257,6 +1260,13 @@ void wxTopLevelWindowMac::MacCreateRealWindow( } #endif +#if TARGET_API_MAC_OSX + if ( m_macWindow != NULL ) + { + MacSetUnifiedAppearance( true ) ; + } +#endif + HIViewRef growBoxRef = 0 ; err = HIViewFindByID( HIViewGetRoot( (WindowRef)m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef ); if ( err == noErr && growBoxRef != 0 ) @@ -1474,8 +1484,14 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle) if ( m_macWindow != NULL ) { bool metal = GetExtraStyle() & wxFRAME_EX_METAL ; + if ( MacGetMetalAppearance() != metal ) + { + if ( MacGetUnifiedAppearance() ) + MacSetUnifiedAppearance( !metal ) ; + MacSetMetalAppearance( metal ) ; + } } #endif } @@ -1549,6 +1565,9 @@ void wxTopLevelWindowMac::DoCentre(int dir) void wxTopLevelWindowMac::MacSetMetalAppearance( bool set ) { #if TARGET_API_MAC_OSX + if ( MacGetUnifiedAppearance() ) + MacSetUnifiedAppearance( false ) ; + MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes , set ? kWindowNoAttributes : kWindowMetalAttribute ) ; #endif @@ -1559,10 +1578,41 @@ bool wxTopLevelWindowMac::MacGetMetalAppearance() const #if TARGET_API_MAC_OSX return MacGetWindowAttributes() & kWindowMetalAttribute ; #else - return false ; + return false; #endif } +void wxTopLevelWindowMac::MacSetUnifiedAppearance( bool set ) +{ +#if TARGET_API_MAC_OSX + if ( UMAGetSystemVersion() >= 0x1040 ) + { + 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( wxSYS_COLOUR_WINDOW ) ; + } +#endif +} + +bool wxTopLevelWindowMac::MacGetUnifiedAppearance() const +{ +#if TARGET_API_MAC_OSX + if ( UMAGetSystemVersion() >= 0x1040 ) + return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ; + else +#endif + return false; +} + void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear ) { ChangeWindowAttributes( (WindowRef)m_macWindow, attributesToSet, attributesToClear ) ;