eventloop and abstractui debugging, lots more commenting on abstractui/eventloop...
[ardour.git] / libs / ardour / ardour / midi_ui.h
1 #ifndef __libardour_midi_ui_h__
2 #define __libardour_midi_ui_h__
3
4 #include <list>
5
6 #include "pbd/abstract_ui.h"
7 #include "pbd/signals.h"
8 #include "pbd/stacktrace.h"
9
10 namespace MIDI {
11         class Port;
12 }
13
14 namespace ARDOUR {
15
16 class Session;
17
18 /* this is mostly a placeholder because I suspect that at some
19    point we will want to add more members to accomodate
20    certain types of requests to the MIDI UI
21 */
22
23 struct MidiUIRequest : public BaseUI::BaseRequestObject {
24   public:
25         MidiUIRequest () { }
26         ~MidiUIRequest() { }
27 };
28
29 class MidiControlUI : public AbstractUI<MidiUIRequest>
30 {
31   public:
32         MidiControlUI (Session& s);
33         ~MidiControlUI ();
34
35         static MidiControlUI* instance() { return _instance; }
36
37         static BaseUI::RequestType PortChange;
38
39         void change_midi_ports ();
40
41   protected:
42         void thread_init ();
43         void do_request (MidiUIRequest*);
44
45   private:
46         typedef std::list<GSource*> PortSources;
47         PortSources port_sources;
48         ARDOUR::Session& _session;
49         PBD::ScopedConnection rebind_connection;
50
51         bool midi_input_handler (Glib::IOCondition, MIDI::Port*);
52         void reset_ports ();
53         void clear_ports ();
54
55         static MidiControlUI* _instance;
56 };
57
58 }
59
60 #endif /* __libardour_midi_ui_h__ */