]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/event.cpp
Common default datetime formats.
[wxWidgets.git] / src / common / event.cpp
index 88efcebd7598a97443f01d6384b82f608972977b..55484498bb2926adc534c3a046e795e75e228ead 100644 (file)
@@ -120,7 +120,7 @@ wxEventHashTable wxEvtHandler::sm_eventHashTable(wxEvtHandler::sm_eventTable);
 const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] =
     { DECLARE_EVENT_TABLE_ENTRY(wxEVT_NULL, 0, 0, (wxObjectEventFunction)NULL, NULL) };
 
-    
+
 #ifdef __WXDEBUG__
 // Clear up event hash table contents or we can get problems
 // when C++ is cleaning up the static object
@@ -137,7 +137,7 @@ public:
 };
 IMPLEMENT_DYNAMIC_CLASS(wxEventTableEntryModule, wxModule)
 #endif
-    
+
 // ----------------------------------------------------------------------------
 // global variables
 // ----------------------------------------------------------------------------
@@ -338,7 +338,7 @@ int wxNewEventType()
 // ----------------------------------------------------------------------------
 
 /*
- * General wxWindows events, covering
+ * General wxWidgets events, covering
  * all interesting things that might happen (button clicking, resizing,
  * setting text in widgets, etc.).
  *
@@ -417,23 +417,23 @@ bool wxUpdateUIEvent::CanUpdate(wxWindowBase *win)
 
     if (sm_updateInterval == -1)
         return false;
-    else if (sm_updateInterval == 0)
+
+    if (sm_updateInterval == 0)
         return true;
-    else
-    {
+
 #if wxUSE_STOPWATCH && wxUSE_LONGLONG
-        wxLongLong now = wxGetLocalTimeMillis();
-        if (now > (sm_lastUpdate + sm_updateInterval))
-        {
-            return true;
-        }
-#else
-        // If we don't have wxStopWatch or wxLongLong, we
-        // should err on the safe side and update now anyway.
+    wxLongLong now = wxGetLocalTimeMillis();
+    if (now > (sm_lastUpdate + sm_updateInterval))
+    {
         return true;
-#endif
     }
+
     return false;
+#else
+    // If we don't have wxStopWatch or wxLongLong, we
+    // should err on the safe side and update now anyway.
+    return true;
+#endif
 }
 
 // Reset the update time to provide a delay until the next
@@ -759,7 +759,7 @@ wxEventHashTable::wxEventHashTable(const wxEventTable &table)
                   m_rebuildHash(true)
 {
     AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE);
-    
+
     m_next = sm_first;
     if (m_next)
         m_next->m_previous = this;
@@ -774,7 +774,7 @@ wxEventHashTable::~wxEventHashTable()
         m_previous->m_next = m_next;
     if (sm_first == this)
         sm_first = m_next;
-    
+
     Clear();
 }
 
@@ -817,9 +817,9 @@ bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
         InitHashTable();
         m_rebuildHash = false;
     }
-    
+
     if (!m_eventTypeTable)
-        return FALSE;
+        return false;
 
     // Find all entries for the given event type.
     wxEventType eventType = event.GetEventType();
@@ -881,7 +881,7 @@ void wxEventHashTable::AddEntry(const wxEventTableEntry &entry)
     // This might happen 'accidentally' as the app is exiting
     if (!m_eventTypeTable)
         return;
-    
+
     EventTypeTablePointer *peTTnode = &m_eventTypeTable[entry.m_eventType % m_size];
     EventTypeTablePointer  eTTnode = *peTTnode;
 
@@ -1095,12 +1095,20 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
 
 void wxEvtHandler::ProcessPendingEvents()
 {
+    // this method is only called by wxApp if this handler does have pending
+    // events
+    wxCHECK_RET( m_pendingEvents,
+                 wxT("Please call wxApp::ProcessPendingEvents() instead") );
+
 #if defined(__VISAGECPP__)
     wxENTER_CRIT_SECT( m_eventsLocker);
 #else
     wxENTER_CRIT_SECT( *m_eventsLocker);
 #endif
 
+    // remember last event to process during this iteration
+    wxList::compatibility_iterator lastPendingNode = m_pendingEvents->GetLast();
+
     wxList::compatibility_iterator node = m_pendingEvents->GetFirst();
     while ( node )
     {
@@ -1122,6 +1130,13 @@ void wxEvtHandler::ProcessPendingEvents()
         wxENTER_CRIT_SECT( *m_eventsLocker);
 #endif
 
+        // leave the loop once we have processed all events that were present
+        // at the start of ProcessPendingEvents because otherwise we could get
+        // into infinite loop if the pending event handler execution resulted
+        // in another event being posted
+        if ( node == lastPendingNode )
+            break;
+
         node = m_pendingEvents->GetFirst();
     }
 
@@ -1147,9 +1162,9 @@ wxEvtHandler::ProcessEventIfMatches(const wxEventTableEntryBase& entry,
     // the event table (meaning "any") or the event id matches the id
     // specified in the event table either exactly or by falling into
     // range between first and last
-    if ((tableId1 == -1) ||
-        (tableId2 == -1 && tableId1 == event.GetId()) ||
-        (tableId2 != -1 &&
+    if ((tableId1 == wxID_ANY) ||
+        (tableId2 == wxID_ANY && tableId1 == event.GetId()) ||
+        (tableId2 != wxID_ANY &&
          (event.GetId() >= tableId1 && event.GetId() <= tableId2)))
     {
         event.Skip(false);
@@ -1299,7 +1314,7 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
 
         if ((entry->m_id == id) &&
-            ((entry->m_lastId == lastId) || (lastId == -1)) &&
+            ((entry->m_lastId == lastId) || (lastId == wxID_ANY)) &&
             ((entry->m_eventType == eventType) || (eventType == wxEVT_NULL)) &&
             ((entry->m_fn == func) || (func == (wxObjectEventFunction)NULL)) &&
             ((entry->m_eventSink == eventSink) || (eventSink == (wxEvtHandler*)NULL)) &&
@@ -1330,7 +1345,7 @@ bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
         wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
 
-        if ((event.m_eventType == entry->m_eventType) && (entry->m_fn != NULL))
+        if ((event.m_eventType == entry->m_eventType) && (entry->m_fn != 0))
         {
             wxEvtHandler *handler =
 #if !WXWIN_COMPATIBILITY_EVENT_TYPES