The value to the ATTR_LIST attribute is an Attr_avlist, the same type returned by
attr_create_list(). The following code fragment shows how this can be used:
...
Canvas canvas1, canvas2, canvas3;
Attr_avlist attr_list;
attr_list = attr_create_list(
WIN_CMS, cms,
WIN_EVENT_PROC, my_event_proc,
XV_WIDTH, 100,
NULL);
canvas1 = xv_create(frame, CANVAS,
ATTR_LIST, attr_list,
WIN_BACKGROUND_COLOR, 1,
NULL);
canvas2 = xv_create(frame, CANVAS,
ATTR_LIST, attr_list,
WIN_BACKGROUND_COLOR, 2,
NULL);
canvas3 = xv_create(frame, CANVAS,
ATTR_LIST, attr_list,
WIN_BACKGROUND_COLOR, 3,
NULL);
free(attr_list);
...
The only restriction on the use of ATTR_LIST is that it must be the first attribute specified in
the call to xv_create(), xv_set() or any other xv_* routine that accepts attribute-val-
ue lists. Be sure that ATTR_LIST is the first attribute specified when you use it. There are
cases when ATTR_LIST may appear to be the first attribute specified, but it is actually not the
first attribute. This occurs when you use a macro. For panels, the following are macros:
PANEL_CHOICE_STACK, PANEL_CHECK_BOX, and PANEL_TOGGLE. These macros expand to
PANEL_CHOICE objects with several associated attributes that will not be visible. These attri-
butes displace ATTR_LIST as the first attribute. These and similar cases should be avoided if
you use ATTR_LIST.
Lastly, since attr_create_list() allocates memory, the list should be freed when it is
no longer needed.
25.2.3 Interpreting Attributes
When a routine is passed an Attr_avlist, it needs to scan ...