diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 3276436a6e..b01cdd229c 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -47,22 +47,31 @@ void wxAppBase::ProcessPendingEvents() { // ensure that we're the only thread to modify the pending events list - wxCRIT_SECT_LOCKER(locker, *wxPendingEventsLocker); + wxENTER_CRIT_SECT( *wxPendingEventsLocker ); if ( !wxPendingEvents ) + { + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); return; + } // iterate until the list becomes empty wxNode *node = wxPendingEvents->First(); while (node) { wxEvtHandler *handler = (wxEvtHandler *)node->Data(); - - handler->ProcessPendingEvents(); - delete node; + + // In ProcessPendingEvents(), new handlers might be add + // and we can safely leave the critical section here. + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + handler->ProcessPendingEvents(); + wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + node = wxPendingEvents->First(); } + + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); } int wxAppBase::OnExit() diff --git a/src/common/event.cpp b/src/common/event.cpp index e6190d9674..bfaf9a41b4 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -583,12 +583,6 @@ wxEvtHandler::~wxEvtHandler() bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) { -#if defined(__VISAGECPP__) - wxCriticalSectionLocker locker(m_eventsLocker); -#else - wxCriticalSectionLocker locker(*m_eventsLocker); -#endif - // check that we are really in a child thread wxASSERT_MSG( !wxThread::IsMain(), wxT("use ProcessEvent() in main thread") ); @@ -602,6 +596,14 @@ bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) void wxEvtHandler::AddPendingEvent(wxEvent& event) { + // 1) Add event to list of pending events of this event handler + +#if defined(__VISAGECPP__) + wxENTER_CRIT_SECT( m_eventsLocker); +#else + wxENTER_CRIT_SECT( *m_eventsLocker); +#endif + if ( !m_pendingEvents ) m_pendingEvents = new wxList; @@ -609,6 +611,15 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event) m_pendingEvents->Append(event2); +#if defined(__VISAGECPP__) + wxLEAVE_CRIT_SECT( m_eventsLocker); +#else + wxLEAVE_CRIT_SECT( *m_eventsLocker); +#endif + + // 2) Add this event handler to list of event handlers that + // have pending events. + wxENTER_CRIT_SECT(*wxPendingEventsLocker); if ( !wxPendingEvents ) @@ -617,28 +628,49 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event) wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); + // 3) Inform the system that new pending events are somwehere, + // and that these should be processed in idle time. + wxWakeUpIdle(); } void wxEvtHandler::ProcessPendingEvents() { #if defined(__VISAGECPP__) - wxCRIT_SECT_LOCKER(locker, m_eventsLocker); + wxENTER_CRIT_SECT( m_eventsLocker); #else - wxCRIT_SECT_LOCKER(locker, *m_eventsLocker); + wxENTER_CRIT_SECT( *m_eventsLocker); #endif wxNode *node = m_pendingEvents->First(); - wxEvent *event; - while ( node ) { - event = (wxEvent *)node->Data(); + wxEvent *event = (wxEvent *)node->Data(); + delete node; + + // In ProcessEvent, new events might get added and + // we can safely leave the crtical section here. +#if defined(__VISAGECPP__) + wxLEAVE_CRIT_SECT( m_eventsLocker); +#else + wxLEAVE_CRIT_SECT( *m_eventsLocker); +#endif ProcessEvent(*event); delete event; - delete node; +#if defined(__VISAGECPP__) + wxENTER_CRIT_SECT( m_eventsLocker); +#else + wxENTER_CRIT_SECT( *m_eventsLocker); +#endif + node = m_pendingEvents->First(); } + +#if defined(__VISAGECPP__) + wxLEAVE_CRIT_SECT( m_eventsLocker); +#else + wxLEAVE_CRIT_SECT( *m_eventsLocker); +#endif } /* diff --git a/src/gtk/gsockgtk.c b/src/gtk/gsockgtk.c index 5bfb166c15..c1500dfba0 100644 --- a/src/gtk/gsockgtk.c +++ b/src/gtk/gsockgtk.c @@ -11,8 +11,10 @@ #include #include -#include "gdk/gdk.h" -#include "glib.h" + +#include +#include + #include "wx/gsocket.h" #include "wx/unix/gsockunx.h" diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 54d5f9edfd..e4936a923e 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -26,9 +26,9 @@ #include "wx/tooltip.h" #endif -#include "gdk/gdk.h" -#include "gtk/gtk.h" -#include "gdk/gdkkeysyms.h" +#include +#include +#include //----------------------------------------------------------------------------- // idle system diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index ef10bb6cfc..8c29530da5 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -19,9 +19,9 @@ #include "wx/menu.h" #include "wx/intl.h" -#include "glib.h" -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include +#include #include "wx/gtk/win_gtk.h" //----------------------------------------------------------------------------- diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 750593b533..b645a865b9 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -21,8 +21,8 @@ #include "wx/accel.h" #endif // wxUSE_ACCEL -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include //----------------------------------------------------------------------------- // idle system diff --git a/src/gtk1/gsockgtk.c b/src/gtk1/gsockgtk.c index 5bfb166c15..c1500dfba0 100644 --- a/src/gtk1/gsockgtk.c +++ b/src/gtk1/gsockgtk.c @@ -11,8 +11,10 @@ #include #include -#include "gdk/gdk.h" -#include "glib.h" + +#include +#include + #include "wx/gsocket.h" #include "wx/unix/gsockunx.h" diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 54d5f9edfd..e4936a923e 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -26,9 +26,9 @@ #include "wx/tooltip.h" #endif -#include "gdk/gdk.h" -#include "gtk/gtk.h" -#include "gdk/gdkkeysyms.h" +#include +#include +#include //----------------------------------------------------------------------------- // idle system diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index ef10bb6cfc..8c29530da5 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -19,9 +19,9 @@ #include "wx/menu.h" #include "wx/intl.h" -#include "glib.h" -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include +#include #include "wx/gtk/win_gtk.h" //----------------------------------------------------------------------------- diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 750593b533..b645a865b9 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -21,8 +21,8 @@ #include "wx/accel.h" #endif // wxUSE_ACCEL -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include //----------------------------------------------------------------------------- // idle system