notify when attribute changes

volker böhm's icon

hi

i need my object to be notified when one of its attributes changes.
this seems to work fine if i write custom getter and setter methods,
however it's a little overkill in the simple example i'm working on.

so i tried the "notify" message, cause the doc says:
"As an alternative to writing a custom setter, you can take advantage
of the fact that objects receive a "notify" message whenever one of
their attributes is changed."

the example below compiles fine, but i can't get any notification
when changing the "test" attribute in max.
what am i doing wrong?

thanks,
volker.

/***** testnotify **********/

#include "ext.h"
#include "ext_obex.h"

static t_class *s_myObj_class;

typedef struct _myObj
{
    t_object    ob;
    long    testattr;
} t_myObj;

void myObj_bang(t_myObj *x);
void myObj_int(t_myObj *x, long n);
void *myObj_new(t_symbol *s, long argc, t_atom *argv);
t_max_err myObj_notify(t_myObj *x, t_symbol *s, t_symbol *msg, void
*sender, void *data);

int main(void)
{
    t_class *c;
    c = class_new("testnotify", (method)myObj_new, 0, sizeof(t_myObj),
0L, A_GIMME, 0);

    class_addmethod(c, (method)myObj_bang, "bang", 0);
    class_addmethod(c, (method)myObj_int, "int", A_LONG, 0);
    class_addmethod(c, (method)myObj_notify, "notify", A_CANT, 0);

    // attributes
    CLASS_ATTR_LONG( c, "test", 0, t_myObj, testattr );

    class_register(CLASS_BOX, c);
    s_myObj_class = c;
    return 0;
}

t_max_err myObj_notify(t_myObj *x, t_symbol *s, t_symbol *msg, void
*sender, void *data) {
     // look for all messages
    post("notify");
    //object_post((t_object *)x, "i got msg: %s", msg->s_name);

    t_symbol *attrname;
    if(msg == gensym("attr_modified")) {
        attrname = (t_symbol *)object_method((t_object *)data, gensym
("getname"));
        object_post((t_object *)x, "i got a %s notification from the %s
attribute", msg->s_name, attrname->s_name);
    }
    return 0;
}

void myObj_bang(t_myObj *x) {
    post("test: %ld", x->testattr);
}

void myObj_int(t_myObj *x, long n) {
    x->testattr = n;
}

void *myObj_new(t_symbol *s, long argc, t_atom *argv)
{
    t_myObj *x = (t_myObj *)object_alloc(s_myObj_class);
    x->testattr = 77;
    return (x);
}

Jeremy's icon

You need to attach the object to itself (ensuring that it gets registered) in order to receive attr notifications from itself:

in myObject_new():

object_attach_byptr_register(x, x, CLASS_BOX);

jb

volker böhm's icon

On 29 Nov 2008, at 15:00, Jeremy Bernstein wrote:
>
> You need to attach the object to itself (ensuring that it gets
> registered) in order to receive attr notifications from itself:
>
> in myObject_new():
>
> object_attach_byptr_register(x, x, CLASS_BOX);
>

ah, thanks jeremy, now it works.
might be an idea to add this line to the documentation in "Sending
Messages, Calling Methods".
maybe it's already somewhere else.

thanks,
volker.

ndivuyo's icon

This is very old, but I agree this should really be documented in that particular section of the API, it's still not!

Chris H.'s icon
Antoine Villeret's icon

Yes I spend all the afternoon looking what was wrong with my code, reading 10 times the **** manual...
So where could we send PR to update this API documentation ?

lysdexic's icon

another vote here to please update the API/SDK documentation - especially around Attributes :)

from the API doc (in the "Sending Messages, Calling Methods" section):

(more documentation on this is coming soon!)

JEREMY's Answer is from NOV 30 2008 :(

Timothy Place's icon

@Antoine: Pull Requests can be made at https://github.com/cycling74/max-sdk