diff options
Diffstat (limited to 'libXaw/spec/CH2')
-rw-r--r-- | libXaw/spec/CH2 | 1103 |
1 files changed, 1103 insertions, 0 deletions
diff --git a/libXaw/spec/CH2 b/libXaw/spec/CH2 new file mode 100644 index 000000000..9e6c17a8a --- /dev/null +++ b/libXaw/spec/CH2 @@ -0,0 +1,1103 @@ +.\" $Xorg: CH2,v 1.3 2000/08/17 19:42:26 cpqbld Exp $ +.bp +\& +.sp 1 +.ce 3 +\s+1\fBChapter 2\fP\s-1 + +\s+1\fBUsing Widgets\fP\s-1 +.sp 2 +.nr H1 2 +.nr H2 0 +.nr H3 0 +.nr H4 0 +.nr H5 0 +.LP +.XS +Chapter 2 \- Using Widgets +.XE +.IN "using widgets" "" "@DEF@" +Widgets serve as the primary tools for building a user interface or +application environment. The Athena widget set consists of primitive +widgets that contain no children (for example, a command button) and +composite widgets which may contain one or more widget children (for +example, a Box widget). +.LP +The remaining chapters explain the widgets that are provided +by the Athena widget set. +These user-interface components serve as an interface for +application programmers who do not want to implement their own widgets. +In addition, they serve as a starting point +for those widget programmers who, using the \*(xI mechanisms, +want to implement alternative application programming interfaces. +.LP +This chapter is a brief introduction to widget programming. The +examples provided use the Athena widgets, though most of the concepts +will apply to all widget sets. Although there are several programming +interfaces to the \*(tk, only one is described here. A full +description of the programming interface is provided in the document +\fI\*(xT\fP. +.NH 2 +Setting the Locale +.LP +.XS + Setting the Locale +.XE +If it is desirable that the application take advantage of +internationalization (i18n), you must establish locale with +.PN XtSetLanguageProc +before \fBXtDisplayInitialize\fP or \fBXtAppInitialize\fP +is called. For full details, please refer to the document +\fI\*(xT\fP, section 2.2. However, the following simplest-case +call is sufficient in many or most applications. +.LP +.IN "internationalization" "" "" +.IN "XtSetLanguageProc" "" "@DEF@" +.IN "locale" "" "" +.Ds +.TA .5i 2i +.ta .5i 2i + XtSetLanguageProc(NULL, NULL, NULL); +.De +.LP +Most notably, this will affect the Standard C locale, determine which +resource files will be loaded, and what fonts will be required of FontSet +specifications. In many cases, the addition of this line is the only source change +required to internationalize Xaw programs, and will not disturb the function +of programs in the default "C" locale. +.NH 2 +Initializing the Toolkit +.LP +.XS + Initializing the Toolkit +.XE +You must call a toolkit initialization function before invoking any +other toolkit routines (besides locale setting, above). +.PN XtAppInitialize +opens the X server connection, parses the command line, +and creates an initial widget that will serve as the root of +a tree of widgets created by this application. +.IN "initialization" "" "@DEF@" +.IN "toolkit initialization" "" "@DEF@" +.IN "XtAppInitialize" "" "@DEF@" +.IN "fallback resources" "" "@DEF@" +.FD 0 +Widget XtAppInitialize(\fIapp_context_return\fP, \fIapplication_class\fP, \ +\fIoptions\fP, \fInum_options\fP, +.ta 2i + \fIargc_in_out\fP, \fIargv_in_out\fP, \fIfallback_resources\fP, \ +\fIargs\fP, \fInum_args\fP) +.br + XtAppContext *\fIapp_context_return\fP; +.br + String \fIapplication_class\fP; +.br + XrmOptionDescRec \fIoptions\fP[]; +.br + Cardinal \fInum_options\fP; +.br + int *\fIargc_in_out\fP; +.br + String *\fIargv_in_out\fP[]; +.br + String *\fIfallback_resources\fP; +.br + ArgList \fIargs\fP; +.br + Cardinal \fInum_args\fP; +.FN +.IP \fIapp_con_return\fP 1.5i +Returns the application context of this application, if non-NULL. +.IP \fIapplication_class\fP 1.5i +Specifies the class name of this application, +which is usually the generic name for all instances of this application. +A useful convention is to form the class name by capitalizing the +first letter of the application name. For example, the application named +``xman'' has a class name of ``Xman''. +.IP \fIoptions\fP 1.5i +Specifies how to parse the command line for any application-specific +resources. +The options argument is passed as a parameter to +.PN XrmParseCommand . +For further information, +see \fI\*(xL\fP. +.IP \fInum_options\fP 1.5i +Specifies the number of entries in the options list. +.IP \fIargc_in_out\fP 1.5i +Specifies a pointer to the number of command line parameters. +.IP \fIargv_in_out\fP 1.5i +Specifies the command line parameters. +.IP \fIfallback_resources\fP 1.5i +Specifies resource values to be used if the site-wide application class +defaults file cannot be opened, or NULL. +.IP \fIargs\fP 1.5i +Specifies the argument list to use when creating the Application shell. +.IP \fInum_args\fP 1.5i +Specifies the number of arguments in \fIargs\fP. +.LP +This function will remove the command line arguments that the toolkit +reads from \fIargc_in_out\fP, and \fIargv_in_out\fP. It will then +attempt to open the display. If the display cannot be opened, an error +message is issued and XtAppInitialize terminates the application. Once +the display is opened, all resources are read from the locations +specified by the \*(xI. This function returns an ApplicationShell +widget to be used as the root of the application's widget tree. +.NH 2 +Creating a Widget +.LP +.XS + Creating a Widget +.XE +.IN "widget creation" "" "@DEF@" +.IN "creating widgets" "" "@DEF@" +.IN "XtRealizeWidget" "" "" +Creating a widget is a three-step process. First, the widget instance +is allocated, and various instance-specific attributes are set by +using \fBXtCreateWidget\fP. Second, the widget's parent is informed +of the new child by using \fBXtManageChild\fP. Finally, X windows are +created for the parent and all its children by using \fBXtRealizeWidget\fP +and specifying the top-most widget. The first two steps can be +combined by using \fBXtCreateManagedWidget\fP. In addition, +\fBXtRealizeWidget\fP is automatically called when the child becomes +managed if the parent is already realized. +.LP +To allocate, initialize, and manage a widget, use +.PN XtCreateManagedWidget . +.IN "XtCreateManagedWidget" "" "@DEF@" +.FD 0 +Widget XtCreateManagedWidget(\fIname\fP, \fIwidget_class\fP, \fIparent\fP, \ +\fIargs\fP, \fInum_args\fP) +.br + String \fIname\fP; +.br + WidgetClass \fIwidget_class\fP; +.br + Widget \fIparent\fP; +.br + ArgList \fIargs\fP; +.br + Cardinal \fInum_args\fP; +.FN +.IP \fIname\fP 1i +Specifies the instance name for the created widget that is used for retrieving +widget resources. +.IP \fIwidget_class\fP 1i +Specifies the widget class pointer for the created widget. +.IP \fIparent\fP 1i +Specifies the parent widget ID. +.IP \fIargs\fP 1i +Specifies the argument list. The argument list is a variable-length +list composed of name and value pairs that contain information +pertaining to the specific widget instance being created. For further +information, see Section 2.7.2. +.IP \fInum_args\fP 1i +Specifies the number of arguments in the argument list. +If the num_args is zero, the argument list is never referenced. +.LP +When a widget instance is successfully created, the widget identifier +is returned to the application. If an error is encountered, the +.PN XtError +routine is invoked to inform the user of the error. +.IN "XtError" "" "" +.LP +For further information, see \fI\*(xT\fP. +.NH 2 +Common Resources +.XS + Common Resources +.XE +.IN "resource" "" +.LP +Although a widget can have unique arguments that it understands, all +widgets have common arguments that provide some regularity of operation. +The common arguments allow arbitrary widgets to be managed by +higher-level components without regard for the individual widget type. +Widgets will ignore any argument that they do not understand. +.LP +The following resources are retrieved from the argument list +or from the resource database by all of the Athena widgets: +.TS H +lw(1.5i) lw(1i) lw(1i) lw(2i). +_ +.sp 3p +.TB +Name Class Type Default Value +.sp 3p +_ +.TH +.R +.sp 3p +accelerators Accelerators AcceleratorTable NULL +ancestorSensitive AncestorSensitive Boolean True +background Background Pixel XtDefaultBackground +backgroundPixmap Pixmap Pixmap XtUnspecifiedPixmap +borderColor BorderColor Pixel XtDefaultForeground +borderPixmap Pixmap Pixmap XtUnspecifiedPixmap +borderWidth BorderWidth Dimension 1 +colormap Colormap Colormap Parent's Colormap +depth Depth int Parent's Depth +destroyCallback Callback XtCallbackList NULL +height Height Dimension \fIwidget dependent\fP +mappedWhenManaged MappedWhenManaged Boolean True +screen Screen Screen Parent's Screen +sensitive Sensitive Boolean True +translations Translations TranslationTable \fIwidget dependent\fP +width Width Dimension \fIwidget dependent\fP +x Position Position 0 +y Position Position 0 +.sp 3p +_ +.TE +.IN "XtDefaultForeground" "" "" +.IN "XtDefaultBackground" "" "" +.LP +The following additional resources are retrieved from the argument list +or from the resource database by many of the Athena widgets: +.TS H +lw(1.5i) lw(1i) lw(1i) lw(2i). +_ +.sp 3p +.TB +Name Class Type Default Value +.sp 3p +_ +.TH +.R +.sp 3p +callback Callback XtCallbackList NULL +cursor Cursor Cursor \fIwidget dependent\fP +foreground Foreground Pixel XtDefaultForeground +insensitiveBorder Insensitive Pixmap GreyPixmap +.sp 3p +_ +.TE +.IN "XtDefaultForeground" "" "" +.NH 2 +Resource Conversions +.XS + Resource Conversions +.XE +.IN "conversions" "" "@DEF@" +.IN "string conversions" "" "@DEF@" +.IN "type conversions" "" "@DEF@" +.LP +Most resources in the Athena widget set have a converter registered that +will translate the string in a resource file to the correct internal +representation. While some are obvious (string to integer, for example), +others need specific mention of the allowable values. Three general +converters are described here: +.IP \(bu 5 +Cursor +.IP \(bu 5 +Pixel +.IP \(bu 5 +Bitmap +.LP +Many widgets have defined special converters that apply only to that +widget. When these occur, the documentation section for that widget +will describe the converter. +.NH 3 +Cursor Conversion +.IN "conversions" "ColorCursor" "@DEF@" +.IN "conversions" "Cursor" "@DEF@" +.IN "cursor" "" "" +.LP +The value for the \fBcursorName\fP resource is specified in the resource +database as a string, and is of the following forms: +.IP \(bu 5 +A standard X cursor name from \fB< X11/cursorfont.h >\fP. +The names in \fBcursorfont.h\fP each describe a specific cursor. The +resource names for these cursors are exactly like the names in this file +except the \fBXC_\fP is not used. The cursor definition \fBXC_gumby\fP +has a resource name of \fBgumby\fP. +.IP \(bu 5 +Glyphs, as in \fIFONT font-name glyph-index [[ font-name ] glyph-index ]\fP. +The first font and glyph specify the cursor source pixmap. +The second font and glyph specify the cursor mask pixmap. +The mask font defaults to the source font, +and the mask glyph index defaults to the source glyph index. +.IP \(bu 5 +A relative or absolute file name. +If a relative or absolute file name is specified, that file is used to +create the source pixmap. Then the string "Mask" is appended to +locate the cursor mask pixmap. If the "Mask" file does not exist, the +suffix "msk" is tried. If "msk" fails, no cursor mask will be used. +If the filename does not start with '/' or './' the the bitmap +file path is used (see section 2.4.3). +.NH 3 +Pixel Conversion +.LP +.IN "conversions" "Pixel" "@DEF@" +.IN "pixel" "" "" +.IN "rgb.txt" "" "" +.IN "XtDefaultForeground" "" "" +.IN "XtDefaultBackground" "" "" +The string-to-pixel converter takes any name that is acceptable to +XParseColor (see \fI\*(xL\fP). In addition this routine understands +the special toolkit symbols `XtDefaultForeground' and +`XtDefaultBackground', described in \fI\*(xT\fP. In short the acceptable +pixel names are: +.IP \(bu 5 +Any color name for the rgb.txt file (typically in the directory +/usr/lib/X11 on POSIX systems). +.IP \(bu 5 +A numeric specification of the form #<red><green><blue> where these +numeric values are hexadecimal digits (both upper and lower case). +.IP \(bu 5 +The special strings `XtDefaultForeground' and `XtDefaultBackground' +.NH 3 +Bitmap Conversion +.IN "bitmap conversions" "" "@DEF@" +.IN "conversions" "Bitmap" "@DEF@" +.IN "bitmapFilePath" "" "@DEF@" +.IN "BitmapFilePath" "" "@DEF@" +.IN "/usr/include/X11/bitmaps" "" "" +.LP +The string-to-bitmap converter attempts to locate a file containing +bitmap data whose name is specified by the input string. If the file +name is relative (i.e. does not begin with / or ./), the directories to +be searched are specified in the \fBbitmapFilePath\fP resource--class +\fBBitmapFilePath\fP. This resource specifies a colon (:) separated +list of directories that will be searched for the named bitmap or +cursor glyph (see section 2.4.1). The \fBbitmapFilePath\fP resource is +global to the application, and may \fBnot\fP be specified differently +for each widget that wishes to convert a cursor to bitmap. In addition +to the directories specified in the \fBbitmapFilePath\fP resource a +default directory is searched. When using POSIX the default +directory is +.PN /usr/include/X11/bitmaps . +.NH 2 +Realizing a Widget +.LP +.XS + Realizing a Widget +.XE +.IN "realizing widgets" "" "@DEF@" +The +.PN XtRealizeWidget +function performs two tasks: +.IP \(bu 5 +Calculates the geometry constraints of all managed descendants +of this widget. The actual calculation is put off until realize time +for performance reasons. +.IP \(bu 5 +Creates an X window for the widget and, if it is a composite widget, +realizes each of its managed children. +.IN "XtRealizeWidget" "" "@DEF@" +.FD 0 +void XtRealizeWidget(\fIw\fP) +.br + Widget \fIw\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget. +.LP +For further information about this function, +see the \fI\*(xT\fP. +.NH 2 +Processing Events +.LP +.XS + Processing Events +.XE +.IN "events" "" "" +.IN "XtAppInitialize" "" "" +Now that the application has created, managed and realized its +widgets, it is ready to process the events that will be delivered by the +X Server to this client. A function call that will process the +events is \fBXtAppMainLoop\fP. +.IN "XtAppMainLoop" "" "@DEF@" +.FD 0 +void XtAppMainLoop(\fIapp_context\fP) +.br + XtAppContext \fIapp_context\fP; +.FN +.IP \fIapp_context\fP 1i +Specifies the application context of this application. The value is +normally returned by \fBXtAppInitialize\fP. +.LP +This function never returns: it is an infinite loop that processes the +X events. User input can be handled through callback procedures and +application defined action routines. More details are provided in +\fI\*(xT\fP. +.NH 2 +Standard Widget Manipulation Functions +.XS + Standard Widget Manipulation Functions +.XE +.LP +After a widget has been created, a client can interact with that +widget by calling one of the standard widget manipulation routines +provided by the \*(xI, or a widget class-specific manipulation routine. +.LP +The \*(xI provide generic routines to give the application programmer +access to a set of standard widget functions. The common widget +routines let an application or composite widget perform the following +operations on widgets without requiring explicit knowledge of the widget +type. +.IP \(bu 5 +Control the mapping of widget windows +.IP \(bu 5 +Destroy a widget instance +.IP \(bu 5 +Obtain an argument value +.IP \(bu 5 +Set an argument value +.NH 3 +Mapping Widgets +.LP +By default, +widget windows are mapped (made viewable) automatically by +\fBXtRealizeWidget\fP. This behavior can be disabled by using +\fBXtSetMappedWhenManaged\fP, making the client responsible for calling +\fBXtMapWidget\fP to make the widget viewable. +.IN "XtSetMappedWhenManaged" "" "@DEF@" +.IN "XtMapWidget" "" "" +.IN "XtRealizeWidget" "" "" +.FD 0 +void XtSetMappedWhenManaged(\fIw\fP, \fImap_when_managed\fP) +.br + Widget \fIw\fP; +.br + Boolean \fImap_when_managed\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget. +.IP \fImap_when_managed\fP 1i +Specifies the new value. +If map_when_managed is \fBTrue\fP, the widget is mapped automatically +when it is realized. If map_when_managed is \fBFalse\fP, the client +must call +.PN XtMapWidget +or make a second call to +.PN XtSetMappedWhenManaged +to cause the child window to be mapped. +.LP +.sp +The definition for +.PN XtMapWidget +is: +.IN "XtMapWidget" "" "@DEF@" +.FD 0 +void XtMapWidget(\fIw\fP) +.br + Widget \fIw\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget. +.LP +When you are creating several children in sequence for a previously +realized common parent it is generally more efficient to construct a +list of children as they are created (using \fBXtCreateWidget\fP) and +then use \fBXtManageChildren\fP to request that their parent managed +them all at once. By managing a list of children at one time, the +parent can avoid wasteful duplication of geometry processing and the +associated ``screen flash''. +.IN "XtManageChildren" "" "@DEF@" +.IN "XtCreateWidget" "" "" +.FD 0 +void XtManageChildren(\fIchildren\fP, \fInum_children\fP) +.br + WidgetList \fIchildren\fP; +.br + Cardinal \fInum_children\fP; +.FN +.IP \fIchildren\fP 1i +Specifies a list of children to add. +.IP \fInum_children\fP 1i +Specifies the number of children to add. +.LP +If the parent is already visible on the screen, it is especially +important to batch updates so that the minimum amount of visible window +reconfiguration is performed. +.LP +For further information about these functions, +see the \fI\*(xT\fP. +.NH 3 +Destroying Widgets +.LP +To destroy a widget instance of any type, use +.PN XtDestroyWidget . +.IN "XtDestroyWidget" "" "@DEF@" +.FD 0 +void XtDestroyWidget(\fIw\fP) +.br + Widget \fIw\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget. +.LP +.PN XtDestroyWidget +destroys the widget and recursively destroys any children that it may have, +including the windows created by its children. +After calling +.PN XtDestroyWidget , +no further references should be made to the widget or any children +that the destroyed widget may have had. +.NH 3 +Retrieving Widget Resource Values +.LP +To retrieve the current value of a resource attribute associated +with a widget instance, use +.PN XtGetValues . +.IN "XtGetValues" "" "@DEF@" +.FD 0 +void XtGetValues(\fIw\fP, \fIargs\fP, \fInum_args\fP) +.br + Widget \fIw\fP; +.br + ArgList \fIargs\fP; +.br + Cardinal \fInum_args\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget. +.IP \fIargs\fP 1i +Specifies a variable-length argument list of name and \fBaddress\fP +pairs that contain the resource name and the address into which the +resource value is stored. +.IP \fInum_args\fP 1i +Specifies the number of arguments in the argument list. +.LP +The arguments and values passed in the argument list are dependent on +the widget. Note that the caller is responsible for providing space +into which the returned resource value is copied; the \fBArgList\fP +contains a pointer to this storage (e.g. x and y must be +allocated as Position). For further information, see the \fI\*(xT\fP. +.NH 3 +Modifying Widget Resource Values +.LP +To modify the current value of a resource attribute associated with a +widget instance, use +.PN XtSetValues . +.IN "XtSetValues" "" "@DEF@" +.FD 0 +void XtSetValues(\fIw\fP, \fIargs\fP, \fInum_args\fP) +.br + Widget \fIw\fP; +.br + ArgList \fIargs\fP; +.br + Cardinal \fInum_args\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget. +.IP \fIargs\fP 1i +Specifies an array of name and \fBvalue\fP pairs that contain the +arguments to be modified and their new values. +.IP \fInum_args\fP 1i +Specifies the number of arguments in the argument list. +.LP +The arguments and values that are passed will depend on the widget +being modified. Some widgets may not allow certain resources to be +modified after the widget instance has been created or realized. +No notification is given if any part of a \fBXtSetValues\fP request is +ignored. +.LP +For further information about these functions, see the \fI\*(xT\fP. +.IN "XtGetValues" "" "" +.IN "XtSetValues" "" "" +.NT +The argument list entry for +.PN XtGetValues +specifies the address to which the caller wants the value copied. The +argument list entry for +.PN XtSetValues , +however, contains the new value itself, if the size of value is less than +sizeof(XtArgVal) (architecture dependent, but at least sizeof(long)); +otherwise, it is a pointer to the value. String resources are always +passed as pointers, regardless of the length of the string. +.NE +.NH 2 +Using the Client Callback Interface +.LP +.XS + Using the Client Callback Interface +.XE +.IN "callbacks" "" "" +Widgets can communicate changes in their state to their clients +by means of a callback facility. +The format for a client's callback handler is: +.IN "CallbackProc" "" "@DEF@" +.FD 0 +void \fICallbackProc\fP(\fIw\fP, \fIclient_data\fP, \fIcall_data\fP) +.br + Widget \fIw\fP; +.br + XtPointer \fIclient_data\fP; +.br + XtPointer \fIcall_data\fP; +.FN +.IP \fIw\fP 1i +Specifies widget for which the callback is registered. +.IP \fIclient_data\fP 1i +Specifies arbitrary client-supplied data that the widget should pass +back to the client when the widget executes the client's callback +procedure. This is a way for the client registering the callback to +also register client-specific data: a pointer to additional information +about the widget, a reason for invoking the callback, and so on. If no +additional information is necessary, NULL may be passed as this argument. +This field is also frequently known as the \fIclosure\fP. +.IP \fIcall_data\fP 1i +Specifies any callback-specific data the widget wants to pass to the client. +For example, when Scrollbar executes its \fBjumpProc\fP callback list, +it passes the current position of the thumb in \fIcall_data\fP. +.LP +Callbacks can be registered either by creating an argument containing +the callback list described below or by using the special convenience +routines \fBXtAddCallback\fP and \fBXtAddCallbacks\fP. When the widget +is created, a pointer to a list of callback procedure and data pairs can +be passed in the argument list to +.PN XtCreateWidget . +The list is of type +.PN XtCallbackList : +.IN "XtCallbackProc" +.IN "XtAddCallbacks" +.IN "XtAddCallback" +.IN "XtCallbackList" "" "@DEF@" +.IN "XtCallbackRec" "" "@DEF@" +.LP +.Ds 0 +.TA .5i 3i +.ta .5i 3i +typedef struct { + XtCallbackProc callback; + XtPointer closure; +} XtCallbackRec, *XtCallbackList; +.De +.LP +The callback list must be allocated and initialized before calling +.PN XtCreateWidget . +.IN "XtCreateWidget" +The end of the list is identified by an entry containing NULL in +callback and closure. Once the widget is created, the client can change +or de-allocate this list; the widget itself makes no further reference +to it. The closure field contains the client_data passed to the +callback when the callback list is executed. +.LP +The second method for registering callbacks is to use +.PN XtAddCallback +after the widget has been created. +.IN "XtAddCallback" "" "@DEF@" +.FD 0 +void XtAddCallback(\fIw\fP, \fIcallback_name, \fP\fIcallback\fP, \ +\fIclient_data\fP) +.br + Widget \fIw\fP; +.br + String \fIcallback_name\fP; +.br + XtCallbackProc \fIcallback\fP; +.br + XtPointer \fIclient_data\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget to add the callback to. +.IP \fIcallback_name\fP 1i +Specifies the callback list within the widget to append to. +.IP \fIcallback\fP 1i +Specifies the callback procedure to add. +.IP \fIclient_data\fP 1i +Specifies the data to be passed to the callback when it is invoked. +.LP +.PN XtAddCallback +adds the specified callback to the list for the named widget. +.LP +All widgets provide a callback list named +.PN destroyCallback +.IN "destroyCallback" "" "@DEF@" +where clients can register procedures that are to be executed when the +widget is destroyed. The destroy callbacks are executed when the widget +or an ancestor is destroyed. The \fIcall_data\fP argument is unused for +destroy callbacks. +.NH 2 +Programming Considerations +.LP +.XS + Programming Considerations +.XE +This section provides some guidelines on how to set up an application +program that uses the \*(tk. +.NH 3 +Writing Applications +.LP +.IN "writing applications" +.IN "StringDefs.h" +.IN "Intrinsic.h" +When writing an application that uses the X Toolkit, +you should make sure that your application performs the following: +.IP 1. 5 +Include +.Pn < X11/Intrinsic.h > +in your application programs. +This header file automatically includes +.Pn < X11/Xlib.h >, +so all Xlib functions also are defined. +It may also be necessary to include \fB< X11/StringDefs.h >\fP when setting +up argument lists, as many of the XtN\fIsomething\fP definitions are +only defined in this file. +.IP 2. 5 +Include the widget-specific header files for each widget type +that you need to use. +For example, +.Pn < X11/Xaw/Label.h > +and +.Pn < X11/Xaw/Command.h >. +.IP 3. 5 +Call the +.PN XtAppInitialize +.IN "XtAppInitialize" +function before invoking any other toolkit or Xlib functions. +For further information, +see Section 2.1 and the \fI\*(xT\fP. +.IP 4. 5 +To pass attributes to the widget creation routines that will override +any site or user customizations, set up argument lists. In this +document, a list of valid argument names is provided in the discussion +of each widget. The names each have a global symbol defined that begins +with \fBXtN\fP to help catch spelling errors. For example, +\fBXtNlabel\fP is defined for the \fBlabel\fP resource of many widgets. +.IN "XtN" "" "@DEF@" +.IP +For further information, see Section 2.9.2.2. +.IP 5. 5 +When the argument list is set up, create the widget with the +\fBXtCreateManagedWidget\fP function. For further information, see +Section 2.2 and the \fI\*(xT\fP. +.IN "XtCreateManagedWidget" +.IP 6. 5 +If the widget has any callback routines, set by the +.PN XtNcallback +argument or the +.PN XtAddCallback +function, declare these routines within the application. +.IN "XtAddCallback" +.IP 7. 5 +After creating the initial widget hierarchy, windows must be created +for each widget by calling +.PN XtRealizeWidget +on the top level widget. +.IN "XtRealizeWidget" +.IP 8. 5 +Most applications now sit in a loop processing events using +.PN XtAppMainLoop , +for example: +.IN "XtAppMainLoop" +.IP +.Ds 0 +XtCreateManagedWidget(\fIname\fP, \fIclass\fP, \fIparent\fP, \fIargs\fP, \fInum_args\fP); +XtRealizeWidget(\fIshell\fP); +XtAppMainLoop(\fIapp_context\fP); +.De +.IP +For information about this function, see the \fI\*(xT\fP. +.IP 9. 5 +Link your application with +.PN libXaw +(the Athena widgets), +.PN libXmu +(miscellaneous utilities), +.PN libXt +(the \*(tk \*(xI), +.PN libSM +(Session Management), +.PN libICE +(Inter-Client Exchange), +.PN libXext +(the extension library needed for the shape extension code which allows +rounded Command buttons), and +.PN libX11 +(the core X library). +The following provides a sample command line: +.IN "libXaw" +.IN "libXmu" +.IN "libXt" +.IN "libSM" +.IN "libICE" +.IN "libXext" +.IN "libX11" +.IN "linking applications" +.IN "compiling applications" +.IP +.Ds 0 +cc -o \fIapplication\fP \fIapplication\fP.c \-lXaw \-lXmu \-lXt \ +\-lSM \-lICE \-lXext \-lX11 +.De +.NH 3 +Changing Resource Values +.IN "resource" "" +.LP +The \*(xI support two methods of changing the default resource +values; the resource manager, and an argument list passed into +XtCreateWidget. While resources values will get updated no matter +which method you use, the two methods provide slightly different +functionality. +.IP "Resource Manager" 1.5i +This method picks up resource definitions described in \fI\*(xL\fP from +many different locations at run time. The locations most important to +the application programmer are the \fIfallback resources\fP and the +\fIapp-defaults\fP file, (see \fI\*(xT\fP for the complete list). +Since these resource are loaded at run time, they can be overridden by +the user, allowing an application to be customized to fit the +particular needs of each individual user. These values can also be +modified without the need to rebuild the application, allowing rapid +prototyping of user interfaces. Application programmers should use +resources in preference to hard-coded values whenever possible. +.IP "Argument Lists" 1.5i +The values passed into the widget at creation time via an argument list +cannot be modified by the user, and allow no opportunity for +customization. It is used to set resources that cannot be specified as +strings (e.g. callback lists) or resources that should not be +overridden (e.g. window depth) by the user. +.NH 4 +Specifying Resources +.LP +It is important for all X Toolkit application programmers to +understand how to use the X Resource Manager to specify resources for +widgets in an X application. This section will describe the most common +methods used to specify these resources, and how to use the X Resource +manager. +.IN "xrdb" +.IP \fBXrdb\fP 1.5i +The \fBxrdb\fP utility may be used to load a file containing +resources into the X server. Once the resources are loaded, the +resources will affect any new applications started on the display that +they were loaded onto. +.IN "application defaults" +.IN "app-defaults" +.IN "/usr/lib/X11/app-defaults" +.IP "\fBApplication Defaults\fP" 1.5i +The application defaults (app-defaults) file (normally in +/usr/lib/X11/app-defaults/\fIclassname\fP) for an application is loaded +whenever the application is started. +.LP +The resource specification has two colon-separated parts, a name, and +a value. The \fIvalue\fP is a string whose format is dependent on the +resource specified by \fIname\fP. \fIName\fP is constructed by +appending a resource name to a full widget name. +.LP +The full widget name is a list of the name of every ancestor of the +desired widget separated by periods (.). Each widget also has a class +associated with it. A class is a type of widget (e.g. Label or +Scrollbar or Box). Notice that class names, by convention, begin with +capital letters and instance names begin with lower case letters. The +class of any widget may be used in place of its name in a resource +specification. Here are a few examples: +.IP xman.form.button1 1.5i +This is a fully specified resource name, and will affect only widgets +called button1 that are children of widgets called form that are +children of +applications named xman. (Note that while typically two widgets that +are siblings will have different names, it is not prohibited.) + +.IP Xman.Form.Command 1.5i +This will match any Command widget that is a child of a Form widget +that is itself a child of an application of class \fIXman\fP. +.IP Xman.Form.button1 1.5i +This is a mixed resource name with both widget names and classes specified. +.LP +This syntax allows an application programmer to specify any widget +in the widget tree. To match more than one widget (for example a user +may want to make all Command buttons blue), use an asterisk (*) +instead of a period. When an asterisk is used, any number of widgets +(including zero) may exist between the two widget names. For example: +.IP Xman*Command 1.5i +This matches all Command widgets in the Xman application. +.IP Foo*button1 1.5i +This matches any widget in the Foo application that is named \fIbutton1\fP. +.LP +The root of all application widget trees is the widget returned by +\fBXtAppInitialize\fP. Even though this is actually an +ApplicationShell widget, the toolkit replaces its widget class with the +class name of the application. The name of this widget is either +the name used to invoke the application (\fBargv[0]\fP) or the name of +the application specified using the standard \fI-name\fP command line +option supported by the \*(xI. +.LP +The last step in constructing the resource name is to append the name of +the resource with either a period or asterisk to the full or partial +widget name already constructed. +.IP *foreground:Blue 2.25i +Specifies that all widgets in all applications will have a foreground +color of blue. +.IP Xman*borderWidth:10 2.25i +Specifies that all widgets in an application whose class is Xman will +have a border width of 10 (pixels). +.IP xman.form.button1.label:Testing 2.25i +Specifies that a particular widget in the xman application will have a +label named \fITesting\fP. +.LP +An exclamation point (!) in the first column of a line indicates +that the rest of the line should be treated as a comment. +.LP +\fBFinal Words\fP +.LP +The Resource manager is a powerful tool that can be used very +effectively to customize \*(tk applications at run time by either the +application programmer or the user. Some final points to note: +.IP \(bu 5 +An application programmer may add new resources to their +application. These resources are associated with the global +application, and not any particular widget. The \*(tk function used for +adding the application resources is \fBXtGetApplicationResources\fP. +.IN "XtGetApplicationResources" +.IP \(bu 5 +Be careful when creating resource files. Since widgets will +ignore resources that they do not understand, any spelling +errors will cause a resource to have no effect. +.IP \(bu 5 +Only one resource line will match any given resource. There is a set +of precedence rules, which take the following general stance. +.ta 10n +.IP "" 5 +\(bu More specific overrides less specific, thus period always overrides asterisk. +.IP "" 5 +\(bu Names on the left are more specific and override names on the right. +.IP "" 5 +\(bu When resource specifications are exactly the same, user defaults +.br + will override program defaults. +.LP +For a complete explanation of the rules of precedence, and +other specific topics see \fI\*(xT\fP and \fI\*(xL\fP. +.NH 4 +Creating Argument Lists +.IN "argument lists" "" "@DEF@" +.LP +To set up an argument list for the inline specification of widget attributes, +you may use any of the four approaches discussed in this section. +Each resource name has a global symbol associated with it. This +global symbol has the form XtN\fIresource name\fP. For example, the +symbol for ``foreground'' is \fBXtNforeground\fP. For further information, +see the \fI\*(xT\fP. +.LP +Argument are specified by using the following structure: +.IN "ArgList" "" "@DEF@" +.IN "Arg" "" "@DEF@" +.LP +.Ds 0 +.TA .5i 1.5i +.ta .5i 1.5i +typedef struct { + String name; + XtArgVal value; +} Arg, *ArgList; +.De +.LP +The first approach is to statically initialize the argument list. +For example: +.LP +.Ds 0 +.TA .5i +.ta .5i +static Arg arglist[] = { + {XtNwidth, (XtArgVal) 400}, + {XtNheight, (XtArgVal) 300}, +}; +.De +.LP +This approach is convenient for lists that do not need to be computed +at runtime and makes adding or deleting new elements easy. +The +.IN "XtNumber" +.PN XtNumber +macro is used to compute the number of elements in the argument list, +preventing simple programming errors: +.LP +.Ds +XtCreateWidget(\fIname\fP, \fIclass\fP, \fIparent\fP, \fIarglist\fP, XtNumber(\fIarglist\fP)); +.De +.IN "XtSetArg" "" "@DEF@" +.LP +The second approach is to use the +.PN XtSetArg +macro. +For example: +.LP +.Ds 0 +.TA .5i +.ta .5i +Arg arglist[10]; +XtSetArg(arglist[1], XtNwidth, 400); +XtSetArg(arglist[2], XtNheight, 300); +.De +.LP +To make it easier to insert and delete entries, +you also can use a variable index: +.LP +.Ds 0 +.TA .5i +.ta .5i +Arg arglist[10]; +Cardinal i=0; +XtSetArg(arglist[i], XtNwidth, 400); i++; +XtSetArg(arglist[i], XtNheight, 300); i++; +.De +.LP +The i variable can then be used as the argument list count in the widget +create function. +In this example, +.IN "XtNumber" +.PN XtNumber +would return 10, not 2, and therefore is not useful. +.NT +You should not use auto-increment or auto-decrement +within the first argument to +.PN XtSetArg . +As it is currently implemented, +.PN XtSetArg +is a macro that dereferences the first argument twice. +.NE +.LP +The third approach is to individually set the elements of the +argument list array: +.LP +.Ds 0 +.TA .5i +.ta .5i +Arg arglist[10]; +arglist[0].name = XtNwidth; +arglist[0].value = (XtArgVal) 400; +arglist[1].name = XtNheight; +arglist[1].value = (XtArgVal) 300; +.De +.LP +Note that in this example, as in the previous example, +.IN "XtNumber" +.PN XtNumber +would return 10, not 2, and therefore would not be useful. +.LP +The fourth approach is to use a mixture of the first and third approaches: +you can statically define the argument list but modify some entries at runtime. +For example: +.LP +.Ds 0 +.TA .5i +.ta .5i +static Arg arglist[] = { + {XtNwidth, (XtArgVal) 400}, + {XtNheight, (XtArgVal) NULL}, +}; +arglist[1].value = (XtArgVal) 300; +.De +.LP +In this example, +.IN "XtNumber" +.PN XtNumber +can be used, as in the first approach, for easier code maintenance. +.NH 2 +Example Programs +.XS + Example Programs +.XE +.IN "examples" +.LP +The best way to understand how to use any programming library is by +trying some simple examples. A collection of example programs that +introduces each of the widgets in that Athena widget set, as well as many +important toolkit programming concepts, is available in the X11R6 +release as distributed by the X Consortium. It can be found in the +distribution directory \fBcontrib/examples/mit/Xaw\fP, but see your +site administrator for the exact location of these files on your system. +See the README file from that directory for a guide to the examples. + |