From 8b042a66a4fd811589412747e38e8c7ee784db3c Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Thu, 15 May 2003 02:32:38 +0000 Subject: "" svn path=/trunk/; revision=618 --- externals/grill/flext/source/flbind.cpp | 35 +++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'externals/grill/flext/source/flbind.cpp') diff --git a/externals/grill/flext/source/flbind.cpp b/externals/grill/flext/source/flbind.cpp index 53f041c6..d2a00129 100644 --- a/externals/grill/flext/source/flbind.cpp +++ b/externals/grill/flext/source/flbind.cpp @@ -135,17 +135,36 @@ bool flext_base::BindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbo } -bool flext_base::UnbindMethod(const t_symbol *sym,void **data) +bool flext_base::UnbindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbol *s,int argc,t_atom *argv,void *data),void **data) { bool ok = false; - binditem *it = bindhead?(binditem *)bindhead->Find(sym,0):NULL; - void *d = NULL; - if(it) { - d = it->px->data; - ok = bindhead->Remove(it); - if(ok) delete it; + + if(bindhead) { + void *d = NULL; + binditem *it = NULL; + if(sym) { + it = (binditem *)bindhead->Find(sym,0); + while(it) { + if(it->tag == sym && (!fun || it->fun == fun)) break; + } + } + else { + int sz = bindhead->Size(); + if(!sz) sz = 1; + + for(int i = 0; i < sz; ++i) { + for(it = (binditem *)bindhead->Item(0); it; it = (binditem *)it->nxt) { + if(it->tag == sym && (!fun || it->fun == fun)) break; + } + if(it) break; + } + } + if(it) { + if(data) *data = it->px->data; + ok = bindhead->Remove(it); + if(ok) delete it; + } } - if(data) *data = d; return ok; } -- cgit v1.2.1