diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2014-12-25 20:44:06 +0700 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2015-01-01 18:59:01 +0700 |
commit | b959b3fb87f4e3b740d3ad64024d1c8c3eb0aebc (patch) | |
tree | 17f9cdc4eea4a61a99bdd0499e64216cc7ee8850 /libs/pbd/pbd/timer.h | |
parent | 770c190ccff8e6096e0bff9c78b42633020f72be (diff) |
Add PBD::Timer/StandardTimer/BlinkTimer classes for convenient timeouts
Diffstat (limited to 'libs/pbd/pbd/timer.h')
-rw-r--r-- | libs/pbd/pbd/timer.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/libs/pbd/pbd/timer.h b/libs/pbd/pbd/timer.h new file mode 100644 index 0000000000..4c80d9d088 --- /dev/null +++ b/libs/pbd/pbd/timer.h @@ -0,0 +1,121 @@ +/* + Copyright (C) 2014 Tim Mayberry + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libpbd_timer_h__ +#define __libpbd_timer_h__ + +#include <sigc++/signal.h> + +#include <glibmm/main.h> + +#include "pbd/libpbd_visibility.h" + +namespace PBD { + +/** + * The Timer class is a wrapper around Glib TimeoutSources + * The Timer will start automatically when the first connection + * is made and stop when the last callback is disconnected. + */ +class LIBPBD_API Timer +{ +public: + + Timer (unsigned int interval, + const Glib::RefPtr<Glib::MainContext>& main_context); + + unsigned int get_interval () const; + + void set_interval (unsigned int new_interval); + + virtual unsigned int connection_count () const = 0; + +protected: + + virtual ~Timer() { } + + void start (); + + void stop (); + + virtual bool on_elapsed () = 0; + +private: + + Timer(const Timer&); + Timer& operator= (const Timer&); + +private: + + static gboolean _timeout_handler (void *data); + + bool timeout_handler (); + + GSource* m_timeout_source; + + unsigned int m_timeout_interval; + + const Glib::RefPtr<Glib::MainContext> m_main_context; + +}; + +class LIBPBD_API StandardTimer : public Timer +{ +public: + + StandardTimer (unsigned int interval, + const Glib::RefPtr<Glib::MainContext>& main_context = Glib::MainContext::get_default()); + + sigc::connection connect (const sigc::slot<void>& slot); + + virtual unsigned int connection_count () const + { return m_signal.size (); } + +protected: + + virtual bool on_elapsed (); + + sigc::signal<void> m_signal; + +}; + +class LIBPBD_API BlinkTimer : public Timer +{ +public: + + BlinkTimer (unsigned int interval, + const Glib::RefPtr<Glib::MainContext>& main_context = Glib::MainContext::get_default()); + + + sigc::connection connect (const sigc::slot<void, bool>& slot); + + virtual unsigned int connection_count () const + { return m_blink_signal.size (); } + +protected: + + virtual bool on_elapsed (); + + sigc::signal<void, bool> m_blink_signal; + +}; + +} // namespace PBD + +#endif // __libpbd_timer_h__ |