string str;
if (!input_state_info->last_is_connected[signal_num]) {
str = "disconnected";
- } else if (input_state_info->last_height[signal_num]) {
+ } else if (input_state_info->last_height[signal_num] <= 0) {
str = "no signal";
} else if (!input_state_info->last_has_signal[signal_num]) {
- if (input_state_info->last_height[signal_num]) {
+ if (input_state_info->last_height[signal_num] == 525) {
// Special mode for the USB3 cards.
str = "no signal";
} else {
{ "enable", Block_enable },
{ "enable_if", Block_enable_if },
{ "disable", Block_disable },
+ { "always_disable_if_disabled", Block_always_disable_if_disabled },
{ "set_int", Block_set_int },
{ "set_float", Block_set_float },
{ "set_vec3", Block_set_vec3 },
if (lua_pcall(L, 0, 1, 0) != 0) {
fprintf(stderr, "error running function `num_channels': %s\n", lua_tostring(L, -1));
+ fprintf(stderr, "Try Nageru.set_num_channels(...) at the start of the script instead.\n");
abort();
}
} // namespace
+int Nageru_set_channel_name(lua_State *L)
+{
+ // NOTE: m is already locked.
+ Theme *theme = get_theme_updata(L);
+ unsigned channel = luaL_checknumber(L, 1);
+ const string text = checkstdstring(L, 2);
+ theme->channel_names[channel] = text;
+ lua_pop(L, 2);
+ return 0;
+}
+
+int Nageru_set_num_channels(lua_State *L)
+{
+ // NOTE: m is already locked.
+ Theme *theme = get_theme_updata(L);
+ if (theme->startup_finished) {
+ luaL_error(L, "set_num_channels() can only be called at startup.");
+ }
+ theme->num_channels = luaL_checknumber(L, 1);
+ lua_pop(L, 1);
+ return 0;
+}
+
+int Nageru_set_channel_signal(lua_State *L)
+{
+ // NOTE: m is already locked.
+ Theme *theme = get_theme_updata(L);
+ if (theme->startup_finished) {
+ luaL_error(L, "set_channel_signal() can only be called at startup.");
+ }
+ unsigned channel = luaL_checknumber(L, 1);
+ int signal = luaL_checknumber(L, 2);
+ theme->channel_signals[channel] = signal;
+ lua_pop(L, 2);
+ return 0;
+}
+
+int Nageru_set_supports_wb(lua_State *L)
+{
+ // NOTE: m is already locked.
+ Theme *theme = get_theme_updata(L);
+ if (theme->startup_finished) {
+ luaL_error(L, "set_supports_wb() can only be called at startup.");
+ }
+ unsigned channel = luaL_checknumber(L, 1);
+ bool supports_wb = checkbool(L, 2);
+ theme->channel_supports_wb[channel] = supports_wb;
+ lua_pop(L, 2);
+ return 0;
+}
+
Theme::Theme(const string &filename, const vector<string> &search_dirs, ResourcePool *resource_pool, unsigned num_cards)
: resource_pool(resource_pool), num_cards(num_cards), signal_to_card_mapping(global_flags.default_stream_mapping)
{
}
// Set up the API we provide.
- register_constants();
+ register_globals();
register_class("Scene", Scene_funcs);
register_class("Block", Block_funcs);
register_class("EffectBlueprint", EffectBlueprint_funcs);
}
assert(lua_gettop(L) == 0);
- // Ask it for the number of channels.
- num_channels = call_num_channels(L);
+ if (num_channels == -1) {
+ // Ask it for the number of channels.
+ num_channels = call_num_channels(L);
+ }
+ startup_finished = true;
}
Theme::~Theme()
lua_close(L);
}
-void Theme::register_constants()
+void Theme::register_globals()
{
// Set Nageru.VIDEO_FORMAT_BGRA = bmusb::PixelFormat_8BitBGRA, etc.
const vector<pair<string, int>> num_constants = {
lua_settable(L, 1); // t[key] = value
}
+ const luaL_Reg Nageru_funcs[] = {
+ { "set_channel_name", Nageru_set_channel_name },
+ { "set_num_channels", Nageru_set_num_channels },
+ { "set_channel_signal", Nageru_set_channel_signal },
+ { "set_supports_wb", Nageru_set_supports_wb },
+ { NULL, NULL }
+ };
+ lua_pushlightuserdata(L, this);
+ luaL_setfuncs(L, Nageru_funcs, 1); // for (name,f in funcs) { mt[name] = f, with upvalue {theme} }
+
lua_setglobal(L, "Nageru"); // Nageru = t
assert(lua_gettop(L) == 0);
}
string Theme::get_channel_name(unsigned channel)
{
lock_guard<mutex> lock(m);
+
lua_getglobal(L, "channel_name");
+ if (lua_isnil(L, -1)) {
+ lua_pop(L, 1);
+ if (channel_names.count(channel)) {
+ return channel_names[channel];
+ } else {
+ return "(no title)";
+ }
+ }
+
lua_pushnumber(L, channel);
if (lua_pcall(L, 1, 1, 0) != 0) {
fprintf(stderr, "error running function `channel_name': %s\n", lua_tostring(L, -1));
const char *ret = lua_tostring(L, -1);
if (ret == nullptr) {
fprintf(stderr, "function `channel_name' returned nil for channel %d\n", channel);
+ fprintf(stderr, "Try Nageru.set_channel_name(channel, name) at the start of the script instead.\n");
abort();
}
{
lock_guard<mutex> lock(m);
lua_getglobal(L, "channel_signal");
+ if (lua_isnil(L, -1)) {
+ lua_pop(L, 1);
+ if (channel_signals.count(channel)) {
+ return channel_signals[channel];
+ } else {
+ return -1;
+ }
+ }
+
lua_pushnumber(L, channel);
if (lua_pcall(L, 1, 1, 0) != 0) {
fprintf(stderr, "error running function `channel_signal': %s\n", lua_tostring(L, -1));
+ fprintf(stderr, "Try Nageru.set_channel_signal(channel, signal) at the start of the script instead.\n");
abort();
}
{
lock_guard<mutex> lock(m);
lua_getglobal(L, "supports_set_wb");
+ if (lua_isnil(L, -1)) {
+ lua_pop(L, 1);
+ if (channel_supports_wb.count(channel)) {
+ return channel_supports_wb[channel];
+ } else {
+ return false;
+ }
+ }
+
lua_pushnumber(L, channel);
if (lua_pcall(L, 1, 1, 0) != 0) {
fprintf(stderr, "error running function `supports_set_wb': %s\n", lua_tostring(L, -1));
+ fprintf(stderr, "Try Nageru.set_supports_wb(channel, bool) at the start of the script instead.\n");
abort();
}
Theme::MenuEntry::~MenuEntry()
{
if (is_submenu) {
- luaL_unref(entry.L, LUA_REGISTRYINDEX, entry.lua_ref);
- } else {
destroy(submenu);
+ } else {
+ luaL_unref(entry.L, LUA_REGISTRYINDEX, entry.lua_ref);
}
}
for (int i = 1; i <= num_elements; ++i) {
root_menu.emplace_back(create_theme_menu_entry(L, i));
}
- fprintf(stderr, "now creating a new one\n");
theme_menu.reset(new MenuEntry("", move(root_menu)));
- fprintf(stderr, "DONE reset\n");
lua_pop(L, num_elements);
assert(lua_gettop(L) == 0);