Some changes to fix event processing
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6661 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
253
src/os2/app.cpp
253
src/os2/app.cpp
@@ -51,6 +51,10 @@
|
|||||||
#include "wx/resource.h"
|
#include "wx/resource.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_TOOLTIPS
|
||||||
|
#include "wx/tooltip.h"
|
||||||
|
#endif // wxUSE_TOOLTIPS
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
@@ -64,12 +68,9 @@ extern wxList* wxWinHandleList;
|
|||||||
extern wxList WXDLLEXPORT wxPendingDelete;
|
extern wxList WXDLLEXPORT wxPendingDelete;
|
||||||
extern wxCursor* g_globalCursor;
|
extern wxCursor* g_globalCursor;
|
||||||
|
|
||||||
HINSTANCE wxhInstance = 0;
|
HAB vHabmain = NULLHANDLE;
|
||||||
QMSG svCurrentMsg;
|
QMSG svCurrentMsg;
|
||||||
wxApp* wxTheApp = NULL;
|
wxApp* wxTheApp = NULL;
|
||||||
HAB vHabmain = NULL;
|
|
||||||
|
|
||||||
// FIXME why not const? and not static?
|
|
||||||
|
|
||||||
// NB: all "NoRedraw" classes must have the same names as the "normal" classes
|
// NB: all "NoRedraw" classes must have the same names as the "normal" classes
|
||||||
// with NR suffix - wxWindow::OS2Create() supposes this
|
// with NR suffix - wxWindow::OS2Create() supposes this
|
||||||
@@ -114,7 +115,9 @@ MRESULT EXPENTRY wxWndProc( HWND
|
|||||||
EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
|
EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
//// Initialize
|
//
|
||||||
|
// Initialize
|
||||||
|
//
|
||||||
bool wxApp::Initialize(
|
bool wxApp::Initialize(
|
||||||
HAB vHab
|
HAB vHab
|
||||||
)
|
)
|
||||||
@@ -143,8 +146,10 @@ bool wxApp::Initialize(
|
|||||||
wxGetResource(wxT("wxWindows"), wxT("OsVersion"), &wxOsVersion);
|
wxGetResource(wxT("wxWindows"), wxT("OsVersion"), &wxOsVersion);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// I'm annoyed ... I don't know where to put this and I don't want to
|
#if wxUSE_THREADS
|
||||||
// create a module for that as it's part of the core.
|
wxPendingEventsLocker = new wxCriticalSection;
|
||||||
|
#endif
|
||||||
|
|
||||||
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
|
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
|
||||||
wxTheColourDatabase->Initialize();
|
wxTheColourDatabase->Initialize();
|
||||||
|
|
||||||
@@ -157,17 +162,6 @@ bool wxApp::Initialize(
|
|||||||
|
|
||||||
wxBitmap::InitStandardHandlers();
|
wxBitmap::InitStandardHandlers();
|
||||||
|
|
||||||
g_globalCursor = new wxCursor;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
wxSTD_FRAME_ICON = ::WinLoadFileIcon(wxT("wxSTD_FRAME"), TRUE);
|
|
||||||
wxSTD_MDIPARENTFRAME_ICON = ::WinLoadFileIcon(wxT("wxSTD_MDIPARENTFRAME"), TRUE);
|
|
||||||
wxSTD_MDICHILDFRAME_ICON = ::WinLoadFileIcon(wxT("wxSTD_MDICHILDFRAME"), TRUE);
|
|
||||||
|
|
||||||
wxDEFAULT_FRAME_ICON = ::WinLoadFileIcon(wxT("wxDEFAULT_FRAME"), TRUE);
|
|
||||||
wxDEFAULT_MDIPARENTFRAME_ICON = ::WinLoadFileIcon(wxT("wxDEFAULT_MDIPARENTFRAME"), TRUE);
|
|
||||||
wxDEFAULT_MDICHILDFRAME_ICON = ::WinLoadFileIcon(wxT("wxDEFAULT_MDICHILDFRAME"), TRUE);
|
|
||||||
#endif
|
|
||||||
RegisterWindowClasses(vHab);
|
RegisterWindowClasses(vHab);
|
||||||
wxWinHandleList = new wxList(wxKEY_INTEGER);
|
wxWinHandleList = new wxList(wxKEY_INTEGER);
|
||||||
|
|
||||||
@@ -184,15 +178,12 @@ bool wxApp::Initialize(
|
|||||||
if (!wxModule::InitializeModules())
|
if (!wxModule::InitializeModules())
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} // end of wxApp::Initialize
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// RegisterWindowClasses
|
// RegisterWindowClasses
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
// TODO we should only register classes really used by the app. For this it
|
|
||||||
// would be enough to just delay the class registration until an attempt
|
|
||||||
// to create a window of this class is made.
|
|
||||||
bool wxApp::RegisterWindowClasses(
|
bool wxApp::RegisterWindowClasses(
|
||||||
HAB vHab
|
HAB vHab
|
||||||
)
|
)
|
||||||
@@ -305,46 +296,49 @@ bool wxApp::RegisterWindowClasses(
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} // end of wxApp::RegisterWindowClasses
|
||||||
|
|
||||||
//// Cleans up any wxWindows internal structures left lying around
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleans up any wxWindows internal structures left lying around
|
||||||
|
//
|
||||||
void wxApp::CleanUp()
|
void wxApp::CleanUp()
|
||||||
{
|
{
|
||||||
//// COMMON CLEANUP
|
//
|
||||||
|
// COMMON CLEANUP
|
||||||
|
//
|
||||||
|
|
||||||
#if wxUSE_LOG
|
#if wxUSE_LOG
|
||||||
// flush the logged messages if any and install a 'safer' log target: the
|
|
||||||
|
//
|
||||||
|
// Flush the logged messages if any and install a 'safer' log target: the
|
||||||
// default one (wxLogGui) can't be used after the resources are freed just
|
// default one (wxLogGui) can't be used after the resources are freed just
|
||||||
// below and the user suppliedo ne might be even more unsafe (using any
|
// below and the user suppliedo ne might be even more unsafe (using any
|
||||||
// wxWindows GUI function is unsafe starting from now)
|
// wxWindows GUI function is unsafe starting from now)
|
||||||
|
//
|
||||||
wxLog::DontCreateOnDemand();
|
wxLog::DontCreateOnDemand();
|
||||||
|
|
||||||
// this will flush the old messages if any
|
//
|
||||||
|
// This will flush the old messages if any
|
||||||
|
//
|
||||||
delete wxLog::SetActiveTarget(new wxLogStderr);
|
delete wxLog::SetActiveTarget(new wxLogStderr);
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
|
|
||||||
|
//
|
||||||
// One last chance for pending objects to be cleaned up
|
// One last chance for pending objects to be cleaned up
|
||||||
|
//
|
||||||
wxTheApp->DeletePendingObjects();
|
wxTheApp->DeletePendingObjects();
|
||||||
|
|
||||||
wxModule::CleanUpModules();
|
wxModule::CleanUpModules();
|
||||||
|
|
||||||
#if wxUSE_WX_RESOURCES
|
#if wxUSE_WX_RESOURCES
|
||||||
wxCleanUpResourceSystem();
|
wxCleanUpResourceSystem();
|
||||||
|
|
||||||
// wxDefaultResourceTable->ClearTable();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Indicate that the cursor can be freed, so that cursor won't be deleted
|
|
||||||
// by deleting the bitmap list before g_globalCursor goes out of scope
|
|
||||||
// (double deletion of the cursor).
|
|
||||||
wxSetCursor(wxNullCursor);
|
|
||||||
delete g_globalCursor;
|
|
||||||
g_globalCursor = NULL;
|
|
||||||
|
|
||||||
wxDeleteStockObjects();
|
wxDeleteStockObjects();
|
||||||
|
|
||||||
|
//
|
||||||
// Destroy all GDI lists, etc.
|
// Destroy all GDI lists, etc.
|
||||||
|
//
|
||||||
wxDeleteStockLists();
|
wxDeleteStockLists();
|
||||||
|
|
||||||
delete wxTheColourDatabase;
|
delete wxTheColourDatabase;
|
||||||
@@ -355,7 +349,9 @@ void wxApp::CleanUp()
|
|||||||
delete[] wxBuffer;
|
delete[] wxBuffer;
|
||||||
wxBuffer = NULL;
|
wxBuffer = NULL;
|
||||||
|
|
||||||
//// PM-SPECIFIC CLEANUP
|
//
|
||||||
|
// PM-SPECIFIC CLEANUP
|
||||||
|
//
|
||||||
|
|
||||||
// wxSetKeyboardHook(FALSE);
|
// wxSetKeyboardHook(FALSE);
|
||||||
|
|
||||||
@@ -381,10 +377,8 @@ void wxApp::CleanUp()
|
|||||||
if (wxWinHandleList)
|
if (wxWinHandleList)
|
||||||
delete wxWinHandleList;
|
delete wxWinHandleList;
|
||||||
|
|
||||||
// GL: I'm annoyed ... I don't know where to put this and I don't want to
|
|
||||||
// create a module for that as it's part of the core.
|
|
||||||
#if wxUSE_THREADS
|
|
||||||
delete wxPendingEvents;
|
delete wxPendingEvents;
|
||||||
|
#if wxUSE_THREADS
|
||||||
delete wxPendingEventsLocker;
|
delete wxPendingEventsLocker;
|
||||||
// If we don't do the following, we get an apparent memory leak.
|
// If we don't do the following, we get an apparent memory leak.
|
||||||
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
|
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
|
||||||
@@ -413,7 +407,7 @@ void wxApp::CleanUp()
|
|||||||
// do it as the very last thing because everything else can log messages
|
// do it as the very last thing because everything else can log messages
|
||||||
delete wxLog::SetActiveTarget(NULL);
|
delete wxLog::SetActiveTarget(NULL);
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
}
|
} // end of wxApp::CleanUp
|
||||||
|
|
||||||
int wxEntry(
|
int wxEntry(
|
||||||
int argc
|
int argc
|
||||||
@@ -494,7 +488,7 @@ int wxEntry(
|
|||||||
wxTheApp->OnExit();
|
wxTheApp->OnExit();
|
||||||
wxApp::CleanUp();
|
wxApp::CleanUp();
|
||||||
return(nRetValue);
|
return(nRetValue);
|
||||||
}
|
} // end of wxEntry
|
||||||
|
|
||||||
bool wxApp::OnInitGui()
|
bool wxApp::OnInitGui()
|
||||||
{
|
{
|
||||||
@@ -510,7 +504,7 @@ bool wxApp::OnInitGui()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} // end of wxApp::OnInitGui
|
||||||
|
|
||||||
//
|
//
|
||||||
// Static member initialization
|
// Static member initialization
|
||||||
@@ -528,20 +522,22 @@ wxApp::wxApp()
|
|||||||
m_nPrintMode = wxPRINT_WINDOWS;
|
m_nPrintMode = wxPRINT_WINDOWS;
|
||||||
m_exitOnFrameDelete = TRUE;
|
m_exitOnFrameDelete = TRUE;
|
||||||
m_bAuto3D = TRUE;
|
m_bAuto3D = TRUE;
|
||||||
}
|
} // end of wxApp::wxApp
|
||||||
|
|
||||||
wxApp::~wxApp()
|
wxApp::~wxApp()
|
||||||
{
|
{
|
||||||
#if wxUSE_UNICODE
|
//
|
||||||
// Delete command-line args
|
// Delete command-line args
|
||||||
int i;
|
//
|
||||||
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
{
|
{
|
||||||
delete[] argv[i];
|
delete[] argv[i];
|
||||||
}
|
}
|
||||||
delete[] argv;
|
delete[] argv;
|
||||||
#endif
|
#endif
|
||||||
}
|
} // end of wxApp::~wxApp
|
||||||
|
|
||||||
bool wxApp::Initialized()
|
bool wxApp::Initialized()
|
||||||
{
|
{
|
||||||
@@ -549,7 +545,7 @@ bool wxApp::Initialized()
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
} // end of wxApp::Initialized
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get and process a message, returning FALSE if WM_QUIT
|
// Get and process a message, returning FALSE if WM_QUIT
|
||||||
@@ -581,7 +577,7 @@ bool wxApp::DoMessage()
|
|||||||
static wxMsgArray svSavedMessages;
|
static wxMsgArray svSavedMessages;
|
||||||
|
|
||||||
//
|
//
|
||||||
// if a secondary thread owns is doing GUI calls, save all messages for
|
// If a secondary thread owns is doing GUI calls, save all messages for
|
||||||
// later processing - we can't process them right now because it will
|
// later processing - we can't process them right now because it will
|
||||||
// lead to recursive library calls (and we're not reentrant)
|
// lead to recursive library calls (and we're not reentrant)
|
||||||
//
|
//
|
||||||
@@ -589,8 +585,10 @@ bool wxApp::DoMessage()
|
|||||||
{
|
{
|
||||||
sbHadGuiLock = FALSE;
|
sbHadGuiLock = FALSE;
|
||||||
|
|
||||||
// leave out WM_COMMAND messages: too dangerous, sometimes
|
//
|
||||||
|
// Leave out WM_COMMAND messages: too dangerous, sometimes
|
||||||
// the message will be processed twice
|
// the message will be processed twice
|
||||||
|
//
|
||||||
if ( !wxIsWaitingForThread() ||
|
if ( !wxIsWaitingForThread() ||
|
||||||
svCurrentMsg.msg != WM_COMMAND )
|
svCurrentMsg.msg != WM_COMMAND )
|
||||||
{
|
{
|
||||||
@@ -601,12 +599,9 @@ bool wxApp::DoMessage()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// have we just regained the GUI lock? if so, post all of the saved
|
// Have we just regained the GUI lock? if so, post all of the saved
|
||||||
// messages
|
// messages
|
||||||
//
|
//
|
||||||
// FIXME of course, it's not _exactly_ the same as processing the
|
|
||||||
// messages normally - expect some things to break...
|
|
||||||
//
|
|
||||||
if (!sbHadGuiLock )
|
if (!sbHadGuiLock )
|
||||||
{
|
{
|
||||||
sbHadGuiLock = TRUE;
|
sbHadGuiLock = TRUE;
|
||||||
@@ -634,7 +629,7 @@ bool wxApp::DoMessage()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} // end of wxApp::DoMessage
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
@@ -660,14 +655,13 @@ int wxApp::MainLoop()
|
|||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
wxMutexGuiLeaveOrEnter();
|
wxMutexGuiLeaveOrEnter();
|
||||||
#endif // wxUSE_THREADS
|
#endif // wxUSE_THREADS
|
||||||
while (!::WinPeekMsg(vHabmain, &svCurrentMsg, (HWND)NULL, 0, 0, PM_NOREMOVE) &&
|
while (!Pending() && ProcessIdle())
|
||||||
ProcessIdle() )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
DoMessage();
|
DoMessage();
|
||||||
}
|
}
|
||||||
return (int)svCurrentMsg.mp1;
|
return (int)svCurrentMsg.mp1;
|
||||||
}
|
} // end of wxApp::MainLoop
|
||||||
|
|
||||||
//
|
//
|
||||||
// Returns TRUE if more time is needed.
|
// Returns TRUE if more time is needed.
|
||||||
@@ -679,24 +673,7 @@ bool wxApp::ProcessIdle()
|
|||||||
vEvent.SetEventObject(this);
|
vEvent.SetEventObject(this);
|
||||||
ProcessEvent(vEvent);
|
ProcessEvent(vEvent);
|
||||||
return vEvent.MoreRequested();
|
return vEvent.MoreRequested();
|
||||||
}
|
} // end of wxApp::ProcessIdle
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
|
||||||
void wxApp::ProcessPendingEvents()
|
|
||||||
{
|
|
||||||
wxNode* pNode = wxPendingEvents->First();
|
|
||||||
wxCriticalSectionLocker vLocker(*wxPendingEventsLocker);
|
|
||||||
|
|
||||||
while (pNode)
|
|
||||||
{
|
|
||||||
wxEvtHandler* pHandler = (wxEvtHandler *)pNode->Data();
|
|
||||||
pHandler->ProcessPendingEvents();
|
|
||||||
|
|
||||||
delete pNode;
|
|
||||||
pNode = wxPendingEvents->First();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void wxApp::ExitMainLoop()
|
void wxApp::ExitMainLoop()
|
||||||
{
|
{
|
||||||
@@ -729,8 +706,23 @@ bool wxApp::ProcessMessage(
|
|||||||
wxWindow* pWndThis = wxFindWinFromHandle((WXHWND)hWnd);
|
wxWindow* pWndThis = wxFindWinFromHandle((WXHWND)hWnd);
|
||||||
wxWindow* pWnd;
|
wxWindow* pWnd;
|
||||||
|
|
||||||
|
#if wxUSE_TOOLTIPS
|
||||||
//
|
//
|
||||||
// for some composite controls (like a combobox), wndThis might be NULL
|
// We must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to
|
||||||
|
// popup the tooltip bubbles
|
||||||
|
//
|
||||||
|
if (pWndThis && (vMsg->msg == WM_MOUSEMOVE))
|
||||||
|
{
|
||||||
|
wxToolTip* pToolTip = pWndThis->GetToolTip();
|
||||||
|
if (pToolTip)
|
||||||
|
{
|
||||||
|
pToolTip->RelayEvent(pWxmsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // wxUSE_TOOLTIPS
|
||||||
|
|
||||||
|
//
|
||||||
|
// For some composite controls (like a combobox), wndThis might be NULL
|
||||||
// because the subcontrol is not a wxWindow, but only the control itself
|
// because the subcontrol is not a wxWindow, but only the control itself
|
||||||
// is - try to catch this case
|
// is - try to catch this case
|
||||||
//
|
//
|
||||||
@@ -740,14 +732,16 @@ bool wxApp::ProcessMessage(
|
|||||||
pWndThis = wxFindWinFromHandle((WXHWND)hWnd);
|
pWndThis = wxFindWinFromHandle((WXHWND)hWnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
// Anyone for a non-translation message? Try youngest descendants first.
|
// Anyone for a non-translation message? Try youngest descendants first.
|
||||||
|
//
|
||||||
for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
|
for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
|
||||||
{
|
{
|
||||||
if (pWnd->OS2ProcessMessage(pWxmsg))
|
if (pWnd->OS2ProcessMessage(pWxmsg))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
} // end of wxApp::ProcessMessage
|
||||||
|
|
||||||
void wxApp::OnIdle(
|
void wxApp::OnIdle(
|
||||||
wxIdleEvent& rEvent
|
wxIdleEvent& rEvent
|
||||||
@@ -763,20 +757,28 @@ void wxApp::OnIdle(
|
|||||||
|
|
||||||
sbInOnIdle = TRUE;
|
sbInOnIdle = TRUE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// If there are pending events, we must process them: pending events
|
||||||
|
// are either events to the threads other than main or events posted
|
||||||
|
// with wxPostEvent() functions
|
||||||
|
//
|
||||||
|
ProcessPendingEvents();
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'Garbage' collection of windows deleted with Close().
|
// 'Garbage' collection of windows deleted with Close().
|
||||||
//
|
//
|
||||||
DeletePendingObjects();
|
DeletePendingObjects();
|
||||||
|
|
||||||
#if wxUSE_LOG
|
#if wxUSE_LOG
|
||||||
// flush the logged messages if any
|
//
|
||||||
wxLog* pLog = wxLog::GetActiveTarget();
|
// Flush the logged messages if any
|
||||||
|
//
|
||||||
if (pLog != NULL && pLog->HasPendingMessages())
|
wxLog::FlushActive();
|
||||||
pLog->Flush();
|
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
|
|
||||||
|
//
|
||||||
// Send OnIdle events to all windows
|
// Send OnIdle events to all windows
|
||||||
|
//
|
||||||
if (SendIdleEvents())
|
if (SendIdleEvents())
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -785,21 +787,8 @@ void wxApp::OnIdle(
|
|||||||
//
|
//
|
||||||
rEvent.RequestMore(TRUE);
|
rEvent.RequestMore(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// If they are pending events, we must process them.
|
|
||||||
//
|
|
||||||
#if wxUSE_THREADS
|
|
||||||
ProcessPendingEvents();
|
|
||||||
#endif
|
|
||||||
sbInOnIdle = FALSE;
|
sbInOnIdle = FALSE;
|
||||||
}
|
} // end of wxApp::OnIdle
|
||||||
|
|
||||||
void wxWakeUpIdle()
|
|
||||||
{
|
|
||||||
// **** please implement me! ****
|
|
||||||
// Wake up the idle handler processor, even if it is in another thread...
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send idle event to all top-level windows
|
// Send idle event to all top-level windows
|
||||||
bool wxApp::SendIdleEvents()
|
bool wxApp::SendIdleEvents()
|
||||||
@@ -816,7 +805,7 @@ bool wxApp::SendIdleEvents()
|
|||||||
pNode = pNode->GetNext();
|
pNode = pNode->GetNext();
|
||||||
}
|
}
|
||||||
return bNeedMore;
|
return bNeedMore;
|
||||||
}
|
} // end of wxApp::SendIdleEvents
|
||||||
|
|
||||||
//
|
//
|
||||||
// Send idle event to window and all subwindows
|
// Send idle event to window and all subwindows
|
||||||
@@ -845,7 +834,7 @@ bool wxApp::SendIdleEvents(
|
|||||||
pNode = pNode->Next();
|
pNode = pNode->Next();
|
||||||
}
|
}
|
||||||
return bNeedMore;
|
return bNeedMore;
|
||||||
}
|
} // end of wxApp::SendIdleEvents
|
||||||
|
|
||||||
void wxApp::DeletePendingObjects()
|
void wxApp::DeletePendingObjects()
|
||||||
{
|
{
|
||||||
@@ -866,14 +855,14 @@ void wxApp::DeletePendingObjects()
|
|||||||
//
|
//
|
||||||
pNode = wxPendingDelete.First();
|
pNode = wxPendingDelete.First();
|
||||||
}
|
}
|
||||||
}
|
} // end of wxApp::DeletePendingObjects
|
||||||
|
|
||||||
void wxApp::OnEndSession(
|
void wxApp::OnEndSession(
|
||||||
wxCloseEvent& WXUNUSED(rEvent))
|
wxCloseEvent& WXUNUSED(rEvent))
|
||||||
{
|
{
|
||||||
if (GetTopWindow())
|
if (GetTopWindow())
|
||||||
GetTopWindow()->Close(TRUE);
|
GetTopWindow()->Close(TRUE);
|
||||||
}
|
} // end of wxApp::OnEndSession
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default behaviour: close the application with prompts. The
|
// Default behaviour: close the application with prompts. The
|
||||||
@@ -888,33 +877,53 @@ void wxApp::OnQueryEndSession(
|
|||||||
if (!GetTopWindow()->Close(!rEvent.CanVeto()))
|
if (!GetTopWindow()->Close(!rEvent.CanVeto()))
|
||||||
rEvent.Veto(TRUE);
|
rEvent.Veto(TRUE);
|
||||||
}
|
}
|
||||||
}
|
} // end of wxApp::OnQueryEndSession
|
||||||
|
|
||||||
void wxExit()
|
void wxExit()
|
||||||
{
|
{
|
||||||
wxLogError(_("Fatal error: exiting"));
|
wxLogError(_("Fatal error: exiting"));
|
||||||
|
|
||||||
wxApp::CleanUp();
|
wxApp::CleanUp();
|
||||||
}
|
} // end of wxExit
|
||||||
|
|
||||||
|
//
|
||||||
// Yield to incoming messages
|
// Yield to incoming messages
|
||||||
|
//
|
||||||
bool wxYield()
|
bool wxYield()
|
||||||
{
|
{
|
||||||
HAB vHab = 0;
|
HAB vHab = 0;
|
||||||
QMSG vMsg;
|
QMSG vMsg;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Disable log flushing from here because a call to wxYield() shouldn't
|
||||||
|
// normally result in message boxes popping up &c
|
||||||
|
//
|
||||||
|
wxLog::Suspend();
|
||||||
|
|
||||||
|
//
|
||||||
// We want to go back to the main message loop
|
// We want to go back to the main message loop
|
||||||
// if we see a WM_QUIT. (?)
|
// if we see a WM_QUIT. (?)
|
||||||
|
//
|
||||||
while (::WinPeekMsg(vHab, &vMsg, (HWND)NULL, 0, 0, PM_NOREMOVE) && vMsg.msg != WM_QUIT)
|
while (::WinPeekMsg(vHab, &vMsg, (HWND)NULL, 0, 0, PM_NOREMOVE) && vMsg.msg != WM_QUIT)
|
||||||
{
|
{
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
wxMutexGuiLeaveOrEnter();
|
||||||
|
#endif // wxUSE_THREADS
|
||||||
if (!wxTheApp->DoMessage())
|
if (!wxTheApp->DoMessage())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
// If they are pending events, we must process them.
|
// If they are pending events, we must process them.
|
||||||
#if wxUSE_THREADS
|
//
|
||||||
wxTheApp->ProcessPendingEvents();
|
if (wxTheApp)
|
||||||
#endif
|
wxTheApp->ProcessPendingEvents();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Let the logs be flashed again
|
||||||
|
//
|
||||||
|
wxLog::Resume();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} // end of wxYield
|
||||||
|
|
||||||
wxIcon wxApp::GetStdIcon(
|
wxIcon wxApp::GetStdIcon(
|
||||||
int nWhich
|
int nWhich
|
||||||
@@ -939,7 +948,33 @@ wxIcon wxApp::GetStdIcon(
|
|||||||
return wxIcon("wxICON_ERROR");
|
return wxIcon("wxICON_ERROR");
|
||||||
}
|
}
|
||||||
return wxIcon("wxICON_ERROR");
|
return wxIcon("wxICON_ERROR");
|
||||||
}
|
} // end of wxApp::GetStdIcon
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxWakeUpIdle
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxWakeUpIdle()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Send the top window a dummy message so idle handler processing will
|
||||||
|
// start up again. Doing it this way ensures that the idle handler
|
||||||
|
// wakes up in the right thread (see also wxWakeUpMainThread() which does
|
||||||
|
// the same for the main app thread only)
|
||||||
|
//
|
||||||
|
wxWindow* pTopWindow = wxTheApp->GetTopWindow();
|
||||||
|
|
||||||
|
if (pTopWindow)
|
||||||
|
{
|
||||||
|
if ( !::WinPostMsg(GetHwndOf(pTopWindow), WM_NULL, (MPARAM)0, (MPARAM)0))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Should never happen
|
||||||
|
//
|
||||||
|
wxLogLastError("PostMessage(WM_NULL)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // end of wxWakeUpIdle
|
||||||
|
|
||||||
HINSTANCE wxGetInstance()
|
HINSTANCE wxGetInstance()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user