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);
        }