X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=theme.cpp;fp=theme.cpp;h=bb0bcaf8eeb16102baf7d152e25b4485449564a6;hb=f3dbafe3251a6613433debfdde48dc814f5423a1;hp=485fa433de9f043345c87db7820a7024792bb62e;hpb=4dcab181655d215ad0105f8adfe76dd6fd8bd201;p=nageru diff --git a/theme.cpp b/theme.cpp index 485fa43..bb0bcaf 100644 --- a/theme.cpp +++ b/theme.cpp @@ -48,6 +48,18 @@ using namespace movit; extern Mixer *global_mixer; +Theme *get_theme_updata(lua_State* L) +{ + luaL_checktype(L, lua_upvalueindex(1), LUA_TLIGHTUSERDATA); + return (Theme *)lua_touserdata(L, lua_upvalueindex(1)); +} + +int ThemeMenu_set(lua_State *L) +{ + Theme *theme = get_theme_updata(L); + return theme->set_theme_menu(L); +} + namespace { // Contains basically the same data as InputState, but does not hold on to @@ -136,12 +148,6 @@ int wrap_lua_object_nonowned(lua_State* L, const char *class_name, Args&&... arg return 1; } -Theme *get_theme_updata(lua_State* L) -{ - luaL_checktype(L, lua_upvalueindex(1), LUA_TLIGHTUSERDATA); - return (Theme *)lua_touserdata(L, lua_upvalueindex(1)); -} - Effect *get_effect(lua_State *L, int idx) { if (luaL_testudata(L, idx, "WhiteBalanceEffect") || @@ -782,6 +788,11 @@ const luaL_Reg InputStateInfo_funcs[] = { { NULL, NULL } }; +const luaL_Reg ThemeMenu_funcs[] = { + { "set", ThemeMenu_set }, + { NULL, NULL } +}; + } // namespace LiveInputWrapper::LiveInputWrapper(Theme *theme, EffectChain *chain, bmusb::PixelFormat pixel_format, bool override_bounce, bool deinterlace) @@ -1022,6 +1033,7 @@ Theme::Theme(const string &filename, const vector &search_dirs, Resource register_class("MultiplyEffect", MultiplyEffect_funcs); register_class("MixEffect", MixEffect_funcs); register_class("InputStateInfo", InputStateInfo_funcs); + register_class("ThemeMenu", ThemeMenu_funcs); // Run script. Search through all directories until we find a file that will load // (as in, does not return LUA_ERRFILE); then run it. We store load errors @@ -1340,3 +1352,41 @@ void Theme::channel_clicked(int preview_num) } assert(lua_gettop(L) == 0); } + +int Theme::set_theme_menu(lua_State *L) +{ + for (const Theme::MenuEntry &entry : theme_menu) { + luaL_unref(L, LUA_REGISTRYINDEX, entry.lua_ref); + } + theme_menu.clear(); + + int num_elements = lua_gettop(L); + for (int i = 1; i <= num_elements; ++i) { + lua_rawgeti(L, i, 1); + const string text = checkstdstring(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, i, 2); + luaL_checktype(L, -1, LUA_TFUNCTION); + int ref = luaL_ref(L, LUA_REGISTRYINDEX); + + theme_menu.push_back(MenuEntry{ text, ref }); + } + lua_pop(L, num_elements); + assert(lua_gettop(L) == 0); + + if (theme_menu_callback != nullptr) { + theme_menu_callback(); + } + + return 0; +} + +void Theme::theme_menu_entry_clicked(int lua_ref) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, lua_ref); + if (lua_pcall(L, 0, 0, 0) != 0) { + fprintf(stderr, "error running menu callback: %s\n", lua_tostring(L, -1)); + exit(1); + } +}