X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/891d0563f7f43b640c4e0e78c30f038b2127fffb..993da3969b28e4f80b492cc26114fb0e151163cb:/src/cocoa/dcclient.mm diff --git a/src/cocoa/dcclient.mm b/src/cocoa/dcclient.mm index b5da8bd6c3..2f2f8ddf59 100644 --- a/src/cocoa/dcclient.mm +++ b/src/cocoa/dcclient.mm @@ -9,11 +9,19 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#include "wx/dcclient.h" -#include "wx/window.h" +#include "wx/wxprec.h" +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/window.h" + #include "wx/dcclient.h" +#endif //WX_PRECOMP #import #import +#import +#import +#import +#import /* * wxWindowDC @@ -21,18 +29,71 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) wxWindowDC::wxWindowDC(void) +: m_window(NULL) +, m_lockedNSView(NULL) { }; wxWindowDC::wxWindowDC( wxWindow *window ) +: m_window(window) +, m_lockedNSView(NULL) { - wxFAIL_MSG("non-client window DC's are not supported"); + wxLogDebug(wxT("non-client window DC's are not supported, oh well")); }; wxWindowDC::~wxWindowDC(void) { + CocoaUnwindStackAndLoseFocus(); }; +bool wxWindowDC::CocoaLockFocusOnNSView(WX_NSView nsview) +{ + if([nsview lockFocusIfCanDraw]) + { + sm_cocoaDCStack.Insert(this); + m_cocoaFlipped = [nsview isFlipped]; + m_cocoaHeight = [nsview bounds].size.height; + CocoaApplyTransformations(); + m_lockedNSView = nsview; + return true; + } + wxLogDebug(wxT("focus lock failed!")); + return false; +} + +bool wxWindowDC::CocoaUnlockFocusOnNSView() +{ + [[m_lockedNSView window] flushWindow]; + [m_lockedNSView unlockFocus]; + m_lockedNSView = NULL; + return true; +} + +bool wxWindowDC::CocoaLockFocus() +{ + wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxWindowDC=%p, NSView=%p"),this, m_window->GetNonClientNSView()); + return CocoaLockFocusOnNSView(m_window->GetNonClientNSView()); +} + +bool wxWindowDC::CocoaUnlockFocus() +{ + wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxWindowDC=%p, NSView=%p"),this, m_window->GetNonClientNSView()); + return CocoaUnlockFocusOnNSView(); +} + +void wxWindowDC::Clear() +{ + if(!CocoaTakeFocus()) return; + + NSGraphicsContext *context = [NSGraphicsContext currentContext]; + [context saveGraphicsState]; + + [m_backgroundBrush.GetNSColor() set]; + [NSBezierPath fillRect:[m_lockedNSView bounds]]; + + [context restoreGraphicsState]; +} + /* * wxClientDC */ @@ -44,12 +105,26 @@ wxClientDC::wxClientDC(void) wxClientDC::wxClientDC( wxWindow *window ) { + m_window = window; }; wxClientDC::~wxClientDC(void) { + CocoaUnwindStackAndLoseFocus(); }; +bool wxClientDC::CocoaLockFocus() +{ + wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxClientDC=%p, NSView=%p"),this, m_window->GetNSView()); + return CocoaLockFocusOnNSView(m_window->GetNSView()); +} + +bool wxClientDC::CocoaUnlockFocus() +{ + wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxClientDC=%p, NSView=%p"),this, m_window->GetNSView()); + return CocoaUnlockFocusOnNSView(); +} + /* * wxPaintDC */ @@ -61,32 +136,29 @@ wxPaintDC::wxPaintDC(void) wxPaintDC::wxPaintDC( wxWindow *window ) { - wxASSERT_MSG(!sm_focusedDC,"Found another wxDC with focus. Do not use wxPaintDC outside of paint handlers!"); - wxASSERT_MSG([NSView focusView]==window->GetNSView(), "PaintDC's NSView does not have focus. Please use wxPaintDC only as the first DC created in a paint handler"); - sm_focusedDC=this; - // This transform flips the graphics since wxDC uses top-left origin - if(![window->GetNSView() isFlipped]) - { - // The transform is auto released - NSAffineTransform *transform = [NSAffineTransform transform]; - /* x' = 1x + 0y + 0 - y' = 0x + -1y + window's height - */ - NSAffineTransformStruct matrix = { - 1, 0 - , 0, -1 - , 0, [window->GetNSView() bounds].size.height - }; - [transform setTransformStruct: matrix]; - // Apply the transform - [transform concat]; - } - // TODO: Apply scaling transformation + m_window = window; + wxASSERT_MSG([NSView focusView]==window->GetNSView(), wxT("PaintDC's NSView does not have focus. Please use wxPaintDC only as the first DC created in a paint handler")); + sm_cocoaDCStack.Insert(this); + m_lockedNSView = window->GetNSView(); + m_cocoaFlipped = [window->GetNSView() isFlipped]; + m_cocoaHeight = [window->GetNSView() bounds].size.height; + CocoaApplyTransformations(); }; wxPaintDC::~wxPaintDC(void) { - if(sm_focusedDC==this) - sm_focusedDC=NULL; + CocoaUnwindStackAndLoseFocus(); }; +bool wxPaintDC::CocoaLockFocus() +{ + wxFAIL_MSG(wxT("wxPaintDC cannot be asked to lock focus!")); + return false; +} + +bool wxPaintDC::CocoaUnlockFocus() +{ + // wxPaintDC focus can never be unlocked. + return false; +} +