#include <cairomm/surface.h>
#include <pango/pangocairo.h>
+#include "pbd/strsplit.h"
+
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/gui_thread.h"
#include "ardour/audioengine.h"
}; // namespace
+static std::string http_get_unlogged (const std::string& url) { return ArdourCurl::http_get (url, false); }
+
/** special cases for Ardour's Mixer UI */
namespace LuaMixer {
return 0;
}
#endif
+
+////////////////////////////////////////////////////////////////////////////////
+
+static int
+lua_actionlist (lua_State *L)
+{
+ using namespace std;
+
+ vector<string> paths;
+ vector<string> labels;
+ vector<string> tooltips;
+ vector<string> keys;
+ vector<Glib::RefPtr<Gtk::Action> > actions;
+ Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
+
+ vector<string>::iterator p;
+ vector<string>::iterator l;
+
+ luabridge::LuaRef action_tbl (luabridge::newTable (L));
+
+ for (l = labels.begin(), p = paths.begin(); l != labels.end(); ++p, ++l) {
+ if (l->empty ()) {
+ continue;
+ }
+
+ vector<string> parts;
+ split (*p, parts, '/');
+
+ if (parts.empty()) {
+ continue;
+ }
+
+ //kinda kludgy way to avoid displaying menu items as mappable
+ if (parts[1] == _("Main_menu"))
+ continue;
+ if (parts[1] == _("JACK"))
+ continue;
+ if (parts[1] == _("redirectmenu"))
+ continue;
+ if (parts[1] == _("Editor_menus"))
+ continue;
+ if (parts[1] == _("RegionList"))
+ continue;
+ if (parts[1] == _("ProcessorMenu"))
+ continue;
+
+ /* strip <Actions>/ from the start */
+ string path = (*p);
+ path = path.substr (strlen ("<Actions>/"));
+
+ if (!action_tbl[parts[1]].isTable()) {
+ action_tbl[parts[1]] = luabridge::newTable (L);
+ }
+ assert (action_tbl[parts[1]].isTable());
+ luabridge::LuaRef tbl (action_tbl[parts[1]]);
+ assert (tbl.isTable());
+ tbl[*l] = path;
+ }
+
+ luabridge::push (L, action_tbl);
+ return 1;
+}
+
////////////////////////////////////////////////////////////////////////////////
// ARDOUR_UI and instance() are not exposed.
luabridge::getGlobalNamespace (L)
.beginNamespace ("ArdourUI")
- .addFunction ("http_get", (std::string (*)(const std::string&))&ArdourCurl::http_get)
+ .addFunction ("http_get", &http_get_unlogged)
.addFunction ("processor_selection", &LuaMixer::processor_selection)
.endClass ()
.beginClass <PublicEditor> ("Editor")
- .addFunction ("snap_type", &PublicEditor::snap_type)
+ .addFunction ("grid_type", &PublicEditor::grid_type)
.addFunction ("snap_mode", &PublicEditor::snap_mode)
.addFunction ("set_snap_mode", &PublicEditor::set_snap_mode)
- .addFunction ("set_snap_threshold", &PublicEditor::set_snap_threshold)
.addFunction ("undo", &PublicEditor::undo)
.addFunction ("redo", &PublicEditor::redo)
.addFunction ("add_location_from_playhead_cursor", &PublicEditor::add_location_from_playhead_cursor)
.addFunction ("remove_location_at_playhead_cursor", &PublicEditor::remove_location_at_playhead_cursor)
- .addFunction ("set_show_measures", &PublicEditor::set_show_measures)
- .addFunction ("show_measures", &PublicEditor::show_measures)
+ .addFunction ("update_grid", &PublicEditor::update_grid)
.addFunction ("remove_tracks", &PublicEditor::remove_tracks)
.addFunction ("set_loop_range", &PublicEditor::set_loop_range)
.addConst ("Add", Selection::Operation(Selection::Add))
.endNamespace ()
+ .addCFunction ("actionlist", &lua_actionlist)
+
.endNamespace () // end ArdourUI
.beginNamespace ("os")
// Editing Symbols
#undef ZOOMFOCUS
-#undef SNAPTYPE
+#undef GRIDTYPE
#undef SNAPMODE
#undef MOUSEMODE
#undef DISPLAYCONTROL
#undef IMPORTDISPOSITION
#define ZOOMFOCUS(NAME) .addConst (stringify(NAME), (Editing::ZoomFocus)Editing::NAME)
-#define SNAPTYPE(NAME) .addConst (stringify(NAME), (Editing::SnapType)Editing::NAME)
+#define GRIDTYPE(NAME) .addConst (stringify(NAME), (Editing::GridType)Editing::NAME)
#define SNAPMODE(NAME) .addConst (stringify(NAME), (Editing::SnapMode)Editing::NAME)
#define MOUSEMODE(NAME) .addConst (stringify(NAME), (Editing::MouseMode)Editing::NAME)
#define DISPLAYCONTROL(NAME) .addConst (stringify(NAME), (Editing::DisplayControl)Editing::NAME)
point_one_second_connection.disconnect ();
(*_lua_clear)();
- for (int i = 0; i < 9; ++i) {
+ for (int i = 0; i < MAX_LUA_ACTION_SCRIPTS; ++i) {
ActionChanged (i, ""); /* EMIT SIGNAL */
}
SessionHandlePtr::session_going_away ();
} catch (luabridge::LuaException const& e) {
cerr << "LuaException:" << e.what () << endl;
} catch (...) { }
- for (int i = 0; i < 9; ++i) {
+ for (int i = 0; i < MAX_LUA_ACTION_SCRIPTS; ++i) {
std::string name;
if (lua_action_name (i, name)) {
ActionChanged (i, name); /* EMIT SIGNAL */
switch (type) {
case LuaScriptInfo::EditorAction:
reg = lua_action_names ();
- title = _("Add Lua Action");
+ title = _("Add Shortcut or Lua Script");
break;
case LuaScriptInfo::EditorHook:
reg = lua_slot_names ();
return false;
}
- LuaScriptParamList lsp = LuaScriptParams::script_params (spi, param_function);
+ LuaState ls;
+ register_classes (ls.getState ());
+ LuaScriptParamList lsp = LuaScriptParams::script_params (ls, spi->path, param_function);
+
+ /* allow cancel */
+ for (size_t i = 0; i < lsp.size(); ++i) {
+ if (lsp[i]->preseeded && lsp[i]->name == "x-script-abort") {
+ return false;
+ }
+ }
ScriptParameterDialog spd (_("Set Script Parameters"), spi, reg, lsp);
- if (!spd.need_interation ()) {
+ if (spd.need_interation ()) {
switch (spd.run ()) {
case Gtk::RESPONSE_ACCEPT:
break;
}
}
- LuaScriptParamPtr lspp (new LuaScriptParam("x-script-origin", "", spi->path, false));
+ LuaScriptParamPtr lspp (new LuaScriptParam("x-script-origin", "", spi->path, false, true));
lsp.push_back (lspp);
switch (type) {
LuaInstance::lua_action_names ()
{
std::vector<std::string> rv;
- for (int i = 0; i < 9; ++i) {
+ for (int i = 0; i < MAX_LUA_ACTION_SCRIPTS; ++i) {
std::string name;
if (lua_action_name (i, name)) {
rv.push_back (name);
gui_context());
}
+template <typename T, typename C1, typename C2, typename C3> void
+LuaCallback::connect_3 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal3<void, C1, C2, C3> *signal) {
+ signal->connect (
+ _connections, invalidator (*this),
+ boost::bind (&LuaCallback::proxy_3<T, C1, C2, C3>, this, ls, ref, _1, _2, _3),
+ gui_context());
+}
+
template <typename T> void
LuaCallback::proxy_0 (enum LuaSignal::LuaSignal ls, T ref) {
bool ok = true;
drop_callback (); /* EMIT SIGNAL */
}
}
+
+template <typename T, typename C1, typename C2, typename C3> void
+LuaCallback::proxy_3 (enum LuaSignal::LuaSignal ls, T ref, C1 a1, C2 a2, C3 a3) {
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1, a2, a3));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
+}