Ardour  8.12
luainstance.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2018 Robin Gareus <robin@gareus.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #ifndef __gtkardour_luainstance_h__
20 #define __gtkardour_luainstance_h__
21 
22 #include <bitset>
23 
24 #include <cairo.h>
25 
26 #include "pbd/id.h"
27 #include "pbd/signals.h"
28 #include "pbd/xml++.h"
29 
30 #include "ardour/luascripting.h"
32 #include "ardour/luabindings.h"
33 #include "ardour/session_handle.h"
34 
35 #include "lua/luastate.h"
36 
37 #include "luasignal.h"
38 
39 namespace luabridge {
40  class LuaRef;
41 }
42 
43 namespace Gtk {
44  class Window;
45 }
46 
47 typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
48 
49 class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
50 {
51 public:
52  LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
55 
56  XMLNode& get_state () const;
58 
59  const PBD::ID& id () const { return _id; }
60  const std::string& name () const { return _name; }
61  ActionHook signals () const { return _signals; }
62  bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
63  PBD::Signal0<void> drop_callback;
64 
65 protected:
67 
68 private:
70 
72  std::string _name;
74 
75  void reconnect ();
76  template <class T> void reconnect_object (T);
77  void init ();
78 
79  luabridge::LuaRef * _lua_add;
80  luabridge::LuaRef * _lua_get;
81  luabridge::LuaRef * _lua_call;
82  luabridge::LuaRef * _lua_save;
83  luabridge::LuaRef * _lua_load;
84 
86 
87  template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
88  template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
89 
90  template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
91  template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
92 
93  template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
94  template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
95 
96  template <typename T, typename C1, typename C2, typename C3> void connect_3 (enum LuaSignal::LuaSignal, T, PBD::Signal3<void, C1, C2, C3>*);
97  template <typename T, typename C1, typename C2, typename C3> void proxy_3 (enum LuaSignal::LuaSignal, T, C1, C2, C3);
98 
99  template <typename T, typename C1, typename C2, typename C3, typename C4> void connect_4 (enum LuaSignal::LuaSignal, T, PBD::Signal4<void, C1, C2, C3, C4>*);
100  template <typename T, typename C1, typename C2, typename C3, typename C4> void proxy_4 (enum LuaSignal::LuaSignal, T, C1, C2, C3, C4);
101 };
102 
103 typedef std::shared_ptr<LuaCallback> LuaCallbackPtr;
104 typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
105 
106 
107 
109 {
110 public:
112  static void destroy_instance();
114 
115  static void register_classes (lua_State* L, bool sandbox);
116  static void register_hooks (lua_State* L);
117  static void bind_cairo (lua_State* L);
118  static void bind_dialog (lua_State* L);
119 
120  static void render_action_icon (cairo_t* cr, int w, int h, uint32_t c, void* i);
121 
123 
124  int set_state (const XMLNode&);
127 
128  int load_state ();
129  int save_state ();
130 
132 
133  /* actions */
134  void call_action (const int);
135  void render_icon (int i, cairo_t*, int, int, uint32_t);
136 
137  bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
138  bool remove_lua_action (const int);
139  bool lua_action_name (const int, std::string&);
140  std::vector<std::string> lua_action_names ();
141  bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
142  bool lua_action_has_icon (const int);
143  sigc::signal<void,int,std::string> ActionChanged;
144 
145  /* callbacks */
146  bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
148  std::vector<PBD::ID> lua_slots () const;
149  bool lua_slot_name (const PBD::ID&, std::string&) const;
150  std::vector<std::string> lua_slot_names () const;
151  bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
152  sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
153 
154  static PBD::Signal0<void> LuaTimerS; // deci-seconds (Timer every 1s)
155  static PBD::Signal0<void> LuaTimerDS; // deci-seconds (Timer every .1s)
156  static PBD::Signal0<void> SetSession; // emitted when a session is loaded
157  static PBD::Signal0<void> SelectionChanged; // emitted when editor selection changes
158 
159 private:
162 
163  void init ();
164  void set_dirty ();
167  void pre_seed_script (std::string const&, int&);
168 
170 
171  luabridge::LuaRef * _lua_call_action;
172  luabridge::LuaRef * _lua_render_icon;
173  luabridge::LuaRef * _lua_add_action;
174  luabridge::LuaRef * _lua_del_action;
175  luabridge::LuaRef * _lua_get_action;
176 
177  luabridge::LuaRef * _lua_load;
178  luabridge::LuaRef * _lua_save;
179  luabridge::LuaRef * _lua_clear;
180 
183 
185 
186  void every_second ();
187  sigc::connection second_connection;
188 
190  sigc::connection point_one_second_connection;
191 
192 };
193 
194 #endif
PBD::ScopedConnectionList _connections
Definition: luainstance.h:85
bool lua_slot(std::string &, std::string &, ActionHook &, ARDOUR::LuaScriptParamList &)
XMLNode & get_state() const
LuaCallback(ARDOUR::Session *, const std::string &, const std::string &, const ActionHook &, const ARDOUR::LuaScriptParamList &)
void reconnect()
void connect_3(enum LuaSignal::LuaSignal, T, PBD::Signal3< void, C1, C2, C3 > *)
void proxy_4(enum LuaSignal::LuaSignal, T, C1, C2, C3, C4)
ActionHook signals() const
Definition: luainstance.h:61
PBD::Signal0< void > drop_callback
Definition: luainstance.h:63
const std::string & name() const
Definition: luainstance.h:60
PBD::ID _id
Definition: luainstance.h:71
LuaCallback(ARDOUR::Session *, XMLNode &node)
LuaState lua
Definition: luainstance.h:69
void reconnect_object(T)
std::string _name
Definition: luainstance.h:72
void connect_0(enum LuaSignal::LuaSignal, T, S *)
void connect_1(enum LuaSignal::LuaSignal, T, PBD::Signal1< void, C1 > *)
void proxy_2(enum LuaSignal::LuaSignal, T, C1, C2)
void proxy_3(enum LuaSignal::LuaSignal, T, C1, C2, C3)
luabridge::LuaRef * _lua_get
Definition: luainstance.h:80
luabridge::LuaRef * _lua_call
Definition: luainstance.h:81
void connect_2(enum LuaSignal::LuaSignal, T, PBD::Signal2< void, C1, C2 > *)
const PBD::ID & id() const
Definition: luainstance.h:59
luabridge::LuaRef * _lua_load
Definition: luainstance.h:83
void connect_4(enum LuaSignal::LuaSignal, T, PBD::Signal4< void, C1, C2, C3, C4 > *)
void set_session(ARDOUR::Session *)
ActionHook _signals
Definition: luainstance.h:73
luabridge::LuaRef * _lua_add
Definition: luainstance.h:79
void session_going_away()
void proxy_1(enum LuaSignal::LuaSignal, T, C1)
void proxy_0(enum LuaSignal::LuaSignal, T)
luabridge::LuaRef * _lua_save
Definition: luainstance.h:82
std::vector< PBD::ID > lua_slots() const
int set_state(const XMLNode &)
void set_dirty()
void render_icon(int i, cairo_t *, int, int, uint32_t)
static PBD::Signal0< void > LuaTimerDS
Definition: luainstance.h:155
PBD::ScopedConnectionList _slotcon
Definition: luainstance.h:182
bool lua_slot(const PBD::ID &, std::string &, std::string &, ActionHook &, ARDOUR::LuaScriptParamList &)
static void render_action_icon(cairo_t *cr, int w, int h, uint32_t c, void *i)
void pre_seed_scripts()
luabridge::LuaRef * _lua_render_icon
Definition: luainstance.h:172
std::vector< std::string > lua_action_names()
static LuaInstance * _instance
Definition: luainstance.h:161
luabridge::LuaRef * _lua_call_action
Definition: luainstance.h:171
bool lua_slot_name(const PBD::ID &, std::string &) const
std::vector< std::string > lua_slot_names() const
luabridge::LuaRef * _lua_get_action
Definition: luainstance.h:175
bool interactive_add(Gtk::Window &, ARDOUR::LuaScriptInfo::ScriptType, int)
sigc::connection second_connection
Definition: luainstance.h:187
luabridge::LuaRef * _lua_load
Definition: luainstance.h:177
int save_state()
static void register_classes(lua_State *L, bool sandbox)
static void bind_dialog(lua_State *L)
static void bind_cairo(lua_State *L)
XMLNode & get_hook_state(void)
bool lua_action(const int, std::string &, std::string &, ARDOUR::LuaScriptParamList &)
static void register_hooks(lua_State *L)
static PBD::Signal0< void > LuaTimerS
Definition: luainstance.h:154
static void destroy_instance()
void call_action(const int)
bool set_lua_action(const int, const std::string &, const std::string &, const ARDOUR::LuaScriptParamList &)
void pre_seed_script(std::string const &, int &)
static PBD::Signal0< void > SelectionChanged
Definition: luainstance.h:157
bool lua_action_name(const int, std::string &)
bool unregister_lua_slot(const PBD::ID &)
LuaCallbackMap _callbacks
Definition: luainstance.h:181
luabridge::LuaRef * _lua_add_action
Definition: luainstance.h:173
void every_second()
void set_session(ARDOUR::Session *s)
luabridge::LuaRef * _lua_clear
Definition: luainstance.h:179
bool register_lua_slot(const std::string &, const std::string &, const ARDOUR::LuaScriptParamList &)
luabridge::LuaRef * _lua_del_action
Definition: luainstance.h:174
bool lua_action_has_icon(const int)
sigc::signal< void, PBD::ID, std::string, ActionHook > SlotChanged
Definition: luainstance.h:152
LuaState lua
Definition: luainstance.h:169
void session_going_away()
static LuaInstance * instance()
bool remove_lua_action(const int)
void every_point_one_seconds()
void selection_changed()
static PBD::Signal0< void > SetSession
Definition: luainstance.h:156
sigc::signal< void, int, std::string > ActionChanged
Definition: luainstance.h:143
sigc::connection point_one_second_connection
Definition: luainstance.h:190
luabridge::LuaRef * _lua_save
Definition: luainstance.h:178
int load_state()
XMLNode & get_action_state(void)
Definition: LuaRef.h:52
Definition: id.h:35
Definition: Window.h:41
Definition: xml++.h:114
std::shared_ptr< LuaCallback > LuaCallbackPtr
Definition: luainstance.h:103
std::map< PBD::ID, LuaCallbackPtr > LuaCallbackMap
Definition: luainstance.h:104
std::bitset< LuaSignal::LAST_SIGNAL > ActionHook
Definition: luainstance.h:47
std::vector< LuaScriptParamPtr > LuaScriptParamList
Definition: luascripting.h:107
Definition: ardour_ui.h:188