query width and height of UI object box


    Mar 06 2010 | 9:28 am
    hi, after a longer break, i'm working on a UI external again, and my brain still seems to be a little rusty... while initializing the object variables in the new-routine, i need to query the width and height of the current objects box. therefore i guess i need a patcherview (in order to be able to call jbox_get_rect_for_view()). is it possible to get a patcherview at this stage of object instantiation (in the new-routine), or would i have to somehow get hold of the patcher_rect attribute from the inspector? thanks, v

    • Mar 06 2010 | 5:08 pm
      Hi Volker,
      you do not need a patcherview. You need a dictionary. You need to query the values you need from the dictionary that you create in the myobject_new routine. They are all there.
      Look at the jslider example in the SDK and specifically at the jslider_stdargs() method to get a clue on where the values you need might be.
      Hope this helps. Let me know if that solves your problem.
      - Luigi
    • Mar 06 2010 | 9:53 pm
      ciao luigi thanks for the hint. dictionary looks interesting, but somewhat complicated... from the api get the impression, i need something like dictionary_copyatoms, to get hold of the patcher_rect attributes. so i tried:
      t_atom **r = NULL; long num = 4; long k; dictionary_copyatoms(d, gensym("patching_rect"), &num, r); for(k=0; k post("k: %ld -- %f", k, atom_getfloat((t_atom *)r+k)); if(r) sysmem_freeptr(r);
      which crashes... the atom_getfloat() call causes me trouble. is that going into the right direction at all? it's not urgent, as i found a workaround for what i was trying to do, but comments on how to get values from the dictionary would still be welcome. thanks, volker.
    • Mar 06 2010 | 11:37 pm
      The only reason why you get a crash is because of some dereference confusion. Do the same but replace atom_getfloat((t_atom *)r+k) with atom_getfloat((*r)+k)
      Other than that, you are definitely in the right direction...
      You might also want to consider using dictionary_getatoms(). This way you don't need to allocate any memory. You just get a pointer to the patching rect which, in most cases, it's all you need.
      Ciao.
      - Luigi
    • Mar 08 2010 | 8:08 pm
      > Do the same but replace atom_getfloat((t_atom *)r+k) with atom_getfloat((*r)+k)
      hm, i've tried that before, and it crashes here just the same. any more clues anyone?
    • Mar 09 2010 | 12:51 pm
      Do you know which line it crashes on? The crash report probably tells you.
      However, I can see a couple of suspicious things about your call to dictionary_copyatoms().
      t_atom *r = NULL;
      long num = 0;
      long k;
      
      dictionary_copyatoms(d, gensym("patching_rect"), &num, &r);
      for (k=0; k
      
      
      This is email-client coding, but notice that I pass a size (num) initialized to zero and also that for 'r' I am passing the address of a valid pointer (which is pointing to NULL).
      Hope this helps
    • Mar 09 2010 | 1:37 pm
      thanks, tim. your version won't compile here, but it got me on the right track. i got a little confused by the pointer to point to t_atom thing from the dictionary_copyatoms() call, and wasn't sure how to properly dereference it. but this, too, of course is only an address. so this works for me:
      t_atom *r = NULL; long num = 0; long k;
      dictionary_copyatoms(d, gensym("patching_rect"), &num, &r); for (k=0; k post("k: %ld -- %f", k, atom_getfloat(r+k)); if (r) sysmem_freeptr(r);
      dictionary seems to be quite powerful. i think a future version of the sdk would benefit from some more examples on how it can be used. thanks again, volker.