As you can easily imagine, the ASN.1 representation of a XmString isn't very suitable for fast handling, yet saves memory. Another advantage of a XmString is that it is independent of a XmFontList. Only when you need to know the height and/or width of a XmString or want to render it into a drawable a XmFontList must be specified so that the individual string components can be ``connected'' to the fonts from the font list.
_XmStringCreate()_XmStringUpdate()If you need to work many times with a particular XmString (like the list widget) it is more convenient to ``compile'' the ASN.1 representation of a XmString into an internal form - a _XmString. The individual TLV's from the ASN.1 XmString are thereby transformed into string components accessible through pointers. The compilation is carried out with _XmStringCreate() which takes a XmString and returns a _XmString. Next after the transformation the references to the fonts should be resolved - use _XmStringUpdate() for this task. Lateron, you can update the fonts the (internal) _XmString will use whenever you want by calling _XmStringUpdate().
A _XmString is merely a pointer to a
__XmStringRec. This structure points to a table of
pointers to the string's components. In addition the
__XmStringRec also accounts for the size of that table of pointers
(see figure ). As the table of pointers can grow
and shrink whenever the string gets manipulated, it may also move in
memory. Thus the the _XmString pointer can't point directly to
the components table but must point to a data structure instead which
stays at the same memory location all the time (well - at the same
logical or linear memory location as modern virtual
memory management may move memory blocks at any time around the physical
memory).
In turn the string components are described by
__XmStringComponentRecs, which contain the type of a
component (see table on page
), the component's data, its length, and finally
the font to be used. Every __XmStringComponentRec can thus be
regarded as a TLV converted to a more suitable form to the CPU. The
font member of the component record is just an index into a
XmFontList. So be sure to update these indices with
_XmStringUpdate() whenever the font list changes which is
used for rendering the _XmString.