X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3f562374f11048ff0005b7229683b3804d2208d2..c43430bbacbf26414693fcf47fe54a8090c6bfcb:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 5b677218c7..c6a369eb14 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -124,14 +124,14 @@ void wxWindowBase::InitBase() #endif // wxUSE_VALIDATORS // use the system default colours - m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE); - m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT); + m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); + m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); // don't set the font here for wxMSW as we don't call WM_SETFONT here and // so the font is *not* really set - but calls to SetFont() later won't do // anything because m_font appears to be already set! #ifndef __WXMSW__ - m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT); + m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); #endif // __WXMSW__ // the colours/fonts are default for now @@ -214,6 +214,8 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, // common clean up wxWindowBase::~wxWindowBase() { + wxASSERT_MSG( GetCapture() != this, wxT("attempt to destroy window with mouse capture") ); + // FIXME if these 2 cases result from programming errors in the user code // we should probably assert here instead of silently fixing them @@ -1612,3 +1614,52 @@ wxHitTest wxWindowBase::DoHitTest(wxCoord x, wxCoord y) const return outside ? wxHT_WINDOW_OUTSIDE : wxHT_WINDOW_INSIDE; } +// ---------------------------------------------------------------------------- +// mouse capture +// ---------------------------------------------------------------------------- + +struct WXDLLEXPORT wxWindowNext +{ + wxWindow *win; + wxWindowNext *next; +} *wxWindowBase::ms_winCaptureNext = NULL; + +void wxWindowBase::CaptureMouse() +{ + wxLogTrace(_T("mousecapture"), _T("CaptureMouse(0x%08x)"), this); + + wxWindow *winOld = GetCapture(); + if ( winOld ) + { + // save it on stack + wxWindowNext *item = new wxWindowNext; + item->win = winOld; + item->next = ms_winCaptureNext; + ms_winCaptureNext = item; + } + //else: no mouse capture to save + + DoCaptureMouse(); +} + +void wxWindowBase::ReleaseMouse() +{ + wxLogTrace(_T("mousecapture"), _T("ReleaseMouse(0x%08x)"), this); + + DoReleaseMouse(); + + if ( ms_winCaptureNext ) + { + ms_winCaptureNext->win->CaptureMouse(); + + wxWindowNext *item = ms_winCaptureNext; + ms_winCaptureNext = item->next; + delete item; + } + //else: stack is empty, no previous capture + + wxLogTrace(_T("mousecapture"), + _T("After ReleaseMouse() mouse is captured by 0x%08x"), + GetCapture()); +} +