diff --git a/include/wx/cursor.h b/include/wx/cursor.h index f163125fa6..10bc6a0cc3 100644 --- a/include/wx/cursor.h +++ b/include/wx/cursor.h @@ -21,23 +21,39 @@ /* This is a small class which can be used by all ports to temporarily suspend the busy cursor. Useful in modal dialogs. + + Actually that is not (any longer) quite true.. currently it is + only used in wxGTK Dialog::ShowModal() and now uses static + wxBusyCursor methods that are only implemented for wxGTK so far. + The BusyCursor handling code should probably be implemented in + common code somewhere instead of the separate implementations we + currently have. Also the name BusyCursorSuspender is a little + misleading since it doesn't actually suspend the BusyCursor, just + masks one that is already showing. + If another call to wxBeginBusyCursor is made while this is active + the Busy Cursor will again be shown. But at least now it doesn't + interfere with the state of wxIsBusy() -- RL + */ class wxBusyCursorSuspender { public: - wxBusyCursorSuspender() - { - m_wasBusy = wxIsBusy(); - if(m_wasBusy) - wxEndBusyCursor(); - } - ~wxBusyCursorSuspender() - { - if(m_wasBusy) - wxBeginBusyCursor(); - } - private: - bool m_wasBusy; + wxBusyCursorSuspender() + { + if( wxIsBusy() ) + { + wxSetCursor( wxBusyCursor::GetStoredCursor() ); + wxYield(); + } + } + ~wxBusyCursorSuspender() + { + if( wxIsBusy() ) + { + wxSetCursor( wxBusyCursor::GetBusyCursor() ); + wxYield(); + } + } }; #endif // _WX_CURSOR_H_BASE_ diff --git a/include/wx/utils.h b/include/wx/utils.h index 04c5a868ba..491dda2549 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -326,8 +326,16 @@ class WXDLLEXPORT wxBusyCursor public: wxBusyCursor(wxCursor* cursor = wxHOURGLASS_CURSOR) { wxBeginBusyCursor(cursor); } - ~wxBusyCursor() + ~wxBusyCursor() { wxEndBusyCursor(); } + + // FIXME: These two methods are currently only implemented (and needed?) + // in wxGTK. BusyCursor handling should probably be moved to + // common code since the wxGTK and wxMSW implementations are very + // similar except for wxMSW using HCURSOR directly instead of + // wxCursor.. -- RL. + static const wxCursor &GetStoredCursor(); + static const wxCursor GetBusyCursor(); }; diff --git a/src/gtk/cursor.cpp b/src/gtk/cursor.cpp index 80f7c26d60..ff4b3bea6d 100644 --- a/src/gtk/cursor.cpp +++ b/src/gtk/cursor.cpp @@ -155,6 +155,16 @@ extern wxCursor g_globalCursor; static wxCursor gs_savedCursor; static int gs_busyCount = 0; +const wxCursor &wxBusyCursor::GetStoredCursor() +{ + return gs_savedCursor; +} + +const wxCursor wxBusyCursor::GetBusyCursor() +{ + return wxCursor(wxCURSOR_WATCH); +} + void wxEndBusyCursor() { if (--gs_busyCount > 0) diff --git a/src/gtk1/cursor.cpp b/src/gtk1/cursor.cpp index 80f7c26d60..ff4b3bea6d 100644 --- a/src/gtk1/cursor.cpp +++ b/src/gtk1/cursor.cpp @@ -155,6 +155,16 @@ extern wxCursor g_globalCursor; static wxCursor gs_savedCursor; static int gs_busyCount = 0; +const wxCursor &wxBusyCursor::GetStoredCursor() +{ + return gs_savedCursor; +} + +const wxCursor wxBusyCursor::GetBusyCursor() +{ + return wxCursor(wxCURSOR_WATCH); +} + void wxEndBusyCursor() { if (--gs_busyCount > 0)