lua: fix otable __newindex
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
1fbe4f0d5e
commit
ab66b87377
|
@ -502,7 +502,7 @@ function client.toggletag(target, c)
|
||||||
local sel = c or capi.client.focus_get();
|
local sel = c or capi.client.focus_get();
|
||||||
-- Check that tag and client screen are identical
|
-- Check that tag and client screen are identical
|
||||||
if sel and sel.screen == target.screen then
|
if sel and sel.screen == target.screen then
|
||||||
local tags = client.tags
|
local tags = sel.tags
|
||||||
if tags[target] then
|
if tags[target] then
|
||||||
tags[target] = nil
|
tags[target] = nil
|
||||||
else
|
else
|
||||||
|
|
39
lua.c
39
lua.c
|
@ -411,6 +411,44 @@ luaA_otable_index(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Object table.
|
||||||
|
* This table can use safely object as key.
|
||||||
|
* \param L The Lua VM state.
|
||||||
|
* \return The number of elements pushed on stack.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
luaA_otable_newindex(lua_State *L)
|
||||||
|
{
|
||||||
|
void **obj, **v;
|
||||||
|
|
||||||
|
if((obj = lua_touserdata(L, 2)))
|
||||||
|
{
|
||||||
|
printf("looking for %p\n", *obj);
|
||||||
|
/* begins at nil */
|
||||||
|
lua_pushnil(L);
|
||||||
|
while(lua_next(L, 1))
|
||||||
|
{
|
||||||
|
if((v = lua_touserdata(L, -2))
|
||||||
|
&& *v == *obj)
|
||||||
|
{
|
||||||
|
printf("found %p, replace\n", *v);
|
||||||
|
/* remove value */
|
||||||
|
lua_pop(L, 1);
|
||||||
|
/* push new value on top */
|
||||||
|
lua_pushvalue(L, 3);
|
||||||
|
/* set in table key = value */
|
||||||
|
lua_rawset(L, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* removes 'value'; keeps 'key' for next iteration */
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_rawset(L, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Initialize the Lua VM
|
/** Initialize the Lua VM
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
|
@ -426,6 +464,7 @@ luaA_init(void)
|
||||||
static const struct luaL_reg otable_meta[] =
|
static const struct luaL_reg otable_meta[] =
|
||||||
{
|
{
|
||||||
{ "__index", luaA_otable_index },
|
{ "__index", luaA_otable_index },
|
||||||
|
{ "__newindex", luaA_otable_newindex },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
static const struct luaL_reg awesome_lib[] =
|
static const struct luaL_reg awesome_lib[] =
|
||||||
|
|
9
lua.h
9
lua.h
|
@ -232,14 +232,7 @@ luaA_otable_new(lua_State *L)
|
||||||
{
|
{
|
||||||
/* Our object */
|
/* Our object */
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
/* The meta table */
|
return luaA_settype(L, "otable");
|
||||||
lua_newtable(L);
|
|
||||||
lua_pushcfunction(L, luaA_otable_index);
|
|
||||||
/* Register index into the metatable */
|
|
||||||
lua_setfield(L, -2, "__index");
|
|
||||||
/* Set the meta table */
|
|
||||||
lua_setmetatable(L, -2);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void luaA_init(void);
|
void luaA_init(void);
|
||||||
|
|
Loading…
Reference in New Issue