Hi,
> Currently I invalidate a layer and start by
> greating a new one. Is this the correct way, or are they reusable in a way?

Yes, in fact when you create a layer for the 1st time, the function allocates a layer. If the layer already exists but has been invalidated  the function returns the old pointer with empty paths. Otherwise, the function returns NULL. If you have a "circle_layer" and a "rectangle_layer" and you want to change the color or the size of the "circle_layer", you have to invalidate the "circle_layer" then when you call ebox_draw, you have to redraw the "circle_layer" but you don't have to redraw the "rectangle_layer".

> The paint function is called at startup from the framework (via
> eclass_guiinit?).

No, eclass_guiinit initializes the class for GUI behavior (the paint function can't be called because there isn't any object allocated).

> The redraw function is called when the waveform is changed (manual at
> the moment).

Yes, when you want to change a layer, you have to invalidate this layer  (you don't have to invalidate all the layers if some of them don't need to be redrawn) and then call ebox_redraw(). 

There's no "redraw", "invalidate", "state" method so
eclass_addmethod(c, (method) wavesel_invalidate, "invalidate", A_SYMBOL, 0);
eclass_addmethod(c, (method) wavesel_state, "state", A_NULL, 0);
eclass_addmethod(c, (method) wavesel_redraw, "redraw", A_NULL, 0);
are useless methods.
I think you use the c.blackboard as a template but you should prefer to use c.bang or something simpler. c.blackboard is a little bit tricky.

Now I'll try to explain everything better :
When the object is allocated in the patch, the method paint is called :

static void wavesel_paint(t_wavesel *x, t_object *view)
{
    t_rect bg_rect;
    ebox_get_rect_for_view((t_ebox *)x, &bg_rect);

    t_elayer *g = ebox_start_layer((t_ebox *)x, bg_layer_name, rect->width, rect->height);
   if (g)
  {
      Here you can draw what you want in the "bg_layer_name" layer.
     Then you finish your layer with 

  }
  ebox_paint_layer((t_ebox *)x, bg_layer_name, 0.f, 0.f);
}


2015-07-10 14:33 GMT+02:00 Fred Jan Kraan <fjkraan@xs4all.nl>:
Hi Pierre,

Currently, graphics data is drawn to the canvas, but nothing is erased.
If I specify a new waveform, it is drawn over the previous one, instead
of removing it first.

The real code is a bit messy due to the implementation details, but
below is the skeleton, containing the framework interactions and key
data. The paint function is called at startup from the framework (via
eclass_guiinit?).
The redraw function is called when the waveform is changed (manual at
the moment).

draw_background function:
- ebox_start_layer(background_layer)
- ebox_paint_layer()

draw_waveform function:
- ebox_start_layer(waveform_layer)
- egraphics_line_fast(... here the waveform is defined ...)
- ebox_end_layer()
- ebox_paint_layer()

paint function:
- draw_background()
- draw_waveform()

redraw function:
- ebox_invalidate_layer(background_layer)
- ebox_invalidate_layer(waveform_layer)
- paint()
- ebox_redraw()


You can look at the current code in my toy github repository:
https://github.com/electrickery/pd-playground/tree/cicm/cicm-wavesel

Greetings,

Fred Jan