Skip to content
Snippets Groups Projects
Commit 04b0af36 authored by pokergaming's avatar pokergaming
Browse files

First attempt at an [objectinfo] class

parent 55a936dc
No related branches found
No related tags found
No related merge requests found
...@@ -102,7 +102,7 @@ static void print_setup(void) ...@@ -102,7 +102,7 @@ static void print_setup(void)
class_addanything(print_class, print_anything); class_addanything(print_class, print_anything);
} }
/* -----------------canvasinfo, pdinfo, classinfo ------------------------------ */ /* --------------pdinfo, canvasinfo, classinfo, objectinfo --------------- */
static t_class *canvasinfo_class; static t_class *canvasinfo_class;
typedef struct _canvasinfo { typedef struct _canvasinfo {
...@@ -125,9 +125,19 @@ typedef struct _classinfo { ...@@ -125,9 +125,19 @@ typedef struct _classinfo {
t_symbol *x_name; t_symbol *x_name;
} t_classinfo; } t_classinfo;
static t_class *objectinfo_class;
typedef struct _objectinfo {
t_object x_obj;
t_outlet *x_out2;
t_canvas *x_canvas;
t_float x_index;
t_float x_depth;
} t_objectinfo;
/* used by all the *info objects */ /* used by all the *info objects */
static t_int info_to_console = 0; static int info_to_console = 0;
void info_out(t_text *te, t_symbol *s, int argc, t_atom *argv) void info_out(t_text *te, t_symbol *s, int argc, t_atom *argv)
{ {
...@@ -158,27 +168,32 @@ void info_print(t_text *te) ...@@ -158,27 +168,32 @@ void info_print(t_text *te)
for(i = c->c_nmethod, m = c->c_methods; i; i--, m++) for(i = c->c_nmethod, m = c->c_methods; i; i--, m++)
if(m->me_name != gensym("print")) if(m->me_name != gensym("print"))
(m->me_fun)(te, m->me_name, 0, 0); (m->me_fun)(te, m->me_name, 0, 0);
/* pd_forwardmess(te->te_pd, 0, 0); not sure why this doesn't work */ /* not sure why this doesn't work... */
/* pd_forwardmess(te->te_pd, 0, 0); */
info_to_console = 0; info_to_console = 0;
} }
/* -------------------------- canvasinfo ------------------------------ */ /* -------------------------- canvasinfo ------------------------------ */
t_canvas *canvasinfo_dig(t_canvasinfo *x) /* climb up to a parent canvas */
t_canvas *canvas_climb(t_canvas *c, int level)
{ {
int depth = (int)x->x_depth; if(level <= 0)
t_canvas *c = x->x_canvas; return c;
if(depth<0) depth = 0; else
{
while(depth && c->gl_owner) { t_canvas *ret = c;
c = c->gl_owner; while(level && ret->gl_owner)
depth--; {
ret = ret->gl_owner;
level--;
}
return c;
} }
return c;
} }
void canvasinfo_args(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_args(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
int n = 0; int n = 0;
t_atom *a = 0; t_atom *a = 0;
t_binbuf *b; t_binbuf *b;
...@@ -202,7 +217,7 @@ void canvasinfo_args(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -202,7 +217,7 @@ void canvasinfo_args(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_coords(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_coords(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_int gop = c->gl_isgraph + c->gl_hidetext; t_int gop = c->gl_isgraph + c->gl_hidetext;
t_atom at[9]; t_atom at[9];
SETFLOAT(at, (c->gl_isgraph) ? c->gl_x1 : 0); SETFLOAT(at, (c->gl_isgraph) ? c->gl_x1 : 0);
...@@ -219,7 +234,7 @@ void canvasinfo_coords(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -219,7 +234,7 @@ void canvasinfo_coords(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_dir(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_dir(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
c = canvas_getrootfor(c); c = canvas_getrootfor(c);
t_atom at[1]; t_atom at[1];
SETSYMBOL(at, canvas_getdir(c)); SETSYMBOL(at, canvas_getdir(c));
...@@ -228,7 +243,7 @@ void canvasinfo_dir(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -228,7 +243,7 @@ void canvasinfo_dir(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_dirty(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_dirty(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_atom at[1]; t_atom at[1];
SETFLOAT(at, c->gl_dirty); SETFLOAT(at, c->gl_dirty);
info_out((t_text *)x, s, 1, at); info_out((t_text *)x, s, 1, at);
...@@ -236,7 +251,7 @@ void canvasinfo_dirty(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -236,7 +251,7 @@ void canvasinfo_dirty(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_dollarzero(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_dollarzero(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
c = canvas_getrootfor(c); c = canvas_getrootfor(c);
t_symbol *d = gensym("$0"); t_symbol *d = gensym("$0");
t_symbol *ret = canvas_realizedollar(c, d); t_symbol *ret = canvas_realizedollar(c, d);
...@@ -248,7 +263,7 @@ void canvasinfo_dollarzero(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -248,7 +263,7 @@ void canvasinfo_dollarzero(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_editmode(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_editmode(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_atom at[1]; t_atom at[1];
SETFLOAT(at, c->gl_edit); SETFLOAT(at, c->gl_edit);
info_out((t_text *)x, s, 1, at); info_out((t_text *)x, s, 1, at);
...@@ -256,7 +271,7 @@ void canvasinfo_editmode(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -256,7 +271,7 @@ void canvasinfo_editmode(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_filename(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_filename(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
c = canvas_getrootfor(c); c = canvas_getrootfor(c);
t_atom at[1]; t_atom at[1];
SETSYMBOL(at, c->gl_name); SETSYMBOL(at, c->gl_name);
...@@ -265,7 +280,7 @@ void canvasinfo_filename(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -265,7 +280,7 @@ void canvasinfo_filename(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_hitbox(t_canvasinfo *x, t_floatarg xpos, t_floatarg ypos) void canvasinfo_hitbox(t_canvasinfo *x, t_floatarg xpos, t_floatarg ypos)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
int x1, y1, x2, y2, indexno; int x1, y1, x2, y2, indexno;
t_gobj *ob = canvas_findhitbox(c, xpos, ypos, &x1, &y1, &x2, &y2); t_gobj *ob = canvas_findhitbox(c, xpos, ypos, &x1, &y1, &x2, &y2);
if (ob) if (ob)
...@@ -289,7 +304,7 @@ void canvasinfo_hitbox(t_canvasinfo *x, t_floatarg xpos, t_floatarg ypos) ...@@ -289,7 +304,7 @@ void canvasinfo_hitbox(t_canvasinfo *x, t_floatarg xpos, t_floatarg ypos)
void canvasinfo_name(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_name(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
char buf[MAXPDSTRING]; char buf[MAXPDSTRING];
snprintf(buf, MAXPDSTRING, ".x%lx", (long unsigned int)c); snprintf(buf, MAXPDSTRING, ".x%lx", (long unsigned int)c);
t_atom at[1]; t_atom at[1];
...@@ -299,7 +314,7 @@ void canvasinfo_name(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -299,7 +314,7 @@ void canvasinfo_name(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_pointer(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_pointer(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_atom at[1]; t_atom at[1];
t_gpointer gp; t_gpointer gp;
gpointer_init(&gp); gpointer_init(&gp);
...@@ -312,7 +327,7 @@ void canvasinfo_pointer(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -312,7 +327,7 @@ void canvasinfo_pointer(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_posonparent(t_canvasinfo *x, t_symbol *s, void canvasinfo_posonparent(t_canvasinfo *x, t_symbol *s,
int argc, t_atom *argv) int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_atom at[2]; t_atom at[2];
SETFLOAT(at, c->gl_obj.te_xpix); SETFLOAT(at, c->gl_obj.te_xpix);
SETFLOAT(at+1, c->gl_obj.te_ypix); SETFLOAT(at+1, c->gl_obj.te_ypix);
...@@ -321,7 +336,7 @@ void canvasinfo_posonparent(t_canvasinfo *x, t_symbol *s, ...@@ -321,7 +336,7 @@ void canvasinfo_posonparent(t_canvasinfo *x, t_symbol *s,
void canvasinfo_screenpos(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_screenpos(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_atom at[4]; t_atom at[4];
SETFLOAT(at, c->gl_screenx1); SETFLOAT(at, c->gl_screenx1);
SETFLOAT(at+1, c->gl_screeny1); SETFLOAT(at+1, c->gl_screeny1);
...@@ -332,7 +347,7 @@ void canvasinfo_screenpos(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -332,7 +347,7 @@ void canvasinfo_screenpos(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_toplevel(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_toplevel(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_float f = c->gl_owner ? 0 : 1; t_float f = c->gl_owner ? 0 : 1;
t_atom at[1]; t_atom at[1];
SETFLOAT(at, f); SETFLOAT(at, f);
...@@ -341,7 +356,7 @@ void canvasinfo_toplevel(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) ...@@ -341,7 +356,7 @@ void canvasinfo_toplevel(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
void canvasinfo_vis(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv) void canvasinfo_vis(t_canvasinfo *x, t_symbol *s, int argc, t_atom *argv)
{ {
t_canvas *c = canvasinfo_dig(x); t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_atom at[1]; t_atom at[1];
SETFLOAT(at, glist_isvisible(c)); SETFLOAT(at, glist_isvisible(c));
info_out((t_text *)x, s, 1, at); info_out((t_text *)x, s, 1, at);
...@@ -961,10 +976,138 @@ void classinfo_setup(void) ...@@ -961,10 +976,138 @@ void classinfo_setup(void)
*/ */
} }
/* -------------------------- objectinfo ------------------------------ */
t_gobj *objectinfo_getobject(t_canvas *c, int index)
{
int i = index;
t_gobj *y = c->gl_list;
while(i-- && y)
y = y->g_next;
return y;
}
void objectinfo_float(t_floatarg f)
{
}
void objectinfo_boxtext(t_objectinfo *x, t_symbol *s, int argc, t_atom *argv)
{
t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
t_gobj *ob;
if(ob = objectinfo_getobject(c, x->x_index))
{
int n = 0;
t_atom *a = 0;
t_binbuf *b;
/* if it's not t_object (e.g., a scalar), or if it is but
does not have any binbuf content, send a bang... */
if (!pd_checkobject(&ob->g_pd) ||
!(b = ((t_text *)ob)->te_binbuf))
{
info_out((t_text *)x, &s_bang, 0, 0);
}
else
{
n = binbuf_getnatom(b);
a = binbuf_getvec(b);
info_out((t_text *)x, s, n, a);
}
}
else
outlet_bang(x->x_out2);
}
void objectinfo_bbox(t_objectinfo *x, t_symbol *s, int argc, t_atom *argv)
{
t_gobj *ob;
t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
int x1, y1, x2, y2;
if(ob = objectinfo_getobject(c, x->x_index))
{
/* check for a getrectfn */
if (ob->g_pd->c_wb && ob->g_pd->c_wb->w_getrectfn)
{
t_atom at[4];
gobj_getrect(ob, c, &x1, &y1, &x2, &y2);
SETFLOAT(at, (t_float)x1);
SETFLOAT(at+1, (t_float)y1);
SETFLOAT(at+2, (t_float)x2);
SETFLOAT(at+3, (t_float)y2);
info_out((t_text *)x, s, 4, at);
}
else
{
info_out((t_text *)x, &s_bang, 0, 0);
}
}
else
outlet_bang(x->x_out2);
}
void objectinfo_classname(t_objectinfo *x, t_symbol *s,
int argc, t_atom *argv)
{
t_atom at[1];
t_gobj *ob;
t_canvas *c = canvas_climb(x->x_canvas, x->x_depth);
if(ob = objectinfo_getobject(c, x->x_index))
{
char *classname = class_getname(ob->g_pd);
SETSYMBOL(at, gensym(classname));
info_out((t_text *)x, s, 1, at);
}
else
outlet_bang(x->x_out2);
}
void objectinfo_print(t_classinfo *x)
{
info_print((t_text *)x);
}
void *objectinfo_new(t_floatarg f)
{
t_objectinfo *x = (t_objectinfo *)pd_new(objectinfo_class);
t_glist *glist = (t_glist *)canvas_getcurrent();
x->x_canvas = (t_canvas*)glist_getcanvas(glist);
x->x_index = f;
floatinlet_new(&x->x_obj, &x->x_index);
floatinlet_new(&x->x_obj, &x->x_depth);
outlet_new(&x->x_obj, &s_anything);
x->x_out2 = outlet_new(&x->x_obj, &s_bang);
return (void *)x;
}
void objectinfo_setup(void)
{
objectinfo_class = class_new(gensym("objectinfo"),
(t_newmethod)objectinfo_new, 0,
sizeof(t_objectinfo),
CLASS_DEFAULT, A_DEFFLOAT, 0);
class_addfloat(objectinfo_class, objectinfo_float);
class_addmethod(objectinfo_class, (t_method)objectinfo_bbox,
gensym("bbox"), A_GIMME, 0);
class_addmethod(objectinfo_class, (t_method)objectinfo_boxtext,
gensym("boxtext"), A_GIMME, 0);
class_addmethod(objectinfo_class, (t_method)objectinfo_classname,
gensym("class"), A_GIMME, 0);
class_addmethod(objectinfo_class, (t_method)objectinfo_print,
gensym("print"), 0);
post("objectinfo: v.0.1");
post("stable objectinfo methods: class");
}
void x_interface_setup(void) void x_interface_setup(void)
{ {
print_setup(); print_setup();
canvasinfo_setup(); canvasinfo_setup();
pdinfo_setup(); pdinfo_setup();
classinfo_setup(); classinfo_setup();
objectinfo_setup();
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment