X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce00f59b5b169752d2f05ce3bb1a88ddc1b38b4c..8a31648287be0ef976f133de2786b137f1e98340:/src/osx/nonownedwnd_osx.cpp diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index 213188d146..1d643a0fdb 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -13,6 +13,7 @@ #ifndef WX_PRECOMP #include "wx/app.h" + #include "wx/dcmemory.h" #include "wx/log.h" #endif // WX_PRECOMP @@ -115,14 +116,26 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, m_isShown = false; // use the appropriate defaults for the position and size if necessary - wxPoint pos(posOrig); - if ( !pos.IsFullySpecified() ) - pos.SetDefaults(wxGetClientDisplayRect().GetPosition()); - wxSize size(sizeOrig); if ( !size.IsFullySpecified() ) size.SetDefaults(wxTopLevelWindow::GetDefaultSize()); + wxPoint pos(posOrig); + if ( !pos.IsFullySpecified() ) + { + wxRect rectWin = wxRect(size).CentreIn(wxGetClientDisplayRect()); + + // The size of the window is often not really known yet, TLWs are often + // created with some small initial size and later are fitted to contain + // their children so centering the window will show it too much to the + // right and bottom, adjust for it by putting it more to the left and + // center. + rectWin.x /= 2; + rectWin.y /= 2; + + pos.SetDefaults(rectWin.GetPosition()); + } + // create frame. m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow ( @@ -132,7 +145,7 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, name ); wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ; - m_peer = wxWidgetImpl::CreateContentView(this); + SetPeer(wxWidgetImpl::CreateContentView(this)); DoSetWindowVariant( m_windowVariant ) ; @@ -165,7 +178,7 @@ void wxNonOwnedWindow::SubclassWin(WXWindow nativeWindow) m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, GetParent(), nativeWindow ); m_isNativeWindowWrapper = true; wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ; - m_peer = wxWidgetImpl::CreateContentView(this); + SetPeer(wxWidgetImpl::CreateContentView(this)); } void wxNonOwnedWindow::UnsubclassWin() @@ -177,7 +190,7 @@ void wxNonOwnedWindow::UnsubclassWin() wxNonOwnedWindowImpl::RemoveAssociations(m_nowpeer) ; wxDELETE(m_nowpeer); - wxDELETE(m_peer); + SetPeer(NULL); m_isNativeWindowWrapper = false; } @@ -455,8 +468,15 @@ void wxNonOwnedWindow::DoGetClientSize( int *width, int *height ) const return; int left, top, w, h; + // under iphone with a translucent status bar the m_nowpeer returns the + // inner area, while the content area extends under the translucent + // status bar, therefore we use the content view's area +#ifdef __WXOSX_IPHONE__ + GetPeer()->GetContentArea(left, top, w, h); +#else m_nowpeer->GetContentArea(left, top, w, h); - +#endif + if (width) *width = w ; if (height) @@ -478,25 +498,49 @@ WXWindow wxNonOwnedWindow::GetWXWindow() const // Shape implementation // --------------------------------------------------------------------------- - -bool wxNonOwnedWindow::DoSetShape(const wxRegion& region) +bool wxNonOwnedWindow::DoClearShape() { - wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false, - wxT("Shaped windows must be created with the wxFRAME_SHAPED style.")); + m_shape.Clear(); + + wxSize sz = GetClientSize(); + wxRegion region(0, 0, sz.x, sz.y); + + return m_nowpeer->SetShape(region); +} +bool wxNonOwnedWindow::DoSetRegionShape(const wxRegion& region) +{ m_shape = region; - // The empty region signifies that the shape - // should be removed from the window. - if ( region.IsEmpty() ) + return m_nowpeer->SetShape(region); +} + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/scopedptr.h" + +bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath& path) +{ + m_shapePath = path; + + // Convert the path to wxRegion by rendering the path on a window-sized + // bitmap, creating a mask from it and finally creating the region from + // this mask. + wxBitmap bmp(GetSize()); + { - wxSize sz = GetClientSize(); - wxRegion rgn(0, 0, sz.x, sz.y); - if ( rgn.IsEmpty() ) - return false ; - else - return DoSetShape(rgn); + wxMemoryDC dc(bmp); + dc.SetBackground(*wxBLACK); + dc.Clear(); + + wxScopedPtr context(wxGraphicsContext::Create(dc)); + context->SetBrush(*wxWHITE); + context->FillPath(m_shapePath); } - return m_nowpeer->SetShape(region); + bmp.SetMask(new wxMask(bmp, *wxBLACK)); + + return DoSetRegionShape(wxRegion(bmp)); } + +#endif // wxUSE_GRAPHICS_CONTEXT