in case the user mask doesn't contain wxEVT_CATEGORY_UI, don't block forever on the never-ending WM_PAINTs messages sent by the system; but don't even break out of the loop immediately after getting the first WM_PAINT: this break repainting. (closes #10590)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59642 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi 2009-03-20 11:57:05 +00:00
parent 491016e54e
commit 9d2e29d274

View File

@ -387,6 +387,7 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
// we don't want to process WM_QUIT from here - it should be processed in
// the main event loop in order to stop it
MSG msg;
int nPaintsReceived = 0;
while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) &&
msg.message != WM_QUIT )
{
@ -396,8 +397,32 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
if (msg.message == WM_PAINT)
{
// WM_PAINT messages are the last ones of the queue...
break;
// NOTE: WM_PAINTs are categorized as wxEVT_CATEGORY_UI
if ((eventsToProcess & wxEVT_CATEGORY_UI) == 0)
{
// this msg is not going to be dispatched...
// however WM_PAINT is special: until there are damaged
// windows, Windows will keep sending it forever!
if (nPaintsReceived > 10)
{
// we got 10 WM_PAINT consecutive messages...
// we must have reached the tail of the message queue:
// we're now getting _only_ WM_PAINT events and this will
// continue forever (since we don't dispatch them
// because of the user-specified eventsToProcess mask)...
// break out of this loop!
break;
}
else
nPaintsReceived++;
}
//else: we're going to dispatch it below,
// so we don't need to take any special action
}
else
{
// reset the counter of consecutive WM_PAINT messages received:
nPaintsReceived = 0;
}
// choose a wxEventCategory for this Windows message
@ -477,7 +502,6 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
{
// 0;WM_USER-1 is the range of message IDs reserved for use
// by the system.
// there are too many of these types of messages to handle
// them in this switch
cat = wxEVT_CATEGORY_UI;