Put keybindings in arrays.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
This commit is contained in:
Pierre Habouzit 2008-06-25 00:08:40 +02:00
parent 3a1c9e0cfb
commit 8c1aec2e96
3 changed files with 25 additions and 14 deletions

View File

@ -391,7 +391,6 @@ event_handle_keypress(void *data __attribute__ ((unused)),
xcb_key_press_event_t *ev) xcb_key_press_event_t *ev)
{ {
xcb_keysym_t keysym; xcb_keysym_t keysym;
keybinding_t *k;
if(globalconf.keygrabber != LUA_REFNIL) if(globalconf.keygrabber != LUA_REFNIL)
{ {
@ -412,11 +411,14 @@ event_handle_keypress(void *data __attribute__ ((unused)),
{ {
keysym = xcb_key_symbols_get_keysym(globalconf.keysyms, ev->detail, 0); keysym = xcb_key_symbols_get_keysym(globalconf.keysyms, ev->detail, 0);
for(k = globalconf.keys; k; k = k->next) for(int i = 0; i < globalconf.keys.len; i++)
{
keybinding_t *k = globalconf.keys.tab[i];
if(((k->keycode && ev->detail == k->keycode) || (k->keysym && keysym == k->keysym)) if(((k->keycode && ev->detail == k->keycode) || (k->keysym && keysym == k->keysym))
&& k->fct && CLEANMASK(k->mod) == CLEANMASK(ev->state)) && k->fct && CLEANMASK(k->mod) == CLEANMASK(ev->state))
luaA_dofunction(globalconf.L, k->fct, 0); luaA_dofunction(globalconf.L, k->fct, 0);
} }
}
return 0; return 0;
} }

View File

@ -31,6 +31,11 @@ extern awesome_t globalconf;
DO_LUA_NEW(static, keybinding_t, keybinding, "keybinding", keybinding_ref) DO_LUA_NEW(static, keybinding_t, keybinding, "keybinding", keybinding_ref)
DO_LUA_GC(keybinding_t, keybinding, "keybinding", keybinding_unref) DO_LUA_GC(keybinding_t, keybinding, "keybinding", keybinding_unref)
void keybinding_delete(keybinding_t **kbp)
{
p_delete(kbp);
}
static void static void
__luaA_keystore(keybinding_t *key, const char *str) __luaA_keystore(keybinding_t *key, const char *str)
{ {
@ -96,14 +101,14 @@ luaA_keybinding_new(lua_State *L)
static int static int
luaA_keybinding_add(lua_State *L) luaA_keybinding_add(lua_State *L)
{ {
keybinding_t *key, **k = luaA_checkudata(L, 1, "keybinding"); keybinding_t **k = luaA_checkudata(L, 1, "keybinding");
/* Check that the keybinding has not been already added. */ /* Check that the keybinding has not been already added. */
for(key = globalconf.keys; key; key = key->next) for(int i = 0; i < globalconf.keys.len; i++)
if(key == *k) if(globalconf.keys.tab[i] == *k)
luaL_error(L, "keybinding already added"); luaL_error(L, "keybinding already added");
keybinding_list_push(&globalconf.keys, keybinding_ref(k)); keybinding_array_append(&globalconf.keys, keybinding_ref(k));
window_root_grabkey(*k); window_root_grabkey(*k);
return 0; return 0;
@ -120,9 +125,13 @@ luaA_keybinding_remove(lua_State *L)
{ {
keybinding_t **k = luaA_checkudata(L, 1, "keybinding"); keybinding_t **k = luaA_checkudata(L, 1, "keybinding");
keybinding_list_detach(&globalconf.keys, *k); for(int i = 0; i < globalconf.keys.len; i++)
if(globalconf.keys.tab[i] == *k)
{
keybinding_array_take(&globalconf.keys, i);
window_root_ungrabkey(*k); window_root_ungrabkey(*k);
keybinding_unref(k); keybinding_unref(k);
}
return 0; return 0;
} }

View File

@ -206,6 +206,7 @@ titlebar_delete(titlebar_t **t)
DO_RCNT(titlebar_t, titlebar, titlebar_delete) DO_RCNT(titlebar_t, titlebar, titlebar_delete)
/** Keys bindings */ /** Keys bindings */
ARRAY_TYPE(struct keybinding_t *, keybinding);
struct keybinding_t struct keybinding_t
{ {
/** Ref count */ /** Ref count */
@ -218,12 +219,11 @@ struct keybinding_t
xcb_keycode_t keycode; xcb_keycode_t keycode;
/** Lua function to execute. */ /** Lua function to execute. */
luaA_function fct; luaA_function fct;
/** Next and previous keys */
keybinding_t *prev, *next;
}; };
DO_SLIST(keybinding_t, keybinding, p_delete) void keybinding_delete(keybinding_t **);
DO_RCNT(keybinding_t, keybinding, p_delete) DO_RCNT(keybinding_t, keybinding, keybinding_delete)
ARRAY_FUNCS(keybinding_t *, keybinding, keybinding_unref)
/** Status bar */ /** Status bar */
struct statusbar_t struct statusbar_t
@ -399,7 +399,7 @@ struct awesome_t
/** Screens info */ /** Screens info */
screens_info_t *screens_info; screens_info_t *screens_info;
/** Keys bindings list */ /** Keys bindings list */
keybinding_t *keys; keybinding_array_t keys;
/** Mouse bindings list */ /** Mouse bindings list */
struct struct
{ {