inline void pi_lua_generic_push(lua_State * l, const KeyBindings::KeyBinding &value) { if (value.Enabled()) { pi_lua_generic_push(l, value.ToString()); } else { lua_pushnil(l); } }
static void push_bindings(lua_State *l, const KeyBindings::BindingPrototype *protos) { LUA_DEBUG_START(l); lua_newtable(l); // [-1] bindings lua_pushnil(l); // [-2] bindings, [-1] group (no current group) assert(!protos[0].function); // first entry should be a group header int group_idx = 1; int binding_idx = 1; for (const KeyBindings::BindingPrototype *proto = protos; proto->label; ++proto) { if (! proto->function) { // start a new named binding group // [-2] bindings, [-1] group lua_pop(l, 1); // [-1] bindings lua_newtable(l); lua_pushstring(l, proto->label); lua_setfield(l, -2, "label"); // [-2] bindings, [-1] group lua_pushvalue(l, -1); // [-3] bindings, [-2] group, [-1] group copy lua_rawseti(l, -3, group_idx); ++group_idx; binding_idx = 1; } else { // key or axis binding prototype // [-2] bindings, [-1] group lua_createtable(l, 0, 5); // [-3] bindings, [-2] group, [-1] binding // fields are: type ('KEY' or 'AXIS'), id ('BindIncreaseSpeed'), label ('Increase Speed'), binding ('Key13'), bindingDescription ('') lua_pushstring(l, (proto->kb ? "KEY" : "AXIS")); lua_setfield(l, -2, "type"); lua_pushstring(l, proto->function); lua_setfield(l, -2, "id"); lua_pushstring(l, proto->label); lua_setfield(l, -2, "label"); if (proto->kb) { const KeyBindings::KeyBinding kb1 = proto->kb->binding1; if (kb1.Enabled()) { lua_pushstring(l, kb1.ToString().c_str()); lua_setfield(l, -2, "binding1"); lua_pushstring(l, kb1.Description().c_str()); lua_setfield(l, -2, "bindingDescription1"); } const KeyBindings::KeyBinding kb2 = proto->kb->binding2; if (kb2.Enabled()) { lua_pushstring(l, kb2.ToString().c_str()); lua_setfield(l, -2, "binding2"); lua_pushstring(l, kb2.Description().c_str()); lua_setfield(l, -2, "bindingDescription2"); } } else if (proto->ab) { const KeyBindings::AxisBinding &ab = *proto->ab; lua_pushstring(l, ab.ToString().c_str()); lua_setfield(l, -2, "binding1"); lua_pushstring(l, ab.Description().c_str()); lua_setfield(l, -2, "bindingDescription1"); } else { assert(0); // invalid prototype binding } // [-3] bindings, [-2] group, [-1] binding lua_rawseti(l, -2, binding_idx); ++binding_idx; } LUA_DEBUG_CHECK(l, 2); // [-2] bindings, [-1] group } // pop the group table (which should already have been put in the bindings table) lua_pop(l, 1); LUA_DEBUG_END(l, 1); }