]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix erasing wxHtmlWindow background in wxUniv.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 28 Apr 2012 22:24:43 +0000 (22:24 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 28 Apr 2012 22:24:43 +0000 (22:24 +0000)
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
src/html/htmlwin.cpp

index 580dbbca9bdeca45939765fe498becbbb0823580..b95e7d6267242726edadd0aff2b35f3682c5a1a4 100644 (file)
@@ -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;
index 7496fa4fd1c3b1a607c44c616b20bd088a99b3e5..22ac09f0098c43bc6bd5bcb4485f97be463462a5 100644 (file)
@@ -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)