home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-27 | 84.6 KB | 2,803 lines |
- .\" $XConsortium: CH02,v 1.11 91/08/27 09:59:40 swick Exp $
- .\"
- .\" Copyright 1985, 1986, 1987, 1988, 1991
- .\" Massachusetts Institute of Technology, Cambridge, Massachusetts,
- .\" and 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
- .\" M.I.T. or Digital not be used in in advertising or publicity pertaining
- .\" to distribution of the software without specific, written prior permission.
- .\" M.I.T and 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 2\fP\s-1
-
- \s+1\fBWidget Instantiation\fP\s-1
- .sp 2
- .nr H1 2
- .nr H2 0
- .nr H3 0
- .nr H4 0
- .nr H5 0
- .LP
- .XS
- Chapter 2 \- Widget Instantiation
- .XE
- A hierarchy of widget instances constitutes a widget tree.
- The shell widget returned by
- .PN XtAppCreateShell
- is the root of the widget tree instance.
- The widgets with one or more children are the intermediate nodes of that tree,
- and the widgets with no children of any kind are the leaves of the widget tree.
- With the exception of pop-up children (see Chapter 5),
- this widget tree instance defines the associated X Window tree.
- .LP
- Widgets can be either composite or primitive.
- Both kinds of widgets can contain children,
- but the \*(xI provide a set of management mechanisms for constructing
- and interfacing between composite widgets, their children, and
- other clients.
- .LP
- Composite widgets, that is, members of the class
- .PN compositeWidgetClass ,
- are containers for an arbitrary
- but widget implementation-defined collection of children,
- which may be instantiated by the composite widget itself,
- by other clients, or by a combination of the two.
- Composite widgets also contain methods for managing the geometry (layout)
- of any child widget.
- Under unusual circumstances,
- a composite widget may have zero children,
- but it usually has at least one.
- By contrast,
- primitive widgets that contain children typically instantiate
- specific children of known classes themselves and do not expect external
- clients to do so.
- Primitive widgets also do not have general geometry management methods.
- .LP
- In addition,
- the \*(xI recursively perform many operations
- (for example, realization and destruction)
- on composite widgets and all their children.
- Primitive widgets that have children must be prepared
- to perform the recursive operations themselves on behalf of their children.
- .LP
- A widget tree is manipulated by several \*(xI functions.
- For example,
- .PN XtRealizeWidget
- traverses the tree downward and recursively realizes all
- pop-up widgets and children of composite widgets.
- .PN XtDestroyWidget
- traverses the tree downward and destroys all pop-up widgets
- and children of composite widgets.
- The functions that fetch and modify resources traverse the tree upward
- and determine the inheritance of resources from a widget's ancestors.
- .PN XtMakeGeometryRequest
- traverses the tree up one level and calls the geometry manager
- that is responsible for a widget child's geometry.
- .LP
- To facilitate upward traversal of the widget tree,
- each widget has a pointer to its parent widget.
- The
- Shell
- widget that
- .PN XtAppCreateShell
- returns has a \fIparent\fP pointer of NULL.
- .LP
- To facilitate downward traversal of the widget tree,
- the \fIchildren\fP field of
- each composite widget is a pointer to an array of child widgets,
- which includes all normal children created,
- not just the subset of children that are managed by the composite widget's
- geometry manager.
- Primitive widgets
- that instantiate children are entirely responsible for all operations
- that require downward traversal below themselves.
- In addition,
- every widget has a pointer to an array of pop-up children.
-
- .NH 2
- Initializing the \*(tk
- .XS
- \fB\*(SN Initializing the \*(tk\fP
- .XE
- .LP
- Before an application can call any \*(xI function
- other than
- .PN XtSetLanguageProc ,
- it must initialize the \*(xI by using
- .IP \(bu 5
- .PN XtToolkitInitialize ,
- which initializes the \*(xI internals.
- .IP \(bu 5
- .PN XtCreateApplicationContext ,
- which initializes the per-application state.
- .IP \(bu 5
- .PN XtDisplayInitialize
- or
- .PN XtOpenDisplay ,
- which initializes the per-display state.
- .IP \(bu 5
- .PN XtAppCreateShell ,
- which creates the root of a widget tree.
- .LP
- or an application can call the convenience procedure
- .PN XtAppInitialize
- which combines the functions of the preceding procedures.
- An application wishing to use the ANSI C locale mechanism should call
- .PN XtSetLanguageProc
- prior to calling
- .PN XtDisplayInitialize ,
- .PN XtOpenDisplay ,
- or
- .PN XtAppInitialize .
- .LP
- Multiple instances of \*(tk applications may be implemented
- in a single address space.
- Each instance needs to be able to read
- input and dispatch events independently of any other instance.
- Further, an application instance may need multiple display connections
- to have widgets on multiple displays.
- From the application's point of view, multiple display connections
- usually are treated together as a single unit
- for purposes of event dispatching.
- .IN "application context" "" "@DEF@"
- To accommodate both requirements,
- the \*(xI define application contexts,
- each of which provides the information needed to distinguish one application
- instance from another.
- The major component of an application context is a list of one or more X
- .PN Display
- pointers for that application.
- The \*(xI handle all display connections within a single application
- context simultaneously, handling input in a round-robin fashion.
- The application context type
- .PN XtAppContext
- .IN "XtAppContext" "" "@DEF@"
- is opaque to clients.
- .sp
- .LP
- To initialize the \*(xI internals, use
- .PN XtToolkitInitialize .
- .IN "XtToolkitInitialize" "" "@DEF@"
- .FD 0
- void XtToolkitInitialize()
- .FN
- .LP
- The semantics of calling
- .PN XtToolkitInitialize
- more than once are undefined.
- .sp
- .LP
- To create an application context, use
- .PN XtCreateApplicationContext .
- .IN "XtCreateApplicationContext" "" "@DEF@"
- .FD 0
- XtAppContext XtCreateApplicationContext()
- .FN
- The
- .PN XtCreateApplicationContext
- function returns an application context,
- which is an opaque type.
- Every application must have at least one application context.
- .sp
- .LP
- To destroy an application context and close any
- remaining display connections in it, use
- .PN XtDestroyApplicationContext .
- .IN "XtDestroyApplicationContext" "" "@DEF@"
- .FD 0
- void XtDestroyApplicationContext(\fIapp_context\fP)
- .br
- XtAppContext \fIapp_context\fP;
- .FN
- .IP \fIapp_context\fP 1i
- Specifies the application context.
- .LP
- The
- .PN XtDestroyApplicationContext
- function destroys the specified application context as soon as it is safe
- to do so.
- If called from within an event dispatch (for example, in a callback procedure),
- .PN XtDestroyApplicationContext
- does not destroy the application context until the dispatch is complete.
- .sp
- .LP
- To get the application context in which a given widget was created, use
- .PN XtWidgetToApplicationContext .
- .IN "XtWidgetToApplicationContext" "" "@DEF@"
- .FD 0
- XtAppContext XtWidgetToApplicationContext(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget for which you want the application context. \*(oI
- .LP
- The
- .PN XtWidgetToApplicationContext
- function returns the application context for the specified widget.
- .sp
- .LP
- To initialize a display and add it to an application context, use
- .PN XtDisplayInitialize .
- .IN "XtDisplayInitialize" "" "@DEF@"
- .FD 0
- void XtDisplayInitialize(\fIapp_context\fP, \fIdisplay\fP, \
- \fIapplication_name\fP, \fIapplication_class\fP,
- .br
- \fIoptions\fP, \fInum_options\fP, \fIargc\fP, \fIargv\fP)
- .br
- XtAppContext \fIapp_context\fP;
- .br
- Display *\fIdisplay\fP;
- .br
- String \fIapplication_name\fP;
- .br
- String \fIapplication_class\fP;
- .br
- XrmOptionDescRec *\fIoptions\fP;
- .br
- Cardinal \fInum_options\fP;
- .br
- int *\fIargc\fP;
- .br
- String *\fIargv\fP;
- .FN
- .IP \fIapp_context\fP 1.4i
- Specifies the application context.
- .IP \fIdisplay\fP 1.4i
- Specifies a previously opened display connection. Note that a single
- display connection can be in at most one application context.
- .IP \fIapplication_name\fP 1.4i
- Specifies the name of the application instance.
- .IP \fIapplication_class\fP 1.4i
- Specifies the class name of this application,
- which is usually the generic name for all instances of this application.
- .IP \fIoptions\fP 1.4i
- Specifies how to parse the command line for any application-specific resources.
- The \fIoptions\fP argument is passed as a parameter to
- .PN XrmParseCommand .
- For further information,
- see Section 15.9 in \fI\*(xL\fP and Section 2.4 of this specification.
- .IP \fInum_options\fP 1.4i
- Specifies the number of entries in the options list.
- .IP \fIargc\fP 1.4i
- Specifies a pointer to the number of command line parameters.
- .IP \fIargv\fP 1.4i
- Specifies the list of command line parameters.
- .LP
- The
- .PN XtDisplayInitialize
- function retrieves the language string to be
- used for the specified display (see Section 11.11),
- calls the language procedure (if set) with that language string,
- builds the resource database for the default screen, calls the Xlib
- .PN XrmParseCommand
- function to parse the command line,
- and performs other per-display initialization.
- After
- .PN XrmParseCommand
- has been called,
- \fIargc\fP and \fIargv\fP contain only those parameters that
- were not in the standard option table or in the table specified by the
- \fIoptions\fP argument.
- If the modified \fIargc\fP is not zero,
- most applications simply print out the modified \fIargv\fP along with a message
- listing the allowable options.
- On POSIX-based systems,
- the application name is usually the final component of \fIargv\fP[0].
- If the synchronous resource is
- .PN True ,
- .PN XtDisplayInitialize
- calls the Xlib
- .PN XSynchronize
- function to put Xlib into synchronous mode for this display connection
- and any others currently open in the application context.
- See Sections 2.3 and 2.4 for details on the \fIapplication_name\fP,
- \fIapplication_class\fP, \fIoptions\fP, and \fInum_options\fP arguments.
- .LP
- .PN XtDisplayInitialize
- calls
- .PN XrmSetDatabase
- to associate the resource database of the default screen with the
- display before returning.
-
- .bp
- .LP
- To open a display, initialize it, and then
- add it to an application context, use
- .PN XtOpenDisplay .
- .IN "XtOpenDisplay" "" "@DEF@"
- .FD 0
- Display *XtOpenDisplay(\fIapp_context\fP, \fIdisplay_string\fP, \
- \fIapplication_name\fP, \fIapplication_class\fP,
- .br
- \fIoptions\fP, \fInum_options\fP, \fIargc\fP, \fIargv\fP)
- .br
- XtAppContext \fIapp_context\fP;
- .br
- String \fIdisplay_string\fP;
- .br
- String \fIapplication_name\fP;
- .br
- String \fIapplication_class\fP;
- .br
- XrmOptionDescRec *\fIoptions\fP;
- .br
- Cardinal \fInum_options\fP;
- .br
- int *\fIargc\fP;
- .br
- String *\fIargv\fP;
- .FN
- .IP \fIapp_context\fP 1.4i
- Specifies the application context.
- .IP \fIdisplay_string\fP 1.4i
- Specifies the display string, or NULL.
- .IP \fIapplication_name\fP 1.4i
- Specifies the name of the application instance, or NULL.
- .IP \fIapplication_class\fP 1.4i
- Specifies the class name of this application,
- which is usually the generic name for all instances of this application.
- .IP \fIoptions\fP 1.4i
- Specifies how to parse the command line for any application-specific resources.
- The options argument is passed as a parameter to
- .PN XrmParseCommand .
- .IP \fInum_options\fP 1.4i
- Specifies the number of entries in the options list.
- .IP \fIargc\fP 1.4i
- Specifies a pointer to the number of command line parameters.
- .IP \fIargv\fP 1.4i
- Specifies the list of command line parameters.
- .LP
- The
- .PN XtOpenDisplay
- function calls
- .PN XOpenDisplay
- with the specified \fIdisplay_string\fP.
- If \fIdisplay_string\fP is NULL,
- .PN XtOpenDisplay
- uses the current value of the \-display option specified in \fIargv\fP.
- If no display is specified in \fIargv\fP,
- the user's default display is retrieved from the environment.
- On POSIX-based systems,
- this is the value of the
- .PN \s-1DISPLAY\s+1
- environment variable.
- .LP
- If this succeeds,
- .PN XtOpenDisplay
- then calls
- .PN XtDisplayInitialize
- and passes it the opened display and
- the value of the \-name option specified in \fIargv\fP as the application name.
- If no \-name option is specified
- and \fIapplication_name\fP is
- non-NULL, \fIapplication_name\fP is passed to
- .PN XtDisplayInitialize .
- If \fIapplication_name\fP is NULL and if the environment variable
- .PN \s-1RESOURCE_NAME\s+1
- is set, the value of
- .PN \s-1RESOURCE_NAME\s+1
- is used. Otherwise, the application
- name is the name used to invoke the program. On implementations that
- conform to ANSI C Hosted Environment support, the application name will
- be \fIargv\fP[0] less any directory and file type components, that is, the
- final component of \fIargv\fP[0], if specified. If \fIargv\fP[0] does not exist or
- is the empty string, the application name is ``main''.
- .PN XtOpenDisplay
- returns the newly opened display or NULL if it failed.
- .sp
- .LP
- To close a display and remove it from an application context, use
- .PN XtCloseDisplay .
- .IN "XtCloseDisplay" "" "@DEF@"
- .FD 0
- void XtCloseDisplay(\fIdisplay\fP)
- .br
- Display *\fIdisplay\fP;
- .FN
- .IP \fIdisplay\fP 1i
- Specifies the display.
- .LP
- The
- .PN XtCloseDisplay
- function calls
- .PN XCloseDisplay
- with the specified \fIdisplay\fP as soon as it is safe to do so.
- If called from within an event dispatch (for example, a callback procedure),
- .PN XtCloseDisplay
- does not close the display until the dispatch is complete.
- Note that applications need only call
- .PN XtCloseDisplay
- if they are to continue executing after closing the display;
- otherwise, they should call
- .PN XtDestroyApplicationContext
- or just exit.
-
- .NH 2
- Establishing the Locale
- .XS
- \fB\*(SN Establishing the Locale\fP
- .XE
-
- .LP
- Resource databases are specified to be created in the current process
- locale. During display initialization prior to creating the
- per-screen resource database, the \*(xI will call out to a specified
- application procedure to set the locale according to options found on
- the command line or in the per-display resource specifications.
- .LP
- The callout procedure provided by the application is of type
- .PN XtLanguageProc .
- .IN "XtLanguageProc" "" "@DEF@"
-
- .FD 0
- typedef String (*XtLanguageProc)(Display*, String, XtPointer);
- .br
- Display *\fIdisplay\fP;
- .br
- String \fIlanguage\fP;
- .br
- XtPointer \fIclient_data\fP;
- .FN
- .IP \fIdisplay\fP 1i
- Passes the display.
- .IP \fIlanguage\fP
- Passes the initial language value obtained from the command line
- or server per-display resource specifications.
- .IP \fIclient_data\fP
- Passes the additional client data specified in the call to
- .PN XtSetLanguageProc .
- .LP
- The language procedure allows an application to set the locale to
- the value of the language resource determined by
- .PN XtDisplayInitialize .
- The function returns a new language string that
- will be subsequently used by
- .PN XtDisplayInitialize
- to establish the path for loading resource files. The returned
- string will be copied by the \*(xI into new memory.
-
- .sp
- .LP
- Initially, no language procedure is set by the \*(xI.
- To set the language procedure for use by
- .PN XtDisplayInitialize
- use
- .PN XtSetLanguageProc .
- .IN XtSetLanguageProc "" "@DEF@"
- .IN "language procedure" "" "@DEF@
- .FD 0
- XtLanguageProc XtSetLanguageProc(\fIapp_context\fP, \fIproc\fP, \fIclient_data\fP)
- .br
- XtAppContext \fIapp_context\fP;
- .br
- XtLanguageProc \fIproc\fP;
- .br
- XtPointer \fIclient_data\fP;
- .FN
- .IP \fIapp_context\fP 1i
- Specifies the application context in which the language procedure is
- to be used, or NULL.
- .IP \fIproc\fP 1i
- Specifies the language procedure.
- .IP \fIclient_data\fP 1i
- Specified additional client data to be passed to the language
- procedure when it is called.
- .LP
- .PN XtSetLanguageProc
- sets the language procedure that will be called from
- .PN XtDisplayInitialize
- for all subsequent Displays initialized in the specified application
- context. If \fIapp_context\fP is NULL, the specified language
- procedure is registered in all application contexts created by the
- calling process, including any future application contexts that may
- be created. If \fIproc\fP is NULL a default language procedure is
- registered.
- .PN XtSetLanguageProc
- returns the previously registered language procedure.
- If a language procedure has not yet been registered, the return value
- is unspecified but if this return value is used in a subsequent call to
- .PN XtSetLanguageProc ,
- it will cause the default language procedure to be registered.
- .LP
- The default language procedure does the following:
- .IP \(bu 5
- Sets the locale according to the environment. On ANSI C-based
- systems this is done by calling
- .PN setlocale (
- .PN LC_ALL ,
- \fIlanguage\fP ).
- If an error is encountered a warning message is issued with
- .PN XtWarning .
- .IP \(bu 5
- Calls
- .PN XSupportsLocale
- to verify that the current locale is supported.
- If the locale is not supported, a warning message is issued with
- .PN XtWarning
- and the locale is set to ``C''.
- .IP \(bu 5
- Calls
- .PN XSetLocaleModifiers
- specifying the empty string.
- .IP \(bu 5
- Returns the value of the current locale. On ANSI C-based systems this
- is the return value from a final call to
- .PN setlocale (
- .PN LC_ALL ,
- NULL ).
- .LP
- A client wishing to use this mechanism to establish locale can do so
- by calling
- .PN XtSetLanguageProc
- prior to
- .PN XtDisplayInitialize ,
- as in the following example.
- .LP
- .Ds 0
- .TA .5i
- Widget top;
- XtSetLanguageProc(NULL, NULL, NULL);
- top = XtAppInitialize( ... );
- ...
- .De
-
- .NH 2
- Loading the Resource Database
- .XS
- \fB\*(SN Loading the Resource Database\fP
- .XE
-
- .LP
- The
- .PN XtDisplayInitialize
- function first determines the language
- string to be used for the specified display. It then
- creates a resource database for the default screen of the display by
- combining the following sources in order, with the entries in the
- first named source having highest precedence:
-
- .IP \(bu 5
- Application command line (\fIargc\fP, \fIargv\fP).
- .IP \(bu 5
- Per-host user environment resource file on the local host.
- .IP \(bu 5
- Per-screen resource specifications from the server.
- .IP \(bu 5
- Per-display resource specifications from the server or from
- .br
- the user preference file on the local host.
- .IP \(bu 5
- Application-specific user resource file on the local host.
- .IP \(bu 5
- Application-specific class resource file on the local host.
-
- .LP
- When the resource database for a particular screen on the display
- is needed (either internally, or when
- .PN XtScreenDatabase
- is called),
- it is created in the following manner using the sources listed
- above in the same order:
-
- .IP \(bu 5
- A temporary database, the ``server resource database'', is
- created from the string returned by
- .PN XResourceManagerString
- or, if
- .PN XResourceManagerString
- returns NULL, the contents of a resource file in the user's home
- directory. On POSIX-based systems, the usual name for this user
- preference resource file is $HOME/\fB.Xdefaults\fP.
- .IN ".Xdefaults" "" "@DEF@"
-
- .IP \(bu 5
- If a language procedure has been set,
- .PN XtDisplayInitialize
- first searches the command line for the option ``-xnlLanguage'', or
- for a -xrm option that specifies the xnlLanguage/XnlLanguage resource,
- as specified by Section 2.4.
- If such a resource is found, the value is assumed to be
- entirely in XPCS, the X Portable Character Set. If neither option is
- specified on the command line,
- .PN XtDisplayInitialize
- queries the server resource database (which is assumed to be entirely
- in XPCS) for the resource
- \fIname\fP\fB.xnlLanguage\fP, class \fIClass\fP\fB.XnlLanguage\fP
- where \fIname\fP
- .IN "xnlLanguage" "" "@DEF@"
- .IN "Resources" "xnlLanguage"
- and \fIClass\fP are the \fIapplication_name\fP and
- \fIapplication_class\fP specified to
- .PN XtDisplayInitialize .
- The language procedure is then invoked with
- the resource value if found, else the empty string. The
- string returned from the language procedure is saved for all future
- references in the \*(xI that require the per-display language string.
-
- .IP \(bu 5
- The screen resource database is initialized by parsing the command
- line in the manner specified by Section 2.4.
-
- .IP \(bu 5
- If a language procedure has not been set,
- the initial database is then queried for the resource
- \fIname\fP\fB.xnlLanguage\fP, class \fIClass\fP\fB.XnlLanguage\fP
- as specified above.
- If this database query fails, the server resource database is
- queried; if this query also fails, the language is determined from
- the environment; on POSIX-based systems, this is done by retrieving the
- value of the
- .PN \s-1LANG\s+1
- environment variable. If no language string is
- found, the empty string is used.
- This language string is saved for all future references in the \*(xI
- that require the per-display language string.
-
- .IP \(bu 5
- After determining the language string, the user's environment resource
- file is then merged into the initial resource database if the file exists.
- This file is user-, host-, and process-specific and is expected to
- contain user preferences that are to override those specifications in
- the per-display and per-screen resources.
- On POSIX-based systems, the user's environment resource file name is
- specified by the value of the
- .PN \s-1XENVIRONMENT\s+1
- environment variable.
- If this environment variable does not exist, the user's home directory
- is searched for a file named
- .PN \&.Xdefaults-\fIhost\fP ,
- where \fIhost\fP is the host name of the machine on which the
- application is running.
-
- .IP \(bu 5
- The per-screen resource specifications are then merged into the screen
- resource database, if they exist. These specifications are the string
- returned by
- .PN XScreenResourceString
- for the respective screen and are owned entirely by the user.
-
- .IP \(bu 5
- Next, the server resource database created earlier is merged into the
- screen resource database. The server property, and corresponding user
- preference file, are owned and constructed entirely by the user.
-
- .IP \(bu 5
- The application-specific user resource file from the local host is
- then merged into the screen resource database.
- This file contains user customizations and is stored
- in a directory owned by the user.
- Either the user or the application or both can store resource specifications
- in the file. Each should be prepared to find and respect entries made
- by the other.
- The file name is found by calling
- .PN XrmSetDatabase
- with the current screen resource database, after preserving the
- original display-associated database, then calling
- .PN XtResolvePathname
- with the parameters
- (\fIdisplay\fP, NULL, NULL, NULL, \fIpath\fP, NULL, 0, NULL)
- where \fIpath\fP is defined in an operating-system-specific way.
- On POSIX-based systems, \fIpath\fP is defined to be the value
- of the environment variable
- .PN \s-1XUSERFILESEARCHPATH\s+1
- if this is defined. If
- .PN \s-1XUSERFILESEARCHPATH\s+1
- is not defined, an implementation-dependent default value is used.
- This default value is constrained in the following manner:
-
- .RS
- .IP \- 3
- If the environment variable
- .PN \s-1XAPPLRESDIR\s+1
- is not defined, the default
- .PN \s-1XUSERFILESEARCHPATH\s+1
- must contain at least six entries. These entries must contain
- .IN "XUSERFILESEARCHPATH" "" "@DEF@"
- .IN "XAPPLRESDIR" "" "@DEF@"
- .IN "$HOME"
- $HOME as the directory prefix, plus the following substitutions:
-
- .nf
- .ta .3i 1.5i 2i
- 1. %C, %N, %L or %C, %N, %l, %t, %c
- 2. %C, %N, %l
- 3. %C, %N
- 4. %N, %L or %N, %l, %t, %c
- 5. %N, %l
- 6. %N
- .fi
-
- The order of these six entries within the path must be as given above.
- The order and use of substitutions within a given entry is implementation
- dependent.
-
- .IP \- 3
- If
- .PN \s-1XAPPLRESDIR\s+1
- is defined, the default
- .PN \s-1XUSERFILESEARCHPATH\s+1
- must contain at least seven entries. These entries must contain the
- following directory prefixes and substitutions:
-
- .ne 1.1
- .nf
- .ta .3i 1.6i 2.2i 3.3i 3.7i
- 1. $XAPPLRESDIR with %C, %N, %L or %C, %N, %l, %t, %c
- 2. $XAPPLRESDIR with %C, %N, %l
- 3. $XAPPLRESDIR with %C, %N
- 4. $XAPPLRESDIR with %N, %L or %N, %l, %t, %c
- 5. $XAPPLRESDIR with %N, %l
- 6. $XAPPLRESDIR with %N
- 7. $HOME with %N
- .fi
-
- The order of these seven entries within the path must be as given above.
- The order and use of substitutions within a given entry is implementation
- dependent.
- .RE
-
- .IP \(bu 5
- Lastly, the application-specific class resource file from the local
- host is merged into the screen resource database.
- This file is owned by the application and is usually installed in
- a system directory when the application is installed.
- It may contain site-wide customizations specified by the system manager.
- The name of the application class resource file is found by calling
- .PN XtResolvePathname
- with the parameters
- (\fIdisplay\fP, ``app-defaults'', NULL, NULL, NULL, NULL, 0, NULL).
- This file is expected to be provided by the developer of the application
- and may be required for the application to function properly.
- A simple application that wants to be assured of having a minimal
- set of resources in the absence of its class resource file can declare
- fallback resource specifications with
- .PN XtAppSetFallbackResources .
- Note that the customization substitution string is retrieved
- dynamically by
- .PN XtResolvePathname
- so that the resolved file name of the application class resource file
- can be affected by any of the earlier sources for the screen resource
- database, even though the contents of the class resource file have
- lowest precedence. After calling
- .PN XtResolvePathname ,
- the original display-associated database is restored.
-
- .sp
- .LP
- To obtain the resource database for a particular screen, use
- .PN XtScreenDatabase .
- .IN "XtScreenDatabase" "" "@DEF@"
- .FD 0
- XrmDatabase XtScreenDatabase(\fIscreen\fP)
- .br
- Screen *\fIscreen\fP;
- .FN
- .IP \fIscreen\fP 1i
- Specifies the screen whose resource database is to be returned.
- .LP
- The
- .PN XtScreenDatabase
- function returns the fully merged resource database as specified above,
- associated with the specified screen. If the specified \fIscreen\fP
- does not belong to a
- .PN Display
- initialized by
- .PN XtDisplayInitialize ,
- the results are undefined.
-
- .sp
- .LP
- To obtain the default resource database associated with a particular display, use
- .PN XtDatabase .
- .IN "XtDatabase" "" "@DEF@"
- .FD 0
- XrmDatabase XtDatabase(\fIdisplay\fP)
- .br
- Display *\fIdisplay\fP;
- .FN
- .IP \fIdisplay\fP 1i
- Specifies the display.
- .LP
- The
- .PN XtDatabase
- function is equivalent to
- .PN XrmGetDatabase .
- It returns the database associated with the specified display, or
- NULL if a database has not been set.
-
- .sp
- .LP
- To specify a default set of resource values that will be used to
- initialize the resource database if no application-specific class
- resource file is found (the last of the six sources listed above),
- use
- .PN XtAppSetFallbackResources .
- .IN "XtAppSetFallbackResources" "" "@DEF@"
- .FD 0
- void XtAppSetFallbackResources(\fIapp_context\fP, \fIspecification_list\fP)
- .br
- XtAppContext \fIapp_context\fP;
- .br
- String *\fIspecification_list\fP;
- .FN
- .IP \fIapp_context\fP 1.25i
- Specifies the application context in which
- the fallback specifications will be used.
- .IP \fIspecification_list\fP 1.25i
- Specifies a NULL-terminated list of
- resource specifications to preload
- the database, or NULL.
- .LP
- Each entry in \fIspecification_list\fP points to a string in the format of
- .PN XrmPutLineResource .
- Following a call to
- .PN XtAppSetFallbackResources ,
- when a resource database is being created for a particular screen and
- the \*(xI are not able
- to find or read an application-specific class resource file according to the
- rules given above and if \fIspecification_list\fP is not NULL the
- resource specifications in \fIspecification_list\fP will be merged
- into the screen resource database in place of the application-specific
- class resource file.
- .PN XtAppSetFallbackResources
- is not
- required to copy \fIspecification_list\fP; the caller must ensure that the
- contents of the list and of the strings addressed by the list remain
- valid until all displays are initialized or until
- .PN XtAppSetFallbackResources
- is called again. The value NULL for
- \fIspecification_list\fP removes any previous fallback resource specification
- for the application context. The intended use for fallback resources
- is to provide a minimal
- number of resources that will make the application usable (or at
- least terminate with helpful diagnostic messages) when some problem
- exists in finding and loading the application defaults file.
-
- .NH 2
- Parsing the Command Line
- .XS
- \fB\*(SN Parsing the Command Line\fP
- .XE
- .LP
- The
- .PN XtOpenDisplay
- function first parses the command line for the following options:
- .IP \-display 1i
- Specifies the display name for
- .PN XOpenDisplay .
- .IP \-name 1i
- Sets the resource name prefix,
- which overrides the application name passed to
- .PN XtOpenDisplay .
- .IP \-xnllanguage 1i
- Specifies the initial language string for establishing locale
- and for finding application class resource files.
- .LP
- .PN XtDisplayInitialize
- has a table of standard command line options that are passed to
- .PN XrmParseCommand
- for adding resources to the resource database,
- and it takes as a parameter additional
- application-specific resource abbreviations.
- .IN "XrmOptionDescRec" "" "@DEF@"
- The format of this table is described in Section 15.9 in \fI\*(xL\fP.
- .LP
- .Ds 0
- .TA .5i 2.75i
- .ta .5i 2.75i
- typedef enum {
- XrmoptionNoArg, /* Value is specified in OptionDescRec.value */
- XrmoptionIsArg, /* Value is the option string itself */
- XrmoptionStickyArg, /* Value is characters immediately following option */
- XrmoptionSepArg, /* Value is next argument in argv */
- XrmoptionResArg, /* Use the next argument as input to XrmPutLineResource*/
- XrmoptionSkipArg, /* Ignore this option and the next argument in argv */
- XrmoptionSkipNArgs, /* Ignore this option and the next */
- /* OptionDescRec.value arguments in argv */
- XrmoptionSkipLine /* Ignore this option and the rest of argv */
- } XrmOptionKind;
-
- typedef struct {
- char *option; /* Option name in argv */
- char *specifier; /* Resource name (without application name) */
- XrmOptionKind argKind; /* Location of the resource value */
- XPointer value; /* Value to provide if XrmoptionNoArg */
- } XrmOptionDescRec, *XrmOptionDescList;
-
- .De
- .LP
- The standard table contains the following entries:
- .TS
- l l l l .
- _
- .sp 6p
- .TB
- Option String Resource Name Argument Kind Resource Value
- .sp 6p
- _
- .sp 6p
- \-background *background SepArg next argument
- \-bd *borderColor SepArg next argument
- \-bg *background SepArg next argument
- \-borderwidth .borderWidth SepArg next argument
- \-bordercolor *borderColor SepArg next argument
- \-bw .borderWidth SepArg next argument
- \-display .display SepArg next argument
- \-fg *foreground SepArg next argument
- \-fn *font SepArg next argument
- \-font *font SepArg next argument
- \-foreground *foreground SepArg next argument
- \-geometry .geometry SepArg next argument
- \-iconic .iconic NoArg ``true''
- \-name .name SepArg next argument
- \-reverse .reverseVideo NoArg ``on''
- \-rv .reverseVideo NoArg ``on''
- +rv .reverseVideo NoArg ``off''
- \-selectionTimeout .selectionTimeout SepArg next argument
- \-synchronous .synchronous NoArg ``on''
- +synchronous .synchronous NoArg ``off''
- \-title .title SepArg next argument
- \-xnllanguage .xnlLanguage SepArg next argument
- \-xrm next argument ResArg next argument
- .sp 6p
- _
- .TE
- .LP
- Note that any unique abbreviation for an option name in the standard table
- or in the application table is accepted.
- .NE
- .LP
- If reverseVideo is
- .PN True ,
- the values of
- .PN XtDefaultForeground
- and
- .PN XtDefaultBackground
- are exchanged for all screens on the Display.
- .LP
- .IN "synchronous" "" "@DEF@"
- .IN "Resources" "synchronous"
- The value of the synchronous resource specifies whether or not
- Xlib is put into synchronous mode. If a value is found in the resource
- database during display initialization,
- .PN XtDisplayInitialize
- makes a call to
- .PN XSynchronize
- for all display
- connections currently open in the application context. Therefore,
- when multiple displays are initialized in the same application
- context, the most recent value specified for the synchronous resource
- is used for all displays in the application context.
- .LP
- .IN "selectionTimeout" "" "@DEF@"
- .IN "Resources" "selectionTimeout"
- The value of the selectionTimeout resource applies to all displays
- opened in the same application context. When multiple displays are
- initialized in the same application context, the most recent value
- specified is used for all displays in the application context.
- .LP
- The \-xrm option provides a method of setting any resource in an application.
- The next argument should be a quoted string identical in format to a line in
- the user resource file.
- For example,
- to give a red background to all command buttons in an application named
- .PN xmh ,
- you can start it up as
- .LP
- .Ds
- xmh \-xrm 'xmh*Command.background: red'
- .DE
- .LP
- When it parses the command line,
- .PN XtDisplayInitialize
- merges the application option table with the standard option table
- before calling the Xlib
- .PN XrmParseCommand
- function.
- An entry in the application table with the same name as an entry
- in the standard table overrides the standard table entry.
- If an option name is a prefix of another option name,
- both names are kept in the merged table.
- The \*(xI reserve all option names
- beginning with the characters ``-xt'' for future standard uses.
-
- .NH 2
- Creating Widgets
- .XS
- \fB\*(SN Creating Widgets\fP
- .XE
- .LP
- The creation of widget instances is a three-phase process:
- .IP 1. 5
- The widgets are allocated and initialized with resources
- and are optionally added to the managed subset of their parent.
- .IP 2. 5
- All composite widgets are notified of their managed children
- in a bottom-up traversal of the widget tree.
- .IP 3. 5
- The widgets create X windows, which then are mapped.
- .LP
- .EQ
- delim $$
- .EN
- To start the first phase,
- the application calls
- .PN XtCreateWidget
- for all its widgets and adds some (usually, most or all) of its widgets
- to their respective parents' managed set by calling
- .PN XtManageChild .
- To avoid an $O( n sup 2 )$ creation process where each composite widget
- lays itself out each time a widget is created and managed,
- parent widgets are not notified of changes in their managed set
- during this phase.
- .EQ
- delim off
- .EN
- .LP
- After all widgets have been created,
- the application calls
- .PN XtRealizeWidget
- with the top-level widget to execute the second and third phases.
- .PN XtRealizeWidget
- first recursively traverses the widget tree in a postorder (bottom-up)
- traversal and then notifies each composite widget with one
- or more managed children by means of its change_managed procedure.
- .LP
- Notifying a parent about its managed set involves geometry layout and
- possibly geometry negotiation.
- A parent deals with constraints on its size imposed from above
- (for example, when a user specifies the application window size)
- and suggestions made from below (for example,
- when a primitive child computes its preferred size).
- One difference between the two can cause geometry changes to ripple
- in both directions through the widget tree.
- The parent may force some of its children to change size and position
- and may issue geometry requests to its own parent in order to better
- accommodate all its children.
- You cannot predict where anything will go on the screen
- until this process finishes.
- .LP
- Consequently, in the first and second phases,
- no X windows are actually created, because it is likely
- that they will get moved around after creation.
- This avoids unnecessary requests to the X server.
- .LP
- Finally,
- .PN XtRealizeWidget
- starts the third phase by making a preorder (top-down) traversal
- of the widget tree, allocates an X window to each widget by means of
- its realize procedure, and finally maps the widgets that are managed.
-
- .NH 3
- Creating and Merging Argument Lists
- .XS
- \fB\*(SN Creating and Merging Argument Lists\fP
- .XE
- .LP
- Many \*(xI functions may be passed pairs of resource names and
- values.
- These are passed as an arglist, a pointer to an array of
- .PN Arg
- structures, which contains
- .IN "ArgList" "" "@DEF@"
- .IN "Arg" "" "@DEF@"
- .LP
- .Ds 0
- .TA .5i 3i
- .ta .5i 3i
- typedef struct {
- String name;
- XtArgVal value;
- } Arg, *ArgList;
- .De
- .LP
- where
- .PN XtArgVal
- is as defined in Section 1.5.
- .LP
- If the size of the resource is less than or equal to the size of an
- .PN XtArgVal ,
- the resource value is stored directly in \fIvalue\fP;
- otherwise, a pointer to it is stored in \fIvalue\fP.
- .LP
- To set values in an
- .PN ArgList ,
- use
- .PN XtSetArg .
- .IN "XtSetArg" "" "@DEF@"
- .FD 0
- void XtSetArg(\fIarg\fP, \fIname\fP, \fIvalue\fP)
- .br
- Arg \fIarg\fP;
- .br
- String \fIname\fP;
- .br
- XtArgVal \fIvalue\fP;
- .FN
- .IP \fIarg\fP 1i
- Specifies the \fIname/value\fP pair to set.
- .IP \fIname\fP 1i
- Specifies the name of the resource.
- .IP \fIvalue\fP 1i
- Specifies the value of the resource if it will fit in an
- .PN XtArgVal ,
- else the address.
- .LP
- The
- .PN XtSetArg
- function is usually used in a highly stylized manner to
- minimize the probability of making a mistake; for example:
- .LP
- .Ds
- .TA .5i 3i
- .ta .5i 3i
- Arg args[20];
- int n;
-
- n = 0;
- XtSetArg(args[n], XtNheight, 100); n++;
- XtSetArg(args[n], XtNwidth, 200); n++;
- XtSetValues(widget, args, n);
- .De
- .LP
- Alternatively, an application can statically declare the argument list
- and use
- .PN XtNumber :
- .LP
- .Ds
- .TA .5i 3i
- .ta .5i 3i
- static Args args[] = {
- {XtNheight, (XtArgVal) 100},
- {XtNwidth, (XtArgVal) 200},
- };
- XtSetValues(Widget, args, XtNumber(args));
- .De
- .LP
- Note that you should not use expressions with side effects such as
- auto-increment or auto-decrement
- within the first argument to
- .PN XtSetArg .
- .PN XtSetArg
- can be implemented as a macro that evaluates the first argument twice.
- .sp
- .LP
- To merge two
- arglist arrays, use
- .PN XtMergeArgLists .
- .IN "XtMergeArgLists" "" "@DEF@"
- .FD 0
- ArgList XtMergeArgLists(\fIargs1\fP, \fInum_args1\fP, \fIargs2\fP, \
- \fInum_args2\fP)
- .br
- ArgList \fIargs1\fP;
- .br
- Cardinal \fInum_args1\fP;
- .br
- ArgList \fIargs2\fP;
- .br
- Cardinal \fInum_args2\fP;
- .FN
- .IP \fIargs1\fP 1i
- Specifies the first argument list.
- .IP \fInum_args1\fP 1i
- Specifies the number of entries in the first argument list.
- .IP \fIargs2\fP 1i
- Specifies the second argument list.
- .IP \fInum_args2\fP 1i
- Specifies the number of entries in the second argument list.
- .LP
- The
- .PN XtMergeArgLists
- function allocates enough storage to hold the combined
- arglist arrays and copies them into it.
- Note that it does not check for duplicate entries.
- The length of the returned list is the sum of the lengths of the
- specified lists.
- When it is no longer needed,
- free the returned storage by using
- .PN XtFree .
- .sp
- .LP
- .IN "varargs" "" "@DEF@"
- All \*(xI interfaces that require
- .PN ArgList
- arguments have analogs
- conforming to the ANSI C variable argument list
- (traditionally called ``varargs'')
- calling convention. The name of the analog is formed by prefixing
- ``Va'' to the name of the corresponding
- .PN ArgList
- procedure; e.g.,
- .PN \%XtVaCreateWidget .
- Each procedure named \fBXtVa\fP\fIsomething\fP takes as its
- last arguments, in place of the corresponding
- .PN ArgList /
- .PN Cardinal
- parameters, a variable parameter list of resource name and
- value pairs where each name is of type
- .PN String
- and each value is of type
- .PN XtArgVal .
- The end of the list is identified by a \fIname\fP entry
- containing NULL. Developers writing in the C language wishing to pass
- resource name and value pairs to any of these interfaces may use the
- .PN ArgList
- and varargs forms interchangeably.
- .LP
- Two special names are defined for use only in varargs lists:
- .PN XtVaTypedArg
- and
- .PN XtVaNestedList .
- .sp
- .LP
- .IN "XtVaTypedArg" "" "@DEF@"
- .Ds 0
- #define XtVaTypedArg "XtVaTypedArg"
- .De
-
- If the name
- .PN XtVaTypedArg
- is specified in place of a resource
- name, then the following four arguments are interpreted as a
- \fIname/type/value/size\fP tuple \fIwhere\fP name is of type
- .PN String ,
- \fItype\fP is of type
- .PN String ,
- \fIvalue\fP is of type
- .PN XtArgVal ,
- and \fIsize\fP is of type int. When a varargs list containing
- .PN XtVaTypedArg
- is processed, a resource type
- conversion (see Section 9.6) is performed if necessary to convert the
- value into the format required by the associated resource. If \fItype\fP is
- XtRString then \fIvalue\fP contains a pointer to the string and \fIsize\fP
- contains the number of bytes allocated, including the trailing null
- byte. If \fItype\fP is not XtRString, then \fIif\fP size is
- less than or equal to
- \fBsizeof\fP(\fBXtArgVal\fP), the value should be the data cast to the type
- .PN XtArgVal ,
- otherwise \fIvalue\fP is a pointer to the data. If the type
- conversion fails for any reason, a warning message is issued and the
- list entry is skipped.
- .sp
- .LP
- .IN "XtVaNestedList" "" "@DEF@"
- .Ds 0
- #define XtVaNestedList "XtVaNestedList"
- .De
- .LP
- If the name
- .PN XtVaNestedList
- is specified in place of a resource name,
- then the following argument is interpreted as an
- .PN XtVarArgsList
- value, which specifies another
- varargs list that is logically inserted into the original list at the
- point of declaration. The end of the nested list is identified with a
- name entry containing NULL. Varargs lists may nest to any depth.
- .sp
- .LP
- To dynamically allocate a varargs list for use with
- .PN XtVaNestedList
- in multiple calls, use
- .PN XtVaCreateArgsList .
- .IN "XtVaCreateArgsList" "" "@DEF@"
- .sp
- .LP
- .Ds 0
- typedef XtPointer XtVarArgsList;
- .De
- .LP
- .FD 0
- XtVarArgsList XtVaCreateArgsList(\fIunused\fP, ...)
- .br
- XtPointer \fIunused\fP;
- .FN
- .IP \fIunused\fP 1i
- This argument is not currently used and must be specified as NULL.
- .IP ... 1i
- Specifies a variable parameter list of resource
- name and value pairs.
- .LP
- The
- .PN XtVaCreateArgsList
- function allocates memory and copies its arguments into a
- single list pointer, which may be used with
- .PN XtVaNestedList .
- The end of
- both lists is identified by a \fIname\fP entry containing NULL. Any entries
- of type
- .PN XtVaTypedArg
- are copied as specified without applying
- conversions. Data passed by reference (including Strings) are not
- copied, only the pointers themselves; the caller must ensure that the
- data remain valid for the lifetime of the created varargs list. The
- list should be freed using
- .PN XtFree
- when no longer needed.
- .LP
- Use of resource files and the resource database is generally
- encouraged over lengthy arglist or varargs lists whenever possible in
- order to permit modification without recompilation.
-
- .NH 3
- Creating a Widget Instance
- .XS
- \fB\*(SN Creating a Widget Instance\fP
- .XE
- .LP
- To create an instance of a widget, use
- .PN XtCreateWidget .
- .IN "XtCreateWidget" "" "@DEF@"
- .FD 0
- Widget XtCreateWidget(\fIname\fP, \fIobject_class\fP, \fIparent\fP, \
- \fIargs\fP, \fInum_args\fP)
- .br
- String \fIname\fP;
- .br
- WidgetClass \fIobject_class\fP;
- .br
- Widget \fIparent\fP;
- .br
- ArgList \fIargs\fP;
- .br
- Cardinal \fInum_args\fP;
- .FN
- .IP \fIname\fP 1i
- Specifies the resource instance name for the created widget,
- which is used for retrieving resources
- and, for that reason, should not be the same as any other widget
- that is a child of the same parent.
- .IP \fIobject_class\fP 1i
- Specifies the widget class pointer for the created object. \*(oC
- .IP \fIparent\fP 1i
- Specifies the parent widget. \*(oI
- .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
- The
- .PN XtCreateWidget
- function performs all the boilerplate operations of widget
- creation, doing the following in order:
- .IP \(bu 5
- Checks to see if the class_initialize procedure has been called for this class
- and for all superclasses and, if not, calls those necessary in a
- superclass-to-subclass order.
- .IP \(bu 5
- If the specified class is not
- .PN coreWidgetClass
- or a subclass thereof,
- and the parent's class is a subclass of
- .PN compositeWidgetClass
- and either no extension record in
- the parent's composite class part extension field exists with the
- \fIrecord_type\fP
- .PN \s-1NULLQUARK\s+1
- or the \fIaccepts_objects\fP field in the extension
- record is
- .PN False ,
- .PN XtCreateWidget
- issues a fatal error; see Section 3.1 and Chapter 12.
- .IP \(bu 5
- Allocates memory for the widget instance.
- .IP \(bu 5
- If the parent is a member of the class
- .PN constraintWidgetClass ,
- allocates memory for the parent's constraints
- and stores the address of this memory into the \fIconstraints\fP field.
- .IP \(bu 5
- Initializes the Core nonresource data fields
- (for example, \fIparent\fP and \fIvisible\fP).
- .IP \(bu 5
- Initializes the resource fields (for example, \fIbackground_pixel\fP)
- by using the
- .PN CoreClassPart
- resource lists specified for this class and all superclasses.
- .IP \(bu 5
- If the parent is a member of the class
- .PN constraintWidgetClass ,
- initializes the resource fields of the constraints record
- by using the
- .PN ConstraintClassPart
- resource lists specified for the parent's class
- and all superclasses up to
- .PN constraintWidgetClass .
- .IP \(bu 5
- Calls the initialize procedures for the widget starting at the
- Object
- initialize procedure on down to the widget's initialize procedure.
- .IP \(bu 5
- If the parent is a member of the class
- .PN compositeWidgetClass ,
- puts the widget into its parent's children list by calling its parent's
- insert_child procedure.
- For further information,
- see Section 3.1.
- .IP \(bu 5
- If the parent is a member of the class
- .PN constraintWidgetClass ,
- calls the
- .PN ConstraintClassPart
- initialize procedures,
- starting at
- .PN constraintWidgetClass
- on down to the parent's
- .PN ConstraintClassPart
- initialize procedure.
- .sp
- .LP
- To create an instance of a widget using varargs lists, use
- .PN XtVaCreateWidget .
- .IN "XtVaCreateWidget" "" "@DEF@"
- .FD 0
- Widget XtVaCreateWidget(\fIname\fP, \fIobject_class\fP, \fIparent\fP, ...)
- .br
- String \fIname\fP;
- .br
- WidgetClass \fIobject_class\fP;
- .br
- Widget \fIparent\fP;
- .FN
- .IP \fIname\fP 1i
- Specifies the resource name for the created widget.
- .IP \fIobject_class\fP 1i
- Specifies the widget class pointer for the created object. \*(oC
- .IP \fIparent\fP 1i
- Specifies the parent widget. \*(oI
- .IP ... 1i
- Specifies the variable argument list to override any other
- resource specifications.
- .LP
- The
- .PN XtVaCreateWidget
- procedure is identical in function to
- .PN XtCreateWidget
- with the \fIargs\fP and \fInum_args\fP parameters replaced by a varargs list,
- as described
- in Section 2.5.1.
-
- .NH 3
- Creating an Application Shell Instance
- .XS
- \fB\*(SN Creating an Application Shell Instance\fP
- .XE
- .LP
- An application can have multiple top-level widgets, each of which
- specifies a unique widget tree
- which can potentially be on different screens or displays.
- An application uses
- .PN XtAppCreateShell
- to create independent widget trees.
- .LP
- .IN "XtAppCreateShell" "" "@DEF@"
- .FD 0
- Widget XtAppCreateShell(\fIname\fP, \
- \fIapplication_class\fP, \fIwidget_class\fP, \fIdisplay\fP,
- .br
- \fIargs\fP, \fInum_args\fP)
- .br
- String \fIname\fP;
- .br
- String \fIapplication_class\fP;
- .br
- WidgetClass \fIwidget_class\fP;
- .br
- Display *\fIdisplay\fP;
- .br
- ArgList \fIargs\fP;
- .br
- Cardinal \fInum_args\fP;
- .FN
- .IP \fIname\fP 1.25i
- Specifies the instance name of the shell widget.
- If \fIname\fP is NULL,
- the application name passed to
- .PN XtDisplayInitialize
- is used.
- .IP \fIapplication_class\fP 1.25i
- Specifies the resource class string to be used in
- place of the widget \fIclass_name\fP string when
- \fIwidget_class\fP is
- .PN applicationShellWidgetClass
- or a subclass thereof.
- .IP \fIwidget_class\fP 1.25i
- Specifies the widget class for the top-level widget (e.g.,
- .PN applicationShellWidgetClass )
- .IP \fIdisplay\fP 1.25i
- Specifies the display for the default screen
- and for the resource database used to retrieve
- the shell widget resources.
- .IP \fIargs\fP 1.25i
- Specifies the argument list to override any other resource specifications.
- .IP \fInum_args\fP 1.25i
- Specifies the number of entries in the argument list.
-
- .LP
- The
- .PN XtAppCreateShell
- function
- creates a new shell widget instance as the root of a widget tree.
- The screen resource for this widget is determined by first scanning
- \fIargs\fP for the XtNscreen argument. If no XtNscreen argument is
- found, the resource database associated with the default screen of
- the specified display is queried for the resource \fIname\fP.screen,
- class \fIClass\fP.Screen where \fIClass\fP is the specified
- \fIapplication_class\fP if \fIwidget_class\fP is
- .PN applicationShellWidgetClass
- or a subclass thereof. If \fIwidget_class\fP is not
- .PN application\%Shell\%Widget\%Class
- or a subclass, \fIClass\fP is the \fIclass_name\fP
- field from the
- .PN CoreClassPart
- of the specified \fIwidget_class\fP.
- If this query fails, the default
- screen of the specified display is used. Once the screen is determined,
- the resource database associated with that screen is used to retrieve
- all remaining resources for the shell widget not specified in
- \fIargs\fP. The widget name and \fIClass\fP as determined above are
- used as the leftmost (i.e., root) components in all fully qualified
- resource names for objects within this widget tree.
-
- .LP
- If the specified widget class is a subclass of WMShell, the name and
- \fIClass\fP as determined above will be stored into the
- .PN WM_CLASS
- property on the widget's window when it becomes realized.
- If the specified \fIwidget_class\fP is
- .PN applicationShellWidgetClass
- or a subclass thereof the
- .PN WM_COMMAND
- property will also be set from the values of the XtNargv and
- XtNargc resources.
-
- .LP
- To create multiple top-level shells within a single (logical)
- application,
- you can use one of two methods:
- .IP \(bu 5
- Designate one shell as the real top-level shell and
- create the others as pop-up children of it by using
- .PN XtCreatePopupShell .
- .IP \(bu 5
- Have all shells as pop-up children of an unrealized top-level shell.
- .LP
- The first method,
- which is best used when there is a clear choice for what is the main window,
- leads to resource specifications like the following:
- .LP
- .Ds
- .TA 2i
- .ta 2i
- xmail.geometry:... (the main window)
- xmail.read.geometry:... (the read window)
- xmail.compose.geometry:... (the compose window)
- .De
- .LP
- The second method,
- which is best if there is no main window,
- leads to resource specifications like the following:
- .LP
- .Ds
- .TA 2i
- .ta 2i
- xmail.headers.geometry:... (the headers window)
- xmail.read.geometry:... (the read window)
- xmail.compose.geometry:... (the compose window)
- .De
- .sp
- .LP
- To create a top-level widget that is the root of a widget tree using
- varargs lists, use
- .PN XtVaAppCreateShell .
- .IN "XtVaAppCreateShell" "" "@DEF@"
- .FD 0
- Widget XtVaAppCreateShell(\fIname\fP, \fIapplication_class\fP, \
- \fIwidget_class\fP, \fIdisplay\fP, ...)
- .br
- String \fIname\fP;
- .br
- String \fIapplication_class\fP;
- .br
- WidgetClass \fIwidget_class\fP;
- .br
- Display *\fIdisplay\fP;
- .FN
- .IP \fIname\fP 1i
- Specifies the instance name of the shell widget.
- If \fIname\fP is NULL,
- the application name passed to
- .PN XtDisplayInitialize
- is used.
- .IP \fIapplication_class\fP 1i
- Specifies the resource class string to be used in
- place of the widget \fIclass_name\fP string when
- \fIwidget_class\fP is
- .PN applicationShellWidgetClass
- or a subclass thereof.
- .IP \fIwidget_class\fP 1i
- Specifies the widget class for the top-level widget.
- .IP \fIdisplay\fP 1i
- Specifies the display for the default screen
- and for the resource database used to retrieve
- the shell widget resources.
- .IP ... 1i
- Specifies the variable argument list to override any other
- resource specifications.
- .LP
- The
- .PN XtVaAppCreateShell
- procedure is identical in function to
- .PN XtAppCreateShell
- with the \fIargs\fP and \fInum_args\fP parameters replaced by a varargs list, as
- described in Section 2.5.1.
-
- .NH 3
- Convenience Procedure to Initialize an Application
- .XS
- \fB\*(SN Convenience Procedure to Initialize an Application\fP
- .XE
- .LP
- To initialize the \*(xI internals, create an application context,
- open and initialize a display, and create the initial application shell
- instance, an application may use
- .PN XtAppInitialize
- or
- .PN XtVaAppInitialize .
- .IN "XtVaAppInitialize" "" "@DEF@"
- .FD 0
- Widget XtAppInitialize(\fIapp_context_return\fP, \fIapplication_class\fP, \
- \fIoptions\fP, \fInum_options\fP,
- .br
- \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
- XrmOptionDescList \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_context_return\fP 1.5i
- Returns the application context, if non-NULL.
- .IP \fIapplication_class\fP 1.5i
- Specifies the class name of the application.
- .IP \fIoptions\fP 1.5i
- Specifies the command line options table.
- .IP \fInum_options\fP 1.5i
- Specifies the number of entries in \fIoptions\fP.
- .IP \fIargc_in_out\fP 1.5i
- Specifies a pointer to the number of command line arguments.
- .IP \fIargv_in_out\fP 1.5i
- Specifies a pointer to the command line arguments.
- .IP \fIfallback_resources\fP 1.5i
- Specifies resource values to be used if the application class resource
- file cannot be opened or read, or NULL.
- .IP \fIargs\fP 1.5i
- Specifies the argument list to override any
- other resource specifications for the created shell widget.
- .IP \fInum_args\fP 1.5i
- Specifies the number of entries in the argument list.
- .LP
- The
- .PN XtAppInitialize
- function calls
- .PN XtToolkitInitialize
- followed by
- .PN XtCreateApplicationContext ,
- then calls
- .PN XtOpenDisplay
- with \fIdisplay_string\fP NULL and
- \fIapplication_name\fP NULL, and finally calls
- .PN XtAppCreateShell
- with \fIapplication_name\fP NULL, \fIwidget_class\fP
- .PN application\%Shell\%Widget\%Class ,
- and the specified \fIargs\fP and \fInum_args\fP
- and returns the created shell. The modified \fIargc\fP and \fIargv\fP returned by
- .PN XtDisplayInitialize
- are returned in \fIargc_in_out\fP and \fIargv_in_out\fP. If
- \fIapp_context_return\fP is not NULL, the created application context is
- also returned. If the display specified by the command line cannot be
- opened, an error message is issued and
- .PN XtAppInitialize
- terminates the application. If \fIfallback_resources\fP is non-NULL,
- .PN XtAppSetFallbackResources
- is called with the value prior to calling
- .PN XtOpenDisplay .
- .sp
- .LP
- .IN "XtVaAppInitialize" "" "@DEF@"
- .FD 0
- Widget XtVaAppInitialize(\fIapp_context_return\fP, \fIapplication_class\fP, \
- \fIoptions\fP, \fInum_options\fP,
- .br
- \fIargc_in_out\fP, \fIargv_in_out\fP, \
- \fIfallback_resources\fP, ...)
- .br
- XtAppContext *\fIapp_context_return\fP;
- .br
- String \fIapplication_class\fP;
- .br
- XrmOptionDescList \fIoptions\fP;
- .br
- Cardinal \fInum_options\fP;
- .br
- int *\fIargc_in_out\fP;
- .br
- String *\fIargv_in_out\fP;
- .br
- String *\fIfallback_resources\fP;
- .FN
- .IP \fIapp_context_return\fP 1.5i
- Returns the application context, if non-NULL.
- .IP \fIapplication_class\fP 1.5i
- Specifies the class name of the application.
- .IP \fIoptions\fP 1.5i
- Specifies the command line options table.
- .IP \fInum_options\fP 1.5i
- Specifies the number of entries in \fIoptions\fP.
- .IP \fIargc_in_out\fP 1.5i
- Specifies a pointer to the number of command line arguments.
- .IP \fIargv_in_out\fP 1.5i
- Specifies the command line arguments array.
- .IP \fIfallback_resources\fP 1.5i
- Specifies resource values to be used if the application class
- resource file cannot be opened, or NULL.
- .IP ... 1.5i
- Specifies the variable argument list to override any other
- resource specifications for the created shell.
- .LP
- The
- .PN XtVaAppInitialize
- procedure is identical in function to
- .PN XtAppInitialize
- with the \fIargs\fP and \fInum_args\fP parameters replaced by a varargs list,
- as described
- in Section 2.5.1.
-
- .NH 3
- Widget Instance Initialization: the initialize Procedure
- .XS
- \*(SN Widget Instance Initialization: the initialize Procedure
- .XE
- .IN "Initialization"
- .IN "Chaining"
- .IN "Superclass Chaining"
- .IN "Inheritance"
- .LP
- The initialize procedure pointer in a widget class is of type
- .PN XtInitProc .
- .IN "XtInitProc" "" "@DEF@"
- .IN "initialize procedure" "" "@DEF@"
- .FD 0
- typedef void (*XtInitProc)(Widget, Widget, ArgList, Cardinal*);
- .br
- Widget \fIrequest\fP;
- .br
- Widget \fInew\fP;
- .br
- ArgList \fIargs\fP;
- .br
- Cardinal *\fInum_args\fP;
- .FN
- .IP \fIrequest\fP 1i
- Specifies a copy of the widget with resource values as requested by the
- argument list, the resource database, and the widget defaults.
- .IP \fInew\fP 1i
- Specifies the widget with the new values, both resource and nonresource,
- that are actually allowed.
- .IP \fIargs\fP 1i
- Specifies the argument list passed by the client, for
- computing derived resource values.
- If the client created the widget using a varargs form, any resources
- specified via
- .PN XtVaTypedArg
- are converted to the widget representation and the list is transformed
- into the
- .PN ArgList
- format.
- .IP \fInum_args\fP 1i
- Specifies the number of entries in the argument list.
- .LP
- An initialization procedure performs the following:
- .IP \(bu 5
- Allocates space for and copies any resources referenced by address
- that the client is allowed to free or modify
- after the widget has been created.
- For example,
- if a widget has a field that is a
- .PN String ,
- it may choose not to
- depend on the characters at that address remaining constant
- but dynamically allocate space for the string and copy it to the new space.
- Widgets that do not copy one or more resources referenced
- by address should clearly so state in their user documentation.
- .NT
- It is not necessary to allocate space for or to copy callback lists.
- .NE
- .IP \(bu 5
- Computes values for unspecified resource fields.
- For example, \fIif\fP width and \fIheight\fP are zero,
- the widget should compute an appropriate width and height
- based on its other resources.
- .NT
- A widget may only directly assign
- its own \fIwidth\fP and \fIheight\fP within the initialize, initialize_hook,
- set_values and
- set_values_hook procedures; see Chapter 6.
- .NE
- .IP \(bu 5
- Computes values for uninitialized nonresource fields that are derived from
- resource fields.
- For example, graphics contexts (GCs) that the widget uses are derived from
- resources like background, foreground, and font.
- .LP
- An initialization procedure also can check certain fields for
- internal consistency.
- For example, it makes no sense to specify a colormap for a depth
- that does not support that colormap.
- .LP
- Initialization procedures are called in superclass-to-subclass order
- after all fields specified in the resource lists have been
- initialized. The initialize procedure does not need to examine
- \fIargs\fP and \fInum_args\fP
- if all public resources are declared in the resource list.
- Most of the initialization code for a specific widget class deals with fields
- defined in that class and not with fields defined in its superclasses.
- .LP
- If a subclass does not need an initialization procedure
- because it does not need to perform any of the above operations,
- it can specify NULL for the \fIinitialize\fP field in the class record.
- .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 initialize
- 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.
- .LP
- The \fIrequest\fP and \fInew\fP arguments provide the necessary information for
- a subclass to determine the difference between an explicitly specified field
- and a field computed by a superclass.
- The \fIrequest\fP widget is a copy of the widget as initialized by the
- arglist and resource database.
- The \fInew\fP widget starts with the values in the request,
- but it has been updated by all superclass initialization procedures called
- so far.
- A subclass initialize procedure can compare these two to resolve
- any potential conflicts.
- .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.
- .LP
- The \fInew\fP widget will become the actual widget instance record.
- Therefore,
- the initialization procedure should do all its work on the \fInew\fP widget;
- the \fIrequest\fP widget should never be modified.
- If the initialize procedure
- needs to call any routines that operate on a widget,
- it should specify \fInew\fP as the widget instance.
-
- .NH 3
- Constraint Instance Initialization: the ConstraintClassPart initialize Procedure
- .XS
- \*(SN Constraint Instance Initialization: the ConstraintClassPart initialize Procedure
- .XE
- .IN "Initialization"
- .IN "XtInitProc"
- .IN "initialize procedure"
- .IN "Chaining"
- .IN "Superclass Chaining"
- .IN "Inheritance"
- .LP
- The constraint initialization procedure pointer, found in the
- .PN ConstraintClassPart
- \fIinitialize\fP field of the widget class record, is of type
- .PN XtInitProc .
- The values passed to the parent constraint initialization procedures
- are the same as those passed to the child's class widget initialization
- procedures.
- .LP
- The \fIconstraints\fP field of the \fIrequest\fP widget points to a copy of the
- constraints record as initialized by the arglist and resource database.
- .LP
- The constraint initialization procedure should compute any constraint fields
- derived from constraint resources.
- It can make further changes to the \fInew\fP widget to make the widget
- and any other constraint fields
- conform to the specified constraints, for example,
- changing the widget's size or position.
- .LP
- If a constraint class does not need a constraint initialization procedure,
- it can specify NULL for the \fIinitialize\fP field of the
- .PN ConstraintClassPart
- in the class record.
-
- .NH 3
- Nonwidget Data Initialization: the initialize_hook Procedure
- .XS
- \*(SN Nonwidget Data Initialization: the initialize_hook Procedure
- .XE
- .IN "Initialization"
- .LP
- .NT
- The initialize_hook procedure is obsolete, as the same information
- is now available to the initialize procedure. The procedure has been
- retained for those widgets that used it in previous releases.
- .NE
- .LP
- The initialize_hook procedure pointer is of type
- .PN XtArgsProc :
- .IN "initialize_hook procedure" "" "@DEF@"
- .IN "XtArgsProc" "" "@DEF@"
- .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.
- .IP \fIargs\fP 1i
- Specifies the argument list passed by the client.
- If the client created the widget using a varargs form, any resources
- specified via
- .PN XtVaTypedArg
- are converted to the widget representation and the list is transformed
- into the
- .PN ArgList
- format.
- .IP \fInum_args\fP 1i
- Specifies the number of entries in the argument list.
- .LP
- If this procedure is not NULL,
- it is called immediately after the corresponding initialize
- procedure or in its place if the \fIinitialize\fP field is NULL.
- .LP
- The initialize_hook procedure allows a widget instance to initialize
- nonresource data using information from the specified argument list
- as if it were a resource.
-
- .NH 2
- Realizing Widgets
- .XS
- \fB\*(SN Realizing Widgets\fP
- .XE
- .LP
- To realize a widget instance, use
- .PN XtRealizeWidget .
- .IN "XtRealizeWidget" "" "@DEF@"
- .FD 0
- void XtRealizeWidget(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(cI
- .LP
- If the widget is already realized,
- .PN XtRealizeWidget
- simply returns.
- Otherwise it performs the following:
- .IP \(bu 5
- Binds all action names in the widget's
- translation table to procedures (see Section 10.1.2).
- .IP \(bu 5
- Makes a postorder traversal of the widget tree rooted
- at the specified widget and calls each non-NULL change_managed procedure
- of all composite widgets that have one or more managed children.
- .IP \(bu 5
- Constructs an
- .PN XSetWindowAttributes
- structure filled in with information derived from the
- Core
- widget fields and calls the realize procedure for the widget,
- which adds any widget-specific attributes and creates the X window.
- .IP \(bu 5
- If the widget is
- not a subclass of
- .PN compositeWidgetClass ,
- .PN XtRealizeWidget
- returns; otherwise it continues and performs the following:
- .RS
- .IP \- 5
- Descends recursively to each of the widget's
- managed children and calls the realize procedures.
- Primitive widgets that instantiate children are responsible for realizing
- those children themselves.
- .IP \- 5
- Maps all of the managed children windows that have \fImapped_when_managed\fP
- .PN True .
- If a widget is managed but \fImapped_when_managed\fP is
- .PN False ,
- the widget is allocated visual space but is not displayed.
- .RE
- .LP
- If the widget is a top-level shell widget (that is, it has no parent), and
- \fImapped_when_managed\fP is
- .PN True ,
- .PN XtRealizeWidget
- maps the widget window.
- .LP
- .PN XtCreateWidget ,
- .PN XtVaCreateWidget ,
- .PN XtRealizeWidget ,
- .PN XtManageChildren ,
- .PN XtUnmanage\%Children ,
- .PN XtUnrealizeWidget ,
- .PN XtSetMappedWhenManaged ,
- and
- .PN XtDestroy\%Widget
- maintain the following invariants:
- .IP \(bu 5
- If a composite widget is realized, then all its managed children are realized.
- .IP \(bu 5
- If a composite widget is realized, then all its managed children that have
- \fImapped_when_managed\fP
- .PN True
- are mapped.
- .LP
- All \*(xI functions and all widget routines should accept
- either realized or unrealized widgets.
- When calling the realize or change_managed
- procedures for children of a composite
- widget,
- .PN XtRealizeWidget
- calls the procedures in reverse order of
- appearance in the
- .PN CompositePart
- \fIchildren\fP list. By default, this
- ordering of the realize procedures will
- result in the stacking order of any newly created subwindows being
- top-to-bottom in the order of appearance on the list, and the most
- recently created child will be at the bottom.
- .sp
- .LP
- To check whether or not a widget has been realized, use
- .PN XtIsRealized .
- .IN "XtIsRealized" "" "@DEF@"
- .FD 0
- Boolean XtIsRealized(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(oI
- .LP
- The
- .PN XtIsRealized
- function returns
- .PN True
- if the widget has been realized,
- that is, if the widget has a nonzero window ID.
- If the specified object is not a widget, the state of the nearest
- widget ancestor is returned.
- .LP
- Some widget procedures (for example, set_values) might wish to
- operate differently
- after the widget has been realized.
-
- .NH 3
- Widget Instance Window Creation: the realize Procedure
- .XS
- \*(SN Widget Instance Window Creation: the realize Procedure
- .XE
- .LP
- The realize procedure pointer in a widget class is of type
- .PN XtRealizeProc .
- .IN "XtRealizeProc" "" "@DEF@"
- .FD 0
- typedef void (*XtRealizeProc)(Widget, XtValueMask*, XSetWindowAttributes*);
- .br
- Widget \fIw\fP;
- .br
- XtValueMask *\fIvalue_mask\fP;
- .br
- XSetWindowAttributes *\fIattributes\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget.
- .IP \fIvalue_mask\fP 1i
- Specifies which fields in the \fIattributes\fP structure are used.
- .IP \fIattributes\fP 1i
- Specifies the window attributes to use in the
- .PN XCreateWindow
- call.
- .LP
- The realize procedure must create the widget's window.
- .LP
- Before calling the class realize procedure, the generic
- .PN XtRealizeWidget
- function fills in a mask and a corresponding
- .PN XSetWindowAttributes
- structure.
- It sets the following fields in \fIattributes\fP and
- corresponding bits in \fIvalue_mask\fP
- based on information in the widget
- core
- structure:
- .IP \(bu 5
- The \fIbackground_pixmap\fP (or \fIbackground_pixel\fP if \fIbackground_pixmap\fP is
- .PN XtUnspecifiedPixmap )
- is filled in from the corresponding field.
- .IP \(bu 5
- The \fIborder_pixmap\fP (or \fIborder_pixel\fP if \fIborder_pixmap\fP is
- .PN XtUnspecifiedPixmap )
- is filled in from the corresponding field.
- .IP \(bu 5
- The \fIcolormap\fP is filled in from the corresponding field.
- .IP \(bu 5
- The \fIevent_mask\fP is filled in based on the event handlers registered,
- the event translations specified, whether the \fIexpose\fP field is non-NULL,
- and whether \fIvisible_interest\fP is
- .PN True .
- .IP \(bu 5
- The \fIbit_gravity\fP is set to
- .PN NorthWestGravity
- if the \fIexpose\fP field is NULL.
- .LP
- These or any other fields in attributes and the corresponding bits in
- \fIvalue_mask\fP can be set by the realize procedure.
- .LP
- Note that because realize is not a chained operation,
- the widget class realize procedure must update the
- .PN XSetWindowAttributes
- structure with all the appropriate fields from
- non-Core
- superclasses.
- .LP
- .IN "Inheritance"
- A widget class can inherit its realize procedure from its superclass
- during class initialization.
- The realize procedure defined for
- .PN coreWidgetClass
- calls
- .PN XtCreateWindow
- with the passed \fIvalue_mask\fP and \fIattributes\fP
- and with \fIwindow_class\fP and \fIvisual\fP set to
- .PN CopyFromParent .
- Both
- .PN compositeWidgetClass
- and
- .PN constraintWidgetClass
- inherit this realize procedure, and most new widget subclasses
- can do the same (see Section 1.6.10).
- .LP
- The most common noninherited realize procedures set \fIbit_gravity\fP in the mask
- and attributes to the appropriate value and then create the window.
- For example, depending on its justification, Label might set \fIbit_gravity\fP to
- .PN WestGravity ,
- .PN CenterGravity ,
- or
- .PN EastGravity .
- Consequently, shrinking it would just move the bits appropriately,
- and no
- exposure
- event is needed for repainting.
- .LP
- If a composite widget's children should be realized in an order other
- than that specified
- (to control the stacking order, for example),
- it should call
- .PN XtRealizeWidget
- on its children itself in the appropriate order from within its own
- realize procedure.
- .LP
- Widgets that have children and whose class is not a subclass of
- .PN compositeWidgetClass
- are responsible for calling
- .PN XtRealizeWidget
- on their children, usually from within the realize procedure.
-
- .NH 3
- Window Creation Convenience Routine
- .XS
- \*(SN Window Creation Convenience Routine
- .XE
- .LP
- Rather than call the Xlib
- .PN XCreateWindow
- .IN "realize procedure"
- function explicitly, a realize procedure should normally call the \*(xI analog
- .PN XtCreateWindow ,
- which simplifies the creation of windows for widgets.
- .IN "XtCreateWindow" "" "@DEF@"
- .FD 0
- void XtCreateWindow(\fIw\fP, \fIwindow_class\fP, \fIvisual\fP, \
- \fIvalue_mask\fP, \fIattributes\fP)
- .br
- Widget \fIw\fP;
- .br
- unsigned int \fIwindow_class\fP;
- .br
- Visual *\fIvisual\fP;
- .br
- XtValueMask \fIvalue_mask\fP;
- .br
- XSetWindowAttributes *\fIattributes\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget that defines the additional window attributed. \*(cI
- .IP \fIwindow_class\fP 1i
- Specifies the Xlib window class (for example,
- .PN InputOutput ,
- .PN InputOnly ,
- or
- .PN CopyFromParent ).
- .IP \fIvisual\fP 1i
- Specifies the visual type (usually
- .PN CopyFromParent ).
- .ds Vm attribute fields to use
- .IP \fIvalue_mask\fP 1i
- Specifies which fields in the \fIattributes\fP structure are used.
- .IP \fIattributes\fP 1i
- Specifies the window attributes to use in the
- .PN XCreateWindow
- call.
- .LP
- The
- .PN XtCreateWindow
- function calls the Xlib
- .PN XCreateWindow
- function with values from the widget structure and the passed parameters.
- Then, it assigns the created window to the widget's \fIwindow\fP field.
- .LP
- .PN XtCreateWindow
- evaluates the following fields of the widget core
- structure: \fIdepth\fP, \fIscreen\fP, \fIparent->core.window\fP, \fIx\fP,
- \fIy\fP, \fIwidth\fP, \fIheight\fP, and
- \fIborder_width\fP.
-
- .NH 2
- Obtaining Window Information from a Widget
- .XS
- \fB\*(SN Obtaining Window Information from a Widget\fP
- .XE
- .LP
- The
- Core
- widget class definition contains the screen and window ids.
- The \fIwindow\fP field may be NULL for a while
- (see Sections 2.5 and 2.6).
- .LP
- The display pointer, the parent widget, screen pointer,
- and window of a widget are available to the widget writer by means of macros
- and to the application writer by means of functions.
- .sp
- .IN "XtDisplay" "" "@DEF@"
- .FD 0
- Display *XtDisplay(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(cI
- .LP
- .PN XtDisplay
- returns the display pointer for the specified widget.
- .sp
- .LP
- .IN "XtParent" "" "@DEF@"
- .FD 0
- Widget XtParent(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(oI
- .LP
- .PN XtParent
- returns the parent object for the specified widget. The returned object
- will be of class Object or a subclass.
- .sp
- .LP
- .IN "XtScreen" "" "@DEF@"
- .FD 0
- Screen *XtScreen(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(cI
- .LP
- .PN XtScreen
- returns the screen pointer for the specified widget.
- .sp
- .LP
- .IN "XtWindow" "" "@DEF@"
- .FD 0
- Window XtWindow(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(cI
- .LP
- .PN XtWindow
- returns the window of the specified widget.
- .sp
- .LP
- The display pointer, screen pointer, and window of a widget or
- of the closest widget ancestor of a nonwidget object are available
- by means of
- .PN XtDisplayOfObject ,
- .PN XtScreenOfObject ,
- and
- .PN XtWindowOfObject .
- .IN "XtDisplayOfObject" "" "@DEF@"
- .sp
- .LP
- .FD 0
- Display *XtDisplayOfObject(\fIobject\fP)
- .br
- Widget \fIobject\fP;
- .FN
- .IP \fIobject\fP 1i
- Specifies the object. \*(oI
- .LP
- .PN XtDisplayOfObject
- is identical in function to
- .PN XtDisplay
- if the object is a widget; otherwise
- .PN XtDisplayOfObject
- returns the display
- pointer for the nearest ancestor of \fIobject\fP that is of class
- Widget or a subclass thereof.
- .sp
- .IN "XtScreenOfObject" "" "@DEF@"
- .FD 0
- Screen *XtScreenOfObject(\fIobject\fP)
- .br
- Widget \fIobject\fP;
- .FN
- .IP \fIobject\fP 1i
- Specifies the object. \*(oI
- .LP
- .PN XtScreenOfObject
- is identical in function to
- .PN XtScreen
- if the object is a widget; otherwise
- .PN XtScreenOfObject
- returns the screen pointer
- for the nearest ancestor of \fIobject\fP that is of class
- Widget or a subclass thereof.
- .sp
- .IN "XtWindowOfObject" "" "@DEF@"
- .FD 0
- Window XtWindowOfObject(\fIobject\fP)
- .br
- Widget \fIobject\fP;
- .FN
- .IP \fIobject\fP 1i
- Specifies the object. \*(oI
- .LP
- .PN XtWindowOfObject
- is identical in function to
- .PN XtWindow
- if the object is a widget; otherwise
- .PN XtWindowOfObject
- returns the window for the nearest ancestor of \fIobject\fP that is of class
- Widget or a subclass thereof.
- .sp
- .LP
- To retrieve the instance name of an object, use
- .PN XtName .
- .IN "XtName" "" "@DEF@"
- .FD 0
- String XtName(\fIobject\fP)
- .br
- Widget \fIobject\fP;
- .FN
- .IP \fIobject\fP 1i
- Specifies the object whose name is desired. \*(oI
- .LP
- .PN XtName
- returns a pointer to the instance name of the specified object.
- The storage is owned by the \*(xI and must not be modified. The
- name is not qualified by the names of any of the object's ancestors.
- .LP
- Several window attributes are locally cached in the widget instance.
- Thus, they can be set by the resource manager and
- .PN XtSetValues
- as well as used by routines that derive structures from these values
- (for example, \fIdepth\fP for deriving pixmaps,
- \fIbackground_pixel\fP for deriving GCs, and so on) or in the
- .PN XtCreateWindow
- call.
- .LP
- The \fIx\fP, \fIy\fP, \fIwidth\fP, \fIheight\fP, and \fIborder_width\fP
- window attributes are available to
- geometry managers.
- These fields are maintained synchronously inside the \*(xI.
- When an
- .PN XConfigureWindow
- is issued by the \*(xI on the widget's window (on request of its parent),
- these values are updated immediately rather than some time later
- when the server generates a
- .PN ConfigureNotify
- event.
- (In fact, most widgets do not select
- .PN SubstructureNotify
- events.)
- This ensures that all geometry calculations are based on the internally
- consistent toolkit world rather than on either
- an inconsistent world updated by asynchronous
- .PN ConfigureNotify
- events or a consistent but slow world in which geometry managers ask the server
- for window sizes whenever they need to lay out their managed children
- (see Chapter 6).
-
- .NH 3
- Unrealizing Widgets
- .XS
- \fB\*(SN Unrealizing Widgets\fP
- .XE
- .LP
- To destroy the windows associated with a widget and its
- non-pop-up descendants, use
- .PN XtUnrealizeWidget .
- .IN "XtUnrealizeWidget" "" "@DEF@"
- .FD 0
- void XtUnrealizeWidget(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(cI
- .LP
- If the widget is currently unrealized,
- .PN XtUnrealizeWidget
- simply returns. Otherwise it performs the following:
- .IP \(bu 5
- Unmanages the widget if the widget is managed.
- .IP \(bu 5
- Makes a postorder (child-to-parent) traversal of the widget tree
- rooted at the specified widget and, for each widget that has
- declared a callback list resource named ``unrealizeCallback'', executes the
- procedures on the
- .IN XtNunrealizeCallback
- XtNunrealizeCallback
- list.
- .IN "unrealizeCallback" "" "@DEF@"
- .IP \(bu 5
- Destroys the widget's window and any subwindows by calling
- .PN XDestroyWindow
- with the specified widget's \fIwindow\fP field.
- .LP
- Any events in the queue or which arrive following a call to
- .PN XtUnrealizeWidget
- will be dispatched as if the window(s) of the
- unrealized widget(s) had never existed.
-
- .NH 2
- Destroying Widgets
- .XS
- \fB\*(SN Destroying Widgets\fP
- .XE
- .LP
- The \*(xI provide support
- .IP \(bu 5
- To destroy all the pop-up children of the widget being destroyed
- and destroy all children of composite widgets.
- .IP \(bu 5
- To remove (and unmap) the widget from its parent.
- .IP \(bu 5
- To call the callback procedures that have been registered to trigger
- when the widget is destroyed.
- .IP \(bu 5
- To minimize the number of things a widget has to deallocate when destroyed.
- .IP \(bu 5
- To minimize the number of
- .PN XDestroyWindow
- calls when destroying a widget tree.
- .sp
- .LP
- To destroy a widget instance, use
- .PN XtDestroyWidget .
- .IN "XtDestroyWidget" "" "@DEF@"
- .FD 0
- void XtDestroyWidget(\fIw\fP)
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP 1i
- Specifies the widget. \*(oI
- .LP
- The
- .PN XtDestroyWidget
- function provides the only method of destroying a widget,
- including widgets that need to destroy themselves.
- It can be called at any time,
- including from an application callback routine of the widget being destroyed.
- This requires a two-phase destroy process in order to avoid dangling
- references to destroyed widgets.
- .LP
- In phase 1,
- .PN XtDestroyWidget
- performs the following:
- .IP \(bu 5
- If the \fIbeing_destroyed\fP field of the widget is
- .PN True ,
- it returns immediately.
- .IP \(bu 5
- Recursively descends the widget tree and
- sets the \fIbeing_destroyed\fP field to
- .PN True
- for the widget and all normal and pop-up children.
- .IP \(bu 5
- Adds the widget to a list of widgets (the destroy list) that should be
- destroyed when it is safe to do so.
- .LP
- Entries on the destroy list satisfy the invariant that
- if w2 occurs after w1 on the destroy list, then w2 is not a descendent,
- either normal or pop-up, of w1.
- .LP
- Phase 2 occurs when all procedures that should execute as a result of
- the current event have been called, including all procedures registered with
- the event and translation managers,
- that is, when the current invocation of
- .PN XtDispatchEvent
- is about to return, or immediately if not in
- .PN XtDispatchEvent .
- .LP
- In phase 2,
- .PN XtDestroyWidget
- performs the following on each entry in the destroy list in the order
- specified:
- .IP \(bu 5
- Calls the destroy callback procedures registered on the widget
- and all normal and pop-up descendants in postorder (it calls child
- callbacks before parent callbacks).
- .IP \(bu 5
- If the widget is not a pop-up child and the widget's parent is a subclass of
- .PN composite\%WidgetClass ,
- and if the parent is not being destroyed,
- it calls
- .PN XtUnmanageChild
- on the widget and then calls the widget's parent's delete_child procedure
- (see Section 3.3).
- .IP \(bu 5
- If the widget is not a pop-up child and the widget's parent is a subclass of
- .PN constraint\%WidgetClass ,
- it calls the
- .PN ConstraintClassPart
- destroy procedure for the parent,
- then for the parent's superclass,
- until finally it calls the
- .PN ConstraintClassPart
- destroy procedure for
- .PN constraintWidgetClass .
- .IP \(bu 5
- Calls the destroy procedures
- for the widget and all normal and pop-up descendants
- in postorder.
- For each such widget,
- it calls the
- .PN CoreClassPart
- destroy procedure declared in the widget class,
- then the destroy procedure declared in its superclass,
- until finally it calls the destroy procedure declared in the Object
- class record.
- .IP \(bu 5
- Calls
- .PN XDestroyWindow
- if the specified widget is realized (that is, has an X window).
- The server recursively destroys all normal descendant windows.
- .IP \(bu 5
- Recursively descends the tree and destroys the windows for all
- realized pop-up descendants,
- deallocates all pop-up descendants, constraint
- records, callback lists, and if the widget's class is a subclass of
- .PN compositeWidgetClass ,
- children.
-
- .NH 3
- Adding and Removing Destroy Callbacks
- .XS
- \fB\*(SN Adding and Removing Destroy Callbacks\fP
- .XE
- .LP
- When an application needs to perform additional processing during the
- destruction of a widget,
- it should register a destroy callback procedure for the widget.
- The destroy callback procedures use the mechanism described in Chapter 8.
- .IN "Destroy Callbacks"
- The destroy callback list is identified by the resource name
- XtNdestroyCallback.
- .LP
- For example, the following adds an application-supplied destroy callback
- procedure \fIClientDestroy\fP with client data to a widget by calling
- .PN XtAddCallback .
- .IN "XtAddCallback"
- .Ds
- XtAddCallback(\fIw\fP, XtNdestroyCallback, \fIClientDestroy\fP, \fIclient_data\fP)
- .De
- .LP
- Similarly, the following removes the application-supplied destroy callback
- procedure \fIClientDestroy\fP by calling
- .PN XtRemoveCallback .
- .IN "XtRemoveCallback"
- .Ds
- XtRemoveCallback(\fIw\fP, XtNdestroyCallback, \fIClientDestroy\fP, \fIclient_data\fP)
- .De
- .LP
- The \fIClientDestroy\fP argument is of type
- .PN XtCallbackProc ;
- see Section 8.1.
-
- .NH 3
- Dynamic Data Deallocation: the destroy Procedure
- .XS
- \*(SN Dynamic Data Deallocation: the destroy Procedure
- .XE
- .LP
- .IN "destroy procedure" "" "@DEF@"
- The destroy procedure pointers in the
- .PN ObjectClassPart ,
- .PN RectObjClassPart ,
- and
- .PN CoreClassPart
- structures are of type
- .PN XtWidgetProc .
- .IN "XtWidgetProc" "" "@DEF@"
- .FD 0
- typedef void (*XtWidgetProc)(Widget);
- .br
- Widget \fIw\fP;
- .FN
- .IP \fIw\fP i1
- Specifies the widget being destroyed.
- .LP
- The destroy procedures are called in subclass-to-superclass order.
- Therefore, a widget's destroy procedure only should deallocate storage
- that is specific to the subclass and should ignore the storage
- allocated by any of its superclasses.
- The destroy procedure should only deallocate resources that have been
- explicitly created by the subclass.
- Any resource that was obtained from the resource database
- or passed in an argument list was not created by the widget
- and therefore should not be destroyed by it.
- If a widget does not need to deallocate any storage,
- the destroy procedure entry in its class record can be NULL.
- .LP
- Deallocating storage includes, but is not limited to,
- the following steps:
- .IP \(bu 5
- Calling
- .PN XtFree
- on dynamic storage allocated with
- .PN XtMalloc ,
- .PN XtCalloc ,
- and so on.
- .IP \(bu 5
- Calling
- .PN XFreePixmap
- on pixmaps created with direct X calls.
- .IP \(bu 5
- Calling
- .PN XtReleaseGC
- on GCs allocated with
- .PN XtGetGC .
- .IP \(bu 5
- Calling
- .PN XFreeGC
- on GCs allocated with direct X calls.
- .IP \(bu 5
- Calling
- .PN XtRemoveEventHandler
- on event handlers added to other widgets.
- .IP \(bu 5
- Calling
- .PN XtRemoveTimeOut
- on timers created with
- .PN XtAppAddTimeOut .
- .IP \(bu 5
- Calling
- .PN XtDestroyWidget
- for each child if the widget has children
- and is not a subclass of
- .PN compositeWidgetClass .
- .LP
- During destroy phase 2 for each widget, the \*(xI remove the widget
- from the modal cascade, unregister all event handlers, remove all key,
- keyboard, button, and pointer grabs and remove all callback procedures
- registered on the widget. Any outstanding selection transfers will time out.
-
- .NH 3
- Dynamic Constraint Data Deallocation: the ConstraintClassPart destroy Procedure
- .XS
- \*(SN Dynamic Constraint Data Deallocation: the ConstraintClassPart destroy Procedure
- .XE
- .LP
- The constraint destroy procedure identified in the
- .PN ConstraintClassPart
- structure is called for a widget whose parent is a subclass of
- .PN constraintWidgetClass .
- This constraint destroy procedure pointer is of type
- .PN XtWidgetProc .
- The constraint destroy procedures are called in subclass-to-superclass order,
- starting at the class of the widget's parent and ending at
- .PN constraint\%WidgetClass .
- Therefore, a parent's constraint destroy procedure only should deallocate
- storage that is specific to the constraint subclass
- and not storage allocated by any of its superclasses.
- .LP
- If a parent does not need to deallocate any constraint storage,
- the constraint destroy procedure entry
- in its class record can be NULL.
-
- .NH 2
- Exiting from an Application
- .XS
- \fB\*(SN Exiting from an Application\fP
- .XE
- .LP
- All \*(tk applications should terminate
- by calling
- .PN XtDestroyApplicationContext
- and then exiting
- using the
- standard method for their operating system (typically, by calling
- .PN exit
- for POSIX-based systems).
- The quickest way to make the windows disappear while exiting is to call
- .PN XtUnmapWidget
- on each top-level shell widget.
- The \*(xI have no resources beyond those in the program image,
- and the X server will free its resources when its connection
- to the application is broken.
- .LP
- Depending upon the widget set in use, it may be necessary to explicitly
- destroy individual widgets or widget trees with
- .PN XtDestroyWidget
- before calling
- .PN XtDestroyApplicationContext
- in order to ensure that any
- required widget cleanup is properly executed. The application developer
- must refer to the widget documentation to learn if a widget needs to
- perform additional cleanup beyond that performed automatically by the
- operating system. None of the widget classes defined by the Intrinsics
- require additional cleanup.
- .bp
-