]> git.saurik.com Git - wxWidgets.git/blame - include/wx/osx/core/evtloop.h
Richtext interface fixes and additions for Phoenix
[wxWidgets.git] / include / wx / osx / core / evtloop.h
CommitLineData
7ce6da52
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/osx/core/evtloop.h
3// Purpose: CoreFoundation-based event loop
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 2006-01-12
7// RCS-ID: $Id$
8// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_OSX_CORE_EVTLOOP_H_
13#define _WX_OSX_CORE_EVTLOOP_H_
14
15DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoop );
16DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoopObserver );
17
754afd10 18class WXDLLIMPEXP_FWD_BASE wxCFEventLoopPauseIdleEvents;
7ce6da52
VZ
19
20class WXDLLIMPEXP_BASE wxCFEventLoop : public wxEventLoopBase
21{
22 friend class wxCFEventLoopPauseIdleEvents;
23public:
24 wxCFEventLoop();
25 virtual ~wxCFEventLoop();
26
27 // enters a loop calling OnNextIteration(), Pending() and Dispatch() and
28 // terminating when Exit() is called
29 virtual int Run();
30
31 // sets the "should exit" flag and wakes up the loop so that it terminates
32 // soon
33 virtual void Exit(int rc = 0);
34
35 // return true if any events are available
36 virtual bool Pending() const;
37
38 // dispatch a single event, return false if we should exit from the loop
39 virtual bool Dispatch();
40
41 // same as Dispatch() but doesn't wait for longer than the specified (in
42 // ms) timeout, return true if an event was processed, false if we should
43 // exit the loop or -1 if timeout expired
44 virtual int DispatchTimeout(unsigned long timeout);
45
46 // implement this to wake up the loop: usually done by posting a dummy event
47 // to it (can be called from non main thread)
48 virtual void WakeUp();
49
50 virtual bool YieldFor(long eventsToProcess);
51
52#if wxUSE_EVENTLOOP_SOURCE
53 virtual wxEventLoopSource *
54 AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags);
55#endif // wxUSE_EVENTLOOP_SOURCE
56
57protected:
58 void CommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity);
59 void DefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity);
60
61 // set to false to avoid idling at unexpected moments - eg when having native message boxes
62 void SetProcessIdleEvents(bool process) { m_processIdleEvents = process; }
63
64 static void OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info);
65 static void OSXDefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info);
66
67 // get the currently executing CFRunLoop
68 virtual CFRunLoopRef CFGetCurrentRunLoop() const;
69
70 virtual int DoDispatchTimeout(unsigned long timeout);
71
72 virtual void DoRun();
73
74 virtual void DoStop();
75
76 // should we exit the loop?
77 bool m_shouldExit;
78
79 // the loop exit code
80 int m_exitcode;
81
82 // cfrunloop
83 CFRunLoopRef m_runLoop;
84
85 // common modes runloop observer
86 CFRunLoopObserverRef m_commonModeRunLoopObserver;
87
88 // default mode runloop observer
89 CFRunLoopObserverRef m_defaultModeRunLoopObserver;
90
91 // set to false to avoid idling at unexpected moments - eg when having native message boxes
92 bool m_processIdleEvents;
93
94private:
95 // process all already pending events and dispatch a new one (blocking
96 // until it appears in the event queue if necessary)
97 //
98 // returns the return value of DoDispatchTimeout()
99 int DoProcessEvents();
100
101 wxDECLARE_NO_COPY_CLASS(wxCFEventLoop);
102};
103
104class WXDLLIMPEXP_BASE wxCFEventLoopPauseIdleEvents : public wxObject
105{
106public:
107 wxCFEventLoopPauseIdleEvents();
108 virtual ~wxCFEventLoopPauseIdleEvents();
109};
110
111#endif // _WX_OSX_EVTLOOP_H_