X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3754265e328a7cc7f67a46a9beea105cf1d49a14..b02dd12239c8a59b9a545d9fcb04974f8ad02c6b:/include/wx/msw/evtloop.h?ds=sidebyside diff --git a/include/wx/msw/evtloop.h b/include/wx/msw/evtloop.h index f3ccdaefbe..5c89e304bd 100644 --- a/include/wx/msw/evtloop.h +++ b/include/wx/msw/evtloop.h @@ -12,39 +12,108 @@ #ifndef _WX_MSW_EVTLOOP_H_ #define _WX_MSW_EVTLOOP_H_ +#if wxUSE_GUI +#include "wx/dynarray.h" +#include "wx/msw/wrapwin.h" +#include "wx/window.h" +#endif + // ---------------------------------------------------------------------------- // wxEventLoop // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxEventLoop : public wxEventLoopBase +class WXDLLIMPEXP_BASE wxMSWEventLoopBase : public wxEventLoopManual { public: - wxEventLoop(); + wxMSWEventLoopBase(); // implement base class pure virtuals - virtual int Run(); - virtual void Exit(int rc = 0); virtual bool Pending() const; - virtual bool Dispatch(); - virtual bool IsRunning() const; - // MSW-specific methods - // -------------------- +protected: + // get the next message from queue and return true or return false if we + // got WM_QUIT or an error occurred + bool GetNextMessage(WXMSG *msg); + + // same as above but with a timeout and return value can be -1 meaning that + // time out expired in addition to + int GetNextMessageTimeout(WXMSG *msg, unsigned long timeout); +}; + +#if wxUSE_GUI + +WX_DECLARE_EXPORTED_OBJARRAY(MSG, wxMSGArray); + +class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxMSWEventLoopBase +{ +public: + wxGUIEventLoop() { } + + // process a single message: calls PreProcessMessage() before dispatching + // it + virtual void ProcessMessage(WXMSG *msg); // preprocess a message, return true if processed (i.e. no further // dispatching required) virtual bool PreProcessMessage(WXMSG *msg); - // process a single message - virtual void ProcessMessage(WXMSG *msg); + // set the critical window: this is the window such that all the events + // except those to this window (and its children) stop to be processed + // (typical examples: assert or crash report dialog) + // + // calling this function with NULL argument restores the normal event + // handling + static void SetCriticalWindow(wxWindowMSW *win) { ms_winCritical = win; } + + // return true if there is no critical window or if this window is [a child + // of] the critical one + static bool AllowProcessing(wxWindowMSW *win) + { + return !ms_winCritical || IsChildOfCriticalWindow(win); + } + + // override/implement base class virtuals + virtual bool Dispatch(); + virtual int DispatchTimeout(unsigned long timeout); + virtual void WakeUp(); + virtual bool YieldFor(long eventsToProcess); protected: - // should we exit the loop? - bool m_shouldExit; + virtual void OnNextIteration(); - // the loop exit code - int m_exitcode; +private: + // check if the given window is a child of ms_winCritical (which must be + // non NULL) + static bool IsChildOfCriticalWindow(wxWindowMSW *win); + + // array of messages used for temporary storage by YieldFor() + wxMSGArray m_arrMSG; + + // critical window or NULL + static wxWindowMSW *ms_winCritical; }; -#endif // _WX_MSW_EVTLOOP_H_ +#else // !wxUSE_GUI + +#if wxUSE_CONSOLE_EVENTLOOP +class WXDLLIMPEXP_BASE wxConsoleEventLoop : public wxMSWEventLoopBase +{ +public: + wxConsoleEventLoop() { } + + // override/implement base class virtuals + virtual bool Dispatch(); + virtual int DispatchTimeout(unsigned long timeout); + virtual void WakeUp(); + virtual bool YieldFor(long WXUNUSED(eventsToProcess)) { return true; } + + // MSW-specific function to process a single message + virtual void ProcessMessage(WXMSG *msg); +}; + +#endif // wxUSE_CONSOLE_EVENTLOOP + +#endif // wxUSE_GUI/!wxUSE_GUI + +#endif // _WX_MSW_EVTLOOP_H_