]> git.sesse.net Git - nageru/blobdiff - nageru/theme.cpp
Make it possible to set number of channels imperatively instead of using a callback.
[nageru] / nageru / theme.cpp
index 6a4de4baa248ece934994332de8d559b29736010..f7f752250615323ebcc1c4f7d37c4fd8770a0006 100644 (file)
@@ -1212,6 +1212,7 @@ int call_num_channels(lua_State *L)
 
        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();
        }
 
@@ -1234,6 +1235,18 @@ int Nageru_set_channel_name(lua_State *L)
        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;
+}
+
 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)
 {
@@ -1335,8 +1348,11 @@ Theme::Theme(const string &filename, const vector<string> &search_dirs, Resource
        }
        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()
@@ -1371,6 +1387,7 @@ void Theme::register_globals()
 
        const luaL_Reg Nageru_funcs[] = {
                { "set_channel_name", Nageru_set_channel_name },
+               { "set_num_channels", Nageru_set_num_channels },
                { NULL, NULL }
        };
        lua_pushlightuserdata(L, this);