summaryrefslogtreecommitdiff
path: root/gtk2_ardour/luainstance.h
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-02-21 22:08:36 +0100
committerRobin Gareus <robin@gareus.org>2016-02-23 15:41:35 +0100
commite54c77e642edeed4a9e5f760cfff110ee3012585 (patch)
tree97581d8e24cf4bdbff40121556a3c64bc20ff78a /gtk2_ardour/luainstance.h
parent292eac7f481006d0b0d0efa3f119d4b68495fa1e (diff)
Add Editor/UI Lua Scripting and Action/Callback Script
Diffstat (limited to 'gtk2_ardour/luainstance.h')
-rw-r--r--gtk2_ardour/luainstance.h132
1 files changed, 132 insertions, 0 deletions
diff --git a/gtk2_ardour/luainstance.h b/gtk2_ardour/luainstance.h
new file mode 100644
index 0000000000..7bb572323e
--- /dev/null
+++ b/gtk2_ardour/luainstance.h
@@ -0,0 +1,132 @@
+#ifndef __gtkardour_luainstance_h__
+#define __gtkardour_luainstance_h__
+
+#include <bitset>
+
+#include "pbd/id.h"
+#include "pbd/signals.h"
+#include "pbd/xml++.h"
+
+#include "ardour/luascripting.h"
+#include "ardour/luabindings.h"
+#include "ardour/session_handle.h"
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "luasignal.h"
+
+typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
+
+class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
+{
+public:
+ LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
+ LuaCallback (ARDOUR::Session*, XMLNode & node);
+ ~LuaCallback ();
+
+ XMLNode& get_state (void);
+ void set_session (ARDOUR::Session *);
+
+ const PBD::ID& id () const { return _id; }
+ const std::string& name () const { return _name; }
+ ActionHook signals () const { return _signals; }
+ bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
+ PBD::Signal0<void> drop_callback;
+
+protected:
+ void session_going_away ();
+
+private:
+ LuaState lua;
+
+ PBD::ID _id;
+ std::string _name;
+ ActionHook _signals;
+
+ void reconnect ();
+ template <class T> void reconnect_object (T);
+ void init ();
+
+ luabridge::LuaRef * _lua_add;
+ luabridge::LuaRef * _lua_get;
+ luabridge::LuaRef * _lua_call;
+ luabridge::LuaRef * _lua_save;
+ luabridge::LuaRef * _lua_load;
+
+ PBD::ScopedConnectionList _connections;
+
+ template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
+ template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
+
+ template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
+ template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
+
+ template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
+ template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
+};
+
+typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
+typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
+
+
+
+class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+{
+public:
+ static LuaInstance* instance();
+ ~LuaInstance();
+
+ static void register_classes (lua_State* L);
+ static void register_hooks (lua_State* L);
+
+ void set_session (ARDOUR::Session* s);
+
+ int set_state (const XMLNode&);
+ XMLNode& get_action_state (void);
+ XMLNode& get_hook_state (void);
+
+ bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
+
+ /* actions */
+ void call_action (const int);
+
+ bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
+ bool remove_lua_action (const int);
+ bool lua_action_name (const int, std::string&);
+ std::vector<std::string> lua_action_names ();
+ bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
+ sigc::signal<void,int,std::string> ActionChanged;
+
+ /* callbacks */
+ bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
+ bool unregister_lua_slot (const PBD::ID&);
+ std::vector<PBD::ID> lua_slots () const;
+ bool lua_slot_name (const PBD::ID&, std::string&) const;
+ std::vector<std::string> lua_slot_names () const;
+ bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
+ sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
+
+private:
+ LuaInstance();
+ static LuaInstance* _instance;
+
+ void init ();
+ void session_going_away ();
+
+ LuaState lua;
+
+ luabridge::LuaRef * _lua_call_action;
+ luabridge::LuaRef * _lua_add_action;
+ luabridge::LuaRef * _lua_del_action;
+ luabridge::LuaRef * _lua_get_action;
+
+ luabridge::LuaRef * _lua_load;
+ luabridge::LuaRef * _lua_save;
+ luabridge::LuaRef * _lua_clear;
+
+ LuaCallbackMap _callbacks;
+ PBD::ScopedConnectionList _slotcon;
+};
+
+#endif