Any event sources should be registered with all the event loops, including the ones that will be started in the future, and not only the current (and potentially not even existing yet) one. So make AddSourceForFD() method static. To still allow it to do different things in console and GUI applications, as it must, virtualize it via the new wxEventLoopSourcesManager class which has different implementations in the two cases, returned via wxAppTraits as usual. Notice that this required moving the implementation of this method from src/osx/core/evtloop_cf.cpp to src/osx/core/utilsexc_cf.cpp as the former file is base-only and didn't have access to wxGUIAppTraits. See #10258. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74341 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
116 lines
3.8 KiB
C++
116 lines
3.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/osx/core/evtloop.h
|
|
// Purpose: CoreFoundation-based event loop
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 2006-01-12
|
|
// RCS-ID: $Id$
|
|
// 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();
|
|
|
|
virtual bool YieldFor(long eventsToProcess);
|
|
|
|
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();
|
|
|
|
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_
|