X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/50f3c41d61bd9ae69f215bad923f562d509e063c..6862383251a9f1f103182c04f0d60bb1dac919c6:/src/mac/carbon/toplevel.cpp diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 5d77fdc673..6a5284d6da 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -81,8 +81,6 @@ END_EVENT_TABLE() // Carbon Events // --------------------------------------------------------------------------- -extern long wxMacTranslateKey(unsigned char key, unsigned char code) ; - static const EventTypeSpec eventList[] = { // TODO: remove control related event like key and mouse (except for WindowLeave events) @@ -409,7 +407,7 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point { Point testLocation = location ; - if ( toplevelWindow && toplevelWindow->MacUsesCompositing() ) + if ( toplevelWindow ) { testLocation.h -= r.left ; testLocation.v -= r.top ; @@ -430,7 +428,7 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , const Point& location , WindowRef window , ControlPartCode *outPart ) { #if TARGET_API_MAC_OSX - if ( UMAGetSystemVersion() >= 0x1030 && ( toplevelWindow == 0 || toplevelWindow->MacUsesCompositing() ) ) + if ( UMAGetSystemVersion() >= 0x1030 ) return FindControlUnderMouse( location , window , outPart ) ; #endif @@ -612,8 +610,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev EventModifiers modifiers = cEvent.GetParameter(kEventParamKeyModifiers, typeUInt32) ; Point clickLocation = windowMouseLocation ; - if ( toplevelWindow->MacUsesCompositing() ) - currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ; + currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ; HandleControlClick( (ControlRef) currentMouseWindow->GetHandle() , clickLocation , modifiers , (ControlActionUPP ) -1 ) ; @@ -658,15 +655,12 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev EventModifiers modifiers = cEvent.GetParameter(kEventParamKeyModifiers, typeUInt32) ; Point clickLocation = windowMouseLocation ; #if TARGET_API_MAC_OSX - if ( toplevelWindow->MacUsesCompositing() ) - { - HIPoint hiPoint ; - hiPoint.x = clickLocation.h ; - hiPoint.y = clickLocation.v ; - HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control ) ; - clickLocation.h = (int)hiPoint.x ; - clickLocation.v = (int)hiPoint.y ; - } + HIPoint hiPoint ; + hiPoint.x = clickLocation.h ; + hiPoint.y = clickLocation.v ; + HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control ) ; + clickLocation.h = (int)hiPoint.x ; + clickLocation.v = (int)hiPoint.y ; #endif // TARGET_API_MAC_OSX HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ; @@ -888,8 +882,7 @@ typedef struct wxPoint m_position ; wxSize m_size ; bool m_wasResizable ; -} -FullScreenData ; +} FullScreenData ; void wxTopLevelWindowMac::Init() { @@ -897,12 +890,6 @@ void wxTopLevelWindowMac::Init() m_maximizeOnShow = false; m_macWindow = NULL ; -#if TARGET_API_MAC_OSX - m_macUsesCompositing = ( UMAGetSystemVersion() >= 0x1030 ); -#else - m_macUsesCompositing = false; -#endif - m_macEventHandler = NULL ; m_macFullScreenData = NULL ; } @@ -990,22 +977,6 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() void wxTopLevelWindowMac::Maximize(bool maximize) { - // TODO: check if this is still necessary -#if 0 - wxMacPortStateHelper help( (GrafPtr)GetWindowPort( (WindowRef)m_macWindow) ) ; - wxMacWindowClipper clip( this ); -#endif -#if 0 - if ( !IsWindowInStandardState( (WindowRef)m_macWindow, NULL, NULL ) ) - { - Rect rect; - - GetWindowBounds((WindowRef)m_macWindow, kWindowGlobalPortRgn, &rect); - SetWindowIdealUserState((WindowRef)m_macWindow, &rect); - SetWindowUserState((WindowRef)m_macWindow, &rect); - } - ZoomWindow( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , false ) ; -#else Point idealSize = { 0 , 0 } ; if ( maximize ) { @@ -1015,7 +986,6 @@ void wxTopLevelWindowMac::Maximize(bool maximize) idealSize.v = rect.bottom - rect.top ; } ZoomWindowIdeal( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , &idealSize ) ; -#endif } bool wxTopLevelWindowMac::IsMaximized() const @@ -1141,8 +1111,6 @@ void wxTopLevelWindowMac::MacCreateRealWindow( else if ( HasFlag( wxFRAME_DRAWER ) ) { wclass = kDrawerWindowClass; - // we must force compositing on a drawer - m_macUsesCompositing = true ; } #endif //10.2 and up else @@ -1180,9 +1148,9 @@ void wxTopLevelWindowMac::MacCreateRealWindow( if ( HasFlag(wxSTAY_ON_TOP) ) group = GetWindowGroupOfClass(kUtilityWindowClass) ; -#if TARGET_API_MAC_OSX - if ( m_macUsesCompositing ) - attr |= kWindowCompositingAttribute; + 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) ) @@ -1205,6 +1173,11 @@ void wxTopLevelWindowMac::MacCreateRealWindow( wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") ); + // setup a separate group for each window, so that overlays can be handled easily + verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &group )); + verify_noerr( SetWindowGroupParent( group, GetWindowGroup( (WindowRef) m_macWindow ))); + verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , group )); + // 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 ) ; @@ -1213,22 +1186,14 @@ void wxTopLevelWindowMac::MacCreateRealWindow( UMASetWTitle( (WindowRef) m_macWindow , title , m_font.GetEncoding() ) ; m_peer = new wxMacControl(this , true /*isRootControl*/) ; -#if TARGET_API_MAC_OSX - if ( m_macUsesCompositing ) - { - // 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() ) ; - } - } -#endif + // 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() ) { - ::CreateRootControl( (WindowRef)m_macWindow , m_peer->GetControlRefAddr() ) ; + // compatibility mode fallback + GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ; } // the root control level handler @@ -1432,15 +1397,14 @@ bool wxTopLevelWindowMac::IsFullScreen() const } -bool wxTopLevelWindowMac::SetTranslucency(int alpha) +bool wxTopLevelWindowMac::SetTransparent(wxByte alpha) { - WindowRef handle = GetControlOwner((OpaqueControlRef*)GetHandle()); - OSStatus result = SetWindowAlpha(handle, float(alpha)/255.0); + OSStatus result = SetWindowAlpha((WindowRef)m_macWindow, float(alpha)/255.0); return result == noErr; } -bool wxTopLevelWindowMac::CanSetTranslucency() +bool wxTopLevelWindowMac::CanSetTransparent() { return true; } @@ -1454,7 +1418,7 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle) wxTopLevelWindowBase::SetExtraStyle( exStyle ) ; #if TARGET_API_MAC_OSX - if ( m_macUsesCompositing && m_macWindow != NULL ) + if ( m_macWindow != NULL ) { bool metal = GetExtraStyle() & wxFRAME_EX_METAL ; if ( MacGetMetalAppearance() != metal ) @@ -1526,9 +1490,6 @@ void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const void wxTopLevelWindowMac::MacSetMetalAppearance( bool set ) { #if TARGET_API_MAC_OSX - wxASSERT_MSG( m_macUsesCompositing , - wxT("Cannot set metal appearance on a non-compositing window") ) ; - MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes , set ? kWindowNoAttributes : kWindowMetalAttribute ) ; #endif @@ -1558,57 +1519,31 @@ wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const void wxTopLevelWindowMac::MacPerformUpdates() { -#if TARGET_API_MAC_OSX - if ( m_macUsesCompositing ) - { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 - // for composited windows this also triggers a redraw of all - // invalid views in the window - if ( UMAGetSystemVersion() >= 0x1030 ) - HIWindowFlush((WindowRef) m_macWindow) ; - else -#endif - { - // the only way to trigger the redrawing on earlier systems is to call - // ReceiveNextEvent - - EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ; - UInt32 currentEventClass = 0 ; - UInt32 currentEventKind = 0 ; - if ( currentEvent != NULL ) - { - currentEventClass = ::GetEventClass( currentEvent ) ; - currentEventKind = ::GetEventKind( currentEvent ) ; - } - - if ( currentEventClass != kEventClassMenu ) - { - // when tracking a menu, strange redraw errors occur if we flush now, so leave.. - EventRef theEvent; - OSStatus status = noErr ; - status = ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ; - } - } - } + // for composited windows this also triggers a redraw of all + // invalid views in the window + if ( UMAGetSystemVersion() >= 0x1030 ) + HIWindowFlush((WindowRef) m_macWindow) ; else #endif { - BeginUpdate( (WindowRef) m_macWindow ) ; + // the only way to trigger the redrawing on earlier systems is to call + // ReceiveNextEvent - RgnHandle updateRgn = NewRgn(); - if ( updateRgn ) + EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ; + UInt32 currentEventClass = 0 ; + if ( currentEvent != NULL ) { - GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), updateRgn ); - UpdateControls( (WindowRef)m_macWindow , updateRgn ) ; - - // if ( !EmptyRgn( updateRgn ) ) - // MacDoRedraw( updateRgn , 0 , true) ; - - DisposeRgn( updateRgn ); + currentEventClass = ::GetEventClass( currentEvent ) ; + ::GetEventKind( currentEvent ) ; } - EndUpdate( (WindowRef)m_macWindow ) ; - QDFlushPortBuffer( GetWindowPort( (WindowRef)m_macWindow ) , NULL ) ; + if ( currentEventClass != kEventClassMenu ) + { + // when tracking a menu, strange redraw errors occur if we flush now, so leave.. + EventRef theEvent; + ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ; + } } }