X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fcc9de54786c9a42d20b6e3409083a34b4399f4b..cf6e135c04b80763bacd724493f23084b891a366:/src/cocoa/dcclient.mm diff --git a/src/cocoa/dcclient.mm b/src/cocoa/dcclient.mm index b1c9429f9a..cfa266129a 100644 --- a/src/cocoa/dcclient.mm +++ b/src/cocoa/dcclient.mm @@ -11,9 +11,14 @@ #include "wx/dcclient.h" #include "wx/window.h" +#include "wx/log.h" #import #import +#import +#import +#import +#import /* * wxWindowDC @@ -35,6 +40,19 @@ wxWindowDC::~wxWindowDC(void) { }; +void wxWindowDC::Clear() +{ + wxASSERT(m_window); + + NSGraphicsContext *context = [NSGraphicsContext currentContext]; + [context saveGraphicsState]; + + [m_backgroundBrush.GetNSColor() set]; + [NSBezierPath fillRect:[m_window->GetNSView() bounds]]; + + [context restoreGraphicsState]; +} + /* * wxClientDC */ @@ -45,14 +63,38 @@ wxClientDC::wxClientDC(void) }; wxClientDC::wxClientDC( wxWindow *window ) -: wxWindowDC(window) { + m_window = window; }; wxClientDC::~wxClientDC(void) { + CocoaUnwindStackAndLoseFocus(); }; +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; +} + +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; +} + /* * wxPaintDC */ @@ -63,30 +105,29 @@ wxPaintDC::wxPaintDC(void) }; wxPaintDC::wxPaintDC( wxWindow *window ) -: wxWindowDC(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"); - // 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 + sm_cocoaDCStack.Insert(this); + m_cocoaFlipped = [window->GetNSView() isFlipped]; + m_cocoaHeight = [window->GetNSView() bounds].size.height; + CocoaApplyTransformations(); }; wxPaintDC::~wxPaintDC(void) { + CocoaUnwindStackAndLoseFocus(); }; +bool wxPaintDC::CocoaLockFocus() +{ + wxFAIL_MSG("wxPaintDC cannot be asked to lock focus!"); + return false; +} + +bool wxPaintDC::CocoaUnlockFocus() +{ + // wxPaintDC focus can never be unlocked. + return false; +} +