X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/30c841c84dce46690499567141b98ffcf5a61b6a..bbd92d1dbea02db8c28e9c17bfacc0563d855b25:/src/mac/carbon/overlay.cpp diff --git a/src/mac/carbon/overlay.cpp b/src/mac/carbon/overlay.cpp index e1bb6db9b9..1a03d6e1a8 100644 --- a/src/mac/carbon/overlay.cpp +++ b/src/mac/carbon/overlay.cpp @@ -25,9 +25,14 @@ #endif #include "wx/overlay.h" + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" +#endif + #include "wx/private/overlay.h" -#if wxHAS_NATIVE_OVERLAY +#ifdef wxHAS_NATIVE_OVERLAY // ============================================================================ // implementation @@ -45,19 +50,25 @@ wxOverlayImpl::~wxOverlayImpl() Reset(); } -bool wxOverlayImpl::IsOk() +bool wxOverlayImpl::IsOk() { return m_overlayWindow != NULL ; } void wxOverlayImpl::MacGetBounds( Rect *bounds ) { - wxPoint origin(0,0); - origin = m_window->ClientToScreen( origin ); - bounds->top = origin.y; - bounds->left = origin.x; - bounds->bottom = origin.y+m_y+m_height; - bounds->right = origin.x+m_x+m_width; + int x, y; + x=y=0; + m_window->MacWindowToRootWindow( &x , &y ) ; + WindowRef window = (WindowRef) m_window->MacGetTopLevelWindowRef() ; + + Point localwhere = { y, x }; + wxMacLocalToGlobal( window, &localwhere ) ; + + bounds->top = localwhere.v+m_y; + bounds->left = localwhere.h+m_x; + bounds->bottom = localwhere.v+m_y+m_height; + bounds->right = localwhere.h+m_x+m_width; } OSStatus wxOverlayImpl::CreateOverlayWindow() @@ -65,78 +76,85 @@ OSStatus wxOverlayImpl::CreateOverlayWindow() OSStatus err; WindowAttributes overlayAttributes = kWindowIgnoreClicksAttribute; - - if ( m_window ) - { - m_overlayParentWindow =(WindowRef) m_window->MacGetTopLevelWindowRef(); - - Rect bounds ; - MacGetBounds(&bounds); - err = CreateNewWindow( kOverlayWindowClass, overlayAttributes, &bounds, &m_overlayWindow ); - if ( err == noErr ) - { - SetWindowGroup( m_overlayWindow, GetWindowGroup(m_overlayParentWindow)); // Put them in the same group so that their window layers are consistent - } - } - else - { - m_overlayParentWindow = NULL ; - CGRect cgbounds ; - cgbounds = CGDisplayBounds(CGMainDisplayID()); - Rect bounds; - bounds.top = cgbounds.origin.y; - bounds.left = cgbounds.origin.x; - bounds.bottom = bounds.top + cgbounds.size.height; - bounds.right = bounds.left + cgbounds.size.width; - err = CreateNewWindow( kOverlayWindowClass, overlayAttributes, &bounds, &m_overlayWindow ); - } - ShowWindow(m_overlayWindow); - return err; + + if ( m_window ) + { + m_overlayParentWindow =(WindowRef) m_window->MacGetTopLevelWindowRef(); + + Rect bounds ; + MacGetBounds(&bounds); + err = CreateNewWindow( kOverlayWindowClass, overlayAttributes, &bounds, &m_overlayWindow ); + if ( err == noErr ) + { + SetWindowGroup( m_overlayWindow, GetWindowGroup(m_overlayParentWindow)); // Put them in the same group so that their window layers are consistent + } + } + else + { + m_overlayParentWindow = NULL ; + CGRect cgbounds ; + cgbounds = CGDisplayBounds(CGMainDisplayID()); + Rect bounds; + bounds.top = (short)cgbounds.origin.y; + bounds.left = (short)cgbounds.origin.x; + bounds.bottom = (short)(bounds.top + cgbounds.size.height); + bounds.right = (short)(bounds.left + cgbounds.size.width); + err = CreateNewWindow( kOverlayWindowClass, overlayAttributes, &bounds, &m_overlayWindow ); + } + ShowWindow(m_overlayWindow); + return err; } -void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height ) +void wxOverlayImpl::Init( wxDC* dc, int x , int y , int width , int height ) { wxASSERT_MSG( !IsOk() , _("You cannot Init an overlay twice") ); - m_window = dc->GetWindow(); + m_window = dc->GetWindow(); m_x = x ; m_y = y ; + if ( dc->IsKindOf( CLASSINFO( wxClientDC ) )) + { + wxPoint origin = m_window->GetClientAreaOrigin(); + m_x += origin.x; + m_y += origin.y; + } m_width = width ; m_height = height ; - + OSStatus err = CreateOverlayWindow(); wxASSERT_MSG( err == noErr , _("Couldn't create the overlay window") ); #ifndef __LP64__ err = QDBeginCGContext(GetWindowPort(m_overlayWindow), &m_overlayContext); #endif - CGContextTranslateCTM( m_overlayContext, 0, m_height+m_y ); + CGContextTranslateCTM( m_overlayContext, 0, m_height ); CGContextScaleCTM( m_overlayContext, 1, -1 ); + CGContextTranslateCTM( m_overlayContext, -m_x , -m_y ); wxASSERT_MSG( err == noErr , _("Couldn't init the context on the overlay window") ); } -void wxOverlayImpl::BeginDrawing( wxWindowDC* dc) +void wxOverlayImpl::BeginDrawing( wxDC* dc) { -// TODO CS - dc->SetGraphicsContext( wxGraphicsContext::CreateFromNative( m_overlayContext ) ); -/* - delete dc->m_graphicContext ; - dc->m_graphicContext = new wxMacCGContext( m_overlayContext ); - // we are right now startin at 0,0 not at the wxWindow's origin, so most of the calculations - // int dc are already corect - // just to make sure : - dc->m_macLocalOrigin.x = 0 ; - dc->m_macLocalOrigin.y = 0 ; - */ - wxSize size = dc->GetSize() ; - dc->SetClippingRegion( 0 , 0 , size.x , size.y ) ; + wxDCImpl *impl = dc->GetImpl(); + wxWindowDCImpl *win_impl = wxDynamicCast(impl,wxWindowDCImpl); + if (win_impl) + { + win_impl->SetGraphicsContext( wxGraphicsContext::CreateFromNative( m_overlayContext ) ); + wxSize size = dc->GetSize() ; + dc->SetClippingRegion( 0 , 0 , size.x , size.y ) ; + } } -void wxOverlayImpl::EndDrawing( wxWindowDC* dc) +void wxOverlayImpl::EndDrawing( wxDC* dc) { - dc->SetGraphicsContext(NULL); + wxDCImpl *impl = dc->GetImpl(); + wxWindowDCImpl *win_impl = wxDynamicCast(impl,wxWindowDCImpl); + if (win_impl) + win_impl->SetGraphicsContext(NULL); + + CGContextFlush( m_overlayContext ); } -void wxOverlayImpl::Clear(wxWindowDC* dc) +void wxOverlayImpl::Clear(wxDC* WXUNUSED(dc)) { wxASSERT_MSG( IsOk() , _("You cannot Clear an overlay that is not inited") ); CGRect box = CGRectMake( m_x - 1, m_y - 1 , m_width + 2 , m_height + 2 ); @@ -152,8 +170,8 @@ void wxOverlayImpl::Reset() wxASSERT_MSG( err == noErr , _("Couldn't end the context on the overlay window") ); #endif m_overlayContext = NULL ; - } - + } + // todo : don't dispose, only hide and reposition on next run if (m_overlayWindow) {