renamed wxEventFixModule to wxWakeUpIdleModule; added error checking; slight code cleanup
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25633 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -5740,54 +5740,62 @@ bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam)
|
|||||||
|
|
||||||
#endif // wxUSE_HOTKEY
|
#endif // wxUSE_HOTKEY
|
||||||
|
|
||||||
// Not verified for WinCE
|
// Not tested under WinCE
|
||||||
#ifndef __WXWINCE__
|
#ifndef __WXWINCE__
|
||||||
/*
|
|
||||||
* wxEventFixModule (needs a better name) allows message handling to continute while a menu
|
|
||||||
* is being shown - ie, to continue processing messages from a worker thread.
|
|
||||||
*
|
|
||||||
* Code originally by Jason W. from wx-dev, reworked into a wxModule by Chris Mellon
|
|
||||||
*/
|
|
||||||
|
|
||||||
class wxEventFixModule : public wxModule {
|
// this class installs a message hook which really wakes up our idle processing
|
||||||
|
// each time a WM_NULL is received (wxWakeUpIdle does this), even if we're
|
||||||
|
// sitting inside a local modal loop (e.g. a menu is opened or scrollbar is
|
||||||
|
// being dragged or even inside ::MessageBox()) and so don't control message
|
||||||
|
// dispatching otherwise
|
||||||
|
class wxIdleWakeUpModule : public wxModule
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
//base class virtuals
|
virtual bool OnInit()
|
||||||
virtual bool OnInit() {
|
{
|
||||||
wxEventFixModule::s_hMsgHookProc = SetWindowsHookEx(
|
ms_hMsgHookProc = ::SetWindowsHookEx
|
||||||
WH_GETMESSAGE,
|
(
|
||||||
&wxEventFixModule::MsgHookProc,
|
WH_GETMESSAGE,
|
||||||
NULL,
|
&wxIdleWakeUpModule::MsgHookProc,
|
||||||
GetCurrentThreadId());
|
NULL,
|
||||||
wxLogDebug(_T("Loaded event fix module"));
|
GetCurrentThreadId()
|
||||||
return true;
|
);
|
||||||
};
|
|
||||||
virtual void OnExit() {
|
|
||||||
UnhookWindowsHookEx(wxEventFixModule::s_hMsgHookProc);
|
|
||||||
|
|
||||||
};
|
if ( !ms_hMsgHookProc )
|
||||||
static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
|
{
|
||||||
|
wxLogLastError(_T("SetWindowsHookEx(WH_GETMESSAGE)"));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void OnExit()
|
||||||
|
{
|
||||||
|
::UnhookWindowsHookEx(wxIdleWakeUpModule::ms_hMsgHookProc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
MSG *msg = (MSG*)lParam;
|
MSG *msg = (MSG*)lParam;
|
||||||
switch (msg->message)
|
if ( msg->message == WM_NULL )
|
||||||
{
|
{
|
||||||
case WM_NULL:
|
wxTheApp->ProcessPendingEvents();
|
||||||
static bool bInHookProc = false;
|
|
||||||
if (!bInHookProc)
|
|
||||||
{
|
|
||||||
bInHookProc = true;
|
|
||||||
wxTheApp->ProcessPendingEvents();
|
|
||||||
bInHookProc = false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return CallNextHookEx(wxEventFixModule::s_hMsgHookProc, nCode, wParam, lParam);
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
static HHOOK s_hMsgHookProc;
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxEventFixModule)
|
|
||||||
};
|
|
||||||
HHOOK wxEventFixModule::s_hMsgHookProc = 0;
|
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxEventFixModule, wxModule)
|
return CallNextHookEx(ms_hMsgHookProc, nCode, wParam, lParam);
|
||||||
#endif
|
};
|
||||||
// __WXWINCE__
|
|
||||||
|
private:
|
||||||
|
static HHOOK ms_hMsgHookProc;
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxIdleWakeUpModule)
|
||||||
|
};
|
||||||
|
|
||||||
|
HHOOK wxIdleWakeUpModule::ms_hMsgHookProc = 0;
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxIdleWakeUpModule, wxModule)
|
||||||
|
|
||||||
|
#endif // __WXWINCE__
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user