]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/unix/private/timer.h
preparation for allowing to use wxTimer in wxBase (heavily modified patch 1113088):
[wxWidgets.git] / include / wx / unix / private / timer.h
diff --git a/include/wx/unix/private/timer.h b/include/wx/unix/private/timer.h
new file mode 100644 (file)
index 0000000..cdcf53b
--- /dev/null
@@ -0,0 +1,131 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/unix/private/timer.h
+// Purpose:     wxTimer for wxBase (unix)
+// Author:      Lukasz Michalski
+// Created:     15/01/2005
+// RCS-ID:      $Id$
+// Copyright:   (c) Lukasz Michalski
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_UNIX_PRIVATE_TIMER_H_
+#define _WX_UNIX_PRIVATE_TIMER_H_
+
+#include "wx/private/timer.h"
+
+// the type used for milliseconds is large enough for microseconds too but
+// introduce a synonym for it to avoid confusion
+typedef wxMilliClock_t wxUsecClock_t;
+
+// ----------------------------------------------------------------------------
+// wxTimer implementation class for Unix platforms
+// ----------------------------------------------------------------------------
+
+class wxUnixTimerImpl : public wxTimerImpl
+{
+public:
+    wxUnixTimerImpl(wxTimer *timer);
+    virtual ~wxUnixTimerImpl();
+
+    virtual bool IsRunning() const;
+    virtual bool Start(int milliseconds = -1, bool oneShot = false);
+    virtual void Stop();
+
+private:
+    bool m_isRunning;
+
+    friend class wxTimerScheduler;
+};
+
+// ----------------------------------------------------------------------------
+// wxTimerSchedule: information about a single timer, used by wxTimerScheduler
+// ----------------------------------------------------------------------------
+
+struct wxTimerSchedule
+{
+    wxTimerSchedule(wxUnixTimerImpl *timer, wxUsecClock_t expiration)
+        : m_timer(timer),
+          m_expiration(expiration)
+    {
+    }
+
+    // the timer itself (we don't own this pointer)
+    wxUnixTimerImpl *m_timer;
+
+    // the time of its next expiration, in usec
+    wxUsecClock_t m_expiration;
+};
+
+// the linked list of all active timers, we keep it sorted by expiration time
+WX_DECLARE_LIST(wxTimerSchedule, wxTimerList);
+
+// ----------------------------------------------------------------------------
+// wxTimerScheduler: class responsible for updating all timers
+// ----------------------------------------------------------------------------
+
+class wxTimerScheduler
+{
+public:
+    // get the unique timer scheduler instance
+    static wxTimerScheduler& Get()
+    {
+        if ( !ms_instance )
+            ms_instance = new wxTimerScheduler;
+
+        return *ms_instance;
+    }
+
+    // must be called on shutdown to delete the global timer scheduler
+    static void Shutdown()
+    {
+        if ( ms_instance )
+        {
+            delete ms_instance;
+            ms_instance = NULL;
+        }
+    }
+
+    // adds timer which should expire at the given absolute time to the list
+    void AddTimer(wxUnixTimerImpl *timer, wxUsecClock_t expiration);
+
+    // remove timer from the list, called automatically from timer dtor
+    void RemoveTimer(wxUnixTimerImpl *timer);
+
+
+    // the functions below are used by the event loop implementation to monitor
+    // and notify timers:
+
+    // if this function returns true, the time remaining until the next time
+    // expiration is returned in the provided parameter (always positive or 0)
+    //
+    // it returns false if there are no timers
+    bool GetNext(wxUsecClock_t *remaining) const;
+
+    // trigger the timer event for all timers which have expired
+    void NotifyExpired();
+
+private:
+    // ctor and dtor are private, this is a singleton class only created by
+    // Get() and destroyed by Shutdown()
+    wxTimerScheduler() { }
+    ~wxTimerScheduler();
+
+    // add the given timer schedule to the list in the right place
+    //
+    // we take ownership of the pointer "s" which must be heap-allocated
+    void DoAddTimer(wxTimerSchedule *s);
+
+
+    // the list of all currently active timers sorted by expiration
+    wxTimerList m_timers;
+
+    static wxTimerScheduler *ms_instance;
+};
+
+// this helper function currently only exists for Unix platforms but could be
+// moved to wx/stopwatch.h if it turns out to be useful elsewhere
+//
+// returns the number of microseconds since the Epoch
+extern wxUsecClock_t wxGetLocalTimeUsec();
+
+#endif // _WX_UNIX_PRIVATE_TIMER_H_