git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76224 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			119 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/osx/core/evtloop.h
 | 
						|
// Purpose:     CoreFoundation-based event loop
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Modified by:
 | 
						|
// Created:     2006-01-12
 | 
						|
// Copyright:   (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_OSX_CORE_EVTLOOP_H_
 | 
						|
#define _WX_OSX_CORE_EVTLOOP_H_
 | 
						|
 | 
						|
DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoop )
 | 
						|
DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoopObserver )
 | 
						|
 | 
						|
class WXDLLIMPEXP_FWD_BASE wxCFEventLoopPauseIdleEvents;
 | 
						|
 | 
						|
class WXDLLIMPEXP_BASE wxCFEventLoop : public wxEventLoopBase
 | 
						|
{
 | 
						|
    friend class wxCFEventLoopPauseIdleEvents;
 | 
						|
public:
 | 
						|
    wxCFEventLoop();
 | 
						|
    virtual ~wxCFEventLoop();
 | 
						|
 | 
						|
    // sets the "should exit" flag and wakes up the loop so that it terminates
 | 
						|
    // soon
 | 
						|
    virtual void ScheduleExit(int rc = 0);
 | 
						|
 | 
						|
    // return true if any events are available
 | 
						|
    virtual bool Pending() const;
 | 
						|
 | 
						|
    // dispatch a single event, return false if we should exit from the loop
 | 
						|
    virtual bool Dispatch();
 | 
						|
 | 
						|
    // same as Dispatch() but doesn't wait for longer than the specified (in
 | 
						|
    // ms) timeout, return true if an event was processed, false if we should
 | 
						|
    // exit the loop or -1 if timeout expired
 | 
						|
    virtual int DispatchTimeout(unsigned long timeout);
 | 
						|
 | 
						|
    // implement this to wake up the loop: usually done by posting a dummy event
 | 
						|
    // to it (can be called from non main thread)
 | 
						|
    virtual void WakeUp();
 | 
						|
 | 
						|
    bool ShouldProcessIdleEvents() const { return m_processIdleEvents ; }
 | 
						|
    
 | 
						|
#if wxUSE_UIACTIONSIMULATOR
 | 
						|
    // notifies Yield and Dispatch to wait for at least one event before
 | 
						|
    // returning, this is necessary, because the synthesized events need to be
 | 
						|
    // converted by the OS before being available on the native event queue
 | 
						|
    void SetShouldWaitForEvent(bool should) { m_shouldWaitForEvent = should; }
 | 
						|
#endif
 | 
						|
protected:
 | 
						|
    // enters a loop calling OnNextIteration(), Pending() and Dispatch() and
 | 
						|
    // terminating when Exit() is called
 | 
						|
    virtual int DoRun();
 | 
						|
 | 
						|
    // may be overridden to perform some action at the start of each new event
 | 
						|
    // loop iteration
 | 
						|
    virtual void OnNextIteration() {}
 | 
						|
 | 
						|
    virtual void DoYieldFor(long eventsToProcess);
 | 
						|
 | 
						|
    void CommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity);
 | 
						|
    void DefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity);
 | 
						|
 | 
						|
    // set to false to avoid idling at unexpected moments - eg when having native message boxes
 | 
						|
    void SetProcessIdleEvents(bool process) { m_processIdleEvents = process; }
 | 
						|
 | 
						|
    static void OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info);
 | 
						|
    static void OSXDefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info);
 | 
						|
 | 
						|
    // get the currently executing CFRunLoop
 | 
						|
    virtual CFRunLoopRef CFGetCurrentRunLoop() const;
 | 
						|
 | 
						|
    virtual int DoDispatchTimeout(unsigned long timeout);
 | 
						|
 | 
						|
    virtual void OSXDoRun();
 | 
						|
    virtual void OSXDoStop();
 | 
						|
 | 
						|
    // the loop exit code
 | 
						|
    int m_exitcode;
 | 
						|
 | 
						|
    // cfrunloop
 | 
						|
    CFRunLoopRef m_runLoop;
 | 
						|
 | 
						|
    // common modes runloop observer
 | 
						|
    CFRunLoopObserverRef m_commonModeRunLoopObserver;
 | 
						|
 | 
						|
    // default mode runloop observer
 | 
						|
    CFRunLoopObserverRef m_defaultModeRunLoopObserver;
 | 
						|
 | 
						|
    // set to false to avoid idling at unexpected moments - eg when having native message boxes
 | 
						|
    bool m_processIdleEvents;
 | 
						|
 | 
						|
#if wxUSE_UIACTIONSIMULATOR
 | 
						|
    bool m_shouldWaitForEvent;
 | 
						|
#endif
 | 
						|
private:
 | 
						|
    // process all already pending events and dispatch a new one (blocking
 | 
						|
    // until it appears in the event queue if necessary)
 | 
						|
    //
 | 
						|
    // returns the return value of DoDispatchTimeout()
 | 
						|
    int DoProcessEvents();
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxCFEventLoop);
 | 
						|
};
 | 
						|
 | 
						|
class WXDLLIMPEXP_BASE wxCFEventLoopPauseIdleEvents : public wxObject
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxCFEventLoopPauseIdleEvents();
 | 
						|
    virtual ~wxCFEventLoopPauseIdleEvents();
 | 
						|
private:
 | 
						|
    bool m_formerState;
 | 
						|
};
 | 
						|
 | 
						|
#endif // _WX_OSX_EVTLOOP_H_
 |