Don't return anything from it, just warn directly -- this is what all the existing callers did, so it's simpler if the function just does it itself instead of forcing them to check its return value. Also reset m_painted after yielding, so that YieldUntilPainted() could be called again, if necessary.
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        tests/waitforpaint.h
 | 
						|
// Purpose:     Helper WaitForPaint class
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Created:     2019-10-17 (extracted from tests/window/setsize.cpp)
 | 
						|
// Copyright:   (c) 2019 Vadim Zeitlin <vadim@wxwidgets.org>
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_TESTS_WAITFORPAINT_H_
 | 
						|
#define _WX_TESTS_WAITFORPAINT_H_
 | 
						|
 | 
						|
#include "wx/stopwatch.h"
 | 
						|
#include "wx/window.h"
 | 
						|
 | 
						|
// Class used to check if we received the (first) paint event: this is
 | 
						|
// currently used under GTK only, as MSW doesn't seem to need to wait for the
 | 
						|
// things to work, while under Mac nothing works anyhow.
 | 
						|
#ifdef __WXGTK__
 | 
						|
 | 
						|
class WaitForPaint
 | 
						|
{
 | 
						|
public:
 | 
						|
    explicit WaitForPaint(wxWindow* win)
 | 
						|
        : m_win(*win),
 | 
						|
          m_painted(false),
 | 
						|
          m_handler(&m_painted)
 | 
						|
    {
 | 
						|
        m_win.Bind(wxEVT_PAINT, m_handler);
 | 
						|
    }
 | 
						|
 | 
						|
    // This function waits up to the given number of milliseconds for the paint
 | 
						|
    // event to come and logs a warning if we didn't get it.
 | 
						|
    void YieldUntilPainted(int timeoutInMS = 250)
 | 
						|
    {
 | 
						|
        wxStopWatch sw;
 | 
						|
        for ( ;; )
 | 
						|
        {
 | 
						|
            wxYield();
 | 
						|
 | 
						|
            if ( m_painted )
 | 
						|
            {
 | 
						|
                // Reset it in case YieldUntilPainted() is called again.
 | 
						|
                m_painted = false;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
 | 
						|
            if ( sw.Time() > timeoutInMS )
 | 
						|
            {
 | 
						|
                WARN("Didn't get a paint event until timeout expiration");
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    ~WaitForPaint()
 | 
						|
    {
 | 
						|
        m_win.Unbind(wxEVT_PAINT, m_handler);
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    wxWindow& m_win;
 | 
						|
    bool m_painted;
 | 
						|
 | 
						|
    class PaintHandler
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        // Note that we have to use a pointer here, i.e. we can't just store
 | 
						|
        // the flag inside the class itself because it's going to be cloned
 | 
						|
        // inside wx and querying the flag of the original copy wouldtn' work.
 | 
						|
        explicit PaintHandler(bool* painted)
 | 
						|
            : m_painted(*painted)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        void operator()(wxPaintEvent& event)
 | 
						|
        {
 | 
						|
            event.Skip();
 | 
						|
            m_painted = true;
 | 
						|
        }
 | 
						|
 | 
						|
    private:
 | 
						|
        bool& m_painted;
 | 
						|
    } m_handler;
 | 
						|
};
 | 
						|
 | 
						|
#else // !__WXGTK__
 | 
						|
 | 
						|
class WaitForPaint
 | 
						|
{
 | 
						|
public:
 | 
						|
    explicit WaitForPaint(wxWindow* WXUNUSED(win))
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    void YieldUntilPainted(int WXUNUSED(timeoutInMS) = 250)
 | 
						|
    {
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
#endif // __WXGTK__/!__WXGTK__
 | 
						|
 | 
						|
#endif // _WX_TESTS_WAITFORPAINT_H_
 |