As mentioned earlier in this chapter, there are two general ways for a widget to access the trait information of another widget:
The following subsections describe both ways.
Use the XmeTraitGet function to determine if a specified widget holds a certain trait. This function returns NULL if the specified widget does not hold the trait, and a non- NULL value (a trait record) if the widget does hold the trait. For example, a parent widget can use the following code to determine if its child widget holds the XmQTaccessTextual trait:
if ( XmeTraitGet((XtPointer)a_widget_class, XmQTaccessTextual)) /* Yes, a_widget_class renders a primary text block. */ else /* a_widget_class does not render a primary text block. */
If a widget does hold a trait, the XmeTraitGet function returns a pointer to the appropriate trait structure variable. Another widget can use this returned pointer to call trait methods. For example, suppose that a parent of ExmString needs to determine the preferred string format of ExmString. The following code from the parent does just that:
XmAccessTextualTrait childs_trait_record;
int preferred_string_format_of_child;
/* Get a pointer to the trait structure variable. */
childs_trait_record =
(XmQTaccessTextual)
XmeTraitGet((XtPointer)a_widget_class,
XmQTaccessTextual);
/* Use the returned pointer to call the child's
preferred_format trait method. */
preferred_string_format_of_child =
childs_trait_record->preferred_format((Widget)parent_widget);
Note that, in some cases, the widget holding the trait has not defined a particular trait method; that is, the trait method is set to NULL. For that reason, the following code is an improvement over the previous example:
/* Does this trait method exist? */
if (childs_trait_record->preferred_format !=
(XmAccessTextualTraitRec) NULL) {
/* It does exist, so call the trait method. */
preferred_string_format_of_child =
childs_trait_record->preferred_format((Widget)parent_widget);
}