/** Get or set global key bindings. * This binding will be available when you'll press keys on root window. * \param L The Lua VM state. * \return The number of element pushed on stack. * \luastack * \lparam An array of key bindings objects, or nothing. * \lreturn The array of key bindings objects of this client. */ static int luaA_root_keys(lua_State *L) { if(lua_gettop(L) == 1) { luaA_checktable(L, 1); foreach(key, globalconf.keys) luaA_object_unref(globalconf.L, *key); key_array_wipe(&globalconf.keys); key_array_init(&globalconf.keys); lua_pushnil(L); while(lua_next(L, 1)) key_array_append(&globalconf.keys, luaA_object_ref_class(L, -1, &key_class)); xcb_screen_t *s = globalconf.screen; xcb_ungrab_key(globalconf.connection, XCB_GRAB_ANY, s->root, XCB_BUTTON_MASK_ANY); xwindow_grabkeys(s->root, &globalconf.keys); return 1; } lua_createtable(L, globalconf.keys.len, 0); for(int i = 0; i < globalconf.keys.len; i++) { luaA_object_push(L, globalconf.keys.tab[i]); lua_rawseti(L, -2, i + 1); } return 1; }
/** Set a key 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 keys The array key to fill. */ void luaA_key_array_set(lua_State *L, int oidx, int idx, key_array_t *keys) { luaA_checktable(L, idx); foreach(key, *keys) luaA_object_unref_item(L, oidx, *key); key_array_wipe(keys); key_array_init(keys); lua_pushnil(L); while(lua_next(L, idx)) if(luaA_toudata(L, -1, &key_class)) key_array_append(keys, luaA_object_ref_item(L, oidx, -1)); else lua_pop(L, 1); }