2001-06-29 13:21:17 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: wx/evtloop.h
|
|
|
|
// Purpose: declares wxEventLoop class
|
|
|
|
// Author: Vadim Zeitlin
|
|
|
|
// Modified by:
|
|
|
|
// Created: 01.06.01
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
2004-05-23 16:53:33 -04:00
|
|
|
// Licence: wxWindows licence
|
2001-06-29 13:21:17 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#ifndef _WX_EVTLOOP_H_
|
|
|
|
#define _WX_EVTLOOP_H_
|
|
|
|
|
2003-08-09 08:38:21 -04:00
|
|
|
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
|
2001-06-29 13:21:17 -04:00
|
|
|
#pragma interface "evtloop.h"
|
|
|
|
#endif
|
|
|
|
|
2003-09-18 06:01:59 -04:00
|
|
|
#include "wx/utils.h"
|
|
|
|
|
2004-07-30 18:54:31 -04:00
|
|
|
class WXDLLEXPORT wxEventLoop;
|
2003-09-17 19:32:32 -04:00
|
|
|
|
2001-06-29 13:21:17 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxEventLoop: a GUI event loop
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2004-07-30 18:54:31 -04:00
|
|
|
class WXDLLEXPORT wxEventLoopBase
|
2001-06-29 13:21:17 -04:00
|
|
|
{
|
|
|
|
public:
|
2004-07-30 18:54:31 -04:00
|
|
|
// trivial, but needed (because of wxEventLoopBase) ctor
|
|
|
|
wxEventLoopBase() { }
|
2001-06-29 13:21:17 -04:00
|
|
|
|
|
|
|
// dtor
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual ~wxEventLoopBase() { }
|
2001-06-29 13:21:17 -04:00
|
|
|
|
|
|
|
// start the event loop, return the exit code when it is finished
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual int Run() = 0;
|
2001-06-29 13:21:17 -04:00
|
|
|
|
|
|
|
// exit from the loop with the given exit code
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual void Exit(int rc = 0) = 0;
|
2001-06-29 13:21:17 -04:00
|
|
|
|
2004-09-13 14:03:44 -04:00
|
|
|
// return true if any events are available
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual bool Pending() const = 0;
|
2001-06-29 13:21:17 -04:00
|
|
|
|
2004-09-13 14:03:44 -04:00
|
|
|
// dispatch a single event, return false if we should exit from the loop
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual bool Dispatch() = 0;
|
2001-06-29 13:21:17 -04:00
|
|
|
|
|
|
|
// is the event loop running now?
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual bool IsRunning() const = 0;
|
2003-09-15 15:55:17 -04:00
|
|
|
|
2001-08-12 18:10:20 -04:00
|
|
|
// return currently active (running) event loop, may be NULL
|
|
|
|
static wxEventLoop *GetActive() { return ms_activeLoop; }
|
2001-06-29 13:21:17 -04:00
|
|
|
|
2002-03-24 16:19:27 -05:00
|
|
|
// set currently active (running) event loop
|
|
|
|
static void SetActive(wxEventLoop* loop) { ms_activeLoop = loop; }
|
|
|
|
|
2001-06-29 13:21:17 -04:00
|
|
|
protected:
|
2003-09-17 19:32:32 -04:00
|
|
|
// this function should be called before the event loop terminates, whether
|
|
|
|
// this happens normally (because of Exit() call) or abnormally (because of
|
|
|
|
// an exception thrown from inside the loop)
|
|
|
|
virtual void OnExit() { }
|
|
|
|
|
|
|
|
|
2001-08-12 18:10:20 -04:00
|
|
|
// the pointer to currently active loop
|
|
|
|
static wxEventLoop *ms_activeLoop;
|
2003-01-02 18:38:11 -05:00
|
|
|
|
2004-07-30 18:54:31 -04:00
|
|
|
DECLARE_NO_COPY_CLASS(wxEventLoopBase)
|
|
|
|
};
|
|
|
|
|
|
|
|
// we're moving away from old m_impl wxEventLoop model as otherwise the user
|
|
|
|
// code doesn't have access to platform-specific wxEventLoop methods and this
|
|
|
|
// can sometimes be very useful (e.g. under MSW this is necessary for
|
|
|
|
// integration with MFC) but currently this is done for MSW only, other ports
|
|
|
|
// should follow a.s.a.p.
|
|
|
|
#ifdef __WXMSW__
|
|
|
|
#include "wx/msw/evtloop.h"
|
|
|
|
#else
|
|
|
|
|
|
|
|
class WXDLLEXPORT wxEventLoopImpl;
|
|
|
|
|
|
|
|
class WXDLLEXPORT wxEventLoop : public wxEventLoopBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxEventLoop() { m_impl = NULL; }
|
2004-07-31 00:39:49 -04:00
|
|
|
virtual ~wxEventLoop();
|
2004-09-13 14:03:44 -04:00
|
|
|
|
2004-07-30 18:54:31 -04:00
|
|
|
virtual int Run();
|
|
|
|
virtual void Exit(int rc = 0);
|
|
|
|
virtual bool Pending() const;
|
|
|
|
virtual bool Dispatch();
|
2004-09-22 20:58:21 -04:00
|
|
|
virtual bool IsRunning() const { return GetActive() == this; }
|
2004-07-30 18:54:31 -04:00
|
|
|
|
|
|
|
protected:
|
2003-09-17 19:32:32 -04:00
|
|
|
// the pointer to the port specific implementation class
|
|
|
|
wxEventLoopImpl *m_impl;
|
|
|
|
|
2003-01-02 18:38:11 -05:00
|
|
|
DECLARE_NO_COPY_CLASS(wxEventLoop)
|
2004-07-31 00:39:49 -04:00
|
|
|
};
|
2004-07-30 18:54:31 -04:00
|
|
|
|
|
|
|
#endif // __WXMSW__/!__WXMSW__
|
2001-06-29 13:21:17 -04:00
|
|
|
|
2003-09-17 19:32:32 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxModalEventLoop
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// this is a naive generic implementation which uses wxWindowDisabler to
|
|
|
|
// implement modality, we will surely need platform-specific implementations
|
|
|
|
// too, this generic implementation is here only temporarily to see how it
|
|
|
|
// works
|
|
|
|
class WXDLLEXPORT wxModalEventLoop : public wxEventLoop
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxModalEventLoop(wxWindow *winModal)
|
|
|
|
{
|
|
|
|
m_windowDisabler = new wxWindowDisabler(winModal);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void OnExit()
|
|
|
|
{
|
|
|
|
delete m_windowDisabler;
|
|
|
|
m_windowDisabler = NULL;
|
|
|
|
|
|
|
|
wxEventLoop::OnExit();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
wxWindowDisabler *m_windowDisabler;
|
|
|
|
};
|
|
|
|
|
2001-06-29 13:21:17 -04:00
|
|
|
#endif // _WX_EVTLOOP_H_
|