aboutsummaryrefslogtreecommitdiff
path: root/libXt/specs/CH09
diff options
context:
space:
mode:
Diffstat (limited to 'libXt/specs/CH09')
-rw-r--r--libXt/specs/CH093211
1 files changed, 3211 insertions, 0 deletions
diff --git a/libXt/specs/CH09 b/libXt/specs/CH09
new file mode 100644
index 000000000..9538651bc
--- /dev/null
+++ b/libXt/specs/CH09
@@ -0,0 +1,3211 @@
+.\" $Xorg: CH09,v 1.3 2000/08/17 19:42:46 cpqbld Exp $
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994
+.\" X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994
+.\" Digital Equipment Corporation, Maynard, Massachusetts.
+.\"
+.\" Permission to use, copy, modify and distribute this documentation for any
+.\" purpose and without fee is hereby granted, provided that the above copyright
+.\" notice appears in all copies and that both that copyright notice and this
+.\" permission notice appear in supporting documentation, and that the name of
+.\" Digital not be used in in advertising or publicity pertaining
+.\" to distribution of the software without specific, written prior permission.
+.\" Digital makes no representations about the suitability of the
+.\" software described herein for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+\&
+.sp 1
+.ce 3
+\s+1\fBChapter 9\fP\s-1
+
+\s+1\fBResource Management\fP\s-1
+.sp 2
+.nr H1 9
+.nr H2 0
+.nr H3 0
+.nr H4 0
+.nr H5 0
+.LP
+.XS
+Chapter 9 \(em Resource Management
+.XE
+A resource is a field in the widget record with a corresponding
+resource entry in the \fIresources\fP list of the widget or any of its
+superclasses.
+This means that the field is
+settable by
+.PN XtCreateWidget
+(by naming the field in the argument list), by an
+entry in a resource file (by using either the name or class), and by
+.PN XtSetValues .
+In addition, it is readable by
+.PN XtGetValues .
+Not all fields in a widget record are resources.
+Some are for bookkeeping use by the
+generic routines (like \fImanaged\fP and \fIbeing_destroyed\fP).
+Others can be for local bookkeeping,
+and still others are derived from resources
+(many graphics contexts and pixmaps).
+.LP
+Widgets typically need to obtain a large set of resources at widget
+creation time.
+Some of the resources come from the argument list supplied in the call to
+.PN XtCreateWidget ,
+some from the resource database,
+and some from the internal defaults specified by the widget.
+Resources are obtained first from the argument list,
+then from the resource database for all resources not specified
+in the argument list,
+and last, from the internal default, if needed.
+
+.NH 2
+Resource Lists
+.XS
+\*(SN Resource Lists
+.XE
+.LP
+.IN "Resource Management"
+A resource entry specifies a field in the widget,
+the textual name and class of the field that argument lists
+and external resource files use to refer to the field,
+and a default value that the field should get if no value is specified.
+The declaration for the
+.PN XtResource
+structure is
+.LP
+.sM
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ String resource_name;
+ String resource_class;
+ String resource_type;
+ Cardinal resource_size;
+ Cardinal resource_offset;
+ String default_type;
+ XtPointer default_addr;
+} XtResource, *XtResourceList;
+.De
+.IN "XtResourceList"
+.eM
+
+.LP
+When the resource list is specified as the
+.PN CoreClassPart ,
+.PN ObjectClassPart ,
+.PN RectObjClassPart ,
+or
+.PN ConstraintClassPart
+\fIresources\fP field, the strings pointed to by \fIresource_name\fP,
+\fIresource_class\fP, \fIresource_type\fP, and \fIdefault_type\fP must
+be permanently allocated prior to or during the execution of the class
+initialization procedure and must not be subsequently deallocated.
+
+.LP
+The \fIresource_name\fP field contains the name used by clients to access the field
+in the widget.
+By convention, it starts with a lowercase letter
+and is spelled exactly like the field name,
+except all underscores (_) are deleted and the next letter is replaced by its
+uppercase counterpart.
+For example, the resource name for background_pixel becomes backgroundPixel.
+Resource names beginning with the two-character
+sequence ``xt'', and resource classes beginning with the two-character
+sequence ``Xt'' are reserved to the \*(xI for future standard and
+implementation-dependent uses.
+Widget header files typically contain a symbolic name for each resource name.
+All resource names, classes, and types used by the \*(xI are named in
+.Pn < X11/StringDefs.h >.
+The \*(xI's symbolic resource names begin with
+``XtN''
+and are followed by the string name (for example, XtNbackgroundPixel
+for backgroundPixel).
+
+.LP
+The \fIresource_class\fP field contains the class string used in resource
+specification files to identify the field.
+A resource class provides two functions:
+.IP \(bu 5
+It isolates an application from different representations that widgets
+can use for a similar resource.
+.IP \(bu 5
+It lets you specify values for several actual resources with a single name.
+A resource class should be chosen to span a group of closely related fields.
+.LP
+For example,
+a widget can have several pixel resources: background, foreground,
+border, block cursor, pointer cursor, and so on.
+Typically, the background defaults to white
+and everything else to black.
+The resource class for each of these resources in the resource list
+should be chosen so that it takes the minimal number of entries
+in the resource database to make the background ivory
+and everything else darkblue.
+.LP
+In this case, the background pixel should have a resource class of
+``Background''
+and all the other pixel entries a resource class of
+``Foreground''.
+Then, the resource file needs only two lines to
+change all pixels to ivory or darkblue:
+.LP
+.Ds 5
+.TA .5i 1.5i
+.ta .5i 1.5i
+*Background: ivory
+*Foreground: darkblue
+.De
+.LP
+Similarly, a widget may have several font resources (such as normal and bold),
+but all fonts should have the class Font.
+Thus, changing all fonts simply requires only a single line in the
+default resource file:
+.LP
+.Ds 5
+.TA .5i 3i
+.ta .5i 3i
+*Font: 6x13
+.De
+.LP
+By convention,
+resource classes are always spelled starting with a capital letter
+to distinguish them from resource names.
+Their symbolic names are preceded with
+``XtC''
+(for example, XtCBackground).
+.LP
+The \fIresource_type\fP field gives the physical representation type of the resource
+and also encodes information about the specific usage of the field.
+By convention, it starts with an uppercase letter and is
+spelled identically to the type name of the field.
+The resource type is used when resources are fetched to
+convert from the resource database format (usually
+.PN String )
+or the format of the resource default value
+(almost anything, but often
+.PN String )
+to the desired
+physical representation (see Section 9.6).
+The \*(xI define the following resource types:
+.TS H
+lw(2.5i) lw(2.5i).
+_
+.sp 6p
+Resource Type Structure or Field Type
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+T{
+.PN XtRAcceleratorTable
+T} XtAccelerators
+T{
+.PN XtRAtom
+T} Atom
+T{
+.PN XtRBitmap
+T} Pixmap, depth=1
+T{
+.PN XtRBoolean
+T} Boolean
+T{
+.PN XtRBool
+T} Bool
+T{
+.PN XtRCallback
+T} XtCallbackList
+T{
+.PN XtRCardinal
+T} Cardinal
+T{
+.PN XtRColor
+T} XColor
+T{
+.PN XtRColormap
+T} Colormap
+T{
+.PN XtRCommandArgArray
+T} String*
+T{
+.PN XtRCursor
+T} Cursor
+T{
+.PN XtRDimension
+T} Dimension
+T{
+.PN XtRDirectoryString
+T} String
+T{
+.PN XtRDisplay
+T} Display*
+T{
+.PN XtREnum
+T} XtEnum
+T{
+.PN XtREnvironmentArray
+T} String*
+T{
+.PN XtRFile
+T} FILE*
+T{
+.PN XtRFloat
+T} float
+T{
+.PN XtRFont
+T} Font
+T{
+.PN XtRFontSet
+T} XFontSet
+T{
+.PN XtRFontStruct
+T} XFontStruct*
+T{
+.PN XtRFunction
+T} (*)()
+T{
+.PN XtRGeometry
+T} T{
+char*, format as defined by
+.PN XParseGeometry
+T}
+T{
+.PN XtRGravity
+T} int
+T{
+.PN XtRInitialState
+T} int
+T{
+.PN XtRInt
+T} int
+T{
+.PN XtRLongBoolean
+T} long
+T{
+.PN XtRObject
+T} Object
+T{
+.PN XtRPixel
+T} Pixel
+T{
+.PN XtRPixmap
+T} Pixmap
+T{
+.PN XtRPointer
+T} XtPointer
+T{
+.PN XtRPosition
+T} Position
+T{
+.PN XtRRestartStyle
+T} unsigned char
+T{
+.PN XtRScreen
+T} Screen*
+T{
+.PN XtRShort
+T} short
+T{
+.PN XtRSmcConn
+T} XtPointer
+T{
+.PN XtRString
+T} String
+T{
+.PN XtRStringArray
+T} String*
+T{
+.PN XtRStringTable
+T} String*
+T{
+.PN XtRTranslationTable
+T} XtTranslations
+T{
+.PN XtRUnsignedChar
+T} unsigned char
+T{
+.PN XtRVisual
+T} Visual*
+T{
+.PN XtRWidget
+T} Widget
+T{
+.PN XtRWidgetClass
+T} WidgetClass
+T{
+.PN XtRWidgetList
+T} WidgetList
+T{
+.PN XtRWindow
+T} Window
+.sp 6p
+_
+.TE
+.sp
+.LP
+.Pn < X11/StringDefs.h >
+also defines the following resource types as a
+convenience for widgets, although they do not have any corresponding
+data type assigned:
+.PN XtREditMode ,
+.PN XtRJustify ,
+and
+.PN XtROrientation .
+.LP
+The \fIresource_size\fP field is the size of the physical representation in bytes;
+you should specify it as
+.PN sizeof (\fItype\fP)
+so that the
+compiler fills in the value.
+The \fIresource_offset\fP field is the offset in bytes of the field
+within the widget.
+You should use the
+.PN XtOffsetOf
+macro to retrieve this value.
+The \fIdefault_type\fP field is the representation type of the default
+resource value.
+If \fIdefault_type\fP is different from \fIresource_type\fP and the default value
+is needed,
+the resource manager invokes a conversion procedure from \fIdefault_type\fP
+to \fIresource_type\fP.
+Whenever possible,
+the default type should be identical to the resource type in order
+to minimize widget creation time.
+However, there are sometimes no values of the type that the program
+can easily specify.
+In this case,
+it should be a value for which the converter is guaranteed to work (for example,
+.PN XtDefaultForeground
+for a pixel resource).
+The \fIdefault_addr\fP field specifies the address of the default resource value.
+As a special case, if \fIdefault_type\fP is
+.PN XtRString ,
+then the value in the \fIdefault_addr\fP field is the pointer to
+the string rather than a pointer to the pointer.
+The default is used if a resource is not specified in the argument list
+or in the resource database or if the conversion from the representation
+type stored in the resource database fails,
+which can happen for various reasons (for example, a misspelled entry in a
+resource file).
+.LP
+Two special representation types
+(XtRImmediate
+and
+XtRCallProc)
+are usable only as default resource types.
+XtRImmediate
+indicates that the value in the \fIdefault_addr\fP field is the actual value of
+the resource rather than the address of the value.
+The value must be in the correct representation type for the resource,
+coerced to an
+.PN XtPointer .
+No conversion is possible, since there is no source representation type.
+XtRCallProc
+indicates that the value in the \fIdefault_addr\fP field is a procedure
+pointer.
+This procedure is automatically invoked with the widget,
+\fIresource_offset\fP, and a pointer to an
+.PN XrmValue
+in which to store the result.
+XtRCallProc
+procedure pointers are of type
+.PN XtResourceDefaultProc .
+.LP
+.sM
+.FD 0
+typedef void (*XtResourceDefaultProc)(Widget, int, XrmValue*);
+.br
+ Widget \fIw\fP;
+.br
+ int \fIoffset\fP;
+.br
+ XrmValue *\fIvalue\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the widget whose resource value is to be obtained.
+.IP \fIoffset\fP 1i
+Specifies the offset of the field in the widget record.
+.IP \fIvalue\fP 1i
+Specifies the resource value descriptor to return.
+.LP
+.eM
+The
+.PN XtResourceDefaultProc
+procedure should fill in the \fIvalue->addr\fP field with a pointer
+to the resource value in its correct representation type.
+.sp
+.LP
+To get the resource list structure for a particular class, use
+.PN XtGetResourceList .
+.LP
+.IN "XtGetResourceList" "" "@DEF@"
+.sM
+.FD 0
+void XtGetResourceList(\fIclass\fP, \fIresources_return\fP, \fInum_resources_return\fP);
+.br
+ WidgetClass \fIclass\fP;
+.br
+ XtResourceList *\fIresources_return\fP;
+.br
+ Cardinal *\fInum_resources_return\fP;
+.FN
+.IP \fIclass\fP 1.5i
+Specifies the object class to be queried. It must be
+.PN objectClass
+or any subclass thereof.
+.IP \fIresources_return\fP 1.5i
+Returns the resource list.
+.IP \fInum_resources_return\fP 1.5i
+Returns the number of entries in the resource list.
+.LP
+.eM
+If
+.PN XtGetResourceList
+is called before the class is initialized,
+it returns the resource list as specified in the class record.
+If it is called after the class has been initialized,
+.PN XtGetResourceList
+returns a merged resource list that includes the resources
+for all superclasses.
+The list returned by
+.PN XtGetResourceList
+should be freed using
+.PN XtFree
+when it is no longer needed.
+.sp
+.LP
+To get the constraint resource list structure for a particular widget
+class, use
+.PN XtGetConstraintResourceList .
+.LP
+.IN "XtGetConstraintResourceList" "" "@DEF@"
+.sM
+.FD 0
+void XtGetConstraintResourceList(\fIclass\fP, \fIresources_return\fP, \
+\fInum_resources_return\fP)
+.br
+ WidgetClass \fIclass\fP;
+.br
+ XtResourceList *\fIresources_return\fP;
+.br
+ Cardinal *\fInum_resources_return\fP;
+.FN
+.IP \fIclass\fP 1.5i
+Specifies the object class to be queried. It must be
+.PN objectClass
+or any subclass thereof.
+.IP \fIresources_return\fP 1.5i
+Returns the constraint resource list.
+.IP \fInum_resources_return\fP 1.5i
+Returns the number of entries in the constraint resource list.
+.LP
+.eM
+If
+.PN XtGetConstraintResourceList
+is called before the widget class is
+initialized, the resource list as specified in the widget
+class Constraint part is returned. If
+.PN XtGetConstraintResourceList
+is called after the widget class has been initialized, the merged
+resource list for the class and all Constraint superclasses is
+returned. If the
+specified class is not a subclass of
+.PN constraintWidgetClass ,
+*\fIresources_return\fP is set to NULL
+and *\fInum_resources_return\fP is set to zero.
+The list returned by
+.PN XtGetConstraintResourceList
+should be freed using
+.PN XtFree
+when it is no longer needed.
+.sp
+.LP
+The routines
+.PN XtSetValues
+and
+.PN XtGetValues
+also use the resource list to set and get widget state;
+see Sections 9.7.1 and 9.7.2.
+.LP
+Here is an abbreviated version of a possible resource list for a Label widget:
+.LP
+.Ds
+.TA .5i 1.5i 3i
+.ta .5i 1.5i 3i
+/* Resources specific to Label */
+static XtResource resources[] = {
+{XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
+ XtOffsetOf(LabelRec, label.foreground), XtRString, XtDefaultForeground},
+{XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct*),
+ XtOffsetOf(LabelRec, label.font), XtRString, XtDefaultFont},
+{XtNlabel, XtCLabel, XtRString, sizeof(String),
+ XtOffsetOf(LabelRec, label.label), XtRString, NULL},
+ .
+ .
+ .
+}
+.De
+.LP
+The complete resource name for a field of a widget instance is the
+concatenation of the application shell name (from
+.PN XtAppCreateShell ),
+the instance names of all the widget's parents up to the
+top of the widget tree,
+the instance name of the widget itself,
+and the resource name of the specified field of the widget.
+Similarly,
+the full resource class of a field of a widget instance is the
+concatenation of the application class (from
+.PN XtAppCreateShell ),
+the widget class names of all the widget's parents up to the
+top of the widget tree,
+the widget class name of the widget itself,
+and the resource class of the specified field of the widget.
+
+.NH 2
+Byte Offset Calculations
+.XS
+\*(SN Byte Offset Calculations
+.XE
+.LP
+To determine the byte offset of a field within a structure type, use
+.PN XtOffsetOf .
+.LP
+.IN "XtOffsetOf" "" "@DEF@"
+.sM
+.FD 0
+Cardinal XtOffsetOf(\fIstructure_type\fP, \fIfield_name\fP)
+.br
+ \fIType structure_type\fP;
+.br
+ \fIField field_name\fP;
+.FN
+.IP \fIstructure_type\fP 1i
+Specifies a type that is declared as a structure.
+.IP \fIfield_name\fP 1i
+Specifies the name of a member within the structure.
+.LP
+.eM
+The
+.PN XtOffsetOf
+macro expands to a constant expression that gives the
+offset in bytes to the specified structure member from the beginning
+of the structure. It is normally used to statically initialize
+resource lists and is more portable than
+.PN XtOffset ,
+which serves the same function.
+
+.LP
+To determine the byte offset of a field within a structure pointer type, use
+.PN XtOffset .
+.LP
+.IN "XtOffset" "" "@DEF@"
+.sM
+.FD 0
+Cardinal XtOffset(\fIpointer_type\fP, \fIfield_name\fP)
+.br
+ \fIType pointer_type\fP;
+.br
+ \fIField field_name\fP;
+.FN
+.IP \fIpointer_type\fP 1i
+Specifies a type that is declared as a pointer to a structure.
+.IP \fIfield_name\fP 1i
+Specifies the name of a member within the structure.
+.LP
+.eM
+The
+.PN XtOffset
+macro expands to a constant expression that gives the
+offset in bytes to the specified structure member from the beginning
+of the structure. It may be used to statically initialize
+resource lists.
+.PN XtOffset
+is less portable than
+.PN XtOffsetOf .
+
+.NH 2
+Superclass-to-Subclass Chaining of Resource Lists
+.XS
+\*(SN Superclass-to-Subclass Chaining of Resource Lists
+.XE
+.LP
+.IN "Inheritance"
+.IN "Superclass Chaining"
+.IN "Chaining"
+The
+.PN XtCreateWidget
+function gets resources as a superclass-to-subclass chained operation.
+That is, the resources specified in the
+.PN objectClass
+resource list are fetched,
+then those in
+.PN rectObjClass ,
+and so on down to the resources specified
+for this widget's class. Within a class, resources are fetched in the order
+they are declared.
+.LP
+In general, if a widget resource field is declared in a superclass,
+that field is included in the superclass's resource list and need not be
+included in the subclass's resource list.
+For example, the
+Core
+class contains a resource entry for \fIbackground_pixel\fP.
+Consequently,
+the implementation of Label need not also have a resource entry
+for \fIbackground_pixel\fP.
+However, a subclass,
+by specifying a resource entry for that field in its own resource list,
+can override the resource entry for any field declared in a superclass.
+This is most often done to override the defaults provided in the
+superclass with new ones.
+At class initialization time,
+resource lists for that class are scanned from the superclass down
+to the class to look for resources with the same offset.
+A matching resource in a subclass will be reordered to override
+the superclass entry.
+If reordering is necessary, a copy of the superclass resource list is made to
+avoid affecting other subclasses of the superclass.
+.LP
+.IN "class_initialize procedure"
+.IN "Widget" "class initialization"
+Also at class initialization time, the \*(xI produce an
+internal representation of the resource list to optimize access time
+when creating widgets. In order to save memory, the \*(xI may
+overwrite the storage allocated for the resource list in the class
+record; therefore, widgets must allocate resource lists in writable
+storage and must not access the list contents directly after the
+class_initialize procedure has returned.
+
+.NH 2
+Subresources
+.XS
+\*(SN Subresources
+.XE
+.LP
+A widget does not do anything to retrieve its own resources;
+instead,
+.PN XtCreateWidget
+does this automatically before calling the class initialize procedure.
+.LP
+Some widgets have subparts that are not widgets but for which the widget
+would like to fetch resources.
+Such widgets call
+.PN XtGetSubresources
+to accomplish this.
+.LP
+.IN "XtGetSubresources" "" "@DEF@"
+.sM
+.FD 0
+void XtGetSubresources(\fIw\fP, \fIbase\fP, \fIname\fP, \fIclass\fP, \
+\fIresources\fP, \fInum_resources\fP, \fIargs\fP, \fInum_args\fP)
+.br
+ Widget \fIw\fP;
+.br
+ XtPointer \fIbase\fP;
+.br
+ String \fIname\fP;
+.br
+ String \fIclass\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal \fInum_args\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the object used to qualify the subpart resource name and
+class. \*(oI
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure into which the
+resources will be written.
+.IP \fIname\fP 1i
+Specifies the name of the subpart.
+.IP \fIclass\fP 1i
+Specifies the class of the subpart.
+.IP \fIresources\fP 1i
+Specifies the resource list for the subpart.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP \fIargs\fP 1i
+Specifies the argument list to override any other resource specifications.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The
+.PN XtGetSubresources
+function constructs a name and class list from the application name and class,
+the names and classes of all the object's ancestors, and the object itself.
+Then it appends to this list the \fIname\fP and \fIclass\fP pair passed in.
+The resources are fetched from the argument list, the resource database,
+or the default values in the resource list.
+Then they are copied into the subpart record.
+If \fIargs\fP is NULL,
+\fInum_args\fP must be zero.
+However, if \fInum_args\fP is zero,
+the argument list is not referenced.
+.LP
+.PN XtGetSubresources
+may overwrite the specified resource list with an
+equivalent representation in an internal format, which optimizes access
+time if the list is used repeatedly. The resource list must be
+allocated in writable storage, and the caller must not modify the list
+contents after the call if the same list is to be used again.
+Resources fetched by
+.PN XtGetSubresources
+are reference-counted as
+if they were referenced by the specified object. Subresources might
+therefore be freed from the conversion cache and destroyed
+when the object is destroyed, but not before then.
+.sp
+.LP
+To fetch resources for widget subparts using varargs lists, use
+.PN XtVaGetSubresources .
+.LP
+.IN "XtVaGetSubresources" "" "@DEF@"
+.sM
+.FD 0
+void XtVaGetSubresources(\fIw\fP, \fIbase\fP, \fIname\fP, \fIclass\fP, \
+\fIresources\fP, \fInum_resources\fP, ...)
+.br
+ Widget \fIw\fP;
+.br
+ XtPointer \fIbase\fP;
+.br
+ String \fIname\fP;
+.br
+ String \fIclass\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the object used to qualify the subpart resource name and
+class. \*(oI
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure into which the
+resources will be written.
+.IP \fIname\fP 1i
+Specifies the name of the subpart.
+.IP \fIclass\fP 1i
+Specifies the class of the subpart.
+.IP \fIresources\fP 1i
+Specifies the resource list for the subpart.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP ... 1i
+Specifies the variable argument list to override any other
+resource specifications.
+.LP
+.eM
+.PN XtVaGetSubresources
+is identical in function to
+.PN XtGetSubresources
+with the \fIargs\fP and \fInum_args\fP parameters replaced by a varargs list, as
+described in Section 2.5.1.
+
+.NH 2
+Obtaining Application Resources
+.XS
+\fB\*(SN Obtaining Application Resources\fP
+.XE
+.LP
+To retrieve resources that are not specific to a widget
+but apply to the overall application, use
+.PN XtGetApplicationResources .
+.LP
+.IN "XtGetApplicationResources" "" "@DEF@"
+.sM
+.FD 0
+void XtGetApplicationResources(\fIw\fP, \fIbase\fP, \fIresources\fP, \
+\fInum_resources\fP, \fIargs\fP, \fInum_args\fP)
+.br
+ Widget \fIw\fP;
+.br
+ XtPointer \fIbase\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal \fInum_args\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the object that identifies the resource database to search
+(the database is that associated with the display for this object). \*(oI
+.IP \fIbase\fP 1i
+Specifies the base address into which
+the resource values will be written.
+.IP \fIresources\fP 1i
+Specifies the resource list.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP \fIargs\fP 1i
+Specifies the argument list to override any other resource specifications.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The
+.PN XtGetApplicationResources
+function first uses the passed object,
+which is usually an application shell widget,
+to construct a resource name and class list.
+The full name and class of the specified object (that is, including its
+ancestors, if any) is logically added to the
+front of each resource name and class.
+Then it retrieves the resources from the argument list,
+the resource database, or the resource list default values.
+After adding base to each address,
+.PN XtGetApplicationResources
+copies the resources into the addresses
+obtained by adding \fIbase\fP to each \fIoffset\fP in the resource list.
+If \fIargs\fP is NULL,
+\fInum_args\fP must be zero.
+However, if \fInum_args\fP is zero,
+the argument list is not referenced.
+The portable way to specify application resources is to declare them
+as members of a structure and pass the address of the structure
+as the \fIbase\fP argument.
+.LP
+.PN XtGetApplicationResources
+may overwrite the specified resource list
+with an equivalent representation in an internal format, which
+optimizes access time if the list is used repeatedly. The resource
+list must be allocated in writable storage, and the caller must not
+modify the list contents after the call if the same list is to be
+used again. Any per-display resources fetched by
+.PN XtGetApplicationResources
+will not be freed from the resource cache until the display is closed.
+.sp
+.LP
+To retrieve resources for the overall application using varargs lists, use
+.PN XtVaGetApplicationResources .
+.LP
+.IN "XtVaGetApplicationResources" "" "@DEF@"
+.sM
+.FD 0
+void XtVaGetApplicationResources(\fIw\fP, \fIbase\fP, \fIresources\fP, \
+\fInum_resources\fP, ...)
+.br
+ Widget \fIw\fP;
+.br
+ XtPointer \fIbase\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the object that identifies the resource database to search
+(the database is that associated with the display for this object). \*(oI
+.IP \fIbase\fP 1i
+Specifies the base address into which
+the resource values will be written.
+.IP \fIresources\fP 1i
+Specifies the resource list for the subpart.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP ... 1i
+Specifies the variable argument list to override any other
+resource specifications.
+.LP
+.eM
+.PN XtVaGetApplicationResources
+is identical in function to
+.PN XtGetApplicationResources
+with the \fIargs\fP and \fInum_args\fP parameters
+replaced by a varargs list, as described in Section 2.5.1.
+
+.NH 2
+Resource Conversions
+.XS
+\*(SN Resource Conversions
+.XE
+.LP
+The \*(xI provide a mechanism for registering representation converters that
+are automatically invoked by the resource-fetching routines.
+The \*(xI additionally provide and register several commonly used converters.
+This resource conversion mechanism serves several purposes:
+.IP \(bu 5
+It permits user and application resource files to contain textual
+representations of nontextual values.
+.IP \(bu 5
+It allows textual or other representations of default resource values that
+are dependent on the display, screen, or colormap, and thus must be
+computed at runtime.
+.IP \(bu 5
+It caches conversion source and result data.
+Conversions that require much computation or space
+(for example, string-to-translation-table)
+or that require round-trips to the server
+(for example, string-to-font or string-to-color) are performed only once.
+
+.NH 3
+Predefined Resource Converters
+.XS
+\*(SN Predefined Resource Converters
+.XE
+.LP
+The \*(xI define all the representations used in the
+Object,
+RectObj,
+Core,
+Composite,
+Constraint,
+and
+Shell
+widget classes.
+The \*(xI register the following resource converters that accept
+input values of representation type
+.PN XtRString .
+.LP
+.TS
+lw(1.7i) lw(2.4i) lw(1.5i) .
+_
+.sp 6p
+Target Representation Converter Name Additional Args
+.sp 6p
+_
+.sp 6p
+T{
+.PN XtRAcceleratorTable
+T} T{
+.PN XtCvtStringToAcceleratorTable
+T}
+T{
+.PN XtRAtom
+T} T{
+.PN XtCvtStringToAtom
+T} Display*
+T{
+.PN XtRBoolean
+T} T{
+.PN XtCvtStringToBoolean
+T}
+T{
+.PN XtRBool
+T} T{
+.PN XtCvtStringToBool
+T}
+T{
+.PN XtRCommandArgArray
+T} T{
+.PN XtCvtStringToCommandArgArray
+T}
+T{
+.PN XtRCursor
+T} T{
+.PN XtCvtStringToCursor
+T} Display*
+T{
+.PN XtRDimension
+T} T{
+.PN XtCvtStringToDimension
+T}
+T{
+.PN XtRDirectoryString
+T} T{
+.PN XtCvtStringToDirectoryString
+T}
+T{
+.PN XtRDisplay
+T} T{
+.PN XtCvtStringToDisplay
+T}
+T{
+.PN XtRFile
+T} T{
+.PN XtCvtStringToFile
+T}
+T{
+.PN XtRFloat
+T} T{
+.PN XtCvtStringToFloat
+T}
+T{
+.PN XtRFont
+T} T{
+.PN XtCvtStringToFont
+T} Display*
+T{
+.PN XtRFontSet
+T} T{
+.PN XtCvtStringToFontSet
+T} Display*, String \fIlocale\fP
+T{
+.PN XtRFontStruct
+T} T{
+.PN XtCvtStringToFontStruct
+T} Display*
+T{
+.PN XtRGravity
+T} T{
+.PN XtCvtStringToGravity
+T}
+T{
+.PN XtRInitialState
+T} T{
+.PN XtCvtStringToInitialState
+T}
+T{
+.PN XtRInt
+T} T{
+.PN XtCvtStringToInt
+T}
+T{
+.PN XtRPixel
+T} T{
+.PN XtCvtStringToPixel
+T} T{
+.PN colorConvertArgs
+T}
+T{
+.PN XtRPosition
+T} T{
+.PN XtCvtStringToPosition
+T}
+T{
+.PN XtRRestartStyle
+T} T{
+.PN XtCvtStringToRestartStyle
+T}
+T{
+.PN XtRShort
+T} T{
+.PN XtCvtStringToShort
+T}
+T{
+.PN XtRTranslationTable
+T} T{
+.PN XtCvtStringToTranslationTable
+T}
+T{
+.PN XtRUnsignedChar
+T} T{
+.PN XtCvtStringToUnsignedChar
+T}
+T{
+.PN XtRVisual
+T} T{
+.PN XtCvtStringToVisual
+T} Screen*, Cardinal \fIdepth\fP
+.sp 6p
+_
+.TE
+
+.LP
+The String-to-Pixel conversion has two predefined constants that are
+guaranteed to work and contrast with each other:
+.PN XtDefaultForeground
+and
+.PN XtDefaultBackground .
+.IN "XtDefaultBackground" "" "@DEF@"
+.IN "XtDefaultForeground" "" "@DEF@"
+They evaluate to the black and white pixel values of the widget's screen,
+respectively.
+.IN "Resources" "reverseVideo"
+If the application resource reverseVideo is
+.PN True ,
+they evaluate to the white and black pixel values of the widget's screen,
+respectively.
+Similarly, the String-to-Font and String-to-FontStruct converters recognize
+the constant
+.PN XtDefaultFont
+.IN "XtDefaultFont" "" "@DEF@"
+.IN "Resources" "xtDefaultFont"
+and evaluate this in the following manner:
+.IP \(bu 5
+Query the resource database for the resource whose full name
+is ``xtDefaultFont'', class ``XtDefaultFont'' (that is, no widget
+name/class prefixes), and use a type
+.PN XtRString
+value returned as the font name or a type
+.PN XtRFont
+or
+.PN XtRFontStruct
+value directly as the resource value.
+.IP \(bu 5
+If the resource database does not contain a value for xtDefaultFont,
+class XtDefaultFont, or if the returned font name cannot be
+successfully opened, an implementation-defined font in ISO8859-1
+character set encoding is opened. (One possible algorithm is to
+perform an
+.PN XListFonts
+using a wildcard font name and use the first
+font in the list. This wildcard font name should be as broad as
+possible to maximize the probability of locating a useable font;
+for example, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-1".)
+.IP \(bu 5
+If no suitable ISO8859-1 font can be found, issue a warning message
+and return
+.PN False .
+.LP
+The String-to-FontSet converter recognizes the constant
+.PN XtDefaultFontSet
+.IN "XtDefaultFontSet" "" "@DEF@"
+.IN "Resources" "xtDefaultFontSet"
+and evaluate this in the following manner:
+.IP \(bu 5
+Query the resource database for the resource whose full name
+is ``xtDefaultFontSet'', class ``XtDefaultFontSet'' (that is, no widget
+name/class prefixes), and use a type
+.PN XtRString
+value returned as the base font name list or a type
+.PN XtRFontSet
+value directly as the resource value.
+.IP \(bu 5
+If the resource database does not contain a value for xtDefaultFontSet,
+class XtDefaultFontSet, or if a font set cannot be
+successfully created from this resource,
+an implementation-defined font set is created.
+(One possible algorithm is to
+perform an
+.PN XCreateFontSet
+using a wildcard base font name.
+This wildcard base font name should be as broad as
+possible to maximize the probability of locating a useable font;
+for example, "-*-*-*-R-*-*-*-120-*-*-*-*".)
+.IP \(bu 5
+If no suitable font set can be created, issue a warning message
+and return
+.PN False .
+.LP
+If a font set is created but \fImissing_charset_list\fP is not
+empty, a warning is issued and the partial font set is returned.
+The \*(xI register the String-to-FontSet converter with
+a conversion argument list that extracts the current process
+locale at the time the converter is invoked. This ensures
+that the converter is invoked again if the same conversion
+is required in a different locale.
+.LP
+The String-to-Gravity conversion accepts string values that are the
+names of window and bit gravities and their numerical equivalents,
+as defined in \fI\*(xL\fP:
+.PN ForgetGravity ,
+.PN UnmapGravity ,
+.PN NorthWestGravity ,
+.PN NorthGravity ,
+.PN NorthEastGravity ,
+.PN WestGravity ,
+.PN CenterGravity ,
+.PN EastGravity ,
+.PN SouthWestGravity ,
+.PN SouthGravity ,
+.PN SouthEastGravity ,
+and
+.PN StaticGravity .
+Alphabetic case is not significant in the conversion.
+.LP
+The String-to-CommandArgArray conversion parses a String into an
+array of strings.
+White space characters separate elements of the command line.
+The converter recognizes the backslash character ``\\'' as an escape
+character to allow the following white space character to be part of the
+array element.
+.LP
+.IN "XtCurrentDirectory" "" "@DEF@"
+The String-to-DirectoryString conversion recognizes the
+string ``XtCurrentDirectory'' and returns the result of a call
+to the operating system to get the current directory.
+.LP
+The String-to-RestartStyle conversion accepts the values
+.PN RestartIfRunning ,
+.PN RestartAnyway ,
+.PN RestartImmediately ,
+and
+.PN RestartNever
+as defined by the \fIX Session Management Protocol\fP.
+.LP
+The String-to-InitialState conversion accepts the values
+.PN NormalState
+or
+.PN IconicState
+as defined by the \fI\*(xC\fP.
+.LP
+The String-to-Visual conversion calls
+.PN XMatchVisualInfo
+using the
+\fIscreen\fP and \fIdepth\fP fields from the core part and returns the first
+matching Visual on the list. The widget resource list must be certain
+to specify any resource of type
+.PN XtRVisual
+after the depth resource.
+The allowed string values are the visual class names defined in \fI\*(xP\fP,
+Section 8;
+.PN StaticGray ,
+.PN StaticColor ,
+.PN TrueColor ,
+.PN GrayScale ,
+.PN PseudoColor ,
+and
+.PN DirectColor .
+
+.LP
+The \*(xI register the following resource converter that accepts
+an input value of representation type
+.PN XtRColor .
+.LP
+.TS
+lw(1.5i) lw(2.25i) lw(1.5i) .
+_
+.sp 6p
+Target Representation Converter Name Additional Args
+.sp 6p
+_
+.sp 6p
+T{
+.PN XtRPixel
+T} T{
+.PN XtCvtColorToPixel
+T}
+.sp 6p
+_
+.TE
+
+.LP
+The \*(xI register the following resource converters that accept
+input values of representation type
+.PN XtRInt .
+.LP
+.TS
+lw(1.5i) lw(2.25i) lw(1.5i) .
+_
+.sp 6p
+Target Representation Converter Name Additional Args
+.sp 6p
+_
+.sp 6p
+T{
+.PN XtRBoolean
+T} T{
+.PN XtCvtIntToBoolean
+T}
+T{
+.PN XtRBool
+T} T{
+.PN XtCvtIntToBool
+T}
+T{
+.PN XtRColor
+T} T{
+.PN XtCvtIntToColor
+T} T{
+.PN colorConvertArgs
+T}
+T{
+.PN XtRDimension
+T} T{
+.PN XtCvtIntToDimension
+T}
+T{
+.PN XtRFloat
+T} T{
+.PN XtCvtIntToFloat
+T}
+T{
+.PN XtRFont
+T} T{
+.PN XtCvtIntToFont
+T}
+T{
+.PN XtRPixel
+T} T{
+.PN XtCvtIntToPixel
+T}
+T{
+.PN XtRPixmap
+T} T{
+.PN XtCvtIntToPixmap
+T}
+T{
+.PN XtRPosition
+T} T{
+.PN XtCvtIntToPosition
+T}
+T{
+.PN XtRShort
+T} T{
+.PN XtCvtIntToShort
+T}
+T{
+.PN XtRUnsignedChar
+T} T{
+.PN XtCvtIntToUnsignedChar
+T}
+.sp 6p
+_
+.TE
+
+.LP
+The \*(xI register the following resource converter that accepts
+an input value of representation type
+.PN XtRPixel .
+.LP
+.TS
+lw(1.5i) lw(2.25i) lw(1.5i) .
+_
+.sp 6p
+Target Representation Converter Name Additional Args
+.sp 6p
+_
+.sp 6p
+T{
+.PN XtRColor
+T} T{
+.PN XtCvtPixelToColor
+T}
+.sp 6p
+_
+.TE
+
+.NH 3
+New Resource Converters
+.XS
+\*(SN New Resource Converters
+.XE
+.LP
+Type converters use pointers to
+.PN XrmValue
+structures (defined in
+.Pn < X11/Xresource.h >;
+see Section 15.4 in \fI\*(xL\fP)
+for input and output values.
+.LP
+.sM
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ unsigned int size;
+ XPointer addr;
+} XrmValue, *XrmValuePtr;
+.De
+.LP
+.eM
+The \fIaddr\fP field specifies the address of the data, and the \fIsize\fP
+field gives the total number of significant bytes in the data.
+For values of type
+.PN String ,
+\fIaddr\fP is the address of the first character and \fIsize\fP
+includes the NULL-terminating byte.
+.LP
+A resource converter procedure pointer is of type
+.PN XtTypeConverter .
+.LP
+.IN "XtTypeConverter" "" "@DEF@"
+.sM
+.FD 0
+typedef Boolean (*XtTypeConverter)(Display*, XrmValue*, Cardinal*,
+ XrmValue*, XrmValue*, XtPointer*);
+.br
+ Display *\fIdisplay\fP;
+.br
+ XrmValue *\fIargs\fP;
+.br
+ Cardinal *\fInum_args\fP;
+.br
+ XrmValue *\fIfrom\fP;
+.br
+ XrmValue *\fIto\fP;
+.br
+ XtPointer *\fIconverter_data\fP;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the display connection with which this conversion is associated.
+.IP \fIargs\fP 1i
+Specifies a list of additional
+.PN XrmValue
+arguments to the converter if additional context is needed
+to perform the conversion, or NULL.
+For example, the String-to-Font converter needs the widget's \fIdisplay\fP,
+and the String-to-Pixel converter needs the widget's \fIscreen\fP and \fIcolormap\fP.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in \fIargs\fP.
+.IP \fIfrom\fP 1i
+Specifies the value to convert.
+.IP \fIto\fP 1i
+Specifies a descriptor for a location into which to store the converted value.
+.IP \fIconverter_data\fP 1i
+Specifies a location into which the converter may
+store converter-specific data associated
+with this conversion.
+.LP
+.eM
+The \fIdisplay\fP argument is normally used only when generating error
+messages, to identify the application context (with the function
+.PN XtDisplayToApplicationContext ).
+.LP
+The \fIto\fP argument specifies the size and location into which the
+converter should store the converted value. If the \fIaddr\fP field is NULL,
+the converter should allocate appropriate storage and store the size
+and location into the \fIto\fP descriptor. If the type converter allocates
+the storage, it remains under the ownership of the converter and must
+not be modified by the caller. The type converter is permitted to use
+static storage for this purpose, and therefore the caller must
+immediately copy the data upon return from the converter. If the
+\fIaddr\fP field is not NULL, the converter must check the \fIsize\fP field to
+ensure that sufficient space has been allocated before storing the
+converted value. If insufficient space is specified, the converter
+should update the \fIsize\fP field with the number of bytes required and
+return
+.PN False
+without modifying the data at the specified location.
+If sufficient space was allocated by the caller, the converter should
+update the \fIsize\fP field with the number of bytes actually occupied by the
+converted value. For converted values of type
+.PN XtRString ,
+the size should
+include the NULL-terminating byte, if any.
+The converter may store any value in the location specified
+in \fIconverter_data\fP; this value will be passed to the destructor, if any,
+when the resource is freed by the \*(xI.
+.LP
+The converter must return
+.PN True
+if the conversion was successful and
+.PN False
+otherwise. If the conversion cannot be performed because of an
+improper source value, a warning message should also be issued with
+.PN XtAppWarningMsg .
+
+.LP
+Most type converters just take the data described by the specified \fIfrom\fP
+argument and return data by writing into the location specified in
+the \fIto\fP argument.
+A few need other information, which is available in \fIargs\fP.
+A type converter can invoke another type converter,
+which allows differing sources that may convert into a common intermediate
+result to make maximum use of the type converter cache.
+.LP
+Note that if an address is written into \fIto->addr\fP, it cannot be that
+of a local variable of the converter because the data will not be
+valid after the converter returns. Static variables may be used,
+as in the following example.
+If the converter modifies the resource database,
+the changes affect any in-progress widget creation,
+.PN XtGetApplicationResources ,
+or
+.PN XtGetSubresources
+in an implementation-defined manner; however, insertion of new entries
+or changes to existing entries is allowed and will not directly cause
+an error.
+
+.LP
+The following is an example of a converter that takes a
+.PN string
+and converts it to a
+.PN Pixel .
+Note that the \fIdisplay\fP parameter is
+used only to generate error messages; the
+.PN Screen
+conversion argument is
+still required to inform the \*(xI that the converted value is
+a function of the particular display (and colormap).
+.LP
+.Ds 0
+.TA .3i .7i 1i 1.3i 1.7i 2i 4i
+.ta .3i .7i 1i 1.3i 1.7i 2i 4i
+
+#define done(type, value) \\
+ { \\
+ if (toVal->addr != NULL) { \\
+ if (toVal->size < sizeof(type)) { \\
+ toVal->size = sizeof(type); \\
+ return False; \\
+ } \\
+ *(type*)(toVal->addr) = (value); \\
+ } \\
+ else { \\
+ static type static_val; \\
+ static_val = (value); \\
+ toVal->addr = (XPointer)&static_val; \\
+ } \\
+ toVal->size = sizeof(type); \\
+ return True; \\
+ }
+
+static Boolean CvtStringToPixel(dpy, args, num_args, fromVal, toVal, converter_data)
+ Display *dpy;
+ XrmValue *args;
+ Cardinal *num_args;
+ XrmValue *fromVal;
+ XrmValue *toVal;
+ XtPointer *converter_data;
+{
+ static XColor screenColor;
+ XColor exactColor;
+ Screen *screen;
+ Colormap colormap;
+ Status status;
+
+ if (*num_args != 2)
+ XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+ "wrongParameters", "cvtStringToPixel", "XtToolkitError",
+ "String to pixel conversion needs screen and colormap arguments",
+ (String *)NULL, (Cardinal *)NULL);
+
+ screen = *((Screen**) args[0].addr);
+ colormap = *((Colormap *) args[1].addr);
+
+ if (CompareISOLatin1(str, XtDefaultBackground) == 0) {
+ *closure_ret = False;
+ done(Pixel, WhitePixelOfScreen(screen));
+ }
+ if (CompareISOLatin1(str, XtDefaultForeground) == 0) {
+ *closure_ret = False;
+ done(Pixel, BlackPixelOfScreen(screen));
+ }
+
+
+ status = XAllocNamedColor(DisplayOfScreen(screen), colormap, (char*)fromVal->addr,
+ &screenColor, &exactColor);
+
+ if (status == 0) {
+ String params[1];
+ Cardinal num_params = 1;
+ params[0] = (String)fromVal->addr;
+ XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+ "noColormap", "cvtStringToPixel", "XtToolkitError",
+ "Cannot allocate colormap entry for \\"%s\\"", params,\
+ &num_params);
+ *converter_data = (char *) False;
+ return False;
+ } else {
+ *converter_data = (char *) True;
+ done(Pixel, &screenColor.pixel);
+ }
+}
+.De
+.LP
+All type converters should define some set of conversion values for which they
+are guaranteed to succeed so these can be used in the resource defaults.
+This issue arises only with conversions, such as fonts and colors,
+where there is no string representation that all server implementations
+will necessarily recognize.
+For resources like these,
+the converter should define a symbolic constant
+in the same manner as
+.PN XtDefaultForeground ,
+.PN XtDefaultBackground ,
+and
+.PN XtDefaultFont .
+.sp
+.LP
+To allow the \*(xI to deallocate resources produced by type
+converters, a resource destructor procedure may also be provided.
+.LP
+A resource destructor procedure pointer is of type
+.PN XtDestructor .
+.LP
+.IN "XtDestructor" "" "@DEF@"
+.sM
+.FD 0
+typedef void (*XtDestructor) (XtAppContext, XrmValue*, XtPointer, XrmValue*, \
+Cardinal*);
+.br
+ XtAppContext \fIapp\fP;
+.br
+ XrmValue *\fIto\fP;
+.br
+ XtPointer \fIconverter_data\fP;
+.br
+ XrmValue *\fIargs\fP;
+.br
+ Cardinal *\fInum_args\fP;
+.FN
+.IP \fIapp\fP 1i
+Specifies an application context in which the resource is being freed.
+.IP \fIto\fP 1i
+Specifies a descriptor for the resource produced by the type converter.
+.IP \fIconverter_data\fP 1i
+Specifies the converter-specific data returned by the type converter.
+.IP \fIargs\fP 1i
+Specifies the additional converter arguments as passed
+to the type converter when the conversion was performed.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in \fIargs\fP.
+.LP
+.eM
+The destructor procedure is responsible for freeing the resource
+specified by the \fIto\fP argument, including any auxiliary storage
+associated with that resource, but not the memory directly addressed
+by the size and location in the \fIto\fP argument or the memory specified
+by \fIargs\fP.
+
+.NH 3
+Issuing Conversion Warnings
+.XS
+\*(SN Issuing Conversion Warnings
+.XE
+.LP
+The
+.PN XtDisplayStringConversionWarning
+procedure is a convenience routine for resource type converters
+that convert from string values.
+.LP
+.IN "XtDisplayStringConversionWarning" "" "@DEF@"
+.sM
+.FD 0
+void XtDisplayStringConversionWarning(\fIdisplay\fP, \fIfrom_value\fP, \
+\fIto_type\fP)
+.br
+ Display *\fIdisplay\fP;
+.br
+ String \fIfrom_value\fP, \fIto_type\fP;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the display connection with which the conversion is associated.
+.IP \fIfrom_value\fP 1i
+Specifies the string that could not be converted.
+.IP \fIto_type\fP 1i
+Specifies the target representation type requested.
+.LP
+.eM
+The
+.PN XtDisplayStringConversionWarning
+procedure issues a warning message using
+.PN XtAppWarningMsg
+with \fIname\fP ``conversionError'',
+\fItype\fP ``string'', \fIclass\fP ``XtToolkitError'', and the default message
+``Cannot convert "\fIfrom_value\fP" to type \fIto_type\fP''.
+.LP
+To issue other types of warning or error messages, the type converter
+should use
+.PN XtAppWarningMsg
+or
+.PN XtAppErrorMsg .
+.sp
+.LP
+To retrieve the application context associated with a given
+display connection, use
+.PN XtDisplayToApplicationContext .
+.LP
+.IN "XtDisplayToApplicationContext" "" "@DEF@"
+.sM
+.FD 0
+XtAppContext XtDisplayToApplicationContext( \fIdisplay\fP )
+.br
+ Display *\fIdisplay\fP;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies an open and initialized display connection.
+.LP
+.eM
+The
+.PN XtDisplayToApplicationContext
+function returns the application
+context in which the specified \fIdisplay\fP was initialized. If the
+display is not known to the \*(xI, an error message is issued.
+
+.NH 3
+Registering a New Resource Converter
+.XS
+\fB\*(SN Registering a New Resource Converter\fP
+.XE
+.LP
+When registering a resource converter, the client must specify the
+manner in which the conversion cache is to be used when there are multiple
+calls to the converter. Conversion cache control is specified
+via an
+.PN XtCacheType
+.LP
+.IN "XtCacheType" "" "@DEF@"
+argument.
+.sM
+.Ds 0
+typedef int XtCacheType;
+.De
+.LP
+.eM
+An
+.PN XtCacheType
+field may contain one of the following values:
+.br
+.sp
+.LP
+.PN XtCacheNone
+.IN "XtCacheNone" "" "@DEF@"
+.IP
+Specifies that the results of a previous conversion
+may not be reused to satisfy any other resource
+requests; the specified converter will be called
+each time the converted value is required.
+.br
+.sp
+.LP
+.PN XtCacheAll
+.IN "XtCacheAll" "" "@DEF@"
+.IP
+Specifies that the results of a previous conversion
+should be reused for any resource request that depends
+upon the same source value and conversion arguments.
+.br
+.sp
+.LP
+.PN XtCacheByDisplay
+.IN "XtCacheByDisplay" "" "@DEF@"
+.IP
+Specifies that the results of a previous conversion
+should be used as for
+.PN XtCacheAll
+but the destructor will be called, if specified, if
+.PN XtCloseDisplay
+is called
+for the display connection associated with the converted value, and
+the value will be removed from the conversion cache.
+.LP
+The qualifier
+.PN XtCacheRefCount
+.IN "XtCacheRefCount" "" "@DEF@"
+may be ORed with any of the above values. If
+.PN XtCacheRefCount
+is specified, calls to
+.PN XtCreateWidget ,
+.PN XtCreateManagedWidget ,
+.PN XtGetApplicationResources ,
+and
+.PN XtGetSubresources
+that use the converted value will be counted. When a widget using the
+converted value is destroyed, the count is decremented, and, if the
+count reaches zero, the destructor procedure will be called and the
+converted value will be removed from the conversion cache.
+
+.LP
+To register a type converter for all application contexts in a
+process, use
+.PN XtSetTypeConverter ,
+and to register a type converter in a single application context, use
+.PN XtAppSetTypeConverter .
+.LP
+.IN "XtSetTypeConverter" "" "@DEF@"
+.sM
+.FD 0
+void XtSetTypeConverter(\fIfrom_type\fP, \fIto_type\fP, \fIconverter\fP, \
+\fIconvert_args\fP, \fInum_args\fP,
+ \fIcache_type\fP, \fIdestructor\fP)
+.br
+ String \fIfrom_type\fP;
+.br
+ String \fIto_type\fP;
+.br
+ XtTypeConverter \fIconverter\fP;
+.br
+ XtConvertArgList \fIconvert_args\fP;
+.br
+ Cardinal \fInum_args\fP;
+.br
+ XtCacheType \fIcache_type\fP;
+.br
+ XtDestructor \fIdestructor\fP;
+.FN
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.IP \fIconverter\fP 1i
+Specifies the resource type converter procedure.
+.IP \fIconvert_args\fP 1i
+Specifies additional conversion arguments, or NULL.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in \fIconvert_args\fP.
+.IP \fIcache_type\fP 1i
+Specifies whether or not resources produced by this
+converter are sharable or display-specific and when
+they should be freed.
+.IP \fIdestructor\fP 1i
+Specifies a destroy procedure for resources produced by
+this conversion, or NULL if no additional action is
+required to deallocate resources produced by the converter.
+.LP
+.IN "XtAppSetTypeConverter" "" "@DEF@"
+.FD 0
+void XtAppSetTypeConverter(\fIapp_context\fP, \fIfrom_type\fP, \fIto_type\fP, \
+\fIconverter\fP, \fIconvert_args\fP,
+ \fInum_args\fP, \fIcache_type\fP, \fIdestructor\fP)
+.br
+ XtAppContext \fIapp_context\fP;
+.br
+ String \fIfrom_type\fP;
+.br
+ String \fIto_type\fP;
+.br
+ XtTypeConverter \fIconverter\fP;
+.br
+ XtConvertArgList \fIconvert_args\fP;
+.br
+ Cardinal \fInum_args\fP;
+.br
+ XtCacheType \fIcache_type\fP;
+.br
+ XtDestructor \fIdestructor\fP;
+.FN
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.IP \fIconverter\fP 1i
+Specifies the resource type converter procedure.
+.IP \fIconvert_args\fP 1i
+Specifies additional conversion arguments, or NULL.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in \fIconvert_args\fP.
+.IP \fIcache_type\fP 1i
+Specifies whether or not resources produced by this
+converter are sharable or display-specific and when
+they should be freed.
+.IP \fIdestructor\fP 1i
+Specifies a destroy procedure for resources produced by
+this conversion, or NULL if no additional action is
+required to deallocate resources produced by the converter.
+.LP
+.eM
+.PN XtSetTypeConverter
+registers the specified type converter and
+destructor in all application contexts created by the calling process,
+including any future application contexts that may be created.
+.PN XtAppSetTypeConverter
+registers the specified type converter in the
+single application context specified. If the same \fIfrom_type\fP and
+\fIto_type\fP are specified in multiple calls to either function, the most
+recent overrides the previous ones.
+.sp
+.LP
+For the few type converters that need additional arguments,
+the \*(xI conversion mechanism provides a method of specifying
+how these arguments should be computed.
+The enumerated type
+.PN XtAddressMode
+and the structure
+.PN XtConvertArgRec
+specify how each argument is derived.
+These are defined in
+.Pn < X11/Intrinsic.h >.
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef enum {
+ /* address mode parameter representation */
+ XtAddress, /* address */
+ XtBaseOffset, /* offset */
+ XtImmediate, /* constant */
+ XtResourceString, /* resource name string */
+ XtResourceQuark, /* resource name quark */
+ XtWidgetBaseOffset, /* offset */
+ XtProcedureArg /* procedure to call */
+} XtAddressMode;
+.sp
+typedef struct {
+ XtAddressMode address_mode;
+ XtPointer address_id;
+ Cardinal size;
+} XtConvertArgRec, *XtConvertArgList;
+.De
+.eM
+.LP
+The \fIsize\fP field specifies the length of the data in bytes.
+The \fIaddress_mode\fP field specifies how the \fIaddress_id\fP field should be
+interpreted.
+.PN XtAddress
+.IN "XtAddress" "" "@DEF@"
+causes \fIaddress_id\fP to be interpreted as the address of the data.
+.PN XtBaseOffset
+.IN "XtBaseOffset" "" "@DEF@"
+causes \fIaddress_id\fP to be interpreted as the offset from the widget base.
+.PN XtImmediate
+.IN "XtImmediate" "" "@DEF@"
+causes \fIaddress_id\fP to be interpreted as a constant.
+.PN XtResourceString
+.IN "XtResourceString" "" "@DEF@"
+causes \fIaddress_id\fP to be interpreted as the name of a resource
+that is to be converted into an offset from the widget base.
+.PN XtResourceQuark
+.IN "XtResourceQuark" "" "@DEF@"
+causes \fIaddress_id\fP to be interpreted as the result of an
+.PN XrmStringToQuark
+conversion on the name of a resource,
+which is to be converted into an offset from the widget base.
+.PN XtWidgetBaseOffset
+.IN "XtWidgetBaseOffset" "" "@DEF@"
+is similar to
+.PN XtBaseOffset
+except that it
+searches for the closest windowed ancestor if the object is not
+of a subclass of
+Core
+(see Chapter 12).
+.PN XtProcedureArg
+.IN "XtProcedureArg" "" "@DEF@"
+specifies that \fIaddress_id\fP is a pointer to a procedure to
+be invoked to return the conversion argument. If
+.PN XtProcedureArg
+is specified, \fIaddress_id\fP must contain
+the address of a function of type
+.PN XtConvertArgProc .
+.LP
+.IN "XtConvertArgProc" "" "@DEF@"
+.sM
+.FD 0
+typedef void (*XtConvertArgProc)(Widget, Cardinal*, XrmValue*);
+.br
+ Widget \fIobject\fP;
+.br
+ Cardinal *\fIsize\fP;
+.br
+ XrmValue *\fIvalue\fP;
+.FN
+.IP \fIobject\fP 1i
+Passes the object for which the resource is being
+converted, or NULL if the converter was invoked by
+.PN XtCallConverter
+or
+.PN XtDirectConvert .
+.IP \fIsize\fP 1i
+Passes a pointer to the \fIsize\fP field from the
+.PN XtConvertArgRec .
+.IP \fIvalue\fP 1i
+Passes a pointer to a descriptor into which the procedure
+must store the conversion argument.
+.LP
+.eM
+When invoked, the
+.PN XtConvertArgProc
+procedure must derive a conversion
+argument and store the address and size of the argument in the location
+pointed to by \fIvalue\fP.
+.LP
+In order to permit reentrancy, the
+.PN XtConvertArgProc
+should return the address of storage whose lifetime is no shorter than the
+lifetime of \fIobject\fP. If \fIobject\fP is NULL, the lifetime of the conversion
+argument must be no shorter than the lifetime of the resource with
+which the conversion argument is associated. The \*(xI do not
+guarantee to copy this storage but do guarantee not to reference it if
+the resource is removed from the conversion cache.
+.LP
+The following example illustrates how to register the CvtStringToPixel
+routine given earlier:
+.LP
+.Ds
+.TA .2i 3i
+.ta .2i 3i
+static XtConvertArgRec colorConvertArgs[] = {
+ {XtWidgetBaseOffset, (XtPointer)XtOffset(Widget, core.screen), sizeof(Screen*)},
+ {XtWidgetBaseOffset, (XtPointer)XtOffset(Widget, core.colormap),sizeof(Colormap)}
+};
+
+XtSetTypeConverter(XtRString, XtRPixel, CvtStringToPixel,
+ colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay, NULL);
+.De
+.LP
+The conversion argument descriptors
+.PN colorConvertArgs
+and
+.PN screenConvertArg
+are predefined by the \*(xI. Both take the
+values from the closest windowed ancestor if the object is not of a
+subclass of
+Core.
+The
+.PN screenConvertArg
+descriptor puts the widget's \fIscreen\fP field into \fIargs\fP[0]. The
+.PN colorConvertArgs
+descriptor puts the widget's \fIscreen\fP field into \fIargs\fP[0],
+and the widget's \fIcolormap\fP field into \fIargs\fP[1].
+.LP
+Conversion routines should not just put a descriptor for the address of the
+base of the widget into \fIargs\fP[0], and use that in the routine.
+They should pass in the actual values on which the conversion depends.
+By keeping the dependencies of the conversion procedure specific,
+it is more likely that subsequent conversions will find what they need
+in the conversion cache.
+This way the cache is smaller and has fewer and more widely applicable entries.
+.LP
+If any conversion arguments of type
+.PN XtBaseOffset ,
+.PN XtResourceString ,
+.PN XtResourceQuark ,
+and
+.PN XtWidgetBaseOffset
+are specified for conversions performed by
+.PN XtGetApplicationResources ,
+.PN XtGetSubresources ,
+.PN XtVaGetApplicationResources ,
+or
+.PN XtVaGetSubresources ,
+the arguments are
+computed with respect to the specified widget, not the base address or
+resource list specified in the call.
+.LP
+If the
+.PN XtConvertArgProc
+modifies the resource database,
+the changes affect any in-progress widget creation,
+.PN XtGetApplicationResources ,
+or
+.PN XtGetSubresources
+in an implementation-defined manner; however, insertion of new entries
+or changes to existing entries are allowed and will not directly cause
+an error.
+
+.NH 3
+Resource Converter Invocation
+.XS
+\fB\*(SN Resource Converter Invocation\fP
+.XE
+.LP
+All resource-fetching routines (for example,
+.PN XtGetSubresources ,
+.PN XtGetApplicationResources ,
+and so on) call resource converters if the resource database or
+varargs list specifies a value
+that has a different representation from the desired representation or if the
+widget's default resource value representation is different from the desired
+representation.
+.sp
+.LP
+To invoke explicit resource conversions, use
+.PN XtConvertAndStore
+or
+.PN XtCallConverter .
+.LP
+.sM
+.Ds 0
+typedef XtPointer XtCacheRef;
+.De
+.IN "XtCallConverter" "" "@DEF@"
+.FD 0
+Boolean XtCallConverter(\fIdisplay\fP, \fIconverter\fP, \
+\fIconversion_args\fP, \fInum_args\fP, \fIfrom\fP, \fIto_in_out\fP,
+ \fIcache_ref_return\fP)
+.br
+ Display* \fIdisplay\fP;
+.br
+ XtTypeConverter \fIconverter\fP;
+.br
+ XrmValuePtr \fIconversion_args\fP;
+.br
+ Cardinal \fInum_args\fP;
+.br
+ XrmValuePtr \fIfrom\fP;
+.br
+ XrmValuePtr \fIto_in_out\fP;
+.br
+ XtCacheRef *\fIcache_ref_return\fP;
+.FN
+.IP \fIdisplay\fP 1.5i
+Specifies the display with which the conversion is to be associated.
+.IP \fIconverter\fP 1.5i
+Specifies the conversion procedure to be called.
+.IP \fIconversion_args\fP 1.5i
+Specifies the additional conversion arguments needed
+to perform the conversion, or NULL.
+.IP \fInum_args\fP 1.5i
+Specifies the number of entries in \fIconversion_args\fP.
+.IP \fIfrom\fP 1.5i
+Specifies a descriptor for the source value.
+.IP \fIto_in_out\fP 1.5i
+Returns the converted value.
+.IP \fIcache_ref_return\fP 1.5i
+Returns a conversion cache id.
+.LP
+.eM
+The
+.PN XtCallConverter
+function looks up the
+specified type converter in the application context associated with
+the display and, if the converter was not registered or was registered
+with cache type
+.PN XtCacheAll
+or
+.PN XtCacheByDisplay ,
+looks in the conversion cache to see if this conversion procedure
+has been called with the specified conversion arguments. If so, it
+checks the success status of the prior call, and if
+the conversion failed,
+.PN XtCallConverter
+returns
+.PN False
+immediately;
+otherwise it checks the size specified in the \fIto\fP argument, and, if it is
+greater than or equal to the size stored in the cache, copies the
+information stored in the cache into the location specified by
+\fIto->addr\fP, stores the cache size into \fIto->size\fP, and returns
+.PN True .
+If the size specified in the \fIto\fP argument is smaller than the size stored
+in the cache,
+.PN XtCallConverter
+copies the cache size into \fIto->size\fP and returns
+.PN False .
+If the converter was registered with cache type
+.PN XtCacheNone
+or no value was found in the conversion cache,
+.PN XtCallConverter
+calls the converter, and if it was not registered with cache type
+.PN XtCacheNone ,
+enters the result in the cache.
+.PN XtCallConverter
+then returns what the converter returned.
+.LP
+The \fIcache_ref_return\fP field specifies storage allocated by the caller in which
+an opaque value will be stored. If the type converter has been
+registered with the
+.PN XtCacheRefCount
+modifier and if the value returned
+in \fIcache_ref_return\fP is non-NULL, then the caller should store the
+\fIcache_ref_return\fP value in order to decrement the reference count when
+the converted value is no longer required. The \fIcache_ref_return\fP
+argument should be
+NULL if the caller is unwilling or unable to store the
+value.
+.sp
+.LP
+To explicitly decrement the reference counts for resources obtained
+from
+.PN XtCallConverter ,
+use
+.PN XtAppReleaseCacheRefs .
+.LP
+.IN "XtAppReleaseCacheRefs" "" "@DEF@"
+.sM
+.FD 0
+void XtAppReleaseCacheRefs(\fIapp_context\fP, \fIrefs\fP)
+.br
+ XtAppContext \fIapp_context\fP;
+.br
+ XtCacheRef *\fIrefs\fP;
+.FN
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIrefs\fP 1i
+Specifies the list of cache references to be released.
+.LP
+.eM
+.PN XtAppReleaseCacheRefs
+decrements the reference count for the
+conversion entries identified by the \fIrefs\fP argument.
+This argument is a
+pointer to a NULL-terminated list of
+.PN XtCacheRef
+values. If any reference
+count reaches zero, the destructor, if any, will be called and
+the resource removed from the conversion cache.
+.sp
+.LP
+As a convenience to clients needing to explicitly decrement reference
+counts via a callback function, the \*(xI define two callback
+procedures,
+.PN XtCallbackReleaseCacheRef
+and
+.PN XtCallbackReleaseCacheRefList .
+.LP
+.IN "XtCallbackReleaseCacheRef" "" "@DEF@"
+.sM
+.FD 0
+void XtCallbackReleaseCacheRef(\fIobject\fP, \fIclient_data\fP, \fIcall_data\fP)
+.br
+ Widget \fIobject\fP;
+.br
+ XtPointer \fIclient_data\fP;
+.br
+ XtPointer \fIcall_data\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object with which the resource is associated.
+.IP \fIclient_data\fP 1i
+Specifies the conversion cache entry to be released.
+.IP \fIcall_data\fP 1i
+Is ignored.
+.LP
+.eM
+This callback procedure may be added to a callback list to release a
+previously returned
+.PN XtCacheRef
+value. When adding the callback, the
+callback \fIclient_data\fP argument must be specified as the value of the
+.PN XtCacheRef
+data cast to type
+.PN XtPointer .
+.LP
+.IN "XtCallbackReleaseCacheRefList" "" "@DEF@"
+.sM
+.FD 0
+void XtCallbackReleaseCacheRefList(\fIobject\fP, \fIclient_data\fP, \fIcall_data\fP)
+.br
+ Widget \fIobject\fP;
+.br
+ XtPointer \fIclient_data\fP;
+.br
+ XtPointer \fIcall_data\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object with which the resources are associated.
+.IP \fIclient_data\fP 1i
+Specifies the conversion cache entries to be released.
+.IP \fIcall_data\fP 1i
+Is ignored.
+.LP
+.eM
+This callback procedure may be added to a callback list to release a
+list of previously returned
+.PN XtCacheRef
+values. When adding the
+callback, the callback \fIclient_data\fP argument must be specified as a
+pointer to a NULL-terminated list of
+.PN XtCacheRef
+values.
+.sp
+.LP
+To lookup and call a resource converter, copy the resulting value,
+and free a cached resource when a widget is destroyed, use
+.PN XtConvertAndStore .
+.LP
+.IN "XtConvertAndStore" "" "@DEF@"
+.sM
+.FD 0
+Boolean XtConvertAndStore(\fIobject\fP, \fIfrom_type\fP, \fIfrom\fP, \
+\fIto_type\fP, \fIto_in_out\fP)
+.br
+ Widget \fIobject\fP;
+.br
+ String \fIfrom_type\fP;
+.br
+ XrmValuePtr \fIfrom\fP;
+.br
+ String \fIto_type\fP;
+.br
+ XrmValuePtr \fIto_in_out\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object to use for additional arguments, if any are needed,
+and the destroy callback list. \*(oI
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fIfrom\fP 1i
+Specifies the value to be converted.
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.IP \fIto_in_out\fP 1i
+Specifies a descriptor for storage into which the converted value
+will be returned.
+.LP
+.eM
+The
+.PN XtConvertAndStore
+function looks up the type converter registered
+to convert \fIfrom_type\fP to \fIto_type\fP, computes any additional arguments
+needed, and then calls
+.PN XtCallConverter
+(or
+.PN XtDirectConvert
+if an old-style converter was registered with
+.PN XtAddConverter
+or
+.PN XtAppAddConverter ;
+see Appendix C) with the \fIfrom\fP and \fIto_in_out\fP arguments. The
+\fIto_in_out\fP argument specifies the size and location into which the
+converted value will be stored and is passed directly to the
+converter. If the location is specified as NULL, it will be replaced
+with a pointer to private storage and the size will be returned in the
+descriptor. The caller is expected to copy this private storage
+immediately and must not modify it in any way. If a non-NULL location
+is specified, the caller must allocate sufficient storage to hold the
+converted value and must also specify the size of that storage in the
+descriptor.
+The \fIsize\fP field will be modified on return to indicate the actual
+size of the converted data.
+If the conversion succeeds,
+.PN XtConvertAndStore
+returns
+.PN True ;
+otherwise, it returns
+.PN False .
+.LP
+.PN XtConvertAndStore
+adds
+.PN XtCallbackReleaseCacheRef
+.IN "destroyCallback"
+to the destroyCallback list of the specified object if the conversion
+returns an
+.PN XtCacheRef
+value. The resulting resource should not be referenced
+after the object has been destroyed.
+.LP
+.PN XtCreateWidget
+performs processing equivalent to
+.PN XtConvertAndStore
+when initializing the object instance. Because there is extra memory
+overhead required to implement reference counting, clients may
+distinguish those objects that are never destroyed before the
+application exits from those that may be destroyed and whose
+resources should be deallocated.
+.LP
+To specify whether reference counting is to be enabled for the
+resources of a particular object when the object is created, the
+client can specify a value for the
+.PN Boolean
+resource
+XtNinitialResourcesPersistent,
+.IN "XtNinitialResourcesPersistent" "" "@DEF@"
+class
+XtCInitialResourcesPersistent.
+.LP
+When
+.PN XtCreateWidget
+is called, if this resource is not specified as
+.PN False
+in either the arglist or the resource database, then the
+resources referenced by this object are not reference-counted, regardless of
+how the type converter may have been registered. The effective
+default value is
+.PN True ;
+thus clients that expect to destroy one or
+more objects and want resources deallocated must explicitly specify
+.PN False
+for
+.IN XtNinitialResourcesPersistent
+XtNinitialResourcesPersistent.
+.LP
+The resources are still freed and destructors called when
+.PN XtCloseDisplay
+is called if the conversion was registered as
+.PN XtCacheByDisplay .
+
+.NH 2
+Reading and Writing Widget State
+.XS
+\fB\*(SN Reading and Writing Widget State\fP
+.XE
+.LP
+Any resource field in a widget can be read or written by a client.
+On a write operation,
+the widget decides what changes it will actually allow and updates all
+derived fields appropriately.
+
+.NH 3
+Obtaining Widget State
+.XS
+\fB\*(SN Obtaining Widget State\fP
+.XE
+.LP
+To retrieve the current values of resources associated with a
+widget instance, use
+.PN XtGetValues .
+.LP
+.IN "XtGetValues" "" "@DEF@"
+.sM
+.FD 0
+void XtGetValues(\fIobject\fP, \fIargs\fP, \fInum_args\fP)
+.br
+ Widget \fIobject\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal \fInum_args\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object whose resource values are to be returned. \*(oI
+.IP \fIargs\fP 1i
+Specifies the argument list of name/address pairs that contain the
+resource names and the addresses into which the resource values are to
+be stored.
+The resource names are widget-dependent.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The
+.PN XtGetValues
+function starts with the resources specified for the Object class
+and proceeds down the subclass chain to the class of the object.
+The \fIvalue\fP field of a passed argument list must contain the
+address into which to copy the contents of the corresponding
+object instance field. If the field is a pointer type, the lifetime
+of the pointed-to data is defined by the object class. For the
+\*(xI-defined resources, the following lifetimes apply:
+.IP \(bu 3
+Not valid following any operation that modifies the resource:
+.RS
+.IP \- 3
+XtNchildren resource of composite widgets.
+.IP \- 3
+All resources of representation type XtRCallback.
+.RE
+.IP \(bu 3
+Remain valid at least until the widget is destroyed:
+.RS
+.IP \- 3
+XtNaccelerators, XtNtranslations.
+.RE
+.IP \(bu 3
+Remain valid until the Display is closed:
+.RS
+.IP \- 3
+XtNscreen.
+.RE
+.LP
+It is the caller's responsibility
+to allocate and deallocate storage for the copied data
+according to the size of the
+resource representation type used within the object.
+.LP
+If the class of the object's parent is a subclass of
+.PN constraintWidgetClass ,
+.PN XtGetValues
+then fetches the values for any constraint resources requested.
+It starts with the constraint resources specified for
+.PN constraintWidgetClass
+and proceeds down the subclass chain to the parent's constraint resources.
+If the argument list contains a resource name that is not found in any of the
+resource lists searched,
+the value at the corresponding address is not modified.
+.IN "get_values_hook procedure"
+If any get_values_hook procedures in the
+object's class or superclass records are non-NULL,
+they are called in superclass-to-subclass order after
+all the resource values have been fetched by
+.PN XtGetValues .
+Finally, if the object's parent is a
+subclass of
+.PN constraintWidgetClass ,
+and if any of the parent's class or
+superclass records have declared
+.PN ConstraintClassExtension
+records in
+the Constraint class part \fIextension\fP field with a record type of
+.PN \s-1NULLQUARK\s+1 ,
+and if the \fIget_values_hook\fP field in the extension record is non-NULL,
+.PN XtGetValues
+calls the get_values_hook procedures in superclass-to-subclass order.
+This permits a Constraint parent to provide
+nonresource data via
+.PN XtGetValues .
+.LP
+Get_values_hook procedures may modify the data stored at the
+location addressed by the \fIvalue\fP field, including (but not
+limited to) making a copy of data whose resource representation is a
+pointer. None of the \*(xI-defined object classes copy
+data in this manner. Any operation that modifies the queried
+object resource may invalidate the pointed-to data.
+
+.sp
+.LP
+To retrieve the current values of resources associated with a widget
+instance using varargs lists, use
+.PN XtVaGetValues .
+.LP
+.IN "XtVaGetValues" "" "@DEF@"
+.sM
+.FD 0
+void XtVaGetValues(\fIobject\fP, ...)
+.br
+ Widget \fIobject\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object whose resource values are to be returned. \*(oI
+.IP ... 1i
+Specifies the variable argument list for the resources to
+be returned.
+.LP
+.eM
+.PN XtVaGetValues
+is identical in function to
+.PN XtGetValues
+with the \fIargs\fP
+and \fInum_args\fP parameters replaced by a varargs list, as described in
+Section 2.5.1. All value entries in the list must specify pointers to
+storage allocated by the caller to which the resource value will be
+copied. It is the caller's responsibility to ensure that sufficient
+storage is allocated. If
+.PN XtVaTypedArg
+is specified, the \fItype\fP argument
+specifies the representation desired by the caller and \fIthe\fP size argument
+specifies the number of bytes allocated to store the result of the
+conversion. If the size is insufficient, a warning message is issued
+and the list entry is skipped.
+
+.NH 4
+Widget Subpart Resource Data: The get_values_hook Procedure
+.XS
+\*(SN Widget Subpart Resource Data: The get_values_hook Procedure
+.XE
+.LP
+Widgets that have subparts can return resource values from them through
+.PN XtGetValues
+by supplying a get_values_hook procedure.
+The get_values_hook procedure pointer is of type
+.PN XtArgsProc .
+.LP
+.IN "get_values_hook procedure" "" "@DEF@"
+.sM
+.FD 0
+typedef void (*XtArgsProc)(Widget, ArgList, Cardinal*);
+.br
+ Widget \fIw\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal *\fInum_args\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the widget whose subpart resource values are to be retrieved.
+.IP \fIargs\fP 1i
+Specifies the argument list that was passed to
+.PN XtGetValues
+or the transformed varargs list passed to
+.PN XtVaGetValues .
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The widget with subpart resources should call
+.PN XtGetSubvalues
+in the get_values_hook procedure
+and pass in its subresource list and the \fIargs\fP and \fInum_args\fP parameters.
+
+.NH 4
+Widget Subpart State
+.XS
+\*(SN Widget Subpart State
+.XE
+.LP
+To retrieve the current values of subpart resource data associated with a
+widget instance, use
+.PN XtGetSubvalues .
+For a discussion of subpart resources,
+see Section 9.4.
+.LP
+.IN "XtGetSubvalues" "" "@DEF@"
+.sM
+.FD 0
+void XtGetSubvalues(\fIbase\fP, \fIresources\fP, \fInum_resources\fP, \
+\fIargs\fP, \fInum_args\fP)
+.br
+ XtPointer \fIbase\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal \fInum_args\fP;
+.FN
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure for which the
+resources should be retrieved.
+.IP \fIresources\fP 1i
+Specifies the subpart resource list.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP \fIargs\fP 1i
+Specifies the argument list of name/address pairs that contain the
+resource names and the addresses into which the resource values are to
+be stored.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The
+.PN XtGetSubvalues
+function obtains resource values from the structure identified by \fIbase\fP.
+The \fIvalue\fP field in each argument entry must contain the address into
+which to store the corresponding resource value. It is the caller's
+responsibility to allocate and deallocate this storage according to
+the size of the resource representation type used within the subpart.
+If the argument list contains a resource name that is not found in the
+resource list, the value at the corresponding address is not modified.
+
+.sp
+.LP
+To retrieve the current values of subpart resources associated with
+a widget instance using varargs lists, use
+.PN XtVaGetSubvalues .
+.LP
+.IN "XtVaGetSubvalues" "" "@DEF@"
+.sM
+.FD 0
+void XtVaGetSubvalues(\fIbase\fP, \fIresources\fP, \fInum_resources\fP, ...)
+.br
+ XtPointer \fIbase\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.FN
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure for which the
+resources should be retrieved.
+.IP \fIresources\fP 1i
+Specifies the subpart resource list.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP ... 1i
+Specifies a variable argument list of name/address pairs that
+contain the resource names and the addresses into which the resource
+values are to be stored.
+.LP
+.eM
+.PN XtVaGetSubvalues
+is identical in function to
+.PN XtGetSubvalues
+with the
+\fIargs\fP and \fInum_args\fP parameters replaced by a varargs list, as described
+in Section 2.5.1.
+.PN XtVaTypedArg
+is not supported for
+.PN XtVaGetSubvalues .
+If
+.PN XtVaTypedArg
+is specified in the list, a warning message is issued
+and the entry is then ignored.
+
+.NH 3
+Setting Widget State
+.XS
+\fB\*(SN Setting Widget State\fP
+.XE
+.LP
+To modify the current values of resources associated with a widget
+instance, use
+.PN XtSetValues .
+.LP
+.IN "XtSetValues" "" "@DEF@"
+.sM
+.FD 0
+void XtSetValues(\fIobject\fP, \fIargs\fP, \fInum_args\fP)
+.br
+ Widget \fIobject\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal \fInum_args\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object whose resources are to be modified. \*(oI
+.IP \fIargs\fP 1i
+Specifies the argument list of name/value pairs that contain the
+resources to be modified and their new values.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The
+.PN XtSetValues
+function starts with the resources specified for the
+Object
+class fields and proceeds down the subclass chain to the object.
+At each stage, it replaces the \fIobject\fP resource fields with any values
+specified in the argument list.
+.PN XtSetValues
+then calls the set_values procedures for the object in superclass-to-subclass
+order.
+.IN "set_values_hook procedure"
+If the object has any non-NULL \fIset_values_hook\fP fields,
+these are called immediately after the
+corresponding set_values procedure.
+This procedure permits subclasses to set subpart data via
+.PN XtSetValues .
+.LP
+If the class of the object's parent is a subclass of
+.PN constraintWidgetClass ,
+.PN XtSetValues
+also updates the object's constraints.
+It starts with the constraint resources specified for
+.PN constraintWidgetClass
+and proceeds down the subclass chain to the parent's class.
+At each stage, it replaces the constraint resource fields with any
+values specified in the argument list.
+It then calls the constraint set_values procedures from
+.PN constraintWidgetClass
+down to the parent's class.
+The constraint set_values procedures are called with widget arguments,
+as for all set_values procedures, not just the constraint records,
+so that they can make adjustments to the desired values based
+on full information about the widget. Any arguments specified that
+do not match a resource list entry are silently ignored.
+.LP
+If the object is of a subclass of
+RectObj,
+.PN XtSetValues
+determines if a geometry request is needed by comparing the old object to
+the new object.
+If any geometry changes are required,
+.PN XtSetValues
+restores the original geometry and makes the request on behalf of the widget.
+If the geometry manager returns
+.PN XtGeometryYes ,
+.PN XtSetValues
+calls the object's resize procedure.
+If the geometry manager returns
+.PN XtGeometryDone ,
+.PN XtSetValues
+continues, as the object's resize procedure should have been called
+by the geometry manager.
+If the geometry manager returns
+.PN XtGeometryNo ,
+.PN XtSetValues
+ignores the geometry request and continues.
+If the geometry manager returns
+.PN XtGeometryAlmost ,
+.PN XtSetValues
+calls the set_values_almost procedure,
+which determines what should be done.
+.PN XtSetValues
+then repeats this process,
+deciding once more whether the geometry manager should be called.
+.LP
+Finally, if any of the set_values procedures returned
+.PN True ,
+and the widget is realized,
+.PN XtSetValues
+causes the widget's expose procedure to be invoked by calling
+.PN XClearArea
+on the widget's window.
+.sp
+.LP
+To modify the current values of resources associated with a widget
+instance using varargs lists, use
+.PN XtVaSetValues .
+.LP
+.IN "XtVaSetValues" "" "@DEF@"
+.sM
+.FD 0
+void XtVaSetValues(\fIobject\fP, ...)
+.br
+ Widget \fIobject\fP;
+.FN
+.IP \fIobject\fP 1i
+Specifies the object whose resources are to be modified. \*(oI
+.IP ... 1i
+Specifies the variable argument list of name/value pairs that
+contain the resources to be modified and their new values.
+.LP
+.eM
+.PN XtVaSetValues
+is identical in function to
+.PN XtSetValues
+with the \fIargs\fP and \fInum_args\fP parameters replaced by a varargs list, as
+described in Section 2.5.1.
+
+.NH 4
+Widget State: The set_values Procedure
+.XS
+\*(SN Widget State: The set_values Procedure
+.XE
+.LP
+The set_values procedure pointer in a widget class is of type
+.PN XtSetValuesFunc .
+.LP
+.IN "XtSetValuesFunc" "" "@DEF@"
+.IN "set_values procedure" "" "@DEF@"
+.sM
+.FD 0
+typedef Boolean (*XtSetValuesFunc)(Widget, Widget, Widget, ArgList, Cardinal*);
+.br
+ Widget \fIcurrent\fP;
+.br
+ Widget \fIrequest\fP;
+.br
+ Widget \fInew\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal *\fInum_args\fP;
+.FN
+.IP \fIcurrent\fP 1i
+Specifies a copy of the widget as it was before the
+.PN XtSetValues
+call.
+.IP \fIrequest\fP 1i
+Specifies a copy of the widget with all values changed as asked for by the
+.PN XtSetValues
+call before any class set_values procedures have been called.
+.IP \fInew\fP 1i
+Specifies the widget with the new values that are actually allowed.
+.IP \fIargs\fP 1i
+Specifies the argument list passed to
+.PN XtSetValues
+or the transformed argument list passed to
+.PN XtVaSetValues .
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The set_values procedure should recompute any field
+derived from resources that are changed
+(for example, many GCs depend on foreground and background pixels).
+If no recomputation is necessary, and if none of the resources specific to a
+subclass require the window to be redisplayed when their values are changed,
+you can specify NULL for the \fIset_values\fP field in the class record.
+.LP
+Like the initialize procedure,
+set_values mostly deals only with the fields defined in the subclass,
+but it has to resolve conflicts with its superclass,
+especially conflicts over width and height.
+.LP
+Sometimes a subclass may want to overwrite values filled in by its
+superclass.
+In particular, size calculations of a superclass are often
+incorrect for a subclass, and, in this case,
+the subclass must modify or recalculate fields declared
+and computed by its superclass.
+.LP
+As an example,
+a subclass can visually surround its superclass display.
+In this case, the width and height calculated by the superclass set_values
+procedure are too small and need to be incremented by the size of the surround.
+The subclass needs to know if its superclass's size was calculated by the
+superclass or was specified explicitly.
+All widgets must place themselves into whatever size is explicitly given,
+but they should compute a reasonable size if no size is requested.
+How does a subclass know the difference between a specified size
+and a size computed by a superclass?
+.LP
+The \fIrequest\fP and \fInew\fP parameters provide the necessary information.
+The \fIrequest\fP widget is a copy of the widget, updated as originally requested.
+The \fInew\fP widget starts with the values in the request,
+but it has additionally been updated by all superclass set_values
+procedures called so far.
+A subclass set_values procedure can compare these two to resolve
+any potential conflicts.
+The set_values procedure need not refer to the \fIrequest\fP widget
+unless it must resolve conflicts between the \fIcurrent\fP and \fInew\fP widgets.
+Any changes the widget needs to make, including geometry changes,
+should be made in the \fInew\fP widget.
+.LP
+In the above example,
+the subclass with the visual surround can see
+if the \fIwidth\fP and \fIheight\fP in the \fIrequest\fP widget are zero.
+If so,
+it adds its surround size to the \fIwidth\fP and
+\fIheight\fP fields in the \fInew\fP widget.
+If not, it must make do with the size originally specified.
+In this case, zero is a special value defined by the class to permit
+the application to invoke this behavior.
+.LP
+The \fInew\fP widget is the actual widget instance record.
+Therefore,
+the set_values procedure should do all its work on the \fInew\fP widget;
+the \fIrequest\fP widget should never be modified.
+If the set_values procedure needs to call any routines that operate on
+a widget, it should specify \fInew\fP as the widget instance.
+.LP
+Before calling the set_values procedures, the \*(xI modify the
+resources of the \fIrequest\fP widget according to the contents of the arglist;
+if the widget names all its resources in the class resource list, it is
+never necessary to examine the contents of \fIargs\fP.
+.LP
+Finally, the set_values procedure must return a Boolean that indicates whether
+the widget needs to be redisplayed.
+Note that a change in the geometry fields alone does not require
+the set_values procedure to return
+.PN True ;
+the X server will eventually generate an
+.PN Expose
+event, if necessary.
+After calling all the set_values procedures,
+.PN XtSetValues
+forces a redisplay by calling
+.PN XClearArea
+if any of the set_values procedures returned
+.PN True .
+Therefore, a set_values procedure should not try to do its own redisplaying.
+.LP
+Set_values procedures should not do any work in response to changes in
+geometry because
+.PN XtSetValues
+eventually will perform a geometry request, and that request might be denied.
+If the widget actually changes size in response to a
+call to
+.PN XtSetValues ,
+its resize procedure is called.
+Widgets should do any geometry-related work in their resize procedure.
+.LP
+Note that it is permissible to call
+.PN XtSetValues
+before a widget is realized.
+Therefore, the set_values procedure must not assume that the widget is realized.
+
+.NH 4
+Widget State: The set_values_almost Procedure
+.XS
+\*(SN Widget State: The set_values_almost Procedure
+.XE
+.LP
+The set_values_almost procedure pointer in the widget class record is of type
+.PN XtAlmostProc .
+.LP
+.IN "set_values_almost procedure" "" "@DEF@"
+.IN "XtAlmostProc" "" "@DEF@"
+.sM
+.FD 0
+typedef void (*XtAlmostProc)(Widget, Widget, XtWidgetGeometry*, \
+XtWidgetGeometry*);
+.br
+ Widget \fIold\fP;
+.br
+ Widget \fInew\fP;
+.br
+ XtWidgetGeometry *\fIrequest\fP;
+.br
+ XtWidgetGeometry *\fIreply\fP;
+.FN
+.IP \fIold\fP 1i
+Specifies a copy of the object as it was before the
+.PN XtSetValues
+call.
+.IP \fInew\fP 1i
+Specifies the object instance record.
+.IP \fIrequest\fP 1i
+Specifies the original geometry request that was sent to the geometry
+manager that caused
+.PN XtGeometryAlmost
+to be returned.
+.IP \fIreply\fP 1i
+Specifies the compromise geometry that was returned by the geometry
+manager with
+.PN XtGeometryAlmost .
+.LP
+.eM
+Most classes inherit the set_values_almost procedure from their superclass by
+specifying
+.PN XtInheritSetValuesAlmost
+in the class initialization.
+The
+set_values_almost procedure in
+.PN rectObjClass
+accepts the compromise suggested.
+.LP
+The set_values_almost procedure is called when a client tries to set a widget's
+geometry by means of a call to
+.PN XtSetValues
+and the geometry manager cannot
+satisfy the request but instead returns
+.PN XtGeometryNo
+or
+.PN XtGeometryAlmost
+and a compromise geometry.
+The \fInew\fP object is the actual instance record. The \fIx\fP, \fIy\fP,
+\fIwidth\fP, \fIheight\fP,
+and \fIborder_width\fP fields contain the original values as they were
+before the
+.PN XtSetValues
+call, and all other fields contain the new
+values. The \fIrequest\fP parameter contains the new geometry request that
+was made to the parent. The \fIreply\fP parameter contains
+\fIreply->request_mode\fP equal to zero if the parent returned
+.PN XtGeometryNo
+and contains the parent's compromise geometry otherwise. The
+set_values_almost procedure takes the original geometry and the
+compromise geometry and determines if the compromise is
+acceptable or whether
+to try a different compromise.
+It returns its results in the \fIrequest\fP parameter,
+which is then sent back to the geometry manager for another try.
+To accept the compromise, the procedure must copy the contents
+of the \fIreply\fP geometry into the \fIrequest\fP geometry; to attempt an
+alternative geometry, the procedure may modify any part of the \fIrequest\fP
+argument; to terminate the geometry negotiation and retain the
+original geometry, the procedure must set \fIrequest->request_mode\fP to
+zero. The geometry fields of the \fIold\fP and \fInew\fP instances must not be modified
+directly.
+
+.NH 4
+Widget State: The ConstraintClassPart set_values Procedure
+.XS
+\*(SN Widget State: The ConstraintClassPart set_values Procedure
+.XE
+.IN "set_values procedure"
+.LP
+The constraint set_values procedure pointer is of type
+.PN XtSetValuesFunc .
+The values passed to the parent's constraint set_values procedure
+are the same as those passed to the child's class
+set_values procedure.
+A class can specify NULL for the \fIset_values\fP field of the
+.PN ConstraintPart
+if it need not compute anything.
+.LP
+The constraint set_values procedure should recompute any constraint fields
+derived from constraint resources that are changed.
+Furthermore, it may modify other widget fields as appropriate.
+For example, if a constraint for the maximum height of a widget is changed
+to a value smaller than the widget's current height,
+the constraint set_values procedure may reset the \fIheight\fP field in the
+widget.
+
+.NH 4
+Widget Subpart State
+.XS
+\*(SN Widget Subpart State
+.XE
+.LP
+To set the current values of subpart resources associated with a
+widget instance, use
+.PN XtSetSubvalues .
+For a discussion of subpart resources,
+see Section 9.4.
+.LP
+.IN "XtSetSubvalues" "" "@DEF@"
+.sM
+.FD 0
+void XtSetSubvalues(\fIbase\fP, \fIresources\fP, \fInum_resources\fP, \
+\fIargs\fP, \fInum_args\fP)
+.br
+ XtPointer \fIbase\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.br
+ ArgList \fIargs\fP;
+.br
+ Cardinal \fInum_args\fP;
+.FN
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure into which the
+resources should be written.
+.IP \fIresources\fP 1i
+Specifies the subpart resource list.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP \fIargs\fP 1i
+Specifies the argument list of name/value pairs that contain the
+resources to be modified and their new values.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The
+.PN XtSetSubvalues
+function updates the resource fields of the structure identified by
+\fIbase\fP. Any specified arguments that do not match an entry in the
+resource list are silently ignored.
+.sp
+.LP
+To set the current values of subpart resources associated with
+a widget instance using varargs lists, use
+.PN XtVaSetSubvalues .
+.LP
+.IN "XtVaSetSubvalues" "" "@DEF@"
+.sM
+.FD 0
+void XtVaSetSubvalues(\fIbase\fP, \fIresources\fP, \fInum_resources\fP, ...)
+.br
+ XtPointer \fIbase\fP;
+.br
+ XtResourceList \fIresources\fP;
+.br
+ Cardinal \fInum_resources\fP;
+.FN
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure into which the
+resources should be written.
+.IP \fIresources\fP 1i
+Specifies the subpart resource list.
+.IP \fInum_resources\fP 1i
+Specifies the number of entries in the resource list.
+.IP ... 1i
+Specifies the variable argument list of name/value pairs that
+contain the resources to be modified and their new values.
+.LP
+.eM
+.PN XtVaSetSubvalues
+is identical in function to
+.PN XtSetSubvalues
+with the \fIargs\fP and \fInum_args\fP parameters replaced by a varargs list, as
+described in Section 2.5.1.
+.PN XtVaTypedArg
+is not supported for
+.PN XtVaSetSubvalues .
+If an entry containing
+.PN XtVaTypedArg
+is specified in the list, a warning message is issued
+and the entry is ignored.
+
+.NH 4
+Widget Subpart Resource Data: The set_values_hook Procedure
+.XS
+\*(SN Widget Subpart Resource Data: The set_values_hook Procedure
+.XE
+.IN "set_values_hook procedure"
+.NT
+The set_values_hook procedure is obsolete, as the same information
+is now available to the set_values procedure. The procedure has been
+retained for those widgets that used it in versions prior to Release 4.
+.NE
+.LP
+Widgets that have a subpart can set the subpart resource values through
+.PN XtSetValues
+by supplying a set_values_hook procedure.
+The set_values_hook procedure pointer in a widget class is of type
+.PN XtArgsFunc .
+.LP
+.IN "set_values_hook procedure" "" "@DEF@"
+.IN "XtArgsFunc" "" "@DEF@"
+.sM
+.FD 0
+typedef Boolean (*XtArgsFunc)(Widget, Arglist, Cardinal*);
+.br
+ Widget \fIw\fP;
+.br
+ Arglist \fIargs\fP;
+.br
+ Cardinal *\fInum_args\fP;
+.FN
+.IP \fIw\fP 1i
+Specifies the widget whose subpart resource values are to be changed.
+.IP \fIargs\fP 1i
+Specifies the argument list that was passed to
+.PN XtSetValues
+or the transformed varargs list passed to
+.PN XtVaSetValues .
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.LP
+.eM
+The widget with subpart resources may call
+.PN XtSetValues
+from the set_values_hook procedure
+and pass in its subresource list and the
+\fIargs\fP and \fInum_args\fP parameters.
+.bp