Implement (sort-of) non-client wxWindowDC
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23428 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -31,6 +31,12 @@ public:
|
|||||||
virtual void Clear();
|
virtual void Clear();
|
||||||
protected:
|
protected:
|
||||||
wxWindow *m_window;
|
wxWindow *m_window;
|
||||||
|
WX_NSView m_lockedNSView;
|
||||||
|
// DC stack
|
||||||
|
virtual bool CocoaLockFocus();
|
||||||
|
virtual bool CocoaUnlockFocus();
|
||||||
|
bool CocoaLockFocusOnNSView(WX_NSView nsview);
|
||||||
|
bool CocoaUnlockFocusOnNSView();
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxClientDC: public wxWindowDC
|
class wxClientDC: public wxWindowDC
|
||||||
|
@@ -30,28 +30,66 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
|
|||||||
|
|
||||||
wxWindowDC::wxWindowDC(void)
|
wxWindowDC::wxWindowDC(void)
|
||||||
: m_window(NULL)
|
: m_window(NULL)
|
||||||
|
, m_lockedNSView(NULL)
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
wxWindowDC::wxWindowDC( wxWindow *window )
|
wxWindowDC::wxWindowDC( wxWindow *window )
|
||||||
: m_window(window)
|
: m_window(window)
|
||||||
|
, m_lockedNSView(NULL)
|
||||||
{
|
{
|
||||||
wxFAIL_MSG("non-client window DC's are not supported");
|
wxLogDebug("non-client window DC's are not supported, oh well");
|
||||||
};
|
};
|
||||||
|
|
||||||
wxWindowDC::~wxWindowDC(void)
|
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("focus lock failed!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWindowDC::CocoaUnlockFocusOnNSView()
|
||||||
|
{
|
||||||
|
[[m_lockedNSView window] flushWindow];
|
||||||
|
[m_lockedNSView unlockFocus];
|
||||||
|
m_lockedNSView = NULL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWindowDC::CocoaLockFocus()
|
||||||
|
{
|
||||||
|
wxLogDebug("Locking focus on wxWindowDC=%p, NSView=%p",this, m_window->GetNonClientNSView());
|
||||||
|
return CocoaLockFocusOnNSView(m_window->GetNonClientNSView());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWindowDC::CocoaUnlockFocus()
|
||||||
|
{
|
||||||
|
wxLogDebug("Unlocking focus on wxWindowDC=%p, NSView=%p",this, m_window->GetNonClientNSView());
|
||||||
|
return CocoaUnlockFocusOnNSView();
|
||||||
|
}
|
||||||
|
|
||||||
void wxWindowDC::Clear()
|
void wxWindowDC::Clear()
|
||||||
{
|
{
|
||||||
wxASSERT(m_window);
|
if(!CocoaTakeFocus()) return;
|
||||||
|
|
||||||
NSGraphicsContext *context = [NSGraphicsContext currentContext];
|
NSGraphicsContext *context = [NSGraphicsContext currentContext];
|
||||||
[context saveGraphicsState];
|
[context saveGraphicsState];
|
||||||
|
|
||||||
[m_backgroundBrush.GetNSColor() set];
|
[m_backgroundBrush.GetNSColor() set];
|
||||||
[NSBezierPath fillRect:[m_window->GetNSView() bounds]];
|
[NSBezierPath fillRect:[m_lockedNSView bounds]];
|
||||||
|
|
||||||
[context restoreGraphicsState];
|
[context restoreGraphicsState];
|
||||||
}
|
}
|
||||||
@@ -78,24 +116,13 @@ wxClientDC::~wxClientDC(void)
|
|||||||
bool wxClientDC::CocoaLockFocus()
|
bool wxClientDC::CocoaLockFocus()
|
||||||
{
|
{
|
||||||
wxLogDebug("Locking focus on wxClientDC=%p, NSView=%p",this, m_window->GetNSView());
|
wxLogDebug("Locking focus on wxClientDC=%p, NSView=%p",this, m_window->GetNSView());
|
||||||
if([m_window->GetNSView() lockFocusIfCanDraw])
|
return CocoaLockFocusOnNSView(m_window->GetNSView());
|
||||||
{
|
|
||||||
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()
|
bool wxClientDC::CocoaUnlockFocus()
|
||||||
{
|
{
|
||||||
wxLogDebug("Unlocking focus on wxClientDC=%p, NSView=%p",this, m_window->GetNSView());
|
wxLogDebug("Unlocking focus on wxClientDC=%p, NSView=%p",this, m_window->GetNSView());
|
||||||
[[m_window->GetNSView() window] flushWindow];
|
return CocoaUnlockFocusOnNSView();
|
||||||
[m_window->GetNSView() unlockFocus];
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -112,6 +139,7 @@ wxPaintDC::wxPaintDC( wxWindow *window )
|
|||||||
m_window = 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(), "PaintDC's NSView does not have focus. Please use wxPaintDC only as the first DC created in a paint handler");
|
||||||
sm_cocoaDCStack.Insert(this);
|
sm_cocoaDCStack.Insert(this);
|
||||||
|
m_lockedNSView = window->GetNSView();
|
||||||
m_cocoaFlipped = [window->GetNSView() isFlipped];
|
m_cocoaFlipped = [window->GetNSView() isFlipped];
|
||||||
m_cocoaHeight = [window->GetNSView() bounds].size.height;
|
m_cocoaHeight = [window->GetNSView() bounds].size.height;
|
||||||
CocoaApplyTransformations();
|
CocoaApplyTransformations();
|
||||||
|
Reference in New Issue
Block a user