From 49b489e80f11e0a6f23116a8e16a8138948e11af Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 28 Apr 2012 22:24:43 +0000 Subject: [PATCH] Fix erasing wxHtmlWindow background in wxUniv. Prevent the default wxWindow-level wxEVT_ERASE_BACKGROUND handler from being used in wxUniv for wxHtmlWindow. This is unnecessary as it has its own handler anyhow and also doesn't work for some reason as erasing wxMemoryDC by drawing a solid rectangle over it seems to be broken in at least wxX11. Work around this problem by erasing the background in wxHtmlWindow itself if no user-defined (as opposed to any, including one defined in wxWindow itself) handler for this event exists. Closes #13880. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71300 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmlwin.h | 5 +++++ src/html/htmlwin.cpp | 26 +++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h index 580dbbca9b..b95e7d6267 100644 --- a/include/wx/html/htmlwin.h +++ b/include/wx/html/htmlwin.h @@ -403,6 +403,7 @@ protected: void CreateLayout(); void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); void OnSize(wxSizeEvent& event); void OnMouseMove(wxMouseEvent& event); void OnMouseDown(wxMouseEvent& event); @@ -545,6 +546,10 @@ private: // if this FLAG is false, items are not added to history bool m_HistoryOn; + // Flag used to communicate between OnPaint() and OnEraseBackground(), see + // the comments near its use. + bool m_isBgReallyErased; + // standard mouse cursors static wxCursor *ms_cursorLink; static wxCursor *ms_cursorText; diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 7496fa4fd1..22ac09f009 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -1102,6 +1102,19 @@ void wxHtmlWindow::DoEraseBackground(wxDC& dc) } } +void wxHtmlWindow::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) +{ + // We never get real erase background events as we changed our background + // style to wxBG_STYLE_PAINT in our ctor so the only time when we get here + // is when an artificial wxEraseEvent is generated by our own OnPaint() + // below. This handler only exists to stop the event from propagating + // downwards to wxWindow which may erase the background itself when it gets + // it in some ports (currently this happens in wxUniv), so we simply stop + // processing here and set a special flag allowing OnPaint() to see that + // the event hadn't been really processed. + m_isBgReallyErased = false; +} + void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dcPaint(this); @@ -1134,11 +1147,17 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) PrepareDC(*dc); - // erase the background: for compatibility, we must generate the event to - // allow the user-defined handlers to do it + // Erase the background: for compatibility, we must generate the event to + // allow the user-defined handlers to do it, hence this hack with sending + // an artificial wxEraseEvent to trigger the execution of such handlers. wxEraseEvent eraseEvent(GetId(), dc); eraseEvent.SetEventObject(this); - if ( !ProcessWindowEvent(eraseEvent) ) + + // Hack inside a hack: the background wasn't really erased if our own + // OnEraseBackground() was executed, so we need to check for the flag set + // by it whenever it's called. + m_isBgReallyErased = true; // Initially assume it wasn't. + if ( !ProcessWindowEvent(eraseEvent) || !m_isBgReallyErased ) { // erase background ourselves DoEraseBackground(*dc); @@ -1669,6 +1688,7 @@ BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow) EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp) EVT_MOTION(wxHtmlWindow::OnMouseMove) EVT_PAINT(wxHtmlWindow::OnPaint) + EVT_ERASE_BACKGROUND(wxHtmlWindow::OnEraseBackground) #if wxUSE_CLIPBOARD EVT_LEFT_DCLICK(wxHtmlWindow::OnDoubleClick) EVT_ENTER_WINDOW(wxHtmlWindow::OnMouseEnter)