X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4857f07f517cd9a73a33311a52286e9beb72239b..80a779275ae04443c568dca919adb26cf6f5002c:/src/common/dcbase.cpp diff --git a/src/common/dcbase.cpp b/src/common/dcbase.cpp index ee35fd08b6..84ac42aa3c 100644 --- a/src/common/dcbase.cpp +++ b/src/common/dcbase.cpp @@ -25,6 +25,7 @@ #endif #include "wx/dc.h" +#include "wx/dcbuffer.h" // for IMPLEMENT_DYNAMIC_CLASS #ifndef WX_PRECOMP #include "wx/math.h" @@ -38,6 +39,9 @@ IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject) // implementation // ============================================================================ +IMPLEMENT_DYNAMIC_CLASS(wxBufferedDC, wxMemoryDC) +IMPLEMENT_ABSTRACT_CLASS(wxBufferedPaintDC, wxBufferedDC) + #if WXWIN_COMPATIBILITY_2_6 void wxDCBase::BeginDrawing() { @@ -1192,12 +1196,6 @@ private: // we store the window in case we would have to issue a Refresh() wxWindow* m_window ; - EventHandlerRef m_overlayParentHandler ; - EventHandlerRef m_overlayHandler; - - static pascal OSStatus OverlayParentWindowEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ); - static pascal OSStatus OverlayWindowEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ); - int m_x ; int m_y ; int m_width ; @@ -1218,61 +1216,7 @@ wxOverlayImpl::~wxOverlayImpl() bool wxOverlayImpl::IsOk() { - return m_overlayContext != NULL ; -} - -pascal OSStatus wxOverlayImpl::OverlayWindowEventHandlerProc( EventHandlerCallRef WXUNUSED(inCallRef), EventRef inEvent, void* inUserData ) -{ - OSStatus err = noErr ; - wxOverlayImpl* self = (wxOverlayImpl*) inUserData; - - wxMacCarbonEvent cEvent(inEvent) ; - switch( cEvent.GetClass() ) - { - case kEventClassWindow: - switch( cEvent.GetKind() ) - { - case kEventWindowBoundsChanged: - break; - default : - break; - } - break ; - default : - break ; - } - // as we didn't interfere with the event itself, always return a notHandled - return eventNotHandledErr ; -} - -pascal OSStatus wxOverlayImpl::OverlayParentWindowEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ) -{ - OSStatus err = eventNotHandledErr ; - wxOverlayImpl* self = (wxOverlayImpl*) inUserData; - - wxMacCarbonEvent cEvent(inEvent) ; - switch( cEvent.GetClass() ) - { - case kEventClassWindow: - switch( cEvent.GetKind() ) - { - case kEventWindowBoundsChanging: - case kEventWindowBoundsChanged: - { - err = CallNextEventHandler(inCallRef,inEvent); - Rect bounds ; - self->MacGetBounds(&bounds); - SetWindowBounds(self->m_overlayWindow,kWindowContentRgn,&bounds); - } - break; - default : - break; - } - break ; - default : - break ; - } - return err ; + return m_overlayWindow != NULL ; } void wxOverlayImpl::MacGetBounds( Rect *bounds ) @@ -1289,27 +1233,8 @@ OSStatus wxOverlayImpl::CreateOverlayWindow() { OSStatus err; - WindowAttributes overlayAttributes = kWindowHideOnSuspendAttribute | kWindowIgnoreClicksAttribute; - - static EventHandlerUPP overlayWindowEventHandlerUPP = NULL ; - static EventHandlerUPP overlayParentWindowEventHandlerUPP = NULL ; - const EventTypeSpec windowEvents[] = - { - { kEventClassWindow, kEventWindowBoundsChanged }, - }; - - const EventTypeSpec parentWindowEvents[] = - { - { kEventClassWindow, kEventWindowBoundsChanged }, - { kEventClassWindow, kEventWindowBoundsChanging }, - }; - - if ( overlayWindowEventHandlerUPP == NULL ) - overlayWindowEventHandlerUPP = NewEventHandlerUPP( OverlayWindowEventHandlerProc ); - if ( overlayParentWindowEventHandlerUPP == NULL ) - - overlayParentWindowEventHandlerUPP = NewEventHandlerUPP( OverlayParentWindowEventHandlerProc ); - + WindowAttributes overlayAttributes = kWindowIgnoreClicksAttribute; + m_overlayParentWindow =(WindowRef) m_window->MacGetTopLevelWindowRef(); Rect bounds ; @@ -1317,10 +1242,8 @@ OSStatus wxOverlayImpl::CreateOverlayWindow() 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 - err = InstallWindowEventHandler( m_overlayWindow, overlayWindowEventHandlerUPP, GetEventTypeCount(windowEvents), windowEvents, this, &m_overlayHandler ); - if ( err == noErr ) - err = InstallWindowEventHandler( m_overlayParentWindow, overlayParentWindowEventHandlerUPP, GetEventTypeCount(parentWindowEvents), parentWindowEvents, this, &m_overlayParentHandler ); + SetWindowGroup( m_overlayWindow, GetWindowGroup(m_overlayParentWindow)); // Put them in the same group so that their window layers are consistent + ShowWindow(m_overlayWindow); } return err; } @@ -1337,9 +1260,9 @@ void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height OSStatus err = CreateOverlayWindow(); wxASSERT_MSG( err == noErr , _("Couldn't create the overlay window") ); - ShowWindow(m_overlayWindow); - +#ifndef __LP64__ err = QDBeginCGContext(GetWindowPort(m_overlayWindow), &m_overlayContext); +#endif CGContextTranslateCTM( m_overlayContext, 0, m_height+m_y ); CGContextScaleCTM( m_overlayContext, 1, -1 ); wxASSERT_MSG( err == noErr , _("Couldn't init the context on the overlay window") ); @@ -1360,34 +1283,32 @@ void wxOverlayImpl::BeginDrawing( wxWindowDC* dc) void wxOverlayImpl::EndDrawing( wxWindowDC* dc) { + delete dc->m_graphicContext ; + dc->m_graphicContext = NULL ; + } void wxOverlayImpl::Clear(wxWindowDC* dc) { wxASSERT_MSG( IsOk() , _("You cannot Clear an overlay that is not inited") ); - delete dc->m_graphicContext ; - dc->m_graphicContext = NULL ; - - Reset(); + CGRect box = CGRectMake( m_x - 1, m_y - 1 , m_width + 2 , m_height + 2 ); + CGContextClearRect( m_overlayContext, box ); } void wxOverlayImpl::Reset() { if ( m_overlayContext ) { +#ifndef __LP64__ OSStatus err = QDEndCGContext(GetWindowPort(m_overlayWindow), &m_overlayContext); 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) { - RemoveEventHandler( m_overlayParentHandler ) ; - m_overlayParentHandler = NULL; - RemoveEventHandler( m_overlayHandler ) ; - m_overlayHandler = NULL; DisposeWindow(m_overlayWindow); m_overlayWindow = NULL ; }