X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77eb08cc360e877cc79dafc18bd295bc2613266a..9e9574fe45b176ee74bba8fad7574cf9906145d1:/src/osx/nonownedwnd_osx.cpp diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index 653e1a18d6..0828348eb1 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of wxNonOwnedWindow // Author: Stefan Csomor // Created: 2008-03-24 -// RCS-ID: $Id: nonownedwnd.cpp 50329 2007-11-29 17:00:58Z VS $ // Copyright: (c) Stefan Csomor 2008 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,6 +12,7 @@ #ifndef WX_PRECOMP #include "wx/app.h" + #include "wx/dcmemory.h" #include "wx/log.h" #endif // WX_PRECOMP @@ -38,6 +38,8 @@ wxWindow* g_MacLastWindow = NULL ; +clock_t wxNonOwnedWindow::s_lastFlush = 0; + // unified title and toolbar constant - not in Tiger headers, so we duplicate it here #define kWindowUnifiedTitleAndToolbarAttribute (1 << 7) @@ -52,14 +54,14 @@ static MacWindowMap wxWinMacWindowList; wxNonOwnedWindow* wxNonOwnedWindow::GetFromWXWindow( WXWindow win ) { wxNonOwnedWindowImpl* impl = wxNonOwnedWindowImpl::FindFromWXWindow(win); - + return ( impl != NULL ? impl->GetWXPeer() : NULL ) ; } wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::FindFromWXWindow (WXWindow window) { MacWindowMap::iterator node = wxWinMacWindowList.find(window); - + return (node == wxWinMacWindowList.end()) ? NULL : node->second; } @@ -81,7 +83,7 @@ void wxNonOwnedWindowImpl::Associate( WXWindow window, wxNonOwnedWindowImpl *imp // adding NULL WindowRef is (first) surely a result of an error and // nothing else :-) wxCHECK_RET( window != (WXWindow) NULL, wxT("attempt to add a NULL WindowRef to window list") ); - + wxWinMacWindowList[window] = impl; } @@ -115,14 +117,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 +146,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 ) ; @@ -151,9 +165,9 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow) { if ( parent ) parent->AddChild(this); - + SubclassWin(nativeWindow); - + return true; } @@ -165,7 +179,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() @@ -174,10 +188,10 @@ void wxNonOwnedWindow::UnsubclassWin() if ( GetParent() ) GetParent()->RemoveChild(this); - - wxNonOwnedWindowImpl::RemoveAssociations(m_nowpeer) ; + + wxNonOwnedWindowImpl::RemoveAssociations(m_nowpeer) ; wxDELETE(m_nowpeer); - wxDELETE(m_peer); + SetPeer(NULL); m_isNativeWindowWrapper = false; } @@ -200,7 +214,7 @@ wxNonOwnedWindow::~wxNonOwnedWindow() bool wxNonOwnedWindow::Destroy() { WillBeDestroyed(); - + return wxWindow::Destroy(); } @@ -234,9 +248,7 @@ bool wxNonOwnedWindow::OSXShowWithEffect(bool show, { // as apps expect a size event to occur when the window is shown, // generate one when it is shown with effect too - wxSizeEvent event(GetSize(), m_windowId); - event.SetEventObject(this); - HandleWindowEvent(event); + SendSizeEvent(); } return true; @@ -266,9 +278,9 @@ void wxNonOwnedWindow::SetWindowStyleFlag(long flags) { if (flags == GetWindowStyleFlag()) return; - + wxWindow::SetWindowStyleFlag(flags); - + if (m_nowpeer) m_nowpeer->SetWindowStyleFlag(flags); } @@ -294,12 +306,9 @@ void wxNonOwnedWindow::HandleActivated( double timestampsec, bool didActivate ) HandleWindowEvent(wxevent); } -void wxNonOwnedWindow::HandleResized( double timestampsec ) +void wxNonOwnedWindow::HandleResized( double WXUNUSED(timestampsec) ) { - wxSizeEvent wxevent( GetSize() , GetId()); - wxevent.SetTimestamp( (int) (timestampsec * 1000) ); - wxevent.SetEventObject( this ); - HandleWindowEvent(wxevent); + SendSizeEvent(); // we have to inform some controls that have to reset things // relative to the toplevel window (e.g. OpenGL buffers) wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified @@ -370,9 +379,7 @@ bool wxNonOwnedWindow::Show(bool show) if ( show ) { // because apps expect a size event to occur at this moment - wxSizeEvent event(GetSize() , m_windowId); - event.SetEventObject(this); - HandleWindowEvent(event); + SendSizeEvent(); } return true ; @@ -455,7 +462,14 @@ 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 ; @@ -463,10 +477,18 @@ void wxNonOwnedWindow::DoGetClientSize( int *width, int *height ) const *height = h ; } +void wxNonOwnedWindow::WindowWasPainted() +{ + s_lastFlush = clock(); +} void wxNonOwnedWindow::Update() { - m_nowpeer->Update(); + if ( clock() - s_lastFlush > CLOCKS_PER_SEC / 30 ) + { + s_lastFlush = clock(); + m_nowpeer->Update(); + } } WXWindow wxNonOwnedWindow::GetWXWindow() const @@ -478,25 +500,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