backport r55463, fix for infinite loop when wxBeginBusyCursor is called from idle handler, #1547

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@57839 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2009-01-05 03:42:39 +00:00
parent 2cdacc9a81
commit e86b7af93b

View File

@@ -13,10 +13,8 @@
#include "wx/cursor.h" #include "wx/cursor.h"
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
#include "wx/app.h" #include "wx/window.h"
#include "wx/utils.h"
#include "wx/image.h" #include "wx/image.h"
#include "wx/colour.h"
#include "wx/bitmap.h" #include "wx/bitmap.h"
#endif // WX_PRECOMP #endif // WX_PRECOMP
@@ -317,19 +315,28 @@ const wxCursor wxBusyCursor::GetBusyCursor()
return wxCursor(wxCURSOR_WATCH); return wxCursor(wxCURSOR_WATCH);
} }
static void InternalIdle(const wxWindowList& list)
{
wxWindowList::const_iterator i = list.begin();
for (size_t n = list.size(); n--; ++i)
{
wxWindow* win = *i;
win->OnInternalIdle();
InternalIdle(win->GetChildren());
}
}
void wxEndBusyCursor() void wxEndBusyCursor()
{ {
if (--gs_busyCount > 0) if (--gs_busyCount > 0)
return; return;
wxSetCursor( gs_savedCursor ); g_globalCursor = gs_savedCursor;
gs_savedCursor = wxNullCursor; gs_savedCursor = wxNullCursor;
InternalIdle(wxTopLevelWindows);
if (wxTheApp)
wxTheApp->ProcessIdle();
} }
void wxBeginBusyCursor( const wxCursor *WXUNUSED(cursor) ) void wxBeginBusyCursor(const wxCursor* cursor)
{ {
if (gs_busyCount++ > 0) if (gs_busyCount++ > 0)
return; return;
@@ -338,12 +345,8 @@ void wxBeginBusyCursor( const wxCursor *WXUNUSED(cursor) )
wxT("forgot to call wxEndBusyCursor, will leak memory") ); wxT("forgot to call wxEndBusyCursor, will leak memory") );
gs_savedCursor = g_globalCursor; gs_savedCursor = g_globalCursor;
g_globalCursor = *cursor;
wxSetCursor( wxCursor(wxCURSOR_WATCH) ); InternalIdle(wxTopLevelWindows);
if (wxTheApp)
wxTheApp->ProcessIdle();
gdk_flush(); gdk_flush();
} }