]> git.saurik.com Git - wxWidgets.git/commitdiff
attempt to fix timers when creating them with a valid HWND
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 24 Sep 2003 13:46:34 +0000 (13:46 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 24 Sep 2003 13:46:34 +0000 (13:46 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23884 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/timer.cpp

index 1ebd9535cf3877277eab4a062641c8fcbfac3d3d..c58cb7cc0a1471499b2ca419921271b3b5298486 100644 (file)
@@ -46,13 +46,43 @@ wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc);
 // private functions
 // ----------------------------------------------------------------------------
 
-WX_DECLARE_HASH_MAP( long,
-                     wxTimer *,
-                     wxIntegerHash,
-                     wxIntegerEqual,
-                     wxTimerMap );
+// define a hash containing all the timers: it is indexed by HWND and timer id
+struct wxTimerKey
+{
+    wxTimerKey(WXHWND hwnd, int id) : m_hwnd(hwnd), m_id(id) { }
+    wxTimerKey(HWND hwnd, int id) : m_hwnd((WXHWND)hwnd), m_id(id) { }
+
+    WXHWND m_hwnd;
+    int m_id;
+};
 
-wxTimerMap wxTimerList;
+static inline bool operator==(const wxTimerKey& tk1, const wxTimerKey& tk2)
+{
+    return tk1.m_hwnd == tk2.m_hwnd && tk1.m_id == tk2.m_id;
+}
+
+struct wxTimerKeyHash
+{
+    wxTimerKeyHash() { }
+    unsigned long operator()(const wxTimerKey& tk) const
+        { return (unsigned long)tk.m_hwnd + tk.m_id; }
+
+    wxTimerKeyHash& operator=(const wxTimerKeyHash&) { return *this; }
+};
+
+struct wxTimerKeyEqual
+{
+    wxTimerKeyEqual() { }
+    bool operator()(const wxTimerKey& tk1, const wxTimerKey& tk2) const
+        { return tk1 == tk2; }
+
+    wxTimerKeyEqual& operator=(const wxTimerKeyEqual&) { return *this; }
+};
+
+WX_DECLARE_HASH_MAP(wxTimerKey, wxTimer *, wxTimerKeyHash, wxTimerKeyEqual,
+                    wxTimerMap);
+
+static wxTimerMap g_timerMap;
 
 void WINAPI wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD);
 
@@ -115,12 +145,7 @@ void wxTimer::Init()
 
 wxTimer::~wxTimer()
 {
-    // save id as Stop() changes it
-    long id = m_id;
-
     wxTimer::Stop();
-
-    wxTimerList.erase(id);
 }
 
 bool wxTimer::Start(int milliseconds, bool oneShot)
@@ -182,7 +207,7 @@ bool wxTimer::Start(int milliseconds, bool oneShot)
         return false;
     }
 
-    wxTimerList[m_id] = this;
+    g_timerMap[wxTimerKey(m_hwnd, m_id)] = this;
 
     return true;
 }
@@ -194,7 +219,7 @@ void wxTimer::Stop()
         ::KillTimer((HWND)m_hwnd, (UINT)m_id);
         m_hwnd = NULL;
 
-        wxTimerList.erase(m_id);
+        g_timerMap.erase(wxTimerKey(m_hwnd, m_id));
     }
 
     m_id = 0;
@@ -206,9 +231,7 @@ void wxTimer::Stop()
 
 void wxProcessTimer(wxTimer& timer)
 {
-    // Avoid to process spurious timer events
-    if ( timer.m_id == 0)
-        return;
+    wxASSERT_MSG( timer.m_id != 0, _T("bogus timer id") );
 
     if ( timer.IsOneShot() )
         timer.Stop();
@@ -216,11 +239,11 @@ void wxProcessTimer(wxTimer& timer)
     timer.Notify();
 }
 
-void WINAPI wxTimerProc(HWND WXUNUSED(hwnd), WORD, int idTimer, DWORD)
+void WINAPI wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD)
 {
-    wxTimerMap::iterator node = wxTimerList.find((long)idTimer);
+    wxTimerMap::iterator node = g_timerMap.find(wxTimerKey(hwnd, idTimer));
 
-    wxASSERT_MSG( node != wxTimerList.end(), wxT("bogus timer id in wxTimerProc") );
+    wxCHECK_RET( node != g_timerMap.end(), wxT("bogus timer id in wxTimerProc") );
 
     wxProcessTimer(*(node->second));
 }