mouse: add index on button, permit object cloning
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
c9d9d45ab5
commit
c19965cfff
|
@ -9,6 +9,7 @@ border_width
|
||||||
bottom
|
bottom
|
||||||
bottomleft
|
bottomleft
|
||||||
bottomright
|
bottomright
|
||||||
|
button
|
||||||
center
|
center
|
||||||
class
|
class
|
||||||
client
|
client
|
||||||
|
@ -59,6 +60,8 @@ pid
|
||||||
plot_data_add
|
plot_data_add
|
||||||
plot_properties_set
|
plot_properties_set
|
||||||
position
|
position
|
||||||
|
press
|
||||||
|
release
|
||||||
resize
|
resize
|
||||||
right
|
right
|
||||||
role
|
role
|
||||||
|
|
97
mouse.c
97
mouse.c
|
@ -1041,7 +1041,7 @@ luaA_client_mouse_move(lua_State *L)
|
||||||
* \param L The Lua VM state.
|
* \param L The Lua VM state.
|
||||||
* \return The number of elements pushed on stack.
|
* \return The number of elements pushed on stack.
|
||||||
* \luastack
|
* \luastack
|
||||||
* \lparam A table with modifiers keys.
|
* \lparam A table with modifiers keys, or a button to clone.
|
||||||
* \lparam A mouse button number.
|
* \lparam A mouse button number.
|
||||||
* \lparam A function to execute on click events.
|
* \lparam A function to execute on click events.
|
||||||
* \lparam A function to execute on release events.
|
* \lparam A function to execute on release events.
|
||||||
|
@ -1051,7 +1051,29 @@ static int
|
||||||
luaA_button_new(lua_State *L)
|
luaA_button_new(lua_State *L)
|
||||||
{
|
{
|
||||||
int i, len;
|
int i, len;
|
||||||
button_t *button;
|
button_t *button, **orig;
|
||||||
|
|
||||||
|
if((orig = luaA_toudata(L, 2, "button")))
|
||||||
|
{
|
||||||
|
button_t *copy = p_new(button_t, 1);
|
||||||
|
copy->mod = (*orig)->mod;
|
||||||
|
copy->button = (*orig)->button;
|
||||||
|
if((*orig)->press != LUA_REFNIL)
|
||||||
|
{
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, (*orig)->press);
|
||||||
|
luaA_registerfct(L, -1, ©->press);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
copy->press = LUA_REFNIL;
|
||||||
|
if((*orig)->release != LUA_REFNIL)
|
||||||
|
{
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, (*orig)->release);
|
||||||
|
luaA_registerfct(L, -1, ©->release);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
copy->release = LUA_REFNIL;
|
||||||
|
return luaA_button_userdata_new(L, copy);
|
||||||
|
}
|
||||||
|
|
||||||
luaA_checktable(L, 2);
|
luaA_checktable(L, 2);
|
||||||
/* arg 3 is mouse button */
|
/* arg 3 is mouse button */
|
||||||
|
@ -1143,6 +1165,75 @@ luaA_button_array_get(lua_State *L, button_array_t *buttons)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Button object.
|
||||||
|
* \param L The Lua VM state.
|
||||||
|
* \return The number of elements pushed on stack.
|
||||||
|
* \luastack
|
||||||
|
* \lfield press The function called when button press event is received.
|
||||||
|
* \lfield release The function called when button release event is received.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
luaA_button_index(lua_State *L)
|
||||||
|
{
|
||||||
|
if(luaA_usemetatable(L, 1, 2))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
size_t len;
|
||||||
|
button_t **button = luaA_checkudata(L, 1, "button");
|
||||||
|
const char *attr = luaL_checklstring(L, 2, &len);
|
||||||
|
|
||||||
|
switch(a_tokenize(attr, len))
|
||||||
|
{
|
||||||
|
case A_TK_PRESS:
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, (*button)->press);
|
||||||
|
break;
|
||||||
|
case A_TK_RELEASE:
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, (*button)->release);
|
||||||
|
break;
|
||||||
|
case A_TK_BUTTON:
|
||||||
|
/* works fine, but not *really* neat */
|
||||||
|
lua_pushnumber(L, (*button)->button);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Button object.
|
||||||
|
* \param L The Lua VM state.
|
||||||
|
* \return The number of elements pushed on stack.
|
||||||
|
* \luastack
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
luaA_button_newindex(lua_State *L)
|
||||||
|
{
|
||||||
|
if(luaA_usemetatable(L, 1, 2))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
size_t len;
|
||||||
|
button_t **button = luaA_checkudata(L, 1, "button");
|
||||||
|
const char *attr = luaL_checklstring(L, 2, &len);
|
||||||
|
|
||||||
|
switch(a_tokenize(attr, len))
|
||||||
|
{
|
||||||
|
case A_TK_PRESS:
|
||||||
|
luaA_registerfct(L, 3, &(*button)->press);
|
||||||
|
break;
|
||||||
|
case A_TK_RELEASE:
|
||||||
|
luaA_registerfct(L, 3, &(*button)->release);
|
||||||
|
break;
|
||||||
|
case A_TK_BUTTON:
|
||||||
|
(*button)->button = xutil_button_fromint(luaL_checknumber(L, 3));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const struct luaL_reg awesome_button_methods[] =
|
const struct luaL_reg awesome_button_methods[] =
|
||||||
{
|
{
|
||||||
{ "__call", luaA_button_new },
|
{ "__call", luaA_button_new },
|
||||||
|
@ -1150,6 +1241,8 @@ const struct luaL_reg awesome_button_methods[] =
|
||||||
};
|
};
|
||||||
const struct luaL_reg awesome_button_meta[] =
|
const struct luaL_reg awesome_button_meta[] =
|
||||||
{
|
{
|
||||||
|
{ "__index", luaA_button_index },
|
||||||
|
{ "__newindex", luaA_button_newindex },
|
||||||
{ "__gc", luaA_button_gc },
|
{ "__gc", luaA_button_gc },
|
||||||
{ "__eq", luaA_button_eq },
|
{ "__eq", luaA_button_eq },
|
||||||
{ "__tostring", luaA_button_tostring },
|
{ "__tostring", luaA_button_tostring },
|
||||||
|
|
Loading…
Reference in New Issue