fix for infinite loop when wxBeginBusyCursor is called from idle handler, #1547
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55463 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -13,10 +13,9 @@
|
|||||||
#include "wx/cursor.h"
|
#include "wx/cursor.h"
|
||||||
|
|
||||||
#ifndef WX_PRECOMP
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/window.h"
|
||||||
#include "wx/app.h"
|
#include "wx/app.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
|
||||||
|
|
||||||
@@ -345,19 +344,31 @@ const wxCursor wxBusyCursor::GetBusyCursor()
|
|||||||
return wxCursor(wxCURSOR_WATCH);
|
return wxCursor(wxCURSOR_WATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void InternalIdle(const wxWindowList& list, GdkDisplay*& display)
|
||||||
|
{
|
||||||
|
wxWindowList::const_iterator i = list.begin();
|
||||||
|
for (size_t n = list.size(); n--; ++i)
|
||||||
|
{
|
||||||
|
wxWindow* win = *i;
|
||||||
|
if (display == NULL && win->m_widget && win->m_widget->window)
|
||||||
|
display = gdk_drawable_get_display(win->m_widget->window);
|
||||||
|
win->OnInternalIdle();
|
||||||
|
InternalIdle(win->GetChildren(), display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
GdkDisplay* unused = NULL;
|
||||||
if (wxTheApp)
|
InternalIdle(wxTopLevelWindows, unused);
|
||||||
wxTheApp->ProcessIdle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxBeginBusyCursor( const wxCursor *WXUNUSED(cursor) )
|
void wxBeginBusyCursor(const wxCursor* cursor)
|
||||||
{
|
{
|
||||||
if (gs_busyCount++ > 0)
|
if (gs_busyCount++ > 0)
|
||||||
return;
|
return;
|
||||||
@@ -366,13 +377,11 @@ 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) );
|
GdkDisplay* display = NULL;
|
||||||
|
InternalIdle(wxTopLevelWindows, display);
|
||||||
if (wxTheApp)
|
if (display)
|
||||||
wxTheApp->ProcessIdle();
|
gdk_display_flush(display);
|
||||||
|
|
||||||
gdk_flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxIsBusy()
|
bool wxIsBusy()
|
||||||
|
Reference in New Issue
Block a user