X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fluainstance.cc;h=f184368f1d07adf05a6d42a54e91106d0129fa90;hb=7d8b93add17620135eadee5029325a3d22512b12;hp=fe4276c39a9c2d22910bd00d482906e294573376;hpb=2cc32456ab5bfce4f21d10b28e40f44293c987aa;p=ardour.git diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc index fe4276c39a..f184368f1d 100644 --- a/gtk2_ardour/luainstance.cc +++ b/gtk2_ardour/luainstance.cc @@ -20,10 +20,14 @@ #include #include +#include "pbd/strsplit.h" + +#include "gtkmm2ext/bindings.h" #include "gtkmm2ext/gui_thread.h" #include "ardour/audioengine.h" -#include "ardour/diskstream.h" +#include "ardour/disk_reader.h" +#include "ardour/disk_writer.h" #include "ardour/plugin_manager.h" #include "ardour/route.h" #include "ardour/session.h" @@ -359,6 +363,8 @@ const char *luasignalstr[] = { }; // 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 { @@ -368,6 +374,7 @@ namespace LuaMixer { } }; + //////////////////////////////////////////////////////////////////////////////// static PBD::ScopedConnectionList _luaexecs; @@ -425,6 +432,77 @@ lua_exec (std::string cmd) //////////////////////////////////////////////////////////////////////////////// +static int +lua_actionlist (lua_State *L) +{ + using namespace std; + + vector paths; + vector labels; + vector tooltips; + vector keys; + vector > actions; + Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions); + + vector::iterator p; + vector::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 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 / from the start */ + string path = (*p); + path = path.substr (strlen ("/")); + + 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. +ARDOUR::PresentationInfo::order_t +lua_translate_order (RouteDialogs::InsertAt place) +{ + return ARDOUR_UI::instance()->translate_order (place); +} + +//////////////////////////////////////////////////////////////////////////////// + #define xstr(s) stringify(s) #define stringify(s) #s @@ -668,7 +746,7 @@ LuaInstance::register_classes (lua_State* L) 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) @@ -718,14 +796,14 @@ LuaInstance::register_classes (lua_State* L) .beginClass ("RegionSelection") .addFunction ("start", &RegionSelection::start) - .addFunction ("end_frame", &RegionSelection::end_frame) + .addFunction ("end_sample", &RegionSelection::end_sample) .addFunction ("n_midi_regions", &RegionSelection::n_midi_regions) .addFunction ("regionlist", &RegionSelection::regionlist) // XXX check windows binding (libardour) .endClass () .deriveClass > ("TimeSelection") .addFunction ("start", &TimeSelection::start) - .addFunction ("end_frame", &TimeSelection::end_frame) + .addFunction ("end_sample", &TimeSelection::end_sample) .addFunction ("length", &TimeSelection::length) .endClass () @@ -758,10 +836,9 @@ LuaInstance::register_classes (lua_State* L) .endClass () .beginClass ("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) @@ -790,8 +867,7 @@ LuaInstance::register_classes (lua_State* L) .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) @@ -908,7 +984,16 @@ LuaInstance::register_classes (lua_State* L) .addFunction ("set_toggleaction", &PublicEditor::set_toggleaction) .endClass () + .addFunction ("translate_order", &lua_translate_order) + /* ArdourUI enums */ + .beginNamespace ("InsertAt") + .addConst ("BeforeSelection", RouteDialogs::InsertAt(RouteDialogs::BeforeSelection)) + .addConst ("AfterSelection", RouteDialogs::InsertAt(RouteDialogs::AfterSelection)) + .addConst ("First", RouteDialogs::InsertAt(RouteDialogs::First)) + .addConst ("Last", RouteDialogs::InsertAt(RouteDialogs::Last)) + .endNamespace () + .beginNamespace ("MarkerType") .addConst ("Mark", ArdourMarker::Type(ArdourMarker::Mark)) .addConst ("Tempo", ArdourMarker::Type(ArdourMarker::Tempo)) @@ -930,6 +1015,8 @@ LuaInstance::register_classes (lua_State* L) .addConst ("Add", Selection::Operation(Selection::Add)) .endNamespace () + .addCFunction ("actionlist", &lua_actionlist) + .endNamespace () // end ArdourUI .beginNamespace ("os") @@ -942,7 +1029,7 @@ LuaInstance::register_classes (lua_State* L) // Editing Symbols #undef ZOOMFOCUS -#undef SNAPTYPE +#undef GRIDTYPE #undef SNAPMODE #undef MOUSEMODE #undef DISPLAYCONTROL @@ -951,7 +1038,7 @@ LuaInstance::register_classes (lua_State* L) #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) @@ -1043,7 +1130,7 @@ LuaInstance::init () " assert(type(f) == 'function', 'Factory is a not a function')" " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')" " self.scripts[i] = { ['n'] = n, ['s'] = s, ['f'] = f, ['a'] = a, ['c'] = c }" - " local env = _ENV; env.f = nil env.io = nil" + " local env = _ENV; env.f = nil" " self.instances[i] = load (string.dump(f, true), nil, nil, env)(a)" " if type(c) == 'function' then" " self.icons[i] = load (string.dump(c, true), nil, nil, env)(a)" @@ -1203,7 +1290,7 @@ LuaInstance::session_going_away () 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 (); @@ -1235,7 +1322,7 @@ LuaInstance::set_state (const XMLNode& node) } 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 */ @@ -1271,7 +1358,7 @@ LuaInstance::interactive_add (LuaScriptInfo::ScriptType type, int id) 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 (); @@ -1304,18 +1391,27 @@ LuaInstance::interactive_add (LuaScriptInfo::ScriptType type, int id) try { script = Glib::file_get_contents (spi->path); - } catch (Glib::FileError e) { + } catch (Glib::FileError const& e) { string msg = string_compose (_("Cannot read script '%1': %2"), spi->path, e.what()); Gtk::MessageDialog am (msg); am.run (); 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; @@ -1324,7 +1420,7 @@ LuaInstance::interactive_add (LuaScriptInfo::ScriptType type, int id) } } - 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) { @@ -1341,7 +1437,7 @@ LuaInstance::interactive_add (LuaScriptInfo::ScriptType type, int id) string msg = string_compose (_("Session script '%1' instantiation failed: %2"), spd.name(), e.what ()); Gtk::MessageDialog am (msg); am.run (); - } catch (SessionException e) { + } catch (SessionException const& e) { string msg = string_compose (_("Loading Session script '%1' failed: %2"), spd.name(), e.what ()); Gtk::MessageDialog am (msg); am.run (); @@ -1484,7 +1580,7 @@ std::vector LuaInstance::lua_action_names () { std::vector 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); @@ -1774,7 +1870,7 @@ LuaCallback::init (void) " assert(type(f) == 'function', 'Factory is a not a function')" " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')" " self.script = { ['n'] = n, ['s'] = s, ['f'] = f, ['a'] = a }" - " local env = _ENV; env.f = nil env.io = nil" + " local env = _ENV; env.f = nil" " self.instance = load (string.dump(f, true), nil, nil, env)(a)" " end" "" @@ -2029,6 +2125,14 @@ LuaCallback::connect_2 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal2 void +LuaCallback::connect_3 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal3 *signal) { + signal->connect ( + _connections, invalidator (*this), + boost::bind (&LuaCallback::proxy_3, this, ls, ref, _1, _2, _3), + gui_context()); +} + template void LuaCallback::proxy_0 (enum LuaSignal::LuaSignal ls, T ref) { bool ok = true; @@ -2071,3 +2175,17 @@ LuaCallback::proxy_2 (enum LuaSignal::LuaSignal ls, T ref, C1 a1, C2 a2) { drop_callback (); /* EMIT SIGNAL */ } } + +template 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 ()) { + ok = false; + } + } + if (!ok) { + drop_callback (); /* EMIT SIGNAL */ + } +}