aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/dyn/dyn_listen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/dyn/dyn_listen.cpp')
-rw-r--r--externals/grill/dyn/dyn_listen.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/externals/grill/dyn/dyn_listen.cpp b/externals/grill/dyn/dyn_listen.cpp
new file mode 100644
index 00000000..beb5d7fc
--- /dev/null
+++ b/externals/grill/dyn/dyn_listen.cpp
@@ -0,0 +1,68 @@
+/*
+dyn - dynamical object management
+
+Copyright (c)2003-2004 Thomas Grill (gr@grrrr.org)
+For information on usage and redistribution, and for a DISCLAIMER OF ALL
+WARRANTIES, see the file, "license.txt," in this distribution.
+*/
+
+#include "dyn_proto.h"
+
+DYN_EXPORT int dyn_Listen(int sched,dyn_id *id,dyn_id oid,int outlet,dyn_listener cb,void *data)
+{
+ ASSERT(id);
+
+ if(oid == DYN_ID_NONE) return DYN_ERROR_NOTFOUND;
+
+ dyn_patchable *obj = oid->Patchable();
+ if(obj) {
+ proxyout *px = obj->GetProxyOut(outlet);
+ if(!px) {
+ dyn_patcher *patcher = obj->owner;
+ ASSERT(patcher);
+
+ // put proxy on the same canvas as this object for it can be connected to it!
+ px = (proxyout *)NewPDObject(DYN_TYPE_OBJECT,patcher->glist(),sym_dynpxout);
+ if(px) {
+ px->init(obj,outlet);
+
+// sys_lock();
+
+// canvas_setcurrent(patcher->glist());
+ // connect to associated object
+ if(obj_connect((t_object *)obj->pdobj,outlet,&px->pdobj,0)) {
+ obj->AddProxyOut(outlet,px);
+ }
+ else {
+ // delete object;
+ glist_delete(patcher->glist(),(t_gobj *)px);
+ px = NULL;
+
+ // could not connect
+ post("Couldn't connect proxy object");
+ }
+// canvas_unsetcurrent(patcher->glist());
+
+// sys_unlock();
+ }
+ }
+
+ if(px) {
+ dyn_ident *nid = new dyn_ident(DYN_TYPE_LISTENER,oid->callback,data);
+ dyn_listen *l = new dyn_listen(nid,px,cb,data);
+ proxyout::Add(px,l);
+ nid->Set(l);
+ *id = nid;
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_GENERAL;
+ }
+ else
+ return DYN_ERROR_TYPEMISMATCH;
+}
+
+dyn_listen::~dyn_listen()
+{
+ proxyout::Rmv(px,this);
+}