attempt to fix timers when creating them with a valid HWND
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23884 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
3ad38858fd
commit
5b6c8794de
@ -46,13 +46,43 @@ wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc);
|
|||||||
// private functions
|
// private functions
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
WX_DECLARE_HASH_MAP( long,
|
// define a hash containing all the timers: it is indexed by HWND and timer id
|
||||||
wxTimer *,
|
struct wxTimerKey
|
||||||
wxIntegerHash,
|
{
|
||||||
wxIntegerEqual,
|
wxTimerKey(WXHWND hwnd, int id) : m_hwnd(hwnd), m_id(id) { }
|
||||||
wxTimerMap );
|
wxTimerKey(HWND hwnd, int id) : m_hwnd((WXHWND)hwnd), m_id(id) { }
|
||||||
|
|
||||||
wxTimerMap wxTimerList;
|
WXHWND m_hwnd;
|
||||||
|
int m_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
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);
|
void WINAPI wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD);
|
||||||
|
|
||||||
@ -115,12 +145,7 @@ void wxTimer::Init()
|
|||||||
|
|
||||||
wxTimer::~wxTimer()
|
wxTimer::~wxTimer()
|
||||||
{
|
{
|
||||||
// save id as Stop() changes it
|
|
||||||
long id = m_id;
|
|
||||||
|
|
||||||
wxTimer::Stop();
|
wxTimer::Stop();
|
||||||
|
|
||||||
wxTimerList.erase(id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxTimer::Start(int milliseconds, bool oneShot)
|
bool wxTimer::Start(int milliseconds, bool oneShot)
|
||||||
@ -182,7 +207,7 @@ bool wxTimer::Start(int milliseconds, bool oneShot)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxTimerList[m_id] = this;
|
g_timerMap[wxTimerKey(m_hwnd, m_id)] = this;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -194,7 +219,7 @@ void wxTimer::Stop()
|
|||||||
::KillTimer((HWND)m_hwnd, (UINT)m_id);
|
::KillTimer((HWND)m_hwnd, (UINT)m_id);
|
||||||
m_hwnd = NULL;
|
m_hwnd = NULL;
|
||||||
|
|
||||||
wxTimerList.erase(m_id);
|
g_timerMap.erase(wxTimerKey(m_hwnd, m_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_id = 0;
|
m_id = 0;
|
||||||
@ -206,9 +231,7 @@ void wxTimer::Stop()
|
|||||||
|
|
||||||
void wxProcessTimer(wxTimer& timer)
|
void wxProcessTimer(wxTimer& timer)
|
||||||
{
|
{
|
||||||
// Avoid to process spurious timer events
|
wxASSERT_MSG( timer.m_id != 0, _T("bogus timer id") );
|
||||||
if ( timer.m_id == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ( timer.IsOneShot() )
|
if ( timer.IsOneShot() )
|
||||||
timer.Stop();
|
timer.Stop();
|
||||||
@ -216,11 +239,11 @@ void wxProcessTimer(wxTimer& timer)
|
|||||||
timer.Notify();
|
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));
|
wxProcessTimer(*(node->second));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user