diff -urN cui98/cui.c cui99/cui.c --- cui98/cui.c Wed Apr 2 01:30:00 2014 +++ cui99/cui.c Thu Apr 3 22:00:00 2014 @@ -589,7 +589,7 @@ { if(obj == NULL) return; cui_free_chain(obj->children); - cui_handler_list_free(obj->handler_list); + cui_list_del_all(&obj->handler_list); free(obj); } diff -urN cui98/cui.h cui99/cui.h --- cui98/cui.h Sun Mar 30 22:00:00 2014 +++ cui99/cui.h Thu Apr 3 22:00:00 2014 @@ -30,14 +30,14 @@ #define CUI_ATTR_REVERSE (1<<1) typedef int (*cui_handler)(cui obj, int evt, int val, void *prm); -typedef struct cui_handler_list *cui_handler_list; #include "rect.h" +#include "list.h" struct cui_base{ cui parent, children, next; int x, y, w, h; - cui_handler_list handler_list; + cui_list handler_list; int flags; }; diff -urN cui98/handler.c cui99/handler.c --- cui98/handler.c Sun Feb 2 23:50:00 2014 +++ cui99/handler.c Thu Apr 3 22:00:00 2014 @@ -2,58 +2,46 @@ #include #include -cui_handler_list -cui_handler_list_new(cui_handler hdr, int evt, void *prm, cui_handler_list next) -{ - cui_handler_list list; - - if((list = malloc(sizeof(struct cui_handler_list))) == NULL) ERR("No Mem"); - list->hdr = hdr; - list->evt = evt; - list->prm = prm; - list->next = next; - return list; -} - -void -cui_handler_list_free(cui_handler_list list) -{ - if(list == NULL) return; - cui_handler_list_free(list->next); - free(list); -} +typedef struct cui_handler_data{ + cui_handler hdr; + int evt; + void *prm; +} *cui_handler_data; void cui_bind(cui obj, int evt, cui_handler hdr, void *prm) { - obj->handler_list = cui_handler_list_new(hdr, evt, prm, obj->handler_list); + cui_handler_data p = cui_list_add(&obj->handler_list, sizeof(struct cui_handler_data)); + p->hdr = hdr; + p->evt = evt; + p->prm = prm; } void cui_unbind(cui obj, int evt, cui_handler hdr) { - cui_handler_list *p = &obj->handler_list, list; - - while(*p){ - list = *p; - if(list->evt & evt && list->hdr == hdr){ - list->evt &= ~evt; - if(list->evt == 0){ - *p = list->next; - free(list); - continue; - } + cui_list lp = obj->handler_list, next; + cui_handler_data p; + for(; lp; lp=next){ + next = lp->next; + p = (cui_handler_data)lp->data; + if(p->evt & evt && p->hdr == hdr){ + p->evt &= ~evt; + if(p->evt == 0) cui_list_del(&obj->handler_list, p); } - p = &list->next; } } -int -cui_handler_call_chain(cui obj, cui_handler_list list, int evt, int val) +static int +cui_handler_call_chain(cui obj, cui_list lp, int evt, int val) { - if(list == NULL) return FALSE; - return (evt & list->evt) && (*list->hdr)(obj, evt, val, list->prm) ? TRUE : - cui_handler_call_chain(obj, list->next, evt, val); + cui_list next; + cui_handler_data p; + if(lp == NULL) return FALSE; + next = lp->next; + p = (cui_handler_data)lp->data; + return (evt & p->evt) && (*p->hdr)(obj, evt, val, p->prm) ? TRUE : + cui_handler_call_chain(obj, next, evt, val); } int diff -urN cui98/handler.h cui99/handler.h --- cui98/handler.h Thu Mar 27 23:00:00 2014 +++ cui99/handler.h Thu Apr 3 22:00:00 2014 @@ -3,18 +3,8 @@ #include "cui.h" -struct cui_handler_list{ - cui_handler hdr; - int evt; - void *prm; - cui_handler_list next; -}; - -cui_handler_list cui_handler_list_new(cui_handler hdr, int evt, void *prm, cui_handler_list next); -void cui_handler_list_free(cui_handler_list list); void cui_bind(cui obj, int evt, cui_handler hdr, void *prm); void cui_unbind(cui obj, int evt, cui_handler hdr); -int cui_handler_call_chain(cui obj, cui_handler_list list, int evt, int val); int cui_handler_call(cui obj, int evt, int val); #endif diff -urN cui98/list.c cui99/list.c --- cui98/list.c Wed Apr 2 00:00:00 2014 +++ cui99/list.c Thu Apr 3 22:00:00 2014 @@ -23,4 +23,14 @@ free(p); } +void +cui_list_del_all(cui_list *root) +{ + cui_list p = *root, next; + for(; p; p=next){ + next = p->next; + cui_list_del(root, p->data); + } +} + /* EOF */ diff -urN cui98/list.h cui99/list.h --- cui98/list.h Wed Apr 2 00:00:00 2014 +++ cui99/list.h Thu Apr 3 22:00:00 2014 @@ -10,5 +10,6 @@ void *cui_list_add(cui_list *root, int data_size); void cui_list_del(cui_list *root, void *data); +void cui_list_del_all(cui_list *root); #endif