From f77da210ff38c83e17d2d3df024cb34345a683ad Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 23 Dec 2021 11:22:32 +0900 Subject: [PATCH] [ruamoko] Merge listener cookie code I know that duplication would turn around and bite me :P --- libs/ruamoko/rua_input.c | 107 +++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 45 deletions(-) diff --git a/libs/ruamoko/rua_input.c b/libs/ruamoko/rua_input.c index dec753b34..0b74d1367 100644 --- a/libs/ruamoko/rua_input.c +++ b/libs/ruamoko/rua_input.c @@ -192,48 +192,13 @@ bi_IN_GetButtonInfo (progs_t *pr) } } -static void -rua_add_axis_listener (progs_t *pr, axis_listener_t listener) +static rua_in_cookie_t * +make_cookie (progs_t *pr, func_t func, pointer_t data) { input_resources_t *res = PR_Resources_Find (pr, "input"); - in_axis_t *axis = &P_STRUCT (pr, in_axis_t, 0); rua_in_cookie_t search = { - .func = P_FUNCTION (pr, 1), - .data = P_POINTER (pr, 2), - }; - rua_in_cookie_t *cookie = Hash_FindElement (res->cookies, &search); - if (cookie) { - cookie = cmemalloc (res->cookie_super, sizeof (rua_in_cookie_t)); - *cookie = search; - cookie->pr = pr; - } - cookie->users++; - IN_AxisAddListener (axis, listener, cookie); -} - -static void -rua_remove_axis_listener (progs_t *pr, axis_listener_t listener) -{ - input_resources_t *res = PR_Resources_Find (pr, "input"); - in_axis_t *axis = &P_STRUCT (pr, in_axis_t, 0); - rua_in_cookie_t search = { - .func = P_FUNCTION (pr, 1), - .data = P_POINTER (pr, 2), - }; - rua_in_cookie_t *cookie = Hash_FindElement (res->cookies, &search); - if (cookie) { - IN_AxisRemoveListener (axis, listener, cookie); - } -} - -static void -rua_add_button_listener (progs_t *pr, button_listener_t listener) -{ - input_resources_t *res = PR_Resources_Find (pr, "input"); - in_button_t *button = &P_STRUCT (pr, in_button_t, 0); - rua_in_cookie_t search = { - .func = P_FUNCTION (pr, 1), - .data = P_POINTER (pr, 2), + .func = func, + .data = data, }; rua_in_cookie_t *cookie = Hash_FindElement (res->cookies, &search); if (!cookie) { @@ -242,21 +207,73 @@ rua_add_button_listener (progs_t *pr, button_listener_t listener) cookie->pr = pr; } cookie->users++; + return cookie; +} + +static rua_in_cookie_t * +find_cookie (progs_t *pr, func_t func, pointer_t data) +{ + input_resources_t *res = PR_Resources_Find (pr, "input"); + rua_in_cookie_t search = { + .func = func, + .data = data, + }; + return Hash_FindElement (res->cookies, &search); +} + +static void +release_cookie (progs_t *pr, rua_in_cookie_t *cookie) +{ + if (!--cookie->users) { + input_resources_t *res = PR_Resources_Find (pr, "input"); + Hash_DelElement (res->cookies, cookie); + Hash_Free (res->cookies, cookie); + } +} + +static void +rua_add_axis_listener (progs_t *pr, axis_listener_t listener) +{ + in_axis_t *axis = &P_STRUCT (pr, in_axis_t, 0); + func_t func = P_FUNCTION (pr, 1); + func_t data = P_POINTER (pr, 2); + rua_in_cookie_t *cookie = make_cookie (pr, func, data); + IN_AxisAddListener (axis, listener, cookie); +} + +static void +rua_remove_axis_listener (progs_t *pr, axis_listener_t listener) +{ + in_axis_t *axis = &P_STRUCT (pr, in_axis_t, 0); + func_t func = P_FUNCTION (pr, 1); + func_t data = P_POINTER (pr, 2); + rua_in_cookie_t *cookie = find_cookie (pr, func, data); + if (cookie) { + IN_AxisRemoveListener (axis, listener, cookie); + release_cookie (pr, cookie); + } +} + +static void +rua_add_button_listener (progs_t *pr, button_listener_t listener) +{ + in_button_t *button = &P_STRUCT (pr, in_button_t, 0); + func_t func = P_FUNCTION (pr, 1); + func_t data = P_POINTER (pr, 2); + rua_in_cookie_t *cookie = make_cookie (pr, func, data); IN_ButtonAddListener (button, listener, cookie); } static void rua_remove_button_listener (progs_t *pr, button_listener_t listener) { - input_resources_t *res = PR_Resources_Find (pr, "input"); in_button_t *button = &P_STRUCT (pr, in_button_t, 0); - rua_in_cookie_t search = { - .func = P_FUNCTION (pr, 1), - .data = P_POINTER (pr, 2), - }; - rua_in_cookie_t *cookie = Hash_FindElement (res->cookies, &search); + func_t func = P_FUNCTION (pr, 1); + func_t data = P_POINTER (pr, 2); + rua_in_cookie_t *cookie = find_cookie (pr, func, data); if (cookie) { IN_ButtonRemoveListener (button, listener, cookie); + release_cookie (pr, cookie); } }