X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fe8f794343fc22d3da1e6f003fdd754d2bdf9339..795b0f144495454aac0dc23e865f7a8f87f6dfa3:/src/cocoa/dcclient.mm diff --git a/src/cocoa/dcclient.mm b/src/cocoa/dcclient.mm index cfa266129a..c22214c824 100644 --- a/src/cocoa/dcclient.mm +++ b/src/cocoa/dcclient.mm @@ -6,12 +6,15 @@ // Created: 2003/04/01 // RCS-ID: $Id$ // Copyright: (c) 2003 David Elliott -// Licence: wxWindows license +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// -#include "wx/dcclient.h" -#include "wx/window.h" -#include "wx/log.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 @@ -27,30 +30,68 @@ 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(); }; -void wxWindowDC::Clear() +bool wxWindowDC::CocoaLockFocusOnNSView(WX_NSView nsview) { - wxASSERT(m_window); + if([nsview lockFocusIfCanDraw]) + { + sm_cocoaDCStack.Insert(this); + CocoaApplyTransformations(); + m_lockedNSView = nsview; + return true; + } + wxLogDebug(wxT("focus lock failed!")); + return false; +} - NSGraphicsContext *context = [NSGraphicsContext currentContext]; - [context saveGraphicsState]; +bool wxWindowDC::CocoaUnlockFocusOnNSView() +{ + [[m_lockedNSView window] flushWindow]; + [m_lockedNSView unlockFocus]; + m_lockedNSView = NULL; + return true; +} - [m_backgroundBrush.GetNSColor() set]; - [NSBezierPath fillRect:[m_window->GetNSView() bounds]]; +bool wxWindowDC::CocoaLockFocus() +{ + wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxWindowDC=%p, NSView=%p"),this, m_window->GetNonClientNSView()); + NSAffineTransform *newTransform = CocoaGetWxToBoundsTransform([m_window->GetNonClientNSView() isFlipped], [m_window->GetNonClientNSView() bounds].size.height); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; + return CocoaLockFocusOnNSView(m_window->GetNonClientNSView()); +} - [context restoreGraphicsState]; +bool wxWindowDC::CocoaUnlockFocus() +{ + wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxWindowDC=%p, NSView=%p"),this, m_window->GetNonClientNSView()); + return CocoaUnlockFocusOnNSView(); +} + +bool wxWindowDC::CocoaGetBounds(void *rectData) +{ + if(!rectData) + return false; + if(!m_lockedNSView) + return false; + NSRect *pRect = (NSRect*)rectData; + *pRect = [m_lockedNSView bounds]; + return true; } /* @@ -74,25 +115,18 @@ wxClientDC::~wxClientDC(void) bool wxClientDC::CocoaLockFocus() { - wxLogDebug("Locking focus on wxClientDC=%p, NSView=%p",this, m_window->GetNSView()); - if([m_window->GetNSView() lockFocusIfCanDraw]) - { - sm_cocoaDCStack.Insert(this); - m_cocoaFlipped = [m_window->GetNSView() isFlipped]; - m_cocoaHeight = [m_window->GetNSView() bounds].size.height; - CocoaApplyTransformations(); - return true; - } - wxLogDebug("focus lock failed!"); - return false; + wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxClientDC=%p, NSView=%p"),this, m_window->GetNSView()); + NSAffineTransform *newTransform = m_window->CocoaGetWxToBoundsTransform(); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; + return CocoaLockFocusOnNSView(m_window->GetNSView()); } bool wxClientDC::CocoaUnlockFocus() { - wxLogDebug("Unlocking focus on wxClientDC=%p, NSView=%p",this, m_window->GetNSView()); - [[m_window->GetNSView() window] flushWindow]; - [m_window->GetNSView() unlockFocus]; - return true; + wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxClientDC=%p, NSView=%p"),this, m_window->GetNSView()); + return CocoaUnlockFocusOnNSView(); } /* @@ -107,10 +141,13 @@ wxPaintDC::wxPaintDC(void) wxPaintDC::wxPaintDC( wxWindow *window ) { m_window = window; - 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"); + 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_cocoaFlipped = [window->GetNSView() isFlipped]; - m_cocoaHeight = [window->GetNSView() bounds].size.height; + m_lockedNSView = window->GetNSView(); + NSAffineTransform *newTransform = window->CocoaGetWxToBoundsTransform(); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; CocoaApplyTransformations(); }; @@ -121,7 +158,7 @@ wxPaintDC::~wxPaintDC(void) bool wxPaintDC::CocoaLockFocus() { - wxFAIL_MSG("wxPaintDC cannot be asked to lock focus!"); + wxFAIL_MSG(wxT("wxPaintDC cannot be asked to lock focus!")); return false; }