X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd04970ab45eb2f392af48b71aa9ecd5d4b1c8c2..f02a4ffa5feb5332c0cb41d625b7634677fbc6f4:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index b96fabfdcb..7097a160b9 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -209,7 +209,7 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl thisWindow->GetPeer()->GetRect( &controlBounds ) ; } } - + if ( cEvent.GetParameter(kEventParamRgnHandle, &updateRgn) != noErr ) { updateRgn = (RgnHandle) visRegion.GetWXHRGN() ; @@ -218,22 +218,12 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl { if ( thisWindow->GetPeer()->IsCompositing() == false ) { -/* - if ( thisWindow->GetPeer()->IsRootControl() == false ) - { - GetControlBounds( thisWindow->GetPeer()->GetControlRef() , &controlBounds ) ; - } - else - { - thisWindow->GetPeer()->GetRect( &controlBounds ) ; - } -*/ allocatedRgn = NewRgn() ; CopyRgn( updateRgn , allocatedRgn ) ; OffsetRgn( allocatedRgn , -controlBounds.left , -controlBounds.top ) ; // hide the given region by the new region that must be shifted wxMacNativeToWindow( thisWindow , allocatedRgn ) ; - updateRgn = allocatedRgn ; + updateRgn = allocatedRgn ; } else { @@ -278,10 +268,10 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl if ( cEvent.GetParameter(kEventParamCGContextRef, &cgContext) != noErr ) { wxASSERT( thisWindow->GetPeer()->IsCompositing() == false ) ; - + // this parameter is not provided on non-composited windows created = true ; - // rest of the code expects this to be already transformed and clipped for local + // rest of the code expects this to be already transformed and clipped for local CGrafPtr port = GetWindowPort( (WindowRef) thisWindow->MacGetTopLevelWindowRef() ) ; Rect bounds ; GetPortBounds( port , &bounds ) ; @@ -295,13 +285,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ; CGContextScaleCTM( cgContext , 1 , -1 ) ; - + CGContextTranslateCTM( cgContext , controlBounds.left , controlBounds.top ) ; - + /* CGContextSetRGBFillColor( cgContext , 1.0 , 1.0 , 1.0 , 1.0 ) ; - CGContextFillRect(cgContext , CGRectMake( 0 , 0 , - controlBounds.right - controlBounds.left , + CGContextFillRect(cgContext , CGRectMake( 0 , 0 , + controlBounds.right - controlBounds.left , controlBounds.bottom - controlBounds.top ) ); */ @@ -481,6 +471,7 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef break ; case kEventClassService : result = wxMacWindowServiceEventHandler( handler, event , data ) ; + break ; default : break ; } @@ -637,35 +628,6 @@ wxMAC_DEFINE_PROC_GETTER( ControlActionUPP , wxMacLiveScrollbarActionProc ) ; // implementation // =========================================================================== -#if KEY_wxList_DEPRECATED -wxList wxWinMacControlList(wxKEY_INTEGER); - -wxWindow *wxFindControlFromMacControl(ControlRef inControl ) -{ - wxNode *node = wxWinMacControlList.Find((long)inControl); - if (!node) - return NULL; - return (wxControl *)node->GetData(); -} - -void wxAssociateControlWithMacControl(ControlRef inControl, wxWindow *control) -{ - // adding NULL ControlRef is (first) surely a result of an error and - // (secondly) breaks native event processing - wxCHECK_RET( inControl != (ControlRef) NULL, wxT("attempt to add a NULL WindowRef to window list") ); - - if ( !wxWinMacControlList.Find((long)inControl) ) - wxWinMacControlList.Append((long)inControl, control); -} - -void wxRemoveMacControlAssociation(wxWindow *control) -{ - // remove all associations pointing to us - while ( wxWinMacControlList.DeleteObject(control) ) - {} -} -#else - WX_DECLARE_HASH_MAP(ControlRef, wxWindow*, wxPointerHash, wxPointerEqual, MacControlMap); static MacControlMap wxWinMacControlList; @@ -708,7 +670,6 @@ void wxRemoveMacControlAssociation(wxWindow *control) } } } -#endif // deprecated wxList // ---------------------------------------------------------------------------- // constructors and such @@ -735,17 +696,17 @@ void wxWindowMac::Init() m_peer = NULL ; m_frozenness = 0 ; #if WXWIN_COMPATIBILITY_2_4 - m_backgroundTransparent = FALSE; + m_backgroundTransparent = false; #endif // as all windows are created with WS_VISIBLE style... - m_isShown = TRUE; + m_isShown = true; m_hScrollBar = NULL ; m_vScrollBar = NULL ; m_macBackgroundBrush = wxNullBrush ; - m_macIsUserPane = TRUE; + m_macIsUserPane = true; #if wxMAC_USE_CORE_GRAPHICS m_cgContextRef = NULL ; #endif @@ -760,7 +721,7 @@ wxWindowMac::~wxWindowMac() { SendDestroyEvent(); - m_isBeingDeleted = TRUE; + m_isBeingDeleted = true; MacInvalidateBorders() ; @@ -859,10 +820,10 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, long style, const wxString& name) { - wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindowMac without parent") ); + wxCHECK_MSG( parent, false, wxT("can't create wxWindowMac without parent") ); if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) - return FALSE; + return false; m_windowVariant = parent->GetWindowVariant() ; @@ -900,10 +861,10 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, wxWindowCreateEvent event(this); GetEventHandler()->AddPendingEvent(event); - return TRUE; + return true; } -void wxWindowMac::MacChildAdded() +void wxWindowMac::MacChildAdded() { if ( m_vScrollBar ) { @@ -1171,7 +1132,7 @@ bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos, int& w, int& h , bool adjustOrigin ) const { bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; - + // the desired size, minus the border pixels gives the correct size of the control x = (int)pos.x; @@ -1216,7 +1177,7 @@ void wxWindowMac::DoGetPosition(int *x, int *y) const { Rect bounds ; m_peer->GetRect( &bounds ) ; - + int x1 = bounds.left ; int y1 = bounds.top ; @@ -1377,7 +1338,7 @@ void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , in GetRegionBounds( rgn , &content ) ; m_peer->GetRect( &structure ) ; OffsetRect( &structure, -structure.left , -structure.top ) ; - + left = content.left - structure.left ; top = content.top - structure.top ; right = structure.right - content.right ; @@ -1453,17 +1414,17 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const bool wxWindowMac::SetCursor(const wxCursor& cursor) { if (m_cursor == cursor) - return FALSE; + return false; if (wxNullCursor == cursor) { if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) ) - return FALSE ; + return false ; } else { if ( ! wxWindowBase::SetCursor( cursor ) ) - return FALSE ; + return false ; } wxASSERT_MSG( m_cursor.Ok(), @@ -1497,7 +1458,7 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor) m_cursor.MacInstall() ; } - return TRUE ; + return true ; } #if wxUSE_MENUS @@ -1535,7 +1496,7 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) menu->SetInvokingWindow(NULL); - return TRUE; + return true; } #endif @@ -1555,7 +1516,7 @@ void wxWindowMac::DoSetToolTip(wxToolTip *tooltip) #endif // wxUSE_TOOLTIPS -void wxWindowMac::MacInvalidateBorders() +void wxWindowMac::MacInvalidateBorders() { if ( m_peer == NULL ) return ; @@ -1563,18 +1524,18 @@ void wxWindowMac::MacInvalidateBorders() bool vis = MacIsReallyShown() ; if ( !vis ) return ; - + int outerBorder = MacGetLeftBorderSize() ; if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() ) outerBorder += 4 ; if ( outerBorder == 0 ) return ; - - // now we know that we have something to do at all + + // now we know that we have something to do at all // as the borders are drawn on the parent we have to properly invalidate all these areas - RgnHandle updateInner = NewRgn() , + RgnHandle updateInner = NewRgn() , updateOuter = NewRgn() ; // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon @@ -1716,7 +1677,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) if ((m_maxWidth != -1) && (actualWidth > m_maxWidth)) actualWidth = m_maxWidth; if ((m_maxHeight != -1) && (actualHeight > m_maxHeight)) - actualHeight = m_maxHeight; + actualHeight = m_maxHeight; bool doMove = false ; bool doResize = false ; @@ -1732,10 +1693,10 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) if ( doMove || doResize ) { - // as the borders are drawn outside the native control, we adjust now + // as the borders are drawn outside the native control, we adjust now - wxRect bounds( wxPoint( actualX + MacGetLeftBorderSize() ,actualY + MacGetTopBorderSize() ), - wxSize( actualWidth - (MacGetLeftBorderSize() + MacGetRightBorderSize()) , + wxRect bounds( wxPoint( actualX + MacGetLeftBorderSize() ,actualY + MacGetTopBorderSize() ), + wxSize( actualWidth - (MacGetLeftBorderSize() + MacGetRightBorderSize()) , actualHeight - (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ; Rect r ; @@ -1747,10 +1708,10 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) } MacInvalidateBorders() ; - + m_cachedClippedRectValid = false ; m_peer->SetRect( &r ) ; - + wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified MacInvalidateBorders() ; @@ -1793,12 +1754,12 @@ wxSize wxWindowMac::DoGetBestSize() const { bestsize.bottom = 16 ; } -#if wxUSE_SPINBTN +#if wxUSE_SPINBTN else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) ) { bestsize.bottom = 24 ; } -#endif // wxUSE_SPINBTN +#endif // wxUSE_SPINBTN else { // return wxWindowBase::DoGetBestSize() ; @@ -1840,15 +1801,15 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags) return; } - if ( x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + if ( x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) x = currentX; - if ( y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + if ( y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) y = currentY; AdjustForParentClientOrigin(x, y, sizeFlags); - wxSize size(-1, -1); - if ( width == -1 ) + wxSize size = wxDefaultSize; + if ( width == wxDefaultCoord ) { if ( sizeFlags & wxSIZE_AUTO_WIDTH ) { @@ -1862,11 +1823,11 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags) } } - if ( height == -1 ) + if ( height == wxDefaultCoord ) { if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) { - if ( size.x == -1 ) + if ( size.x == wxDefaultCoord ) { size = DoGetBestSize(); } @@ -1903,7 +1864,7 @@ wxPoint wxWindowMac::GetClientAreaOrigin() const void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight) { - if ( clientheight != -1 || clientheight != -1 ) + if ( clientheight != wxDefaultCoord || clientheight != wxDefaultCoord ) { int currentclientwidth , currentclientheight ; int currentwidth , currentheight ; @@ -1911,7 +1872,7 @@ void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight) GetClientSize( ¤tclientwidth , ¤tclientheight ) ; GetSize( ¤twidth , ¤theight ) ; - DoSetSize( -1 , -1 , currentwidth + clientwidth - currentclientwidth , + DoSetSize( wxDefaultCoord , wxDefaultCoord , currentwidth + clientwidth - currentclientwidth , currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ; } } @@ -1936,7 +1897,7 @@ bool wxWindowMac::Show(bool show) { bool former = MacIsReallyShown() ; if ( !wxWindowBase::Show(show) ) - return FALSE; + return false; // TODO use visibilityChanged Carbon Event for OSX if ( m_peer ) @@ -1945,7 +1906,7 @@ bool wxWindowMac::Show(bool show) } if ( former != MacIsReallyShown() ) MacPropagateVisibilityChanged() ; - return TRUE; + return true; } bool wxWindowMac::Enable(bool enable) @@ -1953,13 +1914,13 @@ bool wxWindowMac::Enable(bool enable) wxASSERT( m_peer->Ok() ) ; bool former = MacIsReallyEnabled() ; if ( !wxWindowBase::Enable(enable) ) - return FALSE; + return false; m_peer->Enable( enable ) ; if ( former != MacIsReallyEnabled() ) MacPropagateEnabledStateChanged() ; - return TRUE; + return true; } // @@ -2039,7 +2000,7 @@ bool wxWindowMac::MacIsReallyShown() // only under OSX the visibility of the TLW is taken into account if ( m_isBeingDeleted ) return false ; - + #if TARGET_API_MAC_OSX if ( m_peer && m_peer->Ok() ) return m_peer->IsVisible(); @@ -2178,6 +2139,8 @@ void wxWindowMac::WarpPointer (int x_pos, int y_pos) void wxWindowMac::OnEraseBackground(wxEraseEvent& event) { + if ( MacGetTopLevelWindow() == NULL ) + return ; #if TARGET_API_MAC_OSX if ( MacGetTopLevelWindow()->MacUsesCompositing() && (m_macBackgroundBrush.Ok() == false || m_macBackgroundBrush.GetStyle() == wxTRANSPARENT ) ) { @@ -2282,7 +2245,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) HIThemeFrameDrawInfo info ; memset( &info, 0 , sizeof( info ) ) ; - + info.version = 0 ; info.kind = 0 ; info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ; @@ -2290,7 +2253,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) CGContextRef cgContext = (CGContextRef) GetParent()->MacGetCGContextRef() ; wxASSERT( cgContext ) ; - + if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) { info.kind = kHIThemeFrameTextFieldSquare ; @@ -2305,14 +2268,14 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) { HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ; } - + m_peer->GetRect( &rect ) ; if ( hasBothScrollbars ) { int size = m_hScrollBar->GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ? 16 : 12 ; CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ; CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ; - HIThemeGrowBoxDrawInfo info ; + HIThemeGrowBoxDrawInfo info ; memset( &info, 0 , sizeof( info ) ) ; info.version = 0 ; info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ; @@ -2341,7 +2304,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) { DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; } - + if ( hasFocus ) { DrawThemeFocusRect( &rect , true ) ; @@ -2349,7 +2312,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) if ( hasBothScrollbars ) { - // GetThemeStandaloneGrowBoxBounds + // GetThemeStandaloneGrowBoxBounds //DrawThemeStandaloneNoGrowBox } } @@ -2412,11 +2375,11 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) if( dx == 0 && dy ==0 ) return ; - int width , height ; - GetClientSize( &width , &height ) ; + int width , height ; + GetClientSize( &width , &height ) ; #if TARGET_API_MAC_OSX - if ( 1 /* m_peer->IsCompositing() */ ) - { + if ( 1 /* m_peer->IsCompositing() */ ) + { // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control // area is scrolled, this does not occur if width and height are 2 pixels less, // TODO write optimal workaround @@ -2453,20 +2416,20 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) // is the better overall solution, as it does not slow down scrolling m_peer->SetNeedsDisplay() ; #else - // this would be the preferred version for fast drawing controls + // this would be the preferred version for fast drawing controls #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 if( UMAGetSystemVersion() >= 0x1030 && m_peer->IsCompositing() ) HIViewRender(m_peer->GetControlRef()) ; else #endif - Update() ; + Update() ; #endif - } - else + } + else #endif - { + { wxPoint pos; pos.x = pos.y = 0; @@ -2474,7 +2437,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) Rect scrollrect; RgnHandle updateRgn = NewRgn() ; - { + { wxClientDC dc(this) ; wxMacPortSetter helper(&dc) ; @@ -2493,7 +2456,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) ScrollRect( &scrollrect , dx , dy , updateRgn ) ; // now scroll the former update region as well and add the new update region - + WindowRef rootWindow = (WindowRef) MacGetTopLevelWindowRef() ; RgnHandle formerUpdateRgn = NewRgn() ; RgnHandle scrollRgn = NewRgn() ; @@ -2733,19 +2696,19 @@ wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const return win ; } -const wxRect& wxWindowMac::MacGetClippedClientRect() const +const wxRect& wxWindowMac::MacGetClippedClientRect() const { MacUpdateClippedRects() ; return m_cachedClippedClientRect ; } -const wxRect& wxWindowMac::MacGetClippedRect() const +const wxRect& wxWindowMac::MacGetClippedRect() const { MacUpdateClippedRects() ; return m_cachedClippedRect ; } -const wxRect&wxWindowMac:: MacGetClippedRectWithOuterStructure() const +const wxRect&wxWindowMac:: MacGetClippedRectWithOuterStructure() const { MacUpdateClippedRects() ; return m_cachedClippedRectWithOuterStructure ; @@ -2780,7 +2743,7 @@ void wxWindowMac::MacUpdateClippedRects() const Rect r ; Rect rIncludingOuterStructures ; - + m_peer->GetRect( &r ) ; r.left -= MacGetLeftBorderSize() ; r.top -= MacGetTopBorderSize() ; @@ -2794,10 +2757,10 @@ void wxWindowMac::MacUpdateClippedRects() const rIncludingOuterStructures = r ; InsetRect( &rIncludingOuterStructures , -4 , -4 ) ; - + wxRect cl = GetClientRect() ; Rect rClient = { cl.y , cl.x , cl.y + cl.height , cl.x + cl.width } ; - + const wxWindow* child = this ; const wxWindow* parent = NULL ; while( !child->IsTopLevel() && ( parent = child->GetParent() ) != NULL ) @@ -2839,19 +2802,19 @@ void wxWindowMac::MacUpdateClippedRects() const } child = parent ; } - + m_cachedClippedRect = wxRect( r.left , r.top , r.right - r.left , r.bottom - r.top ) ; - m_cachedClippedClientRect = wxRect( rClient.left , rClient.top , + m_cachedClippedClientRect = wxRect( rClient.left , rClient.top , rClient.right - rClient.left , rClient.bottom - rClient.top ) ; - m_cachedClippedRectWithOuterStructure = wxRect( - rIncludingOuterStructures.left , rIncludingOuterStructures.top , - rIncludingOuterStructures.right - rIncludingOuterStructures.left , + m_cachedClippedRectWithOuterStructure = wxRect( + rIncludingOuterStructures.left , rIncludingOuterStructures.top , + rIncludingOuterStructures.right - rIncludingOuterStructures.left , rIncludingOuterStructures.bottom - rIncludingOuterStructures.top ) ; - + m_cachedClippedRegionWithOuterStructure = wxRegion( m_cachedClippedRectWithOuterStructure ) ; m_cachedClippedRegion = wxRegion( m_cachedClippedRect ) ; m_cachedClippedClientRegion = wxRegion( m_cachedClippedClientRect ) ; - + m_cachedClippedRectValid = true ; } @@ -2867,7 +2830,7 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) // wxLogDebug(wxT("update for %s bounds %d , %d , %d , %d"),wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left , updatebounds.top , updatebounds.right , updatebounds.bottom ) ; - if ( !EmptyRgn(updatergn) ) + if ( !EmptyRgn(updatergn) ) { RgnHandle newupdate = NewRgn() ; wxSize point = GetClientSize() ; @@ -2886,7 +2849,7 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) dc->SetClippingRegion(wxRegion(updatergn)); else dc->SetClippingRegion(wxRegion(newupdate)); - + wxEraseEvent eevent( GetId(), dc ); eevent.SetEventObject( this ); GetEventHandler()->ProcessEvent( eevent ); @@ -3145,7 +3108,7 @@ long wxWindowMac::MacGetLeftBorderSize( ) const return 0 ; SInt32 border = 0 ; - + if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) { GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ; @@ -3248,4 +3211,17 @@ wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENT return eventNotHandledErr ; } +bool wxWindowMac::Reparent(wxWindowBase *newParentBase) +{ + wxWindowMac *newParent = (wxWindowMac *)newParentBase; + + if ( !wxWindowBase::Reparent(newParent) ) + return false; + + //copied from MacPostControlCreate + ControlRef container = (ControlRef) GetParent()->GetHandle() ; + wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; + ::EmbedControl( m_peer->GetControlRef() , container ) ; + return true; +}