summaryrefslogtreecommitdiff
path: root/libs/pbd/pbd/timer.h
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2014-12-25 20:44:06 +0700
committerTim Mayberry <mojofunk@gmail.com>2015-01-01 18:59:01 +0700
commitb959b3fb87f4e3b740d3ad64024d1c8c3eb0aebc (patch)
tree17f9cdc4eea4a61a99bdd0499e64216cc7ee8850 /libs/pbd/pbd/timer.h
parent770c190ccff8e6096e0bff9c78b42633020f72be (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.h121
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__