notify when attribute changes


    Nov 29 2008 | 1:30 pm
    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); }

    • Nov 29 2008 | 2:00 pm
      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
    • Nov 29 2008 | 6:22 pm
      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.
    • Oct 28 2016 | 5:07 am
      This is very old, but I agree this should really be documented in that particular section of the API, it's still not!
    • Dec 16 2016 | 1:25 pm
      +1
    • Aug 30 2017 | 7:57 pm
      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 ?