summaryrefslogtreecommitdiff
path: root/libs/pbd3/pbd/abstract_ui.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/pbd3/pbd/abstract_ui.h')
-rw-r--r--libs/pbd3/pbd/abstract_ui.h69
1 files changed, 40 insertions, 29 deletions
diff --git a/libs/pbd3/pbd/abstract_ui.h b/libs/pbd3/pbd/abstract_ui.h
index 0c845c15cd..98f077cb48 100644
--- a/libs/pbd3/pbd/abstract_ui.h
+++ b/libs/pbd3/pbd/abstract_ui.h
@@ -21,47 +21,58 @@
#ifndef __pbd_abstract_ui_h__
#define __pbd_abstract_ui_h__
-#include <pbd/receiver.h>
+#include <map>
+#include <string>
+#include <pthread.h>
+
#include <sigc++/sigc++.h>
+#include <pbd/receiver.h>
+#include <pbd/lockmonitor.h>
+#include <pbd/ringbufferNPT.h>
+#include <pbd/base_ui.h>
+
class Touchable;
-class AbstractUI : public Receiver
+template <class RequestObject>
+class AbstractUI : public BaseUI
{
public:
- enum RequestType {
- ErrorMessage,
- Quit,
- CallSlot,
- CallSlotLocked,
- TouchDisplay,
- StateChange,
- SetTip,
- AddIdle,
- AddTimeout,
- };
-
- bool ok() { return _ok; }
-
- AbstractUI () {}
+ AbstractUI (std::string name, bool with_signal_pipe);
virtual ~AbstractUI() {}
- virtual void run (Receiver &old_receiver) = 0;
- virtual void quit () = 0;
- virtual bool running () = 0;
- virtual void request (RequestType) = 0;
- virtual void touch_display (Touchable *) = 0;
- virtual void call_slot (sigc::slot<void>) = 0;
- virtual bool caller_is_gui_thread() = 0;
+ virtual bool caller_is_ui_thread() = 0;
+
+ void call_slot (sigc::slot<void> el_slot) {
+ RequestObject *req = get_request (BaseUI::CallSlot);
+
+ if (req == 0) {
+ return;
+ }
+
+ req->slot = el_slot;
+ send_request (req);
+ }
- /* needed to be a receiver ... */
+ void register_thread (pthread_t, std::string);
+ void register_thread_with_request_count (pthread_t, std::string, uint32_t num_requests);
- virtual void receive (Transmitter::Channel, const char *) = 0;
-
protected:
- bool _ok;
+ typedef RingBufferNPT<RequestObject> RequestBuffer;
+ typedef typename RequestBuffer::rw_vector RequestBufferVector;
+ typedef typename std::map<pthread_t,RequestBuffer*>::iterator RequestBufferMapIterator;
+
+ PBD::Lock request_buffer_map_lock;
+ typedef std::map<pthread_t,RequestBuffer*> RequestBufferMap;
+ RequestBufferMap request_buffers;
+ pthread_key_t thread_request_buffer_key;
+ RequestObject* get_request (RequestType);
+ void handle_ui_requests ();
+ void send_request (RequestObject *);
+
+ virtual void do_request (RequestObject *) = 0;
};
-#endif // __pbd_abstract_ui_h__
+#endif /* __pbd_abstract_ui_h__ */