From 7ce6da52a1d67ebe79fac0d8add6ad8f19b38528 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 24 Jul 2012 20:45:43 +0000 Subject: [PATCH] Extract OS X non-GUI event loop in a separate header. This will allow its reuse from non-wxOSX ports, e.g. wxGTK under OS X. Closes #14519. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72206 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 7 +++ build/bakefiles/files.bkl | 1 + include/wx/evtloop.h | 22 ++++--- include/wx/osx/core/evtloop.h | 111 ++++++++++++++++++++++++++++++++++ include/wx/osx/evtloop.h | 100 ------------------------------ 5 files changed, 132 insertions(+), 109 deletions(-) create mode 100644 include/wx/osx/core/evtloop.h diff --git a/Makefile.in b/Makefile.in index edba172661..4e24080c53 100644 --- a/Makefile.in +++ b/Makefile.in @@ -2358,6 +2358,7 @@ COND_TOOLKIT_OSX_CARBON_BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h \ @@ -2378,6 +2379,7 @@ COND_TOOLKIT_OSX_COCOA_BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h \ @@ -2411,6 +2413,7 @@ COND_TOOLKIT_COCOA_BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h @@ -2433,6 +2436,7 @@ COND_TOOLKIT_GTK_BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h @@ -2455,6 +2459,7 @@ COND_TOOLKIT_X11_BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h @@ -2477,6 +2482,7 @@ COND_TOOLKIT_MOTIF_BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h @@ -2499,6 +2505,7 @@ COND_TOOLKIT__BASE_OSX_HDR = \ wx/osx/core/cfref.h \ wx/osx/core/cfstring.h \ wx/osx/core/hid.h \ + wx/osx/core/evtloop.h \ wx/osx/core/objcid.h \ wx/osx/core/private.h \ wx/osx/core/stdpaths.h diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 5c9e1d4818..f3983d32c0 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -198,6 +198,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/osx/core/cfref.h wx/osx/core/cfstring.h wx/osx/core/hid.h + wx/osx/core/evtloop.h wx/osx/core/objcid.h wx/osx/core/private.h wx/osx/core/stdpaths.h diff --git a/include/wx/evtloop.h b/include/wx/evtloop.h index 3923c6620e..ee6759d5b3 100644 --- a/include/wx/evtloop.h +++ b/include/wx/evtloop.h @@ -236,8 +236,17 @@ private: #if defined(__DARWIN__) // CoreFoundation-based event loop is currently in wxBase so include it in // any case too (although maybe it actually shouldn't be there at all) - #include "wx/osx/evtloop.h" -#elif wxUSE_GUI + #include "wx/osx/core/evtloop.h" +#endif + +// include the header defining wxConsoleEventLoop +#if defined(__UNIX__) && !defined(__WXMSW__) + #include "wx/unix/evtloop.h" +#elif defined(__WINDOWS__) + #include "wx/msw/evtloopconsole.h" +#endif + +#if wxUSE_GUI // include the appropriate header defining wxGUIEventLoop @@ -245,6 +254,8 @@ private: #include "wx/msw/evtloop.h" #elif defined(__WXCOCOA__) #include "wx/cocoa/evtloop.h" +#elif defined(__WXOSX__) + #include "wx/osx/evtloop.h" #elif defined(__WXDFB__) #include "wx/dfb/evtloop.h" #elif defined(__WXGTK20__) @@ -306,13 +317,6 @@ protected: #endif // wxUSE_GUI -// include the header defining wxConsoleEventLoop for Unix systems -#if defined(__UNIX__) && !defined(__WXMSW__) -#include "wx/unix/evtloop.h" -#elif defined(__WINDOWS__) -#include "wx/msw/evtloopconsole.h" -#endif - #if wxUSE_GUI // we use a class rather than a typedef because wxEventLoop is // forward-declared in many places diff --git a/include/wx/osx/core/evtloop.h b/include/wx/osx/core/evtloop.h new file mode 100644 index 0000000000..79e7f2d9ba --- /dev/null +++ b/include/wx/osx/core/evtloop.h @@ -0,0 +1,111 @@ +/////////////////////////////////////////////////////////////////////////////// +// 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 +// 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_BASE wxCFEventLoopPauseIdleEvents; + +class WXDLLIMPEXP_BASE wxCFEventLoop : public wxEventLoopBase +{ + friend class wxCFEventLoopPauseIdleEvents; +public: + wxCFEventLoop(); + virtual ~wxCFEventLoop(); + + // enters a loop calling OnNextIteration(), Pending() and Dispatch() and + // terminating when Exit() is called + virtual int Run(); + + // sets the "should exit" flag and wakes up the loop so that it terminates + // soon + virtual void Exit(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); + +#if wxUSE_EVENTLOOP_SOURCE + virtual wxEventLoopSource * + AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); +#endif // wxUSE_EVENTLOOP_SOURCE + +protected: + 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 DoRun(); + + virtual void DoStop(); + + // should we exit the loop? + bool m_shouldExit; + + // 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; + +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(); +}; + +#endif // _WX_OSX_EVTLOOP_H_ diff --git a/include/wx/osx/evtloop.h b/include/wx/osx/evtloop.h index efbb220918..a26f03372f 100644 --- a/include/wx/osx/evtloop.h +++ b/include/wx/osx/evtloop.h @@ -14,104 +14,6 @@ #ifndef _WX_OSX_EVTLOOP_H_ #define _WX_OSX_EVTLOOP_H_ -DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoop ); -DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoopObserver ); - -class WXDLLIMPEXP_BASE wxCFEventLoopPauseIdleEvents; - -class WXDLLIMPEXP_BASE wxCFEventLoop : public wxEventLoopBase -{ - friend class wxCFEventLoopPauseIdleEvents; -public: - wxCFEventLoop(); - virtual ~wxCFEventLoop(); - - // enters a loop calling OnNextIteration(), Pending() and Dispatch() and - // terminating when Exit() is called - virtual int Run(); - - // sets the "should exit" flag and wakes up the loop so that it terminates - // soon - virtual void Exit(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); - -#if wxUSE_EVENTLOOP_SOURCE - virtual wxEventLoopSource * - AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); -#endif // wxUSE_EVENTLOOP_SOURCE - -protected: - 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 DoRun(); - - virtual void DoStop(); - - // should we exit the loop? - bool m_shouldExit; - - // 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; - -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(); -}; - -#if wxUSE_GUI - #ifdef __WXOSX_COCOA__ #include "wx/osx/cocoa/evtloop.h" #else @@ -137,6 +39,4 @@ protected: WXWindow m_modalNativeWindow; }; -#endif // wxUSE_GUI - #endif // _WX_OSX_EVTLOOP_H_ -- 2.47.2