wibox: add mouse bindings

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-12-10 18:05:08 +01:00
parent f8063dea09
commit 59c04ce3dc
3 changed files with 53 additions and 1 deletions

28
event.c
View File

@ -144,12 +144,38 @@ event_handle_button(void *data, xcb_connection_t *connection, xcb_button_press_e
ev->event_x -= wibox->sw.geometry.x; ev->event_x -= wibox->sw.geometry.x;
ev->event_y -= wibox->sw.geometry.y; ev->event_y -= wibox->sw.geometry.y;
} }
/* check if we match a binding on the wibox */
button_array_t *b = &wibox->buttons;
for(int i = 0; i < b->len; i++)
if(ev->detail == b->tab[i]->button
&& XUTIL_MASK_CLEAN(ev->state) == b->tab[i]->mod)
switch(ev->response_type)
{
case XCB_BUTTON_PRESS:
if(b->tab[i]->press != LUA_REFNIL)
{
luaA_wibox_userdata_new(globalconf.L, wibox);
luaA_dofunction(globalconf.L, b->tab[i]->press, 1, 0);
}
break;
case XCB_BUTTON_RELEASE:
if(b->tab[i]->release != LUA_REFNIL)
{
luaA_wibox_userdata_new(globalconf.L, wibox);
luaA_dofunction(globalconf.L, b->tab[i]->release, 1, 0);
}
break;
}
/* then try to match a widget binding */
if((w = widget_getbycoords(wibox->position, &wibox->widgets, if((w = widget_getbycoords(wibox->position, &wibox->widgets,
wibox->sw.geometry.width, wibox->sw.geometry.width,
wibox->sw.geometry.height, wibox->sw.geometry.height,
&ev->event_x, &ev->event_y))) &ev->event_x, &ev->event_y)))
{ {
button_array_t *b = &w->buttons; b = &w->buttons;
for(int i = 0; i < b->len; i++) for(int i = 0; i < b->len; i++)
if(ev->detail == b->tab[i]->button if(ev->detail == b->tab[i]->button

View File

@ -99,6 +99,8 @@ typedef struct
bool need_update; bool need_update;
/** Cursor */ /** Cursor */
char *cursor; char *cursor;
/** Button bindings */
button_array_t buttons;
} wibox_t; } wibox_t;
ARRAY_TYPE(wibox_t *, wibox) ARRAY_TYPE(wibox_t *, wibox)

24
wibox.c
View File

@ -455,6 +455,7 @@ void
wibox_delete(wibox_t **wibox) wibox_delete(wibox_t **wibox)
{ {
simplewindow_wipe(&(*wibox)->sw); simplewindow_wipe(&(*wibox)->sw);
button_array_wipe(&(*wibox)->buttons);
luaL_unref(globalconf.L, LUA_REGISTRYINDEX, (*wibox)->widgets_table); luaL_unref(globalconf.L, LUA_REGISTRYINDEX, (*wibox)->widgets_table);
widget_node_array_wipe(&(*wibox)->widgets); widget_node_array_wipe(&(*wibox)->widgets);
p_delete(wibox); p_delete(wibox);
@ -1053,6 +1054,28 @@ luaA_wibox_newindex(lua_State *L)
return 0; return 0;
} }
/** Get or set mouse buttons bindings to a wibox.
* \param L The Lua VM state.
* \luastack
* \lvalue A wibox.
* \lparam An array of mouse button bindings objects, or nothing.
* \return The array of mouse button bindings objects of this wibox.
*/
static int
luaA_wibox_buttons(lua_State *L)
{
wibox_t **wibox = luaA_checkudata(L, 1, "wibox");
button_array_t *buttons = &(*wibox)->buttons;
if(lua_gettop(L) == 2)
{
luaA_button_array_set(L, 2, buttons);
return 1;
}
return luaA_button_array_get(L, buttons);
}
const struct luaL_reg awesome_wibox_methods[] = const struct luaL_reg awesome_wibox_methods[] =
{ {
{ "__call", luaA_wibox_new }, { "__call", luaA_wibox_new },
@ -1060,6 +1083,7 @@ const struct luaL_reg awesome_wibox_methods[] =
}; };
const struct luaL_reg awesome_wibox_meta[] = const struct luaL_reg awesome_wibox_meta[] =
{ {
{ "buttons", luaA_wibox_buttons },
{ "geometry", luaA_wibox_geometry }, { "geometry", luaA_wibox_geometry },
{ "__index", luaA_wibox_index }, { "__index", luaA_wibox_index },
{ "__newindex", luaA_wibox_newindex }, { "__newindex", luaA_wibox_newindex },