/** Get or set global mouse bindings. * This binding will be available when you'll click on root window. * \param L The Lua VM state. * \return The number of element pushed on stack. * \luastack * \lparam An array of mouse button bindings objects, or nothing. * \lreturn The array of mouse button bindings objects. */ static int luaA_root_buttons(lua_State *L) { if(lua_gettop(L) == 1) { luaA_checktable(L, 1); foreach(button, globalconf.buttons) luaA_object_unref(globalconf.L, *button); button_array_wipe(&globalconf.buttons); button_array_init(&globalconf.buttons); lua_pushnil(L); while(lua_next(L, 1)) button_array_append(&globalconf.buttons, luaA_object_ref(L, -1)); return 1; } lua_createtable(L, globalconf.buttons.len, 0); for(int i = 0; i < globalconf.buttons.len; i++) { luaA_object_push(L, globalconf.buttons.tab[i]); lua_rawseti(L, -2, i + 1); } return 1; }
/** Set a button array with a Lua table. * \param L The Lua VM state. * \param oidx The index of the object to store items into. * \param idx The index of the Lua table. * \param buttons The array button to fill. */ void luaA_button_array_set(lua_State *L, int oidx, int idx, button_array_t *buttons) { luaA_checktable(L, idx); foreach(button, *buttons) luaA_object_unref_item(L, oidx, *button); button_array_wipe(buttons); button_array_init(buttons); lua_pushnil(L); while(lua_next(L, idx)) if(luaA_toudata(L, -1, &button_class)) button_array_append(buttons, luaA_object_ref_item(L, oidx, -1)); else lua_pop(L, 1); }