Merge branch 'master' into 1.0
[dcpomatic.git] / src / lib / ui_signaller.h
index 9de1b736ddf6246b4e7ac7b37598d50746bbe2f6..428ab698f1d3028f05c42705bb1ad76787120ba1 100644 (file)
 
 */
 
-#ifndef DVDOMATIC_UI_SIGNALLER_H
-#define DVDOMATIC_UI_SIGNALLER_H
+#ifndef DCPOMATIC_UI_SIGNALLER_H
+#define DCPOMATIC_UI_SIGNALLER_H
 
 #include <boost/bind.hpp>
 #include <boost/asio.hpp>
 #include <boost/thread.hpp>
 
+/** A class to allow signals to be emitted from non-UI threads and handled
+ *  by a UI thread.
+ */
 class UISignaller
 {
 public:
@@ -33,26 +36,38 @@ public:
        {
                _ui_thread = boost::this_thread::get_id ();
        }
-       
+
+       /** Emit a signal from any thread whose handlers will be called in the UI
+        *  thread.  Use something like:
+        *
+        *  ui_signaller->emit (boost::bind (boost::ref (SomeSignal), parameter));
+        */
        template <typename T>
        void emit (T f) {
                if (boost::this_thread::get_id() == _ui_thread) {
+                       /* already in the UI thread */
                        f ();
                } else {
+                       /* non-UI thread; post to the service and wake up the UI */
                        _service.post (f);
                        wake_ui ();
                }
        }
 
+       /** Call this in the UI when it is idle */
        void ui_idle () {
                _service.poll ();
        }
 
+       /** This should wake the UI and make it call ui_idle() */
        virtual void wake_ui () = 0;
 
 private:
+       /** A io_service which is used as the conduit for messages */
        boost::asio::io_service _service;
+       /** Object required to keep io_service from stopping when it has nothing to do */
        boost::asio::io_service::work _work;
+       /** The UI thread's ID */
        boost::thread::id _ui_thread;
 };