diff options
author | Matt Dew <marcoz@osource.org> | 2011-10-11 22:29:49 -0600 |
---|---|---|
committer | Matt Dew <marcoz@osource.org> | 2011-10-11 22:29:49 -0600 |
commit | 1f13118705bd3d049cab75a1fe609714c2b07c23 (patch) | |
tree | 53ee8e9b69bd2ba6509440d77ef3f22682648597 | |
parent | 1f48cadaa88423a012613a0b456ec8795c8c0992 (diff) |
Init conversion of 'intrinsics' to docbook. Still _LOTS_ to do.
Conversion script.
-rw-r--r-- | specs/CH01.xml | 3618 | ||||
-rw-r--r-- | specs/CH02.xml | 5064 | ||||
-rw-r--r-- | specs/CH03.xml | 1654 | ||||
-rw-r--r-- | specs/CH04.xml | 3222 | ||||
-rw-r--r-- | specs/CH05.xml | 1261 | ||||
-rw-r--r-- | specs/CH06.xml | 1846 | ||||
-rw-r--r-- | specs/CH07.xml | 5870 | ||||
-rw-r--r-- | specs/CH08.xml | 783 | ||||
-rw-r--r-- | specs/CH09.xml | 5737 | ||||
-rw-r--r-- | specs/CH10.xml | 2621 | ||||
-rw-r--r-- | specs/CH11.xml | 6280 | ||||
-rw-r--r-- | specs/CH12.xml | 1491 | ||||
-rw-r--r-- | specs/CH13.xml | 987 | ||||
-rwxr-xr-x | specs/Xorg_groffms2docbook.pl | 803 | ||||
-rw-r--r-- | specs/appA.xml | 138 | ||||
-rw-r--r-- | specs/appB.xml | 1695 | ||||
-rw-r--r-- | specs/appC.xml | 2238 | ||||
-rw-r--r-- | specs/appD.xml | 1997 | ||||
-rw-r--r-- | specs/appE.xml | 1904 | ||||
-rw-r--r-- | specs/appF.xml | 159 |
20 files changed, 49368 insertions, 0 deletions
diff --git a/specs/CH01.xml b/specs/CH01.xml new file mode 100644 index 0000000..ad17cb8 --- /dev/null +++ b/specs/CH01.xml @@ -0,0 +1,3618 @@ +<!-- .\" $Xorg: CH01,v 1.3 2000/08/17 19:42:42 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 1</function>\s-1 + +\s+1<function>Intrinsics and Widgets</function>\s-1 +<!-- .sp 2 --> +<!-- .if \n(GS .nr nh*hl 1 --> +<!-- .nr H1 1 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Chapter 1 \(em Intrinsics and Widgets</function> --> +<!-- .XE --> +The (xI are a programming library tailored to the special requirements +of user interface construction within a network window system, +specifically the X Window System. +The (xI and a widget set make up an (tk. + +</para> +<sect2 id="Intrinsics"> +<title>Intrinsics</title> +<!-- .XS --> +<!-- <function>(SN Intrinsics</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide the base mechanism necessary to build +a wide variety of interoperating widget sets and application environments. +The Intrinsics are a layer on top of Xlib, the +C Library X Interface. They extend the +fundamental abstractions provided by the X Window System while still +remaining independent of any particular user interface policy or +style. +</para> +<para> +<!-- .LP --> +The Intrinsics use object-oriented programming techniques to supply a +consistent architecture for constructing and composing user interface +components, known as widgets. This +allows programmers to extend a widget set in new ways, either by +deriving new widgets from existing ones (subclassing) or by writing +entirely new widgets following the established conventions. +</para> +<para> +<!-- .LP --> +When the (xI were first conceived, the root of the object +hierarchy was a widget class named +Core. +<!-- .IN "Core" --> +In Release 4 of the +(xI, three nonwidget superclasses were added above Core. +These superclasses are described in Chapter 12. The name of the class +now at the root of the Intrinsics class hierarchy is +Object. +<!-- .IN "Object" --> +The remainder of this +specification refers uniformly to <emphasis remap='I'>widgets</emphasis> and <emphasis remap='I'>Core</emphasis> +as if they were the +base class for all (xI operations. The argument descriptions +for each Intrinsics procedure and Chapter 12 describe which operations +are defined for the nonwidget superclasses of Core. The reader may +determine by context whether a specific reference to <emphasis remap='I'>widget</emphasis> +actually means ``widget'' or ``object.'' + +</para> +</sect2> +<sect2 id="Languages"> +<title>Languages</title> +<!-- .XS --> +<!-- <function>(SN Languages</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The Intrinsics are intended to be used for two programming purposes. +Programmers writing widgets will be using most of the facilities +provided by the +Intrinsics to construct user interface components from the simple, such +as buttons and scrollbars, to the complex, such as control panels and +property sheets. Application programmers will use a much smaller subset of +the Intrinsics procedures in combination with one or more sets of widgets to +construct and present complete user interfaces on an X display. The +Intrinsics +programming interfaces primarily +intended for application use are designed to be callable from most +procedural programming languages. Therefore, most arguments are passed by +reference rather than by value. The interfaces primarily +intended for widget programmers are expected to be used principally +from the C language. In these cases, the usual C programming +conventions apply. In this specification, the term <emphasis remap='I'>client</emphasis> refers to +any module, widget, or application that calls an Intrinsics procedure. +</para> +<para> +<!-- .LP --> +Applications that use the (xI mechanisms +must include the header files +<function>< X11/Intrinsic.h ></function> +and +<function>< X11/StringDefs.h >,</function> +or their equivalent, +and they may also include +<function>< X11/Xatoms.h ></function> +and +<function>< X11/Shell.h >.</function> +In addition, widget implementations should include +<function>< X11/IntrinsicP.h ></function> +instead of +<function>< X11/Intrinsic.h >.</function> +</para> +<para> +<!-- .LP --> +The applications must also include the additional header files for +each widget class that they are to use (for example, +<function>< X11/Xaw/Label.h ></function> +or +<function>< X11/Xaw/Scrollbar.h >).</function> +On a POSIX-based system, +the (xI object library file is named +<function>libXt.a</function> +and is usually referenced as \-lXt when linking the application. + +</para> +</sect2> +<sect2 id="Procedures_and_Macros"> +<title>Procedures and Macros</title> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>(SN Procedures and Macros</function> --> +<!-- .XE --> +All functions defined in this specification except those specified below +may be implemented as C macros with arguments. C applications may use +``#undef'' to remove a macro definition and ensure that the actual function +is referenced. Any such macro will expand to a single expression that +has the same precedence as a function call and that evaluates each +of its arguments exactly once, fully protected by parentheses, so that +arbitrary expressions may be used as arguments. +</para> +<para> +<!-- .LP --> +The following symbols are macros that do not have function +equivalents and that may expand their arguments in a manner other +than that described above: +<function>XtCheckSubclass ,</function> +<function>XtNew ,</function> +<function>XtNumber ,</function> +<function>XtOffsetOf ,</function> +<function>XtOffset ,</function> +and +<function>XtSetArg .</function> + +</para> +</sect2> +<sect2 id="Widgets"> +<title>Widgets</title> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>(SN Widgets</function> --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +The fundamental abstraction and data type of the (tk is the widget, +which is a combination of an X window and its associated +input and display semantics +and which is dynamically allocated and contains state information. +Some widgets display information (for example, text or graphics), +and others are merely containers for other widgets (for example, a menu box). +Some widgets are output-only and do not react to pointer or keyboard input, +and others change their display in response to input +and can invoke functions that an application has attached to them. +</para> +<para> +<!-- .LP --> +Every widget belongs to exactly one widget class, which is statically +allocated and initialized and which contains the operations allowable on +widgets of that class. +Logically, a widget class is the procedures and data associated +with all widgets belonging to that class. +These procedures and data can be inherited by +subclasses. +Physically, a widget class is a pointer to a structure. +The contents of this structure are constant for all widgets of the widget +class but will vary from class to class. +(Here, ``constant'' means the class structure is initialized at compile time +and never changed, except for a one-time class initialization +and in-place compilation of resource lists, +which takes place when the first widget of the class or subclass is created.) +For further information, +see Section 2.5. +</para> +<para> +<!-- .LP --> +The distribution of the declarations and code for a new widget class +among a public .h file for application programmer use, a private .h file +for widget programmer use, +and the implementation .c file is described in Section 1.6. +The predefined widget classes adhere to these conventions. +</para> +<para> +<!-- .LP --> +A widget instance is composed of two parts: +</para> +<itemizedlist> + <listitem> + <para> +A data structure which contains instance-specific values. + </para> + </listitem> + <listitem> + <para> +A class structure which contains information that is applicable to +all widgets of that class. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Much of the input/output of a widget (for example, fonts, colors, sizes, +or border widths) is customizable by users. +</para> +<para> +<!-- .LP --> +This chapter discusses the base widget classes, +Core, Composite, and Constraint, and +ends with a discussion of widget classing. + +</para> +<sect3 id="Core_Widgets"> +<title>Core Widgets</title> +<!-- .XS --> +<!-- (SN Core Widgets --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Core" "" "@DEF@" --> +The +Core +widget class contains the definitions of fields common to all widgets. +All widgets classes are subclasses of the +Core class, +which is defined by the +<function>CoreClassPart</function> +and +<function>CorePart</function> +structures. + +</para> +<sect4 id="CoreClassPart_Structure"> +<title>CoreClassPart Structure</title> +<!-- .XS --> +<!-- (SN CoreClassPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +All widget classes contain the fields defined in the +<function>CoreClassPart</function> +structure. +</para> +<para> +<!-- .LP --> +<!-- .IN "CoreClassPart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3.5i --> +<!-- .ta .5i 3.5i --> +typedef struct { + WidgetClass superclass; See Section 1.6 + String class_name; See Chapter 9 + Cardinal widget_size; See Section 1.6 + XtProc class_initialize; See Section 1.6 + XtWidgetClassProc class_part_initialize; See Section 1.6 + XtEnum class_inited; See Section 1.6 + XtInitProc initialize; See Section 2.5 + XtArgsProc initialize_hook; See Section 2.5 + XtRealizeProc realize; See Section 2.6 + XtActionList actions; See Chapter 10 + Cardinal num_actions; See Chapter 10 + XtResourceList resources; See Chapter 9 + Cardinal num_resources; See Chapter 9 + XrmClass xrm_class; Private to resource manager + Boolean compress_motion; See Section 7.9 + XtEnum compress_exposure; See Section 7.9 + Boolean compress_enterleave; See Section 7.9 + Boolean visible_interest; See Section 7.10 + XtWidgetProc destroy; See Section 2.8 + XtWidgetProc resize; See Chapter 6 + XtExposeProc expose; See Section 7.10 + XtSetValuesFunc set_values; See Section 9.7 + XtArgsFunc set_values_hook; See Section 9.7 + XtAlmostProc set_values_almost; See Section 9.7 + XtArgsProc get_values_hook; See Section 9.7 + XtAcceptFocusProc accept_focus; See Section 7.3 + XtVersionType version; See Section 1.6 + XtPointer callback_private; Private to callbacks + String tm_table; See Chapter 10 + XtGeometryHandler query_geometry; See Chapter 6 + XtStringProc display_accelerator; See Chapter 10 + XtPointer extension; See Section 1.6 +} CoreClassPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +All widget classes have the Core class fields as their first component. +The prototypical +<function>WidgetClass</function> +and +<function>CoreWidgetClass</function> +are defined with only this set of fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "Core" --> +<!-- .IN "WidgetClass" "" "@DEF@" --> +<!-- .IN "CoreWidgetClass" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + CoreClassPart core_class; +} WidgetClassRec, *WidgetClass, CoreClassRec, *CoreWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +Various routines can cast widget class pointers, as needed, +to specific widget class types. +</para> +<para> +<!-- .LP --> +The single occurrences of the class record and pointer for +creating instances of Core are +</para> +<para> +<!-- .LP --> +In +<function>IntrinsicP.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern WidgetClassRec widgetClassRec; +#define coreClassRec widgetClassRec +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern WidgetClass widgetClass, coreWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The opaque types +<function>Widget</function> +and +<function>WidgetClass</function> +and the opaque variable +<function>widgetClass</function> +are defined for generic actions on widgets. +In order to make these types opaque and ensure that the compiler +does not allow applications to access private data, the (xI use +incomplete structure definitions in +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _WidgetClassRec *WidgetClass, *CoreWidgetClass; +</literallayout> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="CorePart_Structure"> +<title>CorePart Structure</title> +<!-- .XS --> +<!-- (SN CorePart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +All widget instances contain the fields defined in the +<function>CorePart</function> +structure. +</para> +<para> +<!-- .LP --> +<!-- .IN "CorePart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _CorePart { + Widget self; Described below + WidgetClass widget_class; See Section 1.6 + Widget parent; See Section 2.5 + Boolean being_destroyed; See Section 2.8 + XtCallbackList destroy_callbacks; See Section 2.8 + XtPointer constraints; See Section 3.6 + Position x; See Chapter 6 + Position y; See Chapter 6 + Dimension width; See Chapter 6 + Dimension height; See Chapter 6 + Dimension border_width; See Chapter 6 + Boolean managed; See Chapter 3 + Boolean sensitive; See Section 7.7 + Boolean ancestor_sensitive; See Section 7.7 + XtTranslations accelerators; See Chapter 10 + Pixel border_pixel; See Section 2.6 + Pixmap border_pixmap; See Section 2.6 + WidgetList popup_list; See Chapter 5 + Cardinal num_popups; See Chapter 5 + String name; See Chapter 9 + Screen *screen; See Section 2.6 + Colormap colormap; See Section 2.6 + Window window; See Section 2.6 + Cardinal depth; See Section 2.6 + Pixel background_pixel; See Section 2.6 + Pixmap background_pixmap; See Section 2.6 + Boolean visible; See Section 7.10 + Boolean mapped_when_managed; See Chapter 3 +} CorePart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +All widget instances have the Core fields as their first component. +The prototypical type +<function>Widget</function> +is defined with only this set of fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "Widget" "" "@DEF@" --> +<!-- .IN "CoreWidget" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + CorePart core; +} WidgetRec, *Widget, CoreRec, *CoreWidget; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +Various routines can cast widget pointers, as needed, +to specific widget types. +</para> +<para> +<!-- .LP --> +In order to make these types opaque and ensure that the compiler +does not allow applications to access private data, the (xI use +incomplete structure definitions in +<function>Intrinsic.h .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _WidgetRec *Widget, *CoreWidget; +</literallayout> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="Core_Resources"> +<title>Core Resources</title> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>(SN Core Resources</function> --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +<!-- .IN "CoreWidget" "Resources" --> +The resource names, classes, and representation types specified in the +<function>coreClassRec</function> +resource list are +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(1.5i) lw(2.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNaccelerators</entry> + <entry>XtCAccelerators</entry> + <entry>XtRAcceleratorTable</entry> + </row> + <row> + <entry>XtNbackground</entry> + <entry>XtCBackground</entry> + <entry>XtRPixel</entry> + </row> + <row> + <entry>XtNbackgroundPixmap</entry> + <entry>XtCPixmap</entry> + <entry>XtRPixmap</entry> + </row> + <row> + <entry>XtNborderColor</entry> + <entry>XtCBorderColor</entry> + <entry>XtRPixel</entry> + </row> + <row> + <entry>XtNborderPixmap</entry> + <entry>XtCPixmap</entry> + <entry>XtRPixmap</entry> + </row> + <row> + <entry>XtNcolormap</entry> + <entry>XtCColormap</entry> + <entry>XtRColormap</entry> + </row> + <row> + <entry>XtNdepth</entry> + <entry>XtCDepth</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNmappedWhenManaged</entry> + <entry>XtCMappedWhenManaged</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNscreen</entry> + <entry>XtCScreen</entry> + <entry>XtRScreen</entry> + </row> + <row> + <entry>XtNtranslations</entry> + <entry>XtCTranslations</entry> + <entry>XtRTranslationTable</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +Additional resources are defined for all widgets via the +<function>objectClassRec</function> +and +<function>rectObjClassRec</function> +resource lists; see Sections 12.2 and 12.3 for details. + +</para> +</sect4> +<sect4 id="CorePart_Default_Values"> +<title>CorePart Default Values</title> +<!-- .XS --> +<!-- (SN CorePart Default Values --> +<!-- .XE --> +<para> +<!-- .LP --> +The default values for the Core fields, which are filled in by the (xI, +from the resource lists, and by the initialize procedures, are +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.5i) lw(4.25i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Field</entry> + <entry>Default Value</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>self</entry> + <entry>Address of the widget structure (may not be changed).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>widget_class</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><emphasis remap='I'>widget_class</emphasis> argument to</entry> + </row> + <row> + <entry><function>XtCreateWidget</function></entry> + </row> + <row> + <entry>(may not be changed).</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>parent</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><emphasis remap='I'>parent</emphasis> argument to</entry> + </row> + <row> + <entry><function>XtCreateWidget</function></entry> + </row> + <row> + <entry>(may not be changed).</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>being_destroyed</entry> + <entry>Parent's <emphasis remap='I'>being_destroyed</emphasis> value.</entry> + </row> + <row> + <entry>destroy_callbacks</entry> + <entry>NULL</entry> + </row> + <row> + <entry>constraints</entry> + <entry>NULL</entry> + </row> + <row> + <entry>x</entry> + <entry>0</entry> + </row> + <row> + <entry>y</entry> + <entry>0</entry> + </row> + <row> + <entry>width</entry> + <entry>0</entry> + </row> + <row> + <entry>height</entry> + <entry>0</entry> + </row> + <row> + <entry>border_width</entry> + <entry>1</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>managed</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>sensitive</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>ancestor_sensitive</entry> + <entry>T{</entry> + </row> + <row> + <entry>logical AND of parent's <emphasis remap='I'>sensitive</emphasis> and</entry> + </row> + <row> + <entry><emphasis remap='I'>ancestor_sensitive</emphasis> values.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>accelerators</entry> + <entry>NULL</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>border_pixel</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtDefaultForeground</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>border_pixmap</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtUnspecifiedPixmap</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>popup_list</entry> + <entry>NULL</entry> + </row> + <row> + <entry>num_popups</entry> + <entry>0</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>name</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><emphasis remap='I'>name</emphasis> argument to</entry> + </row> + <row> + <entry><function>XtCreateWidget</function></entry> + </row> + <row> + <entry>(may not be changed).</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>screen</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Parent's <emphasis remap='I'>screen</emphasis>; top-level widget gets screen from display specifier</entry> + </row> + <row> + <entry>(may not be changed).</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>colormap</entry> + <entry>Parent's <emphasis remap='I'>colormap</emphasis> value.</entry> + </row> + <row> + <entry>window</entry> + <entry>NULL</entry> + </row> + <row> + <entry>depth</entry> + <entry>Parent's <emphasis remap='I'>depth</emphasis>; top-level widget gets root window depth.</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>background_pixel</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtDefaultBackground</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>background_pixmap</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtUnspecifiedPixmap</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>visible</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>mapped_when_managed</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .IN XtUnspecifiedPixmap "" "@DEF@" --> +<function>XtUnspecifiedPixmap</function> +is a symbolic constant guaranteed to be unequal to +any valid Pixmap id, +<function>None ,</function> +and +<function>ParentRelative .</function> + +</para> +</sect4> +</sect3> +<sect3 id="Composite_Widgets"> +<title>Composite Widgets</title> +<!-- .XS --> +<!-- (SN Composite Widgets --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Composite" "" "@DEF@" --> +The Composite +widget class is a subclass of the +Core +widget class (see Chapter 3). +Composite widgets are intended to be containers for other widgets. +The additional data used by composite widgets are defined by the +<function>CompositeClassPart</function> +and +<function>CompositePart</function> +structures. + +</para> +<sect4 id="CompositeClassPart_Structure"> +<title>CompositeClassPart Structure</title> +<!-- .XS --> +<!-- (SN CompositeClassPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +In addition to the +Core +class fields, +widgets of the Composite class have the following class fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "CompositeClassPart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3.5i --> +<!-- .ta .5i 3.5i --> +typedef struct { + XtGeometryHandler geometry_manager; See Chapter 6 + XtWidgetProc change_managed; See Chapter 3 + XtWidgetProc insert_child; See Chapter 3 + XtWidgetProc delete_child; See Chapter 3 + XtPointer extension; See Section 1.6 +} CompositeClassPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The extension record defined for +<function>CompositeClassPart</function> +with <emphasis remap='I'>record_type</emphasis> +equal to +<function>\s-1NULLQUARK\s+1</function> +is +<function>CompositeClassExtensionRec .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "CompositeClassExtensionRec" "" "@DEF@" --> +<!-- .IN "CompositeClassExtension" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3.5i --> +<!-- .ta .5i 3.5i --> +typedef struct { + XtPointer next_extension; See Section 1.6.12 + XrmQuark record_type; See Section 1.6.12 + long version; See Section 1.6.12 + Cardinal record_size; See Section 1.6.12 + Boolean accepts_objects; See Section 2.5.2 + Boolean allows_change_managed_set; See Section 3.4.3 +} CompositeClassExtensionRec, *CompositeClassExtension; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +Composite +classes have the Composite class fields immediately following the +Core class fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "CompositeWidgetClass" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + CoreClassPart core_class; + CompositeClassPart composite_class; +} CompositeClassRec, *CompositeWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The single occurrences of the class record and pointer for creating +instances of Composite are +</para> +<para> +<!-- .LP --> +In +<function>IntrinsicP.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern CompositeClassRec compositeClassRec; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern WidgetClass compositeWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The opaque types +<function>CompositeWidget</function> +and +<function>CompositeWidgetClass</function> +and the opaque variable +<function>compositeWidgetClass</function> +are defined for generic operations on widgets whose class +is Composite or a subclass of Composite. +The symbolic constant for the +<function>CompositeClassExtension</function> +version identifier is +<function>XtCompositeExtensionVersion</function> +(see Section 1.6.12). +<function>Intrinsic.h</function> +uses an incomplete structure +definition to ensure that the compiler catches attempts to access +private data. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _CompositeClassRec *CompositeWidgetClass; +</literallayout> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="CompositePart_Structure"> +<title>CompositePart Structure</title> +<!-- .XS --> +<!-- (SN CompositePart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +In addition to the +Core instance +fields, +widgets of the Composite class have the following +instance fields defined in the +<function>CompositePart</function> +structure. +</para> +<para> +<!-- .LP --> +<!-- .IN "CompositePart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + WidgetList children; See Chapter 3 + Cardinal num_children; See Chapter 3 + Cardinal num_slots; See Chapter 3 + XtOrderProc insert_position; See Section 3.2 +} CompositePart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +Composite +widgets have the Composite instance fields immediately following the Core +instance fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "CompositeWidget" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + CorePart core; + CompositePart composite; +} CompositeRec, *CompositeWidget; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<function>Intrinsic.h</function> +uses an incomplete structure definition to ensure that the +compiler catches attempts to access private data. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _CompositeRec *CompositeWidget; +</literallayout> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="Composite_Resources"> +<title>Composite Resources</title> +<!-- .XS --> +<!-- <function>(SN Composite Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "CompositeWidget" "Resources" --> +The resource names, classes, and representation types +that are specified in +the +<function>compositeClassRec</function> +resource list are +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(1.5i) lw(2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNchildren</entry> + <entry>XtCReadOnly</entry> + <entry>XtRWidgetList</entry> + </row> + <row> + <entry>XtNinsertPosition</entry> + <entry>XtCInsertPosition</entry> + <entry>XtRFunction</entry> + </row> + <row> + <entry>XtNnumChildren</entry> + <entry>XtCReadOnly</entry> + <entry>XtRCardinal</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +</sect4> +<sect4 id="CompositePart_Default_Values"> +<title>CompositePart Default Values</title> +<!-- .XS --> +<!-- (SN CompositePart Default Values --> +<!-- .XE --> +<para> +<!-- .LP --> +The default values for the Composite fields, +which are filled in from the +Composite +resource list and by the +Composite +initialize procedure, are +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>children</emphasis>, <emphasis remap='I'>num_children</emphasis>, +and <emphasis remap='I'>insert_position</emphasis> fields are declared +as resources; +<!-- .IN XtNinsertPosition --> +XtNinsertPosition +is a settable resource, +<!-- .IN XtNchildren --> +XtNchildren +and +<!-- .IN XtNnumChildren --> +XtNnumChildren +may be read by any client but should only be modified by the composite +widget class procedures. + +</para> +</sect4> +</sect3> +<sect3 id="Constraint_Widgets"> +<title>Constraint Widgets</title> +<!-- .XS --> +<!-- (SN Constraint Widgets --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Constraint" "" "@DEF@" --> +The Constraint +widget class is a subclass of the +Composite +widget class (see Section 3.6). Constraint +widgets maintain additional state +data for each child; for example, client-defined constraints on the child's +geometry. +The additional data used by constraint widgets are defined by the +<function>ConstraintClassPart</function> +and +<function>ConstraintPart</function> +structures. + +</para> +<sect4 id="ConstraintClassPart_Structure"> +<title>ConstraintClassPart Structure</title> +<!-- .XS --> +<!-- (SN ConstraintClassPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +In addition to the +Core +and +Composite +class fields, +widgets of the Constraint class +have the following class fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "ConstraintClassPart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + XtResourceList resources; See Chapter 9 + Cardinal num_resources; See Chapter 9 + Cardinal constraint_size; See Section 3.6 + XtInitProc initialize; See Section 3.6 + XtWidgetProc destroy; See Section 3.6 + XtSetValuesFunc set_values; See Section 9.7.2 + XtPointer extension; See Section 1.6 +} ConstraintClassPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The extension record defined for +<function>ConstraintClassPart</function> +with <emphasis remap='I'>record_type</emphasis> equal to +<function>\s-1NULLQUARK\s+1</function> +is +<function>ConstraintClassExtensionRec .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "ConstraintClassExtensionRec" "" "@DEF@" --> +<!-- .IN "ConstraintClassExtension" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + XtPointer next_extension; See Section 1.6.12 + XrmQuark record_type; See Section 1.6.12 + long version; See Section 1.6.12 + Cardinal record_size; See Section 1.6.12 + XtArgsProc get_values_hook; See Section 9.7.1 +} ConstraintClassExtensionRec, *ConstraintClassExtension; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +Constraint +classes have the Constraint class fields immediately following the +Composite class fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "ConstraintWidgetClass" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _ConstraintClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ConstraintClassPart constraint_class; +} ConstraintClassRec, *ConstraintWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The single occurrences of the class record and pointer for creating +instances of Constraint are +</para> +<para> +<!-- .LP --> +In +<function>IntrinsicP.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern ConstraintClassRec constraintClassRec; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern WidgetClass constraintWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The opaque types +<function>ConstraintWidget</function> +and +<function>ConstraintWidgetClass</function> +and the opaque variable +<function>constraintWidgetClass</function> +are defined for generic operations on widgets +whose class is Constraint or a subclass +of Constraint. +The symbolic constant for the +<function>ConstraintClassExtension</function> +version identifier is +<function>XtConstraintExtensionVersion</function> +(see Section 1.6.12). +<function>Intrinsic.h</function> +uses an incomplete structure definition to ensure that the +compiler catches attempts to access private data. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _ConstraintClassRec *ConstraintWidgetClass; +</literallayout> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="ConstraintPart_Structure"> +<title>ConstraintPart Structure</title> +<!-- .XS --> +<!-- (SN ConstraintPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +In addition to the +Core +and +Composite instance +fields, +widgets of the Constraint class have the following unused +instance fields defined in the +<function>ConstraintPart</function> +structure +</para> +<para> +<!-- .LP --> +<!-- .IN "ConstraintPart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + int empty; +} ConstraintPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +Constraint +widgets have the Constraint instance fields immediately following the +Composite instance fields. +</para> +<para> +<!-- .LP --> +<!-- .IN "ConstraintWidget" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + CorePart core; + CompositePart composite; + ConstraintPart constraint; +} ConstraintRec, *ConstraintWidget; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<function>Intrinsic.h</function> +uses an incomplete structure definition to ensure that the +compiler catches attempts to access private data. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _ConstraintRec *ConstraintWidget; +</literallayout> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="Constraint_Resources"> +<title>Constraint Resources</title> +<!-- .XS --> +<!-- <function>(SN Constraint Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The +<function>constraintClassRec</function> +<emphasis remap='I'>core_class</emphasis> and <emphasis remap='I'>constraint_class resources</emphasis> fields are NULL, +and the <emphasis remap='I'>num_resources</emphasis> fields are zero; +no additional resources beyond those declared by +the superclasses +are defined for +Constraint. + +</para> +</sect4> +</sect3> +</sect2> +<sect2 id="Implementation_Specific_Types"> +<title>Implementation-Specific Types</title> +<!-- .XS --> +<!-- <function>(SN Implementation-Specific Types</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To increase the portability of widget and application source code +between different system environments, the (xI define several +types whose precise representation is explicitly dependent upon, +and chosen by, each individual implementation of the (xI. +</para> +<para> +<!-- .LP --> +These implementation-defined types are +<!-- .IN "Boolean" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +A datum that contains a zero or nonzero value. +Unless explicitly stated, clients should not assume +that the nonzero value is equal to the symbolic +value +<function>True .</function> +<!-- .IN "Cardinal" "" "@DEF@" --> + </para> + </listitem> + <listitem> + <para> +An unsigned integer datum with a minimum range of [0..2^16-1]. +<!-- .IN "Dimension" "" "@DEF@" --> + </para> + </listitem> + <listitem> + <para> +An unsigned integer datum with a minimum range of [0..2^16-1]. +<!-- .IN "Position" "" "@DEF@" --> + </para> + </listitem> + <listitem> + <para> +A signed integer datum with a minimum range of [-2^15..2^15-1]. +<!-- .IN "XtPointer" "" "@DEF@" --> + </para> + </listitem> + <listitem> + <para> +A datum large enough to contain the largest of a char*, int*, function +pointer, structure pointer, or long value. A pointer +to any type or function, or a long value may be converted +to an +<function>XtPointer</function> +and back again and the result will +compare equal to the original value. In ANSI C +environments it is expected that +<function>XtPointer</function> +will be +defined as void*. +<!-- .IN "XtArgVal" "" "@DEF@" --> + </para> + </listitem> + <listitem> + <para> +A datum large enough to contain an +<function>XtPointer ,</function> +<function>Cardinal ,</function> +<function>Dimension ,</function> +or +<function>Position</function> +value. +<!-- .IN "XtEnum" "" "@DEF@" --> + </para> + </listitem> + <listitem> + <para> +An integer datum large enough to encode at least 128 distinct +values, two of which are the symbolic values +<function>True</function> +and +<function>False .</function> +The symbolic values +<function>\s-1TRUE\s+1</function> +and +<function>\s-1FALSE\s+1</function> +are +also defined to be equal to +<function>True</function> +and +<function>False ,</function> +respectively. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +In addition to these specific types, the precise order of the +fields within the structure declarations for any of the instance +part records +<function>ObjectPart ,</function> +<function>RectObjPart ,</function> +<function>CorePart ,</function> +<function>CompositePart ,</function> +<function>ShellPart ,</function> +<function>WMShellPart ,</function> +<function>TopLevelShellPart ,</function> +and +<function>ApplicationShellPart</function> +is implementation-defined. These +structures may also have additional private +fields internal to the implementation. +The +<function>ObjectPart ,</function> +<function>RectObjPart ,</function> +and +<function>CorePart</function> +structures must be defined so that any member with the same name +appears at the same offset in +<function>ObjectRec ,</function> +<function>RectObjRec ,</function> +and +<function>CoreRec</function> +<function>( WidgetRec ).</function> +No other relations between the offsets of any two +fields may be assumed. + +</para> +</sect2> +<sect2 id="Widget_Classing"> +<title>Widget Classing</title> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>(SN Widget Classing</function> --> +<!-- .XE --> +<!-- .IN "widget_class" "" "@DEF@" --> +The <emphasis remap='I'>widget_class</emphasis> field of a widget points to its widget class structure, +which contains information that is constant across all widgets of that class. +As a consequence, +widgets usually do not implement directly callable procedures; +rather, they implement procedures, called methods, that are available through +their widget class structure. +These methods are invoked by generic procedures that envelop common actions +around the methods implemented by the widget class. +Such procedures are applicable to all widgets +of that class and also to widgets whose classes are subclasses of that class. +</para> +<para> +<!-- .LP --> +All widget classes are a subclass of +Core +and can be subclassed further. +Subclassing reduces the amount of code and declarations +necessary to make a +new widget class that is similar to an existing class. +For example, you do not have to describe every resource your widget uses in an +<function>XtResourceList .</function> +Instead, you describe only the resources your widget has +that its superclass does not. +Subclasses usually inherit many of their superclasses' procedures +(for example, the expose procedure or geometry handler). +</para> +<para> +<!-- .LP --> +Subclassing, however, can be taken too far. +If you create a subclass that inherits none of the procedures of its +superclass, +you should consider whether you have chosen the most +appropriate superclass. +</para> +<para> +<!-- .LP --> +To make good use of subclassing, +widget declarations and naming conventions are highly stylized. +A widget consists of three files: +</para> +<itemizedlist> + <listitem> + <para> +A public .h file, used by client widgets or applications. + </para> + </listitem> + <listitem> + <para> +A private .h file, used by widgets whose classes +are subclasses of the widget class. + </para> + </listitem> + <listitem> + <para> +A .c file, which implements the widget. + + </para> + </listitem> +</itemizedlist> +<sect3 id="Widget_Naming_Conventions"> +<title>Widget Naming Conventions</title> +<!-- .XS --> +<!-- <function>(SN Widget Naming Conventions</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide a vehicle by which programmers can create +new widgets and organize a collection of widgets into an application. +To ensure that applications need not deal with as many styles of capitalization +and spelling as the number of widget classes it uses, +the following guidelines should be followed when writing new widgets: +</para> +<itemizedlist> + <listitem> + <para> +Use the X library naming conventions that are applicable. +For example, a record component name is all lowercase +and uses underscores (_) for compound words (for example, background_pixmap). +Type and procedure names start with uppercase and use capitalization for +compound words (for example, +<function>ArgList</function> +or +<function>XtSetValues ).</function> + </para> + </listitem> + <listitem> + <para> +A resource name is spelled identically to the field name +except that compound names use capitalization rather than underscore. +To let the compiler catch spelling errors, +each resource name should have a symbolic identifier prefixed with +``XtN''. +For example, +the <emphasis remap='I'>background_pixmap</emphasis> field has the corresponding identifier +XtNbackgroundPixmap, +which is defined as the string ``backgroundPixmap''. +Many predefined names are listed in +<function>< X11/StringDefs.h >.</function> +Before you invent a new name, +you should make sure there is not already a name that you can use. + </para> + </listitem> + <listitem> + <para> +A resource class string starts with a capital letter +and uses capitalization for compound names (for example,``BorderWidth''). +Each resource class string should have a symbolic identifier prefixed with +``XtC'' +(for example, XtCBorderWidth). +Many predefined classes are listed in +<function>< X11/StringDefs.h >.</function> + </para> + </listitem> + <listitem> + <para> +A resource representation string is spelled identically to the type name +(for example, ``TranslationTable''). +Each representation string should have a symbolic identifier prefixed with +``XtR'' +(for example, XtRTranslationTable). +Many predefined representation types are listed in +<function>< X11/StringDefs.h >.</function> + </para> + </listitem> + <listitem> + <para> +New widget classes start with a capital and use uppercase for compound +words. +Given a new class name AbcXyz, you should derive several names: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +Additional widget instance structure part name AbcXyzPart. + </para> + </listitem> + <listitem> + <para> +Complete widget instance structure names AbcXyzRec and _AbcXyzRec. + </para> + </listitem> + <listitem> + <para> +Widget instance structure pointer type name AbcXyzWidget. + </para> + </listitem> + <listitem> + <para> +Additional class structure part name AbcXyzClassPart. + </para> + </listitem> + <listitem> + <para> +Complete class structure names AbcXyzClassRec and _AbcXyzClassRec. + </para> + </listitem> + <listitem> + <para> +Class structure pointer type name AbcXyzWidgetClass. + </para> + </listitem> + <listitem> + <para> +Class structure variable abcXyzClassRec. + </para> + </listitem> + <listitem> + <para> +Class structure pointer variable abcXyzWidgetClass. +<!-- .RE --> + </para> + </listitem> + <listitem> + <para> +Action procedures available to translation specifications should follow the +same naming conventions as procedures. +That is, +they start with a capital letter, and compound names use uppercase +(for example, ``Highlight'' and ``NotifyClient''). + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The symbolic identifiers XtN..., XtC..., and XtR... +may be implemented +as macros, as global symbols, or as a mixture of the two. The +(implicit) type of the identifier is +<function>String .</function> +The pointer value itself +is not significant; clients must not assume that inequality of two +identifiers implies inequality of the resource name, class, or +representation string. Clients should also note that although global +symbols permit savings in literal storage in some environments, they +also introduce the possibility of multiple definition conflicts when +applications attempt to use independently developed widgets +simultaneously. + +</para> +</sect3> +<sect3 id="Widget_Subclassing_in_Public_h_Files"> +<title>Widget Subclassing in Public .h Files</title> +<!-- .XS --> +<!-- (SN Widget Subclassing in Public .h Files --> +<!-- .XE --> +<para> +<!-- .LP --> +The public .h file for a widget class is imported by clients +and contains +</para> +<itemizedlist> + <listitem> + <para> +A reference to the public .h file for the superclass. + </para> + </listitem> + <listitem> + <para> +Symbolic identifiers for +the names and classes of the new resources that this widget adds +to its superclass. +The definitions should +have a single space between the definition name and the value and no +trailing space or comment in order to reduce the possibility of +compiler warnings from similar declarations in multiple classes. + </para> + </listitem> + <listitem> + <para> +Type declarations for any new resource data types defined by the class. + </para> + </listitem> + <listitem> + <para> +The class record pointer variable used to create widget instances. + </para> + </listitem> + <listitem> + <para> +The C type that corresponds to widget instances of this class. + </para> + </listitem> + <listitem> + <para> +Entry points for new class methods. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +For example, the following is the public .h file for a possible +implementation of a Label widget: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.75i --> +<!-- .ta .5i 1.75i --> +#ifndef LABEL_H +#define LABEL_H + +/* New resources */ +#define XtNjustify "justify" +#define XtNforeground "foreground" +#define XtNlabel "label" +#define XtNfont "font" +#define XtNinternalWidth "internalWidth" +#define XtNinternalHeight "internalHeight" + +/* Class record pointer */ +extern WidgetClass labelWidgetClass; + +/* C Widget type definition */ +typedef struct _LabelRec *LabelWidget; + +/* New class method entry points */ +extern void LabelSetText(); + /* Widget w */ + /* String text */ + +extern String LabelGetText(); + /* Widget w */ + +#endif LABEL_H +</literallayout> +</para> +<para> +<!-- .LP --> +The conditional inclusion of the text allows the application +to include header files for different widgets without being concerned +that they already may be included as a superclass of another widget. +</para> +<para> +<!-- .LP --> +To accommodate operating systems with file name length restrictions, +the name of the public .h file is the first ten characters of the +widget class. +For example, +the public .h file for the +Constraint +widget class is +<function>Constraint.h .</function> + +</para> +</sect3> +<sect3 id="Widget_Subclassing_in_Private_h_Files"> +<title>Widget Subclassing in Private .h Files</title> +<!-- .XS --> +<!-- (SN Widget Subclassing in Private .h Files --> +<!-- .XE --> +<para> +<!-- .LP --> +The private .h file for a widget is imported by widget classes that are +subclasses of the widget and contains +</para> +<itemizedlist> + <listitem> + <para> +A reference to the public .h file for the class. + </para> + </listitem> + <listitem> + <para> +A reference to the private .h file for the superclass. + </para> + </listitem> + <listitem> + <para> +Symbolic identifiers for any new resource representation types defined +by the class. The definitions should have a single space between the +definition name and the value and no trailing space or comment. + </para> + </listitem> + <listitem> + <para> +A structure part definition for +the new fields that the widget instance adds to its superclass's +widget structure. + </para> + </listitem> + <listitem> + <para> +The complete widget instance structure definition for this widget. + </para> + </listitem> + <listitem> + <para> +A structure part definition for +the new fields that this widget class adds to its superclass's +constraint +structure if the widget class is a subclass of +Constraint. + </para> + </listitem> + <listitem> + <para> +The complete +constraint +structure definition if the widget class is a subclass of +Constraint. + </para> + </listitem> + <listitem> + <para> +Type definitions for any new procedure types used by class methods +declared in the widget class part. + </para> + </listitem> + <listitem> + <para> +A structure part definition for +the new fields that this widget class adds to its superclass's widget class +structure. + </para> + </listitem> + <listitem> + <para> +The complete widget class structure definition for this widget. + </para> + </listitem> + <listitem> + <para> +The complete widget class extension structure definition +for this widget, if any. + </para> + </listitem> + <listitem> + <para> +The symbolic constant identifying the class extension version, if any. + </para> + </listitem> + <listitem> + <para> +The name of the global class structure variable containing the generic +class structure for this class. + </para> + </listitem> + <listitem> + <para> +An inherit constant for each new procedure in the widget class part structure. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +For example, the following is the private .h file for a possible Label widget: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +#ifndef LABELP_H +#define LABELP_H + +#include <X11/Label.h> + +/* New representation types used by the Label widget */ +#define XtRJustify "Justify" + +/* New fields for the Label widget record */ +typedef struct { +/* Settable resources */ + Pixel foreground; + XFontStruct *font; + String label; /* text to display */ + XtJustify justify; + Dimension internal_width; /* # pixels horizontal border */ + Dimension internal_height; /* # pixels vertical border */ + +/* Data derived from resources */ + GC normal_GC; + GC gray_GC; + Pixmap gray_pixmap; + Position label_x; + Position label_y; + Dimension label_width; + Dimension label_height; + Cardinal label_len; + Boolean display_sensitive; +} LabelPart; +</literallayout> +<!-- .sp --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +/* Full instance record declaration */ +typedef struct _LabelRec { + CorePart core; + LabelPart label; +} LabelRec; + +/* Types for Label class methods */ +typedef void (*LabelSetTextProc)(); + /* Widget w */ + /* String text */ + +typedef String (*LabelGetTextProc)(); + /* Widget w */ + +/* New fields for the Label widget class record */ +typedef struct { + LabelSetTextProc set_text; + LabelGetTextProc get_text; + XtPointer extension; +} LabelClassPart; + +/* Full class record declaration */ +typedef struct _LabelClassRec { + CoreClassPart core_class; + LabelClassPart label_class; +} LabelClassRec; + +/* Class record variable */ +extern LabelClassRec labelClassRec; + +#define LabelInheritSetText((LabelSetTextProc)_XtInherit) +#define LabelInheritGetText((LabelGetTextProc)_XtInherit) +#endif LABELP_H +</literallayout> +</para> +<para> +<!-- .LP --> +To accommodate operating systems with file name length restrictions, +the name of the private .h file is the first nine characters of the +widget class followed by a capital P. +For example, +the private .h file for the +Constraint +widget class is +<function>ConstrainP.h .</function> + +</para> +</sect3> +<sect3 id="Widget_Subclassing_in_c_Files"> +<title>Widget Subclassing in .c Files</title> +<!-- .XS --> +<!-- (SN Widget Subclassing in .c Files --> +<!-- .XE --> +<para> +<!-- .LP --> +The .c file for a widget contains the structure initializer +for the class record variable, +which contains the following parts: +</para> +<itemizedlist> + <listitem> + <para> +Class information (for example, <emphasis remap='I'>superclass</emphasis>, <emphasis remap='I'>class_name</emphasis>, +<emphasis remap='I'>widget_size</emphasis>, +<emphasis remap='I'>class_initialize</emphasis>, and <emphasis remap='I'>class_inited</emphasis>). + </para> + </listitem> + <listitem> + <para> +Data constants (for example, <emphasis remap='I'>resources</emphasis> and <emphasis remap='I'>num_resources</emphasis>, +<emphasis remap='I'>actions</emphasis> and <emphasis remap='I'>num_actions</emphasis>, <emphasis remap='I'>visible_interest</emphasis>, +<emphasis remap='I'>compress_motion</emphasis>, +<emphasis remap='I'>compress_exposure</emphasis>, and <emphasis remap='I'>version</emphasis>). + </para> + </listitem> + <listitem> + <para> +Widget operations (for example, <emphasis remap='I'>initialize</emphasis>, <emphasis remap='I'>realize</emphasis>, <emphasis remap='I'>destroy</emphasis>, +<emphasis remap='I'>resize</emphasis>, <emphasis remap='I'>expose</emphasis>, <emphasis remap='I'>set_values</emphasis>, <emphasis remap='I'>accept_focus</emphasis>, +and any new operations specific to +the widget). + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<!-- .IN "superclass" "" "@DEF@" --> +The <emphasis remap='I'>superclass</emphasis> field points to the superclass +global class +record, declared in the superclass private .h file. +For direct subclasses of the generic core widget, +<emphasis remap='I'>superclass</emphasis> should be initialized to the address of the +<function>widgetClassRec</function> +structure. +The superclass is used for class chaining operations and for +inheriting or enveloping a superclass's operations +(see Sections 1.6.7, 1.6.9, and 1.6.10). +</para> +<para> +<!-- .LP --> +<!-- .IN "class_name" "" "@DEF@" --> +The <emphasis remap='I'>class_name</emphasis> field contains the text name for this class, +which is used by +the resource manager. +For example, the Label widget has the string ``Label''. +More than one widget class can share the same text class name. +This string must be permanently allocated prior to or during the +execution of the class initialization procedure and must not be +subsequently deallocated. + +</para> +<para> +<!-- .LP --> +<!-- .IN "widget_size" "" "@DEF@" --> +The <emphasis remap='I'>widget_size</emphasis> field is the size of the corresponding widget +instance structure +(not the size of the class structure). +</para> +<para> +<!-- .LP --> +<!-- .IN "version" "" "@DEF@" --> +The <emphasis remap='I'>version</emphasis> field indicates the toolkit +implementation version number and is used for +runtime consistency checking of the (tk and widgets in an application. +Widget writers must set it to the +implementation-defined symbolic value +<function>XtVersion</function> +in the widget class structure initialization. +Those widget writers who believe that their widget binaries are compatible +with other implementations of the (xI can put the special value +<function>XtVersionDontCheck</function> +in the <emphasis remap='I'>version</emphasis> field to disable version checking for those widgets. +If a widget needs to compile alternative code for different +revisions of the (xI interface definition, it may use the symbol +<function>XtSpecificationRelease ,</function> +as described in Chapter 13. +Use of +<function>XtVersion</function> +allows the (xI implementation to recognize widget binaries +that were compiled with older implementations. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>extension</emphasis> field is for future upward compatibility. +If the widget programmer adds fields to class parts, +all subclass structure layouts change, +requiring complete recompilation. +To allow clients to avoid recompilation, +an extension field at the end of each class part can point to a record +that contains any additional class information required. +</para> +<para> +<!-- .LP --> +All other fields are described in their respective sections. +</para> +<para> +<!-- .LP --> +The .c file also contains the declaration of the global class +structure pointer variable used to create instances of the class. +The following is an abbreviated version of the .c file +for a Label widget. +The resources table is described in Chapter 9. +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.5i 3i --> +<!-- .ta .5i 1.5i 3i --> + +/* Resources specific to Label */ +static XtResource resources[] = { + {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), + XtOffset(LabelWidget, label.foreground), XtRString, + XtDefaultForeground}, + {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), + XtOffset(LabelWidget, label.font),XtRString, + XtDefaultFont}, + {XtNlabel, XtCLabel, XtRString, sizeof(String), + XtOffset(LabelWidget, label.label), XtRString, NULL}, + . + . + . +} + +/* Forward declarations of procedures */ +static void ClassInitialize(); +static void Initialize(); +static void Realize(); +static void SetText(); +static void GetText(); + . + . + . +</literallayout> +<!-- .sp --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i 3i --> +<!-- .ta .5i 2i 3i --> +/* Class record constant */ +LabelClassRec labelClassRec = { + { + /* core_class fields */ + /* superclass */ (WidgetClass)&coreClassRec, + /* class_name */ "Label", + /* widget_size */ sizeof(LabelRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ False, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ True, + /* compress_exposure */ True, + /* compress_enterleave */ True, + /* visible_interest */ False, + /* destroy */ NULL, + /* resize */ Resize, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_offsets */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ NULL, + /* extension */ NULL + }, + { + /* Label_class fields */ + /* get_text */ GetText, + /* set_text */ SetText, + /* extension */ NULL + } +}; + +/* Class record pointer */ +WidgetClass labelWidgetClass = (WidgetClass) &labelClassRec; + +/* New method access routines */ +void LabelSetText(w, text) + Widget w; + String text; +{ + LabelWidgetClass lwc = (Label WidgetClass)XtClass(w); + XtCheckSubclass(w, labelWidgetClass, NULL); + *(lwc->label_class.set_text)(w, text) +} +/* Private procedures */ + . + . + . +</literallayout> + +</para> +</sect3> +<sect3 id="Widget_Class_and_Superclass_Look_Up"> +<title>Widget Class and Superclass Look Up</title> +<!-- .XS --> +<!-- (SN Widget Class and Superclass Look Up --> +<!-- .XE --> +<para> +<!-- .LP --> +To obtain the class of a widget, use +<function>XtClass .</function> +<!-- .IN "XtClass" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +WidgetClass XtClass(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtClass</function> +function returns a pointer to the widget's class structure. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To obtain the superclass of a widget, use +<function>XtSuperclass .</function> +<!-- .IN "XtSuperclass" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +WidgetClass XtSuperclass(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSuperclass</function> +function returns a pointer to the widget's superclass class structure. + +</para> +</sect3> +<sect3 id="Widget_Subclass_Verification"> +<title>Widget Subclass Verification</title> +<!-- .XS --> +<!-- (SN Widget Subclass Verification --> +<!-- .XE --> +<para> +<!-- .LP --> +To check the subclass to which a widget belongs, use +<function>XtIsSubclass .</function> +<!-- .IN "XtIsSubclass" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtIsSubclass(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>widget_class</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget or object instance whose class is to be checked. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class for which to test. (oC + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtIsSubclass</function> +function returns +<function>True</function> +if the class of the specified widget is equal to +or is a subclass of the specified class. +The widget's class can be any number of subclasses down the chain +and need not be an immediate subclass of the specified class. +Composite widgets that need to restrict the class of the items they +contain can use +<function>XtIsSubclass</function> +to find out if a widget belongs to the desired class of objects. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To test if a given widget belongs to a subclass of an (xI-defined +class, the (xI define macros or functions equivalent to +<function>XtIsSubclass</function> +for each of the built-in classes. These procedures are +<function>XtIsObject ,</function> +<function>XtIsRectObj ,</function> +<function>XtIsWidget ,</function> +<function>XtIsComposite ,</function> +<function>XtIsConstraint ,</function> +<function>XtIsShell ,</function> +<function>XtIsOverrideShell ,</function> +<function>XtIsWMShell ,</function> +<function>XtIsVendorShell ,</function> +<function>XtIsTransientShell ,</function> +<function>XtIsTopLevelShell ,</function> +<function>XtIsApplicationShell ,</function> +and +<function>XtIsSessionShell .</function> +<!-- .IN "XtIsObject" "" "@DEF@" --> +<!-- .IN "XtIsRectObj" "" "@DEF@" --> +<!-- .IN "XtIsWidget" "" "@DEF@" --> +<!-- .IN "XtIsComposite" "" "@DEF@" --> +<!-- .IN "XtIsConstraint" "" "@DEF@" --> +<!-- .IN "XtIsShell" "" "@DEF@" --> +<!-- .IN "XtIsOverrideShell" "" "@DEF@" --> +<!-- .IN "XtIsWMShell" "" "@DEF@" --> +<!-- .IN "XtIsVendorShell" "" "@DEF@" --> +<!-- .IN "XtIsTransientShell" "" "@DEF@" --> +<!-- .IN "XtIsTopLevelShell" "" "@DEF@" --> +<!-- .IN "XtIsApplicationShell" "" "@DEF@" --> +<!-- .IN "XtIsSessionShell" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +All these macros and functions have the same argument description. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtIs<emphasis remap='I'><class></emphasis> (<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget or object instance whose class is to be checked. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +These procedures may be faster than calling +<function>XtIsSubclass</function> +directly for the built-in classes. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To check a widget's class +and to generate a debugging error message, use +<function>XtCheckSubclass ,</function> +defined in +<function>< X11/IntrinsicP.h >:</function> +<!-- .IN "XtCheckSubclass" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCheckSubclass(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>message</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>message</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget or object whose class is to be checked. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class for which to test. (oC +<!-- .ds Me used --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>message</emphasis> + </term> + <listitem> + <para> +Specifies the message to be used. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCheckSubclass</function> +macro determines if the class of the specified widget is equal to +or is a subclass of the specified class. +The widget's class can be any number of subclasses down the chain +and need not be an immediate subclass of the specified class. +If the specified widget's class is not a subclass, +<function>XtCheckSubclass</function> +constructs an error message from the supplied message, +the widget's actual class, and the expected class and calls +<function>XtErrorMsg .</function> +<function>XtCheckSubclass</function> +should be used at the entry point of exported routines to ensure +that the client has passed in a valid widget class for the exported operation. +</para> +<para> +<!-- .LP --> +<function>XtCheckSubclass</function> +is only executed when the module has been compiled with the compiler symbol +DEBUG defined; otherwise, it is defined as the empty string +and generates no code. + +</para> +</sect3> +<sect3 id="Superclass_Chaining"> +<title>Superclass Chaining</title> +<!-- .XS --> +<!-- (SN Superclass Chaining --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Chaining" "superclass" --> +<!-- .IN "Chaining" "Subclass" --> +<!-- .IN "Superclass Chaining" "" "@DEF@" --> +<!-- .IN "Subclass Chaining" "" "@DEF@" --> +<!-- .IN "Inheritance" --> +While most fields in a widget class structure are self-contained, +some fields are linked to their corresponding fields in their superclass +structures. +With a linked field, +the (xI access the field's value only after accessing its corresponding +superclass value (called downward superclass chaining) or +before accessing its corresponding superclass value (called upward superclass +chaining). The self-contained fields are +<!-- .sp --> +<!-- .ta 2i --> +In all widget classes: <emphasis remap='I'>class_name</emphasis> +<!-- .br --> + <emphasis remap='I'>class_initialize</emphasis> +<!-- .br --> + <emphasis remap='I'>widget_size</emphasis> +<!-- .br --> + <emphasis remap='I'>realize</emphasis> +<!-- .br --> + <emphasis remap='I'>visible_interest</emphasis> +<!-- .br --> + <emphasis remap='I'>resize</emphasis> +<!-- .br --> + <emphasis remap='I'>expose</emphasis> +<!-- .br --> + <emphasis remap='I'>accept_focus</emphasis> +<!-- .br --> + <emphasis remap='I'>compress_motion</emphasis> +<!-- .br --> + <emphasis remap='I'>compress_exposure</emphasis> +<!-- .br --> + <emphasis remap='I'>compress_enterleave</emphasis> +<!-- .br --> + <emphasis remap='I'>set_values_almost</emphasis> +<!-- .br --> + <emphasis remap='I'>tm_table</emphasis> +<!-- .br --> + <emphasis remap='I'>version</emphasis> +<!-- .br --> + <emphasis remap='I'>allocate</emphasis> +<!-- .br --> + <emphasis remap='I'>deallocate</emphasis> +<!-- .sp --> +In Composite widget classes: <emphasis remap='I'>geometry_manager</emphasis> +<!-- .br --> + <emphasis remap='I'>change_managed</emphasis> +<!-- .br --> + <emphasis remap='I'>insert_child</emphasis> +<!-- .br --> + <emphasis remap='I'>delete_child</emphasis> +<!-- .br --> + <emphasis remap='I'>accepts_objects</emphasis> +<!-- .br --> + <emphasis remap='I'>allows_change_managed_set</emphasis> +<!-- .sp --> +In Constraint widget classes: <emphasis remap='I'>constraint_size</emphasis> +<!-- .sp --> +In Shell widget classes: <emphasis remap='I'>root_geometry_manager</emphasis> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +With downward superclass chaining, +the invocation of an operation first accesses the field from the +Object, +RectObj, +and +Core +class structures, then from the subclass structure, and so on down the class chain to +that widget's class structure. These superclass-to-subclass fields are +<!-- .sp --> +<!-- .ta 1i --> +<!-- .br --> + <emphasis remap='I'>class_part_initialize</emphasis> +<!-- .br --> + <emphasis remap='I'>get_values_hook</emphasis> +<!-- .br --> + <emphasis remap='I'>initialize</emphasis> +<!-- .br --> + <emphasis remap='I'>initialize_hook</emphasis> +<!-- .br --> + <emphasis remap='I'>set_values</emphasis> +<!-- .br --> + <emphasis remap='I'>set_values_hook</emphasis> +<!-- .br --> + <emphasis remap='I'>resources</emphasis> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +In addition, for subclasses of +Constraint, +the following fields of the +<function>ConstraintClassPart</function> +and +<function>ConstraintClassExtensionRec</function> +structures are chained from the +Constraint +class down to the subclass: +<!-- .ta 1i --> +<!-- .br --> + <emphasis remap='I'>resources</emphasis> +<!-- .br --> + <emphasis remap='I'>initialize</emphasis> +<!-- .br --> + <emphasis remap='I'>set_values</emphasis> +<!-- .br --> + <emphasis remap='I'>get_values_hook</emphasis> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +With upward superclass chaining, +the invocation of an operation first accesses the field from the widget +class structure, then from the superclass structure, +and so on up the class chain to the +Core, +RectObj, +and +Object +class structures. +The subclass-to-superclass fields are +<!-- .sp --> +<!-- .ta 1i --> +<!-- .br --> + <emphasis remap='I'>destroy</emphasis> +<!-- .br --> + <emphasis remap='I'>actions</emphasis> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +For subclasses of +Constraint, +the following field of +<function>ConstraintClassPart</function> +is chained from the subclass up to the +Constraint class: +<!-- .sp --> +<!-- .ta 1i --> +<!-- .br --> + <emphasis remap='I'>destroy</emphasis> + +</para> +</sect3> +<sect3 id="Class_Initialization_class_initialize_and_class_part_initialize_Procedures"> +<title>Class Initialization: class_initialize and class_part_initialize Procedures</title> +<!-- .XS --> +<!-- (SN Class Initialization: class_initialize and class_part_initialize Procedures --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Class Initialization" --> +<!-- .IN "Initialization" --> +Many class records can be initialized completely at compile or link time. +In some cases, however, +a class may need to register type converters or perform other sorts of +once-only runtime initialization. +</para> +<para> +<!-- .LP --> +Because the C language does not have initialization procedures +that are invoked automatically when a program starts up, +a widget class can declare a class_initialize procedure +that will be automatically called exactly once by the (xI. +A class initialization procedure pointer is of type +<function>XtProc :</function> +<!-- .IN "class_initialize procedure" "" "@DEF@" --> +<!-- .IN "XtProc" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtProc)(void); +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +A widget class indicates that it has no class initialization procedure by +specifying NULL in the <emphasis remap='I'>class_initialize</emphasis> field. +</para> +<para> +<!-- .LP --> +In addition to the class initialization that is done exactly once, +some classes perform initialization for fields in their parts +of the class record. +These are performed not just for the particular class, +but for subclasses as well, and are +done in the class's class part initialization procedure, +a pointer to which is stored in the <emphasis remap='I'>class_part_initialize</emphasis> field. +The class_part_initialize procedure pointer is of type +<function>XtWidgetClassProc .</function> +<!-- .IN "XtWidgetClassProc" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtWidgetClassProc)(WidgetClass); +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Points to the class structure for the class being initialized. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +During class initialization, +the class part initialization procedures for the class and all its superclasses +are called in superclass-to-subclass order on the class record. +These procedures have the responsibility of doing any dynamic initializations +necessary to their class's part of the record. +The most common is the resolution of any inherited methods defined in the +class. +For example, +if a widget class C has superclasses +Core, +Composite, +A, and B, the class record for C first is passed to +Core 's +class_part_initialize procedure. +This resolves any inherited Core methods and compiles the textual +representations of the resource list and action table that are defined in the +class record. +Next, Composite's +class_part_initialize procedure is called to initialize the +composite part of C's class record. +Finally, the class_part_initialize procedures for A, B, and C, in that order, +are called. +For further information, +see Section 1.6.9. +Classes that do not define any new class fields +or that need no extra processing for them can specify NULL +in the <emphasis remap='I'>class_part_initialize</emphasis> field. +</para> +<para> +<!-- .LP --> +All widget classes, whether they have a class initialization procedure or not, +must start with their <emphasis remap='I'>class_inited</emphasis> field +<function>False .</function> +</para> +<para> +<!-- .LP --> +The first time a widget of a class is created, +<function>XtCreateWidget</function> +ensures that the widget class and all superclasses are initialized, in +superclass-to-subclass order, by checking each <emphasis remap='I'>class_inited</emphasis> field and, +if it is +<function>False ,</function> +by calling the class_initialize and the class_part_initialize procedures +for the class and all its superclasses. +The (xI then set the <emphasis remap='I'>class_inited</emphasis> field to a nonzero value. +After the one-time initialization, +a class structure is constant. +</para> +<para> +<!-- .LP --> +The following example provides the class initialization procedure for a Label class. +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i --> +<!-- .ta .5i 2i --> +static void ClassInitialize() +{ + XtSetTypeConverter(XtRString, XtRJustify, CvtStringToJustify, + NULL, 0, XtCacheNone, NULL); +} +</literallayout> + +</para> +</sect3> +<sect3 id="Initializing_a_Widget_Class"> +<title>Initializing a Widget Class</title> +<!-- .XS --> +<!-- <function>(SN Initializing a Widget Class</function> --> +<!-- .XE --> +<!-- .IN "Widget" "class initialization" --> +<para> +<!-- .LP --> +A class is initialized when the first widget of that class or any +subclass is created. +To initialize a widget class without creating any widgets, use +<function>XtInitializeWidgetClass .</function> +<!-- .IN "XtInitializeWidgetClass" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtInitializeWidgetClass(<emphasis remap='I'>object_class</emphasis>) +<!-- .br --> + WidgetClass <emphasis remap='I'>object_class</emphasis>; +<!-- .br --> +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object_class</emphasis> + </term> + <listitem> + <para> +Specifies the object class to initialize. May be +<function>objectClass</function> +or any subclass thereof. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If the specified widget class is already initialized, +<function>XtInitializeWidgetClass</function> +returns immediately. +</para> +<para> +<!-- .LP --> +If the class initialization procedure registers type converters, +these type converters are not available until the first object +of the class or subclass is created or +<function>XtInitializeWidgetClass</function> +is called +(see Section 9.6). + +</para> +</sect3> +<sect3 id="Inheritance_of_Superclass_Operations"> +<title>Inheritance of Superclass Operations</title> +<!-- .XS --> +<!-- (SN Inheritance of Superclass Operations --> +<!-- .XE --> +<para> +<!-- .LP --> +A widget class is free to use any of its superclass's self-contained +operations rather than implementing its own code. +The most frequently inherited operations are +</para> +<itemizedlist> + <listitem> + <para> +expose + </para> + </listitem> + <listitem> + <para> +realize + </para> + </listitem> + <listitem> + <para> +insert_child + </para> + </listitem> + <listitem> + <para> +delete_child + </para> + </listitem> + <listitem> + <para> +geometry_manager + </para> + </listitem> + <listitem> + <para> +set_values_almost + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To inherit an operation <emphasis remap='I'>xyz</emphasis>, +specify the constant +<function>XtInherit <emphasis remap='I'>Xyz</emphasis></function> +in your class record. +</para> +<para> +<!-- .LP --> +Every class that declares a new procedure in its widget class part must +provide for inheriting the procedure in its class_part_initialize +procedure. +The chained operations declared in Core +and Constraint +records are never inherited. +Widget classes that do nothing beyond what their superclass does +specify NULL for chained procedures +in their class records. +</para> +<para> +<!-- .LP --> +Inheriting works by comparing the value of the field with a known, special +value and by copying in the superclass's value for that field if a match +occurs. +This special value, called the inheritance constant, +is usually the (xI internal value +<function>_XtInherit</function> +cast to the appropriate type. +<function>_XtInherit</function> +is a procedure that issues an error message if it is actually called. +</para> +<para> +<!-- .LP --> +For example, +<function>CompositeP.h</function> +contains these definitions: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .25i 1.5i 3i --> +<!-- .ta .25i 1.5i 3i --> +#define XtInheritGeometryManager ((XtGeometryHandler) _XtInherit) +#define XtInheritChangeManaged ((XtWidgetProc) _XtInherit) +#define XtInheritInsertChild ((XtArgsProc) _XtInherit) +#define XtInheritDeleteChild ((XtWidgetProc) _XtInherit) +</literallayout> +</para> +<para> +<!-- .LP --> +Composite's class_part_initialize procedure begins as follows: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .2i 1.5i 3i --> +<!-- .ta .2i 1.5i 3i --> +static void CompositeClassPartInitialize(widgetClass) + WidgetClass widgetClass; +{ + CompositeWidgetClass wc = (CompositeWidgetClass)widgetClass; + CompositeWidgetClass super = (CompositeWidgetClass)wc->core_class.superclass; + + if (wc->composite_class.geometry_manager == XtInheritGeometryManager) { + wc->composite_class.geometry_manager = super->composite_class.geometry_manager; + } + + if (wc->composite_class.change_managed == XtInheritChangeManaged) { + wc->composite_class.change_managed = super->composite_class.change_managed; + } + . + . + . +</literallayout> +</para> +<para> +<!-- .LP --> +Nonprocedure fields may be inherited in the same manner as procedure +fields. The class may declare any reserved value it wishes for +the inheritance constant for its new fields. The following inheritance +constants are defined: +</para> +<para> +<!-- .LP --> +For Object: +</para> +<itemizedlist> + <listitem> + <para> +<function>XtInheritAllocate</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritDeallocate</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +For Core: +</para> +<itemizedlist> + <listitem> + <para> +<function>XtInheritRealize</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritResize</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritExpose</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritSetValuesAlmost</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritAcceptFocus</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritQueryGeometry</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritTranslations</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritDisplayAccelerator</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +For Composite: +</para> +<itemizedlist> + <listitem> + <para> +<function>XtInheritGeometryManager</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritChangeManaged</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritInsertChild</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInheritDeleteChild</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +For Shell: +</para> +<itemizedlist> + <listitem> + <para> +<function>XtInheritRootGeometryManager</function> + + </para> + </listitem> +</itemizedlist> +</sect3> +<sect3 id="Invocation_of_Superclass_Operations"> +<title>Invocation of Superclass Operations</title> +<!-- .XS --> +<!-- (SN Invocation of Superclass Operations --> +<!-- .XE --> +<para> +<!-- .LP --> +A widget sometimes needs to call a superclass operation +that is not chained. +For example, +a widget's expose procedure might call its superclass's <emphasis remap='I'>expose</emphasis> +and then perform a little more work on its own. +For example, a Composite +class with predefined managed children can implement insert_child +by first calling its superclass's <emphasis remap='I'>insert_child</emphasis> +<!-- .IN "insert_child procedure" --> +and then calling +<function>XtManageChild</function> +to add the child to the managed set. +</para> +<para> +<!-- .LP --> +<!-- .NT --> +A class method should not use +<function>XtSuperclass</function> +but should instead call the class method of its own specific superclass +directly through the superclass record. +That is, it should use its own class pointers only, +not the widget's class pointers, +as the widget's class may be a subclass of the +class whose implementation is being referenced. +<!-- .NE --> +This technique is referred to as <emphasis remap='I'>enveloping</emphasis> the superclass's operation. + +</para> +</sect3> +<sect3 id="Class_Extension_Records"> +<title>Class Extension Records</title> +<!-- .XS --> +<!-- (SN Class Extension Records --> +<!-- .XE --> +<!-- .IN "Widget" "class extension records" --> +<para> +<!-- .LP --> +It may be necessary at times to add new fields to already existing +widget class structures. To permit this to be done without requiring +recompilation of all subclasses, the last field in a class part structure +should be an extension pointer. If no extension fields for a class +have yet been defined, subclasses should initialize the value of the +extension pointer to NULL. +</para> +<para> +<!-- .LP --> +If extension fields exist, as is the case with the +Composite, +Constraint, +and +Shell +classes, subclasses can provide values for these fields by setting the +<emphasis remap='I'>extension</emphasis> pointer for the appropriate part in their class structure to +point to a statically declared extension record containing the +additional fields. +Setting the <emphasis remap='I'>extension</emphasis> field is never mandatory; code that uses fields +in the extension record must always check the <emphasis remap='I'>extension</emphasis> field and take +some appropriate default action if it is NULL. +</para> +<para> +<!-- .LP --> +In order to permit multiple subclasses and libraries to chain extension +records from a single <emphasis remap='I'>extension</emphasis> field, extension records should be +declared as a linked list, and each extension record definition should +contain the following four fields at the beginning of the structure +declaration: +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +struct { + XtPointer next_extension; + XrmQuark record_type; + long version; + Cardinal record_size; +}; +</literallayout> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>next_extension</emphasis> + </term> + <listitem> + <para> +Specifies the next record in the list, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>record_type</emphasis> + </term> + <listitem> + <para> +Specifies the particular structure declaration to which +each extension record instance conforms. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>version</emphasis> + </term> + <listitem> + <para> +Specifies a version id symbolic constant supplied by +the definer of the structure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>record_size</emphasis> + </term> + <listitem> + <para> +Specifies the total number of bytes allocated for the +extension record. + </para> + </listitem> + </varlistentry> +</variablelist> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>record_type</emphasis> field identifies the contents of the extension record +and is used by the definer of the record to locate its particular +extension record in the list. The +<emphasis remap='I'>record_type</emphasis> field is normally assigned the +result of +<function>XrmStringToQuark</function> +for a registered string constant. The +(xI reserve all record type strings beginning with the two +characters ``XT'' for future standard uses. The value +<function>\s-1NULLQUARK\s+1</function> +may also be used +by the class part owner in extension records attached to its own class +part extension field to identify the extension record unique to that +particular class. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>version</emphasis> field is an owner-defined constant that may be used to +identify binary files that have been compiled with alternate +definitions of the remainder of the extension record data structure. The private +header file for a widget class should provide a symbolic constant for +subclasses to use to initialize this field. +The <emphasis remap='I'>record_size</emphasis> field value includes the four common header fields and +should normally be initialized with +<function>sizeof ().</function> +</para> +<para> +<!-- .LP --> +Any value stored in the class part extension fields of +<function>CompositeClassPart ,</function> +<function>ConstraintClassPart ,</function> +or +<function>ShellClassPart</function> +must point to an extension record conforming to this definition. +</para> +<para> +<!-- .LP --> +The (xI provide a utility function for widget writers to locate a +particular class extension record in a linked list, given a widget class +and the offset of the <emphasis remap='I'>extension</emphasis> field in the class record. +</para> +<para> +<!-- .LP --> +To locate a class extension record, use +<function>XtGetClassExtension .</function> +<!-- .IN "XtGetClassExtension" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtPointer XtGetClassExtension(<emphasis remap='I'>object_class</emphasis>, <emphasis remap='I'>byte_offset</emphasis>, \ +<emphasis remap='I'>type</emphasis>, <emphasis remap='I'>version</emphasis>, <emphasis remap='I'>record_size</emphasis>) +<!-- .br --> + WidgetClass <emphasis remap='I'>object_class</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>byte_offset</emphasis>; +<!-- .br --> + XrmQuark <emphasis remap='I'>type</emphasis>; +<!-- .br --> + long <emphasis remap='I'>version</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>record_size</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object_class</emphasis> + </term> + <listitem> + <para> +Specifies the object class containing the extension list to be searched. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>byte_offset</emphasis> + </term> + <listitem> + <para> +Specifies the offset in bytes from the base of the +class record of the extension field to be searched. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the record_type of the class extension to be located. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>version</emphasis> + </term> + <listitem> + <para> +Specifies the minimum acceptable version of the class +extension required for a match. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>record_size</emphasis> + </term> + <listitem> + <para> +Specifies the minimum acceptable length of the class +extension record required for a match, or 0. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The list of extension records at the specified offset in the specified +object class will be searched for a match on the specified type, +a version greater than or equal to the specified version, and a record +size greater than or equal the specified record_size if it is nonzero. +<function>XtGetClassExtension</function> +returns a pointer to a matching extension record or NULL if no match +is found. The returned extension record must not be modified or +freed by the caller if the caller is not the extension owner. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect3> +</sect2> +</chapter> +</book> diff --git a/specs/CH02.xml b/specs/CH02.xml new file mode 100644 index 0000000..484d011 --- /dev/null +++ b/specs/CH02.xml @@ -0,0 +1,5064 @@ +<!-- .\" $Xorg: CH02,v 1.3 2000/08/17 19:42:42 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 2</function>\s-1 + +\s+1<function>Widget Instantiation</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 2 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 2 \(em Widget Instantiation --> +<!-- .XE --> +A hierarchy of widget instances constitutes a widget tree. +The shell widget returned by +<function>XtAppCreateShell</function> +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. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +Composite widgets, that is, members of the class +<function>compositeWidgetClass ,</function> +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. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +A widget tree is manipulated by several (xI functions. +For example, +<function>XtRealizeWidget</function> +traverses the tree downward and recursively realizes all +pop-up widgets and children of composite widgets. +<function>XtDestroyWidget</function> +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. +<function>XtMakeGeometryRequest</function> +traverses the tree up one level and calls the geometry manager +that is responsible for a widget child's geometry. +</para> +<para> +<!-- .LP --> +To facilitate upward traversal of the widget tree, +each widget has a pointer to its parent widget. +The +Shell +widget that +<function>XtAppCreateShell</function> +returns has a <emphasis remap='I'>parent</emphasis> pointer of NULL. +</para> +<para> +<!-- .LP --> +To facilitate downward traversal of the widget tree, +the <emphasis remap='I'>children</emphasis> 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. + +</para> +<sect2 id="Initializing_the_tk"> +<title>Initializing the (tk</title> +<!-- .XS --> +<!-- <function>(SN Initializing the (tk</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Before an application can call any (xI function +other than +<function>XtSetLanguageProc</function> +and +<function>XtToolkitThreadInitialize ,</function> +it must initialize the (xI by using +</para> +<itemizedlist> + <listitem> + <para> +<function>XtToolkitInitialize ,</function> +which initializes the (xI internals + </para> + </listitem> + <listitem> + <para> +<function>XtCreateApplicationContext ,</function> +which initializes the per-application state + </para> + </listitem> + <listitem> + <para> +<function>XtDisplayInitialize</function> +or +<function>XtOpenDisplay ,</function> +which initializes the per-display state + </para> + </listitem> + <listitem> + <para> +<function>XtAppCreateShell ,</function> +which creates the root of a widget tree + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Or an application can call the convenience procedure +<function>XtOpenApplication ,</function> +which combines the functions of the preceding procedures. +An application wishing to use the ANSI C locale mechanism should call +<function>XtSetLanguageProc</function> +prior to calling +<function>XtDisplayInitialize ,</function> +<function>XtOpenDisplay ,</function> +<function>XtOpenApplication ,</function> +or +<function>XtAppInitialize .</function> +</para> +<para> +<!-- .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 +<function>Display</function> +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 +<function>XtAppContext</function> +<!-- .IN "XtAppContext" "" "@DEF@" --> +is opaque to clients. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To initialize the (xI internals, use +<function>XtToolkitInitialize .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtToolkitInitialize" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtToolkitInitialize() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +If +<function>XtToolkitInitialize</function> +was previously called, it returns immediately. +When +<function>XtToolkitThreadInitialize</function> +is called before +<function>XtToolkitInitialize ,</function> +the latter is protected against +simultaneous activation by multiple threads. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To create an application context, use +<function>XtCreateApplicationContext .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreateApplicationContext" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtAppContext XtCreateApplicationContext() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCreateApplicationContext</function> +function returns an application context, +which is an opaque type. +Every application must have at least one application context. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To destroy an application context and close any +remaining display connections in it, use +<function>XtDestroyApplicationContext .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDestroyApplicationContext" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtDestroyApplicationContext(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDestroyApplicationContext</function> +function destroys the specified application context. +If called from within an event dispatch (for example, in a callback procedure), +<function>XtDestroyApplicationContext</function> +does not destroy the application context until the dispatch is complete. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To get the application context in which a given widget was created, use +<function>XtWidgetToApplicationContext .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWidgetToApplicationContext" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtAppContext XtWidgetToApplicationContext(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which you want the application context. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtWidgetToApplicationContext</function> +function returns the application context for the specified widget. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To initialize a display and add it to an application context, use +<function>XtDisplayInitialize .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDisplayInitialize" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtDisplayInitialize(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>display</emphasis>, \ +<emphasis remap='I'>application_name</emphasis>, <emphasis remap='I'>application_class</emphasis>, +<!-- .br --> + <emphasis remap='I'>options</emphasis>, <emphasis remap='I'>num_options</emphasis>, <emphasis remap='I'>argc</emphasis>, <emphasis remap='I'>argv</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescRec *<emphasis remap='I'>options</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>argv</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies a previously opened display connection. Note that a single +display connection can be in at most one application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the application instance. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of this application, +which is usually the generic name for all instances of this application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies how to parse the command line for any application-specific resources. +The <emphasis remap='I'>options</emphasis> argument is passed as a parameter to +<function>XrmParseCommand .</function> +For further information, +see Section 15.9 in <emphasis remap='I'>(xL</emphasis> and Section 2.4 of this specification. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the options list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line parameters. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv</emphasis> + </term> + <listitem> + <para> +Specifies the list of command line parameters. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDisplayInitialize</function> +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 +<function>XrmParseCommand</function> +function to parse the command line, +and performs other per-display initialization. +After +<function>XrmParseCommand</function> +has been called, +<emphasis remap='I'>argc</emphasis> and <emphasis remap='I'>argv</emphasis> contain only those parameters that +were not in the standard option table or in the table specified by the +<emphasis remap='I'>options</emphasis> argument. +If the modified <emphasis remap='I'>argc</emphasis> is not zero, +most applications simply print out the modified <emphasis remap='I'>argv</emphasis> along with a message +listing the allowable options. +On POSIX-based systems, +the application name is usually the final component of <emphasis remap='I'>argv</emphasis>[0]. +If the synchronous resource is +<function>True ,</function> +<function>XtDisplayInitialize</function> +calls the Xlib +<function>XSynchronize</function> +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 <emphasis remap='I'>application_name</emphasis>, +<emphasis remap='I'>application_class</emphasis>, <emphasis remap='I'>options</emphasis>, and <emphasis remap='I'>num_options</emphasis> arguments. +</para> +<para> +<!-- .LP --> +<function>XtDisplayInitialize</function> +calls +<function>XrmSetDatabase</function> +to associate the resource database of the default screen with the +display before returning. + +<!-- .KS --> +</para> +<para> +<!-- .LP --> +To open a display, initialize it, and then +add it to an application context, use +<function>XtOpenDisplay .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOpenDisplay" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Display *XtOpenDisplay(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>display_string</emphasis>, \ +<emphasis remap='I'>application_name</emphasis>, <emphasis remap='I'>application_class</emphasis>, +<!-- .br --> + <emphasis remap='I'>options</emphasis>, <emphasis remap='I'>num_options</emphasis>, <emphasis remap='I'>argc</emphasis>, <emphasis remap='I'>argv</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>display_string</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescRec *<emphasis remap='I'>options</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>argv</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>display_string</emphasis> + </term> + <listitem> + <para> +Specifies the display string, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the application instance, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of this application, +which is usually the generic name for all instances of this application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies how to parse the command line for any application-specific resources. +The options argument is passed as a parameter to +<function>XrmParseCommand .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the options list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line parameters. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv</emphasis> + </term> + <listitem> + <para> +Specifies the list of command line parameters. +<!-- .KE --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOpenDisplay</function> +function calls +<function>XOpenDisplay</function> +with the specified <emphasis remap='I'>display_string</emphasis>. +If <emphasis remap='I'>display_string</emphasis> is NULL, +<function>XtOpenDisplay</function> +uses the current value of the \-display option specified in <emphasis remap='I'>argv</emphasis>. +If no display is specified in <emphasis remap='I'>argv</emphasis>, +the user's default display is retrieved from the environment. +On POSIX-based systems, +this is the value of the +<function>\s-1DISPLAY\s+1</function> +environment variable. +</para> +<para> +<!-- .LP --> +If this succeeds, +<function>XtOpenDisplay</function> +then calls +<function>XtDisplayInitialize</function> +and passes it the opened display and +the value of the \-name option specified in <emphasis remap='I'>argv</emphasis> as the application name. +If no \-name option is specified +and <emphasis remap='I'>application_name</emphasis> is +non-NULL, <emphasis remap='I'>application_name</emphasis> is passed to +<function>XtDisplayInitialize .</function> +If <emphasis remap='I'>application_name</emphasis> is NULL and if the environment variable +<function>\s-1RESOURCE_NAME\s+1</function> +is set, the value of +<function>\s-1RESOURCE_NAME\s+1</function> +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 <emphasis remap='I'>argv</emphasis>[0] less any directory and file type components, that is, the +final component of <emphasis remap='I'>argv</emphasis>[0], if specified. If <emphasis remap='I'>argv</emphasis>[0] does not exist or +is the empty string, the application name is ``main''. +<function>XtOpenDisplay</function> +returns the newly opened display or NULL if it failed. +</para> +<para> +<!-- .LP --> +See Section 7.12 for information regarding the use of +<function>XtOpenDisplay</function> +in multiple threads. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To close a display and remove it from an application context, use +<function>XtCloseDisplay .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCloseDisplay" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCloseDisplay(<emphasis remap='I'>display</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCloseDisplay</function> +function calls +<function>XCloseDisplay</function> +with the specified <emphasis remap='I'>display</emphasis> as soon as it is safe to do so. +If called from within an event dispatch (for example, a callback procedure), +<function>XtCloseDisplay</function> +does not close the display until the dispatch is complete. +Note that applications need only call +<function>XtCloseDisplay</function> +if they are to continue executing after closing the display; +otherwise, they should call +<function>XtDestroyApplicationContext .</function> +</para> +<para> +<!-- .LP --> +See Section 7.12 for information regarding the use of +<function>XtCloseDisplay</function> +in multiple threads. + +</para> +</sect2> +<sect2 id="Establishing_the_Locale"> +<title>Establishing the Locale</title> +<!-- .XS --> +<!-- <function>(SN Establishing the Locale</function> --> +<!-- .XE --> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +The callout procedure provided by the application is of type +<function>XtLanguageProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtLanguageProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef String (*XtLanguageProc)(Display*, String, XtPointer); +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + String <emphasis remap='I'>language</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Passes the display. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>language</emphasis> + </term> + <listitem> + <para> +Passes the initial language value obtained from the command line +or server per-display resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the additional client data specified in the call to +<function>XtSetLanguageProc .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The language procedure allows an application to set the locale to +the value of the language resource determined by +<function>XtDisplayInitialize .</function> +The function returns a new language string that +will be subsequently used by +<function>XtDisplayInitialize</function> +to establish the path for loading resource files. The returned +string will be copied by the (xI into new memory. +</para> +<para> +<!-- .LP --> +Initially, no language procedure is set by the (xI. +To set the language procedure for use by +<function>XtDisplayInitialize ,</function> +use +<function>XtSetLanguageProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN XtSetLanguageProc "" "@DEF@" --> +<!-- .IN "language procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtLanguageProc XtSetLanguageProc(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtLanguageProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context in which the language procedure is +to be used, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the language procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional client data to be passed to the language +procedure when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtSetLanguageProc</function> +sets the language procedure that will be called from +<function>XtDisplayInitialize</function> +for all subsequent Displays initialized in the specified application +context. If <emphasis remap='I'>app_context</emphasis> 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 <emphasis remap='I'>proc</emphasis> is NULL, a default language procedure is +registered. +<function>XtSetLanguageProc</function> +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 +<function>XtSetLanguageProc ,</function> +it will cause the default language procedure to be registered. +</para> +<para> +<!-- .LP --> +The default language procedure does the following: +</para> +<itemizedlist> + <listitem> + <para> +Sets the locale according to the environment. On ANSI C-based +systems this is done by calling +<function>setlocale (</function> +<function>LC_ALL ,</function> +<emphasis remap='I'>language</emphasis> ). +If an error is encountered, a warning message is issued with +<function>XtWarning .</function> + </para> + </listitem> + <listitem> + <para> +Calls +<function>XSupportsLocale</function> +to verify that the current locale is supported. +If the locale is not supported, a warning message is issued with +<function>XtWarning</function> +and the locale is set to ``C''. + </para> + </listitem> + <listitem> + <para> +Calls +<function>XSetLocaleModifiers</function> +specifying the empty string. + </para> + </listitem> + <listitem> + <para> +Returns the value of the current locale. On ANSI C-based systems this +is the return value from a final call to +<function>setlocale (</function> +<function>LC_ALL ,</function> +NULL ). + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +A client wishing to use this mechanism to establish locale can do so +by calling +<function>XtSetLanguageProc</function> +prior to +<function>XtDisplayInitialize ,</function> +as in the following example. +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i --> + Widget top; + XtSetLanguageProc(NULL, NULL, NULL); + top = XtOpenApplication(...); + ... +</literallayout> + +</para> +</sect2> +<sect2 id="Loading_the_Resource_Database"> +<title>Loading the Resource Database</title> +<!-- .XS --> +<!-- <function>(SN Loading the Resource Database</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The +<function>XtDisplayInitialize</function> +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: + +</para> +<itemizedlist> + <listitem> + <para> +Application command line (<emphasis remap='I'>argc</emphasis>, <emphasis remap='I'>argv</emphasis>). + </para> + </listitem> + <listitem> + <para> +Per-host user environment resource file on the local host. + </para> + </listitem> + <listitem> + <para> +Per-screen resource specifications from the server. + </para> + </listitem> + <listitem> + <para> +Per-display resource specifications from the server or from +<!-- .br --> +the user preference file on the local host. + </para> + </listitem> + <listitem> + <para> +Application-specific user resource file on the local host. + </para> + </listitem> + <listitem> + <para> +Application-specific class resource file on the local host. + + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +When the resource database for a particular screen on the display +is needed (either internally, or when +<function>XtScreenDatabase</function> +is called), +it is created in the following manner using the sources listed +above in the same order: + +</para> +<itemizedlist> + <listitem> + <para> +A temporary database, the ``server resource database'', is +created from the string returned by +<function>XResourceManagerString</function> +or, if +<function>XResourceManagerString</function> +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/<function>.Xdefaults</function>. +<!-- .IN ".Xdefaults" "" "@DEF@" --> + + </para> + </listitem> + <listitem> + <para> +If a language procedure has been set, +<function>XtDisplayInitialize</function> +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, +<function>XtDisplayInitialize</function> +queries the server resource database (which is assumed to be entirely +in XPCS) for the resource +<emphasis remap='I'>name</emphasis><function>.xnlLanguage</function>, class <emphasis remap='I'>Class</emphasis><function>.XnlLanguage</function> +where <emphasis remap='I'>name</emphasis> +<!-- .IN "xnlLanguage" "" "@DEF@" --> +<!-- .IN "Resources" "xnlLanguage" --> +and <emphasis remap='I'>Class</emphasis> are the <emphasis remap='I'>application_name</emphasis> and +<emphasis remap='I'>application_class</emphasis> specified to +<function>XtDisplayInitialize .</function> +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. + + </para> + </listitem> + <listitem> + <para> +The screen resource database is initialized by parsing the command +line in the manner specified by Section 2.4. + + </para> + </listitem> + <listitem> + <para> +If a language procedure has not been set, +the initial database is then queried for the resource +<emphasis remap='I'>name</emphasis><function>.xnlLanguage</function>, class <emphasis remap='I'>Class</emphasis><function>.XnlLanguage</function> +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 +<function>\s-1LANG\s+1</function> +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. + + </para> + </listitem> + <listitem> + <para> +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 +<function>\s-1XENVIRONMENT\s+1</function> +environment variable. +If this environment variable does not exist, the user's home directory +is searched for a file named +<function>\&.Xdefaults-<emphasis remap='I'>host</emphasis> ,</function> +where <emphasis remap='I'>host</emphasis> is the host name of the machine on which the +application is running. + + </para> + </listitem> + <listitem> + <para> +The per-screen resource specifications are then merged into the screen +resource database, if they exist. These specifications are the string +returned by +<function>XScreenResourceString</function> +for the respective screen and are owned entirely by the user. + + </para> + </listitem> + <listitem> + <para> +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. + + </para> + </listitem> + <listitem> + <para> +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 +<function>XrmSetDatabase</function> +with the current screen resource database, after preserving the +original display-associated database, then calling +<function>XtResolvePathname</function> +with the parameters +(<emphasis remap='I'>display</emphasis>, NULL, NULL, NULL, <emphasis remap='I'>path</emphasis>, NULL, 0, NULL), +where <emphasis remap='I'>path</emphasis> is defined in an operating-system-specific way. +On POSIX-based systems, <emphasis remap='I'>path</emphasis> is defined to be the value +of the environment variable +<function>\s-1XUSERFILESEARCHPATH\s+1</function> +if this is defined. If +<function>\s-1XUSERFILESEARCHPATH\s+1</function> +is not defined, an implementation-dependent default value is used. +This default value is constrained in the following manner: + +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +If the environment variable +<function>\s-1XAPPLRESDIR\s+1</function> +is not defined, the default +<function>\s-1XUSERFILESEARCHPATH\s+1</function> +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 are +implementation-dependent. + + </para> + </listitem> + <listitem> + <para> +If +<function>\s-1XAPPLRESDIR\s+1</function> +is defined, the default +<function>\s-1XUSERFILESEARCHPATH\s+1</function> +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 are +implementation-dependent. +<!-- .RE --> + + </para> + </listitem> + <listitem> + <para> +Last, 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 sitewide customizations specified by the system manager. +The name of the application class resource file is found by calling +<function>XtResolvePathname</function> +with the parameters +(<emphasis remap='I'>display</emphasis>, ``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 +<function>XtAppSetFallbackResources .</function> +Note that the customization substitution string is retrieved +dynamically by +<function>XtResolvePathname</function> +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 +<function>XtResolvePathname ,</function> +the original display-associated database is restored. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To obtain the resource database for a particular screen, use +<function>XtScreenDatabase .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtScreenDatabase" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XrmDatabase XtScreenDatabase(<emphasis remap='I'>screen</emphasis>) +<!-- .br --> + Screen *<emphasis remap='I'>screen</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>screen</emphasis> + </term> + <listitem> + <para> +Specifies the screen whose resource database is to be returned. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtScreenDatabase</function> +function returns the fully merged resource database as specified above, +associated with the specified screen. If the specified <emphasis remap='I'>screen</emphasis> +does not belong to a +<function>Display</function> +initialized by +<function>XtDisplayInitialize ,</function> +the results are undefined. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To obtain the default resource database associated with a particular display, use +<function>XtDatabase .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDatabase" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XrmDatabase XtDatabase(<emphasis remap='I'>display</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDatabase</function> +function is equivalent to +<function>XrmGetDatabase .</function> +It returns the database associated with the specified display, or +NULL if a database has not been set. +<!-- .sp --> +</para> +<para> +<!-- .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 +<function>XtAppSetFallbackResources .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetFallbackResources" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppSetFallbackResources(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>specification_list</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>specification_list</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context in which +the fallback specifications will be used. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>specification_list</emphasis> + </term> + <listitem> + <para> +Specifies a NULL-terminated list of +resource specifications to preload +the database, or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Each entry in <emphasis remap='I'>specification_list</emphasis> points to a string in the format of +<function>XrmPutLineResource .</function> +Following a call to +<function>XtAppSetFallbackResources ,</function> +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 <emphasis remap='I'>specification_list</emphasis> is not NULL, the +resource specifications in <emphasis remap='I'>specification_list</emphasis> will be merged +into the screen resource database in place of the application-specific +class resource file. +<function>XtAppSetFallbackResources</function> +is not +required to copy <emphasis remap='I'>specification_list</emphasis>; 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 +<function>XtAppSetFallbackResources</function> +is called again. The value NULL for +<emphasis remap='I'>specification_list</emphasis> 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. + +</para> +</sect2> +<sect2 id="Parsing_the_Command_Line"> +<title>Parsing the Command Line</title> +<!-- .XS --> +<!-- <function>(SN Parsing the Command Line</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The +<function>XtOpenDisplay</function> +function first parses the command line for the following options: +<variablelist> + <varlistentry> + <term> + \-display + </term> + <listitem> + <para> +Specifies the display name for +<function>XOpenDisplay .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + \-name + </term> + <listitem> + <para> +Sets the resource name prefix, +which overrides the application name passed to +<function>XtOpenDisplay .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + \-xnllanguage + </term> + <listitem> + <para> +Specifies the initial language string for establishing locale +and for finding application class resource files. + </para> + </listitem> + </varlistentry> +</variablelist> +</para> +<para> +<!-- .LP --> +<function>XtDisplayInitialize</function> +has a table of standard command line options that are passed to +<function>XrmParseCommand</function> +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 <emphasis remap='I'>(xL</emphasis>. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .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; + +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The standard table contains the following entries: +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +Note that any unique abbreviation for an option name in the standard table +or in the application table is accepted. +</para> +<para> +<!-- .LP --> +If reverseVideo is +<function>True ,</function> +the values of +<function>XtDefaultForeground</function> +and +<function>XtDefaultBackground</function> +are exchanged for all screens on the Display. +</para> +<para> +<!-- .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, +<function>XtDisplayInitialize</function> +makes a call to +<function>XSynchronize</function> +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. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .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 +<function>xmh ,</function> +you can start it up as +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +xmh \-xrm 'xmh*Command.background: red' +</literallayout> +</para> +<para> +<!-- .LP --> +When it parses the command line, +<function>XtDisplayInitialize</function> +merges the application option table with the standard option table +before calling the Xlib +<function>XrmParseCommand</function> +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. + +</para> +</sect2> +<sect2 id="Creating_Widgets"> +<title>Creating Widgets</title> +<!-- .XS --> +<!-- <function>(SN Creating Widgets</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The creation of widget instances is a three-phase process: +</para> +<itemizedlist> + <listitem> + <para> +The widgets are allocated and initialized with resources +and are optionally added to the managed subset of their parent. + </para> + </listitem> + <listitem> + <para> +All composite widgets are notified of their managed children +in a bottom-up traversal of the widget tree. + </para> + </listitem> + <listitem> + <para> +The widgets create X windows, which then are mapped. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<!-- .EQ --> +delim $$ +<!-- .EN --> +To start the first phase, +the application calls +<function>XtCreateWidget</function> +for all its widgets and adds some (usually, most or all) of its widgets +to their respective parents' managed set by calling +<function>XtManageChild .</function> +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 --> +</para> +<para> +<!-- .LP --> +After all widgets have been created, +the application calls +<function>XtRealizeWidget</function> +with the top-level widget to execute the second and third phases. +<function>XtRealizeWidget</function> +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. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +Finally, +<function>XtRealizeWidget</function> +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. + +</para> +<sect3 id="Creating_and_Merging_Argument_Lists"> +<title>Creating and Merging Argument Lists</title> +<!-- .XS --> +<!-- <function>(SN Creating and Merging Argument Lists</function> --> +<!-- .XE --> +<para> +<!-- .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 +<function>Arg</function> +structures, which contains +<!-- .IN "ArgList" "" "@DEF@" --> +<!-- .IN "Arg" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String name; + XtArgVal value; +} Arg, *ArgList; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +where +<function>XtArgVal</function> +is as defined in Section 1.5. +</para> +<para> +<!-- .LP --> +If the size of the resource is less than or equal to the size of an +<function>XtArgVal ,</function> +the resource value is stored directly in <emphasis remap='I'>value</emphasis>; +otherwise, a pointer to it is stored in <emphasis remap='I'>value</emphasis>. +</para> +<para> +<!-- .LP --> +To set values in an +<function>ArgList ,</function> +use +<function>XtSetArg .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetArg" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetArg(<emphasis remap='I'>arg</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>value</emphasis>) +<!-- .br --> + Arg <emphasis remap='I'>arg</emphasis>; +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + XtArgVal <emphasis remap='I'>value</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>arg</emphasis> + </term> + <listitem> + <para> +Specifies the <emphasis remap='I'>name/value</emphasis> pair to set. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the resource. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value</emphasis> + </term> + <listitem> + <para> +Specifies the value of the resource if it will fit in an +<function>XtArgVal ,</function> +else the address. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSetArg</function> +function is usually used in a highly stylized manner to +minimize the probability of making a mistake; for example: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .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); +</literallayout> +</para> +<para> +<!-- .LP --> +Alternatively, an application can statically declare the argument list +and use +<function>XtNumber :</function> +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +static Args args[] = { + {XtNheight, (XtArgVal) 100}, + {XtNwidth, (XtArgVal) 200}, +}; +XtSetValues(Widget, args, XtNumber(args)); +</literallayout> +</para> +<para> +<!-- .LP --> +Note that you should not use expressions with side effects such as +auto-increment or auto-decrement +within the first argument to +<function>XtSetArg .</function> +<function>XtSetArg</function> +can be implemented as a macro that evaluates the first argument twice. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To merge two +arglist arrays, use +<function>XtMergeArgLists .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMergeArgLists" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +ArgList XtMergeArgLists(<emphasis remap='I'>args1</emphasis>, <emphasis remap='I'>num_args1</emphasis>, <emphasis remap='I'>args2</emphasis>, \ +<emphasis remap='I'>num_args2</emphasis>) +<!-- .br --> + ArgList <emphasis remap='I'>args1</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args1</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args2</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args2</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>args1</emphasis> + </term> + <listitem> + <para> +Specifies the first argument list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args1</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the first argument list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args2</emphasis> + </term> + <listitem> + <para> +Specifies the second argument list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args2</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the second argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtMergeArgLists</function> +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 +<function>XtFree .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "varargs" "" "@DEF@" --> +All (xI interfaces that require +<function>ArgList</function> +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 +<function>ArgList</function> +procedure; e.g., +<function>XtVaCreateWidget .</function> +Each procedure named <function>XtVa</function><emphasis remap='I'>something</emphasis> takes as its +last arguments, in place of the corresponding +<function>ArgList /</function> +<function>Cardinal</function> +parameters, a variable parameter list of resource name and +value pairs where each name is of type +<function>String</function> +and each value is of type +<function>XtArgVal .</function> +The end of the list is identified by a <emphasis remap='I'>name</emphasis> 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 +<function>ArgList</function> +and varargs forms interchangeably. +</para> +<para> +<!-- .LP --> +Two special names are defined for use only in varargs lists: +<function>XtVaTypedArg</function> +and +<function>XtVaNestedList .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaTypedArg" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +#define XtVaTypedArg "XtVaTypedArg" +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +If the name +<function>XtVaTypedArg</function> +is specified in place of a resource +name, then the following four arguments are interpreted as a +<emphasis remap='I'>name/type/value/size</emphasis> tuple <emphasis remap='I'>where</emphasis> name is of type +<function>String ,</function> +<emphasis remap='I'>type</emphasis> is of type +<function>String ,</function> +<emphasis remap='I'>value</emphasis> is of type +<function>XtArgVal ,</function> +and <emphasis remap='I'>size</emphasis> is of type int. When a varargs list containing +<function>XtVaTypedArg</function> +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 <emphasis remap='I'>type</emphasis> is +XtRString, then <emphasis remap='I'>value</emphasis> contains a pointer to the string and <emphasis remap='I'>size</emphasis> +contains the number of bytes allocated, including the trailing null +byte. If <emphasis remap='I'>type</emphasis> is not XtRString, then <emphasis remap='I'>if</emphasis> size is +less than or equal to +<function>sizeof</function>(<function>XtArgVal</function>), the value should be the data cast to the type +<function>XtArgVal ,</function> +otherwise <emphasis remap='I'>value</emphasis> 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 --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaNestedList" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +#define XtVaNestedList "XtVaNestedList" +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +If the name +<function>XtVaNestedList</function> +is specified in place of a resource name, +then the following argument is interpreted as an +<function>XtVarArgsList</function> +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 --> +</para> +<para> +<!-- .LP --> +To dynamically allocate a varargs list for use with +<function>XtVaNestedList</function> +in multiple calls, use +<function>XtVaCreateArgsList .</function> +<!-- .IN "XtVaCreateArgsList" "" "@DEF@" --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef XtPointer XtVarArgsList; +</literallayout> +</para> +<para> +<!-- .LP --> +</para> +<!-- .FD 0 --> +XtVarArgsList XtVaCreateArgsList(<emphasis remap='I'>unused</emphasis>, ...) +<!-- .br --> + XtPointer <emphasis remap='I'>unused</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>unused</emphasis> + </term> + <listitem> + <para> +This argument is not currently used and must be specified as NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies a variable parameter list of resource +name and value pairs. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtVaCreateArgsList</function> +function allocates memory and copies its arguments into a +single list pointer, which may be used with +<function>XtVaNestedList .</function> +The end of +both lists is identified by a <emphasis remap='I'>name</emphasis> entry containing NULL. Any entries +of type +<function>XtVaTypedArg</function> +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 +<function>XtFree</function> +when no longer needed. +</para> +<para> +<!-- .LP --> +Use of resource files and of the resource database is generally +encouraged over lengthy arglist or varargs lists whenever possible in +order to permit modification without recompilation. + +</para> +</sect3> +<sect3 id="Creating_a_Widget_Instance"> +<title>Creating a Widget Instance</title> +<!-- .XS --> +<!-- <function>(SN Creating a Widget Instance</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To create an instance of a widget, use +<function>XtCreateWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreateWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtCreateWidget(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>object_class</emphasis>, <emphasis remap='I'>parent</emphasis>, \ +<emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>object_class</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>parent</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +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. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>object_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created object. (oC + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>parent</emphasis> + </term> + <listitem> + <para> +Specifies the parent widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCreateWidget</function> +function performs all the boilerplate operations of widget +creation, doing the following in order: +</para> +<itemizedlist> + <listitem> + <para> +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. + </para> + </listitem> + <listitem> + <para> +If the specified class is not +<function>coreWidgetClass</function> +or a subclass thereof, +and the parent's class is a subclass of +<function>compositeWidgetClass</function> +and either no extension record in +the parent's composite class part extension field exists with the +<emphasis remap='I'>record_type</emphasis> +<function>\s-1NULLQUARK\s+1</function> +or the <emphasis remap='I'>accepts_objects</emphasis> field in the extension +record is +<function>False ,</function> +<function>XtCreateWidget</function> +issues a fatal error; see Section 3.1 and Chapter 12. + </para> + </listitem> + <listitem> + <para> +If the specified class contains an extension record in the object class +part <emphasis remap='I'>extension</emphasis> field with <emphasis remap='I'>record_type</emphasis> +<function>\s-1NULLQUARK\s+1</function> +and the <emphasis remap='I'>allocate</emphasis> field is not NULL, +the procedure is invoked to allocate memory +for the widget instance. If the parent is a member of the class +<function>constraintWidgetClass ,</function> +the procedure also allocates memory for the +parent's constraints and stores the address of this memory into the +<emphasis remap='I'>constraints</emphasis> field. If no allocate procedure is found, the (xI +allocate memory for the widget and, when applicable, the constraints, +and initializes the <emphasis remap='I'>constraints</emphasis> field. + </para> + </listitem> + <listitem> + <para> +Initializes the Core nonresource data fields +<emphasis remap='I'>self</emphasis>, <emphasis remap='I'>parent</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>being_destroyed</emphasis>, +<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>managed</emphasis>, <emphasis remap='I'>window</emphasis>, <emphasis remap='I'>visible</emphasis>, +<emphasis remap='I'>popup_list</emphasis>, and <emphasis remap='I'>num_popups</emphasis>. + </para> + </listitem> + <listitem> + <para> +Initializes the resource fields (for example, <emphasis remap='I'>background_pixel</emphasis>) +by using the +<function>CoreClassPart</function> +resource lists specified for this class and all superclasses. + </para> + </listitem> + <listitem> + <para> +If the parent is a member of the class +<function>constraintWidgetClass ,</function> +initializes the resource fields of the constraints record +by using the +<function>ConstraintClassPart</function> +resource lists specified for the parent's class +and all superclasses up to +<function>constraintWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +Calls the initialize procedures for the widget starting at the +Object +initialize procedure on down to the widget's initialize procedure. + </para> + </listitem> + <listitem> + <para> +If the parent is a member of the class +<function>constraintWidgetClass ,</function> +calls the +<function>ConstraintClassPart</function> +initialize procedures, +starting at +<function>constraintWidgetClass</function> +on down to the parent's +<function>ConstraintClassPart</function> +initialize procedure. + </para> + </listitem> + <listitem> + <para> +If the parent is a member of the class +<function>compositeWidgetClass ,</function> +puts the widget into its parent's children list by calling its parent's +insert_child procedure. +For further information, +see Section 3.1. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To create an instance of a widget using varargs lists, use +<function>XtVaCreateWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaCreateWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtVaCreateWidget(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>object_class</emphasis>, <emphasis remap='I'>parent</emphasis>, ...) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>object_class</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>parent</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the resource name for the created widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>object_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created object. (oC + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>parent</emphasis> + </term> + <listitem> + <para> +Specifies the parent widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtVaCreateWidget</function> +procedure is identical in function to +<function>XtCreateWidget</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, +as described +in Section 2.5.1. + +</para> +</sect3> +<sect3 id="Creating_an_Application_Shell_Instance"> +<title>Creating an Application Shell Instance</title> +<!-- .XS --> +<!-- <function>(SN Creating an Application Shell Instance</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +An application can have multiple top-level widgets, each of which +specifies a unique widget tree +that can potentially be on different screens or displays. +An application uses +<function>XtAppCreateShell</function> +to create independent widget trees. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppCreateShell" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtAppCreateShell(<emphasis remap='I'>name</emphasis>, \ +<emphasis remap='I'>application_class</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>display</emphasis>, \ +<emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the instance name of the shell widget. +If <emphasis remap='I'>name</emphasis> is NULL, +the application name passed to +<function>XtDisplayInitialize</function> +is used. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class string to be used in +place of the widget <emphasis remap='I'>class_name</emphasis> string when +<emphasis remap='I'>widget_class</emphasis> is +<function>applicationShellWidgetClass</function> +or a subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class for the top-level widget (e.g., +<function>applicationShellWidgetClass ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display for the default screen +and for the resource database used to retrieve +the shell widget resources. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppCreateShell</function> +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 +<emphasis remap='I'>args</emphasis> 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 <emphasis remap='I'>name</emphasis>.screen, +class <emphasis remap='I'>Class</emphasis>.Screen where <emphasis remap='I'>Class</emphasis> is the specified +<emphasis remap='I'>application_class</emphasis> if <emphasis remap='I'>widget_class</emphasis> is +<function>applicationShellWidgetClass</function> +or a subclass thereof. If <emphasis remap='I'>widget_class</emphasis> is not +<function>application\%Shell\%Widget\%Class</function> +or a subclass, <emphasis remap='I'>Class</emphasis> is the <emphasis remap='I'>class_name</emphasis> +field from the +<function>CoreClassPart</function> +of the specified <emphasis remap='I'>widget_class</emphasis>. +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 +<emphasis remap='I'>args</emphasis>. The widget name and <emphasis remap='I'>Class</emphasis> as determined above are +used as the leftmost (i.e., root) components in all fully qualified +resource names for objects within this widget tree. + +</para> +<para> +<!-- .LP --> +If the specified widget class is a subclass of WMShell, the name and +<emphasis remap='I'>Class</emphasis> as determined above will be stored into the +<function>\s-1WM_CLASS\s+1</function> +property on the widget's window when it becomes realized. +If the specified <emphasis remap='I'>widget_class</emphasis> is +<function>applicationShellWidgetClass</function> +or a subclass thereof, the +<function>\s-1WM_COMMAND\s+1</function> +property will also be set from the values of the XtNargv and +XtNargc resources. + +</para> +<para> +<!-- .LP --> +To create multiple top-level shells within a single (logical) +application, +you can use one of two methods: +</para> +<itemizedlist> + <listitem> + <para> +Designate one shell as the real top-level shell and +create the others as pop-up children of it by using +<function>XtCreatePopupShell .</function> + </para> + </listitem> + <listitem> + <para> +Have all shells as pop-up children of an unrealized top-level shell. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .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: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA 2i --> +<!-- .ta 2i --> +xmail.geometry:... (the main window) +xmail.read.geometry:... (the read window) +xmail.compose.geometry:... (the compose window) +</literallayout> +</para> +<para> +<!-- .LP --> +The second method, +which is best if there is no main window, +leads to resource specifications like the following: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA 2i --> +<!-- .ta 2i --> +xmail.headers.geometry:... (the headers window) +xmail.read.geometry:... (the read window) +xmail.compose.geometry:... (the compose window) +</literallayout> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To create a top-level widget that is the root of a widget tree using +varargs lists, use +<function>XtVaAppCreateShell .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaAppCreateShell" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtVaAppCreateShell(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>application_class</emphasis>, \ +<emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>display</emphasis>, ...) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the instance name of the shell widget. +If <emphasis remap='I'>name</emphasis> is NULL, +the application name passed to +<function>XtDisplayInitialize</function> +is used. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class string to be used in +place of the widget <emphasis remap='I'>class_name</emphasis> string when +<emphasis remap='I'>widget_class</emphasis> is +<function>applicationShellWidgetClass</function> +or a subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class for the top-level widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display for the default screen +and for the resource database used to retrieve +the shell widget resources. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtVaAppCreateShell</function> +procedure is identical in function to +<function>XtAppCreateShell</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, as +described in Section 2.5.1. + +</para> +</sect3> +<sect3 id="Convenience_Procedure_to_Initialize_an_Application"> +<title>Convenience Procedure to Initialize an Application</title> +<!-- .XS --> +<!-- <function>(SN Convenience Procedure to Initialize an Application</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To initialize the (xI internals, create an application context, +open and initialize a display, and create the initial root shell +instance, an application may use +<function>XtOpenApplication</function> +or +<function>XtVaOpenApplication .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOpenApplication" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtOpenApplication(<emphasis remap='I'>app_context_return</emphasis>, <emphasis remap='I'>application_class</emphasis>, \ +<emphasis remap='I'>options</emphasis>, <emphasis remap='I'>num_options</emphasis>, +<!-- .br --> + <emphasis remap='I'>argc_in_out</emphasis>, <emphasis remap='I'>argv_in_out</emphasis>, \ +<emphasis remap='I'>fallback_resources</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + XtAppContext *<emphasis remap='I'>app_context_return</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescList <emphasis remap='I'>options</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>argv_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>fallback_resources</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context_return</emphasis> + </term> + <listitem> + <para> +Returns the application context, if non-NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies the command line options table. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>options</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the command line arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>fallback_resources</emphasis> + </term> + <listitem> + <para> +Specifies resource values to be used if the application class resource +file cannot be opened or read, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the class of the widget to be created. Must be shellWidgetClass +or a subclass. +<!-- .br --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any +other resource specifications for the created shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOpenApplication</function> +function calls +<function>XtToolkitInitialize</function> +followed by +<function>XtCreateApplicationContext ,</function> +then calls +<function>XtOpenDisplay</function> +with <emphasis remap='I'>display_string</emphasis> NULL and +<emphasis remap='I'>application_name</emphasis> NULL, and finally calls +<function>XtAppCreateShell</function> +with <emphasis remap='I'>name</emphasis> NULL, the specified <emphasis remap='I'>widget_class</emphasis>, +an argument list and count, +and returns the created shell. +The recommended <emphasis remap='I'>widget_class</emphasis> is +<function>sessionShellWidgetClass .</function> +The argument list and count are created by merging +the specified <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> with a list +containing the specified <emphasis remap='I'>argc</emphasis> and <emphasis remap='I'>argv</emphasis>. +The modified <emphasis remap='I'>argc</emphasis> and <emphasis remap='I'>argv</emphasis> returned by +<function>XtDisplayInitialize</function> +are returned in <emphasis remap='I'>argc_in_out</emphasis> and <emphasis remap='I'>argv_in_out</emphasis>. If +<emphasis remap='I'>app_context_return</emphasis> 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 +<function>XtOpenApplication</function> +terminates the application. If <emphasis remap='I'>fallback_resources</emphasis> is non-NULL, +<function>XtAppSetFallbackResources</function> +is called with the value prior to calling +<function>XtOpenDisplay .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaOpenApplication" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtVaOpenApplication(<emphasis remap='I'>app_context_return</emphasis>, <emphasis remap='I'>application_class</emphasis>, \ +<emphasis remap='I'>options</emphasis>, <emphasis remap='I'>num_options</emphasis>, +<!-- .br --> + <emphasis remap='I'>argc_in_out</emphasis>, <emphasis remap='I'>argv_in_out</emphasis>, \ +<emphasis remap='I'>fallback_resources</emphasis>, <emphasis remap='I'>widget_class</emphasis>, ...) +<!-- .br --> + XtAppContext *<emphasis remap='I'>app_context_return</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescList <emphasis remap='I'>options</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>argv_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>fallback_resources</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context_return</emphasis> + </term> + <listitem> + <para> +Returns the application context, if non-NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies the command line options table. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>options</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv_in_out</emphasis> + </term> + <listitem> + <para> +Specifies the command line arguments array. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>fallback_resources</emphasis> + </term> + <listitem> + <para> +Specifies resource values to be used if the application class +resource file cannot be opened, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the class of the widget to be created. Must be shellWidgetClass +or a subclass. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications for the created shell. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtVaOpenApplication</function> +procedure is identical in function to +<function>XtOpenApplication</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, +as described +in Section 2.5.1. + +</para> +</sect3> +<sect3 id="Widget_Instance_Allocation_The_allocate_Procedure"> +<title>Widget Instance Allocation: The allocate Procedure</title> +<!-- .XS --> +<!-- (SN Widget Instance Allocation: The allocate Procedure --> +<!-- .XE --> +<!-- .IN "Widget Allocation" --> +<para> +<!-- .LP --> +A widget class may optionally provide an instance allocation procedure +in the +<function>ObjectClassExtension</function> +record. +</para> +<para> +<!-- .LP --> +When the call to create a widget includes a varargs list containing +<function>XtVaTypedArg ,</function> +these arguments will be passed to the allocation procedure in an +<function>XtTypedArgList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtTypedArgList" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String name; + String type; + XtArgVal value; + int size; +} XtTypedArg, *XtTypedArgList; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .IN "allocate procedure" "" "@DEF@" --> +The allocate procedure pointer in the +<function>ObjectClassExtension</function> +record is of type +<function>XtAllocateProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAllocateProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtAllocateProc)(WidgetClass, Cardinal*, Cardinal*, ArgList, \ +Cardinal*, + XtTypedArgList, Cardinal*, \ +Widget*, XtPointer*); +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Cardinal* <emphasis remap='I'>constraint_size</emphasis>; +<!-- .br --> + Cardinal* <emphasis remap='I'>more_bytes</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal* <emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XtTypedArgList <emphasis remap='I'>typed_args</emphasis>, +<!-- .br --> + Cardinal* <emphasis remap='I'>num_typed_args</emphasis>; +<!-- .br --> + Widget* <emphasis remap='I'>new_return</emphasis>; +<!-- .br --> + XtPointer* <emphasis remap='I'>more_bytes_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class of the instance to allocate. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>constraint_size</emphasis> + </term> + <listitem> + <para> +Specifies the size of the constraint record to allocate, or 0. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>more_bytes</emphasis> + </term> + <listitem> + <para> +Specifies the number of auxiliary bytes of memory to allocate. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list as given in the call to create the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>typed_args</emphasis> + </term> + <listitem> + <para> +Specifies the list of typed arguments given in the call to create the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_typed_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of typed arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>new_return</emphasis> + </term> + <listitem> + <para> +Returns a pointer to the newly allocated instance, or NULL in case of error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>more_bytes_return</emphasis> + </term> + <listitem> + <para> +Returns the auxiliary memory if it was requested, or NULL +if requested and an error occurred; otherwise, unchanged. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +At widget allocation time, if an extension record with <emphasis remap='I'>record_type</emphasis> +equal to +<function>\s-1NULLQUARK\s+1</function> +is located through the object class part <emphasis remap='I'>extension</emphasis> field +and the <emphasis remap='I'>allocate</emphasis> field is not NULL, the +<function>XtAllocateProc</function> +will be invoked to allocate memory for the widget. If no ObjectClassPart +extension record is declared with <emphasis remap='I'>record_type equal</emphasis> to +<function>\s-1NULLQUARK\s+1 ,</function> +then +<function>XtInheritAllocate</function> +and +<function>XtInheritDeallocate</function> +are assumed. +If no +<function>XtAllocateProc</function> +is found, the (xI will allocate memory for the widget. +</para> +<para> +<!-- .LP --> +An +<function>XtAllocateProc</function> +must perform the following: +</para> +<itemizedlist> + <listitem> + <para> +Allocate memory for the widget instance and return it in <emphasis remap='I'>new_return</emphasis>. +The memory must be at least <emphasis remap='I'>wc->core_class.widget_size</emphasis> bytes in length, +double-word aligned. + </para> + </listitem> + <listitem> + <para> +Initialize the <emphasis remap='I'>core.constraints</emphasis> field in the instance record to NULL +or to point to a constraint record. If <emphasis remap='I'>constraint_size</emphasis> +is not 0, the procedure must allocate memory for the constraint record. +The memory must be double-word aligned. + </para> + </listitem> + <listitem> + <para> +If <emphasis remap='I'>more_bytes</emphasis> is not 0, then the address of a block of memory +at least <emphasis remap='I'>more_bytes</emphasis> in size, double-word aligned, must be +returned in the <emphasis remap='I'>more_bytes_return</emphasis> parameter, +or NULL to indicate an error. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +A class allocation procedure that envelops the allocation procedure of a +superclass must rely on the enveloped procedure to perform the instance +and constraint allocation. +Allocation procedures should refrain from initializing fields in the +widget record except to store pointers to newly allocated additional memory. +Under no circumstances should an allocation procedure that envelopes +its superclass allocation procedure modify fields in the +instance part of any superclass. + +</para> +</sect3> +<sect3 id="Widget_Instance_Initialization_The_initialize_Procedure"> +<title>Widget Instance Initialization: The initialize Procedure</title> +<!-- .XS --> +<!-- (SN Widget Instance Initialization: The initialize Procedure --> +<!-- .XE --> +<!-- .IN "Initialization" --> +<!-- .IN "Chaining" --> +<!-- .IN "Superclass Chaining" --> +<!-- .IN "Inheritance" --> +<para> +<!-- .LP --> +The initialize procedure pointer in a widget class is of type +<function>XtInitProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInitProc" "" "@DEF@" --> +<!-- .IN "initialize procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtInitProc)(Widget, Widget, ArgList, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>request</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>new</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>request</emphasis> + </term> + <listitem> + <para> +Specifies a copy of the widget with resource values as requested by the +argument list, the resource database, and the widget defaults. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>new</emphasis> + </term> + <listitem> + <para> +Specifies the widget with the new values, both resource and nonresource, +that are actually allowed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +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 +<function>XtVaTypedArg</function> +are converted to the widget representation and the list is transformed +into the +<function>ArgList</function> +format. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +An initialization procedure performs the following: +</para> +<itemizedlist> + <listitem> + <para> +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 +<function>String ,</function> +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 --> + </para> + </listitem> + <listitem> + <para> +Computes values for unspecified resource fields. +For example, if <emphasis remap='I'>width</emphasis> and <emphasis remap='I'>height</emphasis> are zero, +the widget should compute an appropriate width and height +based on its other resources. +<!-- .NT --> +A widget may directly assign only +its own <emphasis remap='I'>width</emphasis> and <emphasis remap='I'>height</emphasis> within the initialize, initialize_hook, +set_values, and +set_values_hook procedures; see Chapter 6. +<!-- .NE --> + </para> + </listitem> + <listitem> + <para> +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. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .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. +</para> +<para> +<!-- .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 +<emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> +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. +</para> +<para> +<!-- .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 <emphasis remap='I'>initialize</emphasis> field in the class record. +</para> +<para> +<!-- .LP --> +Sometimes a subclass may want to overwrite values filled in by its +superclass. +In particular, size calculations of a superclass often are +incorrect for a subclass, and in this case, +the subclass must modify or recalculate fields declared +and computed by its superclass. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>request</emphasis> and <emphasis remap='I'>new</emphasis> 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 <emphasis remap='I'>request</emphasis> widget is a copy of the widget as initialized by the +arglist and resource database. +The <emphasis remap='I'>new</emphasis> 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. +</para> +<para> +<!-- .LP --> +In the above example, +the subclass with the visual surround can see +if the <emphasis remap='I'>width</emphasis> and <emphasis remap='I'>height</emphasis> in the <emphasis remap='I'>request</emphasis> widget are zero. +If so, +it adds its surround size to the <emphasis remap='I'>width</emphasis> and <emphasis remap='I'>height</emphasis> +fields in the <emphasis remap='I'>new</emphasis> widget. +If not, it must make do with the size originally specified. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>new</emphasis> widget will become the actual widget instance record. +Therefore, +the initialization procedure should do all its work on the <emphasis remap='I'>new</emphasis> widget; +the <emphasis remap='I'>request</emphasis> widget should never be modified. +If the initialize procedure +needs to call any routines that operate on a widget, +it should specify <emphasis remap='I'>new</emphasis> as the widget instance. + +</para> +</sect3> +<sect3 id="Constraint_Instance_Initialization_The_ConstraintClassPart_initialize_Procedure"> +<title>Constraint Instance Initialization: The ConstraintClassPart initialize Procedure</title> +<!-- .XS --> +<!-- (SN Constraint Instance Initialization: The ConstraintClassPart initialize Procedure --> +<!-- .XE --> +<!-- .IN "Initialization" --> +<!-- .IN "XtInitProc" --> +<!-- .IN "initialize procedure" --> +<!-- .IN "Chaining" --> +<!-- .IN "Superclass Chaining" --> +<!-- .IN "Inheritance" --> +<para> +<!-- .LP --> +The constraint initialization procedure pointer, found in the +<function>ConstraintClassPart</function> +<emphasis remap='I'>initialize</emphasis> field of the widget class record, is of type +<function>XtInitProc .</function> +The values passed to the parent constraint initialization procedures +are the same as those passed to the child's class widget initialization +procedures. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>constraints</emphasis> field of the <emphasis remap='I'>request</emphasis> widget points to a copy of the +constraints record as initialized by the arglist and resource database. +</para> +<para> +<!-- .LP --> +The constraint initialization procedure should compute any constraint fields +derived from constraint resources. +It can make further changes to the <emphasis remap='I'>new</emphasis> widget to make the widget +and any other constraint fields +conform to the specified constraints, for example, +changing the widget's size or position. +</para> +<para> +<!-- .LP --> +If a constraint class does not need a constraint initialization procedure, +it can specify NULL for the <emphasis remap='I'>initialize</emphasis> field of the +<function>ConstraintClassPart</function> +in the class record. + +</para> +</sect3> +<sect3 id="Nonwidget_Data_Initialization_The_initialize_hook_Procedure"> +<title>Nonwidget Data Initialization: The initialize_hook Procedure</title> +<!-- .XS --> +<!-- (SN Nonwidget Data Initialization: The initialize_hook Procedure --> +<!-- .XE --> +<!-- .IN "Initialization" --> +<para> +<!-- .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 --> +</para> +<para> +<!-- .LP --> +The initialize_hook procedure pointer is of type +<function>XtArgsProc :</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "initialize_hook procedure" "" "@DEF@" --> +<!-- .IN "XtArgsProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtArgsProc)(Widget, ArgList, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list passed by the client. +If the client created the widget using a varargs form, any resources +specified via +<function>XtVaTypedArg</function> +are converted to the widget representation and the list is transformed +into the +<function>ArgList</function> +format. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If this procedure is not NULL, +it is called immediately after the corresponding initialize +procedure or in its place if the <emphasis remap='I'>initialize</emphasis> field is NULL. +</para> +<para> +<!-- .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. + +</para> +</sect3> +</sect2> +<sect2 id="Realizing_Widgets"> +<title>Realizing Widgets</title> +<!-- .XS --> +<!-- <function>(SN Realizing Widgets</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To realize a widget instance, use +<function>XtRealizeWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRealizeWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRealizeWidget(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI +<!-- .eM --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +If the widget is already realized, +<function>XtRealizeWidget</function> +simply returns. +Otherwise it performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Binds all action names in the widget's +translation table to procedures (see Section 10.1.2). + </para> + </listitem> + <listitem> + <para> +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. + </para> + </listitem> + <listitem> + <para> +Constructs an +<function>XSetWindowAttributes</function> +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. + </para> + </listitem> + <listitem> + <para> +If the widget is +not a subclass of +<function>compositeWidgetClass ,</function> +<function>XtRealizeWidget</function> +returns; otherwise it continues and performs the following: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +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. + </para> + </listitem> + <listitem> + <para> +Maps all of the managed children windows that have <emphasis remap='I'>mapped_when_managed</emphasis> +<function>True .</function> +If a widget is managed but <emphasis remap='I'>mapped_when_managed</emphasis> is +<function>False ,</function> +the widget is allocated visual space but is not displayed. +<!-- .RE --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +If the widget is a top-level shell widget (that is, it has no parent), and +<emphasis remap='I'>mapped_when_managed</emphasis> is +<function>True ,</function> +<function>XtRealizeWidget</function> +maps the widget window. +</para> +<para> +<!-- .LP --> +<function>XtCreateWidget ,</function> +<function>XtVaCreateWidget ,</function> +<function>XtRealizeWidget ,</function> +<function>XtManageChildren ,</function> +<function>XtUnmanage\%Children ,</function> +<function>XtUnrealizeWidget ,</function> +<function>XtSetMappedWhenManaged ,</function> +and +<function>XtDestroy\%Widget</function> +maintain the following invariants: +</para> +<itemizedlist> + <listitem> + <para> +If a composite widget is realized, then all its managed children are realized. + </para> + </listitem> + <listitem> + <para> +If a composite widget is realized, then all its managed children that have +<emphasis remap='I'>mapped_when_managed</emphasis> +<function>True</function> +are mapped. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .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, +<function>XtRealizeWidget</function> +calls the procedures in reverse order of +appearance in the +<function>CompositePart</function> +<emphasis remap='I'>children</emphasis> 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 --> +</para> +<para> +<!-- .LP --> +To check whether or not a widget has been realized, use +<function>XtIsRealized .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtIsRealized" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtIsRealized(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtIsRealized</function> +function returns +<function>True</function> +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. +</para> +<para> +<!-- .LP --> +Some widget procedures (for example, set_values) might wish to +operate differently +after the widget has been realized. + +</para> +<sect3 id="Widget_Instance_Window_Creation_The_realize_Procedure"> +<title>Widget Instance Window Creation: The realize Procedure</title> +<!-- .XS --> +<!-- (SN Widget Instance Window Creation: The realize Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +The realize procedure pointer in a widget class is of type +<function>XtRealizeProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRealizeProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtRealizeProc)(Widget, XtValueMask*, XSetWindowAttributes*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtValueMask *<emphasis remap='I'>value_mask</emphasis>; +<!-- .br --> + XSetWindowAttributes *<emphasis remap='I'>attributes</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_mask</emphasis> + </term> + <listitem> + <para> +Specifies which fields in the <emphasis remap='I'>attributes</emphasis> structure are used. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>attributes</emphasis> + </term> + <listitem> + <para> +Specifies the window attributes to use in the +<function>XCreateWindow</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The realize procedure must create the widget's window. +</para> +<para> +<!-- .LP --> +Before calling the class realize procedure, the generic +<function>XtRealizeWidget</function> +function fills in a mask and a corresponding +<function>XSetWindowAttributes</function> +structure. +It sets the following fields in <emphasis remap='I'>attributes</emphasis> and +corresponding bits in <emphasis remap='I'>value_mask</emphasis> +based on information in the widget +core +structure: +</para> +<itemizedlist> + <listitem> + <para> +The <emphasis remap='I'>background_pixmap</emphasis> (or <emphasis remap='I'>background_pixel</emphasis> if <emphasis remap='I'>background_pixmap</emphasis> is +<function>XtUnspecifiedPixmap )</function> +is filled in from the corresponding field. + </para> + </listitem> + <listitem> + <para> +The <emphasis remap='I'>border_pixmap</emphasis> (or <emphasis remap='I'>border_pixel</emphasis> if <emphasis remap='I'>border_pixmap</emphasis> is +<function>XtUnspecifiedPixmap )</function> +is filled in from the corresponding field. + </para> + </listitem> + <listitem> + <para> +The <emphasis remap='I'>colormap</emphasis> is filled in from the corresponding field. + </para> + </listitem> + <listitem> + <para> +The <emphasis remap='I'>event_mask</emphasis> is filled in based on the event handlers registered, +the event translations specified, whether the <emphasis remap='I'>expose</emphasis> field is non-NULL, +and whether <emphasis remap='I'>visible_interest</emphasis> is +<function>True .</function> + </para> + </listitem> + <listitem> + <para> +The <emphasis remap='I'>bit_gravity</emphasis> is set to +<function>NorthWestGravity</function> +if the <emphasis remap='I'>expose</emphasis> field is NULL. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +These or any other fields in attributes and the corresponding bits in +<emphasis remap='I'>value_mask</emphasis> can be set by the realize procedure. +</para> +<para> +<!-- .LP --> +Note that because realize is not a chained operation, +the widget class realize procedure must update the +<function>XSetWindowAttributes</function> +structure with all the appropriate fields from +non-Core +superclasses. +</para> +<para> +<!-- .LP --> +<!-- .IN "Inheritance" --> +A widget class can inherit its realize procedure from its superclass +during class initialization. +The realize procedure defined for +<function>coreWidgetClass</function> +calls +<function>XtCreateWindow</function> +with the passed <emphasis remap='I'>value_mask</emphasis> and <emphasis remap='I'>attributes</emphasis> +and with <emphasis remap='I'>window_class</emphasis> and <emphasis remap='I'>visual</emphasis> set to +<function>CopyFromParent .</function> +Both +<function>compositeWidgetClass</function> +and +<function>constraintWidgetClass</function> +inherit this realize procedure, and most new widget subclasses +can do the same (see Section 1.6.10). +</para> +<para> +<!-- .LP --> +The most common noninherited realize procedures set <emphasis remap='I'>bit_gravity</emphasis> in the mask +and attributes to the appropriate value and then create the window. +For example, depending on its justification, Label might set <emphasis remap='I'>bit_gravity</emphasis> to +<function>WestGravity ,</function> +<function>CenterGravity ,</function> +or +<function>EastGravity .</function> +Consequently, shrinking it would just move the bits appropriately, +and no +exposure +event is needed for repainting. +</para> +<para> +<!-- .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 +<function>XtRealizeWidget</function> +on its children itself in the appropriate order from within its own +realize procedure. +</para> +<para> +<!-- .LP --> +Widgets that have children and whose class is not a subclass of +<function>compositeWidgetClass</function> +are responsible for calling +<function>XtRealizeWidget</function> +on their children, usually from within the realize procedure. +</para> +<para> +<!-- .LP --> +Realize procedures cannot manage or unmanage their descendants. + +</para> +</sect3> +<sect3 id="Window_Creation_Convenience_Routine"> +<title>Window Creation Convenience Routine</title> +<!-- .XS --> +<!-- (SN Window Creation Convenience Routine --> +<!-- .XE --> +<para> +<!-- .LP --> +Rather than call the Xlib +<function>XCreateWindow</function> +<!-- .IN "realize procedure" --> +function explicitly, a realize procedure should normally call the (xI analog +<function>XtCreateWindow ,</function> +which simplifies the creation of windows for widgets. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreateWindow" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCreateWindow(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>window_class</emphasis>, <emphasis remap='I'>visual</emphasis>, \ +<emphasis remap='I'>value_mask</emphasis>, <emphasis remap='I'>attributes</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + unsigned int <emphasis remap='I'>window_class</emphasis>; +<!-- .br --> + Visual *<emphasis remap='I'>visual</emphasis>; +<!-- .br --> + XtValueMask <emphasis remap='I'>value_mask</emphasis>; +<!-- .br --> + XSetWindowAttributes *<emphasis remap='I'>attributes</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that defines the additional window attributed. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>window_class</emphasis> + </term> + <listitem> + <para> +Specifies the Xlib window class (for example, +<function>InputOutput ,</function> +<function>InputOnly ,</function> +or +<function>CopyFromParent ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>visual</emphasis> + </term> + <listitem> + <para> +Specifies the visual type (usually +<function>CopyFromParent ).</function> +<!-- .ds Vm attribute fields to use --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_mask</emphasis> + </term> + <listitem> + <para> +Specifies which fields in the <emphasis remap='I'>attributes</emphasis> structure are used. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>attributes</emphasis> + </term> + <listitem> + <para> +Specifies the window attributes to use in the +<function>XCreateWindow</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCreateWindow</function> +function calls the Xlib +<function>XCreateWindow</function> +function with values from the widget structure and the passed parameters. +Then, it assigns the created window to the widget's <emphasis remap='I'>window</emphasis> field. +</para> +<para> +<!-- .LP --> +<function>XtCreateWindow</function> +evaluates the following fields of the widget core +structure: <emphasis remap='I'>depth</emphasis>, <emphasis remap='I'>screen</emphasis>, <emphasis remap='I'>parent->core.window</emphasis>, <emphasis remap='I'>x</emphasis>, +<emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, and +<emphasis remap='I'>border_width</emphasis>. + +</para> +</sect3> +</sect2> +<sect2 id="Obtaining_Window_Information_from_a_Widget"> +<title>Obtaining Window Information from a Widget</title> +<!-- .XS --> +<!-- <function>(SN Obtaining Window Information from a Widget</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The +Core +widget class definition contains the screen and window ids. +The <emphasis remap='I'>window</emphasis> field may be NULL for a while +(see Sections 2.5 and 2.6). +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDisplay" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Display *XtDisplay(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtDisplay</function> +returns the display pointer for the specified widget. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtParent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtParent(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtParent</function> +returns the parent object for the specified widget. The returned object +will be of class Object or a subclass. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtScreen" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Screen *XtScreen(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtScreen</function> +returns the screen pointer for the specified widget. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWindow" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Window XtWindow(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtWindow</function> +returns the window of the specified widget. +<!-- .sp --> +</para> +<para> +<!-- .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 +<function>XtDisplayOfObject ,</function> +<function>XtScreenOfObject ,</function> +and +<function>XtWindowOfObject .</function> +<!-- .IN "XtDisplayOfObject" "" "@DEF@" --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Display *XtDisplayOfObject(<emphasis remap='I'>object</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtDisplayOfObject</function> +is identical in function to +<function>XtDisplay</function> +if the object is a widget; otherwise +<function>XtDisplayOfObject</function> +returns the display +pointer for the nearest ancestor of <emphasis remap='I'>object</emphasis> that is of class +Widget or a subclass thereof. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtScreenOfObject" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Screen *XtScreenOfObject(<emphasis remap='I'>object</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtScreenOfObject</function> +is identical in function to +<function>XtScreen</function> +if the object is a widget; otherwise +<function>XtScreenOfObject</function> +returns the screen pointer +for the nearest ancestor of <emphasis remap='I'>object</emphasis> that is of class +Widget or a subclass thereof. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWindowOfObject" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Window XtWindowOfObject(<emphasis remap='I'>object</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtWindowOfObject</function> +is identical in function to +<function>XtWindow</function> +if the object is a widget; otherwise +<function>XtWindowOfObject</function> +returns the window for the nearest ancestor of <emphasis remap='I'>object</emphasis> that is of class +Widget or a subclass thereof. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve the instance name of an object, use +<function>XtName .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtName" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +String XtName(<emphasis remap='I'>object</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object whose name is desired. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtName</function> +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. +</para> +<para> +<!-- .LP --> +Several window attributes are locally cached in the widget instance. +Thus, they can be set by the resource manager and +<function>XtSetValues</function> +as well as used by routines that derive structures from these values +(for example, <emphasis remap='I'>depth</emphasis> for deriving pixmaps, +<emphasis remap='I'>background_pixel</emphasis> for deriving GCs, and so on) or in the +<function>XtCreateWindow</function> +call. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, and <emphasis remap='I'>border_width</emphasis> +window attributes are available to +geometry managers. +These fields are maintained synchronously inside the (xI. +When an +<function>XConfigureWindow</function> +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 +<function>ConfigureNotify</function> +event. +(In fact, most widgets do not select +<function>SubstructureNotify</function> +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 +<function>ConfigureNotify</function> +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). + +</para> +<sect3 id="Unrealizing_Widgets"> +<title>Unrealizing Widgets</title> +<!-- .XS --> +<!-- <function>(SN Unrealizing Widgets</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To destroy the windows associated with a widget and its +non-pop-up descendants, use +<function>XtUnrealizeWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUnrealizeWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUnrealizeWidget(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If the widget is currently unrealized, +<function>XtUnrealizeWidget</function> +simply returns. Otherwise it performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Unmanages the widget if the widget is managed. + </para> + </listitem> + <listitem> + <para> +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@" --> + </para> + </listitem> + <listitem> + <para> +Destroys the widget's window and any subwindows by calling +<function>XDestroyWindow</function> +with the specified widget's <emphasis remap='I'>window</emphasis> field. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Any events in the queue or which arrive following a call to +<function>XtUnrealizeWidget</function> +will be dispatched as if the window(s) of the +unrealized widget(s) had never existed. + +</para> +</sect3> +</sect2> +<sect2 id="Destroying_Widgets"> +<title>Destroying Widgets</title> +<!-- .XS --> +<!-- <function>(SN Destroying Widgets</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide support +</para> +<itemizedlist> + <listitem> + <para> +To destroy all the pop-up children of the widget being destroyed +and destroy all children of composite widgets. + </para> + </listitem> + <listitem> + <para> +To remove (and unmap) the widget from its parent. + </para> + </listitem> + <listitem> + <para> +To call the callback procedures that have been registered to trigger +when the widget is destroyed. + </para> + </listitem> + <listitem> + <para> +To minimize the number of things a widget has to deallocate when destroyed. + </para> + </listitem> + <listitem> + <para> +To minimize the number of +<function>XDestroyWindow</function> +calls when destroying a widget tree. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To destroy a widget instance, use +<function>XtDestroyWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDestroyWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtDestroyWidget(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDestroyWidget</function> +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. +</para> +<para> +<!-- .LP --> +In phase 1, +<function>XtDestroyWidget</function> +performs the following: +</para> +<itemizedlist> + <listitem> + <para> +If the <emphasis remap='I'>being_destroyed</emphasis> field of the widget is +<function>True ,</function> +it returns immediately. + </para> + </listitem> + <listitem> + <para> +Recursively descends the widget tree and +sets the <emphasis remap='I'>being_destroyed</emphasis> field to +<function>True</function> +for the widget and all normal and pop-up children. + </para> + </listitem> + <listitem> + <para> +Adds the widget to a list of widgets (the destroy list) that should be +destroyed when it is safe to do so. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .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. +</para> +<para> +<!-- .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 +<function>XtDispatchEvent</function> +is about to return, or immediately if not in +<function>XtDispatchEvent .</function> +</para> +<para> +<!-- .LP --> +In phase 2, +<function>XtDestroyWidget</function> +performs the following on each entry in the destroy list in the order +specified: +</para> +<itemizedlist> + <listitem> + <para> +If the widget is not a pop-up child and the widget's parent is a subclass of +<function>composite\%WidgetClass ,</function> +and if the parent is not being destroyed, +it calls +<function>XtUnmanageChild</function> +on the widget and then calls the widget's parent's delete_child procedure +(see Section 3.3). + </para> + </listitem> + <listitem> + <para> +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). + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The +<function>XtDestroyWidget</function> +function then makes second traversal of the widget and all normal +and pop-up descendants to perform the following three items on each +widget in postorder: +</para> +<itemizedlist> + <listitem> + <para> +If the widget is not a pop-up child and the widget's parent is a subclass of +<function>constraint\%WidgetClass ,</function> +it calls the +<function>ConstraintClassPart</function> +destroy procedure for the parent, +then for the parent's superclass, +until finally it calls the +<function>ConstraintClassPart</function> +destroy procedure for +<function>constraintWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +Calls the +<function>CoreClassPart</function> +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. Callback lists are deallocated. + </para> + </listitem> + <listitem> + <para> +If the widget class object class part contains an +<function>ObjectClassExtension</function> +record with the record_type +<function>\s-1NULLQUARK\s+1</function> +and the <emphasis remap='I'>deallocate</emphasis> field is not NULL, +calls the deallocate procedure to deallocate the instance and if one +exists, the constraint record. Otherwise, the (xI will deallocate +the widget instance record and if one exists, the constraint record. + </para> + </listitem> + <listitem> + <para> +Calls +<function>XDestroyWindow</function> +if the specified widget is realized (that is, has an X window). +The server recursively destroys all normal descendant windows. +(Windows of realized pop-up Shell children, and their +descendants, are destroyed by a shell class destroy procedure.) + + </para> + </listitem> +</itemizedlist> +<sect3 id="Adding_and_Removing_Destroy_Callbacks"> +<title>Adding and Removing Destroy Callbacks</title> +<!-- .XS --> +<!-- <function>(SN Adding and Removing Destroy Callbacks</function> --> +<!-- .XE --> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +For example, the following adds an application-supplied destroy callback +procedure <emphasis remap='I'>ClientDestroy</emphasis> with client data to a widget by calling +<function>XtAddCallback .</function> +<!-- .IN "XtAddCallback" --> +<literallayout class="monospaced"> +XtAddCallback(<emphasis remap='I'>w</emphasis>, XtNdestroyCallback, <emphasis remap='I'>ClientDestroy</emphasis>, <emphasis remap='I'>client_data</emphasis>) +</literallayout> +</para> +<para> +<!-- .LP --> +Similarly, the following removes the application-supplied destroy callback +procedure <emphasis remap='I'>ClientDestroy</emphasis> by calling +<function>XtRemoveCallback .</function> +<!-- .IN "XtRemoveCallback" --> +<literallayout class="monospaced"> +XtRemoveCallback(<emphasis remap='I'>w</emphasis>, XtNdestroyCallback, <emphasis remap='I'>ClientDestroy</emphasis>, <emphasis remap='I'>client_data</emphasis>) +</literallayout> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>ClientDestroy</emphasis> argument is of type +<function>XtCallbackProc ;</function> +see Section 8.1. + +</para> +</sect3> +<sect3 id="Dynamic_Data_Deallocation_The_destroy_Procedure"> +<title>Dynamic Data Deallocation: The destroy Procedure</title> +<!-- .XS --> +<!-- (SN Dynamic Data Deallocation: The destroy Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "destroy procedure" "" "@DEF@" --> +The destroy procedure pointers in the +<function>ObjectClassPart ,</function> +<function>RectObjClassPart ,</function> +and +<function>CoreClassPart</function> +structures are of type +<function>XtWidgetProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWidgetProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtWidgetProc)(Widget); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget being destroyed. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The destroy procedures are called in subclass-to-superclass order. +Therefore, a widget's destroy procedure should deallocate only storage +that is specific to the subclass and should ignore the storage +allocated by any of its superclasses. +The destroy procedure should deallocate only 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. +</para> +<para> +<!-- .LP --> +Deallocating storage includes, but is not limited to, +the following steps: +</para> +<itemizedlist> + <listitem> + <para> +Calling +<function>XtFree</function> +on dynamic storage allocated with +<function>XtMalloc ,</function> +<function>XtCalloc ,</function> +and so on. + </para> + </listitem> + <listitem> + <para> +Calling +<function>XFreePixmap</function> +on pixmaps created with direct X calls. + </para> + </listitem> + <listitem> + <para> +Calling +<function>XtReleaseGC</function> +on GCs allocated with +<function>XtGetGC .</function> + </para> + </listitem> + <listitem> + <para> +Calling +<function>XFreeGC</function> +on GCs allocated with direct X calls. + </para> + </listitem> + <listitem> + <para> +Calling +<function>XtRemoveEventHandler</function> +on event handlers added to other widgets. + </para> + </listitem> + <listitem> + <para> +Calling +<function>XtRemoveTimeOut</function> +on timers created with +<function>XtAppAddTimeOut .</function> + </para> + </listitem> + <listitem> + <para> +Calling +<function>XtDestroyWidget</function> +for each child if the widget has children +and is not a subclass of +<function>compositeWidgetClass .</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .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. + +</para> +</sect3> +<sect3 id="Dynamic_Constraint_Data_Deallocation_The_ConstraintClassPart_destroy_Procedure"> +<title>Dynamic Constraint Data Deallocation: The ConstraintClassPart destroy Procedure</title> +<!-- .XS --> +<!-- (SN Dynamic Constraint Data Deallocation: The ConstraintClassPart destroy Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +The constraint destroy procedure identified in the +<function>ConstraintClassPart</function> +structure is called for a widget whose parent is a subclass of +<function>constraintWidgetClass .</function> +This constraint destroy procedure pointer is of type +<function>XtWidgetProc .</function> +The constraint destroy procedures are called in subclass-to-superclass order, +starting at the class of the widget's parent and ending at +<function>constraint\%WidgetClass .</function> +Therefore, a parent's constraint destroy procedure should deallocate only +storage that is specific to the constraint subclass +and not storage allocated by any of its superclasses. +</para> +<para> +<!-- .LP --> +If a parent does not need to deallocate any constraint storage, +the constraint destroy procedure entry +in its class record can be NULL. + +</para> +</sect3> +<sect3 id="Widget_Instance_Deallocation_The_deallocate_Procedure"> +<title>Widget Instance Deallocation: The deallocate Procedure</title> +<!-- .XS --> +<!-- (SN Widget Instance Deallocation: The deallocate Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "deallocate procedure" "" "@DEF@" --> +The deallocate procedure pointer in the +<function>ObjectClassExtension</function> +record is of type +<function>XtDeallocateProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDeallocateProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtDeallocateProc)(Widget, XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>more_bytes</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget being destroyed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>more_bytes</emphasis> + </term> + <listitem> + <para> +Specifies the auxiliary memory received from the corresponding allocator +along with the widget, or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +When a widget is destroyed, if an +<function>ObjectClassExtension</function> +record exists in the object class part <emphasis remap='I'>extension</emphasis> field +with <emphasis remap='I'>record_type</emphasis> +<function>\s-1NULLQUARK\s+1</function> +and the <emphasis remap='I'>deallocate</emphasis> field is not NULL, the +<function>XtDeallocateProc</function> +will be called. +If no ObjectClassPart extension record is declared with <emphasis remap='I'>record_type</emphasis> +equal to +<function>\s-1NULLQUARK\s+1 ,</function> +then +<function>XtInheritAllocate</function> +and +<function>XtInheritDeallocate</function> +are assumed. +The responsibilities of the deallocate procedure are to deallocate the +memory specified by <emphasis remap='I'>more_bytes</emphasis> if it is not NULL, +to deallocate the constraints record as specified by the +widget's <emphasis remap='I'>core.constraints</emphasis> field if it is +not NULL, and to deallocate the widget instance itself. +</para> +<para> +<!-- .LP --> +If no +<function>XtDeallocateProc</function> +is found, it is assumed that the (xI +originally allocated the memory and is responsible for freeing it. + +</para> +</sect3> +</sect2> +<sect2 id="Exiting_from_an_Application"> +<title>Exiting from an Application</title> +<!-- .XS --> +<!-- <function>(SN Exiting from an Application</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +All (tk applications should terminate +by calling +<function>XtDestroyApplicationContext</function> +and then exiting +using the +standard method for their operating system (typically, by calling +<function>exit</function> +for POSIX-based systems). +The quickest way to make the windows disappear while exiting is to call +<function>XtUnmapWidget</function> +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. +</para> +<para> +<!-- .LP --> +Depending upon the widget set in use, it may be necessary to explicitly +destroy individual widgets or widget trees with +<function>XtDestroyWidget</function> +before calling +<function>XtDestroyApplicationContext</function> +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 cleanup beyond that performed automatically by the +operating system. If the client is a session participant +(see Section 4.2), then the client may wish to resign from the session +before exiting. See Section 4.2.4 for details. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect2> +</chapter> +</book> diff --git a/specs/CH03.xml b/specs/CH03.xml new file mode 100644 index 0000000..d7adfdc --- /dev/null +++ b/specs/CH03.xml @@ -0,0 +1,1654 @@ +<!-- .\" $Xorg: CH03,v 1.3 2000/08/17 19:42:44 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 3</function>\s-1 + +\s+1<function>Composite Widgets and Their Children</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 3 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 3 \(em Composite Widgets and Their Children --> +<!-- .XE --> +<!-- .IN "Composite widgets" --> +Composite widgets (widgets whose class is a subclass of +<function>compositeWidgetClass )</function> +can have an arbitrary number of children. +Consequently, they are responsible for much more than primitive widgets. +Their responsibilities (either implemented directly by the widget class +or indirectly by (xI functions) include: +</para> +<itemizedlist> + <listitem> + <para> +Overall management of children from creation to destruction. + </para> + </listitem> + <listitem> + <para> +Destruction of descendants when the composite widget is destroyed. + </para> + </listitem> + <listitem> + <para> +Physical arrangement (geometry management) of a displayable subset of +children (that is, the managed children). + </para> + </listitem> + <listitem> + <para> +Mapping and unmapping of a subset of the managed children. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Overall management is handled by the generic procedures +<function>XtCreateWidget</function> +and +<function>XtDestroyWidget .</function> +<function>XtCreateWidget</function> +adds children to their parent by calling the parent's insert_child +procedure. +<function>XtDestroyWidget</function> +removes children from their parent by calling the parent's delete_child +procedure and ensures that all children of a destroyed composite widget +also get destroyed. +</para> +<para> +<!-- .LP --> +Only a subset of the total number of children is actually managed by +the geometry manager and hence possibly visible. +For example, a composite editor widget +supporting multiple editing buffers might allocate one child +widget for each file buffer, +but it might display only a small number of the existing buffers. +Widgets that are in this displayable subset are called managed widgets +and enter into geometry manager calculations. +The other children are called unmanaged widgets +and, by definition, are not mapped by the (xI. +</para> +<para> +<!-- .LP --> +Children are added to and removed from their parent's managed set by using +<function>XtManageChild ,</function> +<function>XtManageChildren ,</function> +<function>XtUnmanageChild ,</function> +<function>XtUnmanageChildren ,</function> +and +<function>XtChangeManagedSet ,</function> +which notify the parent to recalculate the physical layout of its children +by calling the parent's change_managed procedure. +The +<function>XtCreateManagedWidget</function> +convenience function calls +<function>XtCreateWidget</function> +and +<function>XtManageChild</function> +on the result. +</para> +<para> +<!-- .LP --> +Most managed children are mapped, +but some widgets can be in a state where they take up physical space +but do not show anything. +Managed widgets are not mapped automatically +if their <emphasis remap='I'>map_when_managed</emphasis> field is +<function>False .</function> +The default is +<function>True</function> +and is changed by using +<function>XtSetMappedWhenManaged .</function> +</para> +<para> +<!-- .LP --> +Each composite widget class declares a geometry manager, +which is responsible for figuring out where the managed children +should appear within the composite widget's window. +Geometry management techniques fall into four classes: +<variablelist> + <varlistentry> + <term> + "Fixed + </term> + <listitem> + <para> +Fixed boxes have a fixed number of children created by the parent. +All these children are managed, +and none ever makes geometry manager requests. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + "Homogeneous + </term> + <listitem> + <para> +Homogeneous boxes treat all children equally and apply the same geometry +constraints to each child. +Many clients insert and delete widgets freely. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + "Heterogeneous + </term> + <listitem> + <para> +Heterogeneous boxes have a specific location where each child is placed. +This location usually is not specified in pixels, +because the window may be resized, but is expressed rather +in terms of the relationship between a child +and the parent or between the child and other specific children. +The class of heterogeneous boxes is usually a subclass of +Constraint. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + "Shell + </term> + <listitem> + <para> +Shell boxes typically have only one child, +and the child's size is usually +exactly the size of the shell. +The geometry manager must communicate with the window manager, if it exists, +and the box must also accept +<function>ConfigureNotify</function> +events when the window size is changed by the window manager. + + </para> + </listitem> + </varlistentry> +</variablelist> +</para> +<sect2 id="Addition_of_Children_to_a_Composite_Widget_The_insert_child_Procedure"> +<title>Addition of Children to a Composite Widget: The insert_child Procedure</title> +<!-- .XS --> +<!-- (SN Addition of Children to a Composite Widget: The insert_child Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "insert_child procedure" --> +To add a child to +the parent's list of children, the +<function>XtCreateWidget</function> +function calls the parent's class routine insert_child. +The insert_child procedure pointer in a composite widget is of type +<function>XtWidgetProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "insert_child procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtWidgetProc)(Widget); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Passes the newly created child. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Most composite widgets inherit their superclass's operation. +The insert_child routine in +<function>CompositeWidgetClass calls the insert_position procedure</function> +and inserts the child at the specified position +in the <emphasis remap='I'>children</emphasis> list, expanding it if necessary. +</para> +<para> +<!-- .LP --> +Some composite widgets define their own insert_child routine +so that they can order their children in some convenient way, +create companion controller widgets for a new widget, +or limit the number or class of their child widgets. +A composite widget class that wishes +to allow nonwidget children (see Chapter 12) must specify a +<function>CompositeClassExtension</function> +extension record as described +in Section 1.4.2.1 and set the <emphasis remap='I'>accepts_objects</emphasis> field in this record to +<function>True .</function> +If the +<function>CompositeClassExtension</function> +record is not specified or the +<emphasis remap='I'>accepts_objects</emphasis> field is +<function>False ,</function> +the composite widget can assume that all its children are of a subclass of Core +without an explicit subclass test in the insert_child procedure. +</para> +<para> +<!-- .LP --> +If there is not enough room to insert a new child in the <emphasis remap='I'>children</emphasis> array +(that is, <emphasis remap='I'>num_children</emphasis> is equal to <emphasis remap='I'>num_slots</emphasis>), +the insert_child procedure must first reallocate the array +and update <emphasis remap='I'>num_slots</emphasis>. +The insert_child procedure then places the child at the appropriate position +in the array and increments the <emphasis remap='I'>num_children</emphasis> field. + +</para> +</sect2> +<sect2 id="Insertion_Order_of_Children_The_insert_position_Procedure"> +<title>Insertion Order of Children: The insert_position Procedure</title> +<!-- .XS --> +<!-- <function>(SN Insertion Order of Children: The insert_position Procedure</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Instances of composite widgets sometimes need to specify more about the order in which +their children are kept. +For example, +an application may want a set of command buttons in some logical order +grouped by function, +and it may want buttons that represent file names to be kept +in alphabetical order without constraining the order in which the +buttons are created. +</para> +<para> +<!-- .LP --> +An application controls the presentation order of a set of children by +supplying an +<!-- .IN XtNinsertPosition --> +XtNinsertPosition +resource. +The insert_position procedure pointer in a composite widget instance is of type +<function>XtOrderProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOrderProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Cardinal (*XtOrderProc)(Widget); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Passes the newly created widget. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Composite widgets that allow clients to order their children (usually +homogeneous boxes) can call their widget instance's insert_position +procedure from the class's insert_child procedure to determine where a new +child should go in its <emphasis remap='I'>children</emphasis> array. +Thus, a client using a composite class can apply different sorting criteria +to widget instances of the class, passing in a different insert_position +procedure resource when it creates each composite widget instance. +</para> +<para> +<!-- .LP --> +The return value of the insert_position procedure +indicates how many children should go before the widget. +Returning zero indicates that the widget should go before all other children, +and returning <emphasis remap='I'>num_children</emphasis> indicates that it should go after all other children. +The default insert_position function returns <emphasis remap='I'>num_children</emphasis> +and can be overridden by a specific composite widget's resource list +or by the argument list provided when the composite widget is created. + +</para> +</sect2> +<sect2 id="Deletion_of_Children_The_delete_child_Procedure"> +<title>Deletion of Children: The delete_child Procedure</title> +<!-- .XS --> +<!-- (SN Deletion of Children: The delete_child Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "delete_child procedure" --> +</para> +<para> +<!-- .LP --> +To remove the child from the parent's <emphasis remap='I'>children</emphasis> list, the +<function>XtDestroyWidget</function> +function eventually causes a call to the Composite parent's class delete_child +procedure. +The delete_child procedure pointer is of type +<function>XtWidgetProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "delete_child procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtWidgetProc)(Widget); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<itemizedlist> + <listitem> + <para> +Passes the child being deleted. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<!-- .eM --> +Most widgets inherit the delete_child procedure from their superclass. +Composite widgets that create companion widgets define their own +delete_child procedure to remove these companion widgets. + +</para> +</sect2> +<sect2 id="Adding_and_Removing_Children_from_the_Managed_Set"> +<title>Adding and Removing Children from the Managed Set</title> +<!-- .XS --> +<!-- <function>(SN Adding and Removing Children from the Managed Set</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide a set of generic routines to permit the addition of +widgets to or the removal of widgets from a composite widget's managed set. +<!-- .IN "change_managed procedure" --> +These generic routines eventually call the composite widget's change_managed +procedure if the procedure pointer is non-NULL. +The change_managed procedure pointer is of type +<function>XtWidgetProc .</function> +The widget argument specifies the composite widget whose managed child +set has been modified. + +</para> +<sect3 id="Managing_Children"> +<title>Managing Children</title> +<!-- .XS --> +<!-- <function>(SN Managing Children</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To add a list of widgets to the geometry-managed (and hence displayable) +subset of their Composite parent, use +<function>XtManageChildren .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtManageChildren" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Widget *WidgetList; +<!-- .sp --> +void XtManageChildren(<emphasis remap='I'>children</emphasis>, <emphasis remap='I'>num_children</emphasis>) +<!-- .br --> + WidgetList <emphasis remap='I'>children</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_children</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>children</emphasis> + </term> + <listitem> + <para> +Specifies a list of child widgets. Each child must be of class +RectObj or any subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_children</emphasis> + </term> + <listitem> + <para> +Specifies the number of children in the list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtManageChildren</function> +function performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Issues an error if the children do not all have the same parent or +if the parent's class is not a subclass of +<function>compositeWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +Returns immediately if the common parent is being destroyed; +otherwise, for each unique child on the list, +<function>XtManageChildren</function> +ignores the child if it already is managed or is being destroyed, +and marks it if not. + </para> + </listitem> + <listitem> + <para> +If the parent is realized and after all children have been marked, +it makes some of the newly managed children viewable: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +Calls the change_managed routine of the widgets' parent. + </para> + </listitem> + <listitem> + <para> +Calls +<function>XtRealizeWidget</function> +on each previously unmanaged child that is unrealized. + </para> + </listitem> + <listitem> + <para> +Maps each previously unmanaged child that has <emphasis remap='I'>map_when_managed</emphasis> +<function>True .</function> +<!-- .RE --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Managing children is independent of the ordering of children and +independent of creating and deleting children. +The layout routine of the parent +should consider children whose <emphasis remap='I'>managed</emphasis> field is +<function>True</function> +and should ignore all other children. +Note that some composite widgets, especially fixed boxes, call +<function>XtManageChild</function> +from their insert_child procedure. +</para> +<para> +<!-- .LP --> +If the parent widget is realized, +its change_managed procedure is called to notify it +that its set of managed children has changed. +The parent can reposition and resize any of its children. +It moves each child as needed by calling +<function>XtMoveWidget ,</function> +which first updates the <emphasis remap='I'>x</emphasis> and <emphasis remap='I'>y</emphasis> fields and which then calls +<function>XMoveWindow .</function> +</para> +<para> +<!-- .LP --> +If the composite widget wishes to change the size or border width of any of +its children, it calls +<function>XtResizeWidget ,</function> +which first updates the +<emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, and <emphasis remap='I'>border_width</emphasis> +fields and then calls +<function>XConfigureWindow .</function> +Simultaneous repositioning and resizing may be done with +<function>XtConfigureWidget ;</function> +see Section 6.6. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To add a single child to its parent widget's set of managed children, use +<function>XtManageChild .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtManageChild" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtManageChild(<emphasis remap='I'>child</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>child</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>child</emphasis> + </term> + <listitem> + <para> +Specifies the child. (rI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtManageChild</function> +function constructs a +<function>WidgetList</function> +of length 1 and calls +<function>XtManageChildren .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To create and manage a child widget in a single procedure, use +<function>XtCreateManagedWidget</function> +or +<function>XtVaCreateManagedWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreateManagedWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtCreateManagedWidget(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>parent</emphasis>, \ +<emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>parent</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the resource instance name for the created widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created widget. (rC + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>parent</emphasis> + </term> + <listitem> + <para> +Specifies the parent widget. Must be of class Composite or any +subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCreateManagedWidget</function> +function is a convenience routine that calls +<function>XtCreateWidget</function> +and +<function>XtManageChild .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaCreateManagedWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtVaCreateManagedWidget(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>parent</emphasis>, ...) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>parent</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the resource instance name for the created widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created widget. (rC + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>parent</emphasis> + </term> + <listitem> + <para> +Specifies the parent widget. Must be of class Composite or any +subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaCreateManagedWidget</function> +is identical in function to +<function>XtCreateManagedWidget</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced +by a varargs list, as described in Section 2.5.1. + +</para> +</sect3> +<sect3 id="Unmanaging_Children"> +<title>Unmanaging Children</title> +<!-- .XS --> +<!-- <function>(SN Unmanaging Children</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To remove a list of children from a parent widget's managed list, use +<function>XtUnmanageChildren .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUnmanageChildren" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUnmanageChildren(<emphasis remap='I'>children</emphasis>, <emphasis remap='I'>num_children</emphasis>) +<!-- .br --> + WidgetList <emphasis remap='I'>children</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_children</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>children</emphasis> + </term> + <listitem> + <para> +Specifies a list of child widgets. Each child must be of class +RectObj or any subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_children</emphasis> + </term> + <listitem> + <para> +Specifies the number of children. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtUnmanageChildren</function> +function performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Returns immediately if the common parent is being destroyed. + </para> + </listitem> + <listitem> + <para> +Issues an error if the children do not all have the same parent +or if the parent is not a subclass of +<function>compositeWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +For each unique child on the list, +<function>XtUnmanageChildren</function> +ignores the child if it is unmanaged; otherwise it performs the following: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +Marks the child as unmanaged. + </para> + </listitem> + <listitem> + <para> +If the child is realized and the <emphasis remap='I'>map_when_managed</emphasis> field is +<function>True ,</function> +it is unmapped. +<!-- .RE --> + </para> + </listitem> + <listitem> + <para> +If the parent is realized and if any children have become unmanaged, +calls the change_managed routine of the widgets' parent. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtUnmanageChildren</function> +does not destroy the child widgets. +Removing widgets from a parent's managed set is often a temporary banishment, +and some time later the client may manage the children again. +To destroy widgets entirely, +<function>XtDestroyWidget</function> +should be called instead; +see Section 2.9. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove a single child from its parent widget's managed set, use +<function>XtUnmanageChild .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUnmanageChild" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUnmanageChild(<emphasis remap='I'>child</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>child</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>child</emphasis> + </term> + <listitem> + <para> +Specifies the child. (rI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtUnmanageChild</function> +function constructs a widget list +of length 1 and calls +<function>XtUnmanageChildren .</function> +</para> +<para> +<!-- .LP --> +These functions are low-level routines that are used by generic +composite widget building routines. +In addition, composite widgets can provide widget-specific, +high-level convenience procedures. + +</para> +</sect3> +<sect3 id="Bundling_Changes_to_the_Managed_Set"> +<title>Bundling Changes to the Managed Set</title> +<!-- .XS --> +<!-- <function>(SN Bundling Changes to the Managed Set</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +A client may simultaneously unmanage and manage children +with a single call to the (xI. In this same call the +client may provide a callback procedure that can modify the +geometries of one or more children. The composite widget class +defines whether this single client call results in separate invocations +of the change_managed method, one to unmanage and the other to +manage, or in just a single invocation. +<!-- .\" .LP --> +<!-- .\" The composite widget class specifies how its change_managed method --> +<!-- .\" should be invoked by declaring a --> +<!-- .\" .PN CompositeClassExtension --> +<!-- .\" structure as described in section 1.4.2.1. If the --> +<!-- .\" <emphasis remap='I'>allows_change_managed_set</emphasis> field in the --> +<!-- .\" .PN CompositeClassExtension --> +<!-- .\" record is --> +<!-- .\" .PN False , --> +<!-- .\" the change_managed method will be invoked twice; once before any --> +<!-- .\" geometry changes are requested by the client callback and once --> +<!-- .\" after. If the <emphasis remap='I'>allows_change_managed_set</emphasis> field is --> +<!-- .\" .PN True , --> +<!-- .\" the change_managed method will be invoked just once after the --> +<!-- .\" specified children have been marked as unmanaged or managed and --> +<!-- .\" the client's callback has been invoked. --> +<!-- .\" If no --> +<!-- .\" .PN CompositeClassExtension --> +<!-- .\" record is found in the extension field of the --> +<!-- .\" composite class part with record type --> +<!-- .\" .PN \s-1NULLQUARK\s+1 --> +<!-- .\" and version greater --> +<!-- .\" than 1 and if --> +<!-- .\" .PN XtInheritChangeManaged --> +<!-- .\" was specified in the class record during class initialization, the --> +<!-- .\" value of the <emphasis remap='I'>allows_change_managed_set</emphasis> --> +<!-- .\" field will be inherited from the superclass. --> +</para> +<para> +<!-- .LP --> +To simultaneously remove from and add to the geometry-managed +set of children of a composite parent, use +<function>XtChangeManagedSet .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtChangeManagedSet" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtChangeManagedSet(<emphasis remap='I'>unmanage_children</emphasis>, <emphasis remap='I'>num_unmanage_children</emphasis>, + <emphasis remap='I'>do_change_proc</emphasis>, <emphasis remap='I'>client_data</emphasis>, + <emphasis remap='I'>manage_children</emphasis>, <emphasis remap='I'>num_manage_children</emphasis>) +<!-- .br --> + WidgetList <emphasis remap='I'>unmanage_children</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_unmanage_children</emphasis>; +<!-- .br --> + XtDoChangeProc <emphasis remap='I'>do_change_proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + WidgetList <emphasis remap='I'>manage_children</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_manage_children</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>unmanage_children</emphasis> + </term> + <listitem> + <para> +Specifies the list of widget children to initially remove from the managed set. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_unmanage_children</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the <emphasis remap='I'>unmanage_children</emphasis> list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>do_change_proc</emphasis> + </term> + <listitem> + <para> +Specifies a procedure to invoke between unmanaging +and managing the children, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies client data to be passed to the do_change_proc. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>manage_children</emphasis> + </term> + <listitem> + <para> +Specifies the list of widget children to finally add to the managed set. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_manage_children</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the <emphasis remap='I'>manage_children</emphasis> list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtChangeManagedSet</function> +function performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Returns immediately if <emphasis remap='I'>num_unmanage_children</emphasis> and +<emphasis remap='I'>num_manage_children</emphasis> are both 0. + </para> + </listitem> + <listitem> + <para> +Issues a warning and returns if the widgets specified in the +<emphasis remap='I'>manage_children</emphasis> and +the <emphasis remap='I'>unmanage_children</emphasis> lists do not all have the same parent or if +that parent is not a subclass of +<function>compositeWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +Returns immediately if the common parent is being destroyed. + </para> + </listitem> + <listitem> + <para> +If <emphasis remap='I'>do_change_proc</emphasis> is not NULL and the parent's +<function>CompositeClassExtension</function> +<emphasis remap='I'>allows_change_managed_set</emphasis> field is +<function>False ,</function> +then +<function>XtChangeManagedSet</function> +performs the following: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +Calls +<function>XtUnmanageChildren</function> +(<emphasis remap='I'>unmanage_children</emphasis>, <emphasis remap='I'>num_unmanage_children</emphasis>). + </para> + </listitem> + <listitem> + <para> +Calls the <emphasis remap='I'>do_change_proc</emphasis>. + </para> + </listitem> + <listitem> + <para> +Calls +<function>XtManageChildren</function> +(<emphasis remap='I'>manage_children</emphasis>, <emphasis remap='I'>num_manage_children</emphasis>). +<!-- .RE --> + </para> + </listitem> + <listitem> + <para> +Otherwise, the following is performed: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +For each child on the <emphasis remap='I'>unmanage_children</emphasis> list; if the child is +already unmanaged it is ignored, otherwise it is marked as unmanaged, +and if it is realized and its <emphasis remap='I'>map_when_managed</emphasis> field is +<function>True ,</function> +it is unmapped. + </para> + </listitem> + <listitem> + <para> +If <emphasis remap='I'>do_change_proc</emphasis> is non-NULL, the procedure is invoked. + </para> + </listitem> + <listitem> + <para> +For each child on the <emphasis remap='I'>manage_children</emphasis> list; if the child is already +managed or is being destroyed, it is ignored; otherwise it is +marked as managed. + </para> + </listitem> + <listitem> + <para> +If the parent is realized and after all children have been marked, +the change_managed method of the parent is invoked, and subsequently +some of the newly managed children are made viewable by calling +<function>XtRealizeWidget</function> +on each previously unmanaged child that is unrealized and +mapping each previously unmanaged child that has <emphasis remap='I'>map_when_managed</emphasis> +<function>True .</function> +<!-- .RE --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +If no +<function>CompositeClassExtension</function> +record is found in the parent's composite class part <emphasis remap='I'>extension</emphasis> field +with record type +<function>\s-1NULLQUARK\s+1</function> +and version greater than 1, and if +<function>XtInheritChangeManaged</function> +was specified in the parent's class record during class initialization, +the value of the <emphasis remap='I'>allows_change_managed_set</emphasis> +field is inherited from the superclass. The value inherited from +<function>compositeWidgetClass</function> +for the <emphasis remap='I'>allows_change_managed_set</emphasis> field is +<function>False .</function> +</para> +<para> +<!-- .LP --> +It is not an error to include a child in both the <emphasis remap='I'>unmanage_children</emphasis> +and the <emphasis remap='I'>manage_children</emphasis> lists. The effect of such a call is that +the child remains managed following the call, but the <emphasis remap='I'>do_change_proc</emphasis> is +able to affect the child while it is in an unmanaged state. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>do_change_proc</emphasis> is of type +<function>XtDoChangeProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDoChangeProc" "" "@DEF" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtDoChangeProc)(Widget, WidgetList, Cardinal*, WidgetList, Cardinal*, XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>composite_parent</emphasis>; +<!-- .br --> + WidgetList <emphasis remap='I'>unmange_children</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_unmanage_children</emphasis>; +<!-- .br --> + WidgetList <emphasis remap='I'>manage_children</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_manage_children</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>composite_parent</emphasis> + </term> + <listitem> + <para> +Passes the composite parent whose managed set is being altered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>unmanage_children</emphasis> + </term> + <listitem> + <para> +Passes the list of children just removed from the managed set. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_unmanage_children</emphasis> + </term> + <listitem> + <para> +Passes the number of entries in the <emphasis remap='I'>unmanage_children</emphasis> list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>manage_children</emphasis> + </term> + <listitem> + <para> +Passes the list of children about to be added to the managed set. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_manage_children</emphasis> + </term> + <listitem> + <para> +Passes the number of entries in the <emphasis remap='I'>manage_children</emphasis> list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the client data passed to +<function>XtChangeManagedSet .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>do_change_proc</emphasis> procedure is used by the caller of +<function>XtChangeManagedSet</function> +to make changes to one or more children at the point when the +managed set contains the fewest entries. These changes may +involve geometry requests, and in this case the caller of +<function>XtChangeManagedSet</function> +may take advantage of the fact that the (xI internally grant +geometry requests made by unmanaged children without invoking +the parent's geometry manager. To achieve this advantage, if +the <emphasis remap='I'>do_change_proc</emphasis> procedure +changes the geometry of a child or of a descendant of a child, then +that child should be included in the <emphasis remap='I'>unmanage_children</emphasis> and +<emphasis remap='I'>manage_children</emphasis> lists. + +</para> +</sect3> +<sect3 id="Determining_if_a_Widget_Is_Managed"> +<title>Determining if a Widget Is Managed</title> +<!-- .XS --> +<!-- <function>(SN Determining if a Widget Is Managed</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To determine the managed state of a given child widget, use +<function>XtIsManaged .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtIsManaged" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtIsManaged(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>\^; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtIsManaged</function> +function returns +<function>True</function> +if the specified widget is of class RectObj or any subclass thereof +and is managed, or +<function>False</function> +otherwise. + +</para> +</sect3> +</sect2> +<sect2 id="Controlling_When_Widgets_Get_Mapped"> +<title>Controlling When Widgets Get Mapped</title> +<!-- .XS --> +<!-- <function>(SN Controlling When Widgets Get Mapped</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +A widget is normally mapped if it is managed. +However, +this behavior can be overridden by setting the XtNmappedWhenManaged resource +for the widget when it is created +or by setting the <emphasis remap='I'>map_when_managed</emphasis> field to +<function>False .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To change the value of a given widget's <emphasis remap='I'>map_when_managed</emphasis> field, use +<function>XtSetMappedWhenManaged .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetMappedWhenManaged" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetMappedWhenManaged(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>map_when_managed</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>map_when_managed</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>map_when_managed</emphasis> + </term> + <listitem> + <para> +Specifies a Boolean value that indicates the new value +that is stored into the widget's <emphasis remap='I'>map_when_managed</emphasis> +field. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If the widget is realized and managed, +and if <emphasis remap='I'>map_when_managed</emphasis> is +<function>True ,</function> +<function>XtSetMappedWhenManaged</function> +maps the window. +If the widget is realized and managed, +and if <emphasis remap='I'>map_when_managed</emphasis> is +<function>False ,</function> +it unmaps the window. +<function>XtSetMappedWhenManaged</function> +is a convenience function that is equivalent to (but slightly faster than) +calling +<function>XtSetValues</function> +and setting the new value for the XtNmappedWhenManaged resource +then mapping the widget as appropriate. +As an alternative to using +<function>XtSetMappedWhenManaged</function> +to control mapping, +a client may set <emphasis remap='I'>mapped_when_managed</emphasis> to +<function>False</function> +and use +<function>XtMapWidget</function> +and +<function>XtUnmapWidget</function> +explicitly. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To map a widget explicitly, use +<function>XtMapWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMapWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtMapWidget(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>\^; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +To unmap a widget explicitly, use +<function>XtUnmapWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUnmapWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtUnmapWidget(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>\^; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> + +</para> +</sect2> +<sect2 id="Constrained_Composite_Widgets"> +<title>Constrained Composite Widgets</title> +<!-- .XS --> +<!-- (SN Constrained Composite Widgets --> +<!-- .XE --> +<para> +<!-- .LP --> +The Constraint +widget class is a subclass of +<function>compositeWidgetClass .</function> +The name is derived from the fact that constraint widgets +may manage the geometry +of their children based on constraints associated with each child. +These constraints can be as simple as the maximum width and height +the parent will allow the child to occupy or can be as complicated as +how other children should change if this child is moved or resized. +Constraint +widgets let a parent define constraints as resources that are supplied for their children. +For example, if the +Constraint +parent defines the maximum sizes for its children, +these new size resources are retrieved for each child as if they were +resources that were defined by the child widget's class. +Accordingly, +constraint resources may be included in the argument list or resource file just +like any other resource for the child. +</para> +<para> +<!-- .LP --> +Constraint +widgets have all the responsibilities of normal composite widgets +and, in addition, must process and act upon the constraint information +associated with each of their children. +</para> +<para> +<!-- .LP --> +To make it easy for widgets and the (xI to keep track of the +constraints associated with a child, +every widget has a <emphasis remap='I'>constraints</emphasis> field, +which is the address of a parent-specific structure that contains +constraint information about the child. +If a child's parent does not belong to a subclass of +<function>constraintWidgetClass ,</function> +then the child's <emphasis remap='I'>constraints</emphasis> field is NULL. +</para> +<para> +<!-- .LP --> +Subclasses of +Constraint +can add constraint data to the constraint record defined by their superclass. +To allow this, widget writers should define the constraint +records in their private .h file by using the same conventions as used for +widget records. +For example, a widget class that needs to maintain a maximum +width and height for each child might define its constraint record as +follows: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + Dimension max_width, max_height; +} MaxConstraintPart; + +typedef struct { + MaxConstraintPart max; +} MaxConstraintRecord, *MaxConstraint; +</literallayout> +</para> +<para> +<!-- .LP --> +A subclass of this widget class that also needs to maintain a minimum size would +define its constraint record as follows: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + Dimension min_width, min_height; +} MinConstraintPart; + +typedef struct { + MaxConstraintPart max; + MinConstraintPart min; +} MaxMinConstraintRecord, *MaxMinConstraint; +</literallayout> +</para> +<para> +<!-- .LP --> +Constraints are allocated, initialized, deallocated, and otherwise maintained +insofar as possible by the (xI. +The Constraint class record part has several entries that facilitate this. +All entries in +<function>ConstraintClassPart</function> +are fields and procedures that are defined and implemented by the parent, +but they are called whenever actions are performed on the parent's children. +</para> +<para> +<!-- .LP --> +The +<function>XtCreateWidget</function> +function uses the <emphasis remap='I'>constraint_size</emphasis> field in the parent's class record +to allocate a constraint record when a child is created. +<function>XtCreateWidget</function> +also uses the constraint resources to fill in resource fields in the +constraint record associated with a child. +It then calls the constraint initialize procedure so that the parent +can compute constraint fields that are derived from constraint resources +and can possibly move or resize the child to conform to the given constraints. +</para> +<para> +<!-- .LP --> +When the +<function>XtGetValues</function> +and +<function>XtSetValues</function> +functions are executed +on a child, they use the constraint resources to get the values or +set the values of constraints associated with that child. +<function>XtSetValues</function> +then calls the constraint set_values procedures so that the parent can +recompute derived constraint fields and move or resize the child +as appropriate. +If a +Constraint +widget class or any of its superclasses have declared a +<function>ConstraintClassExtension</function> +record in the +<function>ConstraintClassPart</function> +<emphasis remap='I'>extension</emphasis> +fields with a record type of +<function>\s-1NULLQUARK\s+1</function> +and the <emphasis remap='I'>get_values_hook</emphasis> field in +<!-- .IN "get_values_hook procedure" --> +<!-- .IN "Constraint" "get_values_hook" --> +the extension record is non-NULL, +<function>XtGetValues</function> +calls the get_values_hook +procedure(s) to allow the parent to return derived constraint fields. +</para> +<para> +<!-- .LP --> +The +<function>XtDestroyWidget</function> +function calls the constraint destroy procedure to deallocate any +dynamic storage associated with a constraint record. +The constraint record itself must not be deallocated by the constraint +destroy procedure; +<function>XtDestroyWidget</function> +does this automatically. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect2> +</chapter> +</book> diff --git a/specs/CH04.xml b/specs/CH04.xml new file mode 100644 index 0000000..231f31e --- /dev/null +++ b/specs/CH04.xml @@ -0,0 +1,3222 @@ +<!-- .\" $Xorg: CH04,v 1.3 2000/08/17 19:42:44 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 4</function>\s-1 + +\s+1<function>Shell Widgets</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 4 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 4 \(em Shell Widgets --> +<!-- .XE --> +<!-- .IN "Shell" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +Shell widgets hold an application's top-level widgets to allow them to +communicate with the window manager and session manager. +Shells have been designed to be as nearly invisible as possible. +Clients have to create them, +but they should never have to worry about their sizes. +</para> +<para> +<!-- .LP --> +If a shell widget is resized from the outside (typically by a window manager), +the shell widget also resizes its managed child widget automatically. +Similarly, if the shell's child widget needs to change size, +it can make a geometry request to the shell, +and the shell negotiates the size change with the outer environment. +Clients should never attempt to change the size of their shells directly. +</para> +<para> +<!-- .LP --> +The five types of public shells are: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(1.5i) lw(4.25i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>OverrideShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Used for shell windows that completely bypass the window manager</entry> + </row> + <row> + <entry>(for example, pop-up menu shells).</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>TransientShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Used for shell windows that have the</entry> + </row> + <row> + <entry><function>\s-1WM_TRANSIENT_FOR\s+1</function></entry> + </row> + <row> + <entry>property set. The effect of this property is dependent upon the</entry> + </row> + <row> + <entry>window manager being used.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>TopLevelShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Used for normal top-level windows</entry> + </row> + <row> + <entry>(for example, any additional top-level widgets an application needs).</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>ApplicationShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Formerly used for the single main top-level window that</entry> + </row> + <row> + <entry>the window manager identifies as an application instance and</entry> + </row> + <row> + <entry>made obsolete by SessionShell.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>SessionShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Used for the single main top-level window that</entry> + </row> + <row> + <entry>the window manager identifies as an application instance and</entry> + </row> + <row> + <entry>that interacts with the session manager.</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +<sect2 id="Shell_Widget_Definitions"> +<title>Shell Widget Definitions</title> +<!-- .XS --> +<!-- (SN Shell Widget Definitions --> +<!-- .XE --> +<para> +<!-- .LP --> +Widgets negotiate their size and position with their parent widget, +that is, the widget that directly contains them. +Widgets at the top of the hierarchy do not have parent widgets. +Instead, they must deal with the outside world. +To provide for this, +each top-level widget is encapsulated in a special widget, called a +shell widget. +</para> +<para> +<!-- .LP --> +Shell +widgets, whose class is a subclass of the +Composite class, +encapsulate other widgets and can allow a widget to avoid the +geometry clipping imposed by the parent-child window relationship. +They also can provide a layer of communication with the window manager. +</para> +<para> +<!-- .LP --> +The eight different types of shells are: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(1.5i) lw(4.5i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>Shell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>The base class for shell widgets; provides the</entry> + </row> + <row> + <entry>fields needed for all types of shells.</entry> + </row> + <row> + <entry>Shell</entry> + </row> + <row> + <entry>is a direct subclass of</entry> + </row> + <row> + <entry><function>compositeWidgetClass .</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>OverrideShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of Shell; used for shell windows that completely</entry> + </row> + <row> + <entry>bypass the window manager.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>WMShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of Shell; contains fields needed by the</entry> + </row> + <row> + <entry>common window manager protocol.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>VendorShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of WMShell; contains fields used by</entry> + </row> + <row> + <entry>vendor-specific window managers.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>TransientShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of VendorShell; used for shell windows that</entry> + </row> + <row> + <entry>desire the</entry> + </row> + <row> + <entry><function>\s-1WM_TRANSIENT_FOR\s+1</function></entry> + </row> + <row> + <entry>property.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>TopLevelShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of VendorShell; used for normal top-level windows.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>ApplicationShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of TopLevelShell; may be used for an application's additional</entry> + </row> + <row> + <entry>root windows.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>SessionShell</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>A subclass of ApplicationShell; used for an application's</entry> + </row> + <row> + <entry>main root window.</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +Note that the classes +Shell, +WMShell, +and +VendorShell +are internal and should not be instantiated or subclassed. +Only +OverrrideShell, +TransientShell, +TopLevelShell, +ApplicationShell, +and +SessionShell +are intended for public use. + +</para> +<sect3 id="ShellClassPart_Definitions"> +<title>ShellClassPart Definitions</title> +<!-- .XS --> +<!-- (SN ShellClassPart Definitions --> +<!-- .XE --> +<para> +<!-- .LP --> +Only the +Shell +class has additional class fields, which are all contained in the +<function>ShellClassExtensionRec .</function> +None of the other Shell classes have any additional class fields: +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + XtPointer extension; +} ShellClassPart, OverrideShellClassPart, +WMShellClassPart, VendorShellClassPart, TransientShellClassPart, +TopLevelShellClassPart, ApplicationShellClassPart, SessionShellClassPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> +The full Shell class record definitions are: +<!-- .IN "ShellClassExtension" "" "@DEF@" --> +<!-- .IN "ShellClassExtensionRec" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _ShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; +} ShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + XtPointer next_extension; See Section 1.6.12 + XrmQuark record_type; See Section 1.6.12 + long version; See Section 1.6.12 + Cardinal record_size; See Section 1.6.12 + XtGeometryHandler root_geometry_manager; See below +} ShellClassExtensionRec, *ShellClassExtension; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _OverrideShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + OverrideShellClassPart override_shell_class; +} OverrideShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _WMShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; +} WMShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _VendorShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; +} VendorShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _TransientShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TransientShellClassPart transient_shell_class; +} TransientShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _TopLevelShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TopLevelShellClassPart top_level_shell_class; +} TopLevelShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _ApplicationShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TopLevelShellClassPart top_level_shell_class; + ApplicationShellClassPart application_shell_class; +} ApplicationShellClassRec; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct _SessionShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TopLevelShellClassPart top_level_shell_class; + ApplicationShellClassPart application_shell_class; + SessionShellClassPart session_shell_class; +} SessionShellClassRec; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> +<!-- .KS --> +The single occurrences of the class records and pointers for creating +instances of shells are: +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +extern ShellClassRec shellClassRec; +extern OverrideShellClassRec overrideShellClassRec; +extern WMShellClassRec wmShellClassRec; +extern VendorShellClassRec vendorShellClassRec; +extern TransientShellClassRec transientShellClassRec; +extern TopLevelShellClassRec topLevelShellClassRec; +extern ApplicationShellClassRec applicationShellClassRec; +extern SessionShellClassRec sessionShellClassRec; +<!-- .sp --> +extern WidgetClass shellWidgetClass; +extern WidgetClass overrideShellWidgetClass; +extern WidgetClass wmShellWidgetClass; +extern WidgetClass vendorShellWidgetClass; +extern WidgetClass transientShellWidgetClass; +extern WidgetClass topLevelShellWidgetClass; +extern WidgetClass applicationShellWidgetClass; +extern WidgetClass sessionShellWidgetClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> +<!-- .KS --> +The following opaque types and opaque variables are defined +for generic operations on widgets whose class is a subclass of +Shell. +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2.75i) lw(2.75i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Types</entry> + <entry>Variables</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>ShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>shellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>OverrideShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>overrideShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>WMShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>wmShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>VendorShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>vendorShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>TransientShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>transientShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>TopLevelShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>topLevelShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>ApplicationShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>applicationShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>SessionShellWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>sessionShellWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry><function>ShellWidgetClass</function></entry> + </row> + <row> + <entry><function>OverrideShellWidgetClass</function></entry> + </row> + <row> + <entry><function>WMShellWidgetClass</function></entry> + </row> + <row> + <entry><function>VendorShellWidgetClass</function></entry> + </row> + <row> + <entry><function>TransientShellWidgetClass</function></entry> + </row> + <row> + <entry><function>TopLevelShellWidgetClass</function></entry> + </row> + <row> + <entry><function>ApplicationShellWidgetClass</function></entry> + </row> + <row> + <entry><function>SessionShellWidgetClass</function></entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +The declarations for all Intrinsics-defined shells except +VendorShell appear in +<function>Shell.h</function> +and +<function>ShellP.h .</function> +VendorShell has separate public and private .h files which are included by +<function>Shell.h</function> +and +<function>ShellP.h .</function> +</para> +<para> +<!-- .LP --> +<function>Shell.h</function> +uses incomplete structure definitions to ensure that the +compiler catches attempts to access private data in any of the Shell +instance or class data structures. +</para> +<para> +<!-- .LP --> +The symbolic constant for the +<function>ShellClassExtension</function> +version identifier is +<function>XtShellExtensionVersion</function> +(see Section 1.6.12). +<!-- .IN "XtShellExtensionVersion" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .IN "Shell" "root_geometry_manager" --> +<!-- .IN "root_geometry_manager procedure" --> +The root_geometry_manager procedure acts as +the parent geometry manager for geometry requests made by shell +widgets. When a shell widget calls either +<function>XtMakeGeometryRequest</function> +or +<function>XtMakeResizeRequest ,</function> +the root_geometry_manager procedure is invoked to +negotiate the new geometry with the window manager. If the window +manager permits the new geometry, the root_geometry_manager +procedure should +return +<function>XtGeometryYes ;</function> +if the window manager denies the geometry +request or does not change the window geometry within some timeout +interval (equal to <emphasis remap='I'>wm_timeout</emphasis> in the case of WMShells), the +<!-- .IN "Shell" "wm_timeout" "@DEF@" --> +<!-- .IN "wm_timeout" "" "@DEF@" --> +root_geometry_manager procedure should return +<function>XtGeometryNo .</function> +If the window manager makes some alternative geometry change, the +root_geometry_manager procedure may return either +<function>XtGeometryNo</function> +and handle the new geometry as a resize or +<function>XtGeometryAlmost</function> +in anticipation that the shell will accept the compromise. If the +compromise is not accepted, the new size must then be handled as a +resize. Subclasses of +Shell +that wish to provide their own +root_geometry_manager procedures are strongly encouraged to use enveloping to +invoke their superclass's root_geometry_manager procedure under most +situations, as the window manager interaction may be very complex. +</para> +<para> +<!-- .LP --> +If no +<function>ShellClassPart</function> +extension record is declared with <emphasis remap='I'>record_type</emphasis> +equal to +<function>\s-1NULLQUARK\s+1 ,</function> +then +<function>XtInheritRootGeometryManager</function> +is assumed. + +</para> +</sect3> +<sect3 id="ShellPart_Definition"> +<title>ShellPart Definition</title> +<!-- .XS --> +<!-- (SN ShellPart Definition --> +<!-- .XE --> +<para> +<!-- .LP --> +The various shell widgets have the following additional instance +fields defined in +their widget records: +</para> +<para> +<!-- .LP --> +<!-- .IN "ShellPart" "" "@DEF@" --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + String geometry; + XtCreatePopupChildProc create_popup_child_proc; + XtGrabKind grab_kind; + Boolean spring_loaded; + Boolean popped_up; + Boolean allow_shell_resize; + Boolean client_specified; + Boolean save_under; + Boolean override_redirect; + XtCallbackList popup_callback; + XtCallbackList popdown_callback; + Visual * visual; +} ShellPart; +</literallayout> +<!-- .KE --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + int empty; +} OverrideShellPart; +</literallayout> +<literallayout class="monospaced"> +<!-- .TA .5i 1i 1.5i 2.5i --> +<!-- .ta .5i 1i 1.5i 2.5i --> +typedef struct { + String title; + int wm_timeout; + Boolean wait_for_wm; + Boolean transient; + Boolean urgency; + Widget client_leader; + String window_role; + struct _OldXSizeHints { + long flags; + int x, y; + int width, height; + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; + int y; + } min_aspect, max_aspect; + } size_hints; + XWMHints wm_hints; + int base_width, base_height, win_gravity; + Atom title_encoding; +} WMShellPart; +</literallayout> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + int vendor_specific; +} VendorShellPart; +</literallayout> +<!-- .KE --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + Widget transient_for; +} TransientShellPart; + +typedef struct { + String icon_name; + Boolean iconic; + Atom icon_name_encoding; +} TopLevelShellPart; +</literallayout> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + char * class; + XrmClass xrm_class; + int argc; + char ** argv; +} ApplicationShellPart; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + SmcConn connection; + String session_id; + String * restart_command; + String * clone_command; + String * discard_command; + String * resign_command; + String * shutdown_command; + String * environment; + String current_dir; + String program_path; + unsigned char restart_style; + Boolean join_session; + XtCallbackList save_callbacks; + XtCallbackList interact_callbacks; + XtCallbackList cancel_callbacks; + XtCallbackList save_complete_callbacks; + XtCallbackList die_callbacks; + XtCallbackList error_callbacks; +} SessionShellPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> +<!-- .KS --> +The full shell widget instance record definitions are: +</para> +<para> +<!-- .LP --> +<!-- .IN "ShellWidget" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; +} ShellRec, *ShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + OverrideShellPart override; +} OverrideShellRec, *OverrideShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; +} WMShellRec, *WMShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; +} VendorShellRec, *VendorShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TransientShellPart transient; +} TransientShellRec, *TransientShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TopLevelShellPart topLevel; +} TopLevelShellRec, *TopLevelShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +<!-- .IN "ApplicationShellWidget" "" "@DEF@" --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TopLevelShellPart topLevel; + ApplicationShellPart application; +} ApplicationShellRec, *ApplicationShellWidget; +</literallayout> +<!-- .KE --> +<!-- .KS --> +<!-- .IN "SessionShellWidget" "" "@DEF@" --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i 4.5i --> +<!-- .ta .5i 2.5i 4.5i --> +typedef struct { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TopLevelShellPart topLevel; + ApplicationShellPart application; + SessionShellPart session; +} SessionShellRec, *SessionShellWidget; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> + +</para> +</sect3> +<sect3 id="Shell_Resources"> +<title>Shell Resources</title> +<!-- .XS --> +<!-- <function>(SN Shell Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "ShellWidget" "Resources" --> +The resource names, classes, and representation types specified in +the +<function>shellClassRec</function> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.7i) lw(1.7i) lw(1.2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNallowShellResize</entry> + <entry>XtCAllowShellResize</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNcreatePopupChildProc</entry> + <entry>XtCCreatePopupChildProc</entry> + <entry>XtRFunction</entry> + </row> + <row> + <entry>XtNgeometry</entry> + <entry>XtCGeometry</entry> + <entry>XtRString</entry> + </row> + <row> + <entry>XtNoverrideRedirect</entry> + <entry>XtCOverrideRedirect</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNpopdownCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNpopupCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNsaveUnder</entry> + <entry>XtCSaveUnder</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNvisual</entry> + <entry>XtCVisual</entry> + <entry>XtRVisual</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +OverrideShell +declares no additional resources beyond those defined by +Shell. +</para> +<para> +<!-- .LP --> +The resource names, classes, and representation types specified in +the +<function>wmShellClassRec</function> +<!-- .IN "WMShell" "resources" --> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(2.1i) lw(2.1i) lw(1.2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNbaseHeight</entry> + <entry>XtCBaseHeight</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNbaseWidth</entry> + <entry>XtCBaseWidth</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNclientLeader</entry> + <entry>XtCClientLeader</entry> + <entry>XtRWidget</entry> + </row> + <row> + <entry>XtNheightInc</entry> + <entry>XtCHeightInc</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNiconMask</entry> + <entry>XtCIconMask</entry> + <entry>XtRBitmap</entry> + </row> + <row> + <entry>XtNiconPixmap</entry> + <entry>XtCIconPixmap</entry> + <entry>XtRBitmap</entry> + </row> + <row> + <entry>XtNiconWindow</entry> + <entry>XtCIconWindow</entry> + <entry>XtRWindow</entry> + </row> + <row> + <entry>XtNiconX</entry> + <entry>XtCIconX</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNiconY</entry> + <entry>XtCIconY</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNinitialState</entry> + <entry>XtCInitialState</entry> + <entry>XtRInitialState</entry> + </row> + <row> + <entry>XtNinput</entry> + <entry>XtCInput</entry> + <entry>XtRBool</entry> + </row> + <row> + <entry>XtNmaxAspectX</entry> + <entry>XtCMaxAspectX</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNmaxAspectY</entry> + <entry>XtCMaxAspectY</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNmaxHeight</entry> + <entry>XtCMaxHeight</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNmaxWidth</entry> + <entry>XtCMaxWidth</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNminAspectX</entry> + <entry>XtCMinAspectX</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNminAspectY</entry> + <entry>XtCMinAspectY</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNminHeight</entry> + <entry>XtCMinHeight</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNminWidth</entry> + <entry>XtCMinWidth</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNtitle</entry> + <entry>XtCTitle</entry> + <entry>XtRString</entry> + </row> + <row> + <entry>XtNtitleEncoding</entry> + <entry>XtCTitleEncoding</entry> + <entry>XtRAtom</entry> + </row> + <row> + <entry>XtNtransient</entry> + <entry>XtCTransient</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNwaitforwm, XtNwaitForWm</entry> + <entry>XtCWaitforwm, XtCWaitForWm</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNwidthInc</entry> + <entry>XtCWidthInc</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNwindowRole</entry> + <entry>XtCWindowRole</entry> + <entry>XtRString</entry> + </row> + <row> + <entry>XtNwinGravity</entry> + <entry>XtCWinGravity</entry> + <entry>XtRGravity</entry> + </row> + <row> + <entry>XtNwindowGroup</entry> + <entry>XtCWindowGroup</entry> + <entry>XtRWindow</entry> + </row> + <row> + <entry>XtNwmTimeout</entry> + <entry>XtCWmTimeout</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNurgency</entry> + <entry>XtCUrgency</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The class resource list for +VendorShell +is implementation-defined. +</para> +<para> +<!-- .LP --> +The resource names, classes, and representation types that are specified in the +<function>transient\%ShellClassRec</function> +<!-- .IN "TransientShell" "resources" --> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.7i) lw(1.7i) lw(1.2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNtransientFor</entry> + <entry>XtCTransientFor</entry> + <entry>XtRWidget</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The resource names, classes, and representation types that are specified in the +<function>topLevelShellClassRec</function> +<!-- .IN "TopLevelShell" "resources" --> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.7i) lw(1.7i) lw(1.2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNiconName</entry> + <entry>XtCIconName</entry> + <entry>XtRString</entry> + </row> + <row> + <entry>XtNiconNameEncoding</entry> + <entry>XtCIconNameEncoding</entry> + <entry>XtRAtom</entry> + </row> + <row> + <entry>XtNiconic</entry> + <entry>XtCIconic</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The resource names, classes, and representation types that are specified in the +<function>application\%ShellClassRec</function> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.7i) lw(1.7i) lw(1.2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNargc</entry> + <entry>XtCArgc</entry> + <entry>XtRInt</entry> + </row> + <row> + <entry>XtNargv</entry> + <entry>XtCArgv</entry> + <entry>XtRStringArray</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +The resource names, classes, and representation types that are specified +in the +<function>sessionShellClassRec</function> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.7i) lw(1.7i) lw(1.2i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNcancelCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNcloneCommand</entry> + <entry>XtCCloneCommand</entry> + <entry>XtRCommandArgArray</entry> + </row> + <row> + <entry>XtNconnection</entry> + <entry>XtCConnection</entry> + <entry>XtRSmcConn</entry> + </row> + <row> + <entry>XtNcurrentDirectory</entry> + <entry>XtCCurrentDirectory</entry> + <entry>XtRDirectoryString</entry> + </row> + <row> + <entry>XtNdieCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNdiscardCommand</entry> + <entry>XtCDiscardCommand</entry> + <entry>XtRCommandArgArray</entry> + </row> + <row> + <entry>XtNenvironment</entry> + <entry>XtCEnvironment</entry> + <entry>XtREnvironmentArray</entry> + </row> + <row> + <entry>XtNerrorCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNinteractCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNjoinSession</entry> + <entry>XtCJoinSession</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNprogramPath</entry> + <entry>XtCProgramPath</entry> + <entry>XtRString</entry> + </row> + <row> + <entry>XtNresignCommand</entry> + <entry>XtCResignCommand</entry> + <entry>XtRCommandArgArray</entry> + </row> + <row> + <entry>XtNrestartCommand</entry> + <entry>XtCRestartCommand</entry> + <entry>XtRCommandArgArray</entry> + </row> + <row> + <entry>XtNrestartStyle</entry> + <entry>XtCRestartStyle</entry> + <entry>XtRRestartStyle</entry> + </row> + <row> + <entry>XtNsaveCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNsaveCompleteCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNsessionID</entry> + <entry>XtCSessionID</entry> + <entry>XtRString</entry> + </row> + <row> + <entry>XtNshutdownCommand</entry> + <entry>XtCShutdownCommand</entry> + <entry>XtRCommandArgArray</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .KE --> +</para> +</sect3> +<sect3 id="ShellPart_Default_Values"> +<title>ShellPart Default Values</title> +<!-- .XS --> +<!-- <function>(SN ShellPart Default Values</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The default values for fields common to all classes of public shells +(filled in by the +Shell +resource lists and the +Shell +initialize procedures) are: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(1.75i) lw(3i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Field</entry> + <entry>Default Value</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>geometry</entry> + <entry>NULL</entry> + </row> + <row> + <entry>create_popup_child_proc</entry> + <entry>NULL</entry> + </row> + <row> + <entry>grab_kind</entry> + <entry>(none)</entry> + </row> + <row> + <entry>spring_loaded</entry> + <entry>(none)</entry> + </row> + <row> + <entry>popped_up</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>allow_shell_resize</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>client_specified</entry> + <entry>(internal)</entry> + </row> + <row> + <entry>save_under</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>for</entry> + </row> + <row> + <entry>OverrideShell</entry> + </row> + <row> + <entry>and</entry> + </row> + <row> + <entry>TransientShell,</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>otherwise</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>override_redirect</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>for</entry> + </row> + <row> + <entry>OverrideShell,</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>otherwise</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>popup_callback</entry> + <entry>NULL</entry> + </row> + <row> + <entry>popdown_callback</entry> + <entry>NULL</entry> + </row> + <row> + <entry>visual</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CopyFromParent</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>geometry</emphasis> field specifies the size and position +and is usually given only on a command line or in a defaults file. +If the <emphasis remap='I'>geometry</emphasis> field is non-NULL when +a widget of class WMShell +is realized, the geometry specification is parsed using +<function>XWMGeometry</function> +with a default geometry +string constructed from the values of <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, +<emphasis remap='I'>height</emphasis>, <emphasis remap='I'>width_inc</emphasis>, +and <emphasis remap='I'>height_inc</emphasis> and the size and position flags in the window manager +size hints are set. If the geometry specifies an x or y position, +then +<function>USPosition</function> +is set. If the geometry specifies a width or height, then +<function>USSize</function> +is set. Any fields in the geometry specification +override the corresponding values in the +Core <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, and <emphasis remap='I'>height</emphasis> fields. +If <emphasis remap='I'>geometry</emphasis> is NULL or contains only a partial specification, then the +Core <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, and <emphasis remap='I'>height</emphasis> fields are used and +<function>PPosition</function> +and +<function>PSize</function> +are set as appropriate. +The geometry string is not copied by any of the (xI +Shell classes; a client specifying the string in an arglist +or varargs list must ensure +that the value remains valid until the shell widget is realized. +For further information on the geometry string, see Section 16.4 +in <emphasis remap='I'>(xL</emphasis>. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>create_popup_child_proc</emphasis> procedure is called by the +<function>XtPopup</function> +procedure and may remain NULL. +The <emphasis remap='I'>grab_kind</emphasis>, <emphasis remap='I'>spring_loaded</emphasis>, +and <emphasis remap='I'>popped_up</emphasis> fields maintain widget +state information as described under +<function>XtPopup ,</function> +<function>XtMenuPopup ,</function> +<function>XtPopdown ,</function> +and +<function>XtMenuPopdown .</function> +<!-- .IN "allowShellResize" "" "@DEF@" --> +The <emphasis remap='I'>allow_shell_resize</emphasis> field controls whether the widget contained +by the shell is allowed to try to resize itself. +If allow_shell_resize is +<function>False ,</function> +any geometry requests made by the child will always return +<function>XtGeometryNo</function> +without interacting with the window manager. +Setting <emphasis remap='I'>save_under</emphasis> +<function>True</function> +instructs the server to attempt +to save the contents of windows obscured by the shell when it is mapped +and to restore those contents automatically when the shell is unmapped. +It is useful for pop-up menus. +Setting <emphasis remap='I'>override_redirect</emphasis> +<function>True</function> +determines +whether the window manager can intercede when the shell window +is mapped. +For further information on override_redirect, +see Section 3.2 in <emphasis remap='I'>(xL</emphasis> and Sections 4.1.10 and 4.2.2 in the +<emphasis remap='I'>(xC</emphasis>. +The pop-up and pop-down callbacks are called during +<function>XtPopup</function> +and +<function>XtPopdown .</function> +The default value of the <emphasis remap='I'>visual</emphasis> resource is the symbolic value +<function>CopyFromParent .</function> +The (xI do not need to query the parent's visual type when the +default value is used; if a client using +<function>XtGetValues</function> +to examine the visual type receives the value +<function>CopyFromParent ,</function> +it must then use +<function>XGetWindowAttributes</function> +if it needs the actual visual type. + +</para> +<para> +<!-- .LP --> +The default values for Shell fields in +WMShell +and its subclasses are: +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUnspecifiedShellInt" "" "@DEF@" --> +<!-- .IN "XtUnspecifiedWindow" --> +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(1i) lw(4i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Field</entry> + <entry>Default Value</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>title</entry> + <entry>T{</entry> + </row> + <row> + <entry>Icon name, if specified, otherwise the application's name</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wm_timeout</entry> + <entry>Five seconds, in units of milliseconds</entry> + </row> + <row> + <entry>wait_for_wm</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>transient</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>True</function></entry> + </row> + <row> + <entry>for</entry> + </row> + <row> + <entry>TransientShell,</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>otherwise</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>urgency</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>client_leader</entry> + <entry>NULL</entry> + </row> + <row> + <entry>window_role</entry> + <entry>NULL</entry> + </row> + <row> + <entry>min_width</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>min_height</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>max_width</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>max_height</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>width_inc</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>height_inc</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>min_aspect_x</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>min_aspect_y</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>max_aspect_x</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>max_aspect_y</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>input</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>False</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>initial_state</entry> + <entry>Normal</entry> + </row> + <row> + <entry>icon_pixmap</entry> + <entry>None</entry> + </row> + <row> + <entry>icon_window</entry> + <entry>None</entry> + </row> + <row> + <entry>icon_x</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>icon_y</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>icon_mask</entry> + <entry>None</entry> + </row> + <row> + <entry>window_group</entry> + <entry><function>XtUnspecifiedWindow</function></entry> + </row> + <row> + <entry>base_width</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>base_height</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>win_gravity</entry> + <entry><function>XtUnspecifiedShellInt</function></entry> + </row> + <row> + <entry>title_encoding</entry> + <entry>See text</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>title</emphasis> and +<emphasis remap='I'>title_encoding</emphasis> fields are stored in the +<function>\s-1WM_NAME\s+1</function> +property on the shell's window by the WMShell realize procedure. +If the <emphasis remap='I'>title_encoding</emphasis> field is +<function>None ,</function> +the <emphasis remap='I'>title</emphasis> string is assumed to be in the encoding of the current +locale and the encoding of the +<function>\s-1WM_NAME\s+1</function> +property is set to +<function>XStdICCTextStyle .</function> +If a language procedure has not been set +the default value of <emphasis remap='I'>title_encoding</emphasis> is +<function>\s-1XA_STRING\s+1</function>, otherwise the default value is +<function>None .</function> +The <emphasis remap='I'>wm_timeout</emphasis> field specifies, in milliseconds, +the amount of time a shell is to wait for +confirmation of a geometry request to the window manager. +If none comes back within that time, +the shell assumes the window manager is not functioning properly +and sets <emphasis remap='I'>wait_for_wm</emphasis> to +<function>False</function> +(later events may reset this value). +When <emphasis remap='I'>wait_for_wm</emphasis> is +<function>False ,</function> +the shell does not wait for a response, but relies on asynchronous +notification. +If <emphasis remap='I'>transient</emphasis> is +<function>True ,</function> +the +<function>\s-1WM_TRANSIENT_FOR\s+1</function> +property +will be stored on the shell window with a value as specified below. +The interpretation of this property is specific to the window manager +under which the application is run; see the <emphasis remap='I'>(xC</emphasis> for more details. +</para> +<para> +<!-- .LP --> +The realize and set_values procedures of WMShell store the +<function>\s-1WM_CLIENT_LEADER\s+1</function> +property on the shell window. +When <emphasis remap='I'>client_leader</emphasis> is not NULL and the client leader widget is +realized, the property will be created with the value of the window of the +client leader widget. +When <emphasis remap='I'>client_leader</emphasis> is NULL and the shell widget has a NULL parent, +the widget's window is used as the value of the +property. +When <emphasis remap='I'>client_leader</emphasis> is NULL and the shell widget has a non-NULL parent, +a search is made for the closest shell ancestor +with a non-NULL <emphasis remap='I'>client_leader</emphasis>, +and if none is found the shell ancestor with a NULL parent is the result. +If the resulting widget is realized, the property is created +with the value of the widget's window. +</para> +<para> +<!-- .LP --> +When the value of <emphasis remap='I'>window_role</emphasis> is not NULL, the +realize and set_values procedures store the +<function>\s-1WM_WINDOW_ROLE\s+1</function> +property on the shell's window with the value of the resource. +</para> +<para> +<!-- .LP --> +All other resources specify fields in the window manager hints +and the window manager size hints. +The realize and set_values procedures of +WMShell +set the corresponding flag bits in the +hints if any of the fields contain nondefault values. In addition, if +a flag bit is set that refers to a field with the value +<function>XtUnspecifiedShellInt ,</function> +the value of the field is modified as follows: +<!-- .br --> +<!-- .sp --> +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(3i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Field</entry> + <entry>Replacement</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>base_width, base_height</entry> + <entry>0</entry> + </row> + <row> + <entry>width_inc, height_inc</entry> + <entry>1</entry> + </row> + <row> + <entry>max_width, max_height</entry> + <entry>32767</entry> + </row> + <row> + <entry>min_width, min_height</entry> + <entry>1</entry> + </row> + <row> + <entry>min_aspect_x, min_aspect_y</entry> + <entry>-1</entry> + </row> + <row> + <entry>max_aspect_x, max_aspect_y</entry> + <entry>-1</entry> + </row> + <row> + <entry>icon_x, icon_y</entry> + <entry>-1</entry> + </row> + <row> + <entry>win_gravity</entry> + <entry>T{</entry> + </row> + <row> + <entry>Value returned by</entry> + </row> + <row> + <entry><function>XWMGeometry</function></entry> + </row> + <row> + <entry>if called,</entry> + </row> + <row> + <entry>else <function>NorthWestGravity</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +<!-- .IN "XWMGeometry" --> +</para> +<para> +<!-- .LP --> +If the shell widget has a non-NULL parent, then the +realize and set_values procedures replace the value +<function>XtUnspecifiedWindow</function> +<!-- .IN "XtUnspecifiedWindow" "" "@DEF@" --> +in the <emphasis remap='I'>window_group</emphasis> field with the window id of the root widget +of the widget tree if the +root widget is realized. The symbolic constant +<function>XtUnspecifiedWindowGroup</function> +<!-- .IN "XtUnspecifiedWindowGroup" "" "@DEF@" --> +may be used to indicate that the <emphasis remap='I'>window_group</emphasis> hint flag bit is not +to be set. If <emphasis remap='I'>transient</emphasis> is +<function>True ,</function> +the shell's class is not a subclass of +TransientShell, +and <emphasis remap='I'>window_group</emphasis> is not +<function>XtUnspecifiedWindowGroup ,</function> +the WMShell realize and set_values procedures then store the +<function>\s-1WM_TRANSIENT_FOR\s+1</function> +property with the value of <emphasis remap='I'>window_group</emphasis>. +</para> +<para> +<!-- .LP --> +<!-- .KS --> +Transient +shells have the following additional resource: +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +The realize and set_values procedures of +TransientShell +store the +<function>\s-1WM_TRANSIENT_FOR\s+1</function> +property on the shell window if <emphasis remap='I'>transient</emphasis> is +<function>True .</function> +If <emphasis remap='I'>transient_for</emphasis> is non-NULL and the widget specified by +<emphasis remap='I'>transient_for</emphasis> is realized, then its window is used as the value of the +<function>\s-1WM_TRANSIENT_FOR\s+1</function> +property; otherwise, the value of <emphasis remap='I'>window_group</emphasis> is used. +</para> +<para> +<!-- .LP --> +<function>TopLevel</function> +shells have the the following additional resources: +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>icon_name</emphasis> +and <emphasis remap='I'>icon_name_encoding</emphasis> fields are stored in the +<function>\s-1WM_ICON_NAME\s+1</function> +property on the shell's window by the TopLevelShell realize +procedure. +If the <emphasis remap='I'>icon_name_encoding</emphasis> field is +<function>None ,</function> +the <emphasis remap='I'>icon_name</emphasis> string is assumed to be in the encoding of the +current locale and the encoding of the +<function>\s-1WM_ICON_NAME\s+1</function> +property is set to +<function>XStdICCTextStyle .</function> +If a language procedure has not been set, +the default value of <emphasis remap='I'>icon_name_encoding</emphasis> is +<function>\s-1XA_STRING\s+1</function>, otherwise the default value is +<function>None .</function> +The <emphasis remap='I'>iconic</emphasis> field may be used by a client to request +that the window manager iconify or deiconify the shell; the +TopLevelShell +set_values procedure will send the appropriate +<function>\s-1WM_CHANGE_STATE\s+1</function> +message (as specified by the <emphasis remap='I'>(xC</emphasis>) +if this resource is changed from +<function>False</function> +to +<function>True</function> +and will call +<function>XtPopup</function> +specifying <emphasis remap='I'>grab_kind</emphasis> as +<function>XtGrabNone</function> +if <emphasis remap='I'>iconic</emphasis> is changed from +<function>True</function> +to +<function>False .</function> +The XtNiconic resource is also an alternative way to set +the XtNinitialState resource +to indicate that a shell should be initially displayed as an icon; the +TopLevelShell +initialize procedure will set <emphasis remap='I'>initial_state</emphasis> to +<function>IconicState</function> +if <emphasis remap='I'>iconic</emphasis> is +<function>True .</function> +</para> +<para> +<!-- .LP --> +Application +shells have the following additional resources: +<!-- .br --> +<!-- .ne 4 --> +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>argc</emphasis> and <emphasis remap='I'>argv</emphasis> fields are used to initialize +the standard property +<function>\s-1WM_COMMAND\s+1 .</function> +See the <emphasis remap='I'>(xC</emphasis> for more information. +</para> +<para> +<!-- .LP --> +The default values for the SessionShell instance fields, +which are filled in from the resource lists and by the +initialize procedure, are +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>connection</emphasis> field contains the session connection object or NULL +if a session connection is not being managed by this widget. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>session_id</emphasis> is an identification assigned to the session +participant by the session manager. +The <emphasis remap='I'>session_id</emphasis> will be passed to the session +manager as the client identifier of the previous session. +When a connection is established with the session manager, +the client id assigned by the session manager is stored +in the <emphasis remap='I'>session_id</emphasis> field. +When not NULL, the <emphasis remap='I'>session_id</emphasis> of the Session shell widget that +is at the root of the widget tree of the client leader widget will be +used to create the +<function>\s-1SM_CLIENT_ID\s+1</function> +property on the client leader's window. +</para> +<para> +<!-- .LP --> +If <emphasis remap='I'>join_session</emphasis> is +<function>False ,</function> +the widget will not attempt to establish a +connection to the session manager at shell creation time. +See Sections 4.2.1 and 4.2.4 +for more information on the functionality of this resource. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>restart_command</emphasis>, <emphasis remap='I'>clone_command</emphasis>, <emphasis remap='I'>discard_command</emphasis>, +<emphasis remap='I'>resign_command</emphasis>, <emphasis remap='I'>shutdown_command</emphasis>, <emphasis remap='I'>environment</emphasis>, +<emphasis remap='I'>current_dir</emphasis>, <emphasis remap='I'>program_path</emphasis>, and +<emphasis remap='I'>restart_style</emphasis> fields contain standard session properties. +</para> +<para> +<!-- .LP --> +When a session connection is established or newly managed by the shell, +the shell initialize and set_values methods check the values of the +<emphasis remap='I'>restart_command</emphasis>, <emphasis remap='I'>clone_command</emphasis>, and <emphasis remap='I'>program_path</emphasis> +resources. At that time, if <emphasis remap='I'>restart_command</emphasis> is NULL, the value +of the <emphasis remap='I'>argv</emphasis> resource will be copied to <emphasis remap='I'>restart_command</emphasis>. +Whether or not <emphasis remap='I'>restart_command</emphasis> was NULL, +if "\fR-xtsessionID\fP" "\fR<session id>" does not +already appear in the <emphasis remap='I'>restart_command</emphasis>, it will be added by the +initialize and set_values methods at the beginning of the command arguments; +if the "\fR-xtsessionID\fP" argument already appears with an incorrect +\fRsession id\fP in the following argument, that argument +will be replaced with the current \fRsession id\fP. +</para> +<para> +<!-- .LP --> +After this, the shell initialize and set_values procedures check the +<emphasis remap='I'>clone_command</emphasis>. If <emphasis remap='I'>clone_command</emphasis> is NULL, +<emphasis remap='I'>restart_command</emphasis> will be copied to <emphasis remap='I'>clone_command</emphasis>, +except the "\fR-xtsessionID\fP" and following argument will not be copied. +</para> +<para> +<!-- .LP --> +Finally, the shell initialize and set_values procedures check the +<emphasis remap='I'>program_path</emphasis>. If <emphasis remap='I'>program_path</emphasis> is NULL, the +first element of <emphasis remap='I'>restart_command</emphasis> is copied to <emphasis remap='I'>program_path</emphasis>. +</para> +<para> +<!-- .LP --> +The possible values of <emphasis remap='I'>restart_style</emphasis> are +<function>SmRestartIfRunning ,</function> +<function>SmRestartAnyway ,</function> +<function>SmRestartImmediately ,</function> +and +<function>SmRestartNever .</function> +A resource converter is registered for this resource; +for the strings that it recognizes, +see Section 9.6.1. +</para> +<para> +<!-- .LP --> +The resource type EnvironmentArray is a NULL-terminated array of +pointers to strings; +each string has the format "name=value". +The `=' character may not appear in the name, +and the string is terminated by a null character. + +</para> +</sect3> +</sect2> +<sect2 id="Session_Participation"> +<title>Session Participation</title> +<!-- .XS --> +<!-- <function>(SN Session Participation</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Applications can participate in a user's session, exchanging messages +with the session manager as described in the \fIX Session Management +Protocol\fP and the <emphasis remap='I'>X Session Management Library</emphasis>. +</para> +<para> +<!-- .LP --> +When a widget of +<function>sessionShellWidgetClass</function> +or a subclass is created, the widget provides support for the application +as a session participant and continues to provide support until the +widget is destroyed. + +</para> +<sect3 id="Joining_a_Session"> +<title>Joining a Session</title> +<!-- .XS --> +<!-- <function>(SN Joining a Session</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When a Session shell is created, +if <emphasis remap='I'>connection</emphasis> is NULL, +and if <emphasis remap='I'>join_session</emphasis> is +<function>True ,</function> +and if <emphasis remap='I'>argv</emphasis> or <emphasis remap='I'>restart_command</emphasis> is not NULL, +and if in POSIX environments the +<function>\s-1SESSION_MANAGER\s+1</function> +environment variable is defined, +the shell will attempt to establish a new connection with the session manager. +</para> +<para> +<!-- .LP --> +To transfer management of an existing session connection from an +application to the shell at widget creation time, pass the existing +session connection ID as the <emphasis remap='I'>connection</emphasis> resource value +when creating the Session shell, +and if the other creation-time conditions on session participation are met, +the widget will maintain the connection with the session manager. +The application must ensure that only one +Session shell manages the connection. +</para> +<para> +<!-- .LP --> +In the Session shell set_values procedure, +if <emphasis remap='I'>join_session</emphasis> changes from +<function>False</function> +to +<function>True</function> +and <emphasis remap='I'>connection</emphasis> is NULL and when in POSIX environments the +<function>\s-1SESSION_MANAGER\s+1</function> +environment variable is defined, +the shell will attempt to open a connection to the session manager. +If <emphasis remap='I'>connection</emphasis> changes from NULL to non-NULL, the +Session shell +will take over management of that session connection and will set +<emphasis remap='I'>join_session</emphasis> to +<function>True .</function> +If <emphasis remap='I'>join_session</emphasis> changes from +<function>False</function> +to +<function>True</function> +and <emphasis remap='I'>connection</emphasis> is not NULL, the +Session shell will take over management of the session connection. +</para> +<para> +<!-- .LP --> +When a successful connection has been established, <emphasis remap='I'>connection</emphasis> +contains the session connection ID for the session participant. +When the shell begins to manage the connection, it will call +<function>XtAppAddInput</function> +to register the handler which watches for protocol messages +from the session manager. +When the attempt to connect fails, a warning message is issued +and <emphasis remap='I'>connection</emphasis> is set to NULL. +</para> +<para> +<!-- .LP --> +While the connection is being managed, if a +<function>SaveYourself ,</function> +<function>SaveYourselfPhase2 ,</function> +<function>Interact ,</function> +<function>ShutdownCancelled ,</function> +<function>SaveComplete ,</function> +or +<function>Die</function> +message is received from the session manager, the Session shell will +call out to application callback procedures registered +on the respective callback list of the Session shell and will +send +<function>SaveYourselfPhase2Request ,</function> +<function>InteractRequest ,</function> +<function>InteractDone ,</function> +<function>SaveYourselfDone ,</function> +and +<function>ConnectionClosed</function> +messages as appropriate. +Initially, all of the client's session properties are undefined. +When any of the session property resource values are defined or change, +the Session shell initialize and set_values procedures +will update the client's session property value by a +<function>SetProperties</function> +or a +<function>DeleteProperties</function> +message, as appropriate. +The session ProcessID and UserID properties are always set by the shell +when it is possible to determine the value of these properties. + +</para> +</sect3> +<sect3 id="Saving_Application_State"> +<title>Saving Application State</title> +<!-- .XS --> +<!-- <function>(SN Saving Application State</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The session manager instigates an application checkpoint by sending a +<function>SaveYourself</function> +request. +Applications are responsible for saving their state in response to the +request. +</para> +<para> +<!-- .LP --> +When the +<function>SaveYourself</function> +request arrives, the procedures registered on the +Session shell's save callback list are called. +If the application does not register any save callback procedures on +the save callback list, the shell will report to the session manager +that the application failed to save its state. +Each procedure on the save callback list receives a token +in the <emphasis remap='I'>call_data</emphasis> parameter. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +The checkpoint token in the <emphasis remap='I'>call_data</emphasis> parameter is of type +<function>XtCheckpointToken .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCheckpointToken" "" "@DEF@" --> +<!-- .IN "XtCheckpointTokenRec" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i 4i --> +<!-- .ta .5i 2i 4i --> +typedef struct { + int save_type; + int interact_style; + Boolean shutdown; + Boolean fast; + Boolean cancel_shutdown + int phase; + int interact_dialog_type; /* return */ + Boolean request_cancel; /* return */ + Boolean request_next_phase; /* return */ + Boolean save_success; /* return */ +} XtCheckpointTokenRec, *XtCheckpointToken; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> +The <emphasis remap='I'>save_type</emphasis>, <emphasis remap='I'>interact_style</emphasis>, <emphasis remap='I'>shutdown</emphasis>, and <emphasis remap='I'>fast</emphasis> +fields of the token contain the parameters of the +<function>SaveYourself</function> +message. +The possible values of <emphasis remap='I'>save_type</emphasis> are +<function>SmSaveLocal ,</function> +<function>SmSaveGlobal ,</function> +and +<function>SmSaveBoth ;</function> +these indicate the type of information to be saved. +The possible values of <emphasis remap='I'>interact_style</emphasis> are +<function>SmInteractStyleNone ,</function> +<function>SmInteractStyleErrors ,</function> +and +<function>SmInteractStyleAny ;</function> +these indicate whether user interaction would be permitted +and, if so, what kind of interaction. +If <emphasis remap='I'>shutdown</emphasis> is +<function>True ,</function> +the checkpoint is being performed in preparation for the end of the session. +If <emphasis remap='I'>fast</emphasis> is +<function>True ,</function> +the client should perform the checkpoint as quickly as possible. +If <emphasis remap='I'>cancel_shutdown</emphasis> is +<function>True ,</function> +a +<function>ShutdownCancelled</function> +message has been received for the current save operation. (See Section 4.4.4.) +The <emphasis remap='I'>phase</emphasis> is used by manager clients, such as a window manager, +to distinguish between the first and second phase of a save operation. +The <emphasis remap='I'>phase</emphasis> will be either 1 or 2. +The remaining fields in the checkpoint token structure are provided for +the application to communicate with the shell. +</para> +<para> +<!-- .LP --> +Upon entry to the first application save callback procedure, the return +fields in the token have the following initial values: +<emphasis remap='I'>interact_dialog_type</emphasis> is +<function>SmDialogNormal ;</function> +<emphasis remap='I'>request_cancel</emphasis> is +<function>False ;</function> +<emphasis remap='I'>request_next_phase</emphasis> is +<function>False ;</function> +and <emphasis remap='I'>save_success</emphasis> is +<function>True .</function> +When a token is returned with any of the four return fields containing +a noninitial value, and when the field is applicable, subsequent tokens +passed to the application during the current save operation +will always contain the noninitial value. +</para> +<para> +<!-- .LP --> +The purpose of the token's <emphasis remap='I'>save_success</emphasis> field is to +indicate the outcome of the entire operation to the +session manager and ultimately, to the user. +Returning +<function>False</function> +indicates some portion of the application state +could not be successfully saved. If any token is returned +to the shell with <emphasis remap='I'>save_success</emphasis> +<function>False ,</function> +tokens subsequently received +by the application for the current save operation will show +<emphasis remap='I'>save_success</emphasis> as +<function>False .</function> +When the shell sends the final status of the checkpoint to the +session manager, it will indicate failure to save application state +if any token was returned with <emphasis remap='I'>save_success</emphasis> +<function>False .</function> +</para> +<para> +<!-- .LP --> +Session participants that manage and save the state of other clients +should structure their save or interact callbacks to +set <emphasis remap='I'>request_next_phase</emphasis> to +<function>True</function> +when phase is 1, which will cause the shell to send the +<function>SaveYourselfPhase2Request</function> +when the first phase is complete. When the +<function>SaveYourselfPhase2</function> +message is received, the shell will invoke the save callbacks a +second time with <emphasis remap='I'>phase</emphasis> equal to 2. +Manager clients should save the state of other clients +when the callbacks are invoked the second time and <emphasis remap='I'>phase</emphasis> equal to 2. +</para> +<para> +<!-- .LP --> +The application may request additional tokens while a checkpoint is under way, +and these additional tokens must be returned by an explicit call. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +To request an additional token for a save callback response that has a +deferred outcome, use +<function>XtSessionGetToken .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSessionGetToken" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtCheckpointToken XtSessionGetToken(<emphasis remap='I'>widget</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the Session shell widget which manages session participation. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSessionGetToken</function> +function will return NULL if no checkpoint operation is currently under way. +<!-- .KE --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +To indicate the completion of checkpoint processing including user +interaction, the application must signal the Session shell +by returning all tokens. +(See Sections 4.2.2.2 and 4.2.2.4). +To return a token, use +<function> XtSessionReturnToken .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSessionReturnToken" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSessionReturnToken(<emphasis remap='I'>token</emphasis>) +<!-- .br --> + XtCheckpointToken <emphasis remap='I'>token</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>token</emphasis> + </term> + <listitem> + <para> +Specifies a token that was received as the <emphasis remap='I'>call_data</emphasis> by a procedure +on the interact callback list or a token that was received by a call to +<function>XtSessionGetToken .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +Tokens passed as <emphasis remap='I'>call_data</emphasis> to save callbacks are implicitly +returned when the save callback procedure returns. +A save callback procedure should not call +<function>XtSessionReturnToken</function> +on the token passed in its <emphasis remap='I'>call_data</emphasis>. + +</para> +<sect4 id="Requesting_Interaction"> +<title>Requesting Interaction</title> +<!-- .XS --> +<!-- <function>(SN Requesting Interaction</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When the token <emphasis remap='I'>interact_style</emphasis> allows user interaction, +the application may +interact with the user during the checkpoint, but must wait for permission +to interact. +Applications request permission to interact with the user during the +checkpointing operation by registering a procedure on the Session +shell's interact callback list. When all save callback procedures have +returned, and each time a token that was granted by a call to +<function>XtSessionGetToken</function> +is returned, the Session shell examines the interact callback list. +If interaction is permitted and the interact callback list is not empty, +the shell will send an +<function>InteractRequest</function> +to the session manager when an interact request is not already outstanding +for the application. +</para> +<para> +<!-- .LP --> +The type of interaction dialog that will be requested is specified by +the <emphasis remap='I'>interact_dialog_type</emphasis> field in the checkpoint token. +The possible values for <emphasis remap='I'>interact_dialog_type</emphasis> are +<function>SmDialogError</function> +and +<function>SmDialogNormal .</function> +If a token is returned with <emphasis remap='I'>interact_dialog_type</emphasis> containing +<function>SmDialogError ,</function> +the interact request and any subsequent interact requests will be for +an error dialog; otherwise, the request will be for a normal dialog with +the user. +</para> +<para> +<!-- .LP --> +When a token is returned with <emphasis remap='I'>save_success</emphasis> +<function>False</function> +or <emphasis remap='I'>interact_dialog_type</emphasis> +<function>SmDialogError ,</function> +tokens subsequently passed to callbacks during the same active +<function>SaveYourself</function> +response will reflect these changed values, indicating that +an error condition has occurred during the checkpoint. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>request_cancel</emphasis> field is a return value for interact callbacks only. +Upon return from a procedure on the save callback list, the value +of the token's <emphasis remap='I'>request_cancel</emphasis> field is not examined by the shell. +This is also true of tokens received through a call to +<function>XtSessionGetToken .</function> + +</para> +</sect4> +<sect4 id="Interacting_with_the_User_during_a_Checkpoint"> +<title>Interacting with the User during a Checkpoint</title> +<!-- .XS --> +<!-- <function>(SN Interacting with the User during a Checkpoint</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When the session manager grants the application's request for user interaction, +the Session shell receives an +<function>Interact</function> +message. +The procedures registered on the interact callback list are executed, +but not as if executing a typical callback list. +These procedures are individually executed in +sequence, with a checkpoint token functioning as the sequencing mechanism. +Each step in the sequence begins by removing a procedure +from the interact callback list +and executing it with a token passed in the <emphasis remap='I'>call_data</emphasis>. +The interact callback will typically pop up a dialog box and return. +When the user interaction and associated application checkpointing has +completed, the application must return the token by calling +<function>XtSessionReturnToken .</function> +Returning the token completes the current step and triggers the next step +in the sequence. +</para> +<para> +<!-- .LP --> +During interaction the client may request cancellation of a shutdown. +When a token passed as <emphasis remap='I'>call_data</emphasis> to an interact procedure is returned, +if <emphasis remap='I'>shutdown</emphasis> is +<function>True</function> +and <emphasis remap='I'>cancel_shutdown</emphasis> is +<function>False ,</function> +<emphasis remap='I'>request_cancel</emphasis> indicates whether the +application requests that the pending shutdown be cancelled. +If <emphasis remap='I'>request_cancel</emphasis> is +<function>True ,</function> +the field will also be +<function>True</function> +in any tokens subsequently granted during the checkpoint operation. +When a token is returned requesting cancellation of +the session shutdown, pending interact procedures will still be +called by the Session shell. +When all interact procedures have been removed from the interact callback +list, executed, and the final interact token returned to the shell, an +<function>InteractDone</function> +message is sent to the session manager, indicating whether +a pending session shutdown is requested to be cancelled. + +</para> +</sect4> +<sect4 id="Responding_to_a_Shutdown_Cancellation"> +<title>Responding to a Shutdown Cancellation</title> +<!-- .XS --> +<!-- <function>(SN Responding to a Shutdown Cancellation</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Callbacks registered on the cancel callback list are invoked when the +Session shell processes a +<function>ShutdownCancelled</function> +message from the session manager. This may occur during the +processing of save callbacks, while waiting for interact permission, +during user interaction, or after the save operation is complete and +the application is expecting a +<function>SaveComplete</function> +or a +<function>Die</function> +message. +The <emphasis remap='I'>call_data</emphasis> for these callbacks is NULL. +</para> +<para> +<!-- .LP --> +When the shell notices that a pending shutdown has been cancelled, +the token <emphasis remap='I'>cancel_shutdown</emphasis> field will be +<function>True</function> +in tokens subsequently given to the application. +</para> +<para> +<!-- .LP --> +Receiving notice of a shutdown cancellation does not cancel the +pending execution of save callbacks or interact callbacks. +After the cancel callbacks execute, if <emphasis remap='I'>interact_style</emphasis> is not +<function>SmInteractStyleNone</function> +and the interact list is not empty, +the procedures on the interact callback list will be executed +and passed a token with <emphasis remap='I'>interact_style</emphasis> +<function>SmInteractStyleNone .</function> +The application should not interact with the user, and the Session shell +will not send an +<function>InteractDone</function> +message. + +</para> +</sect4> +<sect4 id="Completing_a_Save"> +<title>Completing a Save</title> +<!-- .XS --> +<!-- <function>(SN Completing a Save</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When there is no user interaction, the shell regards the application +as having finished saving state when all callback procedures +on the save callback list have returned, and any additional tokens +passed out by +<function>XtSessionGetToken</function> +have been returned by corresponding calls to +<function>XtSessionReturnToken .</function> +If the save operation involved user interaction, +the above completion conditions apply, and in addition, all requests for +interaction have been granted or cancelled, +and all tokens passed to interact callbacks have been returned +through calls to +<function>XtSessionReturnToken .</function> +If the save operation involved a manager client that requested the +second phase, the above conditions apply to both the first and second +phase of the save operation. +<!-- .br --> +</para> +<para> +<!-- .LP --> +When the application has finished saving state, +the Session shell will report the result to the session manager by +sending the +<function>SaveYourselfDone</function> +message. +If the session is continuing, the shell will receive the +<function>SaveComplete</function> +message when all applications have completed saving state. +This message indicates that applications may again allow changes +to their state. The shell will execute the save_complete callbacks. +The <emphasis remap='I'>call_data</emphasis> for these callbacks is NULL. + +</para> +</sect4> +</sect3> +<sect3 id="Responding_to_a_Shutdown"> +<title>Responding to a Shutdown</title> +<!-- .XS --> +<!-- <function>(SN Responding to a Shutdown</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Callbacks registered on the die callback list are invoked when the +session manager sends a +<function>Die</function> +message. +The callbacks on this list should do whatever is appropriate to quit +the application. +Before executing procedures on the die callback list, +the Session shell will close the connection to the session manager +and will remove the handler that watches for protocol messages. +The <emphasis remap='I'>call_data</emphasis> for these callbacks is NULL. + +</para> +</sect3> +<sect3 id="Resigning_from_a_Session"> +<title>Resigning from a Session</title> +<!-- .XS --> +<!-- <function>(SN Resigning from a Session</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When the Session shell widget is destroyed, the destroy method will +close the connection to the session manager by sending a +<function>ConnectionClosed</function> +protocol message and will remove the input callback +that was watching for session protocol messages. +</para> +<para> +<!-- .LP --> +When +<function>XtSetValues</function> +is used to set <emphasis remap='I'>join_session</emphasis> to +<function>False ,</function> +the set_values method of the Session shell will close the +connection to the session manager if one exists by sending a +<function>ConnectionClosed</function> +message, and <emphasis remap='I'>connection</emphasis> will be set to NULL. +</para> +<para> +<!-- .LP --> +Applications that exit in response to user actions and that do not +wait for phase 2 destroy to complete on +the Session shell should set <emphasis remap='I'>join_session</emphasis> to +<function>False</function> +before exiting. +</para> +<para> +<!-- .LP --> +When +<function>XtSetValues</function> +is used to set <emphasis remap='I'>connection</emphasis> to NULL, +the Session shell will stop managing the connection, if one exists. +However, that session connection will not be closed. +</para> +<para> +<!-- .LP --> +Applications that wish to ensure continuation of a session connection +beyond the destruction of the shell should first retrieve the +<emphasis remap='I'>connection</emphasis> resource value, +then set the <emphasis remap='I'>connection</emphasis> resource to NULL, +and then they may safely destroy the widget without losing control +of the session connection. +</para> +<para> +<!-- .LP --> +The error callback list will be called if an unrecoverable +communications error occurs while the shell is managing the connection. +The shell will close the connection, set <emphasis remap='I'>connection</emphasis> to NULL, +remove the input callback, and +call the procedures registered on the error callback list. +The <emphasis remap='I'>call_data</emphasis> for these callbacks is NULL. +<!-- .bp --> + + + + + + + + + + + + + + + + +</para> +</sect3> +</sect2> +</chapter> +</book> diff --git a/specs/CH05.xml b/specs/CH05.xml new file mode 100644 index 0000000..fa922c3 --- /dev/null +++ b/specs/CH05.xml @@ -0,0 +1,1261 @@ +<!-- .\" $Xorg: CH05,v 1.3 2000/08/17 19:42:44 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 5</function>\s-1 + +\s+1<function>Pop-Up Widgets</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 5 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 5 \(em Pop-Up Widgets --> +<!-- .XE --> +Pop-up widgets are used to create windows outside of the +window hierarchy defined by the widget tree. +Each pop-up child has a window that is a descendant of the root window, +so that the pop-up window is not clipped by the pop-up widget's parent window. +<!-- .\"One thing that all pop-ups in common is that they break --> +<!-- .\"the widget/window hierarchy. --> +<!-- .\"Pop-ups windows are not geometry constrained by their parent widget. --> +<!-- .\"Instead, they are window children of the root. --> +Therefore, pop-ups are created and attached differently to their widget parent +than normal widget children. +</para> +<para> +<!-- .LP --> +A parent of a pop-up widget does not actively manage its pop-up children; +in fact, it usually does not operate upon them in any way. +The <emphasis remap='I'>popup_list</emphasis> field in the +<function>CorePart</function> +structure contains the list of its pop-up children. +This pop-up list exists mainly to provide the proper place in the widget +hierarchy for the pop-up to get resources and to provide a place for +<function>XtDestroyWidget</function> +to look for all extant children. +</para> +<para> +<!-- .LP --> +A +composite +widget can have both normal and pop-up children. +A pop-up can be popped up from almost anywhere, not just by its parent. +The term <emphasis remap='I'>child</emphasis> always refers to a normal, geometry-managed widget +on the composite widget's list of children, and the term +<emphasis remap='I'>pop-up child</emphasis> always refers to a +widget on the pop-up list. +<!-- .IN "pop-up" "" "@DEF@" --> +<!-- .IN "pop-up" "list" --> +<!-- .IN "pop-up" "child" --> + +</para> +<sect2 id="Pop_Up_Widget_Types"> +<title>Pop-Up Widget Types</title> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>(SN Pop-Up Widget Types</function> --> +<!-- .XE --> +There are three kinds of pop-up widgets: +</para> +<itemizedlist> + <listitem> + <para> +Modeless pop-ups + </para> + </listitem> + <listitem> + <para> +A modeless pop-up (for example, a dialog box that does not prevent +continued interaction with the rest of the application) +can usually be manipulated by the window manager +and looks like any other application window from the +user's point of view. +The application main window itself is a special case of a modeless pop-up. + </para> + </listitem> + <listitem> + <para> +Modal pop-ups + </para> + </listitem> + <listitem> + <para> +A modal pop-up (for example, a dialog box that requires user input to +continue) +can sometimes be manipulated by the window manager, +and except for events that occur in the dialog box, +it disables user-event distribution to the rest of the application. + </para> + </listitem> + <listitem> + <para> +Spring-loaded pop-ups + </para> + </listitem> + <listitem> + <para> +A spring-loaded pop-up (for example, a menu) +can seldom be manipulated by the window manager, +and except for events that occur in the pop-up or its descendants, +it disables user-event distribution to all other applications. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Modal pop-ups and spring-loaded pop-ups are very similar and should be coded as +if they were the same. +In fact, the same widget (for example, a ButtonBox or Menu widget) can be used both +as a modal pop-up and as a spring-loaded pop-up within the same application. +The main difference is that spring-loaded pop-ups are brought up +with the pointer and, because of the grab that the pointer button causes, +require different processing by the (xI. +Furthermore, all user input remap events occurring outside the spring-loaded +pop-up (e.g., in a descendant) are also delivered to the spring-loaded +pop-up after they have been dispatched to the appropriate descendant, so +that, for example, button-up can take down a spring-loaded pop-up no +matter where the +button-up occurs. +</para> +<para> +<!-- .LP --> +Any kind of pop-up, in turn, can pop up other widgets. +Modal and spring-loaded pop-ups can constrain user events to +the most recent such pop-up or allow user events to be dispatched +to any of the modal or spring-loaded pop-ups +currently mapped. +</para> +<para> +<!-- .LP --> +Regardless of their type, +all pop-up widget classes are responsible for communicating with the +X window manager and therefore are subclasses of +one of the +Shell +widget classes. + +</para> +</sect2> +<sect2 id="Creating_a_Pop_Up_Shell"> +<title>Creating a Pop-Up Shell</title> +<!-- .XS --> +<!-- <function>(SN Creating a Pop-Up Shell</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "pop-up" "shell" --> +<!-- .IN "pop-up" "child" --> +For a widget to be popped up, +it must be the child of a pop-up shell widget. +None of the (xI-supplied shells will +simultaneously manage more than one child. +Both the shell and child taken together are referred to as the pop-up. +When you need to use a pop-up, +you always refer to the pop-up by the pop-up shell, +not the child. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To create a pop-up shell, use +<function>XtCreatePopupShell .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreatePopupShell" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtCreatePopupShell(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>parent</emphasis>, \ +<emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>parent</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the instance name for the created shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>parent</emphasis> + </term> + <listitem> + <para> +Specifies the parent widget. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCreatePopupShell</function> +function ensures that the specified class is a subclass of +Shell +and, rather than using insert_child to attach the widget to the parent's +<!-- .IN "insert_child procedure" --> +<emphasis remap='I'>children</emphasis> list, +attaches the shell to the parent's <emphasis remap='I'>popup_list</emphasis> directly. +</para> +<para> +<!-- .LP --> +The screen resource for this widget is determined by first scanning +<emphasis remap='I'>args</emphasis> for the XtNscreen argument. If no XtNscreen argument is +found, the resource database associated with the parent's screen +is queried for the resource <emphasis remap='I'>name</emphasis>.screen, class +<emphasis remap='I'>Class</emphasis>.Screen where <emphasis remap='I'>Class</emphasis> is the <emphasis remap='I'>class_name</emphasis> +field from the +<function>CoreClassPart</function> +of the specified <emphasis remap='I'>widget_class</emphasis>. +If this query fails, the parent's screen is used. +Once the screen is determined, +the resource database associated with that screen is used to retrieve +all remaining resources for the widget not specified in +<emphasis remap='I'>args</emphasis>. + +</para> +<para> +<!-- .LP --> +A spring-loaded pop-up invoked from a translation table via +<function>XtMenuPopup</function> +must already exist +at the time that the translation is invoked, +so the translation manager can find the shell by name. +Pop-ups invoked in other ways can be created when +the pop-up actually is needed. +This delayed creation of the shell is particularly useful when you pop up +an unspecified number of pop-ups. +You can look to see if an appropriate unused shell (that is, not +currently popped up) exists and create a new shell if needed. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To create a pop-up shell using varargs lists, use +<function>XtVaCreatePopupShell .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaCreatePopupShell" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtVaCreatePopupShell(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>parent</emphasis>, ...) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>parent</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the instance name for the created shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>parent</emphasis> + </term> + <listitem> + <para> +Specifies the parent widget. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaCreatePopupShell</function> +is identical in function to +<function>XtCreatePopupShell</function> +with <emphasis remap='I'>the</emphasis> args and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list as +described in Section 2.5.1. + +</para> +</sect2> +<sect2 id="Creating_Pop_Up_Children"> +<title>Creating Pop-Up Children</title> +<!-- .XS --> +<!-- <function>(SN Creating Pop-Up Children</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Once a pop-up shell is created, +the single child of the pop-up shell can be created +either statically or dynamically. +</para> +<para> +<!-- .LP --> +At startup, +an application can create the child of the pop-up shell, +which is appropriate for pop-up children composed of a fixed set +of widgets. +The application can change the state of the subparts of +the pop-up child as the application state changes. +For example, if an application creates a static menu, +it can call +<function>XtSetSensitive</function> +(or, in general, +<function>XtSetValues )</function> +on any of the buttons that make up the menu. +Creating the pop-up child early means that pop-up time is minimized, +especially if the application calls +<function>XtRealizeWidget</function> +on the pop-up shell at startup. +When the menu is needed, +all the widgets that make up the menu already exist and need only be mapped. +The menu should pop up as quickly as the X server can respond. +</para> +<para> +<!-- .LP --> +Alternatively, +an application can postpone the creation of the child until it is needed, +which minimizes application startup time and allows the pop-up child to +reconfigure itself each time it is popped up. +In this case, +the pop-up child creation routine might poll the application +to find out if it should change the sensitivity of any of its subparts. +</para> +<para> +<!-- .LP --> +Pop-up child creation does not map the pop-up, +even if you create the child and call +<function>XtRealizeWidget</function> +on the pop-up shell. +</para> +<para> +<!-- .LP --> +All shells have pop-up and pop-down callbacks, +which provide the opportunity either to make last-minute changes to a +pop-up child before it is popped up or to change it after it is popped down. +Note that excessive use of pop-up callbacks can make +popping up occur more slowly. + +</para> +</sect2> +<sect2 id="Mapping_a_Pop_Up_Widget"> +<title>Mapping a Pop-Up Widget</title> +<!-- .XS --> +<!-- <function>(SN Mapping a Pop-Up Widget</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Pop-ups can be popped up through several mechanisms: +</para> +<itemizedlist> + <listitem> + <para> +A call to +<function>XtPopup</function> +or +<function>XtPopupSpringLoaded .</function> + </para> + </listitem> + <listitem> + <para> +One of the supplied callback procedures +<function>XtCallbackNone ,</function> +<function>XtCallbackNonexclusive ,</function> +or +<function>XtCallbackExclusive .</function> + </para> + </listitem> + <listitem> + <para> +The standard translation action +<function>XtMenuPopup .</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Some of these routines take an argument of type +<function>XtGrabKind ,</function> +which is defined as +<!-- .sp --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef enum {XtGrabNone, XtGrabNonexclusive, XtGrabExclusive} XtGrabKind; +</literallayout> +<!-- .sp --> +<!-- .eM --> +</para> +<para> +<!-- .LP --> +The create_popup_child_proc procedure pointer +in the shell widget instance record is of type +<function>XtCreatePopupChildProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "create_popup_child_proc" --> +<!-- .IN "Shell" "create_popup_child_proc" --> +<!-- .IN "XtCreatePopupChildProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtCreatePopupChildProc)(Widget); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the shell widget being popped up. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +To map a pop-up from within an application, use +<function>XtPopup .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtPopup" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtPopup(<emphasis remap='I'>popup_shell</emphasis>, <emphasis remap='I'>grab_kind</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>popup_shell</emphasis>; +<!-- .br --> + XtGrabKind <emphasis remap='I'>grab_kind</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>popup_shell</emphasis> + </term> + <listitem> + <para> +Specifies the shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>grab_kind</emphasis> + </term> + <listitem> + <para> +Specifies the way in which user events should be constrained. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtPopup</function> +function performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Calls +<function>XtCheckSubclass</function> +to ensure <emphasis remap='I'>popup_shell</emphasis>'s class is a subclass of +<function>shellWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +Raises the window and returns if the shell's <emphasis remap='I'>popped_up</emphasis> field is already +<function>True .</function> + </para> + </listitem> + <listitem> + <para> +Calls the callback procedures on the shell's <emphasis remap='I'>popup_callback</emphasis> list, +specifying a pointer to the value of <emphasis remap='I'>grab_kind</emphasis> as the <emphasis remap='I'>call_data</emphasis> +argument. + </para> + </listitem> + <listitem> + <para> +Sets the shell <emphasis remap='I'>popped_up</emphasis> field to +<function>True ,</function> +the shell <emphasis remap='I'>spring_loaded</emphasis> field to +<function>False ,</function> +and the shell <emphasis remap='I'>grab_kind</emphasis> field from <emphasis remap='I'>grab_kind</emphasis>. + </para> + </listitem> + <listitem> + <para> +If the shell's <emphasis remap='I'>create_popup_child_proc</emphasis> field is non-NULL, +<function>XtPopup</function> +calls it with <emphasis remap='I'>popup_shell</emphasis> as the parameter. + </para> + </listitem> + <listitem> + <para> +If <emphasis remap='I'>grab_kind</emphasis> is either +<function>XtGrabNonexclusive</function> +or +<function>XtGrabExclusive ,</function> +it calls + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +XtAddGrab(<emphasis remap='I'>popup_shell</emphasis>, (<emphasis remap='I'>grab_kind</emphasis> == XtGrabExclusive), False) +</literallayout> +</para> +<itemizedlist> + <listitem> + <para> +Calls +<function>XtRealizeWidget</function> +with <emphasis remap='I'>popup_shell</emphasis> specified. + </para> + </listitem> + <listitem> + <para> +Calls +<function>XMapRaised</function> +with the window of <emphasis remap='I'>popup_shell</emphasis>. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To map a spring-loaded pop-up from within an application, use +<function>XtPopupSpringLoaded .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtPopupSpringLoaded" "" @DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtPopupSpringLoaded(<emphasis remap='I'>popup_shell</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>popup_shell</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>popup_shell</emphasis> + </term> + <listitem> + <para> +Specifies the shell widget to be popped up. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtPopupSpringLoaded</function> +function performs exactly as +<function>XtPopup</function> +except that it sets the shell <emphasis remap='I'>spring_loaded</emphasis> field to +<function>True</function> +and always calls +<function>XtAddGrab</function> +with <emphasis remap='I'>exclusive</emphasis> +<function>True</function> +and <emphasis remap='I'>spring-loaded</emphasis> +<function>True .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To map a pop-up from a given widget's callback list, +you also can register one of the +<function>XtCallbackNone ,</function> +<function>XtCallbackNonexclusive ,</function> +or +<function>XtCallbackExclusive</function> +convenience routines as callbacks, using the pop-up shell widget as the +client data. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackNone" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallbackNone(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the pop-up shell. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies the callback data argument, +which is not used by this procedure. +<!-- .sp --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackNonexclusive" "" "@DEF@" --> +</para> +<!-- .FD 0 --> +void XtCallbackNonexclusive(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the pop-up shell. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies the callback data argument, +which is not used by this procedure. +<!-- .sp --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackExclusive" "" "@DEF@" --> +</para> +<!-- .FD 0 --> +void XtCallbackExclusive(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the pop-up shell. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies the callback data argument, +which is not used by this procedure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCallbackNone ,</function> +<function>XtCallbackNonexclusive ,</function> +and +<function>XtCallbackExclusive</function> +functions call +<function>XtPopup</function> +with the shell specified by the <emphasis remap='I'>client_data</emphasis> argument +and <emphasis remap='I'>grab_kind</emphasis> set as the name specifies. +<function>XtCallbackNone ,</function> +<function>XtCallbackNonexclusive ,</function> +and +<function>XtCallbackExclusive</function> +specify +<function>XtGrabNone ,</function> +<function>XtGrabNonexclusive ,</function> +and +<function>XtGrabExclusive ,</function> +respectively. +Each function then sets the widget that executed the callback list +to be insensitive by calling +<function>XtSetSensitive .</function> +Using these functions in callbacks is not required. +In particular, +an application must provide customized code for +callbacks that create pop-up shells dynamically or that must do more than +desensitizing the button. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +Within a translation table, +to pop up a menu when a key or pointer button is pressed or when the pointer +is moved into a widget, use +<function>XtMenuPopup ,</function> +or its synonym, +<function>MenuPopup .</function> +From a translation writer's point of view, +the definition for this translation action is +</para> +<para> +<!-- .LP --> +<!-- .IN "MenuPopup" "" "@DEF@" --> +<!-- .IN "XtMenuPopup" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtMenuPopup(<emphasis remap='I'>shell_name</emphasis>) +<!-- .br --> + String <emphasis remap='I'>shell_name</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>shell_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the shell widget to pop up. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtMenuPopup</function> +is known to the translation manager, +which registers the corresponding built-in action procedure +<function>XtMenuPopupAction</function> +using +<function>XtRegisterGrabAction</function> +specifying <emphasis remap='I'>owner_events</emphasis> +<function>True ,</function> +<emphasis remap='I'>event_mask</emphasis> +<function>ButtonPressMask</function> +<function>|</function> +<function>ButtonReleaseMask ,</function> +and <emphasis remap='I'>pointer_mode</emphasis> and <emphasis remap='I'>keyboard_mode</emphasis> +<function>GrabModeAsync .</function> +</para> +<para> +<!-- .LP --> +If +<function>XtMenuPopup</function> +is invoked on +<function>ButtonPress ,</function> +it calls +<function>XtPopupSpringLoaded</function> +on the specified shell widget. +If +<function>XtMenuPopup</function> +is invoked on +<function>KeyPress</function> +or +<function>EnterWindow ,</function> +it calls +<function>XtPopup</function> +on the specified shell widget with <emphasis remap='I'>grab_kind</emphasis> set to +<function>XtGrabNonexclusive .</function> +Otherwise, the translation manager generates a +warning message and ignores the action. +</para> +<para> +<!-- .LP --> +<function>XtMenuPopup</function> +tries to find the shell by searching the widget tree starting at +the widget in which it is invoked. +If it finds a shell with the specified name in the pop-up children of +that widget, it pops up the shell with the appropriate parameters. +Otherwise, it moves up the parent chain to find a pop-up child with the +specified name. +If +<function>XtMenuPopup</function> +gets to the application top-level shell widget and has not +found a matching shell, it generates a warning and returns immediately. + +</para> +</sect2> +<sect2 id="Unmapping_a_Pop_Up_Widget"> +<title>Unmapping a Pop-Up Widget</title> +<!-- .XS --> +<!-- <function>(SN Unmapping a Pop-Up Widget</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Pop-ups can be popped down through several mechanisms: +</para> +<itemizedlist> + <listitem> + <para> +A call to +<function>XtPopdown</function> + </para> + </listitem> + <listitem> + <para> +The supplied callback procedure +<function>XtCallbackPopdown</function> + </para> + </listitem> + <listitem> + <para> +The standard translation action +<function>XtMenuPopdown</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To unmap a pop-up from within an application, use +<function>XtPopdown .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtPopdown" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtPopdown(<emphasis remap='I'>popup_shell</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>popup_shell</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>popup_shell</emphasis> + </term> + <listitem> + <para> +Specifies the shell widget to pop down. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtPopdown</function> +function performs the following: +</para> +<itemizedlist> + <listitem> + <para> +Calls +<function>XtCheckSubclass</function> +<!-- .\".PN XtCheckSubclass(popup_shell, popupShellWidgetClass) --> +to ensure <emphasis remap='I'>popup_shell</emphasis>'s class is a subclass of +<function>shellWidgetClass .</function> + </para> + </listitem> + <listitem> + <para> +Checks that the <emphasis remap='I'>popped_up</emphasis> field of <emphasis remap='I'>popup_shell</emphasis> is +<function>True ;</function> +otherwise, it returns immediately. + </para> + </listitem> + <listitem> + <para> +Unmaps <emphasis remap='I'>popup_shell</emphasis>'s window and, if <emphasis remap='I'>override_redirect</emphasis> is +<function>False ,</function> +sends a synthetic +<function>UnmapNotify</function> +event as specified by the <emphasis remap='I'>(xC</emphasis>. + </para> + </listitem> + <listitem> + <para> +If <emphasis remap='I'>popup_shell</emphasis>'s <emphasis remap='I'>grab_kind</emphasis> is either +<function>XtGrabNonexclusive</function> +or +<function>XtGrabExclusive ,</function> +it calls +<function>XtRemoveGrab .</function> +<!-- .\".PN XtRemoveGrab(popup_shell) --> + </para> + </listitem> + <listitem> + <para> +Sets <emphasis remap='I'>popup_shell</emphasis>'s <emphasis remap='I'>popped_up</emphasis> field to +<function>False .</function> + </para> + </listitem> + <listitem> + <para> +Calls the callback procedures on the shell's <emphasis remap='I'>popdown_callback</emphasis> list, +specifying a pointer to the value of the shell's <emphasis remap='I'>grab_kind</emphasis> field +as the <emphasis remap='I'>call_data</emphasis> argument. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To pop down a pop-up from a callback list, you may use the callback +<function>XtCallbackPopdown .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackPopdown" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallbackPopdown(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the +<function>XtPopdownID</function> +structure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies the callback data argument, +which is not used by this procedure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCallbackPopdown</function> +function casts the <emphasis remap='I'>client_data</emphasis> parameter to a pointer of type +<function>XtPopdownID .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + Widget shell_widget; + Widget enable_widget; +} XtPopdownIDRec, *XtPopdownID; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>shell_widget</emphasis> is the pop-up shell to pop down, +and the <emphasis remap='I'>enable_widget</emphasis> is usually the widget that was used to pop it up +in one of the pop-up callback convenience procedures. +</para> +<para> +<!-- .LP --> +<function>XtCallbackPopdown</function> +calls +<function>XtPopdown</function> +with the specified <emphasis remap='I'>shell_widget</emphasis> +and then calls +<function>XtSetSensitive</function> +to resensitize <emphasis remap='I'>enable_widget</emphasis>. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +Within a translation table, +to pop down a spring-loaded menu when a key or pointer button is +released or when the +pointer is moved into a widget, use +<function>XtMenuPopdown</function> +or its synonym, +<function>MenuPopdown .</function> +From a translation writer's point of view, +the definition for this translation action is +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMenuPopdown" "" "@DEF@" --> +<!-- .IN "MenuPopdown" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtMenuPopdown(<emphasis remap='I'>shell_name</emphasis>) +<!-- .br --> + String <emphasis remap='I'>shell_name</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>shell_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the shell widget to pop down. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If a shell name is not given, +<function>XtMenuPopdown</function> +calls +<function>XtPopdown</function> +with the widget for which the translation is specified. +If <emphasis remap='I'>shell_name</emphasis> is specified in the translation table, +<function>XtMenuPopdown</function> +tries to find the shell by looking up the widget tree starting at the +widget in which it is invoked. +If it finds a shell with the specified name in the pop-up children +of that widget, it pops down the shell; +otherwise, it moves up the parent chain to find a pop-up child with the +specified name. +If +<function>XtMenuPopdown</function> +gets to the application top-level shell widget +and cannot find a matching shell, +it generates a warning and returns immediately. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect2> +</chapter> +</book> diff --git a/specs/CH06.xml b/specs/CH06.xml new file mode 100644 index 0000000..4251af1 --- /dev/null +++ b/specs/CH06.xml @@ -0,0 +1,1846 @@ +<!-- .\" $Xorg: CH06,v 1.3 2000/08/17 19:42:45 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 6</function>\s-1 + +\s+1<function>Geometry Management</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 6 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 6 \(em Geometry Management --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +<!-- .IN "geometry_manager procedure" --> +<!-- .IN "Geometry Management" --> +<!-- .IN "Configure Window" --> +A widget does not directly control its size and location; +rather, its parent is responsible for controlling them. +Although the position of children is usually left up to their parent, +the widgets themselves often have the best idea of their optimal sizes +and, possibly, preferred locations. +</para> +<para> +<!-- .LP --> +To resolve physical layout conflicts between sibling widgets and between +a widget and its parent, the (xI provide the geometry management mechanism. +Almost all +composite +widgets have a geometry manager specified in the <emphasis remap='I'>geometry_manager</emphasis> field +in the widget class record that is responsible for the size, position, and +stacking order of the widget's children. +The only exception is fixed boxes, +which create their children themselves and can ensure that +their children will never make a geometry request. + +</para> +<sect2 id="Initiating_Geometry_Changes"> +<title>Initiating Geometry Changes</title> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- (SN Initiating Geometry Changes --> +<!-- .XE --> +Parents, children, and clients each initiate geometry changes differently. +Because a parent has absolute control of its children's geometry, +it changes the geometry directly by calling +<function>XtMove\%Widget ,</function> +<function>XtResizeWidget ,</function> +or +<function>XtConfigureWidget .</function> +A child must ask its parent for a geometry change by calling +<function>XtMakeGeometryRequest</function> +or +<function>XtMakeResizeRequest .</function> +An application or other client code initiates a geometry change by calling +<function>XtSetValues</function> +on the appropriate geometry fields, +thereby giving the widget the opportunity to modify or reject the client +request before it gets propagated to the parent and the opportunity +to respond appropriately to the parent's reply. +</para> +<para> +<!-- .LP --> +When a widget that needs to change its size, position, border width, +or stacking depth asks its parent's geometry manager to make the desired +changes, +the geometry manager can allow the request, disallow the request, or +suggest a compromise. +</para> +<para> +<!-- .LP --> +When the geometry manager is asked to change the geometry of a child, +the geometry manager may also rearrange and resize any or all +of the other children that it controls. +The geometry manager can move children around freely using +<function>XtMoveWidget .</function> +When it resizes a child (that is, changes the width, height, or +border width) other than the one making the request, +it should do so by calling +<function>XtResizeWidget .</function> +The requesting child may be given special treatment; see Section 6.5. +It can simultaneously move and resize a child with a single call to +<function>XtConfigureWidget .</function> +</para> +<para> +<!-- .LP --> +Often, geometry managers find that they can satisfy a request only if +they can reconfigure a widget that they are not in control of; in particular, +the +composite +widget may want to change its own size. +In this case, +the geometry manager makes a request to its parent's geometry manager. +Geometry requests can cascade this way to arbitrary depth. +</para> +<para> +<!-- .LP --> +Because such cascaded arbitration of widget geometry can involve extended +negotiation, +windows are not actually allocated to widgets at application +startup until all widgets are satisfied with their geometry; +see Sections 2.5 and 2.6. +<!-- .NT Notes --> +</para> +<itemizedlist> + <listitem> + <para> +The (xI treatment of stacking requests is deficient in several areas. +Stacking requests for unrealized widgets are granted but will have no effect. +In addition, there is no way to do an +<function>XtSetValues</function> +that will generate a stacking geometry request. + </para> + </listitem> + <listitem> + <para> +After a successful geometry request (one that returned +<function>XtGeometryYes ),</function> +a widget does not know whether its resize procedure has been called. +Widgets should have resize procedures that can be called more than once +without ill effects. +<!-- .NE --> + + </para> + </listitem> +</itemizedlist> +</sect2> +<sect2 id="General_Geometry_Manager_Requests"> +<title>General Geometry Manager Requests</title> +<!-- .XS --> +<!-- (SN General Geometry Manager Requests --> +<!-- .XE --> +<para> +<!-- .LP --> +When making a geometry request, the child specifies an +<function>XtWidgetGeometry</function> +structure. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGeometryMask" --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef unsigned long XtGeometryMask; + +typedef struct { + XtGeometryMask request_mode; + Position x, y; + Dimension width, height; + Dimension border_width; + Widget sibling; + int stack_mode; +} XtWidgetGeometry; +</literallayout> +<!-- .eM --> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +To make a general geometry manager request from a widget, use +<function>XtMakeGeometryRequest .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMakeGeometryRequest" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtGeometryResult XtMakeGeometryRequest(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>request</emphasis>, \ +<emphasis remap='I'>reply_return</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>request</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>reply_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request</emphasis> + </term> + <listitem> + <para> +Specifies the desired widget geometry (size, position, border width, +and stacking order). + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>reply_return</emphasis> + </term> + <listitem> + <para> +Returns the allowed widget size, or may be NULL +if the requesting widget is not interested in handling +<function>XtGeometryAlmost .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Depending on the condition, +<function>XtMakeGeometryRequest</function> +performs the following: +</para> +<itemizedlist> + <listitem> + <para> +If the widget is unmanaged or the widget's parent is not realized, +it makes the changes and returns +<function>XtGeometryYes .</function> + </para> + </listitem> + <listitem> + <para> +If the parent's class is not a subclass of +<function>compositeWidgetClass</function> +or the parent's <emphasis remap='I'>geometry_manager</emphasis> field is NULL, +it issues an error. + </para> + </listitem> + <listitem> + <para> +If the widget's <emphasis remap='I'>being_destroyed</emphasis> field is +<function>True ,</function> +it returns +<function>XtGeometryNo .</function> + </para> + </listitem> + <listitem> + <para> +If the widget <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, and +<emphasis remap='I'>border_width</emphasis> fields are +all equal to the requested values, +it returns +<function>XtGeometryYes ;</function> +otherwise, it calls the parent's geometry_manager procedure +with the given parameters. + </para> + </listitem> + <listitem> + <para> +If the parent's geometry manager returns +<function>XtGeometryYes</function> +and if +<function>XtCWQueryOnly</function> +is not set in <emphasis remap='I'>request->request_mode</emphasis> +and if the widget is realized, +<function>XtMakeGeometryRequest</function> +calls the +<function>XConfigureWindow</function> +Xlib function to reconfigure the widget's window (set its size, location, +and stacking order as appropriate). + </para> + </listitem> + <listitem> + <para> +If the geometry manager returns +<function>XtGeometryDone ,</function> +the change has been approved and actually has been done. +In this case, +<function>XtMakeGeometryRequest</function> +does no configuring and returns +<function>XtGeometryYes .</function> +<function>XtMakeGeometryRequest</function> +never returns +<function>XtGeometryDone .</function> + </para> + </listitem> + <listitem> + <para> +Otherwise, +<function>XtMakeGeometryRequest</function> +just returns the resulting value from the parent's geometry manager. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Children of primitive widgets are always unmanaged; therefore, +<function>XtMakeGeometryRequest</function> +always returns +<function>XtGeometryYes</function> +when called by a child of a primitive widget. +</para> +<para> +<!-- .LP --> +The return codes from geometry managers are +<!-- .IN "XtGeometryResult" --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.75i --> +<!-- .ta .5i 1.75i --> +typedef enum { + XtGeometryYes, + XtGeometryNo, + XtGeometryAlmost, + XtGeometryDone +} XtGeometryResult; +</literallayout> +<!-- .eM --> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>request_mode</emphasis> definitions are from +<function>< X11/X.h >.</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(.5i) lw(2.5i) lw(.75i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWX</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<0)</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWY</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<1)</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWWidth</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<2)</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWHeight</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<3)</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWBorderWidth</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<4)</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWSibling</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<5)</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CWStackMode</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<6)</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The (xI also support the following value. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(.5i) lw(2.5i) lw(.75i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCWQueryOnly</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>(1<<7)</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtCWQueryOnly</function> +indicates that the corresponding geometry request is only a query +as to what would happen if this geometry request were made +and that no widgets should actually be changed. +</para> +<para> +<!-- .LP --> +<function>XtMakeGeometryRequest ,</function> +like the +<function>XConfigureWindow</function> +Xlib function, uses <emphasis remap='I'>request_mode</emphasis> to determine which fields in the +<function>XtWidgetGeometry</function> +structure the caller wants to specify. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>stack_mode</emphasis> definitions are from +<function>< X11/X.h >:</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(.5i) lw(2.5i) lw(.75i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>Above</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>0</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>Below</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>1</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>TopIf</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>2</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>BottomIf</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>3</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>Opposite</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>4</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The (xI also support the following value. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(.5i) lw(2.5i) lw(.75i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry>#define</entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtSMDontChange</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>5</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +For definition and behavior of +<function>Above ,</function> +<function>Below ,</function> +<function>TopIf ,</function> +<function>BottomIf ,</function> +and +<function>Opposite ,</function> +see Section 3.7 in <emphasis remap='I'>(xL</emphasis>. +<function>XtSMDontChange</function> +indicates that the widget wants its current stacking order preserved. + +</para> +</sect2> +<sect2 id="Resize_Requests"> +<title>Resize Requests</title> +<!-- .XS --> +<!-- (SN Resize Requests --> +<!-- .XE --> +<para> +<!-- .LP --> +To make a simple resize request from a widget, you can use +<function>XtMakeResizeRequest</function> +as an alternative to +<function>XtMakeGeometryRequest .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMakeResizeRequest" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtGeometryResult XtMakeResizeRequest(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, \ +<emphasis remap='I'>width_return</emphasis>, <emphasis remap='I'>height_return</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>; +<!-- .br --> + Dimension *<emphasis remap='I'>width_return</emphasis>, *<emphasis remap='I'>height_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>width</emphasis> + </term> + <listitem> + <para> +Specify the desired widget width and height. +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>height</emphasis> + </term> + <listitem> + <para> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>width_return</emphasis> + </term> + <listitem> + <para> +Return the allowed widget width and height. +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>height_return</emphasis> + </term> + <listitem> + <para> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtMakeResizeRequest</function> +function, a simple interface to +<function>XtMakeGeometryRequest ,</function> +creates an +<function>XtWidgetGeometry</function> +structure and specifies that width and height should change +by setting <emphasis remap='I'>request_mode</emphasis> to +<function>CWWidth</function> +<function>|</function> +<function>CWHeight .</function> +The geometry manager is free to modify any of the other window attributes +(position or stacking order) to satisfy the resize request. +If the return value is +<function>XtGeometryAlmost ,</function> +<emphasis remap='I'>width_return</emphasis> and <emphasis remap='I'>height_return</emphasis> contain a compromise width and height. +If these are acceptable, +the widget should immediately call +<function>XtMakeResizeRequest</function> +again and request that the compromise width and height be applied. +If the widget is not interested in +<function>XtGeometryAlmost</function> +replies, +it can pass NULL for <emphasis remap='I'>width_return</emphasis> and <emphasis remap='I'>height_return</emphasis>. + +</para> +</sect2> +<sect2 id="Potential_Geometry_Changes"> +<title>Potential Geometry Changes</title> +<!-- .XS --> +<!-- (SN Potential Geometry Changes --> +<!-- .XE --> +<para> +<!-- .LP --> +Sometimes a geometry manager cannot respond to +a geometry request from a child without first making a geometry request +to the widget's own parent (the original requestor's grandparent). +If the request to the grandparent would allow the parent to satisfy the +original request, +the geometry manager can make the intermediate geometry request +as if it were the originator. +On the other hand, +if the geometry manager already has determined that the original request +cannot be completely satisfied (for example, if it always denies +position changes), +it needs to tell the grandparent to respond to the intermediate request +without actually changing the geometry +because it does not know if the child will accept the compromise. +To accomplish this, the geometry manager uses +<function>XtCWQueryOnly</function> +in the intermediate request. +</para> +<para> +<!-- .LP --> +When +<function>XtCWQueryOnly</function> +is used, the geometry manager needs to cache +enough information to exactly reconstruct the intermediate request. +If the grandparent's response to the intermediate query was +<function>XtGeometryAlmost ,</function> +the geometry manager needs to cache the entire +reply geometry in the event the child accepts the parent's compromise. +</para> +<para> +<!-- .LP --> +If the grandparent's response was +<function>XtGeometryAlmost ,</function> +it may also be necessary to cache the entire reply geometry from +the grandparent when +<function>XtCWQueryOnly</function> +is not used. +If the geometry manager is still able to satisfy the original request, +it may immediately accept the grandparent's compromise +and then act on the child's request. +If the grandparent's compromise geometry is insufficient to allow +the child's request and if the geometry manager is willing to offer +a different compromise to the child, +the grandparent's compromise should not be accepted until the child +has accepted the new compromise. +</para> +<para> +<!-- .LP --> +Note that a compromise geometry returned with +<function>XtGeometryAlmost</function> +is guaranteed only for the next call to the same widget; +therefore, a cache of size 1 is sufficient. + +</para> +</sect2> +<sect2 id="Child_Geometry_Management_The_geometry_manager_Procedure"> +<title>Child Geometry Management: The geometry_manager Procedure</title> +<!-- .XS --> +<!-- (SN Child Geometry Management: The geometry_manager Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +The geometry_manager procedure pointer in a composite widget class is of type +<function>XtGeometryHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGeometryHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef XtGeometryResult (*XtGeometryHandler)(Widget, XtWidgetGeometry*, \ +XtWidgetGeometry*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>request</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>geometry_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Passes the widget making the request. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request</emphasis> + </term> + <listitem> + <para> +Passes the new geometry the child desires. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>geometry_return</emphasis> + </term> + <listitem> + <para> +Passes a geometry structure in which the geometry manager may store a +compromise. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +A class can inherit its superclass's geometry manager during class +initialization. +</para> +<para> +<!-- .LP --> +A bit set to zero in the request's <emphasis remap='I'>request_mode</emphasis> +field means that the child widget +does not care about the value of the corresponding field, +so the geometry manager can change this field as it wishes. +A bit set to 1 means that the child wants that geometry element set +to the value in the corresponding field. +</para> +<para> +<!-- .LP --> +If the geometry manager can satisfy all changes requested +and if +<function>XtCWQueryOnly</function> +is not specified, +it updates the widget's <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, +and <emphasis remap='I'>border_width</emphasis> fields +appropriately. +Then, it returns +<function>XtGeometryYes ,</function> +and the values pointed to by the <emphasis remap='I'>geometry_return</emphasis> argument are undefined. +The widget's window is moved and resized automatically by +<function>XtMakeGeometryRequest .</function> +</para> +<para> +<!-- .LP --> +Homogeneous composite widgets often find it convenient to treat the widget +making the request the same as any other widget, including reconfiguring +it using +<function>XtConfigureWidget</function> +or +<function>XtResizeWidget</function> +as part of its layout process, unless +<function>XtCWQueryOnly</function> +is specified. +If it does this, +it should return +<function>XtGeometryDone</function> +to inform +<function>XtMakeGeometryRequest</function> +that it does not need to do the configuration itself. +<!-- .NT --> +To remain +compatible with layout techniques used in older widgets (before +<function>XtGeometryDone</function> +was added to the (xI), a geometry manager should avoid using +<function>XtResizeWidget</function> +or +<function>XtConfigureWidget</function> +on the child making +the request because the layout process of the child may be in an +intermediate state in which it is not prepared to handle a call to its +resize procedure. A self-contained widget set may choose this +alternative geometry management scheme, however, provided that it +clearly warns widget developers of the compatibility consequences. +<!-- .NE --> +</para> +<para> +<!-- .LP --> +Although +<function>XtMakeGeometryRequest</function> +resizes the widget's window +(if the geometry +manager returns +<function>XtGeometryYes ),</function> +it does not call the widget class's resize procedure. +The requesting widget must perform whatever +resizing calculations are needed explicitly. +</para> +<para> +<!-- .LP --> +If the geometry manager disallows the request, +the widget cannot change its geometry. +The values pointed to by <emphasis remap='I'>geometry_return</emphasis> are undefined, +and the geometry manager returns +<function>XtGeometryNo .</function> +</para> +<para> +<!-- .LP --> +Sometimes the geometry manager cannot satisfy the request exactly +but may be able to satisfy a similar request. +That is, +it could satisfy only a subset of the requests (for example, +size but not position) or a lesser request +(for example, it cannot make the child as big as the +request but it can make the child bigger than its current size). +In such cases, +the geometry manager fills in the structure pointed to by +<emphasis remap='I'>geometry_return</emphasis> with the actual changes +it is willing to make, including an appropriate <emphasis remap='I'>request_mode</emphasis> mask, and returns +<function>XtGeometryAlmost .</function> +If a bit in <emphasis remap='I'>geometry_return->request_mode</emphasis> is zero, +the geometry manager agrees not to change the corresponding value +if <emphasis remap='I'>geometry_return</emphasis> is used immediately +in a new request. +If a bit is 1, +the geometry manager does change that element to the corresponding +value in <emphasis remap='I'>geometry_return</emphasis>. +More bits may be set in <emphasis remap='I'>geometry_return->request_mode</emphasis> +than in the original request if +the geometry manager intends to change other fields should the +child accept the compromise. +</para> +<para> +<!-- .LP --> +When +<function>XtGeometryAlmost</function> +is returned, +the widget must decide if the compromise suggested in <emphasis remap='I'>geometry_return</emphasis> +is acceptable. +If it is, the widget must not change its geometry directly; +rather, it must make another call to +<function>XtMakeGeometryRequest .</function> +</para> +<para> +<!-- .LP --> +If the next geometry request from this child uses the +<emphasis remap='I'>geometry_return</emphasis> values filled in by the geometry manager with an +<function>XtGeometryAlmost</function> +return and if there have been no intervening geometry requests on +either its parent or any of its other children, +the geometry manager must grant the request, if possible. +That is, if the child asks immediately with the returned geometry, +it should get an answer of +<function>XtGeometryYes .</function> +However, +dynamic behavior in +the user's window manager may affect the final outcome. +</para> +<para> +<!-- .LP --> +To return +<function>XtGeometryYes ,</function> +the geometry manager frequently rearranges the position of other managed +children by calling +<function>XtMoveWidget .</function> +However, a few geometry managers may sometimes change the +size of other managed children by calling +<function>XtResizeWidget</function> +or +<function>XtConfigureWidget .</function> +If +<function>XtCWQueryOnly</function> +is specified, +the geometry manager must return data describing +how it would react to this geometry +request without actually moving or resizing any widgets. +</para> +<para> +<!-- .LP --> +Geometry managers must not assume that the <emphasis remap='I'>request</emphasis> +and <emphasis remap='I'>geometry_return</emphasis> arguments point to independent storage. +The caller is permitted to use the same field for both, +and the geometry manager must allocate its own temporary storage, +if necessary. + +</para> +</sect2> +<sect2 id="Widget_Placement_and_Sizing"> +<title>Widget Placement and Sizing</title> +<!-- .XS --> +<!-- (SN Widget Placement and Sizing --> +<!-- .XE --> +<para> +<!-- .LP --> +To move a sibling widget of the child making the geometry request, +the parent uses +<function>XtMoveWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMoveWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtMoveWidget(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Position <emphasis remap='I'>x</emphasis>; +<!-- .br --> + Position <emphasis remap='I'>y</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>x</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>y</emphasis> + </term> + <listitem> + <para> +Specify the new widget x and y coordinates. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtMoveWidget</function> +function returns immediately if the specified geometry fields +are the same as the old values. +Otherwise, +<function>XtMoveWidget</function> +writes the new <emphasis remap='I'>x</emphasis> and <emphasis remap='I'>y</emphasis> values into the object +and, if the object is a widget and is realized, issues an Xlib +<function>XMoveWindow</function> +call on the widget's window. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To resize a sibling widget of the child making the geometry request, +the parent uses +<function>XtResizeWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtResizeWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtResizeWidget(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, <emphasis remap='I'>border_width</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>width</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>height</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>border_width</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>width</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>height</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>border_width</emphasis> + </term> + <listitem> + <para> +Specify the new widget size. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtResizeWidget</function> +function returns immediately if the specified geometry fields +are the same as the old values. +Otherwise, +<function>XtResizeWidget</function> +writes the new <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, and <emphasis remap='I'>border_width</emphasis> values into +the object and, if the object is a widget and is realized, issues an +<function>XConfigureWindow</function> +call on the widget's window. +</para> +<para> +<!-- .LP --> +If the new width or height is different from the old values, +<function>XtResizeWidget</function> +calls the object's resize procedure to notify it of the size change. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To move and resize the sibling widget of the child making the geometry request, +the parent uses +<function>XtConfigureWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConfigureWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtConfigureWidget(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, \ +<emphasis remap='I'>border_width</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Position <emphasis remap='I'>x</emphasis>; +<!-- .br --> + Position <emphasis remap='I'>y</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>width</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>height</emphasis>; +<!-- .br --> + Dimension <emphasis remap='I'>border_width</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>x</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>y</emphasis> + </term> + <listitem> + <para> +Specify the new widget x and y coordinates. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>width</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>height</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>border_width</emphasis> + </term> + <listitem> + <para> +Specify the new widget size. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtConfigureWidget</function> +function returns immediately if the specified new geometry fields +are all equal to the current values. +Otherwise, +<function>XtConfigureWidget</function> +writes the new <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, +and <emphasis remap='I'>border_width</emphasis> values +into the object and, if the object is a widget and is realized, makes an Xlib +<function>XConfigureWindow</function> +call on the widget's window. +</para> +<para> +<!-- .LP --> +If the new width or height is different from its old value, +<function>XtConfigureWidget</function> +calls the object's resize procedure to notify it of the size change; +otherwise, it simply returns. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To resize a child widget that already has the new values of its width, +height, and border width, the parent uses +<function>XtResizeWindow .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtResizeWindow" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtResizeWindow(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtResizeWindow</function> +function calls the +<function>XConfigureWindow</function> +Xlib function to make the window of the specified widget match its width, +height, and border width. +This request is done unconditionally because there is no +inexpensive way to tell if these +values match the current values. +Note that the widget's resize procedure is not called. +</para> +<para> +<!-- .LP --> +There are very few times to use +<function>XtResizeWindow ;</function> +instead, the parent should use +<function>XtResizeWidget .</function> + +</para> +</sect2> +<sect2 id="Preferred_Geometry"> +<title>Preferred Geometry</title> +<!-- .XS --> +<!-- (SN Preferred Geometry --> +<!-- .XE --> +<para> +<!-- .LP --> +Some parents may be willing to adjust their layouts to accommodate the +preferred geometries of their children. +They can use +<function>XtQueryGeometry</function> +to obtain the preferred geometry +and, as they see fit, can use or ignore any portion of the response. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To query a child widget's preferred geometry, use +<function>XtQueryGeometry .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtQueryGeometry" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtGeometryResult XtQueryGeometry(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>intended</emphasis>, \ +<emphasis remap='I'>preferred_return</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>intended</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>preferred_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>intended</emphasis> + </term> + <listitem> + <para> +Specifies the new geometry the parent plans to give to the child, or +NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>preferred_return</emphasis> + </term> + <listitem> + <para> +Returns the child widget's preferred geometry. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +To discover a child's preferred geometry, +the child's parent stores the new +geometry in the corresponding fields of +the intended structure, sets the corresponding bits in <emphasis remap='I'>intended.request_mode</emphasis>, +and calls +<function>XtQueryGeometry .</function> +The parent should set only those fields that are important to it so +that the child can determine whether it may be able to attempt changes to +other fields. +</para> +<para> +<!-- .LP --> +<function>XtQueryGeometry</function> +clears all bits in the <emphasis remap='I'>preferred_return->request_mode</emphasis> +field and checks the +<emphasis remap='I'>query_geometry</emphasis> field of the specified widget's class record. +If <emphasis remap='I'>query_geometry</emphasis> is not NULL, +<function>XtQueryGeometry</function> +calls the query_geometry procedure and passes as arguments the +specified widget, <emphasis remap='I'>intended</emphasis>, and <emphasis remap='I'>preferred_return</emphasis> structures. +If the <emphasis remap='I'>intended</emphasis> argument is NULL, +<function>XtQueryGeometry</function> +replaces it with a pointer to an +<function>XtWidgetGeometry</function> +structure with <emphasis remap='I'>request_mode</emphasis> equal to zero before calling the +query_geometry procedure. +<!-- .NT --> +If +<function>XtQueryGeometry</function> +is called from within a geometry_manager +procedure for the widget that issued +<function>XtMakeGeometryRequest</function> +or +<function>XtMakeResizeRequest ,</function> +the results +are not guaranteed to be consistent with the requested changes. The +change request passed to the geometry manager takes precedence over +the preferred geometry. +<!-- .NE --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The query_geometry procedure pointer is of type +<function>XtGeometryHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "query_geometry procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef XtGeometryResult (*XtGeometryHandler)(Widget, XtWidgetGeometry*, \ +XtWidgetGeometry*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>request</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>preferred_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Passes the child widget whose preferred geometry is required. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request</emphasis> + </term> + <listitem> + <para> +Passes the geometry changes that the parent plans to make. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>preferred_return</emphasis> + </term> + <listitem> + <para> +Passes a structure in which the child returns its preferred geometry. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .IN "query_geometry procedure" --> +The query_geometry procedure is expected to examine the bits set in +<emphasis remap='I'>request->request_mode</emphasis>, evaluate the preferred geometry of the widget, +and store the result in <emphasis remap='I'>preferred_return</emphasis> +(setting the bits in <emphasis remap='I'>preferred_return->request_mode</emphasis> corresponding +to those geometry fields that it cares about). +If the proposed geometry change is acceptable without modification, +the query_geometry procedure should return +<function>XtGeometryYes .</function> +If at least one field in <emphasis remap='I'>preferred_return</emphasis> +with a bit set in <emphasis remap='I'>preferred_return->request_mode</emphasis> +is different +from the corresponding field in <emphasis remap='I'>request</emphasis> +or if a bit was set in <emphasis remap='I'>preferred_return->request_mode</emphasis> +that was not set in the request, +the query_geometry procedure should return +<function>XtGeometryAlmost .</function> +If the preferred geometry is identical to the current geometry, +the query_geometry procedure should return +<function>XtGeometryNo .</function> +<!-- .NT --> +The query_geometry procedure may assume +that no +<function>XtMakeResizeRequest</function> +or +<function>XtMakeGeometryRequest</function> +is in progress +for the specified widget; that is, it is not required to construct +a reply consistent with the requested geometry if such a request +were actually outstanding. +<!-- .NE --> +</para> +<para> +<!-- .LP --> +After calling the query_geometry procedure +or if the <emphasis remap='I'>query_geometry</emphasis> field is NULL, +<function>XtQueryGeometry</function> +examines all the unset bits in <emphasis remap='I'>preferred_return->request_mode</emphasis> +and sets the corresponding fields in <emphasis remap='I'>preferred_return</emphasis> +to the current values from the widget instance. +If +<function>CWStackMode</function> +is not set, +the <emphasis remap='I'>stack_mode</emphasis> field is set to +<function>XtSMDontChange .</function> +<function>XtQueryGeometry</function> +returns the value returned by the query_geometry procedure or +<function>XtGeometryYes</function> +if the <emphasis remap='I'>query_geometry</emphasis> field is NULL. +</para> +<para> +<!-- .LP --> +Therefore, the caller can interpret a return of +<function>XtGeometryYes</function> +as not needing to evaluate the contents of the reply and, more important, +not needing to modify its layout plans. +A return of +<function>XtGeometryAlmost</function> +means either that both the parent and the child expressed interest +in at least one common field and the child's preference does not match +the parent's intentions or that the child expressed interest in a field that +the parent might need to consider. +A return value of +<function>XtGeometryNo</function> +means that both the parent and the child expressed interest in a field and +that the child suggests that the field's current value in the widget instance +is its preferred value. +In addition, whether or not the caller ignores the return value or the +reply mask, it is guaranteed that the <emphasis remap='I'>preferred_return</emphasis> structure contains complete +geometry information for the child. +</para> +<para> +<!-- .LP --> +Parents are expected to call +<function>XtQueryGeometry</function> +in their layout routine and wherever else the information is significant +after change_managed has been called. +The first time it is invoked, +the changed_managed procedure may assume that the child's current geometry +is its preferred geometry. +Thus, the child is still responsible for storing values +into its own geometry during its initialize procedure. + +</para> +</sect2> +<sect2 id="Size_Change_Management_The_resize_Procedure"> +<title>Size Change Management: The resize Procedure</title> +<!-- .XS --> +<!-- (SN Size Change Management: The resize Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +A child can be resized by its parent at any time. +Widgets usually need to know when they have changed size +so that they can lay out their displayed data again to match the new size. +When a parent resizes a child, it calls +<function>XtResizeWidget ,</function> +which updates the geometry fields in the widget, +configures the window if the widget is realized, +and calls the child's resize procedure to notify the child. +The resize procedure pointer is of type +<function>XtWidgetProc .</function> +<!-- .IN "resize procedure" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +If a class need not recalculate anything when a widget is resized, +it can specify NULL for the <emphasis remap='I'>resize</emphasis> field in its class record. +This is an unusual case and should occur only for widgets +with very trivial display semantics. +The resize procedure takes a widget as its only argument. +The <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, +and <emphasis remap='I'>border_width</emphasis> fields of the widget contain the new values. +The resize procedure should recalculate the layout of internal data +as needed. +(For example, a centered Label in a window that changes size +should recalculate the starting position of the text.) +The widget must obey resize as a command and must not treat it as a request. +A widget must not issue an +<function>XtMakeGeometryRequest</function> +or +<function>XtMakeResizeRequest</function> +call from its resize procedure. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + +</para> +</sect2> +</chapter> +</book> diff --git a/specs/CH07.xml b/specs/CH07.xml new file mode 100644 index 0000000..2e99ff2 --- /dev/null +++ b/specs/CH07.xml @@ -0,0 +1,5870 @@ +<!-- .\" $Xorg: CH07,v 1.4 2000/08/17 19:42:45 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 7</function>\s-1 + +\s+1<function>Event Management</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 7 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 7 \(em Event Management --> +<!-- .XE --> +While Xlib allows the reading and processing of events anywhere in an application, +widgets in the (tk neither directly read events +nor grab the server or pointer. +Widgets register procedures that are to be called +when an event or class of events occurs in that widget. +</para> +<para> +<!-- .LP --> +A typical application consists of startup code followed by an event loop +that reads events and dispatches them by calling +the procedures that widgets have registered. +The default event loop provided by the (xI is +<function>XtAppMainLoop .</function> +</para> +<para> +<!-- .LP --> +The event manager is a collection of functions to perform the following tasks: +</para> +<itemizedlist> + <listitem> + <para> +Add or remove event sources other than X server events (in particular, +timer interrupts, file input, or POSIX signals). + </para> + </listitem> + <listitem> + <para> +Query the status of event sources. + </para> + </listitem> + <listitem> + <para> +Add or remove procedures to be called when an event occurs for a particular +widget. + </para> + </listitem> + <listitem> + <para> +Enable and +disable the dispatching of user-initiated events (keyboard and pointer events) +for a particular widget. + </para> + </listitem> + <listitem> + <para> +Constrain the dispatching of events to a cascade of pop-up widgets. + </para> + </listitem> + <listitem> + <para> +Register procedures to be called when specific events arrive. + </para> + </listitem> + <listitem> + <para> +Register procedures to be called when the (xI will block. + </para> + </listitem> + <listitem> + <para> +Enable safe operation in a multi-threaded environment. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Most widgets do not need to call any of the event handler functions explicitly. +The normal interface to X events is through the higher-level +translation manager, +which maps sequences of X events, with modifiers, into procedure calls. +Applications rarely use any of the event manager routines besides +<function>XtAppMainLoop .</function> + +</para> +<sect2 id="Adding_and_Deleting_Additional_Event_Sources"> +<title>Adding and Deleting Additional Event Sources</title> +<!-- .XS --> +<!-- <function>(SN Adding and Deleting Additional Event Sources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +While most applications are driven only by X events, +some applications need to incorporate other sources of input +into the (xI event-handling mechanism. +The event manager provides routines to integrate notification of timer events +and file data pending into this mechanism. +</para> +<para> +<!-- .LP --> +The next section describes functions that provide input gathering from files. +The application registers the files with the (xI read routine. +When input is pending on one of the files, +the registered callback procedures are invoked. + +</para> +<sect3 id="Adding_and_Removing_Input_Sources"> +<title>Adding and Removing Input Sources</title> +<!-- .XS --> +<!-- <function>(SN Adding and Removing Input Sources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To register a new file as an input source for a given application context, use +<function>XtAppAddInput .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddInput" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtInputId XtAppAddInput(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>source</emphasis>, <emphasis remap='I'>condition</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + int <emphasis remap='I'>source</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>condition</emphasis>; +<!-- .br --> + XtInputCallbackProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>source</emphasis> + </term> + <listitem> + <para> +Specifies the source file descriptor on a POSIX-based system +or other operating-system-dependent device specification. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>condition</emphasis> + </term> + <listitem> + <para> +Specifies the mask that indicates a read, write, or exception condition +or some other operating-system-dependent condition. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called when the condition is found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies an argument passed to the specified procedure +when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppAddInput</function> +function registers with the (xI read routine a new source of events, +which is usually file input but can also be file output. +Note that <emphasis remap='I'>file</emphasis> should be loosely interpreted to mean any sink +or source of data. +<function>XtAppAddInput</function> +also specifies the conditions under which the source can generate events. +When an event is pending on this source, +the callback procedure is called. +</para> +<para> +<!-- .LP --> +The legal values for the <emphasis remap='I'>condition</emphasis> argument are operating-system-dependent. +On a POSIX-based system, +<emphasis remap='I'>source</emphasis> is a file number and the condition is some union of the following: +<!-- .IN "XtInputReadMask" "" "@DEF@" --> +<variablelist> + <varlistentry> + <term> + \fBXtInputReadMask\fR + </term> + <listitem> + <para> +Specifies that <emphasis remap='I'>proc</emphasis> is to be called when <emphasis remap='I'>source</emphasis> has data to be read. +<!-- .IN "XtInputWriteMask" "" "@DEF@" --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + \fBXtInputWriteMask\fR + </term> + <listitem> + <para> +Specifies that <emphasis remap='I'>proc</emphasis> is to be called when <emphasis remap='I'>source</emphasis> is ready +for writing. +<!-- .IN "XtInputExceptMask" "" "@DEF@" --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + \fBXtInputExceptMask\fR + </term> + <listitem> + <para> +Specifies that <emphasis remap='I'>proc</emphasis> is to be called when <emphasis remap='I'>source</emphasis> has +exception data. + </para> + </listitem> + </varlistentry> +</variablelist> +</para> +<para> +<!-- .LP --> +Callback procedure pointers used to handle file events are of +type +<function>XtInputCallbackProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInputCallbackProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtInputCallbackProc)(XtPointer, int*, XtInputId*); +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>source</emphasis>; +<!-- .br --> + XtInputId *<emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the client data argument that was registered for this procedure in +<function>XtApp\%AddInput .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>source</emphasis> + </term> + <listitem> + <para> +Passes the source file descriptor generating the event. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Passes the id returned from the corresponding +<function>XtAppAddInput</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +See Section 7.12 for information regarding the use of +<function>XtAppAddInput</function> +in multiple threads. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To discontinue a source of input, use +<function>XtRemoveInput .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveInput" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveInput(<emphasis remap='I'>id</emphasis>) +<!-- .br --> + XtInputId <emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Specifies the id returned from the corresponding +<function>XtAppAddInput</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveInput</function> +function causes the (xI read routine to stop watching for events +from the file source specified by <emphasis remap='I'>id</emphasis>. +</para> +<para> +<!-- .LP --> +See Section 7.12 for information regarding the use of +<function>XtRemoveInput</function> +in multiple threads. + +</para> +</sect3> +<sect3 id="Adding_and_Removing_Blocking_Notifications"> +<title>Adding and Removing Blocking Notifications</title> +<!-- .XS --> +<!-- <function>(SN Adding and Removing Blocking Notifications</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Occasionally it is desirable for an application to receive notification +when the (xI event manager detects no pending input from file sources +and no pending input from X server event sources and is about to block +in an operating system call. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a hook that is called immediately prior to event blocking, use +<function>XtAppAddBlockHook .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddBlockHook" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtBlockHookId XtAppAddBlockHook(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>proc</emphasis>, \ +<emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtBlockHookProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called before blocking. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies an argument passed to the specified procedure when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppAddBlockHook</function> +function registers the specified procedure and returns an identifier for it. +The hook procedure <emphasis remap='I'>proc</emphasis> is called at any time in the future when +the (xI are about to block pending some input. +</para> +<para> +<!-- .LP --> +The procedure pointers used to provide notification of event blocking +are of type +<function>XtBlockHookProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtBlockHookProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtBlockHookProc)(XtPointer); +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the client data argument that was registered for this procedure in +<function>XtApp\%AddBlockHook .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +To discontinue the use of a procedure for blocking notification, use +<function>XtRemoveBlockHook .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveBlockHook" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveBlockHook(<emphasis remap='I'>id</emphasis>) +<!-- .br --> + XtBlockHookId <emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Specifies the identifier returned from the corresponding call to +<function>XtAppAddBlockHook .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveBlockHook</function> +function removes the specified procedure from the list of procedures +that are called by the (xI read routine before blocking on event sources. + +</para> +</sect3> +<sect3 id="Adding_and_Removing_Timeouts"> +<title>Adding and Removing Timeouts</title> +<!-- .XS --> +<!-- <function>(SN Adding and Removing Timeouts</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The timeout facility notifies the application or the widget +through a callback procedure that a specified time interval has elapsed. +Timeout values are uniquely identified by an interval id. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a timeout callback, use +<function>XtAppAddTimeOut .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddTimeOut" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtIntervalId XtAppAddTimeOut(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>interval</emphasis>, <emphasis remap='I'>proc</emphasis>, \ +<emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + unsigned long <emphasis remap='I'>interval</emphasis>; +<!-- .br --> + XtTimerCallbackProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context for which the timer is to be set. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>interval</emphasis> + </term> + <listitem> + <para> +Specifies the time interval in milliseconds. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called when the time expires. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies an argument passed to the specified procedure +when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppAddTimeOut</function> +function creates a timeout and returns an identifier for it. +The timeout value is set to <emphasis remap='I'>interval</emphasis>. +The callback procedure <emphasis remap='I'>proc</emphasis> is called when +<function>XtAppNextEvent</function> +or +<function>XtAppProcessEvent</function> +is next called after the time interval elapses, +and then the timeout is removed. +</para> +<para> +<!-- .LP --> +Callback procedure pointers used with timeouts are of +type +<function>XtTimerCallbackProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtTimerCallbackProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtTimerCallbackProc)(XtPointer, XtIntervalId*); +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtIntervalId *<emphasis remap='I'>timer</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the client data argument that was registered for this procedure in +<function>XtApp\%AddTimeOut .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>timer</emphasis> + </term> + <listitem> + <para> +Passes the id returned from the corresponding +<function>XtAppAddTimeOut</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +See Section 7.12 for information regarding the use of +<function>XtAppAddTimeOut</function> +in multiple threads. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To clear a timeout value, use +<function>XtRemoveTimeOut .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveTimeOut" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveTimeOut(<emphasis remap='I'>timer</emphasis>) +<!-- .br --> + XtIntervalId <emphasis remap='I'>timer</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>timer</emphasis> + </term> + <listitem> + <para> +Specifies the id for the timeout request to be cleared. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveTimeOut</function> +function removes the pending timeout. +Note that timeouts are automatically removed once they trigger. +</para> +<para> +<!-- .LP --> +Please refer to Section 7.12 for information regarding the use of +<function>XtRemoveTimeOut</function> +in multiple threads. + +</para> +</sect3> +<sect3 id="Adding_and_Removing_Signal_Callbacks"> +<title>Adding and Removing Signal Callbacks</title> +<!-- .XS --> +<!-- <function>(SN Adding and Removing Signal Callbacks</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The signal facility notifies the application or the widget through a +callback procedure that a signal or other external asynchronous event +has occurred. The registered callback procedures are uniquely identified +by a signal id. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +Prior to establishing a signal handler, the application or widget should +call +<function>XtAppAddSignal</function> +and store the resulting identifier in a place accessible to the signal +handler. When a signal arrives, the signal handler should call +<function>XtNoticeSignal</function> +to notify the (xI that a signal has occured. To register a signal +callback use +<function>XtAppAddSignal .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddSignal" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtSignalId XtAppAddSignal(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtSignalCallbackProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called when the signal is noticed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies an argument passed to the specified procedure when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The callback procedure pointers used to handle signal events are of type +<function>XtSignalCallbackProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSignalCallbackProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtSignalCallbackProc)(XtPointer, XtSignalId*); +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtSignalId *<emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the client data argument that was registered for this procedure in +<function>XtAppAddSignal .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Passes the id returned from the corresponding +<function>XtAppAddSignal</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +To notify the (xI that a signal has occured, use +<function>XtNoticeSignal .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtNoticeSignal" "" "@DEF@" --> +<!-- .sp --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtNoticeSignal(<emphasis remap='I'>id</emphasis>) +<!-- .br --> + XtSignalId <emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Specifies the id returned from the corresponding +<function>XtAppAddSignal</function> +call. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +On a POSIX-based system, +<function>XtNoticeSignal</function> +is the only (xI function that can safely be called from a signal handler. +If +<function>XtNoticeSignal</function> +is invoked multiple times before the (xI are able to invoke the +registered callback, the callback is only called once. +Logically, the (xI maintain ``pending'' flag for each registered callback. +This flag is initially +<function>False</function> +and is set to +<function>True</function> +by +<function>XtNoticeSignal .</function> +When +<function>XtAppNextEvent</function> +or +<function>XtAppProcessEvent</function> +(with a mask including +<function>XtIMSignal )</function> +is called, all registered callbacks with ``pending'' +<function>True</function> +are invoked and the flags are reset to +<function>False .</function> +</para> +<para> +<!-- .LP --> +If the signal handler wants to track how many times the signal has been +raised, it can keep its own private counter. Typically the handler would +not do any other work; the callback does the actual processing for the +signal. The (xI never block signals from being raised, so if a given +signal can be raised multiple times before the (xI can invoke the +callback for that signal, the callback must be designed to deal with +this. In another case, a signal might be raised just after the (xI +sets the pending flag to +<function>False</function> +but before the callback can get control, in which case the pending flag +will still be +<function>True</function> +after the callback returns, and the (xI will invoke the callback +again, even though all of the signal raises have been handled. The +callback must also be prepared to handle this case. +</para> +<para> +<!-- .LP --> +To remove a registered signal callback, call +<function>XtRemoveSignal .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveSignal" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveSignal(<emphasis remap='I'>id</emphasis>) +<!-- .br --> + XtSignalId <emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Specifies the id returned by the corresponding call to +<function>XtAppAddSignal .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The client should typically disable the source of the signal before calling +<function>XtRemoveSignal .</function> +If the signal could have been raised again before the source was disabled +and the client wants to process it, then after disabling the source but +before calling +<function>XtRemoveSignal</function> +the client can test for signals with +<function>XtAppPending</function> +and process them by calling +<function>XtAppProcessEvent</function> +with the mask +<function>XtIMSignal .</function> + +</para> +</sect3> +</sect2> +<sect2 id="Constraining_Events_to_a_Cascade_of_Widgets"> +<title>Constraining Events to a Cascade of Widgets</title> +<!-- .XS --> +<!-- <function>(SN Constraining Events to a Cascade of Widgets</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Grabbing Input" --> +<!-- .IN "Input Grabbing" --> +Modal widgets are widgets that, except for the input directed to them, +lock out user input to the application. +</para> +<para> +<!-- .LP --> +When a modal menu or modal dialog box is popped up using +<function>XtPopup ,</function> +user events (keyboard and pointer events) that occur outside the modal +widget should be delivered to the modal widget or ignored. +In no case will user events be delivered to a widget outside +the modal widget. +</para> +<para> +<!-- .LP --> +Menus can pop up submenus, and dialog boxes can pop up further dialog +boxes to create a pop-up cascade. +In this case, +user events may be delivered to one of several modal widgets in the cascade. +</para> +<para> +<!-- .LP --> +Display-related events should be delivered outside the modal cascade so that +exposure events and the like keep the application's display up-to-date. +Any event that occurs within the cascade is delivered as usual. +The user events delivered to the most recent spring-loaded shell +in the cascade when they occur outside the cascade are called remap events +and are +<function>KeyPress ,</function> +<function>KeyRelease ,</function> +<function>ButtonPress ,</function> +and +<function>ButtonRelease .</function> +The user events ignored when they occur outside the cascade are +<function>MotionNotify</function> +and +<function>EnterNotify .</function> +All other events are delivered normally. +In particular, note that this is one +way in which widgets can receive +<function>LeaveNotify</function> +events without first receiving +<function>EnterNotify</function> +events; they should be prepared to deal with +this, typically by ignoring any unmatched +<function>LeaveNotify</function> +events. +</para> +<para> +<!-- .LP --> +<function>XtPopup</function> +uses the +<function>XtAddGrab</function> +and +<function>XtRemoveGrab</function> +functions to constrain user events to a modal cascade +and subsequently to remove a grab when the modal widget is popped down. + +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To constrain or redirect user input to a modal widget, use +<function>XtAddGrab .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddGrab" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddGrab(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>exclusive</emphasis>, <emphasis remap='I'>spring_loaded</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>exclusive</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>spring_loaded</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget to add to the modal cascade. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>exclusive</emphasis> + </term> + <listitem> + <para> +Specifies whether user events should be dispatched exclusively to this widget +or also to previous widgets in the cascade. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>spring_loaded</emphasis> + </term> + <listitem> + <para> +Specifies whether this widget was popped up because the user pressed +a pointer button. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAddGrab</function> +function appends the widget to the modal cascade +and checks that <emphasis remap='I'>exclusive</emphasis> is +<function>True</function> +if <emphasis remap='I'>spring_loaded</emphasis> is +<function>True .</function> +If this condition is not met, +<function>XtAddGrab</function> +generates a warning message. +</para> +<para> +<!-- .LP --> +The modal cascade is used by +<function>XtDispatchEvent</function> +when it tries to dispatch a user event. +When at least one modal widget is in the widget cascade, +<function>XtDispatchEvent</function> +first determines if the event should be delivered. +It starts at the most recent cascade entry and follows the cascade up to and +including the most recent cascade entry added with the <emphasis remap='I'>exclusive</emphasis> parameter +<function>True .</function> +</para> +<para> +<!-- .LP --> +This subset of the modal cascade along with all descendants of these widgets +comprise the active subset. +User events that occur outside the widgets in this subset are ignored +or remapped. +Modal menus with submenus generally add a submenu widget to the cascade +with <emphasis remap='I'>exclusive</emphasis> +<function>False .</function> +Modal dialog boxes that need to restrict user input to the most deeply nested +dialog box add a subdialog widget to the cascade with <emphasis remap='I'>exclusive</emphasis> +<function>True .</function> +User events that occur within the active subset are delivered to the +appropriate widget, which is usually a child or further descendant of the modal +widget. +</para> +<para> +<!-- .LP --> +Regardless of where in the application they occur, +remap events are always delivered to the most recent widget in the active +subset of the cascade registered with <emphasis remap='I'>spring_loaded</emphasis> +<function>True ,</function> +if any such widget exists. +If the event +occurred in the active subset of the cascade but outside the +spring-loaded widget, it is delivered normally before being +delivered also to the spring-loaded widget. +Regardless of where it is dispatched, the (xI do not modify +the contents of the event. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove the redirection of user input to a modal widget, use +<function>XtRemoveGrab .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveGrab" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveGrab(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget to remove from the modal cascade. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveGrab</function> +function removes widgets from the modal cascade starting +at the most recent widget up to and including the specified widget. +It issues a warning if the specified widget is not on the modal cascade. + +</para> +<sect3 id="Requesting_Key_and_Button_Grabs"> +<title>Requesting Key and Button Grabs</title> +<!-- .XS --> +<!-- <function>(SN Requesting Key and Button Grabs</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide a set of key and button grab interfaces that +are parallel to those provided by Xlib and that allow the (xI +to modify event dispatching when necessary. (tk applications and +widgets that need to passively grab keys or buttons or actively grab +the keyboard or pointer should use the +following (xI routines rather than the corresponding Xlib +routines. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To passively grab a single key of the keyboard, use +<function>XtGrabKey .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGrabKey" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGrabKey(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>keycode</emphasis>, <emphasis remap='I'>modifiers</emphasis>, \ +<emphasis remap='I'>owner_events</emphasis>, <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + KeyCode <emphasis remap='I'>keycode</emphasis>; +<!-- .br --> + Modifiers <emphasis remap='I'>modifiers</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>owner_events</emphasis>; +<!-- .br --> + int <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget in whose window the key is to be grabbed. (cI +<!-- .sp 6p --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keycode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>owner_events</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>pointer_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keyboard_mode</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XGrabKey ;</function> +see Section 12.2 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGrabKey</function> +calls +<function>XGrabKey</function> +specifying the widget's window as the grab +window if the widget is realized. The remaining arguments are exactly +as for +<function>XGrabKey .</function> +If the widget is not realized, or is later unrealized, the call to +<function>XGrabKey</function> +is performed (again) when +the widget is realized and its window becomes mapped. In the future, +if +<function>XtDispatchEvent</function> +is called with a +<function>KeyPress</function> +event matching the specified keycode and modifiers (which may be +<function>AnyKey</function> +or +<function>AnyModifier ,</function> +respectively) for the +widget's window, the (xI will call +<function>XtUngrabKeyboard</function> +with the timestamp from the +<function>KeyPress</function> +event if either of the following conditions is true: +</para> +<itemizedlist> + <listitem> + <para> +There is a modal cascade and the widget is not in +the active subset of the cascade and the keyboard was not previously +grabbed, or + </para> + </listitem> + <listitem> + <para> +<function>XFilterEvent</function> +returns +<function>True .</function> + +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To cancel a passive key grab, use +<function>XtUngrabKey .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUngrabKey" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUngrabKey(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>keycode</emphasis><emphasis remap='I'>, modifiers</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + KeyCode <emphasis remap='I'>keycode</emphasis>; +<!-- .br --> + Modifiers <emphasis remap='I'>modifiers</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget in whose window the key was grabbed. +<!-- .sp 6p --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keycode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XUngrabKey ;</function> +see Section 12.2 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtUngrabKey</function> +procedure calls +<function>XUngrabKey</function> +specifying the widget's +window as the ungrab window if the widget is realized. The remaining +arguments are exactly as for +<function>XUngrabKey .</function> +If the widget is not realized, +<function>XtUngrabKey</function> +removes a deferred +<function>XtGrabKey</function> +request, if any, for the specified widget, keycode, and modifiers. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To actively grab the keyboard, use +<function>XtGrabKeyboard .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGrabKeyboard" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +int XtGrabKeyboard(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>owner_events</emphasis>, <emphasis remap='I'>pointer_mode</emphasis>, \ +<emphasis remap='I'>keyboard_mode</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>owner_events</emphasis>; +<!-- .br --> + int <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .br --> +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget for whose window the keyboard is to be grabbed. +(cI +<!-- .sp 6p --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>owner_events</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>pointer_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keyboard_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XGrabKeyboard ;</function> +see Section 12.2 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If the specified widget is realized, +<function>XtGrabKeyboard</function> +calls +<function>XGrabKeyboard</function> +specifying the widget's window as the grab window. The remaining +arguments and return value are exactly as for +<function>XGrabKeyboard .</function> +If the widget is not realized, +<function>XtGrabKeyboard</function> +immediately returns +<function>GrabNotViewable .</function> +No future automatic ungrab is implied by +<function>XtGrabKeyboard .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To cancel an active keyboard grab, use +<function>XtUngrabKeyboard .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUngrabKeyboard" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUngrabKeyboard(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget that has the active keyboard grab. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the additional argument to +<function>XUngrabKeyboard ;</function> +see Section 12.2 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtUngrabKeyboard</function> +calls +<function>XUngrabKeyboard</function> +with the specified time. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To passively grab a single pointer button, use +<function>XtGrabButton .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGrabButton" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGrabButton(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>button</emphasis>, <emphasis remap='I'>modifiers</emphasis>, \ +<emphasis remap='I'>owner_events</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>pointer_mode</emphasis>, + <emphasis remap='I'>keyboard_mode</emphasis>, <emphasis remap='I'>confine_to</emphasis>, <emphasis remap='I'>cursor</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + int <emphasis remap='I'>button</emphasis>; +<!-- .br --> + Modifiers <emphasis remap='I'>modifiers</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>owner_events</emphasis>; +<!-- .br --> + unsigned int <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + int <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>; +<!-- .br --> + Window <emphasis remap='I'>confine_to</emphasis>; +<!-- .br --> + Cursor <emphasis remap='I'>cursor</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget in whose window the button is to be grabbed. (cI +<!-- .sp 6p --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>button</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>owner_events</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>pointer_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keyboard_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>confine_to</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>cursor</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XGrabButton ;</function> +see Section 12.1 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGrabButton</function> +calls +<function>XGrabButton</function> +specifying the widget's window as the +grab window if the widget is realized. The remaining arguments are +exactly as for +<function>XGrabButton .</function> +If the widget is not realized, or is later unrealized, the call to +<function>XGrabButton</function> +is performed (again) +when the widget is realized and its window becomes mapped. In the +future, if +<function>XtDispatchEvent</function> +is called with a +<function>ButtonPress</function> +event matching the specified button and modifiers (which may be +<function>AnyButton</function> +or +<function>AnyModifier ,</function> +respectively) +for the widget's window, the (xI will call +<function>XtUngrabPointer</function> +with the timestamp from the +<function>ButtonPress</function> +event if either of the following conditions is true: +</para> +<itemizedlist> + <listitem> + <para> +There is a modal cascade and the +widget is not in the active subset of the cascade and the pointer was +not previously grabbed, or + </para> + </listitem> + <listitem> + <para> +<function>XFilterEvent</function> +returns +<function>True .</function> + +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +To cancel a passive button grab, use +<function>XtUngrabButton .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUngrabButton" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUngrabButton(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>button</emphasis>, <emphasis remap='I'>modifiers</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + unsigned int <emphasis remap='I'>button</emphasis>; +<!-- .br --> + Modifiers <emphasis remap='I'>modifiers</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget in whose window the button was grabbed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>button</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XUngrabButton ;</function> +see Section 12.1 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtUngrabButton</function> +procedure calls +<function>XUngrabButton</function> +specifying the +widget's window as the ungrab window if the widget is realized. The +remaining arguments are exactly as for +<function>XUngrabButton .</function> +If the widget is not realized, +<function>XtUngrabButton</function> +removes a deferred +<function>XtGrabButton</function> +request, if any, for the specified widget, button, and modifiers. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To actively grab the pointer, use +<function>XtGrabPointer .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGrabPointer" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +int XtGrabPointer(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>owner_events</emphasis>, <emphasis remap='I'>event_mask</emphasis>, \ +<emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>, + <emphasis remap='I'>confine_to</emphasis>, <emphasis remap='I'>cursor</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>owner_events</emphasis>; +<!-- .br --> + unsigned int <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + int <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>; +<!-- .br --> + Window <emphasis remap='I'>confine_to</emphasis>; +<!-- .br --> + Cursor <emphasis remap='I'>cursor</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget for whose window the pointer is to be grabbed. (cI +<!-- .sp 6p --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>owner_events</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>pointer_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keyboard_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>confine_to</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>cursor</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XGrabPointer ;</function> +see Section 12.1 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If the specified widget is realized, +<function>XtGrabPointer</function> +calls +<function>XGrabPointer ,</function> +specifying the widget's window as the grab window. The remaining +arguments and return value are exactly as for +<function>XGrabPointer .</function> +If the widget is not realized, +<function>XtGrabPointer</function> +immediately returns +<function>GrabNotViewable .</function> +No future automatic ungrab is implied by +<function>XtGrabPointer .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To cancel an active pointer grab, use +<function>XtUngrabPointer .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUngrabPointer" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUngrabPointer(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget that has the active pointer grab. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the time argument to +<function>XUngrabPointer ;</function> +see Section 12.1 in <emphasis remap='I'>(xL</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtUngrabPointer</function> +calls +<function>XUngrabPointer</function> +with the specified time. + +</para> +</sect3> +</sect2> +<sect2 id="Focusing_Events_on_a_Child"> +<title>Focusing Events on a Child</title> +<!-- .XS --> +<!-- <function>(SN Focusing Events on a Child</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To redirect keyboard input to a normal descendant of a +widget without calling +<function>XSetInputFocus ,</function> +use +<function>XtSetKeyboardFocus .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetKeyboardFocus" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetKeyboardFocus(<emphasis remap='I'>subtree</emphasis>\, <emphasis remap='I'>descendant</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>subtree</emphasis>, <emphasis remap='I'>descendant</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>subtree</emphasis> + </term> + <listitem> + <para> +Specifies the subtree of the hierarchy for which the keyboard focus is +to be set. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>descendant</emphasis> + </term> + <listitem> + <para> +Specifies either the normal (non-pop-up) descendant of <emphasis remap='I'>subtree</emphasis> to which +keyboard events are logically directed, or +<function>None .</function> +It is not an error to specify +<function>None</function> +when no input focus was previously set. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtSetKeyboardFocus</function> +causes +<function>XtDispatchEvent</function> +to remap keyboard events occurring within the specified subtree +and dispatch them to the specified descendant widget or to an ancestor. +If the descendant's class is not a subclass of Core, the descendant is +replaced by its closest windowed ancestor. +</para> +<para> +<!-- .LP --> +When there is no modal cascade, keyboard events can be dispatched +to a widget in one of five ways. Assume the server delivered the +event to the window for widget E (because of X input focus, key or +keyboard grabs, or pointer position). +</para> +<itemizedlist> + <listitem> + <para> +If neither E nor any of E's ancestors have redirected the keyboard +focus, or if the event activated a grab for E as specified by a call +to +<function>XtGrabKey</function> +with any value of <emphasis remap='I'>owner_events</emphasis>, or +if the keyboard is actively grabbed by E with <emphasis remap='I'>owner_events</emphasis> +<function>False</function> +via +<function>XtGrabKeyboard</function> +or +<function>XtGrabKey</function> +on a previous key press, the event is dispatched to E. + </para> + </listitem> + <listitem> + <para> +Beginning with the ancestor of E closest to the root that has +redirected the keyboard focus or E if no such ancestor exists, if +the target of that focus redirection has in turn redirected the +keyboard focus, recursively follow this focus chain to find a widget +F that has not redirected focus. +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +If E is the final focus target widget F or a descendant of F, the +event is dispatched to E. + </para> + </listitem> + <listitem> + <para> +If E is not F, an ancestor of F, or a descendant of F, and the event +activated a grab for E as specified by a call to +<function>XtGrabKey</function> +for E, +<function>XtUngrabKeyboard</function> +is called. + </para> + </listitem> + <listitem> + <para> +If E is an ancestor of F, and the event is a key press, and either +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +E has grabbed the key with +<function>XtGrabKey</function> +and <emphasis remap='I'>owner_events</emphasis> +<function>False ,</function> +or + </para> + </listitem> + <listitem> + <para> +E has grabbed the key with +<function>XtGrabKey</function> +and <emphasis remap='I'>owner_events</emphasis> +<function>True ,</function> +and the coordinates of the event are outside the rectangle specified +by E's geometry, +<!-- .RE --> +then the event is dispatched to E. + </para> + </listitem> + <listitem> + <para> +Otherwise, define A as the closest common ancestor of E and F: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +If there is an active keyboard grab for any widget via either +<function>XtGrabKeyboard</function> +or +<function>XtGrabKey</function> +on a previous key press, or +if no widget between F and A (noninclusive) has grabbed +the key and modifier combination with +<function>XtGrabKey</function> +and any value of <emphasis remap='I'>owner_events</emphasis>, the event is dispatched to F. + </para> + </listitem> + <listitem> + <para> +Else, the event is dispatched to the ancestor of F closest to A +that has grabbed the key and modifier combination with +<function>XtGrabKey .</function> +<!-- .RE --> +<!-- .RE --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +When there is a modal cascade, if the final destination widget as +identified above is in the active subset of the cascade, the event is +dispatched; otherwise the event is remapped to a spring-loaded shell +or discarded. +Regardless of where it is dispatched, the (xI do not modify +the contents of the event. +</para> +<para> +<!-- .LP --> +When <emphasis remap='I'>subtree</emphasis> or one of its descendants acquires the X input focus +or the pointer moves into the subtree such that keyboard events would +now be delivered to the subtree, a +<function>FocusIn</function> +event is generated for the descendant if +<function>FocusChange</function> +events have been selected by the descendant. +Similarly, when <emphasis remap='I'>subtree</emphasis> loses the X input focus +or the keyboard focus for one of its ancestors, a +<function>FocusOut</function> +event is generated for descendant if +<function>FocusChange</function> +events have been selected by the descendant. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +A widget tree may also actively manage the X server input focus. To +do so, a widget class specifies an accept_focus procedure. +</para> +<para> +<!-- .LP --> +<!-- .IN "accept_focus procedure" --> +The accept_focus procedure pointer is of type +<function>XtAcceptFocusProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAcceptFocusProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtAcceptFocusProc)(Widget, Time*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Time *<emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the X time of the event causing the accept focus. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Widgets that need the input focus can call +<function>XSetInputFocus</function> +explicitly, pursuant to the restrictions of the <emphasis remap='I'>(xC</emphasis>. +To allow outside agents, such as the parent, +to cause a widget to take the input focus, +every widget exports an accept_focus procedure. +The widget returns a value indicating +whether it actually took the focus or not, +so that the parent can give the focus to another widget. +Widgets that need to know when they lose the input focus must use +the Xlib focus notification mechanism explicitly +(typically by specifying translations for +<function>FocusIn</function> +and +<function>FocusOut</function> +events). +Widgets classes that never want the input focus should set the +<emphasis remap='I'>accept_focus</emphasis> field to NULL. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call a widget's accept_focus procedure, use +<function>XtCallAcceptFocus .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallAcceptFocus" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtCallAcceptFocus(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Time *<emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the X time of the event that is causing the focus change. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCallAcceptFocus</function> +function calls the specified widget's accept_focus procedure, +passing it the specified widget and time, and returns what the accept_focus +procedure returns. +If <emphasis remap='I'>accept_focus</emphasis> is NULL, +<function>XtCallAcceptFocus</function> +returns +<function>False .</function> + +</para> +<sect3 id="Events_for_Drawables_That_Are_Not_a_Widget_s_Window"> +<title>Events for Drawables That Are Not a Widget's Window</title> +<!-- .XS --> +<!-- <function>(SN Events for Drawables That Are Not a Widget's Window</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Sometimes an application must handle events for drawables that are not +associated with widgets in its widget tree. Examples include handling +<function>GraphicsExpose</function> +and +<function>NoExpose</function> +events on Pixmaps, and handling +<function>PropertyNotify</function> +events on the root window. +</para> +<para> +<!-- .LP --> +To register a drawable with the (xI event dispatching, use +<function>XtRegisterDrawable .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRegisterDrawable" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRegisterDrawable(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>drawable</emphasis>, <emphasis remap='I'>widget</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + Drawable <emphasis remap='I'>drawable</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the drawable's display. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>drawable</emphasis> + </term> + <listitem> + <para> +Specifies the drawable to register. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget to register the drawable for. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtRegisterDrawable</function> +associates the specified drawable with the specified widget +so that future calls to +<function>XtWindowToWidget</function> +with the drawable will return the widget. +The default event dispatcher will dispatch future events that +arrive for the drawable to the widget in the same manner as +events that contain the widget's window. +</para> +<para> +<!-- .LP --> +If the drawable is already registered with another widget, or if the +drawable is the window of a widget in the client's widget tree, the +results of calling +<function>XtRegisterDrawable</function> +are undefined. + +</para> +<para> +<!-- .LP --> +To unregister a drawable with the Intrinsics event dispatching, use +<function>XtUnregisterDrawable .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUnregisterDrawable" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUnregisterDrawable(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>drawable</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + Drawable <emphasis remap='I'>drawable</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the drawable's display. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>drawable</emphasis> + </term> + <listitem> + <para> +Specifies the drawable to unregister. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtUnregisterDrawable</function> +removes an association created with +<function>XtRegisterDrawable .</function> +If the drawable is the window of a widget in the client's widget tree +the results of calling +<function>XtUnregisterDrawable</function> +are undefined. + +</para> +</sect3> +</sect2> +<sect2 id="Querying_Event_Sources"> +<title>Querying Event Sources</title> +<!-- .XS --> +<!-- <function>(SN Querying Event Sources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The event manager provides several functions to examine and read events +(including file and timer events) that are in the queue. +The next three functions are (xI equivalents of the +<function>XPending ,</function> +<function>XPeekEvent ,</function> +and +<function>XNextEvent</function> +Xlib calls. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "Events" --> +To determine if there are any events on the input queue for a given application, +use +<function>XtAppPending .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppPending" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtInputMask XtAppPending(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application to check. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppPending</function> +function returns a nonzero value if there are +events pending from the X server, timer pending, other input sources +pending, or signal sources pending. The +value returned is a bit mask that is the OR of +<function>XtIMXEvent ,</function> +<function>XtIMTimer ,</function> +<function>XtIMAlternateInput ,</function> +and +<function>XtIMSignal</function> +(see +<function>XtAppProcessEvent ).</function> +If there are no events pending, +<function>XtAppPending</function> +flushes the output buffers of each Display in the application context +and returns zero. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To return the event from the head of a given application's input queue +without removing input from the queue, use +<function>XtAppPeekEvent .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppPeekEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtAppPeekEvent(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>event_return</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_return</emphasis> + </term> + <listitem> + <para> +Returns the event information to the specified event structure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If there is an X event in the queue, +<function>XtAppPeekEvent</function> +copies it into <emphasis remap='I'>event_return</emphasis> and returns +<function>True .</function> +If no X input is on the queue, +<function>XtAppPeekEvent</function> +flushes the output buffers of each Display in the application context +and blocks until some input is available +(possibly calling some timeout callbacks in the interim). +If the next available input is an X event, +<function>XtAppPeekEvent</function> +fills in <emphasis remap='I'>event_return</emphasis> and returns +<function>True .</function> +Otherwise, the input is for an input source +registered with +<function>XtAppAddInput ,</function> +and +<function>XtAppPeekEvent</function> +returns +<function>False .</function> +<!-- .FS --> +The sample implementations provides XtAppPeekEvent as described. Timeout callbacks +are called while blocking for input. If some input for an input source is +available, +<function>XtAppPeekEvent</function> +will return +<function>True</function> +without returning an event. +<!-- .FE --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove and return the event +from the head of a given application's X event queue, +use +<function>XtAppNextEvent .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppNextEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppNextEvent(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>event_return</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_return</emphasis> + </term> + <listitem> + <para> +Returns the event information to the specified event structure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If the X event queue is empty, +<function>XtAppNextEvent</function> +flushes the X output buffers of each Display in the application context +and waits for an X event while looking at the other input sources +and timeout values and calling any callback procedures triggered by them. +This wait time can be used for background processing; +see Section 7.8. + +</para> +</sect2> +<sect2 id="Dispatching_Events"> +<title>Dispatching Events</title> +<!-- .XS --> +<!-- <function>(SN Dispatching Events</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide functions that dispatch events +to widgets or other application code. +Every client interested in X events on a widget uses +<function>XtAddEventHandler</function> +to register which events it is +interested in and a procedure (event handler) to be called +when the event happens in that window. +The translation manager automatically registers event handlers for widgets +that use translation tables; see Chapter 10. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +Applications that need direct control of the processing of different types +of input should use +<function>XtAppProcessEvent .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppProcessEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppProcessEvent(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>mask</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtInputMask <emphasis remap='I'>mask</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the +application for which to process input. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>mask</emphasis> + </term> + <listitem> + <para> +Specifies what types of events to process. +The mask is the bitwise inclusive OR of any combination of +<function>XtIMXEvent ,</function> +<function>XtIMTimer ,</function> +<function>XtIMAlternateInput ,</function> +and +<function>XtIMSignal .</function> +As a convenience, +<function>Intrinsic.h</function> +defines the symbolic name +<function>XtIMAll</function> +to be the bitwise inclusive OR of these four event types. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppProcessEvent</function> +function processes one timer, input source, signal source, or X event. +If there is no event or input of the appropriate type to process, then +<function>XtAppProcessEvent</function> +blocks until there is. +If there is more than one type of input available to process, +it is undefined which will get processed. +Usually, this procedure is not called by client applications; see +<function>XtAppMainLoop .</function> +<function>XtAppProcessEvent</function> +processes timer events by calling any appropriate timer callbacks, +input sources by calling any appropriate input callbacks, +signal source by calling any appropriate signal callbacks, +and X events by +calling +<function>XtDispatchEvent .</function> +</para> +<para> +<!-- .LP --> +When an X event is received, +it is passed to +<function>XtDispatchEvent ,</function> +which calls the appropriate event handlers +and passes them the widget, the event, and client-specific data +registered with each procedure. +If no handlers for that event are registered, +the event is ignored and the dispatcher simply returns. + +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To dispatch an event returned by +<function>XtAppNextEvent ,</function> +retrieved directly from the Xlib queue, or synthetically constructed, +to any registered event filters or event handlers, call +<function>XtDispatchEvent .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDispatchEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtDispatchEvent(<emphasis remap='I'>event</emphasis>) +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the event structure to be dispatched +to the appropriate event handlers. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDispatchEvent</function> +function first calls +<function>XFilterEvent</function> +with the <emphasis remap='I'>event</emphasis> and the window of the widget to which the +(xI intend to dispatch the event, or the event window if +the (xI would not dispatch the event to any handlers. +If +<function>XFilterEvent</function> +returns +<function>True</function> +and the event activated a server grab as identified +by a previous call to +<function>XtGrabKey</function> +or +<function>XtGrabButton ,</function> +<function>XtDispatchEvent</function> +calls +<function>XtUngrabKeyboard</function> +or +<function>XtUngrabPointer</function> +with the timestamp from the event and immediately returns +<function>True .</function> +If +<function>XFilterEvent</function> +returns +<function>True</function> +and a grab was not activated, +<function>XtDispatchEvent</function> +just immediately returns +<function>True .</function> +Otherwise, +<function>XtDispatchEvent</function> +sends the event to the event handler functions that +have been previously registered with the dispatch routine. +<function>XtDispatchEvent</function> +returns +<function>True</function> +if +<function>XFilterEvent</function> +returned +<function>True ,</function> +or if the event was dispatched to some handler, and +<function>False</function> +if it found no handler to which to dispatch the event. +<function>XtDispatchEvent</function> +records the last timestamp in any event that +contains a timestamp (see +<function>XtLastTimestampProcessed ),</function> +regardless of whether it was filtered or dispatched. +If a modal cascade is active with <emphasis remap='I'>spring_loaded</emphasis> +<function>True ,</function> +and if the event is a remap event as defined by +<function>XtAddGrab ,</function> +<function>XtDispatchEvent</function> +may dispatch the event a second time. If it does so, +<function>XtDispatchEvent</function> +will call +<function>XFilterEvent</function> +again with the window of the spring-loaded widget prior to the second +dispatch, and if +<function>XFilterEvent</function> +returns +<function>True ,</function> +the second dispatch will not be performed. + +</para> +</sect2> +<sect2 id="The_Application_Input_Loop"> +<title>The Application Input Loop</title> +<!-- .XS --> +<!-- <function>(SN The Application Input Loop</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To process all input from a given application in a continuous loop, +use the convenience procedure +<function>XtAppMainLoop .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppMainLoop" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppMainLoop(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppMainLoop</function> +function first reads the next incoming X event by calling +<function>XtAppNextEvent</function> +and then dispatches the event to the appropriate registered procedure +by calling +<function>XtDispatchEvent .</function> +This constitutes the main loop of (tk applications. +There is nothing special about +<function>XtAppMainLoop ;</function> +it simply calls +<function>XtAppNextEvent</function> +and then +<function>XtDispatchEvent</function> +in a conditional loop. +At the bottom of the loop, it checks to see if the specified +application context's destroy flag is set. +If the flag is set, the loop breaks. +The whole loop is enclosed between a matching +<function>XtAppLock</function> +and +<function>XtAppUnlock .</function> +</para> +<para> +<!-- .LP --> +Applications can provide their own version of this loop, +which tests some global termination flag or tests that the number +of top-level widgets is larger than zero before circling back to the call to +<function>XtAppNextEvent .</function> + +</para> +</sect2> +<sect2 id="Setting_and_Checking_the_Sensitivity_State_of_a_Widget"> +<title>Setting and Checking the Sensitivity State of a Widget</title> +<!-- .XS --> +<!-- <function>(SN Setting and Checking the Sensitivity State of a Widget</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Many widgets have a mode in which they assume a different appearance +(for example, are grayed out or stippled), do not respond to user events, +and become dormant. +</para> +<para> +<!-- .LP --> +When dormant, +a widget is considered to be insensitive. +If a widget is insensitive, +the event manager does not dispatch any events to the widget +with an event type of +<function>KeyPress ,</function> +<function>KeyRelease ,</function> +<function>ButtonPress ,</function> +<function>ButtonRelease ,</function> +<function>MotionNotify ,</function> +<function>EnterNotify ,</function> +<function>LeaveNotify ,</function> +<function>FocusIn ,</function> +or +<function>FocusOut .</function> +</para> +<para> +<!-- .LP --> +A widget can be insensitive because its <emphasis remap='I'>sensitive</emphasis> field is +<function>False</function> +or because one of its ancestors is insensitive and thus the widget's +<emphasis remap='I'>ancestor_sensitive</emphasis> field also is +<function>False .</function> +A widget can but does not need to distinguish these two cases visually. +<!-- .NT --> +Pop-up shells will have +<emphasis remap='I'>ancestor_sensitive</emphasis> +<function>False</function> +if the parent was insensitive when the shell +was created. Since +<function>XtSetSensitive</function> +on the parent will not +modify the resource of the pop-up child, clients are advised to include +a resource specification of the form +``*TransientShell.ancestorSensitive: True'' +in the application defaults resource file or to +otherwise ensure that the parent is +sensitive when creating pop-up shells. +<!-- .NE --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To set the sensitivity state of a widget, use +<function>XtSetSensitive .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetSensitive" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetSensitive(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>sensitive</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>sensitive</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>sensitive</emphasis> + </term> + <listitem> + <para> +Specifies whether the widget should receive +keyboard, pointer, and focus events. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSetSensitive</function> +function first calls +<function>XtSetValues</function> +on the current widget with an argument list specifying the +XtNsensitive resource and the new value. +If <emphasis remap='I'>sensitive</emphasis> is +<function>False</function> +and the widget's class is a subclass of +Composite, +<function>XtSetSensitive</function> +recursively propagates the new value +down the child tree by calling +<function>XtSetValues</function> +on each child to set <emphasis remap='I'>ancestor_sensitive</emphasis> to +<function>False .</function> +If <emphasis remap='I'>sensitive</emphasis> is +<function>True</function> +and the widget's class is a subclass of +Composite +and the widget's <emphasis remap='I'>ancestor_sensitive</emphasis> field is +<function>True ,</function> +<function>XtSetSensitive</function> +sets the <emphasis remap='I'>ancestor_sensitive</emphasis> of each child to +<function>True</function> +and then recursively calls +<function>XtSetValues</function> +on each normal descendant that is now sensitive to set +<emphasis remap='I'>ancestor_sensitive</emphasis> to +<function>True .</function> +</para> +<para> +<!-- .LP --> +<function>XtSetSensitive</function> +calls +<function>XtSetValues</function> +to change the <emphasis remap='I'>sensitive</emphasis> and <emphasis remap='I'>ancestor_sensitive</emphasis> fields +of each affected widget. +Therefore, when one of these changes, +the widget's set_values procedure should +take whatever display actions are needed +(for example, graying out or stippling the widget). +</para> +<para> +<!-- .LP --> +<function>XtSetSensitive</function> +maintains the invariant that, if the parent has either <emphasis remap='I'>sensitive</emphasis> +or <emphasis remap='I'>ancestor_sensitive</emphasis> +<function>False ,</function> +then all children have <emphasis remap='I'>ancestor_sensitive</emphasis> +<function>False .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To check the current sensitivity state of a widget, +use +<function>XtIsSensitive .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtIsSensitive" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtIsSensitive(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the object. (oI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtIsSensitive</function> +function returns +<function>True</function> +or +<function>False</function> +to indicate whether user input events are being dispatched. +If object's class is a subclass of RectObj and +both <emphasis remap='I'>sensitive</emphasis> and <emphasis remap='I'>ancestor_sensitive</emphasis> are +<function>True ,</function> +<function>XtIsSensitive</function> +returns +<function>True ;</function> +otherwise, it returns +<function>False .</function> + +</para> +</sect2> +<sect2 id="Adding_Background_Work_Procedures"> +<title>Adding Background Work Procedures</title> +<!-- .XS --> +<!-- <function>(SN Adding Background Work Procedures</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI have some limited support for background processing. +Because most applications spend most of their time waiting for input, +you can register an idle-time work procedure +that is called when the toolkit would otherwise block in +<function>XtAppNextEvent</function> +or +<function>XtAppProcessEvent .</function> +Work procedure pointers are of type +<function>XtWorkProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWorkProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtWorkProc)(XtPointer); +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Passes the client data specified when the work procedure was registered. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure should return +<function>True</function> +when it is done to indicate that it +should be removed. +If the procedure returns +<function>False ,</function> +it will remain registered and called again when the +application is next idle. +Work procedures should be very judicious about how much they do. +If they run for more than a small part of a second, +interactive feel is likely to suffer. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a work procedure for a given application, use +<function>XtAppAddWorkProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddWorkProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtWorkProcId XtAppAddWorkProc(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtWorkProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that identifies the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called when the application is idle. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the argument passed to the specified procedure +when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppAddWorkProc</function> +function adds the specified work procedure for the application identified +by <emphasis remap='I'>app_context</emphasis> +and returns an opaque unique identifier for this work procedure. +Multiple work procedures can be registered, +and the most recently added one is always the one that is called. +However, if a work procedure adds another work procedure, +the newly added one has lower priority than the current one. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove a work procedure, either return +<function>True</function> +from the procedure when it is called or use +<function>XtRemoveWorkProc</function> +outside of the procedure. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveWorkProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveWorkProc(<emphasis remap='I'>id</emphasis>) +<!-- .br --> + XtWorkProcId <emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Specifies which work procedure to remove. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveWorkProc</function> +function explicitly removes the specified background work procedure. + +</para> +</sect2> +<sect2 id="X_Event_Filters"> +<title>X Event Filters</title> +<!-- .XS --> +<!-- (SN X Event Filters --> +<!-- .XE --> +<para> +<!-- .LP --> +The event manager provides filters that can be applied to +specific X events. +The filters, which screen out events that are redundant or are temporarily +unwanted, handle +pointer motion compression, +enter/leave compression, and +exposure compression. + +</para> +<sect3 id="Pointer_Motion_Compression"> +<title>Pointer Motion Compression</title> +<!-- .XS --> +<!-- (SN Pointer Motion Compression --> +<!-- .XE --> +<para> +<!-- .LP --> +Widgets can have a hard time keeping up with a rapid stream of +pointer motion events. Furthermore, +they usually do not care about every motion event. To throw out +redundant motion events, the widget class field <emphasis remap='I'>compress_motion</emphasis> should be +<function>True .</function> +<!-- .IN "compress_motion field" --> +When a request for an event would return a motion event, +the (xI check if there are any other motion events +for the same widget immediately +following the current one and, if so, skip all but the last of them. + +</para> +</sect3> +<sect3 id="Enter_Leave_Compression"> +<title>Enter/Leave Compression</title> +<!-- .XS --> +<!-- (SN Enter/Leave Compression --> +<!-- .XE --> +<para> +<!-- .LP --> +To throw out pairs of enter and leave events that have no intervening events, +as can happen when the user moves the pointer across a widget +without stopping in it, +the widget class field <emphasis remap='I'>compress_enterleave</emphasis> should be +<function>True .</function> +<!-- .IN "compress_enterleave field" --> +These enter and leave events are not delivered to the client +if they are found together in the input queue. + +</para> +</sect3> +<sect3 id="Exposure_Compression"> +<title>Exposure Compression</title> +<!-- .XS --> +<!-- (SN Exposure Compression --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "compress_expose field" --> +Many widgets prefer to process a series of exposure events as a +single expose region rather than as individual rectangles. Widgets +with complex displays might use the expose region as a clip list +in a graphics context, and widgets with simple displays might +ignore the region entirely and redisplay their whole window or +might get the bounding box from the region and redisplay only that +rectangle. +</para> +<para> +<!-- .LP --> +In either case, these widgets do not care about getting partial exposure events. +The <emphasis remap='I'>compress_exposure</emphasis> field in the widget class +structure specifies the type and number of exposure events that are +dispatched to the widget's expose procedure. This field must be +initialized to one of the following values: +<!-- .sp --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA 3i --> +<!-- .ta 3i --> +#define XtExposeNoCompress ((XtEnum)False) +#define XtExposeCompressSeries ((XtEnum)True) +#define XtExposeCompressMultiple <implementation-defined> +#define XtExposeCompressMaximal <implementation-defined> +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +optionally ORed with any combination of the following flags (all with +implementation-defined values): +<function>XtExposeGraphicsExpose ,</function> +<function>XtExposeGraphicsExposeMerged ,</function> +<function>XtExposeNoExpose ,</function> +and +<function>XtExposeNoRegion .</function> + +</para> +<para> +<!-- .LP --> +If the <emphasis remap='I'>compress_exposure</emphasis> field in the widget class structure does not +specify +<function>XtExposeNoCompress ,</function> +the event manager calls the widget's expose procedure only +once for a series of exposure events. +In this case, all +<function>Expose</function> +or +<function>GraphicsExpose</function> +events are accumulated into a region. +When the final event is received, +the event manager replaces the rectangle in the event with the +bounding box for the region +and calls the widget's expose procedure, +passing the modified exposure event and (unless +<function>XtExposeNoRegion</function> +is specified) the region. +For more information on regions, see Section 16.5 in <emphasis remap='I'>(xL</emphasis>.) +</para> +<para> +<!-- .LP --> +The values have the following interpretation: +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<function>XtExposeNoCompress</function> +<!-- .IN "XtExposeNoCompress" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +No exposure compression is performed; every selected event is +individually dispatched to the expose procedure with a <emphasis remap='I'>region</emphasis> +argument of NULL. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtExposeCompressSeries</function> +<!-- .IN "XtExposeCompressSeries" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Each series of exposure events is coalesced into a single event, +which is dispatched +when an exposure event with count equal to zero is reached. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtExposeCompressMultiple</function> +<!-- .IN "XtExposeCompressMultiple" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Consecutive series of exposure events are coalesced into a single +event, which is dispatched +when an exposure event with count equal to zero is reached and either +the event queue is empty or the next event is not an exposure event +for the same widget. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtExposeCompressMaximal</function> +<!-- .IN "XtExposeCompressMaximal" "" "@DEF" --> +</para> +<itemizedlist> + <listitem> + <para> +All expose series currently in the queue for the widget +are coalesced into a single +event without regard to intervening nonexposure events. If a +partial series is in the end of the queue, the (xI will +block until the end of the series is received. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The additional flags have the following meaning: +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<function>XtExposeGraphicsExpose</function> +<!-- .IN "XtExposeGraphicsExpose" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies that +<function>GraphicsExpose</function> +events are also to be dispatched to +the expose procedure. +<function>GraphicsExpose</function> +events are compressed, if specified, in the same manner as +<function>Expose</function> +events. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtExposeGraphicsExposeMerged</function> +<!-- .IN "XtExposeGraphicsExposeMerged" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies in the case of +<function>XtExposeCompressMultiple</function> +and +<function>XtExposeCompressMaximal</function> +that series of +<function>GraphicsExpose</function> +and +<function>Expose</function> +events are to be compressed together, with the final event type +determining the type of the event passed to the expose procedure. +If this flag is not set, then only series of the same event type +as the event at the head of the queue are coalesced. This flag +also implies +<function>XtExposeGraphicsExpose .</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtExposeNoExpose</function> +<!-- .IN "XtExposeNoExpose" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies that +<function>NoExpose</function> +events are also to be dispatched to the expose procedure. +<function>NoExpose</function> +events are never coalesced with +other exposure events or with each other. +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtExposeNoRegion</function> +<!-- .IN "XtExposeNoRegion" "" "@DEF" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies that the final region argument passed to the expose +procedure is NULL. The rectangle in the event will still +contain bounding box information for the entire series of +compressed exposure events. This option saves processing time when the +region is not needed by the widget. + + </para> + </listitem> +</itemizedlist> +</sect3> +</sect2> +<sect2 id="Widget_Exposure_and_Visibility"> +<title>Widget Exposure and Visibility</title> +<!-- .XS --> +<!-- (SN Widget Exposure and Visibility --> +<!-- .XE --> +<para> +<!-- .LP --> +Every primitive widget and some composite widgets display data on the screen +by means of direct Xlib calls. +Widgets cannot simply write to the screen and forget what they have done. +They must keep enough state to redisplay the window or parts +of it if a portion is obscured and then reexposed. + +</para> +<sect3 id="Redisplay_of_a_Widget_The_expose_Procedure"> +<title>Redisplay of a Widget: The expose Procedure</title> +<!-- .XS --> +<!-- (SN Redisplay of a Widget: The expose Procedure --> +<!-- .XE --> +<!-- .IN "expose procedure" --> +<para> +<!-- .LP --> +The expose procedure pointer in a widget class is of type +<function>XtExposeProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtExposeProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtExposeProc)(Widget, XEvent*, Region); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .br --> + Region <emphasis remap='I'>region</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget instance requiring redisplay. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies the exposure event giving the rectangle requiring redisplay. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>region</emphasis> + </term> + <listitem> + <para> +Specifies the union of all rectangles in this exposure sequence. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The redisplay of a widget upon exposure is the responsibility of the +expose procedure in the widget's class record. +If a widget has no display semantics, +it can specify NULL for the <emphasis remap='I'>expose</emphasis> field. +Many composite widgets serve only as containers for their children +and have no expose procedure. +<!-- .NT --> +If the <emphasis remap='I'>expose</emphasis> procedure is NULL, +<function>XtRealizeWidget</function> +fills in a default bit gravity of +<function>NorthWestGravity</function> +before it calls the widget's realize procedure. +<!-- .NE --> +</para> +<para> +<!-- .LP --> +If the widget's <emphasis remap='I'>compress_exposure</emphasis> class field specifies +<function>XtExposeNoCompress</function> +or +<function>XtExposeNoRegion ,</function> +or if the event type is +<function>NoExpose</function> +(see Section 7.9.3), +<emphasis remap='I'>region</emphasis> is NULL. If +<function>XtExposeNoCompress</function> +is not specified and the event type is not +<function>NoExpose ,</function> +the event is the final event in the compressed series +but <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>width</emphasis>, and <emphasis remap='I'>height</emphasis> contain +the bounding box for all the compressed events. +The region is created and destroyed by the (xI, but +the widget is permitted to modify the region contents. +</para> +<para> +<!-- .LP --> +A small simple widget (for example, Label) can ignore the bounding box +information in the event and redisplay the entire window. +A more complicated widget (for example, Text) can use the bounding box +information to minimize the amount of calculation and redisplay it does. +A very complex widget uses the region as a clip list in a GC and +ignores the event information. +The expose procedure is not chained and is therefore +responsible for exposure of all superclass data +as well as its own. +</para> +<para> +<!-- .LP --> +However, +it often is possible to anticipate the display needs of several levels +of subclassing. +For example, rather than implement separate display procedures for +the widgets Label, Pushbutton, and Toggle, +you could write a single display routine in Label that uses display state +fields like +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +Boolean invert; +Boolean highlight; +Dimension highlight_width; +</literallayout> +Label would have <emphasis remap='I'>invert</emphasis> and <emphasis remap='I'>highlight</emphasis> always +<function>False</function> +and <emphasis remap='I'>highlight_width</emphasis> zero. +Pushbutton would dynamically set <emphasis remap='I'>highlight</emphasis> and <emphasis remap='I'>highlight_width</emphasis>, +but it would leave <emphasis remap='I'>invert</emphasis> always +<function>False .</function> +Finally, Toggle would dynamically set all three. +In this case, +the expose procedures for Pushbutton and Toggle inherit +their superclass's expose procedure; +see Section 1.6.10. + +</para> +</sect3> +<sect3 id="Widget_Visibility"> +<title>Widget Visibility</title> +<!-- .XS --> +<!-- (SN Widget Visibility --> +<!-- .XE --> +<para> +<!-- .LP --> +Some widgets may use substantial computing resources to produce the +data they will display. +However, this effort is wasted if the widget is not actually visible +on the screen, that is, if the widget is obscured by another application +or is iconified. +</para> +<para> +<!-- .LP --> +<!-- .IN "Visibility" --> +The <emphasis remap='I'>visible</emphasis> field in the +core +widget structure provides a hint to the widget that it need not compute +display data. +This field is guaranteed to be +<function>True</function> +by the time an +exposure +event is processed if any part of the widget is visible, +but is +<function>False</function> +if the widget is fully obscured. +</para> +<para> +<!-- .LP --> +Widgets can use or ignore the <emphasis remap='I'>visible</emphasis> hint. +If they ignore it, +they should have <emphasis remap='I'>visible_interest</emphasis> in their widget class record set +<function>False .</function> +In such cases, +the <emphasis remap='I'>visible</emphasis> field is initialized +<function>True</function> +and never changes. +If <emphasis remap='I'>visible_interest</emphasis> is +<function>True ,</function> +the event manager asks for +<function>VisibilityNotify</function> +events for the widget and sets <emphasis remap='I'>visible</emphasis> to +<function>True</function> +on +<function>VisibilityUnobscured</function> +or +<function>VisibilityPartiallyObscured</function> +<!-- .IN VisibilityNotify --> +events and +<function>False</function> +on +<function>VisibilityFullyObscured</function> +events. + +</para> +</sect3> +</sect2> +<sect2 id="X_Event_Handlers"> +<title>X Event Handlers</title> +<!-- .XS --> +<!-- (SN X Event Handlers --> +<!-- .XE --> +<para> +<!-- .LP --> +Event handlers are procedures called when specified events +occur in a widget. +Most widgets need not use event handlers explicitly. +Instead, they use the (xI translation manager. +Event handler procedure pointers are of the type +<function>XtEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtEventHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtEventHandler)(Widget, XtPointer, XEvent*, Boolean*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .br --> + Boolean *<emphasis remap='I'>continue_to_dispatch</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which the event arrived. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies any client-specific information registered with the event handler. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies the triggering event. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>continue_to_dispatch</emphasis> + </term> + <listitem> + <para> +Specifies whether the remaining event +handlers registered for the current event +should be called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +After receiving an event and before calling any event handlers, the +Boolean pointed to by <emphasis remap='I'>continue_to_dispatch</emphasis> is initialized to +<function>True .</function> +When an event handler is called, it may decide that further processing +of the event is not desirable and may store +<function>False</function> +in this Boolean, in +which case any handlers remaining to be called for the event are +ignored. +</para> +<para> +<!-- .LP --> +The circumstances under which the (xI may add event handlers +to a widget are currently implementation-dependent. Clients must +therefore be aware that storing +<function>False</function> +into the <emphasis remap='I'>continue_to_dispatch</emphasis> argument can lead to portability problems. + +</para> +<sect3 id="Event_Handlers_That_Select_Events"> +<title>Event Handlers That Select Events</title> +<!-- .XS --> +<!-- (SN Event Handlers That Select Events --> +<!-- .XE --> +<para> +<!-- .LP --> +To register an event handler procedure with the dispatch mechanism, use +<function>XtAddEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddEventHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddEventHandler(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>nonmaskable</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + EventMask <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>nonmaskable</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this event handler is being registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +Specifies the event mask for which to call this procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nonmaskable</emphasis> + </term> + <listitem> + <para> +Specifies whether this procedure should be +called on the nonmaskable events +<function>( GraphicsExpose ,</function> +<function>NoExpose ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +<function>ClientMessage ,</function> +and +<function>MappingNotify ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the event handler. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAddEventHandler</function> +function registers a procedure with the dispatch mechanism that is +to be called when an event that matches the mask occurs on the specified +widget. +Each widget has a single registered event handler list, which will +contain any procedure/client_data pair exactly once regardless of +the manner in which it is registered. +If the procedure is already registered with the same <emphasis remap='I'>client_data</emphasis> +value, +the specified mask augments the existing mask. +If the widget is realized, +<function>XtAddEventHandler</function> +calls +<function>XSelectInput ,</function> +if necessary. +The order in which this procedure is called relative to other handlers +registered for the same event is not defined. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove a previously registered event handler, use +<function>XtRemoveEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveEventHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveEventHandler(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>nonmaskable</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + EventMask <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>nonmaskable</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this procedure is registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +Specifies the event mask for which to unregister this procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nonmaskable</emphasis> + </term> + <listitem> + <para> +Specifies whether this procedure should be +removed on the nonmaskable events +<function>( GraphicsExpose ,</function> +<function>NoExpose ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +<function>ClientMessage ,</function> +and +<function>MappingNotify ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be removed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the registered client data. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveEventHandler</function> +function unregisters an event handler registered with +<function>XtAddEventHandler</function> +or +<function>XtInsertEventHandler</function> +for the specified events. +The request is ignored if <emphasis remap='I'>client_data</emphasis> does not match the value given +when the handler was registered. +If the widget is realized and no other event handler requires the event, +<function>XtRemoveEventHandler</function> +calls +<function>XSelectInput .</function> +If the specified procedure has not been registered +or if it has been registered with a different value of <emphasis remap='I'>client_data</emphasis>, +<function>XtRemoveEventHandler</function> +returns without reporting an error. +</para> +<para> +<!-- .LP --> +To stop a procedure registered with +<function>XtAddEventHandler</function> +or +<function>XtInsertEventHandler</function> +from receiving all selected events, call +<function>XtRemoveEventHandler</function> +with an <emphasis remap='I'>event_mask</emphasis> of +<function>XtAllEvents</function> +and <emphasis remap='I'>nonmaskable</emphasis> +<function>True .</function> +The procedure will continue to receive any events +that have been specified in calls to +<function>XtAddRawEventHandler</function> +or +<function>XtInsertRawEventHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register an event handler procedure that receives events before or +after all previously registered event handlers, use +<function>XtInsertEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtListPosition" "" "@DEF@" --> +<!-- .IN "XtInsertEventHandler" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef enum {XtListHead, XtListTail} XtListPosition; +</literallayout> +</para> +<para> +<!-- .LP --> +</para> +<!-- .FD 0 --> +void XtInsertEventHandler(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>nonmaskable</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>position</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + EventMask <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>nonmaskable</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtListPosition <emphasis remap='I'>position</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this event handler is being registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +Specifies the event mask for which to call this procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nonmaskable</emphasis> + </term> + <listitem> + <para> +Specifies whether this procedure should be +called on the nonmaskable events +<function>( GraphicsExpose ,</function> +<function>NoExpose ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +<function>ClientMessage ,</function> +and +<function>MappingNotify ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the client's event handler. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>position</emphasis> + </term> + <listitem> + <para> +Specifies when the event handler is to be called +relative to other previously registered handlers. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtInsertEventHandler</function> +is identical to +<function>XtAddEventHandler</function> +with the additional <emphasis remap='I'>position</emphasis> argument. If <emphasis remap='I'>position</emphasis> is +<function>XtListHead ,</function> +the event +handler is registered so that it is called before any event +handlers that were previously registered for the same widget. If +<emphasis remap='I'>position</emphasis> is +<function>XtListTail ,</function> +the event handler is registered to be called +after any previously registered event handlers. If the procedure is +already registered with the same <emphasis remap='I'>client_data</emphasis> value, the specified mask +augments the existing mask and the procedure is repositioned in +the list. + +</para> +</sect3> +<sect3 id="Event_Handlers_That_Do_Not_Select_Events"> +<title>Event Handlers That Do Not Select Events</title> +<!-- .XS --> +<!-- (SN Event Handlers That Do Not Select Events --> +<!-- .XE --> +<para> +<!-- .LP --> +On occasion, +clients need to register an event handler procedure with the +dispatch mechanism without explicitly +causing the X server to select for that event. +To do this, use +<function>XtAddRawEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddRawEventHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddRawEventHandler(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>nonmaskable</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + EventMask <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>nonmaskable</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this event handler is being registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +Specifies the event mask for which to call this procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nonmaskable</emphasis> + </term> + <listitem> + <para> +Specifies whether this procedure should be +called on the nonmaskable events +<function>( GraphicsExpose ,</function> +<function>NoExpose ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +<function>ClientMessage ,</function> +and +<function>MappingNotify ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the client's event handler. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAddRawEventHandler</function> +function is similar to +<function>XtAddEventHandler</function> +except that it does not affect the widget's event mask and never causes an +<function>XSelectInput</function> +for its events. +Note that the widget might already have those mask bits set +because of other nonraw event handlers registered on it. +If the procedure is already registered with the same <emphasis remap='I'>client_data</emphasis>, +the specified mask augments the existing mask. +The order in which this procedure is called relative to other handlers +registered for the same event is not defined. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove a previously registered raw event handler, use +<function>XtRemoveRawEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveRawEventHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveRawEventHandler(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>nonmaskable</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + EventMask <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>nonmaskable</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this procedure is registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +Specifies the event mask for which to unregister this procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nonmaskable</emphasis> + </term> + <listitem> + <para> +Specifies whether this procedure should be +removed on the nonmaskable events +<function>( GraphicsExpose ,</function> +<function>NoExpose ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +<function>ClientMessage ,</function> +and +<function>MappingNotify ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the registered client data. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveRawEventHandler</function> +function unregisters an event handler registered with +<function>XtAddRawEventHandler</function> +or +<function>XtInsertRawEventHandler</function> +for the specified events without changing +the window event mask. +The request is ignored if <emphasis remap='I'>client_data</emphasis> does not match the value given +when the handler was registered. +If the specified procedure has not been registered +or if it has been registered with a different value of <emphasis remap='I'>client_data</emphasis>, +<function>XtRemoveRawEventHandler</function> +returns without reporting an error. +</para> +<para> +<!-- .LP --> +To stop a procedure +registered with +<function>XtAddRawEventHandler</function> +or +<function>XtInsertRawEventHandler</function> +from receiving all nonselected events, call +<function>XtRemoveRawEventHandler</function> +with an <emphasis remap='I'>event_mask</emphasis> of +<function>XtAllEvents</function> +and <emphasis remap='I'>nonmaskable</emphasis> +<function>True .</function> +The procedure +will continue to receive any events that have been specified in calls to +<function>XtAddEventHandler</function> +or +<function>XtInsertEventHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register an event handler procedure that receives events before or +after all previously registered event handlers without selecting for +the events, use +<function>XtInsertRawEventHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInsertRawEventHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtInsertRawEventHandler(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>nonmaskable</emphasis>, \ +<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>position</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + EventMask <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>nonmaskable</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtListPosition <emphasis remap='I'>position</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this event handler is being registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +Specifies the event mask for which to call this procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nonmaskable</emphasis> + </term> + <listitem> + <para> +Specifies whether this procedure should be +called on the nonmaskable events +<function>( GraphicsExpose ,</function> +<function>NoExpose ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +<function>ClientMessage ,</function> +and +<function>MappingNotify ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the client's event handler. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>position</emphasis> + </term> + <listitem> + <para> +Specifies when the event handler is to be called +relative to other previously registered handlers. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtInsertRawEventHandler</function> +function is similar to +<function>XtInsertEventHandler</function> +except that it does not modify the widget's event +mask and never causes an +<function>XSelectInput</function> +for the specified events. If +the procedure is already registered with the same <emphasis remap='I'>client_data</emphasis> +value, the +specified mask augments the existing mask and the procedure is +repositioned in the list. + +</para> +</sect3> +<sect3 id="Current_Event_Mask"> +<title>Current Event Mask</title> +<!-- .XS --> +<!-- (SN Current Event Mask --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve the event mask for a given widget, use +<function>XtBuildEventMask .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtBuildEventMask" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +EventMask XtBuildEventMask(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtBuildEventMask</function> +function returns the event mask representing the logical OR +of all event masks for event handlers registered on the widget with +<function>XtAddEventHandler</function> +and +<function>XtInsertEventHandler</function> +and all event translations, including accelerators, +installed on the widget. +This is the same event mask stored into the +<function>XSetWindowAttributes</function> +structure by +<function>XtRealizeWidget</function> +and sent to the server when event handlers and translations are installed or +removed on the realized widget. + +</para> +</sect3> +<sect3 id="Event_Handlers_for_X_Protocol_Extensions"> +<title>Event Handlers for X11 Protocol Extensions</title> +<!-- .XS --> +<!-- <function>(SN Event Handlers for X11 Protocol Extensions</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To register an event handler procedure with the (xI dispatch +mechanism according to an event type, use +<function>XtInsertEventTypeHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInsertEventTypeHandler" "" "@DEF" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtInsertEventTypeHandler(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>event_type</emphasis>, \ +<emphasis remap='I'>select_data</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>position</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + int <emphasis remap='I'>event_type</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>select_data</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtListPosition <emphasis remap='I'>position</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which this event handler is being registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_type</emphasis> + </term> + <listitem> + <para> +Specifies the event type for which to call this event handler. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>select_data</emphasis> + </term> + <listitem> + <para> +Specifies data used to request events of the specified type from the server, +or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the event handler to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the event handler. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>position</emphasis> + </term> + <listitem> + <para> +Specifies when the event handler is to be called relative to other +previously registered handlers. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtInsertEventTypeHandler</function> +registers a procedure with the +dispatch mechanism that is to be called when an event that matches the +specified <emphasis remap='I'>event_type</emphasis> is dispatched to the specified <emphasis remap='I'>widget</emphasis>. +</para> +<para> +<!-- .LP --> +If <emphasis remap='I'>event_type</emphasis> specifies one of the core X protocol events, then +<emphasis remap='I'>select_data</emphasis> must be a pointer to a value of type +<function>EventMask ,</function> +indicating +the event mask to be used to select for the desired event. This event +mask is included in the value returned by +<function>XtBuildEventMask .</function> +If the widget is realized, +<function>XtInsertEventTypeHandler</function> +calls +<function>XSelectInput</function> +if necessary. Specifying NULL for <emphasis remap='I'>select_data</emphasis> is equivalent to +specifying a pointer to an event mask containing 0. This is similar +to the +<function>XtInsertRawEventHandler</function> +function. +</para> +<para> +<!-- .LP --> +If <emphasis remap='I'>event_type</emphasis> specifies an extension event type, then the semantics of +the data pointed to by <emphasis remap='I'>select_data</emphasis> are defined by the extension +selector registered for the specified event type. +</para> +<para> +<!-- .LP --> +In either case the (xI are not required to copy the data +pointed to by <emphasis remap='I'>select_data</emphasis>, so the caller must ensure that it remains +valid as long as the event handler remains registered with this value +of <emphasis remap='I'>select_data</emphasis>. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>position</emphasis> argument allows the client to control the order of +invocation of event handlers registered for the same event type. If +the client does not care about the order, it should normally specify +<function>XtListTail ,</function> +which registers this event handler after any previously +registered handlers for this event type. +</para> +<para> +<!-- .LP --> +Each widget has a single registered event handler list, which will +contain any procedure/client_data pair exactly once if it is +registered with +<function>XtInsertEventTypeHandler ,</function> +regardless of the manner +in which it is registered and regardless of the value(s) +of <emphasis remap='I'>select_data</emphasis>. If the procedure is already registered with the +same <emphasis remap='I'>client_data</emphasis> value, the specified mask augments the existing +mask and the procedure is repositioned in the list. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove an event handler registered with +<function>XtInsertEventTypeHandler ,</function> +use +<function>XtRemoveEventTypeHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveEventTypeHandler" "" "@DEF" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveEventTypeHandler(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>event_type</emphasis>, \ +<emphasis remap='I'>select_data</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + int <emphasis remap='I'>event_type</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>select_data</emphasis>; +<!-- .br --> + XtEventHandler <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget for which the event handler was registered. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_type</emphasis> + </term> + <listitem> + <para> +Specifies the event type for which the handler was registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>select_data</emphasis> + </term> + <listitem> + <para> +Specifies data used to deselect events of the specified type +from the server, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the event handler to be removed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the additional client data with which the procedure was registered. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveEventTypeHandler</function> +function unregisters an event handler +registered with +<function>XtInsertEventTypeHandler</function> +for the specified event type. +The request is ignored if <emphasis remap='I'>client_data</emphasis> does not match the value given +when the handler was registered. +</para> +<para> +<!-- .LP --> +If <emphasis remap='I'>event_type</emphasis> specifies one of the core X protocol events, +<emphasis remap='I'>select_data</emphasis> must be a pointer to a value of type +<function>EventMask, indicating the event</function> +mask to be used to deselect for the appropriate event. If the widget +is realized, +<function>XtRemoveEventTypeHandler</function> +calls +<function>XSelectInput</function> +if necessary. +Specifying NULL for <emphasis remap='I'>select_data</emphasis> is equivalent to specifying a pointer +to an event mask containing 0. This is similar to the +<function>XtRemoveRawEventHandler</function> +function. +</para> +<para> +<!-- .LP --> +If <emphasis remap='I'>event_type</emphasis> specifies an extension event type, then the semantics of +the data pointed to by <emphasis remap='I'>select_data</emphasis> are defined by the extension +selector registered for the specified event type. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to select extension events for a widget, use +<function>XtRegisterExtensionSelector .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRegisterExtensionSelector" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRegisterExtensionSelector(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>min_event_type</emphasis>, \ +<emphasis remap='I'>max_event_type</emphasis>, <emphasis remap='I'>proc</emphasis>, + <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Display <emphasis remap='I'>*display</emphasis>; +<!-- .br --> + int <emphasis remap='I'>min_event_type</emphasis>; +<!-- .br --> + int <emphasis remap='I'>max_event_type</emphasis>; +<!-- .br --> + XtExtensionSelectProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display for which the extension selector is to be registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>min_event_type</emphasis> + </term> + <listitem> + <para> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>max_event_type</emphasis> + </term> + <listitem> + <para> +Specifies the range of event types for the extension. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the extension selector procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the extension selector. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRegisterExtensionSelector</function> +function registers a procedure to arrange +for the delivery of extension events to widgets. +</para> +<para> +<!-- .LP --> +If <emphasis remap='I'>min_event_type</emphasis> and <emphasis remap='I'>max_event_type</emphasis> match the parameters +to a previous call to +<function>XtRegisterExtensionSelector</function> +for the same <emphasis remap='I'>display</emphasis>, then <emphasis remap='I'>proc</emphasis> and <emphasis remap='I'>client_data</emphasis> +replace the previously +registered values. If the range specified by <emphasis remap='I'>min_event_type</emphasis> +and <emphasis remap='I'>max_event_type</emphasis> overlaps the range of the parameters to a +previous call for the same display in any other way, an error results. +</para> +<para> +<!-- .LP --> +When a widget is realized, +after the <emphasis remap='I'>core.realize</emphasis> method is called, +the (xI check to see if any event +handler specifies an event type within the range of a registered +extension selector. If so, the (xI call each such selector. +If an event type handler is added or removed, the (xI check to +see if the event type falls within the range of a registered extension +selector, and if it does, calls the selector. In either case the (xI +pass a list of all the widget's event types that are within the +selector's range. The corresponding select data are also passed. The +selector is responsible for enabling the delivery of extension events +required by the widget. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +An extension selector is of type +<function>XtExtensionSelectProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtExtensionSelectProc" "" "@DEF" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtExtensionSelectProc)(Widget, int *, XtPointer *, int, \ +XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>event_types</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>select_data</emphasis>; +<!-- .br --> + int <emphasis remap='I'>count</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget that is being realized or is having +an event handler added or removed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_types</emphasis> + </term> + <listitem> + <para> +Specifies a list of event types that the widget has +registered event handlers for. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>select_data</emphasis> + </term> + <listitem> + <para> +Specifies a list of the select_data parameters specified in +<function>XtInsertEventTypeHandler .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>count</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the <emphasis remap='I'>event_types</emphasis> and <emphasis remap='I'>select_data</emphasis> +lists. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the additional client data with which the procedure was registered. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>event_types</emphasis> and <emphasis remap='I'>select_data</emphasis> lists will always have the +same number of elements, specified by <emphasis remap='I'>count</emphasis>. +Each event type/select data pair represents one call to +<function>XtInsertEventTypeHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to dispatch events of a specific type within +<function>XtDispatchEvent ,</function> +use +<function>XtSetEventDispatcher .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetEventDispatcher" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtEventDispatchProc XtSetEventDispatcher(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>event_type</emphasis>, \ +<emphasis remap='I'>proc</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + int <emphasis remap='I'>event_type</emphasis>; +<!-- .br --> + XtEventDispatchProc <emphasis remap='I'>proc</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display for which the event dispatcher is to be registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_type</emphasis> + </term> + <listitem> + <para> +Specifies the event type for which the dispatcher should be invoked. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the event dispatcher procedure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSetEventDispatcher</function> +function registers the event dispatcher procedure specified by <emphasis remap='I'>proc</emphasis> +for events with the type <emphasis remap='I'>event_type</emphasis>. The previously registered +dispatcher (or the default dispatcher if there was no previously registered +dispatcher) is returned. If <emphasis remap='I'>proc</emphasis> is NULL, the default procedure is +restored for the specified type. +</para> +<para> +<!-- .LP --> +In the future, when +<function>XtDispatchEvent</function> +is called with an event type of <emphasis remap='I'>event_type</emphasis>, the specified <emphasis remap='I'>proc</emphasis> +(or the default dispatcher) is invoked to determine a widget +to which to dispatch the event. +</para> +<para> +<!-- .LP --> +The default dispatcher handles the (xI modal cascade and keyboard +focus mechanisms, handles the semantics of <emphasis remap='I'>compress_enterleave</emphasis> +and <emphasis remap='I'>compress_motion</emphasis>, and discards all extension events. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +An event dispatcher procedure pointer is of type +<function>XtEventDispatchProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtEventDispatchProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtEventDispatchProc)(XEvent*) +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Passes the event to be dispatched. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The event dispatcher procedure should determine whether this event is of +a type that should be dispatched to a widget. +</para> +<para> +<!-- .LP --> +If the event should be dispatched to a widget, the event dispatcher +procedure should determine the appropriate widget to receive the +event, call +<function>XFilterEvent</function> +with the window of this widget, or +<function>None</function> +if the event is to be discarded, and if +<function>XFilterEvent</function> +returns +<function>False ,</function> +dispatch the event to the widget using +<function>XtDispatchEventToWidget .</function> +The procedure should return +<function>True</function> +if either +<function>XFilterEvent</function> +or +<function>XtDispatchEventToWidget</function> +returned +<function>True</function> +and +<function>False</function> +otherwise. +</para> +<para> +<!-- .LP --> +If the event should not be dispatched to a widget, the event +dispatcher procedure should attempt to dispatch the event elsewhere as +appropriate and return +<function>True</function> +if it successfully dispatched the event and +<function>False</function> +otherwise. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +Some dispatchers for extension events may wish to forward events +according to the Intrinsics' keyboard focus mechanism. To determine +which widget is the end result of keyboard event forwarding, use +<function>XtGetKeyboardFocusWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetKeyboardFocusWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtGetKeyboardFocusWidget(<emphasis remap='I'>widget</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget to get forwarding information for. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetKeyboardFocusWidget</function> +function returns the widget that would be the end result of keyboard +event forwarding for a keyboard event for the specified widget. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To dispatch an event to a specified widget, use +<function>XtDispatchEventToWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDispatchEventToWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtDispatchEventToWidget(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>event</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget to which to dispatch the event. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the event to be dispatched. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDispatchEventToWidget</function> +function scans the list of registered event handlers for the +specified widget and calls each handler that has been registered +for the specified event type, subject to the <emphasis remap='I'>continue_to_dispatch</emphasis> +value returned by each handler. +The (xI behave as if event handlers were registered at the head +of the list for +<function>Expose ,</function> +<function>NoExpose ,</function> +<function>GraphicsExpose ,</function> +and +<function>VisibilityNotify</function> +events to invoke the widget's expose procedure according to the exposure +compression rules and to update the widget's <emphasis remap='I'>visible</emphasis> field +if <emphasis remap='I'>visible_interest</emphasis> is +<function>True .</function> +These internal event handlers never set <emphasis remap='I'>continue_to_dispatch</emphasis> to +<function>False .</function> +</para> +<para> +<!-- .LP --> +<function>XtDispatchEventToWidget</function> +returns +<function>True</function> +if any event handler was called and +<function>False</function> +otherwise. + +</para> +</sect3> +</sect2> +<sect2 id="Using_the_xI_in_a_Multi_Threaded_Environment"> +<title>Using the (xI in a Multi-Threaded Environment</title> +<!-- .XS --> +<!-- (SN Using the (xI in a Multi-Threaded Environment --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI may be used in environments that offer multiple threads +of execution within the context of a single process. A multi-threaded +application using the (xI must explicitly initialize the toolkit +for mutually exclusive access by calling +<function>XtToolkitThreadInitialize .</function> + +</para> +<sect3 id="Initializing_a_Multi_Threaded_xI_Application"> +<title>Initializing a Multi-Threaded (xI Application</title> +<!-- .XS --> +<!-- <function>(SN Initializing a Multi-Threaded (xI Application</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To test and initialize (xI support for mutually exclusive thread +access, call +<function>XtToolkitThreadInitialize .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtToolkitThreadInitialize" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtToolkitThreadInitialize() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtToolkitThreadInitialize</function> +returns <function>True</function> if the (xI support mutually exclusive thread +access, otherwise it returns <function>False</function>. <function>XtToolkitThreadInitialize</function> +must be called before +<function>XtCreateApplicationContext ,</function> +<function>XtAppInitialize ,</function> +<function>XtOpenApplication ,</function> +or +<function>XtSetLanguageProc</function> +is called. <function>XtToolkitThreadInitialize</function> may be called more than once; +however, the application writer must ensure that it is not called +simultaneously by two or more threads. + +</para> +</sect3> +<sect3 id="Locking_tk_Data_Structures"> +<title>Locking (tk Data Structures</title> +<!-- .XS --> +<!-- <function>(SN Locking (tk Data Structures</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI employs two levels of locking: application context and +process. Locking an application context ensures mutually exclusive +access by a thread to the state associated with the application context, +including all displays and widgets associated with it. Locking a +process ensures mutually exclusive access by a thread to (xI process +global data. +</para> +<para> +<!-- .LP --> +A client may acquire a lock multiple times and the effect is cumulative. +The client must ensure that the lock is released an equal number of times in +order for the lock to be acquired by another thread. +</para> +<para> +<!-- .LP --> +Most application writers will have little need to use locking as the +(xI performs the necessary locking internally. +Resource converters are an exception. +They require the application context or process to be locked +before the application can safely call them directly, for example: +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i --> +<!-- .ta .5i 2i --> + ... + XtAppLock(app_context); + XtCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret); + XtAppUnlock(app_context); + ... +</literallayout> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +When the application relies upon +<function>XtConvertAndStore</function> +or a converter to provide the storage for the results of a +conversion, the application should acquire the process lock before +calling out and hold the lock until the results have been copied. +</para> +<para> +<!-- .LP --> +Application writers who write their own +utility functions, such as one which retrieves the being_destroyed field from +a widget instance, must lock the application context before accessing +widget internal data. For example: +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i --> +<!-- .ta .5i 2i --> +#include <X11/CoreP.h> +Boolean BeingDestroyed (widget) + Widget widget; +{ + Boolean ret; + XtAppLock(XtWidgetToApplicationContext(widget)); + ret = widget->core.being_destroyed; + XtAppUnlock(XtWidgetToApplicationContext(widget)); + return ret; +} +</literallayout> +<!-- .KE --> +A client that wishes to atomically call two or more (xI functions +must lock the application context. For example: +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i --> +<!-- .ta .5i 2i --> + ... + XtAppLock(XtWidgetToApplicationContext(widget)); + XtUnmanageChild (widget1); + XtManageChild (widget2); + XtAppUnlock(XtWidgetToApplicationContext(widget)); + ... +</literallayout> +<!-- .KE --> + +</para> +<sect4 id="Locking_the_Application_Context"> +<title>Locking the Application Context</title> +<!-- .XS --> +<!-- <function>(SN Locking the Application Context</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To ensure mutual exclusion of application context, display, or +widget internal state, use +<function>XtAppLock.</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppLock" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppLock(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context to lock. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppLock</function> blocks until it is able to acquire the lock. Locking the +application context also ensures that only the thread holding the lock +makes Xlib calls from within Xt. An application that makes its own +direct Xlib calls must either lock the application context around every +call or enable thread locking in Xlib. +</para> +<para> +<!-- .LP --> +To unlock a locked application context, use +<function>XtAppUnlock.</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppUnlock" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppUnlock(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context that was previously locked. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> + +</para> +</sect4> +<sect4 id="Locking_the_Process"> +<title>Locking the Process</title> +<!-- .XS --> +<!-- (SN Locking the Process --> +<!-- .XE --> +<para> +<!-- .LP --> +To ensure mutual exclusion of (tk process global data, a +widget writer must use +<function>XtProcessLock.</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtProcessLock" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtProcessLock() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtProcessLock</function> blocks until it is able to acquire the lock. +Widget writers may use XtProcessLock to guarantee mutually exclusive +access to widget static data. +</para> +<para> +<!-- .LP --> +To unlock a locked process, use +<function>XtProcessUnlock .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtProcessUnlock" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtProcessUnlock() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +To lock both an application context and the process at the same +time, call +<function>XtAppLock</function> +first and then +<function>XtProcessLock .</function> +To release both locks, call +<function>XtProcessUnlock</function> +first and then +<function>XtAppUnlock .</function> +The order is important to avoid deadlock. + +</para> +</sect4> +</sect3> +<sect3 id="Event_Management_in_a_Multi_Threaded_Environment"> +<title>Event Management in a Multi-Threaded Environment</title> +<!-- .XS --> +<!-- <function>(SN Event Management in a Multi-Threaded Environment</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +In a nonthreaded environment an application writer could reasonably +assume that it is safe to exit the application from a quit callback. +This assumption may no longer hold true in a multi-threaded environment; +therefore it is desirable to provide a mechanism to terminate an +event-processing loop without necessarily terminating its thread. +</para> +<para> +<!-- .LP --> +To indicate that the event loop should terminate after the current +event dispatch has completed, use +<function>XtAppSetExitFlag .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetExitFlag" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppSetExitFlag(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppMainLoop</function> +tests the value of the flag and will return if the flag is <function>True</function>. +</para> +<para> +<!-- .LP --> +Application writers who implement their own main loop may test the +value of the exit flag with +<function>XtAppGetExitFlag .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppGetExitFlag" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtAppGetExitFlag(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppGetExitFlag</function> +will normally return <function>False</function>, indicating that event processing +may continue. When +<function>XtAppGetExitFlag</function> +returns <function>True</function>, the loop must terminate and return to the caller, +which might then destroy the application context. +</para> +<para> +<!-- .LP --> +Application writers should be aware that, if a thread is blocked in +<function>XtAppNextEvent ,</function> +<function>XtAppPeekEvent ,</function> +or +<function>XtAppProcessEvent</function> +and another thread in the same application context opens a new display, +adds an alternate input, or a timeout, any new source(s) will not +normally be "noticed" by the blocked thread. Any new sources are +"noticed" the next time one of these functions is called. +</para> +<para> +<!-- .LP --> +The (xI manage access to events on a last-in, first-out basis. If +multiple threads in the same application context block in +<function>XtAppNextEvent ,</function> +<function>XtAppPeekEvent ,</function> +or +<function>XtAppProcessEvent ,</function> +the last thread to call one of these functions is the first +thread to return. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect3> +</sect2> +</chapter> +</book> diff --git a/specs/CH08.xml b/specs/CH08.xml new file mode 100644 index 0000000..b2dcc47 --- /dev/null +++ b/specs/CH08.xml @@ -0,0 +1,783 @@ +<!-- .\" $Xorg: CH08,v 1.3 2000/08/17 19:42:46 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 8</function>\s-1 + +\s+1<function>Callbacks</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 8 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 8 \(em Callbacks --> +<!-- .XE --> +<!-- .IN "Destroy Callbacks" --> +Applications and other widgets often need to register a procedure +with a widget that gets called under certain prespecified conditions. +For example, +when a widget is destroyed, +every procedure on the widget's <emphasis remap='I'>destroy_callbacks</emphasis> +list is called to notify clients of the widget's impending doom. +</para> +<para> +<!-- .LP --> +Every widget has an XtNdestroyCallbacks callback list resource. +Widgets can define additional callback lists as they see fit. +For example, the Pushbutton widget has a callback +list to notify clients when the button has been activated. +</para> +<para> +<!-- .LP --> +Except where otherwise noted, it is the intent that all Intrinsics +functions may be called at any time, including from within callback +procedures, action routines, and event handlers. + +</para> +<sect2 id="Using_Callback_Procedure_and_Callback_List_Definitions"> +<title>Using Callback Procedure and Callback List Definitions</title> +<!-- .XS --> +<!-- <function>(SN Using Callback Procedure and Callback List Definitions</function> --> +<!-- .XE --> +<!-- .IN "XtCallbackList" --> +<!-- .IN "XtCallbackProc" --> +<para> +<!-- .LP --> +Callback procedure pointers for use in callback lists are of type +<function>XtCallbackProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtCallbackProc)(Widget, XtPointer, XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget owning the list in which the callback is registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data supplied by the client when the procedure +was registered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies any callback-specific data the widget wants to pass to the client. +For example, when Scrollbar executes its XtNthumbChanged callback list, +it passes the new position of the thumb. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>client_data</emphasis> argument provides a way for the +client registering the callback procedure also to register client-specific data, +for example, a pointer to additional information about the widget, +a reason for invoking the callback, and so on. +The <emphasis remap='I'>client_data</emphasis> value may be NULL +if all necessary information is in the widget. +The <emphasis remap='I'>call_data</emphasis> argument is a convenience to avoid having simple +cases where the client could otherwise always call +<function>XtGetValues</function> +or a widget-specific function to retrieve data from the widget. +Widgets should generally avoid putting complex state information +in <emphasis remap='I'>call_data</emphasis>. +The client can use the more general data retrieval methods, if necessary. +</para> +<para> +<!-- .LP --> +Whenever a client wants to pass a callback list as an argument in an +<function>XtCreateWidget ,</function> +<function>XtSetValues ,</function> +or +<function>XtGetValues</function> +call, it should specify the address +of a NULL-terminated array of type +<function>XtCallbackList .</function> +<!-- .IN "XtCallbackList" "" "@DEF@" --> +<!-- .IN "XtCallbackRec" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + XtCallbackProc callback; + XtPointer closure; +} XtCallbackRec, *XtCallbackList; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +For example, the callback list for procedures A and B with client data +clientDataA and clientDataB, respectively, is +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +static XtCallbackRec callbacks[] = { + {A, (XtPointer) clientDataA}, + {B, (XtPointer) clientDataB}, + {(XtCallbackProc) NULL, (XtPointer) NULL} +}; +</literallayout> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +Although callback lists are passed by address in arglists +and varargs lists, +the (xI recognize callback lists +through the widget resource list and will copy the contents +when necessary. +Widget initialize and set_values procedures +should not allocate memory for the callback list contents. +The (xI automatically do this, +potentially using a different structure for their +internal representation. + +</para> +</sect2> +<sect2 id="Identifying_Callback_Lists"> +<title>Identifying Callback Lists</title> +<!-- .XS --> +<!-- <function>(SN Identifying Callback Lists</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Whenever a widget contains a callback list for use by clients, +it also exports in its public .h file the resource name of the callback list. +Applications and client widgets never access callback list fields directly. +Instead, they always identify the desired callback list by using the exported +resource name. +All the callback manipulation functions described in this chapter +except +<function>XtCallCallbackList</function> +check +to see that the requested callback list is indeed implemented by the widget. +</para> +<para> +<!-- .LP --> +For the (xI to find and correctly handle callback lists, +they must be declared with a resource type of +<function>XtRCallback .</function> +The internal representation of a callback list is +implementation-dependent; widgets may make no assumptions about the +value stored in this resource if it is non-NULL. Except to compare +the value to NULL (which is equivalent to +<function>XtCallbackStatus</function> +<function>XtCallbackHasNone ),</function> +access to callback list resources must be made +through other (xI procedures. + +</para> +</sect2> +<sect2 id="Adding_Callback_Procedures"> +<title>Adding Callback Procedures</title> +<!-- .XS --> +<!-- <function>(SN Adding Callback Procedures</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To add a callback procedure to a widget's callback list, use +<function>XtAddCallback .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddCallback" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddCallback(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name, </emphasis><emphasis remap='I'>callback</emphasis>, \ +<emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .br --> + XtCallbackProc <emphasis remap='I'>callback</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list to which the procedure is to be appended. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback</emphasis> + </term> + <listitem> + <para> +Specifies the callback procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the specified procedure +when it is invoked, +or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +A callback will be invoked as many times as it occurs in the callback list. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To add a list of callback procedures to a given widget's callback list, use +<function>XtAddCallbacks .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddCallbacks" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddCallbacks(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name, </emphasis><emphasis remap='I'>callbacks</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .br --> + XtCallbackList <emphasis remap='I'>callbacks</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list to which the procedures are to be appended. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callbacks</emphasis> + </term> + <listitem> + <para> +Specifies the null-terminated list of callback procedures and corresponding +client data. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +</para> +</sect2> +<sect2 id="Removing_Callback_Procedures"> +<title>Removing Callback Procedures</title> +<!-- .XS --> +<!-- <function>(SN Removing Callback Procedures</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To delete a callback procedure from a widget's callback list, use +<function>XtRemoveCallback .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveCallback" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveCallback(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name</emphasis>, <emphasis remap='I'>callback</emphasis>, \ +<emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .br --> + XtCallbackProc <emphasis remap='I'>callback</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list from which the procedure is to be deleted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback</emphasis> + </term> + <listitem> + <para> +Specifies the callback procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the client data to match with the registered callback entry. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRemoveCallback</function> +function removes a callback only if both the procedure and the client +data match. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To delete a list of callback procedures from a given widget's callback list, use +<function>XtRemoveCallbacks .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveCallbacks" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveCallbacks(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name</emphasis>, <emphasis remap='I'>callbacks</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .br --> + XtCallbackList <emphasis remap='I'>callbacks</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list from which the procedures are to be deleted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callbacks</emphasis> + </term> + <listitem> + <para> +Specifies the null-terminated list of callback procedures and corresponding +client data. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +To delete all callback procedures from a given widget's callback list +and free all storage associated with the callback list, use +<function>XtRemoveAllCallbacks .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveAllCallbacks" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveAllCallbacks(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list to be cleared. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +</para> +</sect2> +<sect2 id="Executing_Callback_Procedures"> +<title>Executing Callback Procedures</title> +<!-- .XS --> +<!-- (SN Executing Callback Procedures --> +<!-- .XE --> +<para> +<!-- .LP --> +To execute the procedures in a given widget's callback list, +specifying the callback list by resource name, use +<function>XtCallCallbacks .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallCallbacks" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallCallbacks(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list to be executed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies a callback-list-specific data value to pass to each of the callback +procedure in the list, or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +</para> +<para> +<!-- .LP --> +<function>XtCallCallbacks</function> +calls each of the callback procedures in the list +named by <emphasis remap='I'>callback_name</emphasis> in the specified widget, passing the client +data registered with the procedure and <emphasis remap='I'>call-data</emphasis>. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To execute the procedures in a callback list, specifying the callback +list by address, use +<function>XtCallCallbackList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallCallbackList" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallCallbackList(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>callbacks</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + XtCallbackList <emphasis remap='I'>callbacks</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget instance that contains the callback list. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callbacks</emphasis> + </term> + <listitem> + <para> +Specifies the callback list to be executed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Specifies a callback-list-specific data value to pass +to each of the callback procedures in the list, or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>callbacks</emphasis> parameter must specify the contents of a widget or +object resource declared with representation type +<function>XtRCallback .</function> +If <emphasis remap='I'>callbacks</emphasis> is NULL, +<function>XtCallCallbackList</function> +returns immediately; otherwise it calls each of the callback +procedures in the list, passing the client data and <emphasis remap='I'>call_data</emphasis>. + +</para> +</sect2> +<sect2 id="Checking_the_Status_of_a_Callback_List"> +<title>Checking the Status of a Callback List</title> +<!-- .XS --> +<!-- (SN Checking the Status of a Callback List --> +<!-- .XE --> +<para> +<!-- .LP --> +To find out the status of a given widget's callback list, use +<function>XtHasCallbacks .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtHasCallbacks" "" "@DEF@" --> +<!-- .sp --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef enum {XtCallbackNoList, XtCallbackHasNone, XtCallbackHasSome} \ +XtCallbackStatus; +<!-- .sp --> +XtCallbackStatus XtHasCallbacks(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>callback_name</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>callback_name</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback_name</emphasis> + </term> + <listitem> + <para> +Specifies the callback list to be checked. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtHasCallbacks</function> +function first checks to see if the widget has a callback list identified +by <emphasis remap='I'>callback_name</emphasis>. +If the callback list does not exist, +<function>XtHasCallbacks</function> +returns +<function>XtCallbackNoList .</function> +If the callback list exists but is empty, +it returns +<function>XtCallbackHasNone .</function> +If the callback list exists and has at least one callback registered, +it returns +<function>XtCallbackHasSome .</function> +<!-- .bp --> + + + + + + + + + + + + + + + +</para> +</sect2> +</chapter> +</book> diff --git a/specs/CH09.xml b/specs/CH09.xml new file mode 100644 index 0000000..7eaee80 --- /dev/null +++ b/specs/CH09.xml @@ -0,0 +1,5737 @@ +<!-- .\" $Xorg: CH09,v 1.3 2000/08/17 19:42:46 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 9</function>\s-1 + +\s+1<function>Resource Management</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 9 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 9 \(em Resource Management --> +<!-- .XE --> +A resource is a field in the widget record with a corresponding +resource entry in the <emphasis remap='I'>resources</emphasis> list of the widget or any of its +superclasses. +This means that the field is +settable by +<function>XtCreateWidget</function> +(by naming the field in the argument list), by an +entry in a resource file (by using either the name or class), and by +<function>XtSetValues .</function> +In addition, it is readable by +<function>XtGetValues .</function> +Not all fields in a widget record are resources. +Some are for bookkeeping use by the +generic routines (like <emphasis remap='I'>managed</emphasis> and <emphasis remap='I'>being_destroyed</emphasis>). +Others can be for local bookkeeping, +and still others are derived from resources +(many graphics contexts and pixmaps). +</para> +<para> +<!-- .LP --> +Widgets typically need to obtain a large set of resources at widget +creation time. +Some of the resources come from the argument list supplied in the call to +<function>XtCreateWidget ,</function> +some from the resource database, +and some from the internal defaults specified by the widget. +Resources are obtained first from the argument list, +then from the resource database for all resources not specified +in the argument list, +and last, from the internal default, if needed. + +</para> +<sect2 id="Resource_Lists"> +<title>Resource Lists</title> +<!-- .XS --> +<!-- (SN Resource Lists --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Resource Management" --> +A resource entry specifies a field in the widget, +the textual name and class of the field that argument lists +and external resource files use to refer to the field, +and a default value that the field should get if no value is specified. +The declaration for the +<function>XtResource</function> +structure is +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String resource_name; + String resource_class; + String resource_type; + Cardinal resource_size; + Cardinal resource_offset; + String default_type; + XtPointer default_addr; +} XtResource, *XtResourceList; +</literallayout> +<!-- .IN "XtResourceList" --> +<!-- .eM --> + +</para> +<para> +<!-- .LP --> +When the resource list is specified as the +<function>CoreClassPart ,</function> +<function>ObjectClassPart ,</function> +<function>RectObjClassPart ,</function> +or +<function>ConstraintClassPart</function> +<emphasis remap='I'>resources</emphasis> field, the strings pointed to by <emphasis remap='I'>resource_name</emphasis>, +<emphasis remap='I'>resource_class</emphasis>, <emphasis remap='I'>resource_type</emphasis>, and <emphasis remap='I'>default_type</emphasis> must +be permanently allocated prior to or during the execution of the class +initialization procedure and must not be subsequently deallocated. + +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>resource_name</emphasis> field contains the name used by clients to access the field +in the widget. +By convention, it starts with a lowercase letter +and is spelled exactly like the field name, +except all underscores (_) are deleted and the next letter is replaced by its +uppercase counterpart. +For example, the resource name for background_pixel becomes backgroundPixel. +Resource names beginning with the two-character +sequence ``xt'', and resource classes beginning with the two-character +sequence ``Xt'' are reserved to the (xI for future standard and +implementation-dependent uses. +Widget header files typically contain a symbolic name for each resource name. +All resource names, classes, and types used by the (xI are named in +<function>< X11/StringDefs.h >.</function> +The (xI's symbolic resource names begin with +``XtN'' +and are followed by the string name (for example, XtNbackgroundPixel +for backgroundPixel). + +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>resource_class</emphasis> field contains the class string used in resource +specification files to identify the field. +A resource class provides two functions: +</para> +<itemizedlist> + <listitem> + <para> +It isolates an application from different representations that widgets +can use for a similar resource. + </para> + </listitem> + <listitem> + <para> +It lets you specify values for several actual resources with a single name. +A resource class should be chosen to span a group of closely related fields. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +For example, +a widget can have several pixel resources: background, foreground, +border, block cursor, pointer cursor, and so on. +Typically, the background defaults to white +and everything else to black. +The resource class for each of these resources in the resource list +should be chosen so that it takes the minimal number of entries +in the resource database to make the background ivory +and everything else darkblue. +</para> +<para> +<!-- .LP --> +In this case, the background pixel should have a resource class of +``Background'' +and all the other pixel entries a resource class of +``Foreground''. +Then, the resource file needs only two lines to +change all pixels to ivory or darkblue: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.5i --> +<!-- .ta .5i 1.5i --> +*Background: ivory +*Foreground: darkblue +</literallayout> +</para> +<para> +<!-- .LP --> +Similarly, a widget may have several font resources (such as normal and bold), +but all fonts should have the class Font. +Thus, changing all fonts simply requires only a single line in the +default resource file: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +*Font: 6x13 +</literallayout> +</para> +<para> +<!-- .LP --> +By convention, +resource classes are always spelled starting with a capital letter +to distinguish them from resource names. +Their symbolic names are preceded with +``XtC'' +(for example, XtCBackground). +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>resource_type</emphasis> field gives the physical representation type of the resource +and also encodes information about the specific usage of the field. +By convention, it starts with an uppercase letter and is +spelled identically to the type name of the field. +The resource type is used when resources are fetched to +convert from the resource database format (usually +<function>String )</function> +or the format of the resource default value +(almost anything, but often +<function>String )</function> +to the desired +physical representation (see Section 9.6). +The (xI define the following resource types: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2.5i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Resource Type</entry> + <entry>Structure or Field Type</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRAcceleratorTable</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XtAccelerators</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRAtom</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Atom</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBitmap</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Pixmap, depth=1</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBoolean</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Boolean</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBool</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Bool</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRCallback</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XtCallbackList</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRCardinal</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Cardinal</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRColor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XColor</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRColormap</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Colormap</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRCommandArgArray</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>String*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRCursor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Cursor</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDimension</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Dimension</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDirectoryString</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>String</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDisplay</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Display*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtREnum</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XtEnum</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtREnvironmentArray</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>String*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFile</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>FILE*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFloat</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>float</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFont</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Font</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFontSet</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XFontSet</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFontStruct</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XFontStruct*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFunction</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>(*)()</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRGeometry</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>char*, format as defined by</entry> + </row> + <row> + <entry><function>XParseGeometry</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRGravity</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>int</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRInitialState</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>int</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRInt</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>int</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRLongBoolean</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>long</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRObject</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Object</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPixel</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Pixel</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPixmap</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Pixmap</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPointer</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XtPointer</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPosition</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Position</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRRestartStyle</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>unsigned char</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRScreen</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Screen*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRShort</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>short</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRSmcConn</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XtPointer</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRString</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>String</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRStringArray</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>String*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRStringTable</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>String*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRTranslationTable</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>XtTranslations</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRUnsignedChar</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>unsigned char</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRVisual</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Visual*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRWidget</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Widget</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRWidgetClass</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>WidgetClass</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRWidgetList</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>WidgetList</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRWindow</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Window</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<function>< X11/StringDefs.h ></function> +also defines the following resource types as a +convenience for widgets, although they do not have any corresponding +data type assigned: +<function>XtREditMode ,</function> +<function>XtRJustify ,</function> +and +<function>XtROrientation .</function> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>resource_size</emphasis> field is the size of the physical representation in bytes; +you should specify it as +<function>sizeof (<emphasis remap='I'>type</emphasis>)</function> +so that the +compiler fills in the value. +The <emphasis remap='I'>resource_offset</emphasis> field is the offset in bytes of the field +within the widget. +You should use the +<function>XtOffsetOf</function> +macro to retrieve this value. +The <emphasis remap='I'>default_type</emphasis> field is the representation type of the default +resource value. +If <emphasis remap='I'>default_type</emphasis> is different from <emphasis remap='I'>resource_type</emphasis> and the default value +is needed, +the resource manager invokes a conversion procedure from <emphasis remap='I'>default_type</emphasis> +to <emphasis remap='I'>resource_type</emphasis>. +Whenever possible, +the default type should be identical to the resource type in order +to minimize widget creation time. +However, there are sometimes no values of the type that the program +can easily specify. +In this case, +it should be a value for which the converter is guaranteed to work (for example, +<function>XtDefaultForeground</function> +for a pixel resource). +The <emphasis remap='I'>default_addr</emphasis> field specifies the address of the default resource value. +As a special case, if <emphasis remap='I'>default_type</emphasis> is +<function>XtRString ,</function> +then the value in the <emphasis remap='I'>default_addr</emphasis> field is the pointer to +the string rather than a pointer to the pointer. +The default is used if a resource is not specified in the argument list +or in the resource database or if the conversion from the representation +type stored in the resource database fails, +which can happen for various reasons (for example, a misspelled entry in a +resource file). +</para> +<para> +<!-- .LP --> +Two special representation types +(XtRImmediate +and +XtRCallProc) +are usable only as default resource types. +XtRImmediate +indicates that the value in the <emphasis remap='I'>default_addr</emphasis> field is the actual value of +the resource rather than the address of the value. +The value must be in the correct representation type for the resource, +coerced to an +<function>XtPointer .</function> +No conversion is possible, since there is no source representation type. +XtRCallProc +indicates that the value in the <emphasis remap='I'>default_addr</emphasis> field is a procedure +pointer. +This procedure is automatically invoked with the widget, +<emphasis remap='I'>resource_offset</emphasis>, and a pointer to an +<function>XrmValue</function> +in which to store the result. +XtRCallProc +procedure pointers are of type +<function>XtResourceDefaultProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtResourceDefaultProc)(Widget, int, XrmValue*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + int <emphasis remap='I'>offset</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>value</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget whose resource value is to be obtained. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>offset</emphasis> + </term> + <listitem> + <para> +Specifies the offset of the field in the widget record. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value</emphasis> + </term> + <listitem> + <para> +Specifies the resource value descriptor to return. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtResourceDefaultProc</function> +procedure should fill in the <emphasis remap='I'>value->addr</emphasis> field with a pointer +to the resource value in its correct representation type. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To get the resource list structure for a particular class, use +<function>XtGetResourceList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetResourceList" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetResourceList(<emphasis remap='I'>class</emphasis>, <emphasis remap='I'>resources_return</emphasis>, <emphasis remap='I'>num_resources_return</emphasis>); +<!-- .br --> + WidgetClass <emphasis remap='I'>class</emphasis>; +<!-- .br --> + XtResourceList *<emphasis remap='I'>resources_return</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_resources_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the object class to be queried. It must be +<function>objectClass</function> +or any subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources_return</emphasis> + </term> + <listitem> + <para> +Returns the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources_return</emphasis> + </term> + <listitem> + <para> +Returns the number of entries in the resource list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If +<function>XtGetResourceList</function> +is called before the class is initialized, +it returns the resource list as specified in the class record. +If it is called after the class has been initialized, +<function>XtGetResourceList</function> +returns a merged resource list that includes the resources +for all superclasses. +The list returned by +<function>XtGetResourceList</function> +should be freed using +<function>XtFree</function> +when it is no longer needed. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To get the constraint resource list structure for a particular widget +class, use +<function>XtGetConstraintResourceList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetConstraintResourceList" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetConstraintResourceList(<emphasis remap='I'>class</emphasis>, <emphasis remap='I'>resources_return</emphasis>, \ +<emphasis remap='I'>num_resources_return</emphasis>) +<!-- .br --> + WidgetClass <emphasis remap='I'>class</emphasis>; +<!-- .br --> + XtResourceList *<emphasis remap='I'>resources_return</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_resources_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the object class to be queried. It must be +<function>objectClass</function> +or any subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources_return</emphasis> + </term> + <listitem> + <para> +Returns the constraint resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources_return</emphasis> + </term> + <listitem> + <para> +Returns the number of entries in the constraint resource list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If +<function>XtGetConstraintResourceList</function> +is called before the widget class is +initialized, the resource list as specified in the widget +class Constraint part is returned. If +<function>XtGetConstraintResourceList</function> +is called after the widget class has been initialized, the merged +resource list for the class and all Constraint superclasses is +returned. If the +specified class is not a subclass of +<function>constraintWidgetClass ,</function> +*<emphasis remap='I'>resources_return</emphasis> is set to NULL +and *<emphasis remap='I'>num_resources_return</emphasis> is set to zero. +The list returned by +<function>XtGetConstraintResourceList</function> +should be freed using +<function>XtFree</function> +when it is no longer needed. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The routines +<function>XtSetValues</function> +and +<function>XtGetValues</function> +also use the resource list to set and get widget state; +see Sections 9.7.1 and 9.7.2. +</para> +<para> +<!-- .LP --> +Here is an abbreviated version of a possible resource list for a Label widget: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.5i 3i --> +<!-- .ta .5i 1.5i 3i --> +/* Resources specific to Label */ +static XtResource resources[] = { +{XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), + XtOffsetOf(LabelRec, label.foreground), XtRString, XtDefaultForeground}, +{XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct*), + XtOffsetOf(LabelRec, label.font), XtRString, XtDefaultFont}, +{XtNlabel, XtCLabel, XtRString, sizeof(String), + XtOffsetOf(LabelRec, label.label), XtRString, NULL}, + . + . + . +} +</literallayout> +</para> +<para> +<!-- .LP --> +The complete resource name for a field of a widget instance is the +concatenation of the application shell name (from +<function>XtAppCreateShell ),</function> +the instance names of all the widget's parents up to the +top of the widget tree, +the instance name of the widget itself, +and the resource name of the specified field of the widget. +Similarly, +the full resource class of a field of a widget instance is the +concatenation of the application class (from +<function>XtAppCreateShell ),</function> +the widget class names of all the widget's parents up to the +top of the widget tree, +the widget class name of the widget itself, +and the resource class of the specified field of the widget. + +</para> +</sect2> +<sect2 id="Byte_Offset_Calculations"> +<title>Byte Offset Calculations</title> +<!-- .XS --> +<!-- (SN Byte Offset Calculations --> +<!-- .XE --> +<para> +<!-- .LP --> +To determine the byte offset of a field within a structure type, use +<function>XtOffsetOf .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOffsetOf" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Cardinal XtOffsetOf(<emphasis remap='I'>structure_type</emphasis>, <emphasis remap='I'>field_name</emphasis>) +<!-- .br --> + <emphasis remap='I'>Type structure_type</emphasis>; +<!-- .br --> + <emphasis remap='I'>Field field_name</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>structure_type</emphasis> + </term> + <listitem> + <para> +Specifies a type that is declared as a structure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>field_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of a member within the structure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOffsetOf</function> +macro expands to a constant expression that gives the +offset in bytes to the specified structure member from the beginning +of the structure. It is normally used to statically initialize +resource lists and is more portable than +<function>XtOffset ,</function> +which serves the same function. + +</para> +<para> +<!-- .LP --> +To determine the byte offset of a field within a structure pointer type, use +<function>XtOffset .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOffset" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Cardinal XtOffset(<emphasis remap='I'>pointer_type</emphasis>, <emphasis remap='I'>field_name</emphasis>) +<!-- .br --> + <emphasis remap='I'>Type pointer_type</emphasis>; +<!-- .br --> + <emphasis remap='I'>Field field_name</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>pointer_type</emphasis> + </term> + <listitem> + <para> +Specifies a type that is declared as a pointer to a structure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>field_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of a member within the structure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOffset</function> +macro expands to a constant expression that gives the +offset in bytes to the specified structure member from the beginning +of the structure. It may be used to statically initialize +resource lists. +<function>XtOffset</function> +is less portable than +<function>XtOffsetOf .</function> + +</para> +</sect2> +<sect2 id="Superclass_to_Subclass_Chaining_of_Resource_Lists"> +<title>Superclass-to-Subclass Chaining of Resource Lists</title> +<!-- .XS --> +<!-- (SN Superclass-to-Subclass Chaining of Resource Lists --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Inheritance" --> +<!-- .IN "Superclass Chaining" --> +<!-- .IN "Chaining" --> +The +<function>XtCreateWidget</function> +function gets resources as a superclass-to-subclass chained operation. +That is, the resources specified in the +<function>objectClass</function> +resource list are fetched, +then those in +<function>rectObjClass ,</function> +and so on down to the resources specified +for this widget's class. Within a class, resources are fetched in the order +they are declared. +</para> +<para> +<!-- .LP --> +In general, if a widget resource field is declared in a superclass, +that field is included in the superclass's resource list and need not be +included in the subclass's resource list. +For example, the +Core +class contains a resource entry for <emphasis remap='I'>background_pixel</emphasis>. +Consequently, +the implementation of Label need not also have a resource entry +for <emphasis remap='I'>background_pixel</emphasis>. +However, a subclass, +by specifying a resource entry for that field in its own resource list, +can override the resource entry for any field declared in a superclass. +This is most often done to override the defaults provided in the +superclass with new ones. +At class initialization time, +resource lists for that class are scanned from the superclass down +to the class to look for resources with the same offset. +A matching resource in a subclass will be reordered to override +the superclass entry. +If reordering is necessary, a copy of the superclass resource list is made to +avoid affecting other subclasses of the superclass. +</para> +<para> +<!-- .LP --> +<!-- .IN "class_initialize procedure" --> +<!-- .IN "Widget" "class initialization" --> +Also at class initialization time, the (xI produce an +internal representation of the resource list to optimize access time +when creating widgets. In order to save memory, the (xI may +overwrite the storage allocated for the resource list in the class +record; therefore, widgets must allocate resource lists in writable +storage and must not access the list contents directly after the +class_initialize procedure has returned. + +</para> +</sect2> +<sect2 id="Subresources"> +<title>Subresources</title> +<!-- .XS --> +<!-- (SN Subresources --> +<!-- .XE --> +<para> +<!-- .LP --> +A widget does not do anything to retrieve its own resources; +instead, +<function>XtCreateWidget</function> +does this automatically before calling the class initialize procedure. +</para> +<para> +<!-- .LP --> +Some widgets have subparts that are not widgets but for which the widget +would like to fetch resources. +Such widgets call +<function>XtGetSubresources</function> +to accomplish this. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSubresources" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSubresources(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>base</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>class</emphasis>, \ +<emphasis remap='I'>resources</emphasis>, <emphasis remap='I'>num_resources</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the object used to qualify the subpart resource name and +class. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address of the subpart data structure into which the +resources will be written. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the class of the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the resource list for the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetSubresources</function> +function constructs a name and class list from the application name and class, +the names and classes of all the object's ancestors, and the object itself. +Then it appends to this list the <emphasis remap='I'>name</emphasis> and <emphasis remap='I'>class</emphasis> pair passed in. +The resources are fetched from the argument list, the resource database, +or the default values in the resource list. +Then they are copied into the subpart record. +If <emphasis remap='I'>args</emphasis> is NULL, +<emphasis remap='I'>num_args</emphasis> must be zero. +However, if <emphasis remap='I'>num_args</emphasis> is zero, +the argument list is not referenced. +</para> +<para> +<!-- .LP --> +<function>XtGetSubresources</function> +may overwrite the specified resource list with an +equivalent representation in an internal format, which optimizes access +time if the list is used repeatedly. The resource list must be +allocated in writable storage, and the caller must not modify the list +contents after the call if the same list is to be used again. +Resources fetched by +<function>XtGetSubresources</function> +are reference-counted as +if they were referenced by the specified object. Subresources might +therefore be freed from the conversion cache and destroyed +when the object is destroyed, but not before then. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To fetch resources for widget subparts using varargs lists, use +<function>XtVaGetSubresources .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaGetSubresources" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtVaGetSubresources(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>base</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>class</emphasis>, \ +<emphasis remap='I'>resources</emphasis>, <emphasis remap='I'>num_resources</emphasis>, ...) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the object used to qualify the subpart resource name and +class. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address of the subpart data structure into which the +resources will be written. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the class of the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the resource list for the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaGetSubresources</function> +is identical in function to +<function>XtGetSubresources</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, as +described in Section 2.5.1. + +</para> +</sect2> +<sect2 id="Obtaining_Application_Resources"> +<title>Obtaining Application Resources</title> +<!-- .XS --> +<!-- <function>(SN Obtaining Application Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve resources that are not specific to a widget +but apply to the overall application, use +<function>XtGetApplicationResources .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetApplicationResources" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetApplicationResources(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>base</emphasis>, <emphasis remap='I'>resources</emphasis>, \ +<emphasis remap='I'>num_resources</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the object that identifies the resource database to search +(the database is that associated with the display for this object). (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address into which +the resource values will be written. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetApplicationResources</function> +function first uses the passed object, +which is usually an application shell widget, +to construct a resource name and class list. +The full name and class of the specified object (that is, including its +ancestors, if any) is logically added to the +front of each resource name and class. +Then it retrieves the resources from the argument list, +the resource database, or the resource list default values. +After adding base to each address, +<function>XtGetApplicationResources</function> +copies the resources into the addresses +obtained by adding <emphasis remap='I'>base</emphasis> to each <emphasis remap='I'>offset</emphasis> in the resource list. +If <emphasis remap='I'>args</emphasis> is NULL, +<emphasis remap='I'>num_args</emphasis> must be zero. +However, if <emphasis remap='I'>num_args</emphasis> is zero, +the argument list is not referenced. +The portable way to specify application resources is to declare them +as members of a structure and pass the address of the structure +as the <emphasis remap='I'>base</emphasis> argument. +</para> +<para> +<!-- .LP --> +<function>XtGetApplicationResources</function> +may overwrite the specified resource list +with an equivalent representation in an internal format, which +optimizes access time if the list is used repeatedly. The resource +list must be allocated in writable storage, and the caller must not +modify the list contents after the call if the same list is to be +used again. Any per-display resources fetched by +<function>XtGetApplicationResources</function> +will not be freed from the resource cache until the display is closed. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve resources for the overall application using varargs lists, use +<function>XtVaGetApplicationResources .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaGetApplicationResources" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtVaGetApplicationResources(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>base</emphasis>, <emphasis remap='I'>resources</emphasis>, \ +<emphasis remap='I'>num_resources</emphasis>, ...) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the object that identifies the resource database to search +(the database is that associated with the display for this object). (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address into which +the resource values will be written. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the resource list for the subpart. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaGetApplicationResources</function> +is identical in function to +<function>XtGetApplicationResources</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters +replaced by a varargs list, as described in Section 2.5.1. + +</para> +</sect2> +<sect2 id="Resource_Conversions"> +<title>Resource Conversions</title> +<!-- .XS --> +<!-- (SN Resource Conversions --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide a mechanism for registering representation converters that +are automatically invoked by the resource-fetching routines. +The (xI additionally provide and register several commonly used converters. +This resource conversion mechanism serves several purposes: +</para> +<itemizedlist> + <listitem> + <para> +It permits user and application resource files to contain textual +representations of nontextual values. + </para> + </listitem> + <listitem> + <para> +It allows textual or other representations of default resource values that +are dependent on the display, screen, or colormap, and thus must be +computed at runtime. + </para> + </listitem> + <listitem> + <para> +It caches conversion source and result data. +Conversions that require much computation or space +(for example, string-to-translation-table) +or that require round-trips to the server +(for example, string-to-font or string-to-color) are performed only once. + + </para> + </listitem> +</itemizedlist> +<sect3 id="Predefined_Resource_Converters"> +<title>Predefined Resource Converters</title> +<!-- .XS --> +<!-- (SN Predefined Resource Converters --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI define all the representations used in the +Object, +RectObj, +Core, +Composite, +Constraint, +and +Shell +widget classes. +The (xI register the following resource converters that accept +input values of representation type +<function>XtRString .</function> +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.7i) lw(2.4i) lw(1.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Target Representation</entry> + <entry>Converter Name</entry> + <entry>Additional Args</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRAcceleratorTable</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToAcceleratorTable</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRAtom</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToAtom</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Display*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBoolean</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToBoolean</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBool</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToBool</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRCommandArgArray</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToCommandArgArray</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRCursor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToCursor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Display*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDimension</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToDimension</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDirectoryString</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToDirectoryString</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDisplay</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToDisplay</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFile</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToFile</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFloat</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToFloat</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFont</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToFont</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Display*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFontSet</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToFontSet</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Display*, String <emphasis remap='I'>locale</emphasis></entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFontStruct</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToFontStruct</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Display*</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRGravity</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToGravity</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRInitialState</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToInitialState</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRInt</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToInt</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPixel</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToPixel</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>colorConvertArgs</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPosition</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToPosition</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRRestartStyle</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToRestartStyle</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRShort</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToShort</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRTranslationTable</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToTranslationTable</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRUnsignedChar</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToUnsignedChar</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRVisual</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtStringToVisual</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>Screen*, Cardinal <emphasis remap='I'>depth</emphasis></entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +<para> +<!-- .LP --> +The String-to-Pixel conversion has two predefined constants that are +guaranteed to work and contrast with each other: +<function>XtDefaultForeground</function> +and +<function>XtDefaultBackground .</function> +<!-- .IN "XtDefaultBackground" "" "@DEF@" --> +<!-- .IN "XtDefaultForeground" "" "@DEF@" --> +They evaluate to the black and white pixel values of the widget's screen, +respectively. +<!-- .IN "Resources" "reverseVideo" --> +If the application resource reverseVideo is +<function>True ,</function> +they evaluate to the white and black pixel values of the widget's screen, +respectively. +Similarly, the String-to-Font and String-to-FontStruct converters recognize +the constant +<function>XtDefaultFont</function> +<!-- .IN "XtDefaultFont" "" "@DEF@" --> +<!-- .IN "Resources" "xtDefaultFont" --> +and evaluate this in the following manner: +</para> +<itemizedlist> + <listitem> + <para> +Query the resource database for the resource whose full name +is ``xtDefaultFont'', class ``XtDefaultFont'' (that is, no widget +name/class prefixes), and use a type +<function>XtRString</function> +value returned as the font name or a type +<function>XtRFont</function> +or +<function>XtRFontStruct</function> +value directly as the resource value. + </para> + </listitem> + <listitem> + <para> +If the resource database does not contain a value for xtDefaultFont, +class XtDefaultFont, or if the returned font name cannot be +successfully opened, an implementation-defined font in ISO8859-1 +character set encoding is opened. (One possible algorithm is to +perform an +<function>XListFonts</function> +using a wildcard font name and use the first +font in the list. This wildcard font name should be as broad as +possible to maximize the probability of locating a useable font; +for example, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-1".) + </para> + </listitem> + <listitem> + <para> +If no suitable ISO8859-1 font can be found, issue a warning message +and return +<function>False .</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The String-to-FontSet converter recognizes the constant +<function>XtDefaultFontSet</function> +<!-- .IN "XtDefaultFontSet" "" "@DEF@" --> +<!-- .IN "Resources" "xtDefaultFontSet" --> +and evaluate this in the following manner: +</para> +<itemizedlist> + <listitem> + <para> +Query the resource database for the resource whose full name +is ``xtDefaultFontSet'', class ``XtDefaultFontSet'' (that is, no widget +name/class prefixes), and use a type +<function>XtRString</function> +value returned as the base font name list or a type +<function>XtRFontSet</function> +value directly as the resource value. + </para> + </listitem> + <listitem> + <para> +If the resource database does not contain a value for xtDefaultFontSet, +class XtDefaultFontSet, or if a font set cannot be +successfully created from this resource, +an implementation-defined font set is created. +(One possible algorithm is to +perform an +<function>XCreateFontSet</function> +using a wildcard base font name. +This wildcard base font name should be as broad as +possible to maximize the probability of locating a useable font; +for example, "-*-*-*-R-*-*-*-120-*-*-*-*".) + </para> + </listitem> + <listitem> + <para> +If no suitable font set can be created, issue a warning message +and return +<function>False .</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +If a font set is created but <emphasis remap='I'>missing_charset_list</emphasis> is not +empty, a warning is issued and the partial font set is returned. +The (xI register the String-to-FontSet converter with +a conversion argument list that extracts the current process +locale at the time the converter is invoked. This ensures +that the converter is invoked again if the same conversion +is required in a different locale. +</para> +<para> +<!-- .LP --> +The String-to-Gravity conversion accepts string values that are the +names of window and bit gravities and their numerical equivalents, +as defined in <emphasis remap='I'>(xL</emphasis>: +<function>ForgetGravity ,</function> +<function>UnmapGravity ,</function> +<function>NorthWestGravity ,</function> +<function>NorthGravity ,</function> +<function>NorthEastGravity ,</function> +<function>WestGravity ,</function> +<function>CenterGravity ,</function> +<function>EastGravity ,</function> +<function>SouthWestGravity ,</function> +<function>SouthGravity ,</function> +<function>SouthEastGravity ,</function> +and +<function>StaticGravity .</function> +Alphabetic case is not significant in the conversion. +</para> +<para> +<!-- .LP --> +The String-to-CommandArgArray conversion parses a String into an +array of strings. +White space characters separate elements of the command line. +The converter recognizes the backslash character ``\\'' as an escape +character to allow the following white space character to be part of the +array element. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCurrentDirectory" "" "@DEF@" --> +The String-to-DirectoryString conversion recognizes the +string ``XtCurrentDirectory'' and returns the result of a call +to the operating system to get the current directory. +</para> +<para> +<!-- .LP --> +The String-to-RestartStyle conversion accepts the values +<function>RestartIfRunning ,</function> +<function>RestartAnyway ,</function> +<function>RestartImmediately ,</function> +and +<function>RestartNever</function> +as defined by the <emphasis remap='I'>X Session Management Protocol</emphasis>. +</para> +<para> +<!-- .LP --> +The String-to-InitialState conversion accepts the values +<function>NormalState</function> +or +<function>IconicState</function> +as defined by the <emphasis remap='I'>(xC</emphasis>. +</para> +<para> +<!-- .LP --> +The String-to-Visual conversion calls +<function>XMatchVisualInfo</function> +using the +<emphasis remap='I'>screen</emphasis> and <emphasis remap='I'>depth</emphasis> fields from the core part and returns the first +matching Visual on the list. The widget resource list must be certain +to specify any resource of type +<function>XtRVisual</function> +after the depth resource. +The allowed string values are the visual class names defined in <emphasis remap='I'>(xP</emphasis>, +Section 8; +<function>StaticGray ,</function> +<function>StaticColor ,</function> +<function>TrueColor ,</function> +<function>GrayScale ,</function> +<function>PseudoColor ,</function> +and +<function>DirectColor .</function> + +</para> +<para> +<!-- .LP --> +The (xI register the following resource converter that accepts +an input value of representation type +<function>XtRColor .</function> +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(2.25i) lw(1.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Target Representation</entry> + <entry>Converter Name</entry> + <entry>Additional Args</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPixel</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtColorToPixel</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +<para> +<!-- .LP --> +The (xI register the following resource converters that accept +input values of representation type +<function>XtRInt .</function> +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(2.25i) lw(1.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Target Representation</entry> + <entry>Converter Name</entry> + <entry>Additional Args</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBoolean</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToBoolean</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRBool</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToBool</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRColor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToColor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>colorConvertArgs</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRDimension</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToDimension</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFloat</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToFloat</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRFont</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToFont</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPixel</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToPixel</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPixmap</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToPixmap</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRPosition</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToPosition</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRShort</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToShort</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRUnsignedChar</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtIntToUnsignedChar</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +<para> +<!-- .LP --> +The (xI register the following resource converter that accepts +an input value of representation type +<function>XtRPixel .</function> +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(2.25i) lw(1.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Target Representation</entry> + <entry>Converter Name</entry> + <entry>Additional Args</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtRColor</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>XtCvtPixelToColor</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +</sect3> +<sect3 id="New_Resource_Converters"> +<title>New Resource Converters</title> +<!-- .XS --> +<!-- (SN New Resource Converters --> +<!-- .XE --> +<para> +<!-- .LP --> +Type converters use pointers to +<function>XrmValue</function> +structures (defined in +<function>< X11/Xresource.h >;</function> +see Section 15.4 in <emphasis remap='I'>(xL</emphasis>) +for input and output values. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + unsigned int size; + XPointer addr; +} XrmValue, *XrmValuePtr; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>addr</emphasis> field specifies the address of the data, and the <emphasis remap='I'>size</emphasis> +field gives the total number of significant bytes in the data. +For values of type +<function>String ,</function> +<emphasis remap='I'>addr</emphasis> is the address of the first character and <emphasis remap='I'>size</emphasis> +includes the NULL-terminating byte. +</para> +<para> +<!-- .LP --> +A resource converter procedure pointer is of type +<function>XtTypeConverter .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtTypeConverter" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtTypeConverter)(Display*, XrmValue*, Cardinal*, + XrmValue*, XrmValue*, XtPointer*); +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>from</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>to</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>converter_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display connection with which this conversion is associated. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies a list of additional +<function>XrmValue</function> +arguments to the converter if additional context is needed +to perform the conversion, or NULL. +For example, the String-to-Font converter needs the widget's <emphasis remap='I'>display</emphasis>, +and the String-to-Pixel converter needs the widget's <emphasis remap='I'>screen</emphasis> and <emphasis remap='I'>colormap</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>args</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from</emphasis> + </term> + <listitem> + <para> +Specifies the value to convert. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to</emphasis> + </term> + <listitem> + <para> +Specifies a descriptor for a location into which to store the converted value. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter_data</emphasis> + </term> + <listitem> + <para> +Specifies a location into which the converter may +store converter-specific data associated +with this conversion. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>display</emphasis> argument is normally used only when generating error +messages, to identify the application context (with the function +<function>XtDisplayToApplicationContext ).</function> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>to</emphasis> argument specifies the size and location into which the +converter should store the converted value. If the <emphasis remap='I'>addr</emphasis> field is NULL, +the converter should allocate appropriate storage and store the size +and location into the <emphasis remap='I'>to</emphasis> descriptor. If the type converter allocates +the storage, it remains under the ownership of the converter and must +not be modified by the caller. The type converter is permitted to use +static storage for this purpose, and therefore the caller must +immediately copy the data upon return from the converter. If the +<emphasis remap='I'>addr</emphasis> field is not NULL, the converter must check the <emphasis remap='I'>size</emphasis> field to +ensure that sufficient space has been allocated before storing the +converted value. If insufficient space is specified, the converter +should update the <emphasis remap='I'>size</emphasis> field with the number of bytes required and +return +<function>False</function> +without modifying the data at the specified location. +If sufficient space was allocated by the caller, the converter should +update the <emphasis remap='I'>size</emphasis> field with the number of bytes actually occupied by the +converted value. For converted values of type +<function>XtRString ,</function> +the size should +include the NULL-terminating byte, if any. +The converter may store any value in the location specified +in <emphasis remap='I'>converter_data</emphasis>; this value will be passed to the destructor, if any, +when the resource is freed by the (xI. +</para> +<para> +<!-- .LP --> +The converter must return +<function>True</function> +if the conversion was successful and +<function>False</function> +otherwise. If the conversion cannot be performed because of an +improper source value, a warning message should also be issued with +<function>XtAppWarningMsg .</function> + +</para> +<para> +<!-- .LP --> +Most type converters just take the data described by the specified <emphasis remap='I'>from</emphasis> +argument and return data by writing into the location specified in +the <emphasis remap='I'>to</emphasis> argument. +A few need other information, which is available in <emphasis remap='I'>args</emphasis>. +A type converter can invoke another type converter, +which allows differing sources that may convert into a common intermediate +result to make maximum use of the type converter cache. +</para> +<para> +<!-- .LP --> +Note that if an address is written into <emphasis remap='I'>to->addr</emphasis>, it cannot be that +of a local variable of the converter because the data will not be +valid after the converter returns. Static variables may be used, +as in the following example. +If the converter modifies the resource database, +the changes affect any in-progress widget creation, +<function>XtGetApplicationResources ,</function> +or +<function>XtGetSubresources</function> +in an implementation-defined manner; however, insertion of new entries +or changes to existing entries is allowed and will not directly cause +an error. + +</para> +<para> +<!-- .LP --> +The following is an example of a converter that takes a +<function>string</function> +and converts it to a +<function>Pixel .</function> +Note that the <emphasis remap='I'>display</emphasis> parameter is +used only to generate error messages; the +<function>Screen</function> +conversion argument is +still required to inform the (xI that the converted value is +a function of the particular display (and colormap). +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .3i .7i 1i 1.3i 1.7i 2i 4i --> +<!-- .ta .3i .7i 1i 1.3i 1.7i 2i 4i --> + +#define done(type, value) \\ + { \\ + if (toVal->addr != NULL) { \\ + if (toVal->size < sizeof(type)) { \\ + toVal->size = sizeof(type); \\ + return False; \\ + } \\ + *(type*)(toVal->addr) = (value); \\ + } \\ + else { \\ + static type static_val; \\ + static_val = (value); \\ + toVal->addr = (XPointer)&static_val; \\ + } \\ + toVal->size = sizeof(type); \\ + return True; \\ + } + +static Boolean CvtStringToPixel(dpy, args, num_args, fromVal, toVal, converter_data) + Display *dpy; + XrmValue *args; + Cardinal *num_args; + XrmValue *fromVal; + XrmValue *toVal; + XtPointer *converter_data; +{ + static XColor screenColor; + XColor exactColor; + Screen *screen; + Colormap colormap; + Status status; + + if (*num_args != 2) + XtAppWarningMsg(XtDisplayToApplicationContext(dpy), + "wrongParameters", "cvtStringToPixel", "XtToolkitError", + "String to pixel conversion needs screen and colormap arguments", + (String *)NULL, (Cardinal *)NULL); + + screen = *((Screen**) args[0].addr); + colormap = *((Colormap *) args[1].addr); + + if (CompareISOLatin1(str, XtDefaultBackground) == 0) { + *closure_ret = False; + done(Pixel, WhitePixelOfScreen(screen)); + } + if (CompareISOLatin1(str, XtDefaultForeground) == 0) { + *closure_ret = False; + done(Pixel, BlackPixelOfScreen(screen)); + } + + + status = XAllocNamedColor(DisplayOfScreen(screen), colormap, (char*)fromVal->addr, + &screenColor, &exactColor); + + if (status == 0) { + String params[1]; + Cardinal num_params = 1; + params[0] = (String)fromVal->addr; + XtAppWarningMsg(XtDisplayToApplicationContext(dpy), + "noColormap", "cvtStringToPixel", "XtToolkitError", + "Cannot allocate colormap entry for \\"%s\\"", params,\ + &num_params); + *converter_data = (char *) False; + return False; + } else { + *converter_data = (char *) True; + done(Pixel, &screenColor.pixel); + } +} +</literallayout> +</para> +<para> +<!-- .LP --> +All type converters should define some set of conversion values for which they +are guaranteed to succeed so these can be used in the resource defaults. +This issue arises only with conversions, such as fonts and colors, +where there is no string representation that all server implementations +will necessarily recognize. +For resources like these, +the converter should define a symbolic constant +in the same manner as +<function>XtDefaultForeground ,</function> +<function>XtDefaultBackground ,</function> +and +<function>XtDefaultFont .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To allow the (xI to deallocate resources produced by type +converters, a resource destructor procedure may also be provided. +</para> +<para> +<!-- .LP --> +A resource destructor procedure pointer is of type +<function>XtDestructor .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDestructor" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtDestructor) (XtAppContext, XrmValue*, XtPointer, XrmValue*, \ +Cardinal*); +<!-- .br --> + XtAppContext <emphasis remap='I'>app</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>to</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>converter_data</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app</emphasis> + </term> + <listitem> + <para> +Specifies an application context in which the resource is being freed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to</emphasis> + </term> + <listitem> + <para> +Specifies a descriptor for the resource produced by the type converter. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter_data</emphasis> + </term> + <listitem> + <para> +Specifies the converter-specific data returned by the type converter. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the additional converter arguments as passed +to the type converter when the conversion was performed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>args</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The destructor procedure is responsible for freeing the resource +specified by the <emphasis remap='I'>to</emphasis> argument, including any auxiliary storage +associated with that resource, but not the memory directly addressed +by the size and location in the <emphasis remap='I'>to</emphasis> argument or the memory specified +by <emphasis remap='I'>args</emphasis>. + +</para> +</sect3> +<sect3 id="Issuing_Conversion_Warnings"> +<title>Issuing Conversion Warnings</title> +<!-- .XS --> +<!-- (SN Issuing Conversion Warnings --> +<!-- .XE --> +<para> +<!-- .LP --> +The +<function>XtDisplayStringConversionWarning</function> +procedure is a convenience routine for resource type converters +that convert from string values. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDisplayStringConversionWarning" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtDisplayStringConversionWarning(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>from_value</emphasis>, \ +<emphasis remap='I'>to_type</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + String <emphasis remap='I'>from_value</emphasis>, <emphasis remap='I'>to_type</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display connection with which the conversion is associated. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from_value</emphasis> + </term> + <listitem> + <para> +Specifies the string that could not be converted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the target representation type requested. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDisplayStringConversionWarning</function> +procedure issues a warning message using +<function>XtAppWarningMsg</function> +with <emphasis remap='I'>name</emphasis> ``conversionError'', +<emphasis remap='I'>type</emphasis> ``string'', <emphasis remap='I'>class</emphasis> ``XtToolkitError'', and the default message +``Cannot convert "<emphasis remap='I'>from_value</emphasis>" to type <emphasis remap='I'>to_type</emphasis>''. +</para> +<para> +<!-- .LP --> +To issue other types of warning or error messages, the type converter +should use +<function>XtAppWarningMsg</function> +or +<function>XtAppErrorMsg .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve the application context associated with a given +display connection, use +<function>XtDisplayToApplicationContext .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDisplayToApplicationContext" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtAppContext XtDisplayToApplicationContext( <emphasis remap='I'>display</emphasis> ) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies an open and initialized display connection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDisplayToApplicationContext</function> +function returns the application +context in which the specified <emphasis remap='I'>display</emphasis> was initialized. If the +display is not known to the (xI, an error message is issued. + +</para> +</sect3> +<sect3 id="Registering_a_New_Resource_Converter"> +<title>Registering a New Resource Converter</title> +<!-- .XS --> +<!-- <function>(SN Registering a New Resource Converter</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When registering a resource converter, the client must specify the +manner in which the conversion cache is to be used when there are multiple +calls to the converter. Conversion cache control is specified +via an +<function>XtCacheType</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCacheType" "" "@DEF@" --> +argument. +<!-- .sM --> +<literallayout class="monospaced"> +typedef int XtCacheType; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +An +<function>XtCacheType</function> +field may contain one of the following values: +<!-- .br --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<function>XtCacheNone</function> +<!-- .IN "XtCacheNone" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies that the results of a previous conversion +may not be reused to satisfy any other resource +requests; the specified converter will be called +each time the converted value is required. +<!-- .br --> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtCacheAll</function> +<!-- .IN "XtCacheAll" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies that the results of a previous conversion +should be reused for any resource request that depends +upon the same source value and conversion arguments. +<!-- .br --> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<function>XtCacheByDisplay</function> +<!-- .IN "XtCacheByDisplay" "" "@DEF@" --> +</para> +<itemizedlist> + <listitem> + <para> +Specifies that the results of a previous conversion +should be used as for +<function>XtCacheAll</function> +but the destructor will be called, if specified, if +<function>XtCloseDisplay</function> +is called +for the display connection associated with the converted value, and +the value will be removed from the conversion cache. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The qualifier +<function>XtCacheRefCount</function> +<!-- .IN "XtCacheRefCount" "" "@DEF@" --> +may be ORed with any of the above values. If +<function>XtCacheRefCount</function> +is specified, calls to +<function>XtCreateWidget ,</function> +<function>XtCreateManagedWidget ,</function> +<function>XtGetApplicationResources ,</function> +and +<function>XtGetSubresources</function> +that use the converted value will be counted. When a widget using the +converted value is destroyed, the count is decremented, and, if the +count reaches zero, the destructor procedure will be called and the +converted value will be removed from the conversion cache. + +</para> +<para> +<!-- .LP --> +To register a type converter for all application contexts in a +process, use +<function>XtSetTypeConverter ,</function> +and to register a type converter in a single application context, use +<function>XtAppSetTypeConverter .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetTypeConverter" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetTypeConverter(<emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>to_type</emphasis>, <emphasis remap='I'>converter</emphasis>, \ +<emphasis remap='I'>convert_args</emphasis>, <emphasis remap='I'>num_args</emphasis>, + <emphasis remap='I'>cache_type</emphasis>, <emphasis remap='I'>destructor</emphasis>) +<!-- .br --> + String <emphasis remap='I'>from_type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>to_type</emphasis>; +<!-- .br --> + XtTypeConverter <emphasis remap='I'>converter</emphasis>; +<!-- .br --> + XtConvertArgList <emphasis remap='I'>convert_args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XtCacheType <emphasis remap='I'>cache_type</emphasis>; +<!-- .br --> + XtDestructor <emphasis remap='I'>destructor</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>from_type</emphasis> + </term> + <listitem> + <para> +Specifies the source type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the destination type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter</emphasis> + </term> + <listitem> + <para> +Specifies the resource type converter procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>convert_args</emphasis> + </term> + <listitem> + <para> +Specifies additional conversion arguments, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>convert_args</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>cache_type</emphasis> + </term> + <listitem> + <para> +Specifies whether or not resources produced by this +converter are sharable or display-specific and when +they should be freed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>destructor</emphasis> + </term> + <listitem> + <para> +Specifies a destroy procedure for resources produced by +this conversion, or NULL if no additional action is +required to deallocate resources produced by the converter. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetTypeConverter" "" "@DEF@" --> +</para> +<!-- .FD 0 --> +void XtAppSetTypeConverter(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>to_type</emphasis>, \ +<emphasis remap='I'>converter</emphasis>, <emphasis remap='I'>convert_args</emphasis>, + <emphasis remap='I'>num_args</emphasis>, <emphasis remap='I'>cache_type</emphasis>, <emphasis remap='I'>destructor</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>from_type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>to_type</emphasis>; +<!-- .br --> + XtTypeConverter <emphasis remap='I'>converter</emphasis>; +<!-- .br --> + XtConvertArgList <emphasis remap='I'>convert_args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XtCacheType <emphasis remap='I'>cache_type</emphasis>; +<!-- .br --> + XtDestructor <emphasis remap='I'>destructor</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from_type</emphasis> + </term> + <listitem> + <para> +Specifies the source type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the destination type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter</emphasis> + </term> + <listitem> + <para> +Specifies the resource type converter procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>convert_args</emphasis> + </term> + <listitem> + <para> +Specifies additional conversion arguments, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>convert_args</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>cache_type</emphasis> + </term> + <listitem> + <para> +Specifies whether or not resources produced by this +converter are sharable or display-specific and when +they should be freed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>destructor</emphasis> + </term> + <listitem> + <para> +Specifies a destroy procedure for resources produced by +this conversion, or NULL if no additional action is +required to deallocate resources produced by the converter. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtSetTypeConverter</function> +registers the specified type converter and +destructor in all application contexts created by the calling process, +including any future application contexts that may be created. +<function>XtAppSetTypeConverter</function> +registers the specified type converter in the +single application context specified. If the same <emphasis remap='I'>from_type</emphasis> and +<emphasis remap='I'>to_type</emphasis> are specified in multiple calls to either function, the most +recent overrides the previous ones. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +For the few type converters that need additional arguments, +the (xI conversion mechanism provides a method of specifying +how these arguments should be computed. +The enumerated type +<function>XtAddressMode</function> +and the structure +<function>XtConvertArgRec</function> +specify how each argument is derived. +These are defined in +<function>< X11/Intrinsic.h >.</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i --> +<!-- .ta .5i 2.5i --> +typedef enum { + /* address mode parameter representation */ + XtAddress, /* address */ + XtBaseOffset, /* offset */ + XtImmediate, /* constant */ + XtResourceString, /* resource name string */ + XtResourceQuark, /* resource name quark */ + XtWidgetBaseOffset, /* offset */ + XtProcedureArg /* procedure to call */ +} XtAddressMode; +<!-- .sp --> +typedef struct { + XtAddressMode address_mode; + XtPointer address_id; + Cardinal size; +} XtConvertArgRec, *XtConvertArgList; +</literallayout> +<!-- .eM --> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>size</emphasis> field specifies the length of the data in bytes. +The <emphasis remap='I'>address_mode</emphasis> field specifies how the <emphasis remap='I'>address_id</emphasis> field should be +interpreted. +<function>XtAddress</function> +<!-- .IN "XtAddress" "" "@DEF@" --> +causes <emphasis remap='I'>address_id</emphasis> to be interpreted as the address of the data. +<function>XtBaseOffset</function> +<!-- .IN "XtBaseOffset" "" "@DEF@" --> +causes <emphasis remap='I'>address_id</emphasis> to be interpreted as the offset from the widget base. +<function>XtImmediate</function> +<!-- .IN "XtImmediate" "" "@DEF@" --> +causes <emphasis remap='I'>address_id</emphasis> to be interpreted as a constant. +<function>XtResourceString</function> +<!-- .IN "XtResourceString" "" "@DEF@" --> +causes <emphasis remap='I'>address_id</emphasis> to be interpreted as the name of a resource +that is to be converted into an offset from the widget base. +<function>XtResourceQuark</function> +<!-- .IN "XtResourceQuark" "" "@DEF@" --> +causes <emphasis remap='I'>address_id</emphasis> to be interpreted as the result of an +<function>XrmStringToQuark</function> +conversion on the name of a resource, +which is to be converted into an offset from the widget base. +<function>XtWidgetBaseOffset</function> +<!-- .IN "XtWidgetBaseOffset" "" "@DEF@" --> +is similar to +<function>XtBaseOffset</function> +except that it +searches for the closest windowed ancestor if the object is not +of a subclass of +Core +(see Chapter 12). +<function>XtProcedureArg</function> +<!-- .IN "XtProcedureArg" "" "@DEF@" --> +specifies that <emphasis remap='I'>address_id</emphasis> is a pointer to a procedure to +be invoked to return the conversion argument. If +<function>XtProcedureArg</function> +is specified, <emphasis remap='I'>address_id</emphasis> must contain +the address of a function of type +<function>XtConvertArgProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConvertArgProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtConvertArgProc)(Widget, Cardinal*, XrmValue*); +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>size</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>value</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Passes the object for which the resource is being +converted, or NULL if the converter was invoked by +<function>XtCallConverter</function> +or +<function>XtDirectConvert .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>size</emphasis> + </term> + <listitem> + <para> +Passes a pointer to the <emphasis remap='I'>size</emphasis> field from the +<function>XtConvertArgRec .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value</emphasis> + </term> + <listitem> + <para> +Passes a pointer to a descriptor into which the procedure +must store the conversion argument. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +When invoked, the +<function>XtConvertArgProc</function> +procedure must derive a conversion +argument and store the address and size of the argument in the location +pointed to by <emphasis remap='I'>value</emphasis>. +</para> +<para> +<!-- .LP --> +In order to permit reentrancy, the +<function>XtConvertArgProc</function> +should return the address of storage whose lifetime is no shorter than the +lifetime of <emphasis remap='I'>object</emphasis>. If <emphasis remap='I'>object</emphasis> is NULL, the lifetime of the conversion +argument must be no shorter than the lifetime of the resource with +which the conversion argument is associated. The (xI do not +guarantee to copy this storage but do guarantee not to reference it if +the resource is removed from the conversion cache. +</para> +<para> +<!-- .LP --> +The following example illustrates how to register the CvtStringToPixel +routine given earlier: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .2i 3i --> +<!-- .ta .2i 3i --> +static XtConvertArgRec colorConvertArgs[] = { + {XtWidgetBaseOffset, (XtPointer)XtOffset(Widget, core.screen), sizeof(Screen*)}, + {XtWidgetBaseOffset, (XtPointer)XtOffset(Widget, core.colormap),sizeof(Colormap)} +}; + +XtSetTypeConverter(XtRString, XtRPixel, CvtStringToPixel, + colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay, NULL); +</literallayout> +</para> +<para> +<!-- .LP --> +The conversion argument descriptors +<function>colorConvertArgs</function> +and +<function>screenConvertArg</function> +are predefined by the (xI. Both take the +values from the closest windowed ancestor if the object is not of a +subclass of +Core. +The +<function>screenConvertArg</function> +descriptor puts the widget's <emphasis remap='I'>screen</emphasis> field into <emphasis remap='I'>args</emphasis>[0]. The +<function>colorConvertArgs</function> +descriptor puts the widget's <emphasis remap='I'>screen</emphasis> field into <emphasis remap='I'>args</emphasis>[0], +and the widget's <emphasis remap='I'>colormap</emphasis> field into <emphasis remap='I'>args</emphasis>[1]. +</para> +<para> +<!-- .LP --> +Conversion routines should not just put a descriptor for the address of the +base of the widget into <emphasis remap='I'>args</emphasis>[0], and use that in the routine. +They should pass in the actual values on which the conversion depends. +By keeping the dependencies of the conversion procedure specific, +it is more likely that subsequent conversions will find what they need +in the conversion cache. +This way the cache is smaller and has fewer and more widely applicable entries. +</para> +<para> +<!-- .LP --> +If any conversion arguments of type +<function>XtBaseOffset ,</function> +<function>XtResourceString ,</function> +<function>XtResourceQuark ,</function> +and +<function>XtWidgetBaseOffset</function> +are specified for conversions performed by +<function>XtGetApplicationResources ,</function> +<function>XtGetSubresources ,</function> +<function>XtVaGetApplicationResources ,</function> +or +<function>XtVaGetSubresources ,</function> +the arguments are +computed with respect to the specified widget, not the base address or +resource list specified in the call. +</para> +<para> +<!-- .LP --> +If the +<function>XtConvertArgProc</function> +modifies the resource database, +the changes affect any in-progress widget creation, +<function>XtGetApplicationResources ,</function> +or +<function>XtGetSubresources</function> +in an implementation-defined manner; however, insertion of new entries +or changes to existing entries are allowed and will not directly cause +an error. + +</para> +</sect3> +<sect3 id="Resource_Converter_Invocation"> +<title>Resource Converter Invocation</title> +<!-- .XS --> +<!-- <function>(SN Resource Converter Invocation</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +All resource-fetching routines (for example, +<function>XtGetSubresources ,</function> +<function>XtGetApplicationResources ,</function> +and so on) call resource converters if the resource database or +varargs list specifies a value +that has a different representation from the desired representation or if the +widget's default resource value representation is different from the desired +representation. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To invoke explicit resource conversions, use +<function>XtConvertAndStore</function> +or +<function>XtCallConverter .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef XtPointer XtCacheRef; +</literallayout> +<!-- .IN "XtCallConverter" "" "@DEF@" --> +</para> +<!-- .FD 0 --> +Boolean XtCallConverter(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>converter</emphasis>, \ +<emphasis remap='I'>conversion_args</emphasis>, <emphasis remap='I'>num_args</emphasis>, <emphasis remap='I'>from</emphasis>, <emphasis remap='I'>to_in_out</emphasis>, + <emphasis remap='I'>cache_ref_return</emphasis>) +<!-- .br --> + Display* <emphasis remap='I'>display</emphasis>; +<!-- .br --> + XtTypeConverter <emphasis remap='I'>converter</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>conversion_args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>from</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>to_in_out</emphasis>; +<!-- .br --> + XtCacheRef *<emphasis remap='I'>cache_ref_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display with which the conversion is to be associated. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter</emphasis> + </term> + <listitem> + <para> +Specifies the conversion procedure to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>conversion_args</emphasis> + </term> + <listitem> + <para> +Specifies the additional conversion arguments needed +to perform the conversion, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>conversion_args</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from</emphasis> + </term> + <listitem> + <para> +Specifies a descriptor for the source value. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_in_out</emphasis> + </term> + <listitem> + <para> +Returns the converted value. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>cache_ref_return</emphasis> + </term> + <listitem> + <para> +Returns a conversion cache id. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCallConverter</function> +function looks up the +specified type converter in the application context associated with +the display and, if the converter was not registered or was registered +with cache type +<function>XtCacheAll</function> +or +<function>XtCacheByDisplay ,</function> +looks in the conversion cache to see if this conversion procedure +has been called with the specified conversion arguments. If so, it +checks the success status of the prior call, and if +the conversion failed, +<function>XtCallConverter</function> +returns +<function>False</function> +immediately; +otherwise it checks the size specified in the <emphasis remap='I'>to</emphasis> argument, and, if it is +greater than or equal to the size stored in the cache, copies the +information stored in the cache into the location specified by +<emphasis remap='I'>to->addr</emphasis>, stores the cache size into <emphasis remap='I'>to->size</emphasis>, and returns +<function>True .</function> +If the size specified in the <emphasis remap='I'>to</emphasis> argument is smaller than the size stored +in the cache, +<function>XtCallConverter</function> +copies the cache size into <emphasis remap='I'>to->size</emphasis> and returns +<function>False .</function> +If the converter was registered with cache type +<function>XtCacheNone</function> +or no value was found in the conversion cache, +<function>XtCallConverter</function> +calls the converter, and if it was not registered with cache type +<function>XtCacheNone ,</function> +enters the result in the cache. +<function>XtCallConverter</function> +then returns what the converter returned. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>cache_ref_return</emphasis> field specifies storage allocated by the caller in which +an opaque value will be stored. If the type converter has been +registered with the +<function>XtCacheRefCount</function> +modifier and if the value returned +in <emphasis remap='I'>cache_ref_return</emphasis> is non-NULL, then the caller should store the +<emphasis remap='I'>cache_ref_return</emphasis> value in order to decrement the reference count when +the converted value is no longer required. The <emphasis remap='I'>cache_ref_return</emphasis> +argument should be +NULL if the caller is unwilling or unable to store the +value. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To explicitly decrement the reference counts for resources obtained +from +<function>XtCallConverter ,</function> +use +<function>XtAppReleaseCacheRefs .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppReleaseCacheRefs" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppReleaseCacheRefs(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>refs</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtCacheRef *<emphasis remap='I'>refs</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>refs</emphasis> + </term> + <listitem> + <para> +Specifies the list of cache references to be released. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppReleaseCacheRefs</function> +decrements the reference count for the +conversion entries identified by the <emphasis remap='I'>refs</emphasis> argument. +This argument is a +pointer to a NULL-terminated list of +<function>XtCacheRef</function> +values. If any reference +count reaches zero, the destructor, if any, will be called and +the resource removed from the conversion cache. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +As a convenience to clients needing to explicitly decrement reference +counts via a callback function, the (xI define two callback +procedures, +<function>XtCallbackReleaseCacheRef</function> +and +<function>XtCallbackReleaseCacheRefList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackReleaseCacheRef" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallbackReleaseCacheRef(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object with which the resource is associated. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the conversion cache entry to be released. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Is ignored. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This callback procedure may be added to a callback list to release a +previously returned +<function>XtCacheRef</function> +value. When adding the callback, the +callback <emphasis remap='I'>client_data</emphasis> argument must be specified as the value of the +<function>XtCacheRef</function> +data cast to type +<function>XtPointer .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallbackReleaseCacheRefList" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallbackReleaseCacheRefList(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>call_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>call_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object with which the resources are associated. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the conversion cache entries to be released. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>call_data</emphasis> + </term> + <listitem> + <para> +Is ignored. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This callback procedure may be added to a callback list to release a +list of previously returned +<function>XtCacheRef</function> +values. When adding the +callback, the callback <emphasis remap='I'>client_data</emphasis> argument must be specified as a +pointer to a NULL-terminated list of +<function>XtCacheRef</function> +values. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To lookup and call a resource converter, copy the resulting value, +and free a cached resource when a widget is destroyed, use +<function>XtConvertAndStore .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConvertAndStore" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtConvertAndStore(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>from</emphasis>, \ +<emphasis remap='I'>to_type</emphasis>, <emphasis remap='I'>to_in_out</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + String <emphasis remap='I'>from_type</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>from</emphasis>; +<!-- .br --> + String <emphasis remap='I'>to_type</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>to_in_out</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object to use for additional arguments, if any are needed, +and the destroy callback list. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from_type</emphasis> + </term> + <listitem> + <para> +Specifies the source type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from</emphasis> + </term> + <listitem> + <para> +Specifies the value to be converted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the destination type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a descriptor for storage into which the converted value +will be returned. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtConvertAndStore</function> +function looks up the type converter registered +to convert <emphasis remap='I'>from_type</emphasis> to <emphasis remap='I'>to_type</emphasis>, computes any additional arguments +needed, and then calls +<function>XtCallConverter</function> +(or +<function>XtDirectConvert</function> +if an old-style converter was registered with +<function>XtAddConverter</function> +or +<function>XtAppAddConverter ;</function> +see Appendix C) with the <emphasis remap='I'>from</emphasis> and <emphasis remap='I'>to_in_out</emphasis> arguments. The +<emphasis remap='I'>to_in_out</emphasis> argument specifies the size and location into which the +converted value will be stored and is passed directly to the +converter. If the location is specified as NULL, it will be replaced +with a pointer to private storage and the size will be returned in the +descriptor. The caller is expected to copy this private storage +immediately and must not modify it in any way. If a non-NULL location +is specified, the caller must allocate sufficient storage to hold the +converted value and must also specify the size of that storage in the +descriptor. +The <emphasis remap='I'>size</emphasis> field will be modified on return to indicate the actual +size of the converted data. +If the conversion succeeds, +<function>XtConvertAndStore</function> +returns +<function>True ;</function> +otherwise, it returns +<function>False .</function> +</para> +<para> +<!-- .LP --> +<function>XtConvertAndStore</function> +adds +<function>XtCallbackReleaseCacheRef</function> +<!-- .IN "destroyCallback" --> +to the destroyCallback list of the specified object if the conversion +returns an +<function>XtCacheRef</function> +value. The resulting resource should not be referenced +after the object has been destroyed. +</para> +<para> +<!-- .LP --> +<function>XtCreateWidget</function> +performs processing equivalent to +<function>XtConvertAndStore</function> +when initializing the object instance. Because there is extra memory +overhead required to implement reference counting, clients may +distinguish those objects that are never destroyed before the +application exits from those that may be destroyed and whose +resources should be deallocated. +</para> +<para> +<!-- .LP --> +To specify whether reference counting is to be enabled for the +resources of a particular object when the object is created, the +client can specify a value for the +<function>Boolean</function> +resource +XtNinitialResourcesPersistent, +<!-- .IN "XtNinitialResourcesPersistent" "" "@DEF@" --> +class +XtCInitialResourcesPersistent. +</para> +<para> +<!-- .LP --> +When +<function>XtCreateWidget</function> +is called, if this resource is not specified as +<function>False</function> +in either the arglist or the resource database, then the +resources referenced by this object are not reference-counted, regardless of +how the type converter may have been registered. The effective +default value is +<function>True ;</function> +thus clients that expect to destroy one or +more objects and want resources deallocated must explicitly specify +<function>False</function> +for +<!-- .IN XtNinitialResourcesPersistent --> +XtNinitialResourcesPersistent. +</para> +<para> +<!-- .LP --> +The resources are still freed and destructors called when +<function>XtCloseDisplay</function> +is called if the conversion was registered as +<function>XtCacheByDisplay .</function> + +</para> +</sect3> +</sect2> +<sect2 id="Reading_and_Writing_Widget_State"> +<title>Reading and Writing Widget State</title> +<!-- .XS --> +<!-- <function>(SN Reading and Writing Widget State</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Any resource field in a widget can be read or written by a client. +On a write operation, +the widget decides what changes it will actually allow and updates all +derived fields appropriately. + +</para> +<sect3 id="Obtaining_Widget_State"> +<title>Obtaining Widget State</title> +<!-- .XS --> +<!-- <function>(SN Obtaining Widget State</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve the current values of resources associated with a +widget instance, use +<function>XtGetValues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetValues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetValues(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object whose resource values are to be returned. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list of name/address pairs that contain the +resource names and the addresses into which the resource values are to +be stored. +The resource names are widget-dependent. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetValues</function> +function starts with the resources specified for the Object class +and proceeds down the subclass chain to the class of the object. +The <emphasis remap='I'>value</emphasis> field of a passed argument list must contain the +address into which to copy the contents of the corresponding +object instance field. If the field is a pointer type, the lifetime +of the pointed-to data is defined by the object class. For the +(xI-defined resources, the following lifetimes apply: +</para> +<itemizedlist> + <listitem> + <para> +Not valid following any operation that modifies the resource: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +XtNchildren resource of composite widgets. + </para> + </listitem> + <listitem> + <para> +All resources of representation type XtRCallback. +<!-- .RE --> + </para> + </listitem> + <listitem> + <para> +Remain valid at least until the widget is destroyed: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +XtNaccelerators, XtNtranslations. +<!-- .RE --> + </para> + </listitem> + <listitem> + <para> +Remain valid until the Display is closed: +<!-- .RS --> + </para> + </listitem> + <listitem> + <para> +XtNscreen. +<!-- .RE --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +It is the caller's responsibility +to allocate and deallocate storage for the copied data +according to the size of the +resource representation type used within the object. +</para> +<para> +<!-- .LP --> +If the class of the object's parent is a subclass of +<function>constraintWidgetClass ,</function> +<function>XtGetValues</function> +then fetches the values for any constraint resources requested. +It starts with the constraint resources specified for +<function>constraintWidgetClass</function> +and proceeds down the subclass chain to the parent's constraint resources. +If the argument list contains a resource name that is not found in any of the +resource lists searched, +the value at the corresponding address is not modified. +<!-- .IN "get_values_hook procedure" --> +If any get_values_hook procedures in the +object's class or superclass records are non-NULL, +they are called in superclass-to-subclass order after +all the resource values have been fetched by +<function>XtGetValues .</function> +Finally, if the object's parent is a +subclass of +<function>constraintWidgetClass ,</function> +and if any of the parent's class or +superclass records have declared +<function>ConstraintClassExtension</function> +records in +the Constraint class part <emphasis remap='I'>extension</emphasis> field with a record type of +<function>\s-1NULLQUARK\s+1 ,</function> +and if the <emphasis remap='I'>get_values_hook</emphasis> field in the extension record is non-NULL, +<function>XtGetValues</function> +calls the get_values_hook procedures in superclass-to-subclass order. +This permits a Constraint parent to provide +nonresource data via +<function>XtGetValues .</function> +</para> +<para> +<!-- .LP --> +Get_values_hook procedures may modify the data stored at the +location addressed by the <emphasis remap='I'>value</emphasis> field, including (but not +limited to) making a copy of data whose resource representation is a +pointer. None of the (xI-defined object classes copy +data in this manner. Any operation that modifies the queried +object resource may invalidate the pointed-to data. + +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve the current values of resources associated with a widget +instance using varargs lists, use +<function>XtVaGetValues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaGetValues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtVaGetValues(<emphasis remap='I'>object</emphasis>, ...) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object whose resource values are to be returned. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list for the resources to +be returned. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaGetValues</function> +is identical in function to +<function>XtGetValues</function> +with the <emphasis remap='I'>args</emphasis> +and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, as described in +Section 2.5.1. All value entries in the list must specify pointers to +storage allocated by the caller to which the resource value will be +copied. It is the caller's responsibility to ensure that sufficient +storage is allocated. If +<function>XtVaTypedArg</function> +is specified, the <emphasis remap='I'>type</emphasis> argument +specifies the representation desired by the caller and <emphasis remap='I'>the</emphasis> size argument +specifies the number of bytes allocated to store the result of the +conversion. If the size is insufficient, a warning message is issued +and the list entry is skipped. + +</para> +<sect4 id="Widget_Subpart_Resource_Data_The_get_values_hook_Procedure"> +<title>Widget Subpart Resource Data: The get_values_hook Procedure</title> +<!-- .XS --> +<!-- (SN Widget Subpart Resource Data: The get_values_hook Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +Widgets that have subparts can return resource values from them through +<function>XtGetValues</function> +by supplying a get_values_hook procedure. +The get_values_hook procedure pointer is of type +<function>XtArgsProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "get_values_hook procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtArgsProc)(Widget, ArgList, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget whose subpart resource values are to be retrieved. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list that was passed to +<function>XtGetValues</function> +or the transformed varargs list passed to +<function>XtVaGetValues .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The widget with subpart resources should call +<function>XtGetSubvalues</function> +in the get_values_hook procedure +and pass in its subresource list and the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters. + +</para> +</sect4> +<sect4 id="Widget_Subpart_State"> +<title>Widget Subpart State</title> +<!-- .XS --> +<!-- (SN Widget Subpart State --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve the current values of subpart resource data associated with a +widget instance, use +<function>XtGetSubvalues .</function> +For a discussion of subpart resources, +see Section 9.4. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSubvalues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSubvalues(<emphasis remap='I'>base</emphasis>, <emphasis remap='I'>resources</emphasis>, <emphasis remap='I'>num_resources</emphasis>, \ +<emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address of the subpart data structure for which the +resources should be retrieved. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the subpart resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list of name/address pairs that contain the +resource names and the addresses into which the resource values are to +be stored. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetSubvalues</function> +function obtains resource values from the structure identified by <emphasis remap='I'>base</emphasis>. +The <emphasis remap='I'>value</emphasis> field in each argument entry must contain the address into +which to store the corresponding resource value. It is the caller's +responsibility to allocate and deallocate this storage according to +the size of the resource representation type used within the subpart. +If the argument list contains a resource name that is not found in the +resource list, the value at the corresponding address is not modified. + +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve the current values of subpart resources associated with +a widget instance using varargs lists, use +<function>XtVaGetSubvalues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaGetSubvalues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtVaGetSubvalues(<emphasis remap='I'>base</emphasis>, <emphasis remap='I'>resources</emphasis>, <emphasis remap='I'>num_resources</emphasis>, ...) +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address of the subpart data structure for which the +resources should be retrieved. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the subpart resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies a variable argument list of name/address pairs that +contain the resource names and the addresses into which the resource +values are to be stored. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaGetSubvalues</function> +is identical in function to +<function>XtGetSubvalues</function> +with the +<emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, as described +in Section 2.5.1. +<function>XtVaTypedArg</function> +is not supported for +<function>XtVaGetSubvalues .</function> +If +<function>XtVaTypedArg</function> +is specified in the list, a warning message is issued +and the entry is then ignored. + +</para> +</sect4> +</sect3> +<sect3 id="Setting_Widget_State"> +<title>Setting Widget State</title> +<!-- .XS --> +<!-- <function>(SN Setting Widget State</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To modify the current values of resources associated with a widget +instance, use +<function>XtSetValues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetValues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetValues(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object whose resources are to be modified. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list of name/value pairs that contain the +resources to be modified and their new values. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSetValues</function> +function starts with the resources specified for the +Object +class fields and proceeds down the subclass chain to the object. +At each stage, it replaces the <emphasis remap='I'>object</emphasis> resource fields with any values +specified in the argument list. +<function>XtSetValues</function> +then calls the set_values procedures for the object in superclass-to-subclass +order. +<!-- .IN "set_values_hook procedure" --> +If the object has any non-NULL <emphasis remap='I'>set_values_hook</emphasis> fields, +these are called immediately after the +corresponding set_values procedure. +This procedure permits subclasses to set subpart data via +<function>XtSetValues .</function> +</para> +<para> +<!-- .LP --> +If the class of the object's parent is a subclass of +<function>constraintWidgetClass ,</function> +<function>XtSetValues</function> +also updates the object's constraints. +It starts with the constraint resources specified for +<function>constraintWidgetClass</function> +and proceeds down the subclass chain to the parent's class. +At each stage, it replaces the constraint resource fields with any +values specified in the argument list. +It then calls the constraint set_values procedures from +<function>constraintWidgetClass</function> +down to the parent's class. +The constraint set_values procedures are called with widget arguments, +as for all set_values procedures, not just the constraint records, +so that they can make adjustments to the desired values based +on full information about the widget. Any arguments specified that +do not match a resource list entry are silently ignored. +</para> +<para> +<!-- .LP --> +If the object is of a subclass of +RectObj, +<function>XtSetValues</function> +determines if a geometry request is needed by comparing the old object to +the new object. +If any geometry changes are required, +<function>XtSetValues</function> +restores the original geometry and makes the request on behalf of the widget. +If the geometry manager returns +<function>XtGeometryYes ,</function> +<function>XtSetValues</function> +calls the object's resize procedure. +If the geometry manager returns +<function>XtGeometryDone ,</function> +<function>XtSetValues</function> +continues, as the object's resize procedure should have been called +by the geometry manager. +If the geometry manager returns +<function>XtGeometryNo ,</function> +<function>XtSetValues</function> +ignores the geometry request and continues. +If the geometry manager returns +<function>XtGeometryAlmost ,</function> +<function>XtSetValues</function> +calls the set_values_almost procedure, +which determines what should be done. +<function>XtSetValues</function> +then repeats this process, +deciding once more whether the geometry manager should be called. +</para> +<para> +<!-- .LP --> +Finally, if any of the set_values procedures returned +<function>True ,</function> +and the widget is realized, +<function>XtSetValues</function> +causes the widget's expose procedure to be invoked by calling +<function>XClearArea</function> +on the widget's window. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To modify the current values of resources associated with a widget +instance using varargs lists, use +<function>XtVaSetValues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaSetValues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtVaSetValues(<emphasis remap='I'>object</emphasis>, ...) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies the object whose resources are to be modified. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list of name/value pairs that +contain the resources to be modified and their new values. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaSetValues</function> +is identical in function to +<function>XtSetValues</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, as +described in Section 2.5.1. + +</para> +<sect4 id="Widget_State_The_set_values_Procedure"> +<title>Widget State: The set_values Procedure</title> +<!-- .XS --> +<!-- (SN Widget State: The set_values Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +The set_values procedure pointer in a widget class is of type +<function>XtSetValuesFunc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetValuesFunc" "" "@DEF@" --> +<!-- .IN "set_values procedure" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtSetValuesFunc)(Widget, Widget, Widget, ArgList, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>current</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>request</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>new</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>current</emphasis> + </term> + <listitem> + <para> +Specifies a copy of the widget as it was before the +<function>XtSetValues</function> +call. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request</emphasis> + </term> + <listitem> + <para> +Specifies a copy of the widget with all values changed as asked for by the +<function>XtSetValues</function> +call before any class set_values procedures have been called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>new</emphasis> + </term> + <listitem> + <para> +Specifies the widget with the new values that are actually allowed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list passed to +<function>XtSetValues</function> +or the transformed argument list passed to +<function>XtVaSetValues .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The set_values procedure should recompute any field +derived from resources that are changed +(for example, many GCs depend on foreground and background pixels). +If no recomputation is necessary, and if none of the resources specific to a +subclass require the window to be redisplayed when their values are changed, +you can specify NULL for the <emphasis remap='I'>set_values</emphasis> field in the class record. +</para> +<para> +<!-- .LP --> +Like the initialize procedure, +set_values mostly deals only with the fields defined in the subclass, +but it has to resolve conflicts with its superclass, +especially conflicts over width and height. +</para> +<para> +<!-- .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. +</para> +<para> +<!-- .LP --> +As an example, +a subclass can visually surround its superclass display. +In this case, the width and height calculated by the superclass set_values +procedure are too small and need to be incremented by the size of the surround. +The subclass needs to know if its superclass's size was calculated by the +superclass or was specified explicitly. +All widgets must place themselves into whatever size is explicitly given, +but they should compute a reasonable size if no size is requested. +How does a subclass know the difference between a specified size +and a size computed by a superclass? +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>request</emphasis> and <emphasis remap='I'>new</emphasis> parameters provide the necessary information. +The <emphasis remap='I'>request</emphasis> widget is a copy of the widget, updated as originally requested. +The <emphasis remap='I'>new</emphasis> widget starts with the values in the request, +but it has additionally been updated by all superclass set_values +procedures called so far. +A subclass set_values procedure can compare these two to resolve +any potential conflicts. +The set_values procedure need not refer to the <emphasis remap='I'>request</emphasis> widget +unless it must resolve conflicts between the <emphasis remap='I'>current</emphasis> and <emphasis remap='I'>new</emphasis> widgets. +Any changes the widget needs to make, including geometry changes, +should be made in the <emphasis remap='I'>new</emphasis> widget. +</para> +<para> +<!-- .LP --> +In the above example, +the subclass with the visual surround can see +if the <emphasis remap='I'>width</emphasis> and <emphasis remap='I'>height</emphasis> in the <emphasis remap='I'>request</emphasis> widget are zero. +If so, +it adds its surround size to the <emphasis remap='I'>width</emphasis> and +<emphasis remap='I'>height</emphasis> fields in the <emphasis remap='I'>new</emphasis> widget. +If not, it must make do with the size originally specified. +In this case, zero is a special value defined by the class to permit +the application to invoke this behavior. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>new</emphasis> widget is the actual widget instance record. +Therefore, +the set_values procedure should do all its work on the <emphasis remap='I'>new</emphasis> widget; +the <emphasis remap='I'>request</emphasis> widget should never be modified. +If the set_values procedure needs to call any routines that operate on +a widget, it should specify <emphasis remap='I'>new</emphasis> as the widget instance. +</para> +<para> +<!-- .LP --> +Before calling the set_values procedures, the (xI modify the +resources of the <emphasis remap='I'>request</emphasis> widget according to the contents of the arglist; +if the widget names all its resources in the class resource list, it is +never necessary to examine the contents of <emphasis remap='I'>args</emphasis>. +</para> +<para> +<!-- .LP --> +Finally, the set_values procedure must return a Boolean that indicates whether +the widget needs to be redisplayed. +Note that a change in the geometry fields alone does not require +the set_values procedure to return +<function>True ;</function> +the X server will eventually generate an +<function>Expose</function> +event, if necessary. +After calling all the set_values procedures, +<function>XtSetValues</function> +forces a redisplay by calling +<function>XClearArea</function> +if any of the set_values procedures returned +<function>True .</function> +Therefore, a set_values procedure should not try to do its own redisplaying. +</para> +<para> +<!-- .LP --> +Set_values procedures should not do any work in response to changes in +geometry because +<function>XtSetValues</function> +eventually will perform a geometry request, and that request might be denied. +If the widget actually changes size in response to a +call to +<function>XtSetValues ,</function> +its resize procedure is called. +Widgets should do any geometry-related work in their resize procedure. +</para> +<para> +<!-- .LP --> +Note that it is permissible to call +<function>XtSetValues</function> +before a widget is realized. +Therefore, the set_values procedure must not assume that the widget is realized. + +</para> +</sect4> +<sect4 id="Widget_State_The_set_values_almost_Procedure"> +<title>Widget State: The set_values_almost Procedure</title> +<!-- .XS --> +<!-- (SN Widget State: The set_values_almost Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +The set_values_almost procedure pointer in the widget class record is of type +<function>XtAlmostProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "set_values_almost procedure" "" "@DEF@" --> +<!-- .IN "XtAlmostProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtAlmostProc)(Widget, Widget, XtWidgetGeometry*, \ +XtWidgetGeometry*); +<!-- .br --> + Widget <emphasis remap='I'>old</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>new</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>request</emphasis>; +<!-- .br --> + XtWidgetGeometry *<emphasis remap='I'>reply</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>old</emphasis> + </term> + <listitem> + <para> +Specifies a copy of the object as it was before the +<function>XtSetValues</function> +call. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>new</emphasis> + </term> + <listitem> + <para> +Specifies the object instance record. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request</emphasis> + </term> + <listitem> + <para> +Specifies the original geometry request that was sent to the geometry +manager that caused +<function>XtGeometryAlmost</function> +to be returned. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>reply</emphasis> + </term> + <listitem> + <para> +Specifies the compromise geometry that was returned by the geometry +manager with +<function>XtGeometryAlmost .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Most classes inherit the set_values_almost procedure from their superclass by +specifying +<function>XtInheritSetValuesAlmost</function> +in the class initialization. +The +set_values_almost procedure in +<function>rectObjClass</function> +accepts the compromise suggested. +</para> +<para> +<!-- .LP --> +The set_values_almost procedure is called when a client tries to set a widget's +geometry by means of a call to +<function>XtSetValues</function> +and the geometry manager cannot +satisfy the request but instead returns +<function>XtGeometryNo</function> +or +<function>XtGeometryAlmost</function> +and a compromise geometry. +The <emphasis remap='I'>new</emphasis> object is the actual instance record. The <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, +<emphasis remap='I'>width</emphasis>, <emphasis remap='I'>height</emphasis>, +and <emphasis remap='I'>border_width</emphasis> fields contain the original values as they were +before the +<function>XtSetValues</function> +call, and all other fields contain the new +values. The <emphasis remap='I'>request</emphasis> parameter contains the new geometry request that +was made to the parent. The <emphasis remap='I'>reply</emphasis> parameter contains +<emphasis remap='I'>reply->request_mode</emphasis> equal to zero if the parent returned +<function>XtGeometryNo</function> +and contains the parent's compromise geometry otherwise. The +set_values_almost procedure takes the original geometry and the +compromise geometry and determines if the compromise is +acceptable or whether +to try a different compromise. +It returns its results in the <emphasis remap='I'>request</emphasis> parameter, +which is then sent back to the geometry manager for another try. +To accept the compromise, the procedure must copy the contents +of the <emphasis remap='I'>reply</emphasis> geometry into the <emphasis remap='I'>request</emphasis> geometry; to attempt an +alternative geometry, the procedure may modify any part of the <emphasis remap='I'>request</emphasis> +argument; to terminate the geometry negotiation and retain the +original geometry, the procedure must set <emphasis remap='I'>request->request_mode</emphasis> to +zero. The geometry fields of the <emphasis remap='I'>old</emphasis> and <emphasis remap='I'>new</emphasis> instances must not be modified +directly. + +</para> +</sect4> +<sect4 id="Widget_State_The_ConstraintClassPart_set_values_Procedure"> +<title>Widget State: The ConstraintClassPart set_values Procedure</title> +<!-- .XS --> +<!-- (SN Widget State: The ConstraintClassPart set_values Procedure --> +<!-- .XE --> +<!-- .IN "set_values procedure" --> +<para> +<!-- .LP --> +The constraint set_values procedure pointer is of type +<function>XtSetValuesFunc .</function> +The values passed to the parent's constraint set_values procedure +are the same as those passed to the child's class +set_values procedure. +A class can specify NULL for the <emphasis remap='I'>set_values</emphasis> field of the +<function>ConstraintPart</function> +if it need not compute anything. +</para> +<para> +<!-- .LP --> +The constraint set_values procedure should recompute any constraint fields +derived from constraint resources that are changed. +Furthermore, it may modify other widget fields as appropriate. +For example, if a constraint for the maximum height of a widget is changed +to a value smaller than the widget's current height, +the constraint set_values procedure may reset the <emphasis remap='I'>height</emphasis> field in the +widget. + +</para> +</sect4> +<sect4 id="Widget_Subpart_State"> +<title>Widget Subpart State</title> +<!-- .XS --> +<!-- (SN Widget Subpart State --> +<!-- .XE --> +<para> +<!-- .LP --> +To set the current values of subpart resources associated with a +widget instance, use +<function>XtSetSubvalues .</function> +For a discussion of subpart resources, +see Section 9.4. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetSubvalues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetSubvalues(<emphasis remap='I'>base</emphasis>, <emphasis remap='I'>resources</emphasis>, <emphasis remap='I'>num_resources</emphasis>, \ +<emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address of the subpart data structure into which the +resources should be written. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the subpart resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list of name/value pairs that contain the +resources to be modified and their new values. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSetSubvalues</function> +function updates the resource fields of the structure identified by +<emphasis remap='I'>base</emphasis>. Any specified arguments that do not match an entry in the +resource list are silently ignored. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To set the current values of subpart resources associated with +a widget instance using varargs lists, use +<function>XtVaSetSubvalues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaSetSubvalues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtVaSetSubvalues(<emphasis remap='I'>base</emphasis>, <emphasis remap='I'>resources</emphasis>, <emphasis remap='I'>num_resources</emphasis>, ...) +<!-- .br --> + XtPointer <emphasis remap='I'>base</emphasis>; +<!-- .br --> + XtResourceList <emphasis remap='I'>resources</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_resources</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>base</emphasis> + </term> + <listitem> + <para> +Specifies the base address of the subpart data structure into which the +resources should be written. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>resources</emphasis> + </term> + <listitem> + <para> +Specifies the subpart resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_resources</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the resource list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list of name/value pairs that +contain the resources to be modified and their new values. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtVaSetSubvalues</function> +is identical in function to +<function>XtSetSubvalues</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, as +described in Section 2.5.1. +<function>XtVaTypedArg</function> +is not supported for +<function>XtVaSetSubvalues .</function> +If an entry containing +<function>XtVaTypedArg</function> +is specified in the list, a warning message is issued +and the entry is ignored. + +</para> +</sect4> +<sect4 id="Widget_Subpart_Resource_Data_The_set_values_hook_Procedure"> +<title>Widget Subpart Resource Data: The set_values_hook Procedure</title> +<!-- .XS --> +<!-- (SN Widget Subpart Resource Data: The set_values_hook Procedure --> +<!-- .XE --> +<!-- .IN "set_values_hook procedure" --> +<!-- .NT --> +The set_values_hook procedure is obsolete, as the same information +is now available to the set_values procedure. The procedure has been +retained for those widgets that used it in versions prior to Release 4. +<!-- .NE --> +<para> +<!-- .LP --> +Widgets that have a subpart can set the subpart resource values through +<function>XtSetValues</function> +by supplying a set_values_hook procedure. +The set_values_hook procedure pointer in a widget class is of type +<function>XtArgsFunc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "set_values_hook procedure" "" "@DEF@" --> +<!-- .IN "XtArgsFunc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtArgsFunc)(Widget, Arglist, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Arglist <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget whose subpart resource values are to be changed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list that was passed to +<function>XtSetValues</function> +or the transformed varargs list passed to +<function>XtVaSetValues .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The widget with subpart resources may call +<function>XtSetValues</function> +from the set_values_hook procedure +and pass in its subresource list and the +<emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect4> +</sect3> +</sect2> +</chapter> +</book> diff --git a/specs/CH10.xml b/specs/CH10.xml new file mode 100644 index 0000000..a858b10 --- /dev/null +++ b/specs/CH10.xml @@ -0,0 +1,2621 @@ +<!-- .\" $Xorg: CH10,v 1.3 2000/08/17 19:42:46 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 10</function>\s-1 + +\s+1\fBTranslation Management\s-1 +<!-- .sp 2 --> +<!-- .nr H1 10 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 10 \(em Translation Management --> +<!-- .XE --> +Except under unusual circumstances, +widgets do not hardwire the mapping of user events into widget behavior +by using the event manager. +Instead, they provide a default mapping of events into behavior +that you can override. +</para> +<para> +<!-- .LP --> +The translation manager provides an interface to specify and manage the +mapping of X event sequences into widget-supplied functionality, +for example, calling procedure <emphasis remap='I'>Abc</emphasis> when the <emphasis remap='I'>y</emphasis> key +is pressed. +</para> +<para> +<!-- .LP --> +The translation manager uses two kinds of tables to perform translations: +</para> +<itemizedlist> + <listitem> + <para> +The action tables, which are in the widget class structure, +specify the mapping of externally available procedure name strings +to the corresponding procedure implemented by the widget class. + </para> + </listitem> + <listitem> + <para> +A translation table, which is in the widget class structure, +specifies the mapping of event sequences to procedure name strings. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +You can override the translation table in the class structure +for a specific widget instance by supplying a different translation table +for the widget instance. The resources +XtNtranslations and XtNbaseTranslations are used to modify the class +default translation table; see Section 10.3. + +</para> +<sect2 id="Action_Tables"> +<title>Action Tables</title> +<!-- .XS --> +<!-- <function>(SN Action Tables</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +All widget class records contain an action table, +an array of +<function>XtActionsRec</function> +entries. +In addition, +an application can register its own action tables with the translation manager +so that the translation tables it provides to widget instances can access +application functionality directly. +The translation action procedure pointer is of type +<function>XtActionProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "action_proc procedure" "" "@DEF@" --> +<!-- .IN "XtActionProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtActionProc)(Widget, XEvent*, String*, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that caused the action to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies the event that caused the action to be called. +If the action is called after a sequence of events, +then the last event in the sequence is used. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the list of strings that were specified +in the translation table as arguments to the action, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. +<!-- .IN "XtActionsRec" --> +<!-- .IN "XtActionList" --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _XtActionsRec { + String string; + XtActionProc proc; +} XtActionsRec, *XtActionList; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>string</emphasis> field is the name used in translation tables to access +the procedure. +The <emphasis remap='I'>proc</emphasis> field is a pointer to a procedure that implements +the functionality. +</para> +<para> +<!-- .LP --> +When the action list is specified as the +<function>CoreClassPart</function> +<emphasis remap='I'>actions</emphasis> field, the string pointed to by <emphasis remap='I'>string</emphasis> must be +permanently allocated prior to or during the execution of the class +initialization procedure and must not be subsequently deallocated. +</para> +<para> +<!-- .LP --> +Action procedures should not assume that the widget in which they +are invoked is realized; an accelerator specification can cause +an action procedure to be called for a widget that does not yet +have a window. Widget writers should also note which of a widget's +callback lists are invoked from action procedures and warn clients +not to assume the widget is realized in those callbacks. +</para> +<para> +<!-- .LP --> +For example, a Pushbutton widget has procedures to take the following actions: +</para> +<itemizedlist> + <listitem> + <para> +Set the button to indicate it is activated. + </para> + </listitem> + <listitem> + <para> +Unset the button back to its normal mode. + </para> + </listitem> + <listitem> + <para> +Highlight the button borders. + </para> + </listitem> + <listitem> + <para> +Unhighlight the button borders. + </para> + </listitem> + <listitem> + <para> +Notify any callbacks that the button has been activated. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The action table for the Pushbutton widget class makes these functions +available to translation tables written for Pushbutton or any subclass. +The string entry is the name used in translation tables. +The procedure entry (usually spelled identically to the string) +is the name of the C procedure that implements that function: +</para> +<para> +<!-- .LP --> +<!-- .IN "Action Table" --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.5i --> +<!-- .ta .5i 1.5i --> +XtActionsRec actionTable[] = { + {"Set", Set}, + {"Unset", Unset}, + {"Highlight", Highlight}, + {"Unhighlight", Unhighlight} + {"Notify", Notify}, +}; +</literallayout> +</para> +<para> +<!-- .LP --> +The (xI reserve all action names and parameters starting with +the characters ``Xt'' for future standard enhancements. Users, +applications, and widgets should not declare action names or pass +parameters starting with these characters except to invoke specified +built-in (xI functions. + +</para> +<sect3 id="Action_Table_Registration"> +<title>Action Table Registration</title> +<!-- .XS --> +<!-- <function>(SN Action Table Registration</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "actions" --> +The <emphasis remap='I'>actions</emphasis> and <emphasis remap='I'>num_actions</emphasis> fields of +<function>CoreClassPart</function> +specify the actions implemented by a widget class. These are +automatically registered with the (xI when the class is initialized +and must be allocated in writable storage prior to Core class_part +initialization, and never deallocated. To save memory and optimize +access, the (xI may overwrite the storage in order to compile the +list into an internal representation. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To declare an action table within an application +and register it with the translation manager, use +<function>XtAppAddActions .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddActions" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppAddActions(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>actions</emphasis>, <emphasis remap='I'>num_actions</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtActionList <emphasis remap='I'>actions</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_actions</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>actions</emphasis> + </term> + <listitem> + <para> +Specifies the action table to register. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_actions</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in this action table. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If more than one action is registered with the same name, +the most recently registered action is used. +If duplicate actions exist in an action table, +the first is used. +The (xI register an action table containing +<function>XtMenuPopup</function> +and +<function>XtMenuPopdown</function> +as part of +<function>XtCreateApplicationContext .</function> + +</para> +</sect3> +<sect3 id="Action_Names_to_Procedure_Translations"> +<title>Action Names to Procedure Translations</title> +<!-- .XS --> +<!-- <function>(SN Action Names to Procedure Translations</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The translation manager uses a simple algorithm to resolve the name of +a procedure specified in a translation table into the +actual procedure specified +in an action table. +When the widget +is realized, the translation manager +performs a search for the name in the following tables, in order: +</para> +<itemizedlist> + <listitem> + <para> +The widget's class and all superclass action tables, in subclass-to-superclass +order. + </para> + </listitem> + <listitem> + <para> +The parent's class and all superclass action tables, in subclass-to-superclass +order, then on up the ancestor tree. + </para> + </listitem> + <listitem> + <para> +The action tables registered with +<function>XtAppAddActions</function> +and +<function>XtAddActions</function> +from the most recently added table to the oldest table. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +As soon as it finds a name, +the translation manager stops the search. +If it cannot find a name, +the translation manager generates a warning message. + +</para> +</sect3> +<sect3 id="Action_Hook_Registration"> +<title>Action Hook Registration</title> +<!-- .XS --> +<!-- <function>(SN Action Hook Registration</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +An application can specify a procedure that will be called just before +every action routine is dispatched by the translation manager. To do +so, the application supplies a procedure pointer of type +<function>XtActionHookProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtActionHookProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtActionHookProc)(Widget, XtPointer, String, XEvent*, \ +String*, Cardinal*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + String <emphasis remap='I'>action_name</emphasis>; +<!-- .br --> + XEvent* <emphasis remap='I'>event</emphasis>; +<!-- .br --> + String* <emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal* <emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget whose action is about to be dispatched. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the application-specific closure that was passed to +<function>XtAppAddActionHook.</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>action_name</emphasis> + </term> + <listitem> + <para> +Specifies the name of the action to be dispatched. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies the event argument that will be passed to the action routine. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies the action parameters that will be passed to the action routine. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Action hooks should not modify any of the data pointed to by the +arguments other than the <emphasis remap='I'>client_data</emphasis> argument. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To add an action hook, use +<function>XtAppAddActionHook .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppAddActionHook" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtActionHookId XtAppAddActionHook(<emphasis remap='I'>app</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app</emphasis>; +<!-- .br --> + XtActionHookProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the action hook procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies application-specific data to be passed to the action hook. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppAddActionHook</function> +adds the specified procedure to the front of a list +maintained in the application context. In the future, when an action +routine is about to be invoked for any widget in this application +context, either through the translation manager or via +<function>XtCallActionProc ,</function> +the action hook procedures will be called in reverse +order of registration just prior to invoking the action routine. +</para> +<para> +<!-- .LP --> +Action hook procedures are removed automatically and the +<function>XtActionHookId is</function> +destroyed when the application context in which +they were added is destroyed. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To remove an action hook procedure without destroying the application +context, use +<function>XtRemoveActionHook .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRemoveActionHook" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRemoveActionHook(<emphasis remap='I'>id</emphasis>) +<!-- .br --> + XtActionHookId <emphasis remap='I'>id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>id</emphasis> + </term> + <listitem> + <para> +Specifies the action hook id returned by +<function>XtAppAddActionHook .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtRemoveActionHook</function> +removes the specified action hook procedure from +the list in which it was registered. + +</para> +</sect3> +</sect2> +<sect2 id="Translation_Tables"> +<title>Translation Tables</title> +<!-- .XS --> +<!-- <function>(SN Translation Tables</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +All widget instance records contain a translation table, +which is a resource with a default value specified elsewhere in the +class record. +A translation table specifies what action procedures are invoked for +an event or a sequence of events. +A translation table +is a string containing a list of translations from an event sequence +into one or more action procedure calls. +The translations are separated from one another by newline characters +(ASCII LF). +The complete syntax of translation tables is specified in Appendix B. +</para> +<para> +<!-- .LP --> +As an example, the default behavior of Pushbutton is +</para> +<itemizedlist> + <listitem> + <para> +Highlight on enter window. + </para> + </listitem> + <listitem> + <para> +Unhighlight on exit window. + </para> + </listitem> + <listitem> + <para> +Invert on left button down. + </para> + </listitem> + <listitem> + <para> +Call callbacks and reinvert on left button up. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The following illustrates Pushbutton's default translation table: +</para> +<para> +<!-- .LP --> +<!-- .IN "Translation tables" --> +<literallayout class="monospaced"> +<!-- .TA .5i 1.5i --> +<!-- .ta .5i 1.5i --> +static String defaultTranslations = + "<EnterWindow>: Highlight()\\n\\ + <LeaveWindow>: Unhighlight()\\n\\ + <Btn1Down>: Set()\\n\\ + <Btn1Up>: Notify() Unset()"; +</literallayout> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>tm_table</emphasis> field of the +<function>CoreClassPart</function> +should be filled in at class initialization time with +the string containing the class's default translations. +If a class wants to inherit its superclass's translations, +it can store the special value +<function>XtInheritTranslations</function> +into <emphasis remap='I'>tm_table</emphasis>. +In Core's class part initialization procedure, +the (xI compile this translation table into an efficient internal form. +Then, at widget creation time, +this default translation table is +combined with the XtNtranslations +and XtNbaseTranslations resources; see Section 10.3. +</para> +<para> +<!-- .LP --> +The resource conversion mechanism automatically compiles +string translation tables that are specified in the resource database. +If a client uses translation tables that are not retrieved via a +resource conversion, +it must compile them itself using +<function>XtParseTranslationTable .</function> +</para> +<para> +<!-- .LP --> +The (xI use the compiled form of the translation table to register the +necessary events with the event manager. +Widgets need do nothing other than specify the action and translation tables +for events to be processed by the translation manager. + +</para> +<sect3 id="Event_Sequences"> +<title>Event Sequences</title> +<!-- .XS --> +<!-- <function>(SN Event Sequences</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +An event sequence is a comma-separated list of X event descriptions +that describes a specific sequence of X events to map to a set of +program actions. +Each X event description consists of three parts: +The X event type, a prefix consisting of the X modifier bits, and +an event-specific suffix. +</para> +<para> +<!-- .LP --> +Various abbreviations are supported to make translation tables easier +to read. The events must match incoming events in left-to-right order +to trigger the action sequence. + +</para> +</sect3> +<sect3 id="Action_Sequences"> +<title>Action Sequences</title> +<!-- .XS --> +<!-- <function>(SN Action Sequences</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Action sequences specify what program or widget actions to take in response to +incoming X events. An action sequence consists of space-separated +action procedure call specifications. +Each action procedure call consists of the name of an action procedure and a +parenthesized list of zero or more comma-separated +string parameters to pass to that procedure. +The actions are invoked in left-to-right order as specified in the +action sequence. + +</para> +</sect3> +<sect3 id="Multi_Click_Time"> +<title>Multi-Click Time</title> +<!-- .XS --> +<!-- <function>(SN Multi-Click Time</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Translation table entries may specify actions that are taken when two +or more identical events occur consecutively within a short time +interval, called the multi-click time. The multi-click time value may +be specified as an application resource with name ``multiClickTime'' and +<!-- .IN "multiClickTime" "" "@DEF@" --> +<!-- .IN "Resources" "multiClickTime" --> +class ``MultiClickTime'' and may also be modified dynamically by the +application. The multi-click time is unique for each Display value and +is retrieved from the resource database by +<function>XtDisplayInitialize .</function> +If no value is specified, the initial value is 200 milliseconds. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To set the multi-click time dynamically, use +<function>XtSetMultiClickTime .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetMultiClickTime" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetMultiClickTime(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + int <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display connection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the multi-click time in milliseconds. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtSetMultiClickTime</function> +sets the time interval used by the translation +manager to determine when multiple events are interpreted as a +repeated event. When a repeat count is specified in a translation +entry, the interval between the timestamps in each pair of repeated +events (e.g., between two +<function>ButtonPress</function> +events) must be less than the +multi-click time in order for the translation actions to be taken. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To read the multi-click time, use +<function>XtGetMultiClickTime .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetMultiClickTime" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +int XtGetMultiClickTime(<emphasis remap='I'>display</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display connection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetMultiClickTime</function> +returns the time in milliseconds that the +translation manager uses to determine if multiple events are to be +interpreted as a repeated event for purposes of matching a translation +entry containing a repeat count. + +</para> +</sect3> +</sect2> +<sect2 id="Translation_Table_Management"> +<title>Translation Table Management</title> +<!-- .XS --> +<!-- <function>(SN Translation Table Management</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Sometimes an application needs to merge +its own translations with a widget's translations. +For example, a window manager provides functions to move a window. +The window manager wishes to bind this operation to a specific +pointer button in the title bar without the possibility of user +override and bind it to other buttons that may be overridden by the user. +</para> +<para> +<!-- .LP --> +To accomplish this, +the window manager should first create the title bar +and then should merge the two translation tables into +the title bar's translations. +One translation table contains the translations that the window manager +wants only if the user has not specified a translation for a particular event +or event sequence (i.e., those that may be overridden). +The other translation table contains the translations that the +window manager wants regardless of what the user has specified. +</para> +<para> +<!-- .LP --> +Three (xI functions support this merging: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(3.75i).</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtParseTranslationTable</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Compiles a translation table.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtAugmentTranslations</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Merges a compiled translation table into a widget's</entry> + </row> + <row> + <entry>compiled translation table, ignoring any new translations that</entry> + </row> + <row> + <entry>conflict with existing translations.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>T{</entry> + </row> + <row> + <entry><function>XtOverrideTranslations</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>T{</entry> + </row> + <row> + <entry>Merges a compiled translation table into a widget's</entry> + </row> + <row> + <entry>compiled translation table, replacing any existing translations that</entry> + </row> + <row> + <entry>conflict with new translations.</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To compile a translation table, use +<function>XtParseTranslationTable .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtParseTranslationTable" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtTranslations XtParseTranslationTable(<emphasis remap='I'>table</emphasis>) +<!-- .br --> + String <emphasis remap='I'>table</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>table</emphasis> + </term> + <listitem> + <para> +Specifies the translation table to compile. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtParseTranslationTable</function> +function compiles the translation table, provided in the format given +in Appendix B, into an opaque internal representation +of type +<function>XtTranslations .</function> +Note that if an empty translation table is required for any purpose, +one can be obtained by calling +<function>XtParseTranslationTable</function> +and passing an empty string. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To merge additional translations into an existing translation table, use +<function>XtAugmentTranslations .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAugmentTranslations" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAugmentTranslations(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>translations</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtTranslations <emphasis remap='I'>translations</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget into which the new translations are to be merged. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>translations</emphasis> + </term> + <listitem> + <para> +Specifies the compiled translation table to merge in. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAugmentTranslations</function> +function merges the new translations into the existing widget +translations, ignoring any +<function>#replace ,</function> +<function>#augment ,</function> +or +<function>#override</function> +directive that may have been specified +in the translation string. The translation table specified by +<emphasis remap='I'>translations</emphasis> is not altered by this process. +<function>XtAugmentTranslations</function> +logically appends the string representation of the new translations to +the string representation of the widget's current translations and reparses +the result with no warning messages about duplicate left-hand sides, then +stores the result back into the widget instance; i.e., +if the new translations contain an event or event sequence that +already exists in the widget's translations, +the new translation is ignored. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To overwrite existing translations with new translations, use +<function>XtOverrideTranslations .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOverrideTranslations" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtOverrideTranslations(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>translations</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtTranslations <emphasis remap='I'>translations</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget into which the new translations are to be merged. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>translations</emphasis> + </term> + <listitem> + <para> +Specifies the compiled translation table to merge in. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOverrideTranslations</function> +function merges the new translations into the existing widget +translations, ignoring any +<function>#replace ,</function> +<function>#augment ,</function> +or +<function>#override</function> +directive that may have been +specified in the translation string. The translation table +specified by <emphasis remap='I'>translations</emphasis> is not altered by this process. +<function>XtOverrideTranslations</function> +logically appends the string representation of the widget's current +translations to the string representation of the new translations and +reparses the result with no warning messages about duplicate left-hand +sides, then stores the result back into the widget instance; i.e., +if the new translations contain an event or event sequence that +already exists in the widget's translations, +the new translation overrides the widget's translation. +</para> +<para> +<!-- .LP --> +To replace a widget's translations completely, use +<function>XtSetValues</function> +on the XtNtranslations resource and specify a compiled translation table +as the value. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To make it possible for users to easily modify translation tables in their +resource files, +the string-to-translation-table resource type converter +allows the string to specify whether the table should replace, +augment, or override any +existing translation table in the widget. +To specify this, +a pound sign (#) is given as the first character of the table +followed by one of the keywords ``replace'', ``augment'', or +``override'' to indicate +whether to replace, augment, or override the existing table. +The replace or merge +operation is performed during the +Core +instance initialization. +Each merge operation produces a new +translation resource value; if the original tables were shared by +other widgets, they are unaffected. If no directive is +specified, ``#replace'' is assumed. +</para> +<para> +<!-- .LP --> +At instance initialization +the XtNtranslations resource is first fetched. Then, if it was +not specified or did not contain ``#replace'', the +resource database is searched for the resource XtNbaseTranslations. +If XtNbaseTranslations is found, it is merged into the widget class +translation table. Then the widget <emphasis remap='I'>translations</emphasis> field is +merged into the result or into the class translation table if +XtNbaseTranslations was not found. This final table is then +stored into the widget <emphasis remap='I'>translations</emphasis> field. If the XtNtranslations +resource specified ``#replace'', no merge is done. +If neither XtNbaseTranslations or XtNtranslations are specified, +the class translation table is copied into the widget instance. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To completely remove existing translations, use +<function>XtUninstallTranslations .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtUninstallTranslations" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtUninstallTranslations(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget from which the translations are to be removed. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtUninstallTranslations</function> +function causes the entire translation table for the widget to be removed. + +</para> +</sect2> +<sect2 id="Using_Accelerators"> +<title>Using Accelerators</title> +<!-- .XS --> +<!-- <function>(SN Using Accelerators</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +It is often desirable to be able to bind events in one widget to actions in +another. +In particular, +it is often useful to be able to invoke menu actions from the keyboard. +The (xI provide a facility, called accelerators, that lets you +accomplish this. +<!-- .IN "Accelerator" "" "@DEF@" --> +An accelerator table is a translation table that is bound with its +actions in the context of a particular widget, the <emphasis remap='I'>source</emphasis> widget. +The accelerator table can then be installed on one or more <emphasis remap='I'>destination</emphasis> widgets. +When an event sequence in the destination widget would cause an +accelerator action to be taken, and if the source widget is sensitive, +the actions are executed as though triggered by the same event sequence +in the accelerator source +widget. The event is +passed to the action procedure without modification. The action +procedures used within accelerators must not assume that the source +widget is realized nor that any fields of the event are in reference +to the source widget's window if the widget is realized. +</para> +<para> +<!-- .LP --> +Each widget instance contains that widget's exported accelerator table +as a resource. +Each class of widget exports a method that takes a +displayable string representation of the accelerators +so that widgets can display their current accelerators. +The representation is the accelerator table in canonical +translation table form (see Appendix B). +The display_accelerator procedure pointer is of type +<function>XtStringProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "display_accelerator procedure" "" "@DEF@" --> +<!-- .IN "XtStringProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtStringProc)(Widget, String); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>string</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the source widget that supplied the accelerators. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>string</emphasis> + </term> + <listitem> + <para> +Specifies the string representation of the accelerators for this widget. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Accelerators can be specified in resource files, +and the string representation is the same as for a translation table. +However, +the interpretation of the +<function>#augment</function> +and +<function>#override</function> +directives applies to +what will happen when the accelerator is installed; +that is, whether or not the accelerator translations will override the +translations in the destination widget. +The default is +<function>#augment ,</function> +which means that the accelerator translations have lower priority +than the destination translations. +The +<function>#replace</function> +directive is ignored for accelerator tables. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To parse an accelerator table, use +<function>XtParseAcceleratorTable .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtParseAcceleratorTable" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtAccelerators XtParseAcceleratorTable(<emphasis remap='I'>source</emphasis>) +<!-- .br --> + String <emphasis remap='I'>source</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>source</emphasis> + </term> + <listitem> + <para> +Specifies the accelerator table to compile. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtParseAcceleratorTable</function> +function compiles the accelerator table into an opaque internal representation. +The client +should set the XtNaccelerators resource of +each widget that is to be activated by these translations +to the returned value. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To install accelerators from a widget on another widget, use +<function>XtInstallAccelerators .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInstallAccelerators" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtInstallAccelerators(<emphasis remap='I'>destination</emphasis>, <emphasis remap='I'>source</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>destination</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>source</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>destination</emphasis> + </term> + <listitem> + <para> +Specifies the widget on which the accelerators are to be installed. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>source</emphasis> + </term> + <listitem> + <para> +Specifies the widget from which the accelerators are to come. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtInstallAccelerators</function> +function installs the <emphasis remap='I'>accelerators</emphasis> resource value from +<emphasis remap='I'>source</emphasis> onto <emphasis remap='I'>destination</emphasis> +by merging the source accelerators into the destination translations. +If the source <emphasis remap='I'>display_accelerator</emphasis> field is non-NULL, +<function>XtInstallAccelerators</function> +calls it with the source widget and a string representation +of the accelerator table, +which indicates that its accelerators have been installed +and that it should display them appropriately. +The string representation of the accelerator table is its +canonical translation table representation. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +As a convenience for installing all accelerators from a widget and all its +descendants onto one destination, use +<function>XtInstallAllAccelerators .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInstallAllAccelerators" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtInstallAllAccelerators(<emphasis remap='I'>destination</emphasis>, <emphasis remap='I'>source</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>destination</emphasis>; +<!-- .br --> + Widget <emphasis remap='I'>source</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>destination</emphasis> + </term> + <listitem> + <para> +Specifies the widget on which the accelerators are to be installed. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>source</emphasis> + </term> + <listitem> + <para> +Specifies the root widget of the widget tree +from which the accelerators are to come. (cI + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtInstallAllAccelerators</function> +function recursively descends the widget tree rooted at <emphasis remap='I'>source</emphasis> +and installs the accelerators resource value +of each widget encountered onto <emphasis remap='I'>destination</emphasis>. +A common use is to call +<function>XtInstallAllAccelerators</function> +and pass the application main window as the source. + +</para> +</sect2> +<sect2 id="KeyCode_to_KeySym_Conversions"> +<title>KeyCode-to-KeySym Conversions</title> +<!-- .XS --> +<!-- (SN KeyCode-to-KeySym Conversions --> +<!-- .XE --> +<para> +<!-- .LP --> +The translation manager provides support for automatically translating +KeyCodes in incoming key events into KeySyms. +KeyCode-to-KeySym translator procedure pointers are of type +<function>XtKeyProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtKeyProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtKeyProc)(Display*, KeyCode, Modifiers, Modifiers*, \ +KeySym*); +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + KeyCode <emphasis remap='I'>keycode</emphasis>; +<!-- .br --> + Modifiers <emphasis remap='I'>modifiers</emphasis>; +<!-- .br --> + Modifiers *<emphasis remap='I'>modifiers_return</emphasis>; +<!-- .br --> + KeySym *<emphasis remap='I'>keysym_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display that the KeyCode is from. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keycode</emphasis> + </term> + <listitem> + <para> +Specifies the KeyCode to translate. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers</emphasis> + </term> + <listitem> + <para> +Specifies the modifiers to the KeyCode. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers_return</emphasis> + </term> + <listitem> + <para> +Specifies a location in which to store +a mask that indicates the subset of all +modifiers that are examined by the key translator for the specified keycode. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keysym_return</emphasis> + </term> + <listitem> + <para> +Specifies a location in which to store the resulting KeySym. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure takes a KeyCode and modifiers and produces a KeySym. +For any given key translator function and keyboard encoding, +<emphasis remap='I'>modifiers_return</emphasis> will be a constant per KeyCode that indicates +the subset of all modifiers that are examined by the key translator +for that KeyCode. +</para> +<para> +<!-- .LP --> +The KeyCode-to-KeySym translator procedure +must be implemented such that multiple calls with the same +<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>keycode</emphasis>, and <emphasis remap='I'>modifiers</emphasis> return the same +result until either a new case converter, an +<function>XtCaseProc ,</function> +is installed or a +<function>MappingNotify</function> +event is received. + +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The (xI maintain tables internally to map KeyCodes to KeySyms +for each open display. Translator procedures and other clients may +share a single copy of this table to perform the same mapping. +</para> +<para> +<!-- .LP --> +To return a pointer to the KeySym-to-KeyCode mapping table for a +particular display, use +<function>XtGetKeysymTable .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetKeysymTable" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +KeySym *XtGetKeysymTable(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>min_keycode_return</emphasis>, \ +<emphasis remap='I'>keysyms_per_keycode_return</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + KeyCode *<emphasis remap='I'>min_keycode_return</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>keysyms_per_keycode_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display whose table is required. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>min_keycode_return</emphasis> + </term> + <listitem> + <para> +Returns the minimum KeyCode valid for the display. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keysyms_per_keycode_return</emphasis> + </term> + <listitem> + <para> +Returns the number of KeySyms stored for each KeyCode. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetKeysymTable</function> +returns a pointer to the (xI' copy of the +server's KeyCode-to-KeySym table. This table must not be modified. +There are <emphasis remap='I'>keysyms_per_keycode_return</emphasis> KeySyms associated with each +KeyCode, located in the table with indices starting at index +</para> +<itemizedlist> + <listitem> + <para> + (test_keycode - min_keycode_return) * keysyms_per_keycode_return + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +for KeyCode <emphasis remap='I'>test_keycode</emphasis>. Any entries that have no KeySyms associated +with them contain the value +<function>NoSymbol .</function> +Clients should not cache the KeySym table but should call +<function>XtGetKeysymTable</function> +each time the value is +needed, as the table may change prior to dispatching each event. +</para> +<para> +<!-- .LP --> +For more information on this table, see Section 12.7 in <emphasis remap='I'>(xL</emphasis>. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a key translator, use +<function>XtSetKeyTranslator .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetKeyTranslator" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetKeyTranslator(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>proc</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + XtKeyProc <emphasis remap='I'>proc</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display from which to translate the events. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to perform key translations. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtSetKeyTranslator</function> +function sets the specified procedure as the current key translator. +The default translator is +<function>XtTranslateKey ,</function> +an +<function>XtKeyProc</function> +that uses the Shift, Lock, numlock, and group modifiers +with the interpretations defined in <emphasis remap='I'>(xP</emphasis>, Section 5. +It is provided so that new translators can call it to get default +KeyCode-to-KeySym translations and so that the default translator +can be reinstalled. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To invoke the currently registered KeyCode-to-KeySym translator, +use +<function>XtTranslateKeycode .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtTranslateKeycode" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtTranslateKeycode(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>keycode</emphasis>, <emphasis remap='I'>modifiers</emphasis>, \ +<emphasis remap='I'>modifiers_return</emphasis>, <emphasis remap='I'>keysym_return</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + KeyCode <emphasis remap='I'>keycode</emphasis>; +<!-- .br --> + Modifiers <emphasis remap='I'>modifiers</emphasis>; +<!-- .br --> + Modifiers *<emphasis remap='I'>modifiers_return</emphasis>; +<!-- .br --> + KeySym *<emphasis remap='I'>keysym_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display that the KeyCode is from. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keycode</emphasis> + </term> + <listitem> + <para> +Specifies the KeyCode to translate. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers</emphasis> + </term> + <listitem> + <para> +Specifies the modifiers to the KeyCode. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers_return</emphasis> + </term> + <listitem> + <para> +Returns a mask that indicates the modifiers actually used +to generate the KeySym. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keysym_return</emphasis> + </term> + <listitem> + <para> +Returns the resulting KeySym. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtTranslateKeycode</function> +function passes the specified arguments +directly to the currently registered KeyCode-to-KeySym translator. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To handle capitalization of nonstandard KeySyms, the (xI allow +clients to register case conversion routines. +Case converter procedure pointers are of type +<function>XtCaseProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCaseProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtCaseProc)(Display*, KeySym, KeySym*, KeySym*); +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + KeySym <emphasis remap='I'>keysym</emphasis>; +<!-- .br --> + KeySym *<emphasis remap='I'>lower_return</emphasis>; +<!-- .br --> + KeySym *<emphasis remap='I'>upper_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display connection for which the conversion is required. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keysym</emphasis> + </term> + <listitem> + <para> +Specifies the KeySym to convert. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>lower_return</emphasis> + </term> + <listitem> + <para> +Specifies a location into which to store the lowercase equivalent for +the KeySym. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>upper_return</emphasis> + </term> + <listitem> + <para> +Specifies a location into which to store the uppercase equivalent for +the KeySym. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If there is no case distinction, +this procedure should store the KeySym into both return values. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a case converter, use +<function>XtRegisterCaseConverter .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRegisterCaseConverter" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRegisterCaseConverter(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>start</emphasis>, <emphasis remap='I'>stop</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + XtCaseProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + KeySym <emphasis remap='I'>start</emphasis>; +<!-- .br --> + KeySym <emphasis remap='I'>stop</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display from which the key events are to come. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the +<function>XtCaseProc</function> +to do the conversions. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>start</emphasis> + </term> + <listitem> + <para> +Specifies the first KeySym for which this converter is valid. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>stop</emphasis> + </term> + <listitem> + <para> +Specifies the last KeySym for which this converter is valid. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRegisterCaseConverter</function> +registers the specified case converter. +The <emphasis remap='I'>start</emphasis> and <emphasis remap='I'>stop</emphasis> arguments provide the inclusive range of KeySyms +for which this converter is to be called. +The new converter overrides any previous converters for KeySyms in that range. +No interface exists to remove converters; +you need to register an identity converter. +When a new converter is registered, +the (xI refresh the keyboard state if necessary. +The default converter understands case conversion for all +Latin KeySyms defined in <emphasis remap='I'>(xP</emphasis>, Appendix A. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To determine uppercase and lowercase equivalents for a KeySym, use +<function>XtConvertCase .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConvertCase" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtConvertCase(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>keysym</emphasis>, <emphasis remap='I'>lower_return</emphasis>, \ +<emphasis remap='I'>upper_return</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + KeySym <emphasis remap='I'>keysym</emphasis>; +<!-- .br --> + KeySym *<emphasis remap='I'>lower_return</emphasis>; +<!-- .br --> + KeySym *<emphasis remap='I'>upper_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display that the KeySym came from. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keysym</emphasis> + </term> + <listitem> + <para> +Specifies the KeySym to convert. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>lower_return</emphasis> + </term> + <listitem> + <para> +Returns the lowercase equivalent of the KeySym. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>upper_return</emphasis> + </term> + <listitem> + <para> +Returns the uppercase equivalent of the KeySym. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtConvertCase</function> +function calls the appropriate converter and returns the results. +A user-supplied +<function>XtKeyProc</function> +may need to use this function. + +</para> +</sect2> +<sect2 id="Obtaining_a_KeySym_in_an_Action_Procedure"> +<title>Obtaining a KeySym in an Action Procedure</title> +<!-- .XS --> +<!-- <function>(SN Obtaining a KeySym in an Action Procedure</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +When an action procedure is invoked on a +<function>KeyPress</function> +or +<function>KeyRelease</function> +event, it often has a need to retrieve the KeySym and modifiers +corresponding to the event that caused it to be invoked. In order to +avoid repeating the processing that was just performed by the +(xI to match the translation entry, the KeySym and modifiers +are stored for the duration of the action procedure and are made +available to the client. +</para> +<para> +<!-- .LP --> +To retrieve the KeySym and modifiers that matched the final event +specification in the translation table entry, use +<function>XtGetActionKeysym .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetActionKeysym" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +KeySym XtGetActionKeysym(<emphasis remap='I'>event</emphasis>, <emphasis remap='I'>modifiers_return</emphasis>) +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .br --> + Modifiers *<emphasis remap='I'>modifiers_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies the event pointer passed to the action procedure by the (xI. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>modifiers_return</emphasis> + </term> + <listitem> + <para> +Returns the modifiers that caused the match, if non-NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If +<function>XtGetActionKeysym</function> +is called after an action procedure has been +invoked by the (xI and before that action procedure returns, and +if the event pointer has the same value as the event pointer passed to +that action routine, and if the event is a +<function>KeyPress</function> +or +<function>KeyRelease</function> +event, then +<function>XtGetActionKeysym</function> +returns the KeySym that matched the final +event specification in the translation table and, if <emphasis remap='I'>modifiers_return</emphasis> +is non-NULL, the modifier state actually used to generate this KeySym; +otherwise, if the event is a +<function>KeyPress</function> +or +<function>KeyRelease</function> +event, then +<function>XtGetActionKeysym</function> +calls +<function>XtTranslateKeycode</function> +and returns the results; +else it returns +<function>NoSymbol</function> +and does not examine <emphasis remap='I'>modifiers_return</emphasis>. +</para> +<para> +<!-- .LP --> +Note that if an action procedure invoked by the (xI +invokes a subsequent action procedure (and so on) via +<function>XtCallActionProc ,</function> +the nested action procedure may also call +<function>XtGetActionKeysym</function> +to retrieve the (xI' KeySym and modifiers. + +</para> +</sect2> +<sect2 id="KeySym_to_KeyCode_Conversions"> +<title>KeySym-to-KeyCode Conversions</title> +<!-- .XS --> +<!-- (SN KeySym-to-KeyCode Conversions --> +<!-- .XE --> +<para> +<!-- .LP --> +To return the list of KeyCodes that map to a particular KeySym in +the keyboard mapping table maintained by the (xI, use +<function>XtKeysymToKeycodeList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtKeysymToKeycodeList" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtKeysymToKeycodeList(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>keysym</emphasis>, <emphasis remap='I'>keycodes_return</emphasis>, \ +<emphasis remap='I'>keycount_return</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + KeySym <emphasis remap='I'>keysym</emphasis>; +<!-- .br --> + KeyCode **<emphasis remap='I'>keycodes_return</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>keycount_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display whose table is required. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keysym</emphasis> + </term> + <listitem> + <para> +Specifies the KeySym for which to search. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keycodes_return</emphasis> + </term> + <listitem> + <para> +Returns a list of KeyCodes that have <emphasis remap='I'>keysym</emphasis> +associated with them, or NULL if <emphasis remap='I'>keycount_return</emphasis> is 0. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keycount_return</emphasis> + </term> + <listitem> + <para> +Returns the number of KeyCodes in the keycode list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtKeysymToKeycodeList</function> +procedure returns all the KeyCodes that have <emphasis remap='I'>keysym</emphasis> +in their entry for the keyboard mapping table associated with <emphasis remap='I'>display</emphasis>. +For each entry in the +table, the first four KeySyms (groups 1 and 2) are interpreted as +specified by <emphasis remap='I'>(xP</emphasis>, Section 5. If no KeyCodes map to the +specified KeySym, <emphasis remap='I'>keycount_return</emphasis> is zero and *<emphasis remap='I'>keycodes_return</emphasis> is NULL. +</para> +<para> +<!-- .LP --> +The caller should free the storage pointed to by <emphasis remap='I'>keycodes_return</emphasis> using +<function>XtFree</function> +when it is no longer useful. If the caller needs to examine +the KeyCode-to-KeySym table for a particular KeyCode, it should call +<function>XtGetKeysymTable .</function> + +</para> +</sect2> +<sect2 id="Registering_Button_and_Key_Grabs_for_Actions"> +<title>Registering Button and Key Grabs for Actions</title> +<!-- .XS --> +<!-- <function>(SN Registering Button and Key Grabs for Actions</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To register button and key grabs for a widget's window according to the +event bindings in the widget's translation table, use +<function>XtRegisterGrabAction .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRegisterGrabAction" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtRegisterGrabAction(<emphasis remap='I'>action_proc</emphasis>, <emphasis remap='I'>owner_events</emphasis>, \ +<emphasis remap='I'>event_mask</emphasis>, <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>) +<!-- .br --> + XtActionProc <emphasis remap='I'>action_proc</emphasis>; +<!-- .br --> + Boolean <emphasis remap='I'>owner_events</emphasis>; +<!-- .br --> + unsigned int <emphasis remap='I'>event_mask</emphasis>; +<!-- .br --> + int <emphasis remap='I'>pointer_mode</emphasis>, <emphasis remap='I'>keyboard_mode</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>action_proc</emphasis> + </term> + <listitem> + <para> +Specifies the action procedure to search for in translation tables. +<!-- .sp --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>owner_events</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event_mask</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>pointer_mode</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>keyboard_mode</emphasis> + </term> + <listitem> + <para> +Specify arguments to +<function>XtGrabButton</function> +or +<function>XtGrabKey .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtRegisterGrabAction</function> +adds the specified <emphasis remap='I'>action_proc</emphasis> to a list known to +the translation manager. When a widget is realized, or when the +translations of a realized widget or the accelerators installed on a +realized widget are modified, its translation table and any installed +accelerators are scanned for action procedures on this list. +If any are invoked on +<function>ButtonPress</function> +or +<function>KeyPress</function> +events as the only or final event +in a sequence, the (xI will call +<function>XtGrabButton</function> +or +<function>XtGrabKey</function> +for the widget with every button or KeyCode which maps to the +event detail field, passing the specified <emphasis remap='I'>owner_events</emphasis>, <emphasis remap='I'>event_mask</emphasis>, +<emphasis remap='I'>pointer_mode</emphasis>, and <emphasis remap='I'>keyboard_mode</emphasis>. For +<function>ButtonPress</function> +events, the modifiers +specified in the grab are determined directly from the translation +specification and <emphasis remap='I'>confine_to</emphasis> and <emphasis remap='I'>cursor</emphasis> are specified as +<function>None .</function> +For +<function>KeyPress</function> +events, if the translation table entry specifies colon (:) in +the modifier list, the modifiers are determined by calling the key +translator procedure registered for the display and calling +<function>XtGrabKey</function> +for every combination of standard modifiers which map the KeyCode to +the specified event detail KeySym, and ORing any modifiers specified in +the translation table entry, and <emphasis remap='I'>event_mask</emphasis> is ignored. If the +translation table entry does not specify colon in the modifier list, +the modifiers specified in the grab are those specified in the +translation table entry only. For both +<function>ButtonPress</function> +and +<function>KeyPress</function> +events, don't-care modifiers are ignored unless the translation entry +explicitly specifies ``Any'' in the <emphasis remap='I'>modifiers</emphasis> field. +</para> +<para> +<!-- .LP --> +If the specified <emphasis remap='I'>action_proc</emphasis> is already registered for the calling +process, the new values will replace the previously specified values +for any widgets that become realized following the call, but existing +grabs are not altered on currently realized widgets. +</para> +<para> +<!-- .LP --> +When translations or installed accelerators are modified for a +realized widget, any previous key or button grabs registered +as a result of the old bindings are released if they do not appear in +the new bindings and are not explicitly grabbed by the client with +<function>XtGrabKey</function> +or +<function>XtGrabButton .</function> + +</para> +</sect2> +<sect2 id="Invoking_Actions_Directly"> +<title>Invoking Actions Directly</title> +<!-- .XS --> +<!-- <function>(SN Invoking Actions Directly</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Normally action procedures are invoked by the (xI when an +event or event sequence arrives for a widget. To +invoke an action procedure directly, without generating +(or synthesizing) events, use +<function>XtCallActionProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCallActionProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCallActionProc(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>action</emphasis>, <emphasis remap='I'>event</emphasis>, <emphasis remap='I'>params</emphasis>, \ +<emphasis remap='I'>num_params</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + String <emphasis remap='I'>action</emphasis>; +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget in which the action is to be invoked. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>action</emphasis> + </term> + <listitem> + <para> +Specifies the name of the action routine. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies the contents of the <emphasis remap='I'>event</emphasis> passed to the action routine. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies the contents of the <emphasis remap='I'>params</emphasis> passed to the action routine. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtCallActionProc</function> +searches for the named action routine in the same +manner and order as translation tables are bound, as described in +Section 10.1.2, except that application action tables are searched, if +necessary, as of the time of the call to +<function>XtCallActionProc .</function> +If found, +the action routine is invoked with the specified widget, event pointer, +and parameters. It is the responsibility of the caller to ensure that +the contents of the <emphasis remap='I'>event</emphasis>, <emphasis remap='I'>params</emphasis>, and <emphasis remap='I'>num_params</emphasis> arguments are +appropriate for the specified action routine and, if necessary, that +the specified widget is realized or sensitive. If the named action +routine cannot be found, +<function>XtCallActionProc</function> +generates a warning message and returns. + +</para> +</sect2> +<sect2 id="Obtaining_a_Widget_s_Action_List"> +<title>Obtaining a Widget's Action List</title> +<!-- .XS --> +<!-- (SN Obtaining a Widget's Action List --> +<!-- .XE --> +<para> +<!-- .LP --> +Occasionally a subclass will require the pointers to one or more of +its superclass's action procedures. This would be needed, for +example, in order to envelop the superclass's action. To retrieve +the list of action procedures registered in the superclass's +<emphasis remap='I'>actions</emphasis> field, use +<function>XtGetActionList .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetActionList" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetActionList(<emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>actions_return</emphasis>, \ +<emphasis remap='I'>num_actions_return</emphasis>) +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + XtActionList *<emphasis remap='I'>actions_return</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_actions_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class whose actions are to be returned. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>actions_return</emphasis> + </term> + <listitem> + <para> +Returns the action list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_actions_return</emphasis> + </term> + <listitem> + <para> +Returns the number of action procedures declared by the class. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetActionList</function> +returns the action table defined by the specified +widget class. This table does not include actions defined by the +superclasses. If <emphasis remap='I'>widget_class</emphasis> is not initialized, or is not +<function>coreWidgetClass</function> +or a subclass thereof, or if the class does not define any actions, +*<emphasis remap='I'>actions_return</emphasis> will be NULL and *<emphasis remap='I'>num_actions_return</emphasis> +will be zero. +If *<emphasis remap='I'>actions_return</emphasis> is non-NULL the client is responsible for freeing +the table using +<function>XtFree</function> +when it is no longer needed. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect2> +</chapter> +</book> diff --git a/specs/CH11.xml b/specs/CH11.xml new file mode 100644 index 0000000..6249faa --- /dev/null +++ b/specs/CH11.xml @@ -0,0 +1,6280 @@ +<!-- .\" $Xorg: CH11,v 1.3 2000/08/17 19:42:47 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 11</function>\s-1 + +\s+1<function>Utility Functions</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 11 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 11 \(em Utility Functions --> +<!-- .XE --> +The (xI provide a number of utility functions that you can use to +</para> +<itemizedlist> + <listitem> + <para> +Determine the number of elements in an array. + </para> + </listitem> + <listitem> + <para> +Translate strings to widget instances. + </para> + </listitem> + <listitem> + <para> +Manage memory usage. + </para> + </listitem> + <listitem> + <para> +Share graphics contexts. + </para> + </listitem> + <listitem> + <para> +Manipulate selections. + </para> + </listitem> + <listitem> + <para> +Merge exposure events into a region. + </para> + </listitem> + <listitem> + <para> +Translate widget coordinates. + </para> + </listitem> + <listitem> + <para> +Locate a widget given a window id. + </para> + </listitem> + <listitem> + <para> +Handle errors. + </para> + </listitem> + <listitem> + <para> +Set the WM_COLORMAP_WINDOWS property. + </para> + </listitem> + <listitem> + <para> +Locate files by name with string substitutions. + </para> + </listitem> + <listitem> + <para> +Register callback functions for external agents. + </para> + </listitem> + <listitem> + <para> +Locate all the displays of an application context. + + </para> + </listitem> +</itemizedlist> +<sect2 id="Determining_the_Number_of_Elements_in_an_Array"> +<title>Determining the Number of Elements in an Array</title> +<!-- .XS --> +<!-- <function>(SN Determining the Number of Elements in an Array</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To determine the number of elements in a fixed-size array, use +<function>XtNumber .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtNumber" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Cardinal XtNumber(<emphasis remap='I'>array</emphasis>) +<!-- .br --> + <emphasis remap='I'>ArrayType array</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>array</emphasis> + </term> + <listitem> + <para> +Specifies a fixed-size array of arbitrary type. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtNumber</function> +macro returns the number of elements allocated to the array. + +</para> +</sect2> +<sect2 id="Translating_Strings_to_Widget_Instances"> +<title>Translating Strings to Widget Instances</title> +<!-- .XS --> +<!-- <function>(SN Translating Strings to Widget Instances</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To translate a widget name to a widget instance, use +<function>XtNameToWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtNameToWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtNameToWidget(<emphasis remap='I'>reference</emphasis>, <emphasis remap='I'>names</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>reference</emphasis>; +<!-- .br --> + String <emphasis remap='I'>names</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>reference</emphasis> + </term> + <listitem> + <para> +Specifies the widget from which the search is to start. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>names</emphasis> + </term> + <listitem> + <para> +Specifies the partially qualified name of the desired widget. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtNameToWidget</function> +function searches for a descendant of the <emphasis remap='I'>reference</emphasis> +widget whose name matches the specified names. The <emphasis remap='I'>names</emphasis> parameter +specifies a simple object name or a series of simple object name +components separated by periods or asterisks. +<function>XtNameToWidget</function> +returns the descendant with the shortest name matching the specification +according to the following rules, where child is either a pop-up child +or a normal child if the widget's class is a subclass of +Composite : +</para> +<itemizedlist> + <listitem> + <para> +Enumerate the object subtree rooted at the reference widget in +breadth-first order, qualifying the name of each object with the +names of all its ancestors up to, but not including, the reference +widget. The ordering between children of a common parent is +not defined. + </para> + </listitem> + <listitem> + <para> +Return the first object in the enumeration that matches the +specified name, where each component of <emphasis remap='I'>names</emphasis> matches exactly the +corresponding component of the qualified object name and asterisk +matches any series of components, including none. + </para> + </listitem> + <listitem> + <para> +If no match is found, return NULL. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Since breadth-first traversal is specified, the descendant with the +shortest matching name (i.e., the fewest number of components), if any, +will always be returned. However, since the order of enumeration of +children is undefined and since the (xI do not require that all +children of a widget have unique names, +<function>XtNameToWidget</function> +may return any +child that matches if there are multiple objects in the subtree with +the same name. Consecutive separators (periods or asterisks) +including at least one asterisk are treated as a single asterisk. +Consecutive periods are treated as a single period. + +</para> +</sect2> +<sect2 id="Managing_Memory_Usage"> +<title>Managing Memory Usage</title> +<!-- .XS --> +<!-- <function>(SN Managing Memory Usage</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI memory management functions provide uniform checking for +null pointers and error reporting on memory allocation errors. +These functions are completely compatible with their standard C language +runtime counterparts +<function>malloc ,</function> +<function>calloc ,</function> +<function>realloc ,</function> +and +<function>free</function> +with the following added functionality: +</para> +<itemizedlist> + <listitem> + <para> +<function>XtMalloc ,</function> +<function>XtCalloc ,</function> +and +<function>XtRealloc</function> +give an error if there is not enough memory. + </para> + </listitem> + <listitem> + <para> +<function>XtFree</function> +simply returns if passed a NULL pointer. + </para> + </listitem> + <listitem> + <para> +<function>XtRealloc</function> +simply allocates new storage if passed a NULL pointer. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +See the standard C library documentation on +<function>malloc ,</function> +<function>calloc ,</function> +<function>realloc ,</function> +and +<function>free</function> +for more information. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To allocate storage, use +<function>XtMalloc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtMalloc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +char *XtMalloc(<emphasis remap='I'>size</emphasis>) +<!-- .br --> + Cardinal <emphasis remap='I'>size</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>size</emphasis> + </term> + <listitem> + <para> +Specifies the number of bytes desired. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtMalloc</function> +function returns a pointer to a block of storage of at least +the specified <emphasis remap='I'>size</emphasis> bytes. +If there is insufficient memory to allocate the new block, +<function>XtMalloc</function> +calls +<function>XtErrorMsg .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To allocate and initialize an array, use +<function>XtCalloc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCalloc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +char *XtCalloc(<emphasis remap='I'>num</emphasis>, <emphasis remap='I'>size</emphasis>) +<!-- .br --> + Cardinal <emphasis remap='I'>num</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>size</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>num</emphasis> + </term> + <listitem> + <para> +Specifies the number of array elements to allocate. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>size</emphasis> + </term> + <listitem> + <para> +Specifies the size of each array element in bytes. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtCalloc</function> +function allocates space for the specified number of array elements +of the specified size and initializes the space to zero. +If there is insufficient memory to allocate the new block, +<function>XtCalloc</function> +calls +<function>XtErrorMsg .</function> +<function>XtCalloc</function> +returns the address of the allocated storage. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To change the size of an allocated block of storage, use +<function>XtRealloc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtRealloc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +char *XtRealloc(<emphasis remap='I'>ptr</emphasis>, <emphasis remap='I'>num</emphasis>) +<!-- .br --> + char *<emphasis remap='I'>ptr</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>ptr</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the old storage allocated with +<function>XtMalloc ,</function> +<function>XtCalloc ,</function> +or +<function>XtRealloc ,</function> +or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num</emphasis> + </term> + <listitem> + <para> +Specifies number of bytes desired in new storage. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtRealloc</function> +function changes the size of a block of storage, possibly moving it. +Then it copies the old contents (or as much as will fit) into the new block +and frees the old block. +If there is insufficient memory to allocate the new block, +<function>XtRealloc</function> +calls +<function>XtErrorMsg .</function> +If <emphasis remap='I'>ptr</emphasis> is NULL, +<function>XtRealloc</function> +simply calls +<function>XtMalloc .</function> +<function>XtRealloc</function> +then returns the address of the new block. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To free an allocated block of storage, use +<function>XtFree .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtFree" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtFree(<emphasis remap='I'>ptr</emphasis>) +<!-- .br --> + char *<emphasis remap='I'>ptr</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>ptr</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to a block of storage allocated with +<function>XtMalloc ,</function> +<function>XtCalloc ,</function> +or +<function>XtRealloc ,</function> +or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtFree</function> +function returns storage, allowing it to be reused. +If <emphasis remap='I'>ptr</emphasis> is NULL, +<function>XtFree</function> +returns immediately. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To allocate storage for a new instance of a type, use +<function>XtNew .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtNew" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +<emphasis remap='I'>type</emphasis> *XtNew(<emphasis remap='I'>type</emphasis>) +<!-- .br --> + <emphasis remap='I'>type t</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies a previously declared type. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtNew</function> +returns a pointer to the allocated storage. +If there is insufficient memory to allocate the new block, +<function>XtNew</function> +calls +<function>XtErrorMsg .</function> +<function>XtNew</function> +is a convenience macro that calls +<function>XtMalloc</function> +with the following arguments specified: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i --> +<!-- .ta .5i --> +((type *) XtMalloc((unsigned) sizeof(type))) +</literallayout> +</para> +<para> +<!-- .LP --> +The storage allocated by +<function>XtNew</function> +should be freed using +<function>XtFree .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To copy an instance of a string, use +<function>XtNewString .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtNewString" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +String XtNewString(<emphasis remap='I'>string</emphasis>) +<!-- .br --> + String <emphasis remap='I'>string</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>string</emphasis> + </term> + <listitem> + <para> +Specifies a previously declared string. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtNewString</function> +returns a pointer to the allocated storage. +If there is insufficient memory to allocate the new block, +<function>XtNewString</function> +calls +<function>XtErrorMsg .</function> +<function>XtNewString</function> +is a convenience macro that calls +<function>XtMalloc</function> +with the following arguments specified: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA .5i --> +<!-- .ta .5i --> +(strcpy(XtMalloc((unsigned)strlen(str) + 1), str)) +</literallayout> +</para> +<para> +<!-- .LP --> +The storage allocated by +<function>XtNewString</function> +should be freed using +<function>XtFree .</function> + +</para> +</sect2> +<sect2 id="Sharing_Graphics_Contexts"> +<title>Sharing Graphics Contexts</title> +<!-- .XS --> +<!-- <function>(SN Sharing Graphics Contexts</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide a mechanism whereby cooperating objects can share a +graphics context (GC), thereby reducing both the number of GCs +created and the total number of server calls in any given application. +The mechanism is a simple caching scheme +and allows for clients to declare both modifiable and nonmodifiable +fields of the shared GCs. +</para> +<para> +<!-- .LP --> +To obtain a shareable GC with modifiable fields, use +<function>XtAllocateGC .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAllocateGC" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +GC XtAllocateGC(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>depth</emphasis>, <emphasis remap='I'>value_mask</emphasis>, <emphasis remap='I'>values</emphasis>, \ +<emphasis remap='I'>dynamic_mask</emphasis>, <emphasis remap='I'>unused_mask</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>depth</emphasis>; +<!-- .br --> + XtGCMask <emphasis remap='I'>value_mask</emphasis>; +<!-- .br --> + XGCValues *<emphasis remap='I'>values</emphasis>; +<!-- .br --> + XtGCMask <emphasis remap='I'>dynamic_mask</emphasis>; +<!-- .br --> + XtGCMask <emphasis remap='I'>unused_mask</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies an object, giving the screen for which the +returned GC is valid. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>depth</emphasis> + </term> + <listitem> + <para> +Specifies the depth for which the returned GC is valid, or 0. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_mask</emphasis> + </term> + <listitem> + <para> +Specifies fields of the GC that are initialized from <emphasis remap='I'>values</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>values</emphasis> + </term> + <listitem> + <para> +Specifies the values for the initialized fields. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>dynamic_mask</emphasis> + </term> + <listitem> + <para> +Specifies fields of the GC that will be modified by the caller. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>unused_mask</emphasis> + </term> + <listitem> + <para> +Specifies fields of the GC that will not be needed by the caller. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAllocateGC</function> +function returns a shareable GC that may be +modified by the client. The <emphasis remap='I'>screen</emphasis> field of the specified +widget or of the nearest widget ancestor of the specified +object and the specified <emphasis remap='I'>depth</emphasis> argument supply +the root and drawable depths for which the GC is to be +valid. If <emphasis remap='I'>depth</emphasis> is zero, the depth is taken from the +<emphasis remap='I'>depth</emphasis> field of the specified widget or of the nearest +widget ancestor of the specified object. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>value_mask</emphasis> argument specifies fields of the GC +that are initialized with the respective member of the +<emphasis remap='I'>values</emphasis> structure. The <emphasis remap='I'>dynamic_mask</emphasis> argument specifies fields +that the caller intends to modify during program execution. +The caller must ensure that the corresponding GC field is set +prior to each use of the GC. The <emphasis remap='I'>unused_mask</emphasis> argument +specifies fields of the GC that are of no interest to the +caller. The caller may make no assumptions about the contents +of any fields specified in <emphasis remap='I'>unused_mask</emphasis>. The caller may assume +that at all times all fields not specified in either +<emphasis remap='I'>dynamic_mask</emphasis> or <emphasis remap='I'>unused_mask</emphasis> have their default value if not +specified in <emphasis remap='I'>value_mask</emphasis> or the value specified by <emphasis remap='I'>values</emphasis>. +If a field is specified in both <emphasis remap='I'>value_mask</emphasis> and <emphasis remap='I'>dynamic_mask</emphasis>, +the effect is as if it were specified only in <emphasis remap='I'>dynamic_mask</emphasis> +and then immediately set to the value in <emphasis remap='I'>values</emphasis>. If a field +is set in <emphasis remap='I'>unused_mask</emphasis> and also in either <emphasis remap='I'>value_mask</emphasis> or +<emphasis remap='I'>dynamic_mask</emphasis>, the specification in <emphasis remap='I'>unused_mask</emphasis> is ignored. +</para> +<para> +<!-- .LP --> +<function>XtAllocateGC</function> +tries to minimize the number of unique GCs +created by comparing the arguments with those of previous +calls and returning an existing GC when there are no +conflicts. +<function>XtAllocateGC</function> +may modify and return an existing GC if it was allocated with a +nonzero <emphasis remap='I'>unused_mask</emphasis>. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To obtain a shareable GC with no modifiable fields, use +<function>XtGetGC .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetGC" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +GC XtGetGC(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>value_mask</emphasis>, <emphasis remap='I'>values</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + XtGCMask <emphasis remap='I'>value_mask</emphasis>; +<!-- .br --> + XGCValues *<emphasis remap='I'>values</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies an object, giving the screen and depth for which the +returned GC is valid. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_mask</emphasis> + </term> + <listitem> + <para> +Specifies which fields of the <emphasis remap='I'>values</emphasis> structure are specified. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>values</emphasis> + </term> + <listitem> + <para> +Specifies the actual values for this GC. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetGC</function> +function returns a shareable, read-only GC. +The parameters to this function are the same as those for +<function>XCreateGC</function> +except that an Object is passed instead of a Display. +<function>XtGetGC</function> +is equivalent to +<function>XtAllocateGC</function> +with <emphasis remap='I'>depth</emphasis>, <emphasis remap='I'>dynamic_mask</emphasis>, and <emphasis remap='I'>unused_mask</emphasis> all zero. +</para> +<para> +<!-- .LP --> +<function>XtGetGC</function> +shares only GCs in which all values in the GC returned by +<function>XCreateGC</function> +are the same. +In particular, it does not use the <emphasis remap='I'>value_mask</emphasis> provided to +determine which fields of the GC a widget considers relevant. +The <emphasis remap='I'>value_mask</emphasis> is used only to tell the server which fields should be +filled in from <emphasis remap='I'>values</emphasis> and which it should fill in with default values. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To deallocate a shared GC when it is no longer needed, use +<function>XtReleaseGC .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtReleaseGC" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtReleaseGC(<emphasis remap='I'>object</emphasis>, <emphasis remap='I'>gc</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>object</emphasis>; +<!-- .br --> + GC <emphasis remap='I'>gc</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>object</emphasis> + </term> + <listitem> + <para> +Specifies any object on the Display for which the GC was created. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>gc</emphasis> + </term> + <listitem> + <para> +Specifies the shared GC obtained with either +<function>XtAllocateGC</function> +or +<function>XtGetGC .</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +References to shareable GCs are counted and a free request is generated to the +server when the last user of a given GC releases it. + +</para> +</sect2> +<sect2 id="Managing_Selections"> +<title>Managing Selections</title> +<!-- .XS --> +<!-- (SN Managing Selections --> +<!-- .XE --> +<para> +<!-- .LP --> +Arbitrary widgets in multiple applications can communicate +with each other by means of the (xI global selection mechanism, +which conforms to the specifications in the <emphasis remap='I'>(xC</emphasis>. +The (xI supply functions for providing and receiving selection data in +one logical piece (atomic transfers) +or in smaller logical segments (incremental transfers). +</para> +<para> +<!-- .LP --> +The incremental interface is provided for a selection owner or +selection requestor that cannot or prefers not to pass the selection +value to and from the (xI in a single call. For instance, +either an application that is running on a machine with limited memory +may not be able to store the entire selection value in memory or a +selection owner may already have the selection value available in +discrete chunks, and it would be more efficient not to have to +allocate additional storage to copy the pieces contiguously. Any +owner or requestor that prefers to deal with the selection value in +segments can use the incremental interfaces to do so. +The transfer between the selection owner or requestor and the (xI is not +required to match the underlying +transport protocol between the application and the X server; +the (xI will break too large a selection +into smaller pieces for transport if necessary +and will coalesce a selection transmitted incrementally if the value +was requested atomically. + +</para> +<sect3 id="Setting_and_Getting_the_Selection_Timeout_Value"> +<title>Setting and Getting the Selection Timeout Value</title> +<!-- .XS --> +<!-- <function>(SN Setting and Getting the Selection Timeout Value</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To set the (xI selection timeout, use +<function>XtAppSetSelectionTimeout .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetSelectionTimeout" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppSetSelectionTimeout(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>timeout</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + unsigned long <emphasis remap='I'>timeout</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>timeout</emphasis> + </term> + <listitem> + <para> +Specifies the selection timeout in milliseconds. +<!-- .eM --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +To get the current selection timeout value, use +<function>XtAppGetSelectionTimeout .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppGetSelectionTimeout" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +unsigned long XtAppGetSelectionTimeout(<emphasis remap='I'>app_context</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppGetSelectionTimeout</function> +function returns the current selection timeout value in milliseconds. +The selection timeout is the time within which the two communicating +applications must respond to one another. +The initial timeout value is set by the +selectionTimeout +<!-- .IN "selectionTimeout" --> +application resource as retrieved by +<function>XtDisplayInitialize .</function> +If +selectionTimeout +is not specified, +the default is five seconds. + +</para> +</sect3> +<sect3 id="Using_Atomic_Transfers"> +<title>Using Atomic Transfers</title> +<!-- .XS --> +<!-- (SN Using Atomic Transfers --> +<!-- .XE --> +<para> +<!-- .LP --> +When using atomic transfers, the owner will completely +process one selection request at a time. +The owner may consider each request individually, +since there is no possibility for overlap +between evaluation of two requests. + +</para> +<sect4 id="Atomic_Transfer_Procedures"> +<title>Atomic Transfer Procedures</title> +<!-- .XS --> +<!-- (SN Atomic Transfer Procedures --> +<!-- .XE --> +<!-- .IN "Selections" "atomic" --> +<para> +<!-- .LP --> +The following procedures are used by the selection owner when +providing selection data in a single unit. +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the owner to supply the selection +data to the (xI is of type +<function>XtConvertSelectionProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConvertSelectionProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtConvertSelectionProc)(Widget, Atom*, Atom*, Atom*, +<!-- .br --> + XtPointer*, unsigned long*, int*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>target</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>type_return</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>value_return</emphasis>; +<!-- .br --> + unsigned long *<emphasis remap='I'>length_return</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>format_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that currently owns this selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom naming the selection requested +(for example, +<function>XA_PRIMARY</function> +or +<function>XA_SECONDARY ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the target type of the selection that has been requested, +which indicates the desired information about the selection +(for example, File Name, Text, Window). + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to an atom into which the property type of the +converted value of the selection is to be stored. +For instance, either File Name or Text might have property type +<function>XA_STRING .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which a pointer to the converted value of the +selection is to be stored. +The selection owner is responsible for allocating this storage. +If the selection owner has provided an +<function>XtSelectionDoneProc</function> +for the selection, +this storage is owned by the selection owner; +otherwise, it is owned by the (xI selection mechanism, +which frees it by calling +<function>XtFree</function> +when it is done with it. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>length_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which the number of elements in <emphasis remap='I'>value_return</emphasis>, +each of size indicated by <emphasis remap='I'>format_return</emphasis>, is to be stored. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>format_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which the size in bits of the data elements +of the selection value is to be stored. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure is called by the (xI selection mechanism +to get the value of a selection as a given type +from the current selection owner. +It returns +<function>True</function> +if the owner successfully converted the selection to the target type or +<function>False</function> +otherwise. +If the procedure returns +<function>False ,</function> +the values of the return arguments are undefined. +Each +<function>XtConvertSelectionProc</function> +should respond to target value +<function>TARGETS</function> +by returning a value containing the list of the targets +into which it is +prepared to convert the selection. +The value returned in +<emphasis remap='I'>format_return</emphasis> must be one of 8, 16, or 32 to allow the server to +byte-swap the data if necessary. +</para> +<para> +<!-- .LP --> +<!-- .IN "Selections" "MULTIPLE" --> +<!-- .IN "Selections" "TIMESTAMP" --> +This procedure does not need to worry about responding to the +MULTIPLE or the TIMESTAMP target values (see Section 2.6.2 in the <emphasis remap='I'>(xC</emphasis>). +A selection request with +the MULTIPLE target type is transparently transformed into a +series of calls to this procedure, one for each target type, and a +selection request with the TIMESTAMP target value is answered +automatically by the (xI using the time specified in the +call to +<function>XtOwnSelection</function> +or +<function>XtOwnSelectionIncremental .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve the +<function>SelectionRequest</function> +event that triggered the +<function>XtConvertSelectionProc</function> +procedure, use +<function>XtGetSelectionRequest .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionRequest" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XSelectionRequestEvent *XtGetSelectionRequest(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, \ +<emphasis remap='I'>request_id</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + XtRequestId <emphasis remap='I'>request_id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that currently owns this selection. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the selection being processed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request_id</emphasis> + </term> + <listitem> + <para> +Specifies the requestor id in the case of incremental +selections, or NULL in the case of atomic transfers. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetSelectionRequest</function> +may be called only from within an +<function>XtConvertSelectionProc</function> +procedure and returns a pointer to the +<function>SelectionRequest</function> +event that caused the conversion procedure to be invoked. +<emphasis remap='I'>Request_id</emphasis> specifies a unique id for the individual request in the +case that multiple incremental transfers are outstanding. For atomic +transfers, <emphasis remap='I'>request_id</emphasis> must be specified as NULL. If no +<function>SelectionRequest</function> +event is being processed for the specified +<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>selection</emphasis>, and <emphasis remap='I'>request_id</emphasis>, +<function>XtGetSelectionRequest</function> +returns NULL. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the owner when it desires +notification upon losing ownership is of type +<function>XtLoseSelectionProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtLoseSelectionProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtLoseSelectionProc)(Widget, Atom*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that has lost selection ownership. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom naming the selection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure is called by the (xI selection mechanism +to inform the specified widget that it has lost the given selection. +Note that this procedure does not ask the widget to relinquish the +selection ownership; it is merely informative. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the owner when it desires +notification of receipt of the data or when it manages the storage +containing the data is of type +<function>XtSelectionDoneProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSelectionDoneProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtSelectionDoneProc)(Widget, Atom*, Atom*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>target</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that owns the converted selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom naming the selection that was converted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the target type to which the conversion was done. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure is called by the (xI selection mechanism +to inform the selection owner that a selection requestor has successfully +retrieved a selection value. +If the selection owner has registered an +<function>XtSelectionDoneProc ,</function> +it should expect it to be called once for each conversion that it performs, +after the converted value has been successfully transferred +to the requestor. +If the selection owner has registered an +<function>XtSelectionDoneProc ,</function> +it also owns the storage containing the converted +selection value. + +</para> +</sect4> +<sect4 id="Getting_the_Selection_Value"> +<title>Getting the Selection Value</title> +<!-- .XS --> +<!-- (SN Getting the Selection Value --> +<!-- .XE --> +<para> +<!-- .LP --> +The procedure pointer specified by the requestor to receive the +selection data from the (xI is of type +<function>XtSelectionCallbackProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSelectionCallbackProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtSelectionCallbackProc)(Widget, XtPointer, Atom*, Atom*, \ +XtPointer, unsigned long*, int*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>type</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>value</emphasis>; +<!-- .br --> + unsigned long *<emphasis remap='I'>length</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>format</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that requested the selection value. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies a value passed in by the widget when it requested the +selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the name of the selection that was requested. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the representation type of the selection value (for example, +<function>XA_STRING ).</function> +Note that it is not the target that was requested (which the client +must remember for itself), but the type that +is used to represent the target. +The special symbolic constant +<function>XT_CONVERT_FAIL</function> +is used to indicate that the selection conversion failed because the +selection owner did not respond within the (xI selection timeout +interval. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the selection value. +The requesting client owns this storage and is responsible for freeing it +by calling +<function>XtFree</function> +when it is done with it. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>length</emphasis> + </term> + <listitem> + <para> +Specifies the number of elements in <emphasis remap='I'>value</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>format</emphasis> + </term> + <listitem> + <para> +Specifies the size in bits of the data in each element of <emphasis remap='I'>value</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure is called by the (xI selection mechanism to deliver the +requested selection to the requestor. +</para> +<para> +<!-- .LP --> +If the +<function>SelectionNotify</function> +event returns a property of +<function>None ,</function> +meaning the conversion has been refused because there is no owner for the +specified selection or the owner cannot convert the selection to the +requested target for any reason, the procedure is called with a value +of NULL and a length of zero. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To obtain the selection value in a single logical unit, use +<function>XtGetSelectionValue</function> +or +<function>XtGetSelectionValues .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionValue" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSelectionValue(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, \ +<emphasis remap='I'>callback</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>target</emphasis>; +<!-- .br --> + XtSelectionCallbackProc <emphasis remap='I'>callback</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired; for example, +<function>XA_PRIMARY .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the type of information needed about the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called when the selection value +has been obtained. +Note that this is how the selection value is communicated back to the client. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies additional data to be passed to the specified procedure +when it is called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the selection request was +initiated. +This should be the timestamp of the event that triggered this request; +the value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetSelectionValue</function> +function requests the value of the selection converted to +the target type. +The specified callback is called at some time after +<function>XtGetSelectionValue</function> +is called, when the selection value is received from the X server. +It may be called before or after +<function>XtGetSelectionValue</function> +returns. +For more information about <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, and +<emphasis remap='I'>time</emphasis>, see Section 2.6 in the <emphasis remap='I'>(xC</emphasis>. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionValues" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSelectionValues(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>targets</emphasis>, \ +<emphasis remap='I'>count</emphasis>, <emphasis remap='I'>callback</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>targets</emphasis>; +<!-- .br --> + int <emphasis remap='I'>count</emphasis>; +<!-- .br --> + XtSelectionCallbackProc <emphasis remap='I'>callback</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired (that is, primary or secondary). + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>targets</emphasis> + </term> + <listitem> + <para> +Specifies the types of information needed about the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>count</emphasis> + </term> + <listitem> + <para> +Specifies the length of the <emphasis remap='I'>targets</emphasis> and <emphasis remap='I'>client_data</emphasis> lists. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>callback</emphasis> + </term> + <listitem> + <para> +Specifies the callback procedure +to be called with each selection value obtained. +Note that this is how the selection values are communicated back to the +client. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies a list of additional data values, one for each target type, +that are passed to the callback procedure when it is called for that target. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the selection request was +initiated. +This should be the timestamp of the event that triggered this request; +the value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetSelectionValues</function> +function is similar to multiple calls to +<function>XtGetSelectionValue</function> +except that it guarantees that no other client can assert ownership +between requests and therefore that all the conversions will refer to +the same selection value. The callback is invoked once for each +target value with the corresponding client data. +For more information about <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, and +<emphasis remap='I'>time</emphasis>, see Section 2.6 in the <emphasis remap='I'>(xC</emphasis>. + +</para> +</sect4> +<sect4 id="Setting_the_Selection_Owner"> +<title>Setting the Selection Owner</title> +<!-- .XS --> +<!-- (SN Setting the Selection Owner --> +<!-- .XE --> +<para> +<!-- .LP --> +To set the selection owner and indicate that the selection value will +be provided in one piece, use +<function>XtOwnSelection .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOwnSelection" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtOwnSelection(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>time</emphasis>, \ +<emphasis remap='I'>convert_proc</emphasis>, <emphasis remap='I'>lose_selection</emphasis>, <emphasis remap='I'>done_proc</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .br --> + XtConvertSelectionProc <emphasis remap='I'>convert_proc</emphasis>; +<!-- .br --> + XtLoseSelectionProc <emphasis remap='I'>lose_selection</emphasis>; +<!-- .br --> + XtSelectionDoneProc <emphasis remap='I'>done_proc</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that wishes to become the owner. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the name of the selection (for example, +<function>XA_PRIMARY ).</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the ownership request was +initiated. +This should be the timestamp of the event that triggered ownership; +the value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>convert_proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called whenever a client requests the +current value of the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>lose_selection</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called whenever the widget has +lost selection ownership, or NULL if the owner is not interested in being +called back. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>done_proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure called +after the requestor has received the selection value, or NULL if the +owner is not +interested in being called back. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOwnSelection</function> +function informs the (xI selection mechanism that a +widget wishes to own a selection. +It returns +<function>True</function> +if the widget successfully becomes the owner and +<function>False</function> +otherwise. +The widget may fail to become the owner if some other widget +has asserted ownership at a time later than this widget. +The widget can lose selection ownership either +because some other widget asserted later ownership of the selection +or because the widget voluntarily gave up ownership of the selection. +The lose_selection procedure is not called +if the widget fails to obtain selection ownership in the first place. +</para> +<para> +<!-- .LP --> +If a done_proc is specified, the client owns the storage allocated +for passing the value to the (xI. If <emphasis remap='I'>done_proc</emphasis> is NULL, +the convert_proc must allocate storage using +<function>XtMalloc ,</function> +<function>XtRealloc ,</function> +or +<function>XtCalloc ,</function> +and the value specified is freed by the +(xI when the transfer is complete. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +Usually, a selection owner maintains ownership indefinitely until some +other widget requests ownership, at which time +the (xI selection mechanism informs the previous owner that it +has lost ownership of the selection. +However, in response to some user actions +(for example, when a user deletes the information selected), +the application may wish to explicitly inform the (xI +by using +<function>XtDisownSelection</function> +that it no longer is to be the selection owner. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDisownSelection" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtDisownSelection(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that wishes to relinquish ownership. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom naming the selection being given up. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the request to +relinquish selection ownership was initiated. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtDisownSelection</function> +function informs the (xI selection mechanism that +the specified widget is to lose ownership of the selection. +If the widget does not currently own the selection, either +because it lost the selection +or because it never had the selection to begin with, +<function>XtDisownSelection</function> +does nothing. +</para> +<para> +<!-- .LP --> +After a widget has called +<function>XtDisownSelection ,</function> +its convert procedure is not called even if a request arrives later +with a timestamp during the period that this widget owned the selection. +However, its done procedure is called if a conversion that started +before the call to +<function>XtDisownSelection</function> +finishes after the call to +<function>XtDisownSelection .</function> + +</para> +</sect4> +</sect3> +<sect3 id="Using_Incremental_Transfers"> +<title>Using Incremental Transfers</title> +<!-- .XS --> +<!-- (SN Using Incremental Transfers --> +<!-- .XE --> +<para> +<!-- .LP --> +When using the incremental interface, an owner may have to process +more than one selection request for the same selection, converted to +the same target, at the same time. The incremental functions take a +<emphasis remap='I'>request_id</emphasis> argument, which is an identifier that is guaranteed to be +unique among all incremental requests that are active concurrently. +</para> +<para> +<!-- .LP --> +For example, consider the following: +</para> +<itemizedlist> + <listitem> + <para> +Upon receiving a request for the selection value, the owner sends +the first segment. + </para> + </listitem> + <listitem> + <para> +While waiting to be called to provide the next segment value but +before sending it, the owner receives another request from a +different requestor for the same selection value. + </para> + </listitem> + <listitem> + <para> +To distinguish between the requests, the owner uses the request_id +value. This allows the owner to distinguish between the first +requestor, which is asking for the second segment, and the second +requestor, which is asking for the first segment. + + </para> + </listitem> +</itemizedlist> +<sect4 id="Incremental_Transfer_Procedures"> +<title>Incremental Transfer Procedures</title> +<!-- .XS --> +<!-- (SN Incremental Transfer Procedures --> +<!-- .XE --> +<!-- .IN "Selections" "incremental" --> +<para> +<!-- .LP --> +The following procedures are used by selection owners who wish to +provide the selection data in multiple segments. +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the incremental owner to supply the +selection data to the (xI is of type +<function>XtConvertSelectionIncrProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef XtPointer XtRequestId; +</literallayout> +<!-- .IN "XtRequestId" "" "@DEF@" --> +<!-- .IN "XtConvertSelectionIncrProc" "" "@DEF@" --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtConvertSelectionIncrProc)(Widget, Atom*, Atom*, \ +Atom*, XtPointer*, + unsigned long*, int*, unsigned long*, \ +XtPointer, XtRequestId*); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>target</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>type_return</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>value_return</emphasis>; +<!-- .br --> + unsigned long *<emphasis remap='I'>length_return</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>format_return</emphasis>; +<!-- .br --> + unsigned long *<emphasis remap='I'>max_length</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + XtRequestId *<emphasis remap='I'>request_id</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that currently owns this selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom that names the selection requested. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the type of information required about the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to an atom into which the property +type of the converted value of the selection is to be +stored. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which a pointer to the +converted value of the selection is to be stored. +The selection owner is responsible for allocating this storage. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>length_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which the number of elements +in <emphasis remap='I'>value_return</emphasis>, each of size indicated by +<emphasis remap='I'>format_return</emphasis>, is to be stored. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>format_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which the size in bits of the +data elements of the selection value is to be stored so that the +server may byte-swap the data if necessary. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>max_length</emphasis> + </term> + <listitem> + <para> +Specifies the maximum number of bytes which may be +transferred at any one time. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the value passed in by the widget when it +took ownership of the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request_id</emphasis> + </term> + <listitem> + <para> +Specifies an opaque identification for a specific request. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure is called repeatedly by the (xI selection mechanism to get +the next incremental chunk of data from a selection owner who has +called +<function>XtOwnSelectionIncremental .</function> +It must return +<function>True</function> +if the procedure has succeeded in converting the selection data or +<function>False</function> +otherwise. +On the first call with a particular request id, the owner must begin +a new incremental transfer for the requested selection and target. On +subsequent calls with the same request id, the owner may assume that +the previously supplied value is no longer needed by the (xI; +that is, a fixed transfer area may be allocated and returned in <emphasis remap='I'>value_return</emphasis> +for each segment to be transferred. This procedure should store a +non-NULL value in <emphasis remap='I'>value_return</emphasis> and zero in <emphasis remap='I'>length_return</emphasis> to indicate that the +entire selection has been delivered. After returning this final +segment, the request id may be reused by the (xI to begin a +new transfer. +</para> +<para> +<!-- .LP --> +To retrieve the +<function>SelectionRequest</function> +event that triggered the selection conversion procedure, use +<function>XtGetSelectionRequest ,</function> +described in Section 11.5.2.1. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the incremental selection owner +when it desires notification upon no longer having ownership is of +type +<function>XtLoseSelectionIncrProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtLoseSelectionIncrProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtLoseSelectionIncrProc)(Widget, Atom*, XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that has lost the selection ownership. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom that names the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the value passed in by the widget when it +took ownership of the selection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure, which is optional, is called by the (xI to +inform the selection owner that it no longer owns the selection. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the incremental selection owner +when it desires notification of receipt of the data or when it manages +the storage containing the data is of type +<function>XtSelectionDoneIncrProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSelectionDoneIncrProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtSelectionDoneIncrProc)(Widget, Atom*, Atom*, \ +XtRequestId*, XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>target</emphasis>; +<!-- .br --> + XtRequestId *<emphasis remap='I'>request_id</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that owns the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom that names the selection being transferred. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the target type to which the conversion was done. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request_id</emphasis> + </term> + <listitem> + <para> +Specifies an opaque identification for a specific request. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specified the value passed in by the widget when it +took ownership of the selection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure, which is optional, is called by the (xI after +the requestor has retrieved the final (zero-length) segment of the +incremental transfer to indicate that the entire transfer is complete. +If this procedure is not specified, the (xI will free only the +final value returned by the selection owner using +<function>XtFree .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The procedure pointer specified by the incremental selection owner to +notify it if a transfer should be terminated prematurely is of type +<function>XtCancelConvertSelectionProc .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCancelConvertSelectionProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtCancelConvertSelectionProc)(Widget, Atom*, Atom*, \ +XtRequestId*, XtPointer); +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>target</emphasis>; +<!-- .br --> + XtRequestId *<emphasis remap='I'>request_id</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that owns the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom that names the selection being transferred. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the target type to which the conversion was done. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request_id</emphasis> + </term> + <listitem> + <para> +Specifies an opaque identification for a specific request. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the value passed in by the widget when it took ownership of +the selection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This procedure is called by the (xI when it has been determined +by means of a timeout or other mechanism that any remaining segments +of the selection no longer need to be transferred. Upon receiving +this callback, the selection request is considered complete and the +owner can free the memory and any other resources that have been +allocated for the transfer. + +</para> +</sect4> +<sect4 id="Getting_the_Selection_Value_Incrementally"> +<title>Getting the Selection Value Incrementally</title> +<!-- .XS --> +<!-- (SN Getting the Selection Value Incrementally --> +<!-- .XE --> +<para> +<!-- .LP --> +To obtain the value of the selection using incremental transfers, use +<function>XtGetSelectionValueIncremental</function> +or +<function>XtGetSelectionValuesIncremental .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionValueIncremental" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSelectionValueIncremental(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, \ +<emphasis remap='I'>selection_callback</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>target</emphasis>; +<!-- .br --> + XtSelectionCallbackProc <emphasis remap='I'>selection_callback</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>target</emphasis> + </term> + <listitem> + <para> +Specifies the type of information needed +about the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection_callback</emphasis> + </term> + <listitem> + <para> +Specifies the callback procedure to be +called to receive each data segment. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies client-specific data to be passed to +the specified callback procedure when it is invoked. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the +selection request was initiated. This should be the +timestamp of the event that triggered this request; +the value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetSelectionValueIncremental</function> +function is similar to +<function>XtGetSelectionValue</function> +except that the selection_callback procedure will +be called repeatedly upon delivery of multiple segments of the +selection value. The end of the selection value is indicated when +<emphasis remap='I'>selection_callback</emphasis> is called with a non-NULL value of length zero, +which must still be freed by the client. If the +transfer of the selection is aborted in the middle of a transfer +(for example, because of a timeout), the selection_callback procedure is +called with a type value equal to the symbolic constant +<function>XT_CONVERT_FAIL</function> +so that the requestor can dispose +of the partial selection value it has collected up until that point. +Upon receiving +<function>XT_CONVERT_FAIL ,</function> +the requesting client must determine +for itself whether or not a partially completed data transfer is meaningful. +For more information about <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, and +<emphasis remap='I'>time</emphasis>, see Section 2.6 in the <emphasis remap='I'>(xC</emphasis>. +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionValuesIncremental" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSelectionValuesIncremental(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>targets</emphasis>, \ +<emphasis remap='I'>count</emphasis>, <emphasis remap='I'>selection_callback</emphasis>, <emphasis remap='I'>client_data</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>targets</emphasis>; +<!-- .br --> + int <emphasis remap='I'>count</emphasis>; +<!-- .br --> + XtSelectionCallbackProc <emphasis remap='I'>selection_callback</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>client_data</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>targets</emphasis> + </term> + <listitem> + <para> +Specifies the types of information needed about +the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>count</emphasis> + </term> + <listitem> + <para> +Specifies the length of the <emphasis remap='I'>targets</emphasis> and <emphasis remap='I'>client_data</emphasis> lists. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection_callback</emphasis> + </term> + <listitem> + <para> +Specifies the callback procedure to be called +to receive each selection value. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies a list of client data (one for each target +type) values that are passed to the callback procedure when +it is invoked for the corresponding target. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the +selection request was initiated. This should be the +timestamp of the event that triggered this request; +the value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetSelectionValuesIncremental</function> +function is similar to +<function>XtGetSelectionValueIncremental</function> +except that it takes a list of targets and client data. +<function>XtGetSelectionValuesIncremental</function> +is equivalent to calling +<function>XtGetSelectionValueIncremental</function> +successively for each <emphasis remap='I'>target/client_data</emphasis> pair except that +<function>XtGetSelectionValuesIncremental</function> +does guarantee that all the conversions will use the same selection +value because the ownership of the selection cannot change in the +middle of the list, as would be possible when calling +<function>XtGetSelectionValueIncremental</function> +repeatedly. +For more information about <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, and +<emphasis remap='I'>time</emphasis>, see Section 2.6 in the <emphasis remap='I'>(xC</emphasis>. + +</para> +</sect4> +<sect4 id="Setting_the_Selection_Owner_for_Incremental_Transfers"> +<title>Setting the Selection Owner for Incremental Transfers</title> +<!-- .XS --> +<!-- (SN Setting the Selection Owner for Incremental Transfers --> +<!-- .XE --> +<para> +<!-- .LP --> +To set the selection owner when using incremental transfers, use +<function>XtOwnSelectionIncremental .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtOwnSelectionIncremental" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtOwnSelectionIncremental(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>time</emphasis>, \ +<emphasis remap='I'>convert_callback</emphasis>, <emphasis remap='I'>lose_callback</emphasis>, + <emphasis remap='I'>done_callback</emphasis>, \ +<emphasis remap='I'>cancel_callback</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .br --> + XtConvertSelectionIncrProc <emphasis remap='I'>convert_callback</emphasis>; +<!-- .br --> + XtLoseSelectionIncrProc <emphasis remap='I'>lose_callback</emphasis>; +<!-- .br --> + XtSelectionDoneIncrProc <emphasis remap='I'>done_callback</emphasis>; +<!-- .br --> + XtCancelConvertSelectionProc <emphasis remap='I'>cancel_callback</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget that wishes to become the owner. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom that names the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the +selection ownership request was initiated. This should be +the timestamp of the event that triggered ownership; the value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>convert_callback</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called whenever +the current value of the selection is requested. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>lose_callback</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called whenever +the widget has lost selection ownership, or NULL if the +owner is not interested in being notified. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>done_callback</emphasis> + </term> + <listitem> + <para> +Specifies the procedure called after the +requestor has received the entire selection, or NULL if +the owner is not interested in being notified. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>cancel_callback</emphasis> + </term> + <listitem> + <para> +Specifies the callback procedure to be called +when a selection request aborts because a timeout expires, +or NULL if the owner is not interested in being notified. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the argument to be passed to each of +the callback procedures when they are called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtOwnSelectionIncremental</function> +procedure informs the (xI +incremental selection mechanism that the specified widget wishes to +own the selection. It returns +<function>True</function> +if the specified widget successfully becomes the selection owner or +<function>False</function> +otherwise. +For more information about <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, and +<emphasis remap='I'>time</emphasis>, see Section 2.6 in the <emphasis remap='I'>(xC</emphasis>. +</para> +<para> +<!-- .LP --> +If a done_callback procedure is specified, the client owns the storage allocated +for passing the value to the (xI. If <emphasis remap='I'>done_callback</emphasis> is NULL, +the convert_callback procedure must allocate storage using +<function>XtMalloc ,</function> +<function>XtRealloc ,</function> +or +<function>XtCalloc ,</function> +and the final value specified is freed by the +(xI when the transfer is complete. After a selection transfer +has started, only one of the done_callback or cancel_callback +procedures is invoked to indicate completion of the transfer. +</para> +<para> +<!-- .LP --> +The lose_callback procedure does not indicate completion of any in-progress +transfers; it is invoked at the time a +<function>SelectionClear</function> +event is dispatched regardless of any active transfers, which are still +expected to continue. +</para> +<para> +<!-- .LP --> +A widget that becomes the selection owner using +<function>XtOwnSelectionIncremental</function> +may use +<function>XtDisownSelection</function> +to relinquish selection ownership. + +</para> +</sect4> +</sect3> +<sect3 id="Setting_and_Retrieving_Selection_Target_Parameters"> +<title>Setting and Retrieving Selection Target Parameters</title> +<!-- .XS --> +<!-- (SN Setting and Retrieving Selection Target Parameters --> +<!-- .XE --> +<para> +<!-- .LP --> +To specify target parameters for a selection request with a single target, +use +<function>XtSetSelectionParameters .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetSelectionParameters" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetSelectionParameters(<emphasis remap='I'>requestor</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>type</emphasis>, \ +<emphasis remap='I'>value</emphasis>, <emphasis remap='I'>length</emphasis>, <emphasis remap='I'>format</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>requestor</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>type</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>value</emphasis>; +<!-- .br --> + unsigned long <emphasis remap='I'>length</emphasis>; +<!-- .br --> + int <emphasis remap='I'>format</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>requestor</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the atom that names the selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the type of the property in which the parameters are passed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the parameters. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>length</emphasis> + </term> + <listitem> + <para> +Specifies the number of elements containing data in <emphasis remap='I'>value</emphasis>, +each element of a size indicated by <emphasis remap='I'>format</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>format</emphasis> + </term> + <listitem> + <para> +Specifies the size in bits of the data in the elements of <emphasis remap='I'>value</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +The specified parameters are copied and stored in a new property +of the specified type and format on the requestor's window. To initiate +a selection request with a target and these parameters, a subsequent +call to +<function>XtGetSelectionValue</function> +or to +<function>XtGetSelectionValueIncremental</function> +specifying the same requestor widget and selection atom will generate a +<function>ConvertSelection</function> +request referring to the property containing the parameters. If +<function>XtSetSelectionParameters</function> +is called more than once with the same widget and selection without +a call to specify a request, the most recently specified parameters +are used in the subsequent request. +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The possible values of <emphasis remap='I'>format</emphasis> are 8, 16, or 32. If the format is 8, +the elements of <emphasis remap='I'>value</emphasis> are assumed to be sizeof(char); +if 16, sizeof(short); if 32, sizeof(long). +</para> +<para> +<!-- .LP --> +To generate a MULTIPLE +target request with parameters for any of the multiple targets of the +selection request, precede individual calls to +<function>XtGetSelectionValue</function> +and +<function>XtGetSelectionValueIncremental</function> +with corresponding individual calls to +<function>XtSetSelectionParameters ,</function> +and enclose these all within +<function>XtCreateSelectionRequest</function> +and +<function>XtSendSelectionRequest.</function> +<function>XtGetSelectionValues</function> +and +<function>XtGetSelectionValuesIncremental</function> +cannot be used to make selection requests with parameterized targets. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To retrieve any target parameters needed to perform a selection conversion, +the selection owner calls +<function>XtGetSelectionParameters .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionParameters" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetSelectionParameters(<emphasis remap='I'>owner</emphasis>, <emphasis remap='I'>selection</emphasis>, \ +<emphasis remap='I'>request_id</emphasis>, <emphasis remap='I'>type_return</emphasis>, <emphasis remap='I'>value_return</emphasis>, + <emphasis remap='I'>length_return</emphasis>, \ +<emphasis remap='I'>format_return</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>owner</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + XtRequestId <emphasis remap='I'>request_id</emphasis>; +<!-- .br --> + Atom *<emphasis remap='I'>type_return</emphasis>; +<!-- .br --> + XtPointer *<emphasis remap='I'>value_return</emphasis>; +<!-- .br --> + unsigned long *<emphasis remap='I'>length_return</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>format_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>owner</emphasis> + </term> + <listitem> + <para> +Specifies the widget that owns the specified selection. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the selection being processed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>request_id</emphasis> + </term> + <listitem> + <para> +Specifies the requestor id in the case of incremental selections, +or NULL in the case of atomic transfers. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to an atom in which the property type +of the parameters is stored. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>value_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which a pointer to the parameters is to be stored. +A NULL is stored if no parameters accompany the request. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>length_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which the number of data elements +in <emphasis remap='I'>value_return</emphasis> of size indicated by <emphasis remap='I'>format_return</emphasis> are stored. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>format_return</emphasis> + </term> + <listitem> + <para> +Specifies a pointer into which the size in bits of the parameter data +in the elements of <emphasis remap='I'>value</emphasis> is stored. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetSelectionParameters</function> +may be called only from within an +<function>XtConvertSelectionProc</function> +or from within the first call to an +<function>XtConvertSelectionIncrProc</function> +with a new request_id. +</para> +<para> +<!-- .LP --> +It is the responsibility of the caller to free the returned parameters using +<function>XtFree</function> +when the parameters are no longer needed. + +</para> +</sect3> +<sect3 id="Generating_MULTIPLE_Requests"> +<title>Generating MULTIPLE Requests</title> +<!-- .XS --> +<!-- (SN Generating MULTIPLE Requests --> +<!-- .XE --> +<para> +<!-- .LP --> +To have the (xI bundle multiple calls to make selection requests into +a single request using a \s-1MULTIPLE\s+1 target, use +<function>XtCreateSelectionRequest</function> +and +<function>XtSendSelectionRequest .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreateSelectionRequest" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCreateSelectionRequest(<emphasis remap='I'>requestor</emphasis>, <emphasis remap='I'>selection</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>requestor</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>requestor</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +When +<function>XtCreateSelectionRequest</function> +is called, subsequent calls to +<function>XtGetSelectionValue ,</function> +<function>XtGetSelectionValueIncremental ,</function> +<function>XtGetSelectionValues ,</function> +and +<function>XtGetSelectionValuesIncremental ,</function> +with the requestor and selection as specified to +<function>XtCreateSelectionRequest ,</function> +are bundled into a single selection request with +multiple targets. The request is made by calling +<function>XtSendSelectionRequest .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSendSelectionRequest" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSendSelectionRequest(<emphasis remap='I'>requestor</emphasis>, <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>time</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>requestor</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .br --> + Time <emphasis remap='I'>time</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>requestor</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>time</emphasis> + </term> + <listitem> + <para> +Specifies the timestamp that indicates when the selection request was +initiated. The value +<function>CurrentTime</function> +is not acceptable. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +When +<function>XtSendSelectionRequest</function> +is called with a value of <emphasis remap='I'>requestor</emphasis> and <emphasis remap='I'>selection</emphasis> matching +a previous call to +<function>XtCreateSelectionRequest ,</function> +a selection request is sent to the selection owner. +If a single target request is queued, that request is made. +If multiple targets are queued, they are bundled into a single request +with a target of MULTIPLE using the specified timestamp. +As the values are returned, the callbacks specified in +<function>XtGetSelectionValue ,</function> +<function>XtGetSelectionValueIncremental ,</function> +<function>XtGetSelectionValues ,</function> +and +<function>XtGetSelectionValueIncremental</function> +are invoked. +</para> +<para> +<!-- .LP --> +Multi-threaded applications should lock the application context before +calling +<function>XtCreateSelectionRequest</function> +and release the lock after calling +<function>XtSendSelectionRequest</function> +to ensure that the thread assembling the request is safe from interference +by another thread assembling a different request naming the same widget +and selection. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To relinquish the composition of a MULTIPLE request without sending it, use +<function>XtCancelSelectionRequest .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCancelSelectionRequest" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtCancelSelectionRequest(<emphasis remap='I'>requestor</emphasis>, <emphasis remap='I'>selection</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>requestor</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>selection</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>requestor</emphasis> + </term> + <listitem> + <para> +Specifies the widget making the request. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>selection</emphasis> + </term> + <listitem> + <para> +Specifies the particular selection desired. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +When +<function>XtCancelSelectionRequest</function> +is called, any requests queued since the last call to +<function>XtCreateSelectionRequest</function> +for the same widget and selection are discarded +and any resources reserved are released. +A subsequent call to +<function>XtSendSelectionRequest</function> +will not result in any request being made. +Subsequent calls to +<function>XtGetSelectionValue ,</function> +<function>XtGetSelectionValues ,</function> +<function>XtGetSelectionValueIncremental ,</function> +or +<function>XtGetSelectionValuesIncremental</function> +will not be deferred. + +</para> +</sect3> +<sect3 id="Auxiliary_Selection_Properties"> +<title>Auxiliary Selection Properties</title> +<!-- .XS --> +<!-- (SN Auxiliary Selection Properties --> +<!-- .XE --> +<para> +<!-- .LP --> +Certain uses of parameterized selections require clients to name +other window properties within a selection parameter. To permit +reuse of temporary property names in these circumstances and +thereby reduce the number of unique atoms created in the server, +the (xI provides two interfaces for acquiring temporary property names. +</para> +<para> +<!-- .LP --> +To acquire a temporary property name atom for use in a selection +request, the client may call +<function>XtReservePropertyAtom .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtReservePropertyAtom" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Atom XtReservePropertyAtom(<emphasis remap='I'>w</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget making a selection request. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtReservePropertyAtom</function> +returns an atom that may be used as a property name during selection +requests involving the specified widget. +As long as the atom remains reserved, it is unique with respect to all +other reserved atoms for the widget. +</para> +<para> +<!-- .LP --> +To return a temporary property name atom for reuse and to delete +the property named by that atom, use +<function>XtReleasePropertyAtom .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtReleasePropertyAtom" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtReleasePropertyAtom(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>atom</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Atom <emphasis remap='I'>atom</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget used to reserve the property name atom. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>atom</emphasis> + </term> + <listitem> + <para> +Specifies the property name atom returned by +<function>XtReservePropertyAtom</function> +that is to be released for reuse. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtReleasePropertyAtom</function> +marks the specified property name atom as +no longer in use and ensures that any property having that name +on the specified widget's window is deleted. If <emphasis remap='I'>atom</emphasis> does not +specify a value returned by +<function>XtReservePropertyAtom</function> +for the specified widget, the results are undefined. + +</para> +</sect3> +<sect3 id="Retrieving_the_Most_Recent_Timestamp"> +<title>Retrieving the Most Recent Timestamp</title> +<!-- .XS --> +<!-- (SN Retrieving the Most Recent Timestamp --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve the timestamp from the most recent call to +<function>XtDispatchEvent</function> +that contained a timestamp, use +<function>XtLastTimestampProcessed .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtLastTimestampProcessed" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Time XtLastTimestampProcessed(<emphasis remap='I'>display</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies an open display connection. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If no +<function>KeyPress ,</function> +<function>KeyRelease ,</function> +<function>ButtonPress ,</function> +<function>ButtonRelease ,</function> +<function>MotionNotify ,</function> +<function>EnterNotify ,</function> +<function>LeaveNotify ,</function> +<function>PropertyNotify ,</function> +or +<function>SelectionClear</function> +event has yet been passed to +<function>XtDispatchEvent</function> +for the specified display, +<function>XtLastTimestampProcessed</function> +returns zero. + +</para> +</sect3> +<sect3 id="Retrieving_the_Most_Recent_Event"> +<title>Retrieving the Most Recent Event</title> +<!-- .XS --> +<!-- (SN Retrieving the Most Recent Event --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve the event from the most recent call to +<function>XtDispatchEvent</function> +for a specific display, use +<function>XtLastEventProcessed .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtLastEventProcessed" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XEvent *XtLastEventProcessed(<emphasis remap='I'>display</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display connection from which to retrieve the event. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Returns the last event passed to +<function>XtDispatchEvent</function> +for the specified display. Returns NULL if there is no such event. +The client must not modify the contents of the returned event. + +</para> +</sect3> +</sect2> +<sect2 id="Merging_Exposure_Events_into_a_Region"> +<title>Merging Exposure Events into a Region</title> +<!-- .XS --> +<!-- (SN Merging Exposure Events into a Region --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide an +<function>XtAddExposureToRegion</function> +utility function that merges +<function>Expose</function> +and +<function>GraphicsExpose</function> +events into a region for clients to process at once +rather than processing individual rectangles. +For further information about regions, +see Section 16.5 in <emphasis remap='I'>(xL</emphasis>. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To merge +<function>Expose</function> +and +<function>GraphicsExpose</function> +events into a region, use +<function>XtAddExposureToRegion .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddExposureToRegion" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddExposureToRegion(<emphasis remap='I'>event</emphasis>, <emphasis remap='I'>region</emphasis>) +<!-- .br --> + XEvent *<emphasis remap='I'>event</emphasis>; +<!-- .br --> + Region <emphasis remap='I'>region</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>event</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the +<function>Expose</function> +or +<function>GraphicsExpose</function> +event. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>region</emphasis> + </term> + <listitem> + <para> +Specifies the region object (as defined in +<function>< X11/Xutil.h >).</function> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAddExposureToRegion</function> +function computes the union of the rectangle defined by the exposure +event and the specified region. +Then it stores the results back in <emphasis remap='I'>region</emphasis>. +If the event argument is not an +<function>Expose</function> +or +<function>GraphicsExpose</function> +event, +<function>XtAddExposureToRegion</function> +returns without an error and without modifying <emphasis remap='I'>region</emphasis>. +</para> +<para> +<!-- .LP --> +This function is used by the exposure compression mechanism; +see Section 7.9.3. + +</para> +</sect2> +<sect2 id="Translating_Widget_Coordinates"> +<title>Translating Widget Coordinates</title> +<!-- .XS --> +<!-- <function>(SN Translating Widget Coordinates</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To translate an x-y coordinate pair from widget coordinates to root +window absolute coordinates, use +<function>XtTranslateCoords .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtTranslateCoords" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtTranslateCoords(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>, <emphasis remap='I'>rootx_return</emphasis>, \ +<emphasis remap='I'>rooty_return</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + Position <emphasis remap='I'>x</emphasis>, <emphasis remap='I'>y</emphasis>; +<!-- .br --> + Position *<emphasis remap='I'>rootx_return</emphasis>, *<emphasis remap='I'>rooty_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget. (rI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>x</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>y</emphasis> + </term> + <listitem> + <para> +Specify the widget-relative x and y coordinates. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>rootx_return</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>rooty_return</emphasis> + </term> + <listitem> + <para> +Return the root-relative x and y coordinates. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +While +<function>XtTranslateCoords</function> +is similar to the Xlib +<function>XTranslateCoordinates</function> +function, it does not generate a server request because all the required +information already is in the widget's data structures. + +</para> +</sect2> +<sect2 id="Translating_a_Window_to_a_Widget"> +<title>Translating a Window to a Widget</title> +<!-- .XS --> +<!-- <function>(SN Translating a Window to a Widget</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To translate a given window and display pointer into a widget instance, use +<function>XtWindowToWidget .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWindowToWidget" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtWindowToWidget(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>window</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + Window <emphasis remap='I'>window</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display on which the window is defined. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>window</emphasis> + </term> + <listitem> + <para> +Specifies the drawable for which you want the widget. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If there is a realized widget whose window is the specified drawable on +the specified <emphasis remap='I'>display</emphasis>, +<function>XtWindowToWidget</function> +returns that widget. +If not and if the drawable has been associated with a widget through +<function>XtRegisterDrawable ,</function> +<function>XtWindowToWidget</function> +returns the widget associated with the drawable. In other cases it +returns NULL. + +</para> +</sect2> +<sect2 id="Handling_Errors"> +<title>Handling Errors</title> +<!-- .XS --> +<!-- <function>(SN Handling Errors</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI allow a client to register procedures that are called +whenever a fatal or nonfatal error occurs. +These facilities are intended for both error reporting and logging +and for error correction or recovery. +</para> +<para> +<!-- .LP --> +Two levels of interface are provided: +</para> +<itemizedlist> + <listitem> + <para> +A high-level interface that takes an error +name and class and retrieves the error message text from +an error resource database. + </para> + </listitem> + <listitem> + <para> +A low-level interface that takes a simple string to display. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The high-level functions construct a string to pass to the lower-level +interface. +The strings may be specified in application code and are +overridden by the contents of an external systemwide file, +the ``error database file''. The location and name of this file are +implementation-dependent. +<!-- .NT --> +The application-context-specific error handling is not +implemented on many systems, although the interfaces are +always present. +Most implementations will have just one set of error handlers +for all application contexts within a process. +If they are set for different application contexts, +the ones registered last will prevail. +<!-- .NE --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To obtain the error database (for example, to merge with +an application- or widget-specific database), use +<function>XtAppGetErrorDatabase .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppGetErrorDatabase" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XrmDatabase *XtAppGetErrorDatabase(\^<emphasis remap='I'>app_context</emphasis>\^) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppGetErrorDatabase</function> +function returns the address of the error database. +The (xI do a lazy binding of the error database and do not merge in the +database file until the first call to +<function>XtAppGetErrorDatabaseText .</function> +</para> +<para> +<!-- .LP --> +For a complete listing of all errors and warnings +that can be generated by the (xI, see Appendix D. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The high-level error and warning handler procedure pointers are of type +<function>XtErrorMsgHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtErrorMsgHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtErrorMsgHandler)(String, String, String, String, \ +String*, Cardinal*); +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>defaultp</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the name to be concatenated with the specified type to form +the resource name of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the type to be concatenated with the name to form the +resource name of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>defaultp</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if no error database entry is found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to a list of parameters to be substituted in the message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The specified name can be a general kind of error, +like ``invalidParameters'' or ``invalidWindow'', +and the specified type gives extra information +such as the name of the routine in which the error was detected. +Standard +<function>printf</function> +notation is used to substitute the parameters into the message. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +An error message handler can obtain the error database text for an +error or a warning by calling +<function>XtAppGetErrorDatabaseText .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppGetErrorDatabaseText" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppGetErrorDatabaseText(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>, <emphasis remap='I'>default</emphasis>, <emphasis remap='I'>buffer_return</emphasis>, <emphasis remap='I'>nbytes</emphasis>, <emphasis remap='I'>database</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>default</emphasis>; +<!-- .br --> + String <emphasis remap='I'>buffer_return</emphasis>; +<!-- .br --> + int <emphasis remap='I'>nbytes</emphasis>; +<!-- .br --> + XrmDatabase <emphasis remap='I'>database</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specify the name and type concatenated to form the resource name +of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>default</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if an error database entry is not found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>buffer_return</emphasis> + </term> + <listitem> + <para> +Specifies the buffer into which the error message is to be returned. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nbytes</emphasis> + </term> + <listitem> + <para> +Specifies the size of the buffer in bytes. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>database</emphasis> + </term> + <listitem> + <para> +Specifies the name of the alternative database to be used, +or NULL if the application context's error database is to be used. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppGetErrorDatabaseText</function> +returns the appropriate message from the error database +or returns the specified default message if one is not found in the +error database. +To form the full resource name and class when querying the database, +the <emphasis remap='I'>name</emphasis> and <emphasis remap='I'>type</emphasis> are concatenated with a single ``.'' +between them and the <emphasis remap='I'>class</emphasis> is concatenated with itself with a +single ``.'' if it does not already contain a ``.''. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To return the application name and class as passed to +<function>XtDisplayInitialize</function> +for a particular Display, use +<function>XtGetApplicationNameAndClass .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetApplicationNameAndClass" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetApplicationNameAndClass(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>name_return</emphasis>, \ +<emphasis remap='I'>class_return</emphasis>) +<!-- .br --> + Display* <emphasis remap='I'>display</emphasis>; +<!-- .br --> + String* <emphasis remap='I'>name_return</emphasis>; +<!-- .br --> + String* <emphasis remap='I'>class_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies an open display connection that has been initialized with +<function>XtDisplayInitialize .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name_return</emphasis> + </term> + <listitem> + <para> +Returns the application name. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class_return</emphasis> + </term> + <listitem> + <para> +Returns the application class. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetApplicationNameAndClass</function> +returns the application name and class passed to +<function>XtDisplayInitialize</function> +for the specified display. If the display was +never initialized or has been closed, the result is undefined. The +returned strings are owned by the (xI and must not be modified +or freed by the caller. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on fatal error conditions, use +<function>XtAppSetErrorMsgHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetErrorMsgHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtErrorMsgHandler XtAppSetErrorMsgHandler(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>msg_handler</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtErrorMsgHandler <emphasis remap='I'>msg_handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>msg_handler</emphasis> + </term> + <listitem> + <para> +Specifies the new fatal error procedure, which should not return. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppSetErrorMsgHandler</function> +returns a pointer to the previously +installed high-level fatal error handler. +The default high-level fatal error handler provided by the (xI is named +<function>_XtDefaultErrorMsg</function> +<!-- .IN "_XtDefaultErrorMsg" "" "@DEF" --> +and constructs a string from the error resource database and calls +<function>XtError .</function> +Fatal error message handlers should not return. +If one does, +subsequent (xI behavior is undefined. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the high-level error handler, use +<function>XtAppErrorMsg .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppErrorMsg" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppErrorMsg(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>, \ +<emphasis remap='I'>default</emphasis>, \ <emphasis remap='I'>params</emphasis>, <emphasis remap='I'>num_params</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>default</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the general kind of error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the detailed name of the error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>default</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if an error database entry is not found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to a list of values to be stored in the message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The (xI internal errors all have class +``XtToolkitError''. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on nonfatal error conditions, use +<function>XtAppSetWarningMsgHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetWarningMsgHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtErrorMsgHandler XtAppSetWarningMsgHandler(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>msg_handler</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtErrorMsgHandler <emphasis remap='I'>msg_handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>msg_handler</emphasis> + </term> + <listitem> + <para> +Specifies the new nonfatal error procedure, which usually returns. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppSetWarningMsgHandler</function> +returns a pointer to the previously +installed high-level warning handler. +The default high-level warning handler provided by the (xI is named +<function>_XtDefaultWarningMsg</function> +<!-- .IN "_XtDefaultWarningMsg" "" "@DEF@" --> +and constructs a string +from the error resource database and calls +<function>XtWarning .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the installed high-level warning handler, use +<function>XtAppWarningMsg .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppWarningMsg" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppWarningMsg(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>, <emphasis remap='I'>default</emphasis>, <emphasis remap='I'>params</emphasis>, <emphasis remap='I'>num_params</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>default</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the general kind of error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the detailed name of the error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>default</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if an error database entry is not found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to a list of values to be stored in the message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The (xI internal warnings all have class +``XtToolkitError''. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The low-level error and warning handler procedure pointers are of type +<function>XtErrorHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtErrorHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtErrorHandler)(String); +<!-- .br --> + String <emphasis remap='I'>message</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>message</emphasis> + </term> + <listitem> + <para> +Specifies the error message. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The error handler should display the message string in some appropriate fashion. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on fatal error conditions, use +<function>XtAppSetErrorHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetErrorHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtErrorHandler XtAppSetErrorHandler(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>handler</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtErrorHandler <emphasis remap='I'>handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>handler</emphasis> + </term> + <listitem> + <para> +Specifies the new fatal error procedure, which should not return. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppSetErrorHandler</function> +returns a pointer to the previously installed +low-level fatal error handler. +The default low-level error handler provided by the (xI is +<function>_XtDefaultError .</function> +<!-- .IN "_XtDefaultError" "" "@DEF@" --> +On POSIX-based systems, +it prints the message to standard error and terminates the application. +Fatal error message handlers should not return. +If one does, +subsequent (xI behavior is undefined. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the installed fatal error procedure, use +<function>XtAppError .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppError" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppError(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>message</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>message</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>message</emphasis> + </term> + <listitem> + <para> +Specifies the message to be reported. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Most programs should use +<function>XtAppErrorMsg ,</function> +not +<function>XtAppError ,</function> +to provide for customization and internationalization of error messages. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on nonfatal error conditions, use +<function>XtAppSetWarningHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppSetWarningHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtErrorHandler XtAppSetWarningHandler(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>handler</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + XtErrorHandler <emphasis remap='I'>handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>handler</emphasis> + </term> + <listitem> + <para> +Specifies the new nonfatal error procedure, which usually returns. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppSetWarningHandler</function> +returns a pointer to the previously installed +low-level warning handler. +The default low-level warning handler provided by the (xI is +<function>_XtDefaultWarning .</function> +<!-- .IN "_XtDefaultWarning" "" "@DEF@" --> +On POSIX-based systems, +it prints the message to standard error and returns to the caller. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the installed nonfatal error procedure, use +<function>XtAppWarning .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppWarning" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppWarning(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>message</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>message</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>message</emphasis> + </term> + <listitem> + <para> +Specifies the nonfatal error message to be reported. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Most programs should use +<function>XtAppWarningMsg ,</function> +not +<function>XtAppWarning ,</function> +to provide for customization and internationalization of warning messages. + +</para> +</sect2> +<sect2 id="Setting_WM_COLORMAP_WINDOWS"> +<title>Setting WM_COLORMAP_WINDOWS</title> +<!-- .XS --> +<!-- <function>(SN Setting WM_COLORMAP_WINDOWS</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +A client may set the value of the \s-1WM_COLORMAP_WINDOWS\s+1 +<!-- .IN "WM_COLORMAP_WINDOWS" "" "@DEF@" --> +property on a widget's window by calling +<function>XtSetWMColormapWindows .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetWMColormapWindows" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetWMColormapWindows(<emphasis remap='I'>widget</emphasis>, <emphasis remap='I'>list</emphasis>, <emphasis remap='I'>count</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>widget</emphasis>; +<!-- .br --> + Widget* <emphasis remap='I'>list</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>count</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>widget</emphasis> + </term> + <listitem> + <para> +Specifies the widget on whose window the \s-1WM_COLORMAP_WINDOWS\s+1 +property is stored. (cI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>list</emphasis> + </term> + <listitem> + <para> +Specifies a list of widgets whose windows are potentially to be +listed in the \s-1WM_COLORMAP_WINDOWS\s+1 property. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>count</emphasis> + </term> + <listitem> + <para> +Specifies the number of widgets in <emphasis remap='I'>list</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtSetWMColormapWindows</function> +returns immediately if <emphasis remap='I'>widget</emphasis> is not realized or if <emphasis remap='I'>count</emphasis> is 0. +Otherwise, +<function>XtSetWMColormapWindows</function> +constructs an ordered list of windows +by examining each widget in <emphasis remap='I'>list</emphasis> in turn and +ignoring the widget if it is not realized, or +adding the widget's window to the window list if the widget is realized +and if its colormap resource is different from the colormap +resources of all widgets whose windows are already on the window list. +</para> +<para> +<!-- .LP --> +Finally, +<function>XtSetWMColormapWindows</function> +stores the resulting window list in the \s-1WM_COLORMAP_WINDOWS\s+1 +property on the specified widget's window. +Refer to Section 4.1.8 in the <emphasis remap='I'>(xC</emphasis> for details of +the semantics of the \s-1WM_COLORMAP_WINDOWS\s+1 property. + +</para> +</sect2> +<sect2 id="Finding_File_Names"> +<title>Finding File Names</title> +<!-- .XS --> +<!-- <function>(SN Finding File Names</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI provide procedures to look for a file by name, allowing +string substitutions in a list of file specifications. Two +routines are provided for this: +<function>XtFindFile</function> +and +<function>XtResolvePathname .</function> +<function>XtFindFile</function> +uses an arbitrary set of client-specified substitutions, and +<function>XtResolvePathname</function> +uses a set of standard substitutions corresponding +to the <emphasis remap='I'>X/Open Portability Guide</emphasis> language localization conventions. +Most applications should use +<function>XtResolvePathname .</function> +</para> +<para> +<!-- .LP --> +A string substitution is defined by a list of +<function>Substitution</function> +<!-- .IN "Substitution" "" "@DEF@" --> +entries. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + char match; + String substitution; +} SubstitutionRec, *Substitution; +</literallayout> +<!-- .eM --> +</para> +<para> +<!-- .LP --> +File name evaluation is handled in an operating-system-dependent +fashion by an +<function>XtFilePredicate</function> +<!-- .IN "XtFilePredicate" "" "@DEF@" --> +procedure. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef Boolean (*XtFilePredicate)(String); +<!-- .br --> + String <emphasis remap='I'>filename</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>filename</emphasis> + </term> + <listitem> + <para> +Specifies a potential filename. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +A file predicate procedure is called with a string that is +potentially a file name. It should return +<function>True</function> +if this string specifies a file that is appropriate for the intended use and +<function>False</function> +otherwise. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To search for a file using substitutions in a path list, use +<function>XtFindFile .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtFindFile" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +String XtFindFile(<emphasis remap='I'>path</emphasis>, <emphasis remap='I'>substitutions</emphasis>, <emphasis remap='I'>num_substitutions</emphasis>, \ +<emphasis remap='I'>predicate</emphasis>) +<!-- .br --> + String <emphasis remap='I'>path</emphasis>; +<!-- .br --> + Substitution <emphasis remap='I'>substitutions</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_substitutions</emphasis>; +<!-- .br --> + XtFilePredicate <emphasis remap='I'>predicate</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>path</emphasis> + </term> + <listitem> + <para> +Specifies a path of file names, including substitution characters. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>substitutions</emphasis> + </term> + <listitem> + <para> +Specifies a list of substitutions to make into the path. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_substitutions</emphasis> + </term> + <listitem> + <para> +Specifies the number of substitutions passed in. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>predicate</emphasis> + </term> + <listitem> + <para> +Specifies a procedure called to judge each potential file name, or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The <emphasis remap='I'>path</emphasis> parameter specifies a string that consists of a series of +potential file names delimited by colons. Within each name, the +percent character specifies a string substitution selected by the +following character. The character sequence ``%:'' specifies an +embedded colon that is not a delimiter; the sequence is replaced by a +single colon. The character sequence ``%%'' specifies a percent +character that does not introduce a substitution; the sequence is +replaced by a single percent character. If a percent character is +followed by any other character, +<function>XtFindFile</function> +looks through the +specified <emphasis remap='I'>substitutions</emphasis> for that character in the <emphasis remap='I'>match</emphasis> field +and, if found, +replaces the percent and match characters with the string in the +corresponding <emphasis remap='I'>substitution</emphasis> field. A <emphasis remap='I'>substitution</emphasis> field entry of NULL +is equivalent to a pointer to an empty string. If the operating +system does not interpret multiple embedded name separators in the +path (i.e., ``/'' in POSIX) the same way as a single separator, +<function>XtFindFile</function> +will collapse multiple separators into a single one after performing +all string substitutions. Except for collapsing embedded separators, +the contents of the string substitutions are not interpreted by +<function>XtFindFile</function> +and may therefore contain any operating-system-dependent +characters, including additional name separators. Each resulting +string is passed to the predicate procedure until a string is found for +which the procedure returns +<function>True ;</function> +this string is the return value for +<function>XtFindFile .</function> +If no string yields a +<function>True</function> +return from the predicate, +<function>XtFindFile</function> +returns NULL. +</para> +<para> +<!-- .LP --> +If the <emphasis remap='I'>predicate</emphasis> parameter is NULL, an internal procedure that checks +if the file exists, is readable, and is not a directory is used. +</para> +<para> +<!-- .LP --> +It is the responsibility of the caller to free the returned string using +<function>XtFree</function> +when it is no longer needed. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To search for a file using standard substitutions in a path list, use +<function>XtResolvePathname .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtResolvePathname" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +String XtResolvePathname(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>filename</emphasis>, <emphasis remap='I'>suffix</emphasis>, \ +<emphasis remap='I'>path</emphasis>, <emphasis remap='I'>substitutions</emphasis>, <emphasis remap='I'>num_substitutions</emphasis>, <emphasis remap='I'>predicate</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .br --> + String <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>filename</emphasis>, <emphasis remap='I'>suffix</emphasis>, <emphasis remap='I'>path</emphasis>; +<!-- .br --> + Substitution <emphasis remap='I'>substitutions</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_substitutions</emphasis>; +<!-- .br --> + XtFilePredicate <emphasis remap='I'>predicate</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the display to use to find the language for language substitutions. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>filename</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>suffix</emphasis> + </term> + <listitem> + <para> +Specify values to substitute into the path. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>path</emphasis> + </term> + <listitem> + <para> +Specifies the list of file specifications, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>substitutions</emphasis> + </term> + <listitem> + <para> +Specifies a list of additional substitutions to make into the path, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_substitutions</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>substitutions</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>predicate</emphasis> + </term> + <listitem> + <para> +Specifies a procedure called to judge each potential file name, or NULL. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The substitutions specified by +<function>XtResolvePathname</function> +are determined from the value of the language string retrieved by +<function>XtDisplayInitialize</function> +for the specified display. +To set the +language for all applications specify ``*xnlLanguage: <emphasis remap='I'>lang</emphasis>'' in the +resource database. +<!-- .IN "xnlLanguage" --> +The format and content of the language string are +implementation-defined. One suggested syntax is to compose +the language string of three parts; a ``language part'', a +``territory part'' and a ``codeset part''. The manner in which +this composition is accomplished is implementation-defined, +and the (xI make no interpretation of the parts other +than to use them in substitutions as described below. +</para> +<para> +<!-- .LP --> +<function>XtResolvePathname</function> +calls +<function>XtFindFile</function> +with the following substitutions +in addition to any passed by the caller and returns the value returned by +<function>XtFindFile :</function> +</para> +<itemizedlist> + <listitem> + <para> +The value of the <emphasis remap='I'>filename</emphasis> parameter, or the application's +class name if <emphasis remap='I'>filename</emphasis> is NULL. + </para> + </listitem> + <listitem> + <para> +The value of the <emphasis remap='I'>type</emphasis> parameter. + </para> + </listitem> + <listitem> + <para> +The value of the <emphasis remap='I'>suffix</emphasis> parameter. + </para> + </listitem> + <listitem> + <para> +The language string associated with the specified display. + </para> + </listitem> + <listitem> + <para> +The language part of the display's language string. + </para> + </listitem> + <listitem> + <para> +The territory part of the display's language string. + </para> + </listitem> + <listitem> + <para> +The codeset part of the display's language string. + </para> + </listitem> + <listitem> + <para> +The customization string retrieved from the resource +database associated with <emphasis remap='I'>display</emphasis>. + </para> + </listitem> + <listitem> + <para> +The value of the implementation-specific default path. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +If a path is passed to +<function>XtResolvePathname ,</function> +it is passed along to +<function>XtFindFile .</function> +If the <emphasis remap='I'>path</emphasis> argument is NULL, the value of the +<function>\s-1XFILESEARCHPATH\s+1</function> +<!-- .IN "XFILESEARCHPATH" "" "@DEF@" --> +environment variable is passed to +<function>XtFindFile .</function> +If +<function>\s-1XFILESEARCHPATH\s+1</function> +is not defined, an implementation-specific default path is used +that contains at least six entries. These entries +must contain the following substitutions: + +<!-- .nf --> +<!-- .ta .3i 2i 2.5i --> +1. %C, %N, %S, %T, %L or %C, %N, %S, %T, %l, %t, %c +2. %C, %N, %S, %T, %l +3. %C, %N, %S, %T +4. %N, %S, %T, %L or %N, %S, %T, %l, %t, %c +5. %N, %S, %T, %l +6. %N, %S, %T +<!-- .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 +are implementation-dependent. +If the path begins +with a colon, it is preceded by %N%S. If the path includes two +adjacent colons, <function>%N%S</function> is inserted between them. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>type</emphasis> parameter is intended to be a category of files, usually +being translated into a directory in the pathname. Possible values +might include ``app-defaults'', ``help'', and ``bitmap''. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>suffix</emphasis> parameter is intended to be appended to the file name. +Possible values might include ``.txt'', ``.dat'', and ``.bm''. +</para> +<para> +<!-- .LP --> +A suggested value for the default path on POSIX-based systems is +</para> +<itemizedlist> + <listitem> + <para> +/usr/lib/X11/%L/%T/%N%C%S:/usr/lib/X11/%l/%T/%N%C%S:\\ +<!-- .br --> +/usr/lib/X11/%T/%N%C%S:/usr/lib/X11/%L/%T/%N%S:\\ +<!-- .br --> +/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S + + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Using this example, if the user has specified a language, it is +used as a subdirectory of /usr/lib/X11 that is searched for other +files. If the desired file is not found there, the lookup is +tried again using just the language part of the specification. If the +file is not there, it is looked for in /usr/lib/X11. The <emphasis remap='I'>type</emphasis> +parameter is used as a subdirectory of the language directory or of +/usr/lib/X11, and <emphasis remap='I'>suffix</emphasis> is appended to the file name. +</para> +<para> +<!-- .LP --> +The %D substitution allows the addition of path +elements to the implementation-specific default path, typically to +allow additional directories to be searched without preventing +resources in the system directories from being found. For example, a +user installing resource files under a directory called ``ourdir'' +might set +<function>\s-1XFILESEARCHPATH\s+1</function> +to +</para> +<itemizedlist> + <listitem> + <para> +%D:ourdir/%T/%N%C:ourdir/%T/%N + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The customization string is obtained by querying the resource database +currently associated with the display (the database returned by +<function>XrmGetDatabase )</function> +for the resource <emphasis remap='I'>application_name</emphasis>.customization, class +<emphasis remap='I'>application_class</emphasis>.Customization, where <emphasis remap='I'>application_name</emphasis> +and <emphasis remap='I'>application_class</emphasis> are the values returned by +<function>XtGetApplicationNameAndClass .</function> +If no value is specified in the database, the empty string is used. +</para> +<para> +<!-- .LP --> +It is the responsibility of the caller to free the returned string using +<function>XtFree</function> +when it is no longer needed. + +</para> +</sect2> +<sect2 id="Hooks_for_External_Agents"> +<title>Hooks for External Agents</title> +<!-- .XS --> +<!-- <function>(SN Hooks for External Agents</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Applications may register +functions that are called at a particular control points in the (xI. +These functions are intended to be used to provide notification +of an "(tk event", such as widget creation, to an external agent, +such as an interactive resource editor, drag-and-drop server, or +an aid for physically challenged users. +The control points containing such registration hooks are identified +in a "hook registration" object. +</para> +<para> +<!-- .LP --> +To retrieve the hook registration widget, use +<function>XtHooksOfDisplay .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtHooksOfDisplay" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtHooksOfDisplay(<emphasis remap='I'>display</emphasis>) +<!-- .br --> + Display *<emphasis remap='I'>display</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>display</emphasis> + </term> + <listitem> + <para> +Specifies the desired display. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The class of this object is a private, implementation-dependent +subclass of +<function>Object .</function> +The hook object has no parent. The resources of this object are +the callback lists for hooks and the read-only resources for getting +a list of parentless shells. All of the callback lists are initially +empty. When a display is closed, the hook object associated with it +is destroyed. +</para> +<para> +<!-- .LP --> +The following procedures can be called with the hook registration object +as an argument: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtAddCallback ,</function> +<function>XtAddCallbacks ,</function> +<function>XtRemoveCallback ,</function> +<function>XtRemoveCallbacks ,</function> +<function>XtRemoveAllCallbacks ,</function> +<function>XtCallCallbacks ,</function> +<function>XtHasCallbacks ,</function> +<function>XtCallCallbackList</function> + </para> + </listitem> + <listitem> + <para> +<function>XtClass ,</function> +<function>XtSuperclass ,</function> +<function>XtIsSubclass ,</function> +<function>XtCheckSubclass ,</function> +<function>XtIsObject ,</function> +<function>XtIsRectObj ,</function> +<function>XtIsWidget ,</function> +<function>XtIsComposite ,</function> +<function>XtIsConstraint ,</function> +<function>XtIsShell ,</function> +<function>XtIsOverrideShell ,</function> +<function>XtIsWMShell ,</function> +<function>XtIsVendorShell ,</function> +<function>XtIsTransientShell ,</function> +<function>XtIsToplevelShell ,</function> +<function>XtIsApplicationShell ,</function> +<function>XtIsSessionShell</function> + </para> + </listitem> + <listitem> + <para> +<function>XtWidgetToApplicationContext</function> + </para> + </listitem> + <listitem> + <para> +<function>XtName ,</function> +<function>XtParent ,</function> +<function>XtDisplayOfObject ,</function> +<function>XtScreenOfObject</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetValues ,</function> +<function>XtGetValues ,</function> +<function>XtVaSetValues ,</function> +<function>XtVaGetValues</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> + +</para> +<sect3 id="Hook_Object_Resources"> +<title>Hook Object Resources</title> +<!-- .XS --> +<!-- <function>(SN Hook Object Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The resource names, classes, and representation types that are specified +in the hook object resource list are: +<!-- .KS --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(1.5i) lw(2.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNcreateHook</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNchangeHook</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNconfigureHook</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNgeometryHook</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNdestroyHook</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>XtNshells</entry> + <entry>XtCReadOnly</entry> + <entry>XtRWidgetList</entry> + </row> + <row> + <entry>XtNnumShells</entry> + <entry>XtCReadOnly</entry> + <entry>XtRCardinal</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +Descriptions of each of these resources: +</para> +<para> +<!-- .LP --> +The XtNcreateHook callback list is called from: +<function>XtCreateWidget ,</function> +<function>XtCreateManagedWidget ,</function> +<function>XtCreatePopupShell ,</function> +<function>XtAppCreateShell ,</function> +and their corresponding varargs versions. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>call_data</emphasis> parameter in a createHook callback may be +cast to type +<function>XtCreateHookData .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtCreateHookData" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String type; + Widget widget; + ArgList args; + Cardinal num_args; +} XtCreateHookDataRec, *XtCreateHookData; +</literallayout> +<!-- .eM --> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>type</emphasis> is set to +<function>XtHcreate ,</function> +<emphasis remap='I'>widget</emphasis> is the newly created widget, and <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> +are the arguments passed to the create function. The callbacks are +called before returning from the create function. +</para> +<para> +<!-- .LP --> +The XtNchangeHook callback list is called from: +</para> +<itemizedlist> + <listitem> + <para> +<function>XtSetValues ,</function> +<function>XtVaSetValues</function> + </para> + </listitem> + <listitem> + <para> +<function>XtManageChild ,</function> +<function>XtManageChildren ,</function> +<function>XtUnmanageChild ,</function> +<function>XtUnmanageChildren</function> + </para> + </listitem> + <listitem> + <para> +<function>XtRealizeWidget ,</function> +<function>XtUnrealizeWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtAddCallback ,</function> +<function>XtRemoveCallback ,</function> +<function>XtAddCallbacks,</function> +<function>XtRemoveCallbacks ,</function> +<function>XtRemoveAllCallbacks</function> + </para> + </listitem> + <listitem> + <para> +<function>XtAugmentTranslations ,</function> +<function>XtOverrideTranslations ,</function> +<function>XtUninstallTranslations</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetKeyboardFocus ,</function> +<function>XtSetWMColormapWindows</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetMappedWhenManaged ,</function> +<function>XtMapWidget ,</function> +<function>XtUnmapWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtPopup ,</function> +<function>XtPopupSpringLoaded ,</function> +<function>XtPopdown</function> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>call_data</emphasis> parameter in a changeHook callback may +be cast to type +<function>XtChangeHookData .</function> +<!-- .IN "XtChangeHookData" "" "@DFEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i --> +<!-- .ta .5i 2.5i --> +typedef struct { + String type; + Widget widget; + XtPointer event_data; + Cardinal num_event_data; +} XtChangeHookDataRec, *XtChangeHookData; +</literallayout> +<!-- .eM --> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtSetValues</function> +or +<function>XtVaSetValues ,</function> +<emphasis remap='I'>type</emphasis> is set to +<function>XtHsetValues ,</function> +<emphasis remap='I'>widget</emphasis> is the new widget passed to the set_values procedure, and +<emphasis remap='I'>event_data</emphasis> may be cast to type +<function>XtChangeHookSetValuesData .</function> +<!-- .IN "XtChangeHookSetValuesData" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 2.5i --> +<!-- .ta .5i 2.5i --> +typedef struct { + Widget old, req; + ArgList args; + Cardinal num_args; +} XtChangeHookSetValuesDataRec, *XtChangeHookSetValuesData; +</literallayout> +<!-- .eM --> +<!-- .KE --> +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>old</emphasis>, <emphasis remap='I'>req</emphasis>, <emphasis remap='I'>args</emphasis>, and <emphasis remap='I'>num_args</emphasis> are the +parameters passed to the set_values procedure. The callbacks are called +after the set_values and constraint set_values procedures have been called. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtManageChild</function> +or +<function>XtManageChildren ,</function> +<emphasis remap='I'>type</emphasis> is set to +<function>XtHmanageChildren ,</function> +<emphasis remap='I'>widget</emphasis> is the parent, <emphasis remap='I'>event_data</emphasis> may be cast to type +WidgetList and is the list of children being managed, and +<emphasis remap='I'>num_event_data</emphasis> is the length of the widget list. +The callbacks are called after the children have been managed. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtUnmanageChild</function> +or +<function>XtUnmanageChildren ,</function> +<emphasis remap='I'>type</emphasis> is set to +<function>XtHunmanageChildren ,</function> +<emphasis remap='I'>widget</emphasis> is the parent, <emphasis remap='I'>event_data</emphasis> may be cast to type +WidgetList and is a list of the children being unmanaged, and +<emphasis remap='I'>num_event_data</emphasis> is the length of the widget list. +The callbacks are called after the children have been unmanaged. +</para> +<para> +<!-- .LP --> +The changeHook callbacks are called twice as a result of a call to +<function>XtChangeManagedSet ,</function> +once after unmanaging and again after managing. +When the callbacks are called the first time, <emphasis remap='I'>type</emphasis> is set to +<function>XtHunmanageSet ,</function> +<emphasis remap='I'>widget</emphasis> is the parent, <emphasis remap='I'>event_data</emphasis> may be cast to type +WidgetList and is a list of the children being unmanaged, and +<emphasis remap='I'>num_event_data</emphasis> is the length of the widget list. +When the callbacks are called the second time, the <emphasis remap='I'>type</emphasis> is set to +<function>XtHmanageSet ,</function> +<emphasis remap='I'>widget</emphasis> is the parent, <emphasis remap='I'>event_data</emphasis> may be cast to type +WidgetList and is a list of the children being managed, and +<emphasis remap='I'>num_event_data</emphasis> is the length of the widget list. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtRealizeWidget ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHrealizeWidget</function> +and <emphasis remap='I'>widget</emphasis> is the widget being realized. +The callbacks are called after the widget has been realized. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtUnrealizeWidget ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHunrealizeWidget ,</function> +and <emphasis remap='I'>widget</emphasis> is the widget being unrealized. +The callbacks are called after the widget has been unrealized. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtAddCallback ,</function> +<emphasis remap='I'>type</emphasis> is set to +<function>XtHaddCallback ,</function> +<emphasis remap='I'>widget</emphasis> is the widget to which the callback is being added, and +<emphasis remap='I'>event_data</emphasis> may be cast to type String and is the name of the +callback being added. +The callbacks are called after the callback has been added to the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtAddCallbacks ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHaddCallbacks ,</function> +<emphasis remap='I'>widget</emphasis> is the widget to which the callbacks are being added, and +<emphasis remap='I'>event_data</emphasis> may be cast to type String and is the name of the +callbacks being added. +The callbacks are called after the callbacks have been added to the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtRemoveCallback ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHremoveCallback ,</function> +<emphasis remap='I'>widget</emphasis> is the widget from which the callback is being removed, and +<emphasis remap='I'>event_data</emphasis> may be cast to type String and is the name of +the callback being removed. The callbacks are called after the callback +has been removed from the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtRemoveCallbacks ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHremoveCallbacks ,</function> +<emphasis remap='I'>widget</emphasis> is the widget from which the callbacks are being removed, and +<emphasis remap='I'>event_data</emphasis> may be cast to type String and is the name of the +callbacks being removed. The callbacks are called after the callbacks +have been removed from the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtRemoveAllCallbacks ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHremoveAllCallbacks</function> +and <emphasis remap='I'>widget</emphasis> is the widget from which the callbacks are being removed. +The callbacks are called after the callbacks have been removed from the +widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtAugmentTranslations ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHaugmentTranslations</function> +and <emphasis remap='I'>widget</emphasis> is the widget whose translations are being modified. +The callbacks are called after the widget's translations have been +modified. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtOverrideTranslations ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHoverrideTranslations</function> +and <emphasis remap='I'>widget</emphasis> is the widget whose translations are being modified. +The callbacks are called after the widget's translations have been +modified. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtUninstallTranslations ,</function> +The <emphasis remap='I'>type</emphasis> is +<function>XtHuninstallTranslations</function> +and <emphasis remap='I'>widget</emphasis> is the widget whose translations are being uninstalled. +The callbacks are called after the widget's translations have been +uninstalled. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtSetKeyboardFocus ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHsetKeyboardFocus</function> +and <emphasis remap='I'>event_data</emphasis> may be cast to type Widget and is the value of +the descendant argument passed to <function>XtSetKeyboardFocus</function>. The +callbacks are called before returning from <function>XtSetKeyboardFocus</function>. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtSetWMColormapWindows ,</function> +<emphasis remap='I'>type</emphasis> is set to +<function>XtHsetWMColormapWindows ,</function> +<emphasis remap='I'>event_data</emphasis> may be cast to type WidgetList and is the value of +the list argument passed to <function>XtSetWMColormapWindows</function>, and +<emphasis remap='I'>num_event_data</emphasis> is the length of the list. The callbacks are +called before returning from <function>XtSetWMColormapWindows</function>. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtSetMappedWhenManaged ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHsetMappedWhenManaged</function> +and <emphasis remap='I'>event_data</emphasis> may be cast to type Boolean and is the value of +the mapped_when_managed argument passed to <function>XtSetMappedWhenManaged</function>. +The callbacks are called after setting the widget's mapped_when_managed +field and before realizing or unrealizing the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtMapWidget ,</function> +the <emphasis remap='I'>type </emphasis> is set to +<function>XtHmapWidget</function> +and <emphasis remap='I'>widget</emphasis> is the widget being mapped. +The callbacks are called after mapping the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtUnmapWidget ,</function> +the <emphasis remap='I'>type </emphasis> is set to +<function>XtHunmapWidget</function> +and <emphasis remap='I'>widget</emphasis> is the widget being unmapped. +The callbacks are called after unmapping the widget. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtPopup ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHpopup ,</function> +<emphasis remap='I'>widget</emphasis> is the widget being popped up, and <emphasis remap='I'>event_data</emphasis> may +be cast to type XtGrabKind and is the value of the grab_kind argument +passed to <function>XtPopup</function>. +The callbacks are called before returning from <function>XtPopup</function>. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtPopupSpringLoaded ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHpopupSpringLoaded</function> +and <emphasis remap='I'>widget</emphasis> is the widget being popped up. +The callbacks are called +before returning from <function>XtPopupSpringLoaded</function>. +</para> +<para> +<!-- .LP --> +When the changeHook callbacks are called as a result of a call to +<function>XtPopdown ,</function> +the <emphasis remap='I'>type</emphasis> is set to +<function>XtHpopdown</function> +and <emphasis remap='I'>widget</emphasis> is the widget being popped down. +The callbacks are called +before returning from <function>XtPopdown</function>. +</para> +<para> +<!-- .LP --> +A widget set that exports interfaces that change application state +without employing the (xI library should invoke the change hook +itself. This is done by: +<!-- .sp --> +<literallayout class="monospaced"> +<!-- .TA .5i 2i --> +<!-- .ta .5i 2i --> + XtCallCallbacks(XtHooksOfDisplay(dpy), XtNchangeHook, call_data); +</literallayout> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The XtNconfigureHook callback list is called any time the (xI +move, resize, or configure a widget and when +<function>XtResizeWindow</function> +is called. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>call_data</emphasis> parameter may be cast to type +<function>XtConfigureHookData.</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConfigureHookData" "" "@DEF@" --> +<!-- .KS --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String type; + Widget widget; + XtGeometryMask changeMask; + XWindowChanges changes; +} XtConfigureHookDataRec, *XtConfigureHookData; +</literallayout> +<!-- .eM --> +<!-- .KE --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +When the configureHook callbacks are called, the <emphasis remap='I'>type</emphasis> is +<function>XtHconfigure ,</function> +<emphasis remap='I'>widget</emphasis> is the widget being configured, and <emphasis remap='I'>changeMask</emphasis> and +<emphasis remap='I'>changes</emphasis> reflect the changes made to the widget. The callbacks +are called after changes have been made to the widget. +</para> +<para> +<!-- .LP --> +The XtNgeometryHook callback list is called from +<function>XtMakeGeometryRequest</function> +and +<function>XtMakeResizeRequest</function> +once before and once after geometry negotiation occurs. +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>call_data</emphasis> parameter may be cast to type +<function>XtGeometryHookData .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGeometryHookData" "" "@DFEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String type; + Widget widget; + XtWidgetGeometry* request; + XtWidgetGeometry* reply; + XtGeometryResult result; +} XtGeometryHookDataRec, *XtGeometryHookData; +</literallayout> +<!-- .eM --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +When the geometryHook callbacks are called prior to geometry negotiation, +the <emphasis remap='I'>type</emphasis> is +<function>XtHpreGeometry ,</function> +<emphasis remap='I'>widget</emphasis> is the widget for which the request is being made, and +<emphasis remap='I'>request</emphasis> is the requested geometry. +When the geometryHook callbacks +are called after geometry negotiation, the <emphasis remap='I'>type</emphasis> is +<function>XtHpostGeometry ,</function> +<emphasis remap='I'>widget</emphasis> is the widget for which the request was made, <emphasis remap='I'>request</emphasis> +is the requested geometry, <emphasis remap='I'>reply</emphasis> is the resulting geometry granted, +and <emphasis remap='I'>result</emphasis> is the value returned from the geometry negotiation. +</para> +<para> +<!-- .LP --> +The XtNdestroyHook callback list is called when a widget is destroyed. +The <emphasis remap='I'>call_data parameter</emphasis> may be cast to type +<function>XtDestroyHookData .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDestroyHookData" "" "@DFEF@" --> +<!-- .sp --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + String type; + Widget widget; +} XtDestroyHookDataRec, *XtDestroyHookData; +</literallayout> +<!-- .eM --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +When the destroyHook callbacks are called as a result of a call to +<function>XtDestroyWidget ,</function> +the <emphasis remap='I'>type</emphasis> is +<function>XtHdestroy</function> +and <emphasis remap='I'>widget</emphasis> is the widget being destroyed. The callbacks are +called upon completion of phase one destroy for a widget. +</para> +<para> +<!-- .LP --> +The XtNshells and XtnumShells are read-only resources that report a +list of all parentless shell widgets associated with a display. +</para> +<para> +<!-- .LP --> +Clients who use these hooks must exercise caution in calling (xI +functions in order to avoid recursion. + +</para> +</sect3> +<sect3 id="Querying_Open_Displays"> +<title>Querying Open Displays</title> +<!-- .XS --> +<!-- <function>(SN Querying Open Displays</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +To retrieve a list of the Displays associated with an application context, +use +<function>XtGetDisplays .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetDisplays" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetDisplays(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>dpy_return</emphasis>, <emphasis remap='I'>num_dpy_return</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + Display ***<emphasis remap='I'>dpy_return</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_dpy_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>dpy_return</emphasis> + </term> + <listitem> + <para> +Returns a list of open Display connections in the specified application +context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_dpy_return</emphasis> + </term> + <listitem> + <para> +Returns the count of open Display connections in <emphasis remap='I'>dpy_return</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtGetDisplays</function> may be used by an external agent to query the +list of open displays that belong to an application context. To free +the list of displays, use +<function>XtFree .</function> +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect3> +</sect2> +</chapter> +</book> diff --git a/specs/CH12.xml b/specs/CH12.xml new file mode 100644 index 0000000..cc5b177 --- /dev/null +++ b/specs/CH12.xml @@ -0,0 +1,1491 @@ +<!-- .\" $Xorg: CH12,v 1.3 2000/08/17 19:42:47 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 12</function>\s-1 + +\s+1<function>Nonwidget Objects</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 12 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 12 \(em Nonwidget Objects --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +Although widget writers are free to treat +Core +as the base class of +the widget hierarchy, there are actually three classes above it. +These classes are +Object, +RectObj +(Rectangle Object), and (<emphasis remap='I'>unnamed</emphasis>), +and members of these classes +are referred to generically as <emphasis remap='I'>objects</emphasis>. By convention, the term +<emphasis remap='I'>widget</emphasis> refers only to objects that are a subclass of +Core, +and the term <emphasis remap='I'>nonwidget</emphasis> refers to objects that are not a subclass of +Core. +In the preceding portion of this specification, the interface +descriptions indicate explicitly whether the generic <emphasis remap='I'>widget</emphasis> argument +is restricted to particular subclasses of Object. Sections 12.2.5, +12.3.5, and 12.5 summarize the permissible classes of the arguments to, and +return values from, each of the (xI routines. + +</para> +<sect2 id="Data_Structures"> +<title>Data Structures</title> +<!-- .XS --> +<!-- (SN Data Structures --> +<!-- .XE --> +<para> +<!-- .LP --> +In order not to conflict with previous widget code, the data +structures used by nonwidget objects do not follow all the same +conventions as those for widgets. In particular, the class records +are not composed of parts but instead are complete data structures +with filler for the widget fields they do not use. This +allows the static class initializers for existing widgets to remain +unchanged. + +</para> +</sect2> +<sect2 id="Object_Objects"> +<title>Object Objects</title> +<!-- .XS --> +<!-- <function>(SN Object Objects</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +<!-- .IN "Object" "" "@DEF@" --> +The +Object +object contains the definitions of fields common to all +objects. It encapsulates the mechanisms for resource management. +All objects and widgets are members of subclasses of +Object, +which is defined by the +<function>ObjectClassPart</function> +and +<function>ObjectPart</function> +structures. + +</para> +<sect3 id="ObjectClassPart_Structure"> +<title>ObjectClassPart Structure</title> +<!-- .XS --> +<!-- (SN ObjectClassPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +The common fields for all object classes are defined in the +<function>ObjectClassPart</function> +structure. All fields have the same purpose, +function, and restrictions as the corresponding fields in +<function>CoreClassPart ;</function> +fields whose +names are obj<emphasis remap='I'>\s+1n\s-1</emphasis> for some integer \s+1<emphasis remap='I'>n</emphasis>\s-1 are not +used for Object, +but exist to pad the data structure so that it matches Core's class +record. The class record initialization must fill all +obj<emphasis remap='I'>\s+1n\s-1</emphasis> fields with NULL or zero as appropriate to the type. +</para> +<para> +<!-- .LP --> +<!-- .IN "ObjectClassPart" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _ObjectClassPart { + WidgetClass superclass; + String class_name; + Cardinal widget_size; + XtProc class_initialize; + XtWidgetClassProc class_part_initialize; + XtEnum class_inited; + XtInitProc initialize; + XtArgsProc initialize_hook; + XtProc obj1; + XtPointer obj2; + Cardinal obj3; + XtResourceList resources; + Cardinal num_resources; + XrmClass xrm_class; + Boolean obj4; + XtEnum obj5; + Boolean obj6; + Boolean obj7; + XtWidgetProc destroy; + XtProc obj8; + XtProc obj9; + XtSetValuesFunc set_values; + XtArgsFunc set_values_hook; + XtProc obj10; + XtArgsProc get_values_hook; + XtProc obj11; + XtVersionType version; + XtPointer callback_private; + String obj12; + XtProc obj13; + XtProc obj14; + XtPointer extension; +} ObjectClassPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The extension record defined for +<function>ObjectClassPart</function> +with a <emphasis remap='I'>record_type</emphasis> equal to +<function>\s-1NULLQUARK\s+1</function> +is +<function>ObjectClassExtensionRec .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "ObjectClassExtensionRec" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct { + XtPointer next_extension; See Section 1.6.12 + XrmQuark record_type; See Section 1.6.12 + long version; See Section 1.6.12 + Cardinal record_size; See Section 1.6.12 + XtAllocateProc allocate; See Section 2.5.5. + XtDeallocateProc deallocate; See Section 2.8.4. +} ObjectClassExtensionRec, *ObjectClassExtension; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The prototypical +<function>ObjectClass</function> +consists of just the +<function>ObjectClassPart .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "ObjectClassRec" "" "@DEF@" --> +<!-- .IN "ObjectClass" "" "@DEF@" --> +<!-- .IN "objectClass" "" "@DEF@" --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _ObjectClassRec { + ObjectClassPart object_class; +} ObjectClassRec, *ObjectClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The predefined class record and pointer for +<function>ObjectClassRec</function> +are +</para> +<para> +<!-- .LP --> +In +<function>IntrinsicP.h :</function> +<!-- .sM --> +<literallayout class="monospaced"> +extern ObjectClassRec objectClassRec; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +In +<function>Intrinsic.h :</function> +<!-- .sM --> +<literallayout class="monospaced"> +extern WidgetClass objectClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The opaque types +<function>Object</function> +and +<function>ObjectClass</function> +and the opaque variable +<function>objectClass</function> +are defined for generic actions on objects. +The symbolic constant for the +<function>ObjectClassExtension</function> +version identifier is +<function>XtObjectExtensionVersion</function> +(see Section 1.6.12). +<function>Intrinsic.h</function> +uses an incomplete structure definition to ensure that the +compiler catches attempts to access private data: +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef struct _ObjectClassRec* ObjectClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> + +</para> +</sect3> +<sect3 id="ObjectPart_Structure"> +<title>ObjectPart Structure</title> +<!-- .XS --> +<!-- (SN ObjectPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +The common fields for all object instances are defined in the +<function>ObjectPart</function> +structure. All fields have the same meaning as the +corresponding fields in +<function>CorePart .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +<!-- .IN "ObjectPart" "" "@DEF@" --> +typedef struct _ObjectPart { + Widget self; + WidgetClass widget_class; + Widget parent; + Boolean being_destroyed; + XtCallbackList destroy_callbacks; + XtPointer constraints; +} ObjectPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +All object instances have the +Object +fields as their first component. The prototypical type +<function>Object</function> +is defined with only this set of fields. +Various routines can cast object pointers, as needed, to specific +object types. +</para> +<para> +<!-- .LP --> +In +<function>IntrinsicP.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +typedef struct _ObjectRec { + ObjectPart object; +} ObjectRec, *Object; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .IN "ObjectRec" "" "@DEF@" --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef struct _ObjectRec *Object; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> + +</para> +</sect3> +<sect3 id="Object_Resources"> +<title>Object Resources</title> +<!-- .XS --> +<!-- <function>(SN Object Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The resource names, classes, and representation types specified in the +<function>objectClassRec</function> +resource list are: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(1.5i) lw(2.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNdestroyCallback</entry> + <entry>XtCCallback</entry> + <entry>XtRCallback</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +</sect3> +<sect3 id="ObjectPart_Default_Values"> +<title>ObjectPart Default Values</title> +<!-- .XS --> +<!-- <function>(SN ObjectPart Default Values</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +All fields in +<function>ObjectPart</function> +have the same default values as the corresponding fields in +<function>CorePart .</function> + +</para> +</sect3> +<sect3 id="Object_Arguments_to_xI_Routines"> +<title>Object Arguments to (xI Routines</title> +<!-- .XS --> +<!-- (SN Object Arguments to (xI Routines --> +<!-- .XE --> +<para> +<!-- .LP --> +The WidgetClass arguments to the following procedures may be +<function>objectClass</function> +or any subclass: +<!-- .sp --> +</para> +<!-- .IP --> +<function>XtInitializeWidgetClass ,</function> +<function>XtCreateWidget ,</function> +<function>XtVaCreateWidget</function> +<!-- .IP --> +<function>XtIsSubclass ,</function> +<function>XtCheckSubclass</function> +<!-- .IP --> +<function>XtGetResourceList ,</function> +<function>XtGetConstraintResourceList</function> +<!-- .sp --> +<para> +<!-- .LP --> +The Widget arguments to the following procedures may be of class +Object +or any subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreateWidget ,</function> +<function>XtVaCreateWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtAddCallback ,</function> +<function>XtAddCallbacks ,</function> +<function>XtRemoveCallback ,</function> +<function>XtRemoveCallbacks ,</function> +<function>XtRemoveAllCallbacks ,</function> +<function>XtCallCallbacks ,</function> +<function>XtHasCallbacks ,</function> +<function>XtCallCallbackList</function> + </para> + </listitem> + <listitem> + <para> +<function>XtClass ,</function> +<function>XtSuperclass ,</function> +<function>XtIsSubclass ,</function> +<function>XtCheckSubclass ,</function> +<function>XtIsObject ,</function> +<function>XtIsRectObj ,</function> +<function>XtIsWidget ,</function> +<function>XtIsComposite ,</function> +<function>XtIsConstraint ,</function> +<function>XtIsShell ,</function> +<function>XtIsOverrideShell ,</function> +<function>XtIsWMShell ,</function> +<function>XtIsVendorShell ,</function> +<function>XtIsTransientShell ,</function> +<function>XtIsToplevelShell ,</function> +<function>XtIsApplicationShell ,</function> +<function>XtIsSessionShell</function> + </para> + </listitem> + <listitem> + <para> +<function>XtIsManaged ,</function> +<function>XtIsSensitive</function> +<!-- .br --> +(both will return +<function>False</function> +if argument is not a subclass of +RectObj) + </para> + </listitem> + <listitem> + <para> +<function>XtIsRealized</function> +<!-- .br --> +(returns the state of the nearest windowed ancestor +if class of argument is not a subclass of +Core) + </para> + </listitem> + <listitem> + <para> +<function>XtWidgetToApplicationContext</function> + </para> + </listitem> + <listitem> + <para> +<function>XtDestroyWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtParent ,</function> +<function>XtDisplayOfObject ,</function> +<function>XtScreenOfObject ,</function> +<function>XtWindowOfObject</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetKeyboardFocus</function> +(descendant) + </para> + </listitem> + <listitem> + <para> +<function>XtGetGC ,</function> +<function>XtReleaseGC</function> + </para> + </listitem> + <listitem> + <para> +<function>XtName</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetValues ,</function> +<function>XtGetValues ,</function> +<function>XtVaSetValues ,</function> +<function>XtVaGetValues</function> + </para> + </listitem> + <listitem> + <para> +<function>XtGetSubresources ,</function> +<function>XtGetApplicationResources ,</function> +<function>XtVaGetSubresources ,</function> +<function>XtVaGetApplicationResources</function> + </para> + </listitem> + <listitem> + <para> +<function>XtConvert ,</function> +<function>XtConvertAndStore</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The return value of the following procedures will be of class +Object +or a subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreateWidget ,</function> +<function>XtVaCreateWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtParent</function> + </para> + </listitem> + <listitem> + <para> +<function>XtNameToWidget</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The return value of the following procedures will be +<function>objectClass</function> +or a subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtClass ,</function> +<function>XtSuperclass</function> + + </para> + </listitem> +</itemizedlist> +</sect3> +<sect3 id="Use_of_Objects"> +<title>Use of Objects</title> +<!-- .XS --> +<!-- <function>(SN Use of Objects</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The +Object +class exists to enable programmers to use the (xI' +classing and resource-handling mechanisms for things smaller +and simpler than widgets. +Objects make obsolete many common uses of subresources as described in +Sections 9.4, 9.7.2.4, and 9.7.2.5. +</para> +<para> +<!-- .LP --> +Composite +widget classes that wish to accept nonwidget children must +set the <emphasis remap='I'>accepts_objects</emphasis> field in the +<function>CompositeClassExtension</function> +structure to +<function>True .</function> +<function>XtCreateWidget</function> +will otherwise generate an error message on an attempt to create a +nonwidget child. +</para> +<para> +<!-- .LP --> +Of the classes defined by the (xI, +ApplicationShell +and +SessionShell +accept nonwidget children, and the class of any nonwidget child +must not be +<function>rectObjClass</function> +or any subclass. The intent of allowing +Object +children of +ApplicationShell +and +SessionShell +is to provide clients a simple mechanism +for establishing the resource-naming root of an object hierarchy. + +</para> +</sect3> +</sect2> +<sect2 id="Rectangle_Objects"> +<title>Rectangle Objects</title> +<!-- .XS --> +<!-- <function>(SN Rectangle Objects</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The class of rectangle objects is a subclass of +Object +that represents +rectangular areas. It encapsulates the mechanisms for geometry +management and is called RectObj +<!-- .IN "RectObj" "" "@DEF@" --> +to avoid conflict with the Xlib +<function>Rectangle</function> +data type. + +</para> +<sect3 id="RectObjClassPart_Structure"> +<title>RectObjClassPart Structure</title> +<!-- .XS --> +<!-- (SN RectObjClassPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +As with the +<function>ObjectClassPart</function> +structure, all fields in the +<function>RectObjClassPart</function> +structure have the same +purpose and function as the corresponding fields in +<function>CoreClassPart ;</function> +fields whose names are rect<emphasis remap='I'>\s+1n\s-1</emphasis> for some integer +<emphasis remap='I'>\s+1n\s-1</emphasis> are not used for +RectObj, but exist to pad the data structure so that it matches +Core's +class record. The class record initialization must fill all +rect<emphasis remap='I'>\s+1n\s-1</emphasis> fields with NULL or zero as appropriate to the type. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +<!-- .IN "RectObjClassPart" "" "@DEF@" --> +typedef struct _RectObjClassPart { + WidgetClass superclass; + String class_name; + Cardinal widget_size; + XtProc class_initialize; + XtWidgetClassProc class_part_initialize; + XtEnum class_inited; + XtInitProc initialize; + XtArgsProc initialize_hook; + XtProc rect1; + XtPointer rect2; + Cardinal rect3; + XtResourceList resources; + Cardinal num_resources; + XrmClass xrm_class; + Boolean rect4; + XtEnum rect5; + Boolean rect6; + Boolean rect7; + XtWidgetProc destroy; + XtWidgetProc resize; + XtExposeProc expose; + XtSetValuesFunc set_values; + XtArgsFunc set_values_hook; + XtAlmostProc set_values_almost; + XtArgsProc get_values_hook; + XtProc rect9; + XtVersionType version; + XtPointer callback_private; + String rect10; + XtGeometryHandler query_geometry; + XtProc rect11; + XtPointer extension ; +} RectObjClassPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The +RectObj +class record consists of just the +<function>RectObjClassPart .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +<!-- .IN "RectObjClassRec" "" "@DEF@" --> +<!-- .IN "RectObjClass" "" "@DEF@" --> +typedef struct _RectObjClassRec { + RectObjClassPart rect_class; +} RectObjClassRec, *RectObjClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The predefined class record and pointer for +<function>RectObjClassRec</function> +are +</para> +<para> +<!-- .LP --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +extern RectObjClassRec rectObjClassRec; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +extern WidgetClass rectObjClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +The opaque types +<function>RectObj</function> +and +<function>RectObjClass</function> +and the opaque variable +<function>rectObjClass</function> +are defined for generic actions on objects +whose class is RectObj or a subclass of +RectObj. +<function>Intrinsic.h</function> +uses an incomplete structure definition to ensure that the compiler +catches attempts to access private data: +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef struct _RectObjClassRec* RectObjClass; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> + +</para> +</sect3> +<sect3 id="RectObjPart_Structure"> +<title>RectObjPart Structure</title> +<!-- .XS --> +<!-- (SN RectObjPart Structure --> +<!-- .XE --> +<para> +<!-- .LP --> +In addition to the +<function>ObjectPart</function> +fields, +RectObj +objects have the following fields defined in the +<function>RectObjPart</function> +structure. All fields have the same meaning as the corresponding field in +<function>CorePart .</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +<!-- .IN "RectObjPart" "" "@DEF@" --> +typedef struct _RectObjPart { + Position x, y; + Dimension width, height; + Dimension border_width; + Boolean managed; + Boolean sensitive; + Boolean ancestor_sensitive; +} RectObjPart; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +RectObj +objects have the RectObj fields immediately following the Object fields. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +<!-- .IN "RectObjRec" "" "@DEF@" --> +typedef struct _RectObjRec { + ObjectPart object; + RectObjPart rectangle; +} RectObjRec, *RectObj; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> +In +<function>Intrinsic.h :</function> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +<literallayout class="monospaced"> +typedef struct _RectObjRec* RectObj; +</literallayout> +</para> +<para> +<!-- .LP --> +<!-- .eM --> + +</para> +</sect3> +<sect3 id="RectObj_Resources"> +<title>RectObj Resources</title> +<!-- .XS --> +<!-- <function>(SN RectObj Resources</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The resource names, classes, and representation types that are specified in the +<function>rectObjClassRec</function> +resource list are: +<informaltable> + <tgroup cols='4' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <colspec colname='c4'/> + <tbody> + <row> + <entry>lw(1.5i) lw(1.5i) lw(2.5i) .</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Class</entry> + <entry>Representation</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNancestorSensitive</entry> + <entry>XtCSensitive</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNborderWidth</entry> + <entry>XtCBorderWidth</entry> + <entry>XtRDimension</entry> + </row> + <row> + <entry>XtNheight</entry> + <entry>XtCHeight</entry> + <entry>XtRDimension</entry> + </row> + <row> + <entry>XtNsensitive</entry> + <entry>XtCSensitive</entry> + <entry>XtRBoolean</entry> + </row> + <row> + <entry>XtNwidth</entry> + <entry>XtCWidth</entry> + <entry>XtRDimension</entry> + </row> + <row> + <entry>XtNx</entry> + <entry>XtCPosition</entry> + <entry>XtRPosition</entry> + </row> + <row> + <entry>XtNy</entry> + <entry>XtCPosition</entry> + <entry>XtRPosition</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +</sect3> +<sect3 id="RectObjPart_Default_Values"> +<title>RectObjPart Default Values</title> +<!-- .XS --> +<!-- <function>(SN RectObjPart Default Values</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +All fields in +<function>RectObjPart</function> +have the same default values as the corresponding fields in +<function>CorePart .</function> + +</para> +</sect3> +<sect3 id="Widget_Arguments_to_xI_Routines"> +<title>Widget Arguments to (xI Routines</title> +<!-- .XS --> +<!-- <function>(SN Widget Arguments to (xI Routines</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +The WidgetClass arguments to the following procedures may be +<function>rectObjClass</function> +or any subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreateManagedWidget ,</function> +<function>XtVaCreateManagedWidget</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The Widget arguments to the following procedures may be of class +RectObj +or any subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtConfigureWidget ,</function> +<function>XtMoveWidget ,</function> +<function>XtResizeWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtMakeGeometryRequest ,</function> +<function>XtMakeResizeRequest</function> + </para> + </listitem> + <listitem> + <para> +<function>XtManageChildren ,</function> +<function>XtManageChild ,</function> +<function>XtUnmanageChildren ,</function> +<function>XtUnmanageChild ,</function> +<function>XtChangeManagedSet</function> + </para> + </listitem> + <listitem> + <para> +<function>XtQueryGeometry</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetSensitive</function> + </para> + </listitem> + <listitem> + <para> +<function>XtTranslateCoords</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The return value of the following procedures will be of class +RectObj +or a subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreateManagedWidget ,</function> +<function>XtVaCreateManagedWidget</function> + + </para> + </listitem> +</itemizedlist> +</sect3> +<sect3 id="Use_of_Rectangle_Objects"> +<title>Use of Rectangle Objects</title> +<!-- .XS --> +<!-- (SN Use of Rectangle Objects --> +<!-- .XE --> +<para> +<!-- .LP --> +RectObj +can be subclassed to provide widgetlike objects (sometimes +called gadgets) that do not use windows and do not have those +features that are seldom used in simple widgets. This can save memory +resources both in the server and in applications +but requires additional support code in the parent. +In the following +discussion, <emphasis remap='I'>rectobj</emphasis> refers only to objects +whose class is RectObj or a subclass of +RectObj, +but not Core or a subclass of +Core. +</para> +<para> +<!-- .LP --> +Composite +widget classes that wish to accept rectobj children must set +the <emphasis remap='I'>accepts_objects</emphasis> field in the +<function>CompositeClassExtension</function> +extension structure to +<function>True .</function> +<function>XtCreateWidget</function> +or +<function>XtCreateManagedWidget</function> +will otherwise generate an error if called to create a nonwidget child. +If the composite widget supports only children of class +RectObj +or a subclass (i.e., not of the general Object class), it +must declare an insert_child procedure and check the subclass of each +new child in that procedure. None of the classes defined by the +(xI accept rectobj children. +</para> +<para> +<!-- .LP --> +If gadgets are defined in an object set, the parent is responsible for +much more than the parent of a widget. The parent must request and handle +input events that occur for the gadget and is responsible for making +sure that when it receives an exposure event the gadget children get +drawn correctly. +Rectobj children may +have expose procedures +specified in their class records, but the parent is free to +ignore them, instead drawing the contents of the child itself. This +can potentially save graphics context switching. The precise contents +of the exposure event and region arguments to the RectObj expose +procedure are not specified by the (xI; a particular rectangle object is +free to define the coordinate system origin (self-relative or +parent-relative) and whether or not the rectangle or region is assumed to +have been intersected with the visible region of the object. +</para> +<para> +<!-- .LP --> +In general, it is expected that a composite widget that accepts +nonwidget children will document those children it is able to handle, +since a gadget cannot be viewed as a completely self-contained entity, +as can a widget. Since a particular composite widget class is usually +designed to handle nonwidget children of only a limited set of classes, it should +check the classes of newly added children in its insert_child +procedure to make sure that it can deal with them. +</para> +<para> +<!-- .LP --> +The (xI will clear areas of a parent window obscured by +rectobj children, causing exposure events, under the following +circumstances: +</para> +<itemizedlist> + <listitem> + <para> +A rectobj child is managed or unmanaged. + </para> + </listitem> + <listitem> + <para> +In a call to +<function>XtSetValues</function> +on a rectobj child, one or more of the set_values procedures returns +<function>True .</function> + </para> + </listitem> + <listitem> + <para> +In a call to +<function>XtConfigureWidget</function> +on a rectobj child, areas will +be cleared corresponding to both the old and the new child +geometries, including the border, if the geometry changes. + </para> + </listitem> + <listitem> + <para> +In a call to +<function>XtMoveWidget</function> +on a rectobj child, areas will be +cleared corresponding to both the old and the new child +geometries, including the border, if the geometry changes. + </para> + </listitem> + <listitem> + <para> +In a call to +<function>XtResizeWidget</function> +on a rectobj child, a single +rectangle will be cleared corresponding to the larger of the +old and the new child geometries if they are different. + </para> + </listitem> + <listitem> + <para> +In a call to +<function>XtMakeGeometryRequest</function> +(or +<function>XtMakeResizeRequest )</function> +on a rectobj child with +<function>XtQueryOnly</function> +not set, if the manager returns +<function>XtGeometryYes ,</function> +two rectangles will be cleared corresponding to both the old and +the new child geometries. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Stacking order is not supported for rectobj children. Composite widgets with +rectobj children are free to define any semantics desired if the child +geometries overlap, including making this an error. +</para> +<para> +<!-- .LP --> +When a rectobj is playing the role of a widget, developers must be +reminded to avoid making assumptions about the object passed in the +Widget argument to a callback procedure. + +</para> +</sect3> +</sect2> +<sect2 id="Undeclared_Class"> +<title>Undeclared Class</title> +<!-- .XS --> +<!-- (SN Undeclared Class --> +<!-- .XE --> +<para> +<!-- .LP --> +The (xI define an unnamed class between +RectObj +and +Core +for possible future use by the X Consortium. The only assumptions that +may be made about the unnamed class are +</para> +<itemizedlist> + <listitem> + <para> +The <emphasis remap='I'>core_class.superclass</emphasis> field of +<function>coreWidgetClassRec</function> +contains a pointer to the unnamed class record. + </para> + </listitem> + <listitem> + <para> +A pointer to the unnamed class record when dereferenced as an +<function>ObjectClass</function> +will contain a pointer to +<function>rectObjClassRec</function> +in its <emphasis remap='I'>object_class.superclass</emphasis> field. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Except for the above, the contents of the class record for this class +and the result of an attempt to subclass or to create a widget of this +unnamed class are undefined. + +</para> +</sect2> +<sect2 id="Widget_Arguments_to_xI_Routines"> +<title>Widget Arguments to (xI Routines</title> +<!-- .XS --> +<!-- (SN Widget Arguments to (xI Routines --> +<!-- .XE --> +<para> +<!-- .LP --> +The WidgetClass arguments to the following procedures must be of class +Shell +or a subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreatePopupShell ,</function> +<function>XtVaCreatePopupShell ,</function> +<function>XtAppCreateShell ,</function> +<function>XtVaAppCreateShell ,</function> +<function>XtOpenApplication ,</function> +<function>XtVaOpenApplication</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The Widget arguments to the following procedures must be of class +Core +or any subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreatePopupShell ,</function> +<function>XtVaCreatePopupShell</function> + </para> + </listitem> + <listitem> + <para> +<function>XtAddEventHandler ,</function> +<function>XtAddRawEventHandler ,</function> +<function>XtRemoveEventHandler ,</function> +<!-- .br --> +<function>XtRemoveRawEventHandler ,</function> +<function>XtInsertEventHandler ,</function> +<function>XtInsertRawEventHandler</function> +<!-- .br --> +<function>XtInsertEventTypeHandler ,</function> +<function>XtRemoveEventTypeHandler ,</function> + </para> + </listitem> + <listitem> + <para> +<function>XtRegisterDrawable</function> +<function>XtDispatchEventToWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtAddGrab ,</function> +<function>XtRemoveGrab ,</function> +<function>XtGrabKey ,</function> +<function>XtGrabKeyboard ,</function> +<function>XtUngrabKey ,</function> +<function>XtUngrabKeyboard ,</function> +<function>XtGrabButton ,</function> +<function>XtGrabPointer ,</function> +<function>XtUngrabButton ,</function> +<!-- .br --> +<function>XtUngrabPointer</function> + </para> + </listitem> + <listitem> + <para> +<function>XtBuildEventMask</function> + </para> + </listitem> + <listitem> + <para> +<function>XtCreateWindow ,</function> +<function>XtDisplay ,</function> +<function>XtScreen ,</function> +<function>XtWindow</function> + </para> + </listitem> + <listitem> + <para> +<function>XtNameToWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtGetSelectionValue ,</function> +<function>XtGetSelectionValues ,</function> +<function>XtOwnSelection ,</function> +<function>XtDisownSelection ,</function> +<function>XtOwnSelectionIncremental ,</function> +<function>XtGetSelectionValueIncremental ,</function> +<function>XtGetSelectionValuesIncremental ,</function> +<!-- .br --> +<function>XtGetSelectionRequest</function> + </para> + </listitem> + <listitem> + <para> +<function>XtInstallAccelerators ,</function> +<function>XtInstallAllAccelerators</function> +(both destination and source) + </para> + </listitem> + <listitem> + <para> +<function>XtAugmentTranslations ,</function> +<function>XtOverrideTranslations ,</function> +<function>XtUninstallTranslations ,</function> +<!-- .br --> +<function>XtCallActionProc</function> + </para> + </listitem> + <listitem> + <para> +<function>XtMapWidget ,</function> +<function>XtUnmapWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtRealizeWidget ,</function> +<function>XtUnrealizeWidget</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetMappedWhenManaged</function> + </para> + </listitem> + <listitem> + <para> +<function>XtCallAcceptFocus ,</function> +<function>XtSetKeyboardFocus</function> +(subtree) + </para> + </listitem> + <listitem> + <para> +<function>XtResizeWindow</function> + </para> + </listitem> + <listitem> + <para> +<function>XtSetWMColormapWindows</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The Widget arguments to the following procedures must be of class +Composite +or any subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtCreateManagedWidget ,</function> +<function>XtVaCreateManagedWidget</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The Widget arguments to the following procedures must be of a subclass of +Shell: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtPopdown ,</function> +<function>XtCallbackPopdown ,</function> +<function>XtPopup ,</function> +<function>XtCallbackNone ,</function> +<function>XtCallbackNonexclusive ,</function> +<function>XtCallbackExclusive ,</function> +<function>XtPopupSpringLoaded</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The return value of the following procedure will be of class +Core +or a subclass: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtWindowToWidget</function> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The return value of the following procedures will be of a subclass of +Shell: +<!-- .sp --> +</para> +<itemizedlist> + <listitem> + <para> +<function>XtAppCreateShell ,</function> +<function>XtVaAppCreateShell ,</function> +<function>XtAppInitialize ,</function> +<function>XtVaAppInitialize ,</function> +<function>XtCreatePopupShell ,</function> +<function>XtVaCreatePopupShell</function> +<!-- .bp --> + </para> + </listitem> +</itemizedlist> +</sect2> +</chapter> +</book> diff --git a/specs/CH13.xml b/specs/CH13.xml new file mode 100644 index 0000000..9796a1c --- /dev/null +++ b/specs/CH13.xml @@ -0,0 +1,987 @@ +<!-- .\" $Xorg: CH13,v 1.3 2000/08/17 19:42:47 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Chapter 13</function>\s-1 + +\s+1<function>Evolution of the (xI</function>\s-1 +<!-- .sp 2 --> +<!-- .nr H1 13 --> +<!-- .nr H2 0 --> +<!-- .nr H3 0 --> +<!-- .nr H4 0 --> +<!-- .nr H5 0 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- Chapter 13 \(em Evolution of the (xI --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +The interfaces described by this specification have undergone several +sets of revisions in the course of adoption as an X Consortium +standard specification. Having now been adopted by the Consortium as +a standard part of the X Window System, it is expected that this and +future revisions will retain +backward compatibility in the sense that fully conforming +implementations of these specifications may be produced that provide +source compatibility with widgets and applications written to +previous Consortium standard revisions. +</para> +<para> +<!-- .LP --> +The (xI do not place any special requirement on widget +programmers to retain source or binary compatibility for their widgets +as they evolve, but several conventions have been established to +assist those developers who want to provide such compatibility. +</para> +<para> +<!-- .LP --> +In particular, widget programmers may wish to conform to the convention +described in Section 1.6.12 when defining class extension records. + +</para> +<sect2 id="Determining_Specification_Revision_Level"> +<title>Determining Specification Revision Level</title> +<!-- .XS --> +<!-- <function>(SN Determining Specification Revision Level</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +Widget and application developers who wish to maintain a common source +pool that will build properly with implementations of the (xI +at different revision levels of these specifications but that take +advantage of newer features added in later revisions may use the +symbolic macro +<function>XtSpecificationRelease .</function> +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +#define XtSpecificationRelease 6 +</literallayout> +<!-- .IN "XtSpecificationRelease" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +As the symbol +<function>XtSpecificationRelease</function> +was new to Release 4, widgets and +applications desiring to build against earlier implementations should +test for the presence of this symbol and assume only Release 3 +interfaces if the definition is not present. + +</para> +</sect2> +<sect2 id="Release_to_Release_Compatibility"> +<title>Release 3 to Release 4 Compatibility</title> +<!-- .XS --> +<!-- <function>(SN Release 3 to Release 4 Compatibility</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +At the data structure level, Release 4 retains binary compatibility +with Release 3 (the first X Consortium standard release) for all data +structures except +<function>WMShellPart,</function> +<function>TopLevelShellPart ,</function> +and +<function>TransientShellPart .</function> +Release 4 changed the argument type to most procedures that now take +arguments of type +<function>XtPointer</function> +and structure members that are now of type +<function>XtPointer</function> +in order to avoid potential ANSI C conformance problems. It is +expected that most implementations will be binary compatible with the +previous definition. +</para> +<para> +<!-- .LP --> +Two fields in +<function>CoreClassPart</function> +were changed from +<function>Boolean</function> +to +<function>XtEnum</function> +to allow implementations additional freedom in specifying the +representations of each. This change should require no source +modification. + +</para> +<sect3 id="Additional_Arguments"> +<title>Additional Arguments</title> +<!-- .XS --> +<!-- (SN Additional Arguments --> +<!-- .XE --> +<para> +<!-- .LP --> +Arguments were added to the procedure definitions for +<function>XtInitProc ,</function> +<function>XtSetValuesFunc ,</function> +and +<function>XtEventHandler</function> +to provide more information and to +allow event handlers to abort further dispatching of the current event +(caution is advised!). The added arguments to +<function>XtInitProc</function> +and +<function>XtSetValuesFunc</function> +make the initialize_hook and set_values_hook methods +obsolete, but the hooks have been retained for those widgets that used +them in Release 3. + +</para> +</sect3> +<sect3 id="set_values_almost_Procedures"> +<title>set_values_almost Procedures</title> +<!-- .XS --> +<!-- (SN set_values_almost Procedures --> +<!-- .XE --> +<para> +<!-- .LP --> +The use of the arguments by a set_values_almost procedure was poorly +described in Release 3 and was inconsistent with other conventions. +</para> +<para> +<!-- .LP --> +The current specification for the manner in which a set_values_almost +procedure returns information to the (xI is not compatible with +the Release 3 specification, and all widget implementations should +verify that any set_values_almost procedures conform to the current +interface. +</para> +<para> +<!-- .LP --> +No known implementation of the (xI correctly implemented the +Release 3 interface, so it is expected that the impact of this +specification change is small. + +</para> +</sect3> +<sect3 id="Query_Geometry"> +<title>Query Geometry</title> +<!-- .XS --> +<!-- (SN Query Geometry --> +<!-- .XE --> +<para> +<!-- .LP --> +A composite widget layout routine that calls +<function>XtQueryGeometry</function> +is now expected to store the complete new geometry in the intended structure; +previously the specification said ``store the changes it intends to +make''. Only by storing the complete geometry does the child have +any way to know what other parts of the geometry may still be +flexible. Existing widgets should not be affected by this, except +to take advantage of the new information. + +</para> +</sect3> +<sect3 id="unrealizeCallback_Callback_List"> +<title>unrealizeCallback Callback List</title> +<!-- .XS --> +<!-- (SN unrealizeCallback Callback List --> +<!-- .XE --> +<para> +<!-- .LP --> +In order to provide a mechanism for widgets to be notified when they +become unrealized through a call to +<function>XtUnrealizeWidget ,</function> +the callback +list name ``unrealizeCallback'' has been defined by the (xI. A +widget class that requires notification on unrealize may declare a +callback list resource by this name. No class is required to declare +this resource, but any class that did so in a prior revision may find +it necessary to modify the resource name if it does not wish to use the new +semantics. + +</para> +</sect3> +<sect3 id="Subclasses_of_WMShell"> +<title>Subclasses of WMShell</title> +<!-- .XS --> +<!-- (SN Subclasses of WMShell --> +<!-- .XE --> +<para> +<!-- .LP --> +The formal adoption of the <emphasis remap='I'>(xC</emphasis> as +an X Consortium standard has meant the addition of four fields to +<function>WMShellPart</function> +and one field to +<function>TopLevelShellPart .</function> +In deference to some +widget libraries that had developed their own additional conventions +to provide binary compatibility, these five new fields were added at +the end of the respective data structures. +</para> +<para> +<!-- .LP --> +To provide more convenience for TransientShells, a field was added +to the previously empty +<function>TransientShellPart .</function> +On some architectures the size of the part structure will not +have changed as a result of this. +</para> +<para> +<!-- .LP --> +Any widget implementation whose class is a subclass of +TopLevelShell +or +TransientShell +must at minimum be +recompiled with the new data structure declarations. Because +<function>WMShellPart</function> +no longer contains a contiguous +<function>XSizeHints</function> +data structure, +a subclass that expected to do a single structure assignment of an +<function>XSizeHints</function> +structure to the <emphasis remap='I'>size_hints</emphasis> field of +<function>WMShellPart</function> +must be revised, though the old fields remain at the same positions within +<function>WMShellPart .</function> + +</para> +</sect3> +<sect3 id="Resource_Type_Converters"> +<title>Resource Type Converters</title> +<!-- .XS --> +<!-- (SN Resource Type Converters --> +<!-- .XE --> +<para> +<!-- .LP --> +A new interface declaration for resource type converters was defined +to provide more information to converters, to support conversion +cache cleanup with resource reference counting, and to allow +additional procedures to be declared to free resources. The old +interfaces remain (in the compatibility section), and a new set of +procedures was defined that work only with the new type converter +interface. +</para> +<para> +<!-- .LP --> +In the now obsolete old type converter interface, converters are +reminded that they must return the size of the converted value as well +as its address. The example indicated this, but the description of +<function>XtConverter</function> +was incomplete. + +</para> +</sect3> +<sect3 id="KeySym_Case_Conversion_Procedure"> +<title>KeySym Case Conversion Procedure</title> +<!-- .XS --> +<!-- (SN KeySym Case Conversion Procedure --> +<!-- .XE --> +<para> +<!-- .LP --> +The specification for the +<function>XtCaseProc</function> +function type has been changed +to match the Release 3 implementation, which included necessary +additional information required by the function (a pointer to the +display connection), and corrects the argument type of the source +KeySym parameter. No known implementation of the (xI +implemented the previously documented interface. + +</para> +</sect3> +<sect3 id="Nonwidget_Objects"> +<title>Nonwidget Objects</title> +<!-- .XS --> +<!-- (SN Nonwidget Objects --> +<!-- .XE --> +<para> +<!-- .LP --> +Formal support for nonwidget objects is new to Release 4. A +prototype implementation was latent in at least one Release 3 +implementation of the (xI, but the specification has changed +somewhat. The most significant change is the requirement for a +composite widget to declare the +<function>CompositeClassExtension</function> +record with the <emphasis remap='I'>accepts_objects</emphasis> field set to +<function>True</function> +in order to permit a client to create a nonwidget child. +</para> +<para> +<!-- .LP --> +The addition of this extension field ensures that composite widgets +written under Release 3 will not encounter unexpected errors if an +application attempts to create a nonwidget child. In Release 4 there +is no requirement that all composite widgets implement the extra +functionality required to manage windowless children, so the +<emphasis remap='I'>accepts_objects</emphasis> field allows a composite widget to declare that it +is not prepared to do so. + +</para> +</sect3> +</sect2> +<sect2 id="Release_to_Release_Compatibility"> +<title>Release 4 to Release 5 Compatibility</title> +<!-- .XS --> +<!-- <function>(SN Release 4 to Release 5 Compatibility</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +At the data structure level, Release 5 retains complete binary +compatibility with Release 4. The specification of the +<function>ObjectPart ,</function> +<function>RectObjPart ,</function> +<function>CorePart ,</function> +<function>CompositePart ,</function> +<function>ShellPart ,</function> +<function>WMShellPart ,</function> +<function>TopLevelShellPart ,</function> +and +<function>ApplicationShellPart</function> +instance records was made less strict to permit implementations to +add internal fields to these structures. Any implementation that +chooses to do so would, of course, force a recompilation. +The Xlib specification for +<function>XrmValue</function> +and +<function>XrmOptionDescRec</function> +was updated to use a new type, +<function>XPointer ,</function> +for the <emphasis remap='I'>addr</emphasis> and <emphasis remap='I'>value</emphasis> fields, respectively, to avoid +ANSI C conformance problems. The definition of +<function>XPointer</function> +is binary compatible with the previous implementation. + +</para> +<sect3 id="baseTranslations_Resource"> +<title>baseTranslations Resource</title> +<!-- .XS --> +<!-- <function>(SN baseTranslations Resource</function> --> +<!-- .XE --> + +<para> +<!-- .LP --> +A new pseudo-resource, XtNbaseTranslations, was defined to permit +application developers to specify translation tables in application +defaults files while still giving end users the ability to augment +or override individual event sequences. This change will affect +only those applications that wish to take advantage of the new +functionality or those widgets that may have previously defined +a resource named ``baseTranslations''. +</para> +<para> +<!-- .LP --> +Applications wishing to take advantage of the new functionality +would change their application defaults file, e.g., from +<literallayout class="monospaced"> + app.widget.translations: <emphasis remap='I'>value</emphasis> +</literallayout> +to +<literallayout class="monospaced"> + app.widget.baseTranslations: <emphasis remap='I'>value</emphasis> +</literallayout> +If it is important to the application to preserve complete +compatibility of the defaults file between different versions +of the application running under Release 4 and Release 5, +the full translations can be replicated in both the ``translations'' +and the ``baseTranslations'' resource. + +</para> +</sect3> +<sect3 id="Resource_File_Search_Path"> +<title>Resource File Search Path</title> +<!-- .XS --> +<!-- <function>(SN Resource File Search Path</function> --> +<!-- .XE --> + +<para> +<!-- .LP --> +The current specification allows implementations greater flexibility +in defining the directory structure used to hold the application class +and per-user application defaults files. Previous specifications +required the substitution strings to appear in the default path in a +certain order, preventing sites from collecting all the files for +a specific application together in one directory. The Release 5 +specification allows the default path to specify the substitution +strings in any order within a single path entry. Users will need to +pay close attention to the documentation for the specific +implementation to know where to find these files and how to specify +their own +<function>\s-1XFILESEARCHPATH\s+1</function> +and +<function>\s-1XUSERFILESEARCHPATH\s+1</function> +values when overriding the system defaults. + +</para> +</sect3> +<sect3 id="Customization_Resource"> +<title>Customization Resource</title> +<!-- .XS --> +<!-- <function>(SN Customization Resource</function> --> +<!-- .XE --> + +<para> +<!-- .LP --> +<function>XtResolvePathname</function> +supports a new substitution string, %C, for specifying separate +application class resource files according to arbitrary user-specified +categories. The primary motivation for this addition was separate +monochrome and color application class defaults files. The +substitution value is obtained by querying the current resource +database for the application resource name ``customization'', class +``Customization''. Any application that previously used this +resource name and class will need to be aware of the possibly +conflicting semantics. + +</para> +</sect3> +<sect3 id="Per_Screen_Resource_Database"> +<title>Per-Screen Resource Database</title> +<!-- .XS --> +<!-- <function>(SN Per-Screen Resource Database</function> --> +<!-- .XE --> + +<para> +<!-- .LP --> +To allow a user to specify separate preferences for each screen of a +display, a per-screen resource specification string has been added and +multiple resource databases are created; one for each screen. This +will affect any application that modified the (formerly unique) +resource database associated with the display subsequent to the (xI +database initialization. Such applications will need to be aware +of the particular screen on which each shell widget is to be created. +</para> +<para> +<!-- .LP --> +Although the wording of the specification changed substantially in the +description of the process by which the resource database(s) is +initialized, the net effect is the same as in prior releases with the +exception of the added per-screen resource specification and the new +customization substitution string in +<function>XtResolvePathname .</function> + +</para> +</sect3> +<sect3 id="Internationalization_of_Applications"> +<title>Internationalization of Applications</title> +<!-- .XS --> +<!-- <function>(SN Internationalization of Applications</function> --> +<!-- .XE --> + +<para> +<!-- .LP --> +Internationalization as defined by ANSI is a technology that +allows support of an application in a single locale. In +adding support for internationalization to the (xI +the restrictions of this model have been followed. +In particular, the new (xI interfaces are designed not to +preclude an application from using other alternatives. +For this reason, no (xI routine makes a call to establish the +locale. However, a convenience routine to establish the +locale at initialize time has been provided, in the form +of a default procedure that must be explicitly installed +if the application desires ANSI C locale behavior. +</para> +<para> +<!-- .LP --> +As many objects in X, particularly resource databases, now inherit +the global locale when they are created, applications wishing to use +the ANSI C locale model should use the new function +<function>XtSetLanguageProc</function> +to do so. +</para> +<para> +<!-- .LP --> +The internationalization additions also define event filters +as a part of the Xlib Input Method specifications. The +(xI enable the use of event filters through additions to +<function>XtDispatchEvent .</function> +Applications that may not be dispatching all events through +<function>XtDispatchEvent</function> +should be reviewed in the context of this new input method mechanism. +</para> +<para> +<!-- .LP --> +In order to permit internationalization of error messages, the name +and path of the error database file are now allowed to be +implementation-dependent. +No adequate standard mechanism has yet been suggested to +allow the (xI to locate the database from localization information +supplied by the client. +</para> +<para> +<!-- .LP --> +The previous specification for the syntax of the language string +specified by +<function>xnlLanguage</function> +has been dropped to avoid potential conflicts with other standards. +The language string syntax is now implementation-defined. +The example syntax cited is consistent with the previous +specification. + +</para> +</sect3> +<sect3 id="Permanently_Allocated_Strings"> +<title>Permanently Allocated Strings</title> +<!-- .XS --> +<!-- (SN Permanently Allocated Strings --> +<!-- .XE --> + +<para> +<!-- .LP --> +In order to permit additional memory savings, an Xlib interface was +added to allow the resource manager to avoid copying certain string +constants. The (xI specification was updated to explicitly require +the Object <emphasis remap='I'>class_name</emphasis>, <emphasis remap='I'>resource_name</emphasis>, <emphasis remap='I'>resource_class</emphasis>, +<emphasis remap='I'>resource_type</emphasis>, <emphasis remap='I'>default_type</emphasis> in resource tables, Core <emphasis remap='I'>actions</emphasis> +<emphasis remap='I'>string</emphasis> field, and Constraint <emphasis remap='I'>resource_name</emphasis>, <emphasis remap='I'>resource_class</emphasis>, +<emphasis remap='I'>resource_type</emphasis>, and <emphasis remap='I'>default_type</emphasis> resource fields to be +permanently allocated. This explicit requirement is expected to +affect only applications that may create and destroy classes +on the fly. + +</para> +</sect3> +<sect3 id="Arguments_to_Existing_Functions"> +<title>Arguments to Existing Functions</title> +<!-- .XS --> +<!-- <function>(SN Arguments to Existing Functions</function> --> +<!-- .XE --> + +<para> +<!-- .LP --> +The <emphasis remap='I'>args</emphasis> argument to +<function>XtAppInitialize ,</function> +<function>XtVaAppInitialize ,</function> +<function>XtOpenDisplay ,</function> +<function>XtDisplayInitialize ,</function> +and +<function>XtInitialize</function> +were changed from +<function>Cardinal *</function> +to int* to conform to pre-existing convention and avoid otherwise +annoying typecasting in ANSI C environments. + +</para> +</sect3> +</sect2> +<sect2 id="Release_to_Release_Compatibility"> +<title>Release 5 to Release 6 Compatibility</title> +<!-- .XS --> +<!-- <function>(SN Release 5 to Release 6 Compatibility</function> --> +<!-- .XE --> +<para> +<!-- .LP --> +At the data structure level, Release 6 retains binary compatibility +with Release 5 for all data structures except +<function>WMShellPart .</function> +Three resources were added to the specification. +The known implementations had unused space in the data structure, +therefore on some architectures and implementations, +the size of the part structure will not have changed as a result of this. + +</para> +<sect3 id="Widget_Internals"> +<title>Widget Internals</title> +<!-- .XS --> +<!-- (SN Widget Internals --> +<!-- .XE --> +<para> +<!-- .LP --> +Two new widget methods for instance allocation and deallocation were added +to the Object class. These new methods +allow widgets to be treated as C++ objects in the C++ environment +when an appropriate allocation method is specified or inherited +by the widget class. +</para> +<para> +<!-- .LP --> +The textual descriptions of the processes of widget creation and +widget destruction have been edited to provide clarification to widget +writers. Widgets writers may have reason to rely on the specific order of +the stages of widget creation and destruction; with that motivation, +the specification now more exactly describes the process. +</para> +<para> +<!-- .LP --> +As a convenience, an interface to locate a widget class extension +record on a linked list, +<function>XtGetClassExtension ,</function> +has been added. +</para> +<para> +<!-- .LP --> +A new option to allow bundled changes to the managed set of a Composite +widget is introduced in the Composite class extension record. +Widgets that define a change_managed procedure that can accommodate +additions and deletions to the managed set of children in a single +invocation should set allows_change_managed_set to <function>True</function> in the +extension record. +</para> +<para> +<!-- .LP --> +The wording of the process followed by +<function>XtUnmanageChildren</function> +has changed slightly to better handle changes to the managed set +during phase 2 destroy processing. +</para> +<para> +<!-- .LP --> +A new exposure event compression flag, +<function>XtExposeNoRegion ,</function> +was added. Many widgets specify exposure compression, but either +ignore the actual damage region passed to the core expose procedure or +use only the cumulative bounding box data available in the event. +Widgets with expose procedures that do not make use of exact +exposure region information can indicate that the (xI need not +compute the region. + +</para> +</sect3> +<sect3 id="General_Application_Development"> +<title>General Application Development</title> +<!-- .XS --> +<!-- (SN General Application Development --> +<!-- .XE --> +<para> +<!-- .LP --> +<function>XtOpenApplication</function> +is a new convenience procedure to initialize the toolkit, create an +application context, open an X display connection, and create the +root of the widget instance tree. It is identical to the interface +it replaces, +<function>XtAppInitialize ,</function> +in all respects except that it takes an additional argument specifying +the widget class of the root shell to create. +This interface is now the recommended one so that clients may easily +become session participants. +The old convenience procedures appear in the compatibility section. +</para> +<para> +<!-- .LP --> +The toolkit initialization function +<function>XtToolkitInitialize</function> +may be called multiple times without penalty. +</para> +<para> +<!-- .LP --> +In order to optimize changes in geometry to a set of geometry-managed +children, a new interface, +<function>XtChangeManagedSet ,</function> +has been added. + +</para> +</sect3> +<sect3 id="Communication_with_Window_and_Session_Managers"> +<title>Communication with Window and Session Managers</title> +<!-- .XS --> +<!-- (SN Communication with Window and Session Managers --> +<!-- .XE --> +<para> +<!-- .LP --> +The revision of the <emphasis remap='I'>(xC</emphasis> as an X Consortium standard has resulted +in the addition of three fields to the specification of +<function>WMShellPart .</function> +These are <emphasis remap='I'>urgency</emphasis>, <emphasis remap='I'>client_leader</emphasis>, and <emphasis remap='I'>window_role</emphasis>. +</para> +<para> +<!-- .LP --> +The adoption of the <emphasis remap='I'>X Session Management Protocol</emphasis> as an X Consortium +standard has resulted in the addition of a new shell widget, +<function>SessionShell ,</function> +and an accompanying subclass verification interface, +<function>XtIsSessionShell .</function> +This widget provides support for communication between an application +and a session manager, as well as a window manager. +In order to preserve compatibility with existing subclasses of +<function>ApplicationShell ,</function> +the +<function>ApplicationShell</function> +was subclassed to create the new widget class. +The session protocol requires a modal response to certain checkpointing +operations by participating applications. The +<function>SessionShell</function> +structures +the application's notification of and responses to messages from the session +manager by use of various callback lists and by use of the new interfaces +<function>XtSessionGetToken</function> +and +<function>XtSessionReturnToken .</function> +There is also a new command line argument, -xtsessionID, which facilitates +the session manager in restarting applications based on the (xI. +</para> +<para> +<!-- .LP --> +The resource name and class strings defined by the (xI shell +widgets in +<function>< X11/Shell.h ></function> +are now listed in Appendix E. The addition of a new symbol +for the +<function>WMShell</function> +<emphasis remap='I'>wait_for_wm</emphasis> resource was made to bring the external symbol +and the string it represents into agreement. The actual resource name +string in +<function>WMShell</function> +has not changed. +The resource representation type of the XtNwinGravity resource of the +<function>WMShell</function> +was changed to XtRGravity in order to register a type +converter so that window gravity resource values could be specified by name. + +</para> +</sect3> +<sect3 id="Geometry_Management"> +<title>Geometry Management</title> +<!-- .XS --> +<!-- (SN Geometry Management --> +<!-- .XE --> +<para> +<!-- .LP --> +A clarification to the specification was made to indicate that geometry +requests may include current values along with the requested changes. + +</para> +</sect3> +<sect3 id="Event_Management"> +<title>Event Management</title> +<!-- .XS --> +<!-- (SN Event Management --> +<!-- .XE --> +<para> +<!-- .LP --> +In Release 6, support is provided for registering selectors +and event handlers for events generated by X protocol extensions +and for dispatching those events to the appropriate widget. +The new event handler registration interfaces are +<function>XtInsertEventTypeHandler</function> +and +<function>XtRemoveEventTypeHandler .</function> +Since the mechanism to indicate selection of extension events is specific +to the extension being used, the (xI introduces +<function>XtRegisterExtensionSelector ,</function> +which allows the application to select for the events of interest. +In order to change the dispatching algorithm to accommodate extension events +as well as core X protocol events, +the (xI event dispatcher may now be replaced or enveloped +by the application with +<function>XtSetEventDispatcher .</function> +The dispatcher may wish to call +<function>XtGetKeyboardFocusWidget</function> +to determine the widget with the current (xI keyboard focus. +A dispatcher, after determining the destination widget, may use +<function>XtDispatchEventToWidget</function> +to cause the event to be dispatched to the event handlers registered +by a specific widget. +</para> +<para> +<!-- .LP --> +To permit the dispatching of events +for nonwidget drawables, such as pixmaps that are not associated +with a widget's window, +<function>XtRegisterDrawable</function> +and +<function>XtUnregisterDrawable</function> +have been added to the library. A related update was made to +the description of +<function>XtWindowToWidget .</function> +</para> +<para> +<!-- .LP --> +The library is now thread-safe, allowing one thread at a time to +enter the library and protecting global data as necessary from concurrent use. +Threaded toolkit applications are supported by the +new interfaces +<function>XtToolkitThreadInitialize ,</function> +<function>XtAppLock ,</function> +<function>XtAppUnlock ,</function> +<function>XtAppSetExitFlag ,</function> +and +<function>XtAppGetExitFlag .</function> +Widget writers may also use +<function>XtProcessLock</function> +and +<function>XtProcessUnlock .</function> +</para> +<para> +<!-- .LP --> +Safe handling of POSIX signals and other asynchronous notifications +is now provided by use of +<function>XtAppAddSignal ,</function> +<function>XtNoticeSignal ,</function> +and +<function>XtRemoveSignal .</function> +</para> +<para> +<!-- .LP --> +The application can receive notification of an impending block +in the (xI event manager by registering interest through +<function>XtAppAddBlockHook</function> +and +<function>XtRemoveBlockHook .</function> +</para> +<para> +<!-- .LP --> +<function>XtLastEventProcessed</function> +returns the most recent event passed to +<function>XtDispatchEvent</function> +for a specified display. + +</para> +</sect3> +<sect3 id="Resource_Management"> +<title>Resource Management</title> +<!-- .XS --> +<!-- (SN Resource Management --> +<!-- .XE --> +<para> +<!-- .LP --> +Resource converters are registered by the (xI for window gravity +and for three new resource types associated with session participation: +RestartStyle, CommandArgArray and DirectoryString. +</para> +<para> +<!-- .LP --> +The file search path syntax has been extended to make it easier to +include the default search path, which controls resource +database construction, by using the new substitution string, %D. + +</para> +</sect3> +<sect3 id="Translation_Management"> +<title>Translation Management</title> +<!-- .XS --> +<!-- (SN Translation Management --> +<!-- .XE --> +<para> +<!-- .LP --> +The default key translator now recognizes the NumLock modifier. +If NumLock is on and the second keysym is a keypad keysym +(a standard keysym named with a ``KP'' prefix or a +vendor-specific keysym in the hexadecimal range 0x11000000 to 0x1100FFFF), +then the default key translator will +use the first keysym if Shift and/or ShiftLock is on and will +use the second keysym if neither is on. Otherwise, it will +ignore NumLock and apply the normal protocol semantics. + +</para> +</sect3> +<sect3 id="Selections"> +<title>Selections</title> +<!-- .XS --> +<!-- (SN Selections --> +<!-- .XE --> +<para> +<!-- .LP --> +The targets of selection requests may be parameterized, as described +by the revised <emphasis remap='I'>(xC</emphasis>. +When such requests are made, +<function>XtSetSelectionParameters</function> +is used by the requestor to specify the target parameters and +<function>XtGetSelectionParameters</function> +is used by the selection owner to retrieve the parameters. +When a parameterized target is specified in the context of a bundled +request for multiple targets, +<function>XtCreateSelectionRequest ,</function> +<function>XtCancelSelectionRequest ,</function> +and +<function>XtSendSelectionRequest</function> +are used to envelop the assembly of the request. +When the parameters themselves are the names of properties, +the (xI provides support for the economical use of property atom names; +see +<function>XtReservePropertyAtom</function> +and +<function>XtReleasePropertyAtom .</function> + +</para> +</sect3> +<sect3 id="External_Agent_Hooks"> +<title>External Agent Hooks</title> +<!-- .XS --> +<!-- (SN External Agent Hooks --> +<!-- .XE --> +<para> +<!-- .LP --> +External agent hooks were added for the benefit of applications +that instrument other applications for purposes of accessibility, +testing, and customization. The external agent and the application +communicate by a shared protocol which is transparent to the application. +The hook callbacks permit the external agent to register interest +in groups or classes of toolkit activity and to be notified of the +type and details of the activity as it occurs. The new interfaces +related to this effort are +<function>XtHooksOfDisplay ,</function> +which returns the hook registration widget, and +<function>XtGetDisplays ,</function> +which returns a list of the X displays associated with an application context. +<!-- .bp --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</sect3> +</sect2> +</chapter> +</book> diff --git a/specs/Xorg_groffms2docbook.pl b/specs/Xorg_groffms2docbook.pl new file mode 100755 index 0000000..7540ac7 --- /dev/null +++ b/specs/Xorg_groffms2docbook.pl @@ -0,0 +1,803 @@ +#!/usr/bin/perl +# .. +# .\" +# .ad -- sets text adjustment +# .AI -- author's institution +# .AU -- author info +# .B -- bold text +# .bp -- begin page (page break) +# .br -- new line +# .DE -- ends display of any unfilled text (what does this mean?) +# .DS -- display at location +# .EF -- sets even page footer +# .EH -- sets even page header +# .eM +# .FD +# .FN +# .IP -- Italic text +# .LP -- begins left block paragraph = unindented +# .ne +# .NH -- sets numbered header +# .OF -- sets odd page footer +# .OH -- sets odd page header +# .PN +# .R -- return to normal font +# .sM +# .sp -- provide N blank lines in output. +# .TA +# .TE -- end of processed section (table) +# .TH -- title +# .TL +# .TS -- beginning of processed section (table) +# .XE +# .XS +# +# +# .TL +# \s+2\fBX Session Management Library\fP\s-2 +# .sp +# V +# +# +#Rather than looking just for markers to translate +#we have a list of functionality that we are looking +#to extract. Things like: +# bolded items, +# itemized lists, +# functions/prototypes +# ... + +# each function looks for one specific type of thing, then: +# 1) keeps a list of locations where that item is found (on a stack) +# 2) goes through that list in reverse order (from bottom of file up) +# 3) inserts the new items in the file in the correct place, +# and removing the old ones. +# we go in reverse order so that if the number of lines changes +# we don't accidentally overwrite anything else. +my @raw_data = (); +my $finallevel=0; + + +# this function is used to stick newly formatted text +# into the big array. +# each line is an element in the array +# insert array @slave_arr into @master_arr, replacing +# lines $start thru $end in the @master_arr +# insertarrayintoarray @slave_arr, $start, $end +sub insertarrayintoarray +{ + my $cnt; + my ($a, $b, $c, $d) = @_; + my @master_arr=@$a; + my @slave_arr=@$b; + my $start=$c; + my $end=$d; + my @tmpmstr=(); + + # copy over everything up to where the slave_arr goes + for ($cnt=0;$cnt<$start;$cnt++) { + push (@tmpmstr, $master_arr[$cnt]); + } + + # copy over the slave_arr + #print "INSERTING:: --------------------\n"; + foreach $zz (@slave_arr) { + push (@tmpmstr, $zz); + #print "$zz\n"; + } + #print "INSERTING:: ====================\n"; + + # copy over everything after where the slave_arr goes + $cnt=0; + foreach $zz (@master_arr) { + $cnt++; + if ($cnt<$end) {next}; + push (@tmpmstr, $master_arr[$cnt]); + } + + @master_arr=(); + foreach $zz (@tmpmstr) { + push (@master_arr, $zz); + } + # recalculate array size + $arrsize=0; + foreach $_ (@master_arr) { + $arrsize++; + } + return @master_arr; +} + +# look for lines: .PN <itemtobebolded> +# This function scans for things that need to be bolded. +# using <function>blah</function> as the bolding method. +sub bolding +{ + #for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + #$_=$raw_data[$linecntr]; + foreach (@raw_data) { + if (/^\.PN/i) { + #@words = split(/ /, $_); + #$raw_data[$linecntr]="<function>".substr($_,4)."</function>"; + $_="<function>".substr($_,4)."</function>"; + } elsif (/\\fB.*\\fP/i) { + s/\\fB(.*?)\\fP/<function>$1<\/function>/g; + } + #$raw_data[$linecntr]=$_; + } + +} + +# look for: "\fB <itemtobeitaliced>" +# This function scans for things that need to be bolded. +# using <emphasis remap='I'>blah</emphasis> as the italicizing method. +sub italics +{ + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/\\fI.*\\fP/i) { + s/\\fI(.*?)\\fP/<emphasis remap='I'>$1<\/emphasis>/g; + } + $raw_data[$linecntr]=$_; + } + +} + +# look for: "< .. >" +# This function scans for '<' and '>'. +# using < and > +sub quotes +{ + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + $_=~ s/</</g; + $_=~ s/>/>/g; + $_=~ s/\\\*Q/"/g; + $_=~ s/\\\*U/"/g; + $_=~ s/\\\*//g; + $raw_data[$linecntr]=$_; + } +} + +# look for: .FD 0 ..<multiline>.. .FN +# This function scans for functions +# .FD 0 starts the func def +# .FN ends the func dev +# if line starts with typedef, ignore it. +# there may or may not be a return type (preceding int, void, ...) +sub functions +{ + $itemcnt=0; + my @functarray = (); + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.FD/i) { + #print "FOUND FUNC BEGIN -- $linecntr\n"; + push(@functarray, $linecntr); + } elsif (/^\.FN/i) { + #print "FOUND FUNC END -- $linecntr\n"; + push(@functarray, $linecntr); + $itemcnt++; + } + } + for ($j=0;$j<$itemcnt;$j++) { + my @tmparr=(); + $stop=pop(@functarray); + $start=pop(@functarray); + #print "FUNC: start: $start; stop: $stop\n"; + #print "FUNCTION FOUND: $start <> $stop\n"; + + # merge everything and then strip out everything + # (minus 'typedef ...' up to the first ')' + # for easier parsing. + $tmpstr=""; + for ($linecntr=$start+1;$linecntr<$stop;$linecntr++) { + $tmpstr.=$raw_data[$linecntr] . " "; + } + $_=$tmpstr ; + s/typedef.*\;//; # strip out typedefs + s/\\\s+/ /; # strip off line continuations '\' + s/\.br\s*//; + s/\s+/ /g; + my $funcproto = substr($_, 0, index($_,"\)")+1); + my $funcdev = substr($_, 0, index($_,"\(")); + #print "FUNCDEV: !$funcdev!\n"; + $funcdev =~ s/^\s+//; + $funcdev =~ s/\\\^//; + my @tmp=split(/\s+/, $funcdev); + $args=substr($_, index($_,"(")+1, index($_,")")-index($_,"(")-1) ; + $_=$args; + s/\\\s+/ /; # strip off line continuations '\' + s/\s*,\s*/, /g; + print "WHOLE: $tmpstr\n"; + print "ARGS: $_\n"; + @items_arr=split(/\s*,\s*/); + @tot_arr=split(/\s+/); #count items between ( ). this'll + # show if it's type one or two . + # account for types like 'unsigned int' vs 'int' + my $tot_cntr=0; + foreach $_ (@tot_arr) { + $tot_cntr++; + } + + my $items_cntr=0; + foreach $_ (@items_arr) { + $items_cntr++; + } + + my $cntr=0; + my $zz; + foreach $zz (@tmp) { + $cntr++; + } + if ($cntr==1) { # there is no typedef before the function + $typedef=""; + $funcname=$tmp[0]; + } else { + $typedef=$tmp[0]; + $funcname=$tmp[1]; + } + #print "Func proto: !$typedef!<-->!$funcname!\n"; + + push (@tmparr, "<funcsynopsis>"); + push (@tmparr, "<funcprototype>"); + push (@tmparr, " <funcdef>" . $typedef . "<function> " . $funcname . "</function></funcdef>"); + + # two choices: + # 1) funcname(type var1, type var2, type var3) + # 2) funcname(var1, var2, var3) + # now grab the argument definitions (below the func dev) + #$pastfunc=0; + print "FUNCTION ($start to $stop): tot_cntr $tot_cntr; items_cntr: $items_cntr\n"; + print "TOT_CNTR: $tot_cntr; ITEMS: $items_cntr line: $linecntr\n"; + if (($tot_cntr/$items_cntr) <= 1) { # types are below. + for ($linecntr=$start+1;$linecntr<$stop;$linecntr++) { + $_=$raw_data[$linecntr]; + s/typedef.*\;//; # strip out typedefs + if (/;/) { # assume ';' means there a def on this line. + s/^\s+//; + s/;.*//; + + #print "PARAMLINE: $_\n"; + my @tmp=split(/\s+/); + $cntr=0; + foreach $zz (@tmp) { + $cntr++; + } + my $paramtype=""; + for ($x=0;$x<$cntr-1;$x++) { + $paramtype.=$tmp[$x]; + $paramtype =~ s/\\fI//g; + $paramtype =~ s/\\fP(\\\^)*//g; + $paramtype =~ s/<emphasis remap='I'>"//; + $paramtype =~ s/<\/emphasis>"//; + } + $paramname=$tmp[$cntr-1]; + # dont' use italics in the functions defs here. + $paramname =~ s/\\fI//g; + $paramname =~ s/\\fP(\\\^)*//g; + $paramname =~ s/<emphasis remap='I'>"//i; + $paramname =~ s/<\/emphasis>"//i; + #print "param : !$paramtype!<-->!$paramname!\n"; + + #push (@tmparr, "param: $paramtype / $paramname"); + push (@tmparr, " <paramdef>$paramtype<parameter> $paramname</parameter></paramdef>"); + } + } + } else { # types are in the funcdef + foreach $_ (@items_arr) { + #($type, $var) = split(/\s+/); + #print "TYPE: $type; VAR: $var\n"; + my @tmp=split(/\s+/); + $cntr=0; + foreach $zz (@tmp) { + $cntr++; + } + my $paramtype=""; + for ($x=0;$x<$cntr-1;$x++) { + $paramtype.=$tmp[$x]; + $paramtype =~ s/\\fI//; + $paramtype =~ s/\\fP(\\\^)*//; + $paramtype =~ s/<emphasis remap='I'>"//; + $paramtype =~ s/<\/emphasis>"//; + } + $paramname=$tmp[$cntr-1]; + # dont' use italics in the functions defs here. + $paramname =~ s/\\fI//i; + $paramname =~ s/\\fP(\\\^)*//i; + $paramname =~ s/<emphasis remap='I'>"//i; + $paramname =~ s/<\/emphasis>"//i; + push (@tmparr, " <paramdef>$paramtype<parameter> $paramname</parameter></paramdef>"); + } + } + push (@tmparr, "</funcprototype>"); + push (@tmparr, "</funcsynopsis>"); + #print "STuffing between lines $start and $stop:\n"; + #foreach $xx (@tmparr) { + #print "::>$xx\n"; + #} + @raw_data=insertarrayintoarray(\@raw_data, \@tmparr, $start, $stop); + } +} + +# look for: ".IP" +# This function scans for groups of .IP lines +sub itemizedlists +{ + my @listarray=(); + $marker=0; + $listcnt=0; # number of pairs of list start/end points + $startline=0; + $inlist=0; #currently building a list + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if ((/^\.IP/i) && ($inlist==0)) { + $inlist=1; + if (/i$/) {# if lines ends with indentation command + # this should be a variablelist + push (@listarray, "v"); + + } else { + push (@listarray, "i"); + } + push(@listarray, $linecntr); # push start line + $marker=$linecntr; + } elsif (((/^\.nh/i) || (/^\.lp/i)) && ($inlist==1)) { + push(@listarray, $linecntr); # push stop line + $marker=$linecntr; + $inlist=0; + $listcnt++; + } + } + if ($inlist==1) { + push(@listarray, $linecntr); # push stop line + $inlist=0; + #die "ERROR: didn't find END-OF-LIST marker; last marker at: $marker\n"; + } + + for ($j=0;$j<$listcnt;$j++) { + my @tmparr; + my $stop=pop(@listarray); + my $start=pop(@listarray); + my $type=pop(@listarray); + + #print "<itemizedlist>\n"; + if ($type eq "i") { + push (@tmparr, "<itemizedlist>"); + $item=0; + for ($linecntr=$start;$linecntr<$stop;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.IP/i) { + if ($item>0) { + #print " </para>\n </listitem>\n"; + push (@tmparr, " </para>"); + push (@tmparr, " </listitem>"); + } + $item++; + #print " <listitem>\n <para>\n"; + push (@tmparr, " <listitem>"); + push (@tmparr, " <para>"); + } else { + #print "$_\n"; + push (@tmparr, $_); + } + } + #print " </para>\n </listitem>\n"; + #print "</itemizedlist>\n"; + push (@tmparr, " </para>"); + push (@tmparr, " </listitem>"); + push (@tmparr, "</itemizedlist>"); + #print "--------------\n"; + } else { # variablelist + push (@tmparr, "<variablelist>"); + $item=0; + for ($linecntr=$start;$linecntr<$stop;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.IP/i) { + if ($item>0) { + push (@tmparr, " </para>"); + push (@tmparr, " </listitem>"); + push (@tmparr, " </varlistentry>"); + } + $item++; + push (@tmparr, " <varlistentry>"); + push (@tmparr, " <term>"); + ($tag, $text, $indent) = split(/\s+/); + push (@tmparr, " $text"); + push (@tmparr, " </term>"); + push (@tmparr, " <listitem>"); + push (@tmparr, " <para>"); + + } else { + #print "$_\n"; + push (@tmparr, $_); + } + } + #print " </para>\n </listitem>\n"; + #print "</itemizedlist>\n"; + push (@tmparr, " </para>"); + push (@tmparr, " </listitem>"); + push (@tmparr, " </varlistentry>"); + push (@tmparr, "</variablelist>"); + #print "--------------\n"; + + } + + @raw_data=insertarrayintoarray(\@raw_data, \@tmparr, $start, $stop); + } +} + +$oldlevel=0; # fake static variable. track what level we're in. +# look for: ".NH" +sub headings +{ + $level=0; + my $inpara=0; + #my @tmp; + $headingcnt=0; + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.NH/i) { + $title=$raw_data[$linecntr+1]; + @words = split(/ /, $_); + $level=$words[1]; + #print "HEADING FOUND: LEVEL " . $level . " at line $linecntr\n"; + push(@headingarray, $linecntr); + push(@headingarray, $oldlevel); + push(@headingarray, $level); + push(@headingarray, $title); + $headingcnt++; + $oldlevel=$level; # store for next time; so we know how many + # to come down + } + } + + for ($j=0;$j<$headingcnt;$j++) { + my @tmparr; + $title=pop(@headingarray); + $level=pop(@headingarray); + $oldlevel=pop(@headingarray); + $line=pop(@headingarray); + $id=$title; + $id =~ s/ /_/g; + $id =~ tr/a-zA-Z/_/cs; + if ($j==0) { + $finallevel=$level; + } + + my $i; + if ($level <= $oldlevel) { + for ($i=$oldlevel;$i>$level-1;$i--) { + push (@tmparr, "</sect$i>"); + } + } + push (@tmparr, "<sect$level id=\"$id\">"); + push (@tmparr, "<title>".$title. "</title>"); + @raw_data=insertarrayintoarray(\@raw_data, \@tmparr, $line, $line+2); + } + # sect0 are chapters + for (@raw_data) { + s/<sect0>/<chapter>/; + s/<\/sect0>/<\/chapter>/; + } +} + + +# look for: ".lp" +# This function scans for groups of .IP lines +sub paragraphs +{ + # find all paragraph markers and push onto stack + # marker types: + # 0 = <para> + # 1 = </para> + # 2 = both + my $type=0; + my @itemarr=(); + my $itemcnt=0; + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + + if ((/^\.nh/i) || (/^<chapter/i) || (/^<sect/i) || + (/^\.ip/i) || (/^\.fd/i) || (/^<itemized/i) || + (/^<\/chapter/i) || (/^<\/sect/i)) { + #print "MARKER $_ found($linecntr). inpara=$inpara\n"; + if ($inpara==1) { + push(@itemarr, $linecntr); + push(@itemarr, 1); + $itemcnt++; + $inpara=0; + } + } + + + # 1) hit another para marker (.lp) after a previous one + # print both </para> and <para> + # 2) hit a para marker with no previous one, print just <para> + if (/^\.lp/i || (/^\.xp/i)) { + if ($inpara==1) { + $type=2; + } elsif ($inpara==0) { + $type=0; + } + push(@itemarr, $linecntr); + push(@itemarr, $type); + $inpara=1; + $itemcnt++; + } + + #if ((/^\.FD/) && ($inpara==1)) { + #pop(@itemarr); + #pop(@itemarr); + #} + + } + + # if EOF and open para, we need to close. + if ($inpara==1) { + push(@itemarr, $linecntr); + push(@itemarr, 1); + $itemcnt++; + $inpara=0; + } + + # pop off stack + for ($j=0;$j<$itemcnt;$j++) { + my @tmparr=(); + $type=pop(@itemarr); + $line=pop(@itemarr); + + if ($type==0) { + push (@tmparr, "<para>"); + } elsif ($type==1) { + push (@tmparr, "</para>"); + } elsif ($type==2) { + push (@tmparr, "</para>"); + push (@tmparr, "<para>"); + } + @raw_data=insertarrayintoarray(\@raw_data, \@tmparr, $line, $line); + } +} + +# clean up any unhandled macros +# +sub extramacros +{ + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.[a-zA-Z\\]+/) { + $raw_data[$linecntr] = "<\!-- " . $_ . " -->"; + } + } +} + +sub removexssections +{ + my @itemarr=(); + my $itemcnt=0; + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.XS/i) { + push(@itemarr, $linecntr); + } elsif (/^\.XE/i) { + push(@itemarr, $linecntr); + $itemcnt++; + } + } + + for ($j=0;$j<$itemcnt;$j++) { + $stop=pop(@itemarr); + $start=pop(@itemarr); + + my @tmparr=(); + for ($k=$start;$k<$stop;$k++) { + push (@tmparr, "<!-- " . $raw_data[$k] . " -->"); + } + @raw_data=insertarrayintoarray(\@raw_data, \@tmparr, $start, $stop); + } + +} + +sub literallayout +{ + foreach (@raw_data) { + s/^\.D[Ss].*/<literallayout class="monospaced">/; + s/^\.D[Ee]/<\/literallayout>/; + } +} + +sub informaltable +{ + my @itemarr=(); + my $itemcnt=0; + for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + $_=$raw_data[$linecntr]; + if (/^\.TS/i) { + push(@itemarr, $linecntr); + } elsif (/^\.TE/i) { + push(@itemarr, $linecntr); + $itemcnt++; + } + } + + for ($j=0;$j<$itemcnt;$j++) { + my @tmparr; + $stop=pop(@itemarr); + $start=pop(@itemarr); + + #$_=$raw_data[$start+1]; + + #@coldef=split(/\s+/); + #$colcnt=0; + #foreach $zz (@coldef) { + #$colcnt++; + #} + + + lklw : for ($k=$start+1;$k<$stop;$k++) { + $_=$raw_data[$k]; + if (/^lw\(/i) { + @hdrdef=split(/\s+/); + $colcnt=0; + foreach $zz (@hdrdef) { + $colcnt++; + } + last lklw; + } + } + + $hdrsdefined=0; + lkhdr : for ($k=$start+1;$k<$stop;$k++) { + $_=$raw_data[$k]; + if (/^\.tb/i) { + $hdrline=$k+1; + $hdrsdefined=1; + $_=$raw_data[$hdrline]; + @hdrdef=split(/\t/); + last lkhdr; + } + } + #print "HDRLINE: $_\n"; + #$colcnt=0; + #foreach $zz (@hdrdef) { + #$colcnt++; + #} + + + $dataline=$start; + lkdata : for ($k=$k+1;$k<$stop;$k++) { + $_=$raw_data[$k]; + if (/^\.th/i) { + $dataline=$k+1; + last lkdata; + } + } + push (@tmparr, "<informaltable>"); + push (@tmparr, " <tgroup cols='$colcnt' align='center'>"); + for ($k=1;$k<=$colcnt;$k++) { + push (@tmparr, " <colspec colname='c$k'/>"); + } + if ($hdrsdefined==1) { + push (@tmparr, " <thead>"); + push (@tmparr, " <row>"); + foreach $zz (@hdrdef) { + push (@tmparr, " <entry>$zz</entry>"); + } + push (@tmparr, " </row>"); + push (@tmparr, " </thead>"); + } + push (@tmparr, " <tbody>"); + + for ($k=$dataline;$k<=$stop;$k++) { + $_=$raw_data[$k]; + if (/^\./) { next;} + push (@tmparr, " <row>"); + @data=split(/\t/); + $dcntr=0; + foreach $zz (@data) { + if ($dcntr < $colcnt) { + push (@tmparr, " <entry>$zz</entry>"); + } + $dcntr++; + } + push (@tmparr, " </row>"); + } + push (@tmparr, " </tbody>"); + push (@tmparr, " </tgroup>"); + push (@tmparr, "</informaltable>"); + @raw_data=insertarrayintoarray(\@raw_data, \@tmparr, $start, $stop+1); + } + +} +# ------------------------------------------------------- +# ------------------------------------------------------- + + + +$skiptofirstsection=0; + +if ($skiptofirstsection==1) { + #print "Reading in file\n"; + open (MYFILE, $ARGV[0]) || die "Unable to read file: '" . $ARGV[0] . "'"; + @raw=<MYFILE>; + close (MYFILE); + chomp(@raw); + $arr=0; + foreach $_ (@raw) { + $arr++; + } + print "1st size: $arr\n"; + + $start=0; + looper: foreach $_ (@raw) { + if (/^\.NH/i) { + last looper; + } + $start++; + } + #print "STARTING AT: $start\n"; + + # Current purposes we delete everything up to the first section. + # fill in the title page stuff by hand + @raw_data=(); + $arrsize=0; + for ($linecntr=$start-1;$linecntr<$arr;$linecntr++) { + #print "LINE: " . $raw[$linecntr] . "\n"; + push(@raw_data, $raw[$linecntr]); + $arrsize++; + } +} else { + #print "Reading in file\n"; + open (MYFILE, $ARGV[0]) || die "Unable to read file: '" . $ARGV[0] . "'"; + @raw_data=<MYFILE>; + close (MYFILE); + chomp(@raw_data); + $arrsize=0; + foreach $_ (@raw_data) { + $arrsize++; + } + #print "2nd size: $arrsize\n"; + +} + +quotes(); +# functions(); +itemizedlists(); +bolding(); +italics(); +headings(); +paragraphs(); +removexssections(); +literallayout(); +informaltable(); +extramacros(); + + + +# trim blank lines off the end of the file. +my $new_arrsize=$arrsize; +for ($linecntr=$new_arrsize-1;$linecntr>0;$linecntr--) { + $_=$raw_data[$linecntr]; + if (/^\s*$/) { + pop(@raw_data); + $arrsize--; + } else { + last; # once we hit a non-blank line. stop. + } +} + + #foreach (@raw_data) { + #print "NOW: $_\n"; + #} + +#push (@raw_data, "</para>"); +for ($i=$finallevel;$i>1;$i--) { + push (@raw_data, "</sect$i>"); +} +push (@raw_data, "</chapter>"); +push (@raw_data, "</book>"); + + +foreach $_ (@raw_data) { +#for ($linecntr=0;$linecntr<$arrsize;$linecntr++) { + print $_ . "\n"; +} diff --git a/specs/appA.xml b/specs/appA.xml new file mode 100644 index 0000000..8076002 --- /dev/null +++ b/specs/appA.xml @@ -0,0 +1,138 @@ +<!-- .\" $Xorg: appA,v 1.3 2000/08/17 19:42:48 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +<!-- .bp --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Appendix A</function>\s-1 + +\s+1<function>Resource File Format</function>\s-1 +<!-- .sp 2 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Appendix A \(em Resource File Format</function> --> +<!-- .XE --> +A resource file contains text representing the default resource values for an +application or set of applications. +</para> +<para> +<!-- .LP --> +The format of resource files is defined by <emphasis remap='I'>(xL</emphasis> and is reproduced here +for convenience only. +</para> +<para> +<!-- .LP --> +The format of a resource specification is +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +Elements separated by vertical bar (|) are alternatives. +Curly braces ({\&.\&.\&.}) indicate zero or more repetitions +of the enclosed elements. +Square brackets ([\&.\&.\&.]) indicate that the enclosed element is optional. +Quotes (``\&.\&.\&.'') are used around literal characters. +</para> +<para> +<!-- .LP --> +If the last character on a line is a backslash (\\), +that line is assumed to continue on the next line. +</para> +<para> +<!-- .LP --> +To allow a Value to begin with whitespace, +the two-character sequence ``\\\^<emphasis remap='I'>space</emphasis>'' (backslash followed by space) +is recognized and replaced by a space character, +and the two-character sequence ``\\\^<emphasis remap='I'>tab</emphasis>'' +(backslash followed by horizontal tab) +is recognized and replaced by a horizontal tab character. + +To allow a Value to contain embedded newline characters, +the two-character sequence ``\\\^n'' is recognized and replaced by a +newline character. +To allow a Value to be broken across multiple lines in a text file, +the two-character sequence ``\\\^<emphasis remap='I'>newline</emphasis>'' +(backslash followed by newline) is +recognized and removed from the value. + +To allow a Value to contain arbitrary character codes, +the four-character sequence ``\\\^<emphasis remap='I'>nnn</emphasis>'', +where each <emphasis remap='I'>n</emphasis> is a digit character in the range of ``0''\-``7'', +is recognized and replaced with a single byte that contains +the octal value specified by the sequence. +Finally, the two-character sequence ``\\\\'' is recognized +and replaced with a single backslash. +</para> +</chapter> +</book> diff --git a/specs/appB.xml b/specs/appB.xml new file mode 100644 index 0000000..a1da6ff --- /dev/null +++ b/specs/appB.xml @@ -0,0 +1,1695 @@ +<!-- .\" $Xorg: appB,v 1.3 2000/08/17 19:42:48 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +<!-- .bp --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Appendix B</function>\s-1 + +\s+1<function>Translation Table Syntax</function>\s-1 +<!-- .sp 2 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Appendix B \(em Translation Table Syntax</function> --> +<!-- .XE --> +<!-- .IN "Translation tables" --> +<!-- .SH --> +Notation +</para> +<para> +<!-- .LP --> +Syntax is specified in EBNF notation with the following conventions: +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>l l.</entry> + </row> + <row> + <entry>[ a ]</entry> + <entry>Means either nothing or ``a''</entry> + </row> + <row> + <entry>{ a }</entry> + <entry>Means zero or more occurrences of ``a''</entry> + </row> + <row> + <entry>( a | b )</entry> + <entry>Means either ``a'' or ``b''</entry> + </row> + <row> + <entry>\\\\n</entry> + <entry>Is the newline character</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +All terminals are enclosed in double quotation marks (`` ''). +Informal descriptions are enclosed in angle brackets (< >). +<!-- .SH --> +Syntax +</para> +<para> +<!-- .LP --> +The syntax of a translation table is +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>l l .</entry> + </row> + <row> + <entry>translationTable</entry> + <entry>= [ directive ] { production }</entry> + </row> + <row> + <entry>directive</entry> + <entry>= ( ``#replace'' | ``#override'' | ``#augment'' ) ``\\\\n''</entry> + </row> + <row> + <entry>production</entry> + <entry>= lhs ``:'' rhs ``\\\\n''</entry> + </row> + <row> + <entry>lhs</entry> + <entry>= ( event | keyseq ) { ``,'' (event | keyseq) }</entry> + </row> + <row> + <entry>keyseq</entry> + <entry>= ``"'' keychar {keychar} ``"''</entry> + </row> + <row> + <entry>keychar</entry> + <entry>= [ ``^'' | ``$'' | ``\\\\'' ] <ISO Latin 1 character></entry> + </row> + <row> + <entry>event</entry> + <entry>= [modifier_list] ``<''event_type``>'' [ ``('' count[``+''] ``)'' ] {detail}</entry> + </row> + <row> + <entry>modifier_list</entry> + <entry>= ( [``!''] [``:''] {modifier} ) | ``None''</entry> + </row> + <row> + <entry>modifier</entry> + <entry>= [``~''] modifier_name</entry> + </row> + <row> + <entry>count</entry> + <entry>= (``1'' | ``2'' | ``3'' | ``4'' | ...)</entry> + </row> + <row> + <entry>modifier_name</entry> + <entry>= ``@'' <keysym> | <see ModifierNames table below></entry> + </row> + <row> + <entry>event_type</entry> + <entry>= <see Event Types table below></entry> + </row> + <row> + <entry>detail</entry> + <entry>= <event specific details></entry> + </row> + <row> + <entry>rhs</entry> + <entry>= { name ``('' [params] ``)'' }</entry> + </row> + <row> + <entry>name</entry> + <entry>= namechar { namechar }</entry> + </row> + <row> + <entry>namechar</entry> + <entry>= { ``a''-``z'' | ``A''-``Z'' | ``0''-``9'' | ``_'' | ``-'' }</entry> + </row> + <row> + <entry>params</entry> + <entry>= string {``,'' string}</entry> + </row> + <row> + <entry>string</entry> + <entry>= quoted_string | unquoted_string</entry> + </row> + <row> + <entry>quoted_string</entry> + <entry>= ``"'' {<Latin 1 character> | escape_char} [``\\\\\\\\'' ] ``"''</entry> + </row> + <row> + <entry>escape_char</entry> + <entry>= ``\\\\"''</entry> + </row> + <row> + <entry>unquoted_string</entry> + <entry>= {<Latin 1 character except space, tab, ``,'', ``\\\\n'', ``)''>}</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +</para> +<para> +<!-- .LP --> +The <emphasis remap='I'>params</emphasis> field is parsed into a list of +<function>String</function> +values that will be passed to the named action procedure. A +<emphasis remap='I'>quoted string</emphasis> may contain an embedded quotation mark if the +quotation mark is preceded by a single backslash (\\). The +three-character sequence ``\\\\"'' is interpreted as ``single backslash +followed by end-of-string''. + +<!-- .SH --> +Modifier Names +</para> +<para> +<!-- .LP --> +The modifier field is used to specify standard X keyboard and button +modifier mask bits. +Modifiers are legal on event types +<function>KeyPress ,</function> +<function>KeyRelease ,</function> +<function>ButtonPress ,</function> +<function>ButtonRelease ,</function> +<function>MotionNotify ,</function> +<function>EnterNotify ,</function> +<function>LeaveNotify ,</function> +and their abbreviations. +An error is generated when a translation table +that contains modifiers for any other events is parsed. +</para> +<!-- .IP \(bu 5 --> +If the modifier list has no entries and is not ``None'', +it means ``don't care'' on all modifiers. +<!-- .IP \(bu 5 --> +If an exclamation point (!) is specified at the beginning +of the modifier list, +it means that the listed modifiers must be in the correct state +and no other modifiers can be asserted. +<!-- .IP \(bu 5 --> +If any modifiers are specified +and an exclamation point (!) is not specified, +it means that the listed modifiers must be in the +correct state and ``don't care'' about any other modifiers. +<!-- .IP \(bu 5 --> +If a modifier is preceded by a tilde (~), +it means that that modifier must not be asserted. +<!-- .IP \(bu 5 --> +If ``None'' is specified, it means no modifiers can be asserted. +<!-- .IP \(bu 5 --> +If a colon (:) is specified at the beginning of the modifier list, +it directs the (xI to apply any standard modifiers in the +event to map the event keycode into a KeySym. +The default standard modifiers are Shift and Lock, +with the interpretation as defined in <emphasis remap='I'>(xP</emphasis>, Section 5. +The resulting KeySym must exactly match the specified +KeySym, and the nonstandard modifiers in the event must match the +modifier list. +For example, ``:<Key>a'' is distinct from ``:<Key>A'', +and ``:Shift<Key>A'' is distinct from ``:<Key>A''. +<!-- .IP \(bu 5 --> +If both an exclamation point (!) and a colon (:) are specified at +the beginning of the modifier list, it means that the listed +modifiers must be in the correct state and that no other modifiers +except the standard modifiers can be asserted. Any standard +modifiers in the event are applied as for colon (:) above. +<!-- .IP \(bu 5 --> +If a colon (:) is not specified, +no standard modifiers are applied. +Then, for example, ``<Key>A'' and ``<Key>a'' are equivalent. +<para> +<!-- .LP --> +In key sequences, +a circumflex (^) is an abbreviation for the Control modifier, +a dollar sign ($) is an abbreviation for Meta, +and a backslash (\\) can be used to quote any +character, in particular a double quote ("), a circumflex (^), +a dollar sign ($), and another backslash (\\). +Briefly: +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA 2.5i --> +<!-- .ta 2.5i --> +No modifiers: None <event> detail +Any modifiers: <event> detail +Only these modifiers: ! mod1 mod2 <event> detail +These modifiers and any others: mod1 mod2 <event> detail +</literallayout> +</para> +<para> +<!-- .LP --> +The use of ``None'' for a modifier list is identical to the use +of an exclamation point with no modifers. +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1i) lw(1i) lw(3i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Modifier</entry> + <entry>Abbreviation</entry> + <entry>Meaning</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Ctrl</entry> + <entry>c</entry> + <entry>Control modifier bit</entry> + </row> + <row> + <entry>Shift</entry> + <entry>s</entry> + <entry>Shift modifier bit</entry> + </row> + <row> + <entry>Lock</entry> + <entry>l</entry> + <entry>Lock modifier bit</entry> + </row> + <row> + <entry>Meta</entry> + <entry>m</entry> + <entry>Meta key modifier</entry> + </row> + <row> + <entry>Hyper</entry> + <entry>h</entry> + <entry>Hyper key modifier</entry> + </row> + <row> + <entry>Super</entry> + <entry>su</entry> + <entry>Super key modifier</entry> + </row> + <row> + <entry>Alt</entry> + <entry>a</entry> + <entry>Alt key modifier</entry> + </row> + <row> + <entry>Mod1</entry> + <entry></entry> + <entry>Mod1 modifier bit</entry> + </row> + <row> + <entry>Mod2</entry> + <entry></entry> + <entry>Mod2 modifier bit</entry> + </row> + <row> + <entry>Mod3</entry> + <entry></entry> + <entry>Mod3 modifier bit</entry> + </row> + <row> + <entry>Mod4</entry> + <entry></entry> + <entry>Mod4 modifier bit</entry> + </row> + <row> + <entry>Mod5</entry> + <entry></entry> + <entry>Mod5 modifier bit</entry> + </row> + <row> + <entry>Button1</entry> + <entry></entry> + <entry>Button1 modifier bit</entry> + </row> + <row> + <entry>Button2</entry> + <entry></entry> + <entry>Button2 modifier bit</entry> + </row> + <row> + <entry>Button3</entry> + <entry></entry> + <entry>Button3 modifier bit</entry> + </row> + <row> + <entry>Button4</entry> + <entry></entry> + <entry>Button4 modifier bit</entry> + </row> + <row> + <entry>Button5</entry> + <entry></entry> + <entry>Button5 modifier bit</entry> + </row> + <row> + <entry>None</entry> + <entry></entry> + <entry>No modifiers</entry> + </row> + <row> + <entry>Any</entry> + <entry></entry> + <entry>Any modifier combination</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +<!-- .IN "key modifier" --> +A key modifier is any modifier bit one of whose corresponding KeyCodes +contains the corresponding left or right KeySym. +For example, +``m'' or ``Meta'' means any modifier bit mapping to a KeyCode +whose KeySym list contains XK_Meta_L or XK_Meta_R. +Note that this interpretation is for each display, +not global or even for each application context. +The Control, Shift, and Lock modifier names refer +explicitly to the corresponding modifier bits; +there is no additional interpretation of KeySyms for these modifiers. +</para> +<para> +<!-- .LP --> +Because it is possible to associate arbitrary KeySyms with modifiers, the set of +key modifiers is extensible. The ``@'' <keysym> syntax means any +modifier bit whose corresponding KeyCode contains the specified KeySym name. +</para> +<para> +<!-- .LP --> +A modifier_list/KeySym combination in a translation matches a +modifiers/KeyCode combination in an event in the following ways: +</para> +<itemizedlist> + <listitem> + <para> +If a colon (:) is used, the (xI call the display's +<function>XtKeyProc</function> +with the KeyCode and modifiers. +To match, (<emphasis remap='I'>modifiers</emphasis> & ~<emphasis remap='I'>modifiers_return</emphasis>) must equal <emphasis remap='I'>modifier_list</emphasis>, and +<emphasis remap='I'>keysym_return</emphasis> must equal the given KeySym. + </para> + </listitem> + <listitem> + <para> +If (:) is not used, the (xI mask off all don't-care bits from the +modifiers. +This value must be equal to <emphasis remap='I'>modifier_list</emphasis>. +Then, for each possible combination of +don't-care modifiers in the modifier list, the (xI call the display's +<function>XtKeyProc</function> +with the KeyCode and that combination ORed with the cared-about modifier bits +from the event. +<emphasis remap='I'>Keysym_return</emphasis> must match the KeySym in the translation. +<!-- .SH --> +Event Types + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +The event-type field describes XEvent types. +In addition to the standard +Xlib symbolic event type names, the following event type synonyms +are defined: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(1.5i) lw(3i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Type</entry> + <entry>Meaning</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Key</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeyPress</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>KeyDown</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeyPress</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>KeyUp</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeyRelease</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>BtnDown</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonPress</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>BtnUp</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonRelease</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Motion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>PtrMoved</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>MouseMoved</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Enter</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>EnterNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>EnterWindow</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>EnterNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Leave</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>LeaveNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>LeaveWindow</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>LeaveNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>FocusIn</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>FocusIn</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>FocusOut</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>FocusOut</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Keymap</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeymapNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Expose</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>Expose</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>GrExp</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>GraphicsExpose</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>NoExp</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>NoExpose</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Visible</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>VisibilityNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Create</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CreateNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Destroy</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>DestroyNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Unmap</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>UnmapNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Map</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MapNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>MapReq</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MapRequest</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Reparent</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ReparentNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Configure</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ConfigureNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>ConfigureReq</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ConfigureRequest</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Grav</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>GravityNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>ResReq</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ResizeRequest</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Circ</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CirculateNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>CircReq</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>CirculateRequest</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Prop</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>PropertyNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>SelClr</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>SelectionClear</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>SelReq</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>SelectionRequest</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Select</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>SelectionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Clrmap</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ColormapNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Message</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ClientMessage</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>Mapping</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MappingNotify</function></entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +The supported abbreviations are: +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.5i) lw(1.25i) lw(1.75i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Abbreviation</entry> + <entry>Event Type</entry> + <entry>Including</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Ctrl</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeyPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Control modifier</entry> + </row> + <row> + <entry>Meta</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeyPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Meta modifier</entry> + </row> + <row> + <entry>Shift</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>KeyPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Shift modifier</entry> + </row> + <row> + <entry>Btn1Down</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button1 detail</entry> + </row> + <row> + <entry>Btn1Up</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonRelease</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button1 detail</entry> + </row> + <row> + <entry>Btn2Down</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button2 detail</entry> + </row> + <row> + <entry>Btn2Up</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonRelease</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button2 detail</entry> + </row> + <row> + <entry>Btn3Down</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button3 detail</entry> + </row> + <row> + <entry>Btn3Up</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonRelease</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button3 detail</entry> + </row> + <row> + <entry>Btn4Down</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button4 detail</entry> + </row> + <row> + <entry>Btn4Up</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonRelease</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button4 detail</entry> + </row> + <row> + <entry>Btn5Down</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonPress</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button5 detail</entry> + </row> + <row> + <entry>Btn5Up</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>ButtonRelease</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button5 detail</entry> + </row> + <row> + <entry>BtnMotion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with any button modifier</entry> + </row> + <row> + <entry>Btn1Motion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button1 modifier</entry> + </row> + <row> + <entry>Btn2Motion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button2 modifier</entry> + </row> + <row> + <entry>Btn3Motion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button3 modifier</entry> + </row> + <row> + <entry>Btn4Motion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button4 modifier</entry> + </row> + <row> + <entry>Btn5Motion</entry> + <entry>T{</entry> + </row> + <row> + <entry><function>MotionNotify</function></entry> + </row> + <row> + <entry>T}</entry> + <entry>with Button5 modifier</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The detail field is event-specific and normally corresponds to the +detail field of the corresponding event as described +by <emphasis remap='I'>(xP</emphasis>, Section 11. The detail field is supported +for the following event types: +</para> +<para> +<!-- .LP --> +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +If the event type is +<function>KeyPress</function> +or +<function>KeyRelease ,</function> +the detail field +specifies a KeySym name in standard format which is matched against +the event as described above, for example, <Key>A. +</para> +<para> +<!-- .LP --> +For the +<function>PropertyNotify ,</function> +<function>SelectionClear ,</function> +<function>SelectionRequest ,</function> +<function>SelectionNotify ,</function> +and +<function>ClientMessage</function> +events the detail field is specified +as an atom name; for example, <Message>WM_PROTOCOLS. For the +<function>MotionNotify ,</function> +<function>EnterNotify ,</function> +<function>LeaveNotify ,</function> +<function>FocusIn ,</function> +<function>FocusOut ,</function> +and +<function>MappingNotify</function> +events, either the symbolic constants as defined by +<emphasis remap='I'>(xP</emphasis>, Section 11, +or the numeric values may be specified. +</para> +<para> +<!-- .LP --> +If no detail field is specified, then any value in the event detail is +accepted as a match. +</para> +<para> +<!-- .LP --> +A KeySym can be specified as any of the standard KeySym names, +a hexadecimal number prefixed with ``0x'' or ``0X'', +an octal number prefixed with ``0'', or a decimal number. +A KeySym expressed as a single digit is interpreted as the +corresponding Latin 1 KeySym, for example, ``0'' is the KeySym XK_0. +Other single character KeySyms are treated as literal constants from Latin 1, +for example, ``!'' is treated as 0x21. +Standard KeySym names are as defined in +<function>< X11/keysymdef.h ></function> +with the ``XK_'' prefix removed. +</para> +<para> +<!-- .LP --> +<!-- .SH --> +Canonical Representation +</para> +<para> +<!-- .LP --> +Every translation table has a unique, canonical text representation. This +representation is passed to a widget's +<function>display_accelerator</function> +procedure to describe the accelerators installed on that widget. +The canonical representation of a translation table is (see also +``Syntax'') +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +<para> +<!-- .LP --> +The canonical modifier names are +</para> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +<!-- .TA 1i 2.5i --> +<!-- .ta 1i 2.5i --> +Ctrl Mod1 Button1 +Shift Mod2 Button2 +Lock Mod3 Button3 + Mod4 Button4 + Mod5 Button5 +</literallayout> +</para> +<para> +<!-- .LP --> +The canonical event types are +</para> +<itemizedlist> + <listitem> + <para> +<informaltable> + <tgroup cols='' align='center'> + <tbody> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + <row> + </row> + </tbody> + </tgroup> +</informaltable> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> + +<!-- .SH --> +Examples +</para> +<para> +<!-- .LP --> +</para> +<itemizedlist> + <listitem> + <para> +Always put more specific events in the table before more general ones: + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +<literallayout class="monospaced"> +Shift <Btn1Down> : twas()\\n\\ +<Btn1Down> : brillig() +</literallayout> +</para> +<para> +<!-- .LP --> +</para> +<itemizedlist> + <listitem> + <para> +For double-click on Button1 Up with Shift, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Shift<Btn1Up>(2) : and() +</literallayout> + </para> + </listitem> + <listitem> + <para> +This is equivalent to the following line with appropriate timers set +between events: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Shift<Btn1Down>,Shift<Btn1Up>,Shift<Btn1Down>,Shift<Btn1Up> : and() +</literallayout> + </para> + </listitem> + <listitem> + <para> +For double-click on Button1 Down with Shift, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Shift<Btn1Down>(2) : the() +</literallayout> + </para> + </listitem> + <listitem> + <para> +This is equivalent to the following line with appropriate timers set +between events: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Shift<Btn1Down>,Shift<Btn1Up>,Shift<Btn1Down> : the() +</literallayout> + </para> + </listitem> + <listitem> + <para> +Mouse motion is always discarded when it occurs between events in a table +where no motion event is specified: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +<Btn1Down>,<Btn1Up> : slithy() +</literallayout> + </para> + </listitem> + <listitem> + <para> +This is taken, even if the pointer moves a bit between the down and +up events. +Similarly, any motion event specified in a translation matches any number +of motion events. +If the motion event causes an action procedure to be invoked, +the procedure is invoked after each motion event. + </para> + </listitem> + <listitem> + <para> +If an event sequence consists of a sequence of events that is also a +noninitial subsequence of another translation, +it is not taken if it occurs in the context of the longer sequence. +This occurs mostly in sequences like the following: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +<Btn1Down>,<Btn1Up> : toves()\\n\\ +<Btn1Up> : did() +</literallayout> + </para> + </listitem> + <listitem> + <para> +The second translation is taken only if the button release is not +preceded by a button press or if there are intervening events between the +press and the release. +Be particularly aware of this when using the repeat notation, above, +with buttons and keys, +because their expansion includes additional events; +and when specifying motion events, because they are implicitly included +between any two other events. +In particular, +pointer motion and double-click translations cannot coexist in the same +translation table. + </para> + </listitem> + <listitem> + <para> +For single click on Button1 Up with Shift and Meta, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Shift Meta <Btn1Down>, Shift Meta<Btn1Up>: gyre() +</literallayout> + </para> + </listitem> + <listitem> + <para> +For multiple clicks greater or equal to a minimum number, +a plus sign (+) may be appended to the final (rightmost) +count in an event sequence. The actions will be invoked +on the <emphasis remap='I'>count</emphasis>-th click and each subsequent one arriving +within the multi-click time interval. For example: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Shift <Btn1Up>(2+) : and() +</literallayout> + </para> + </listitem> + <listitem> + <para> +To indicate +<function>EnterNotify</function> +with any modifiers, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +<Enter> : gimble() +</literallayout> + </para> + </listitem> + <listitem> + <para> +To indicate +<function>EnterNotify</function> +with no modifiers, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +None <Enter> : in() +</literallayout> + </para> + </listitem> + <listitem> + <para> +To indicate +<function>EnterNotify</function> +with Button1 Down and Button2 Up and ``don't care'' about +the other modifiers, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +Button1 ~Button2 <Enter> : the() +</literallayout> + </para> + </listitem> + <listitem> + <para> +To indicate +<function>EnterNotify</function> +with Button1 down and Button2 down exclusively, use this specification: + </para> + </listitem> + <listitem> + <para> +<literallayout class="monospaced"> +! Button1 Button2 <Enter> : wabe() +</literallayout> + </para> + </listitem> + <listitem> + <para> +You do not need to use a tilde (~) with an exclamation point (!). + </para> + </listitem> +</itemizedlist> +</chapter> +</book> diff --git a/specs/appC.xml b/specs/appC.xml new file mode 100644 index 0000000..7b8ec9c --- /dev/null +++ b/specs/appC.xml @@ -0,0 +1,2238 @@ +<!-- .\" $Xorg: appC,v 1.3 2000/08/17 19:42:48 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +<!-- .bp --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Appendix C</function>\s-1 + +\s+1<function>Compatibility Functions</function>\s-1 +<!-- .sp 2 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Appendix C \(em Compatibility Functions</function> --> +<!-- .XE --> +<!-- .FS --> +This appendix is part of the formal Intrinsics Specification. +<!-- .FE --> +</para> +<para> +<!-- .LP --> +In prototype versions of the (tk +each widget class +implemented an Xt<\^<emphasis remap='I'>Widget</emphasis>\^>Create (for example, +<function>XtLabelCreate )</function> +function, in which most of the code was identical from widget to widget. +In the (xI, a single generic +<function>XtCreateWidget</function> +performs most of the common work and then calls the initialize procedure +implemented for the particular widget class. +</para> +<para> +<!-- .LP --> +Each Composite class also implemented the procedures +Xt<\^<emphasis remap='I'>Widget</emphasis>\^>Add and an Xt<\^<emphasis remap='I'>Widget</emphasis>\^>Delete (for example, +<function>XtButtonBoxAddButton</function> +and +<function>XtButtonBoxDeleteButton ).</function> +In the (xI, the Composite generic procedures +<function>XtManageChildren</function> +and +<function>XtUnmanageChildren</function> +perform error checking and screening out of certain children. +Then they call the change_managed procedure +implemented for the widget's Composite class. +If the widget's parent has not yet been realized, +the call to the change_managed procedure is delayed until realization time. +</para> +<para> +<!-- .LP --> +Old-style calls can be implemented in the (tk by defining +one-line procedures or macros that invoke a generic routine. For example, +you could define the macro +<function>XtLabelCreate</function> +as: +</para> +<itemizedlist> + <listitem> + <para> +<literallayout class="monospaced"> +<!-- .TA .5i 3i --> +<!-- .ta .5i 3i --> +#define XtLabelCreate(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>parent</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) \\ + ((LabelWidget) XtCreateWidget(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>labelWidgetClass</emphasis>, \ +<emphasis remap='I'>parent</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>)) +</literallayout> +<!-- .sp --> + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Pop-up shells in some of the prototypes automatically performed an +<function>XtManageChild</function> +on their child within their insert_child procedure. +<!-- .IN "insert_child procedure" --> +Creators of pop-up children need to call +<function>XtManageChild</function> +themselves. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<function>XtAppInitialize</function> +and +<function>XtVaAppInitialize</function> +have been replaced by +<function>XtOpenApplication</function> +and +<function>XtVaOpenApplication .</function> +</para> +<para> +<!-- .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 +<function>XtAppInitialize</function> +or +<function>XtVaAppInitialize .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAppInitialize" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtAppInitialize(<emphasis remap='I'>app_context_return</emphasis>, <emphasis remap='I'>application_class</emphasis>, \ +<emphasis remap='I'>options</emphasis>, <emphasis remap='I'>num_options</emphasis>, +<!-- .br --> + <emphasis remap='I'>argc_in_out</emphasis>, <emphasis remap='I'>argv_in_out</emphasis>, \ +<emphasis remap='I'>fallback_resources</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + XtAppContext *<emphasis remap='I'>app_context_return</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescList <emphasis remap='I'>options</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>argv_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>fallback_resources</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context_return</emphasis> + </term> + <listitem> + <para> +Returns the application context, if non-NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies the command line options table. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>options</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the command line arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>fallback_resources</emphasis> + </term> + <listitem> + <para> +Specifies resource values to be used if the application class resource +file cannot be opened or read, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any +other resource specifications for the created shell widget. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the argument list. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAppInitialize</function> +function calls +<function>XtToolkitInitialize</function> +followed by +<function>XtCreateApplicationContext ,</function> +then calls +<function>XtOpenDisplay</function> +with <emphasis remap='I'>display_string</emphasis> NULL and +<emphasis remap='I'>application_name</emphasis> NULL, and finally calls +<function>XtAppCreateShell</function> +with <emphasis remap='I'>application_name</emphasis> NULL, <emphasis remap='I'>widget_class</emphasis> +<function>application\%Shell\%Widget\%Class ,</function> +and the specified <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> +and returns the created shell. The modified <emphasis remap='I'>argc</emphasis> and <emphasis remap='I'>argv</emphasis> returned by +<function>XtDisplayInitialize</function> +are returned in <emphasis remap='I'>argc_in_out</emphasis> and <emphasis remap='I'>argv_in_out</emphasis>. If +<emphasis remap='I'>app_context_return</emphasis> 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 +<function>XtAppInitialize</function> +terminates the application. If <emphasis remap='I'>fallback_resources</emphasis> is non-NULL, +<function>XtAppSetFallbackResources</function> +is called with the value prior to calling +<function>XtOpenDisplay .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtVaAppInitialize" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtVaAppInitialize(<emphasis remap='I'>app_context_return</emphasis>, <emphasis remap='I'>application_class</emphasis>, \ +<emphasis remap='I'>options</emphasis>, <emphasis remap='I'>num_options</emphasis>, +<!-- .br --> + <emphasis remap='I'>argc_in_out</emphasis>, <emphasis remap='I'>argv_in_out</emphasis>, \ +<emphasis remap='I'>fallback_resources</emphasis>, ...) +<!-- .br --> + XtAppContext *<emphasis remap='I'>app_context_return</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescList <emphasis remap='I'>options</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>argv_in_out</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>fallback_resources</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context_return</emphasis> + </term> + <listitem> + <para> +Returns the application context, if non-NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of the application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies the command line options table. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>options</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc_in_out</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line arguments. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv_in_out</emphasis> + </term> + <listitem> + <para> +Specifies the command line arguments array. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>fallback_resources</emphasis> + </term> + <listitem> + <para> +Specifies resource values to be used if the application class +resource file cannot be opened, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + ... + </term> + <listitem> + <para> +Specifies the variable argument list to override any other +resource specifications for the created shell. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtVaAppInitialize</function> +procedure is identical in function to +<function>XtAppInitialize</function> +with the <emphasis remap='I'>args</emphasis> and <emphasis remap='I'>num_args</emphasis> parameters replaced by a varargs list, +as described +in Section 2.5.1. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +As a convenience to people converting from earlier versions of the toolkit +without application contexts, the following routines exist: +<function>XtInitialize ,</function> +<function>XtMainLoop ,</function> +<function>XtNextEvent ,</function> +<function>XtProcessEvent ,</function> +<function>XtPeekEvent ,</function> +<function>XtPending ,</function> +<function>XtAddInput ,</function> +<function>XtAddTimeOut ,</function> +<function>XtAddWorkProc ,</function> +<function>XtCreateApplicationShell ,</function> +<function>XtAddActions ,</function> +<function>XtSetSelectionTimeout ,</function> +and +<function>XtGetSelectionTimeout .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtInitialize" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtInitialize(<emphasis remap='I'>shell_name</emphasis>, <emphasis remap='I'>application_class</emphasis>, <emphasis remap='I'>options</emphasis>, \ +<emphasis remap='I'>num_options</emphasis>, <emphasis remap='I'>argc</emphasis>, <emphasis remap='I'>argv</emphasis>) +<!-- .br --> + String <emphasis remap='I'>shell_name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>application_class</emphasis>; +<!-- .br --> + XrmOptionDescRec <emphasis remap='I'>options</emphasis>[]; +<!-- .br --> + Cardinal <emphasis remap='I'>num_options</emphasis>; +<!-- .br --> + int *<emphasis remap='I'>argc</emphasis>; +<!-- .br --> + String <emphasis remap='I'>argv</emphasis>[]; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>shell_name</emphasis> + </term> + <listitem> + <para> +This parameter is ignored; therefore, you can specify NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>application_class</emphasis> + </term> + <listitem> + <para> +Specifies the class name of this application. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>options</emphasis> + </term> + <listitem> + <para> +Specifies how to parse the command line for any application-specific resources. +The <emphasis remap='I'>options</emphasis> argument is passed as a parameter to +<function>XrmParseCommand .</function> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_options</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in the options list. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argc</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to the number of command line parameters. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>argv</emphasis> + </term> + <listitem> + <para> +Specifies the command line parameters. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtInitialize</function> +calls +<function>XtToolkitInitialize</function> +to initialize the toolkit internals, +creates a default application context for use by the other convenience +routines, calls +<function>XtOpenDisplay</function> +with <emphasis remap='I'>display_string</emphasis> NULL and <emphasis remap='I'>application_name</emphasis> NULL, and +finally calls +<function>XtAppCreateShell</function> +with <emphasis remap='I'>application_name</emphasis> NULL and +returns the created shell. +The semantics of calling +<function>XtInitialize</function> +more than once are undefined. +This routine has been replaced by +<function>XtOpenApplication .</function> +<!-- .sp --> +<!-- .IN "XtMainLoop" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtMainLoop(void) +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtMainLoop</function> +first reads the next alternate input, timer, or X event by calling +<function>XtNextEvent .</function> +Then it dispatches this to the appropriate registered procedure by calling +<function>XtDispatchEvent .</function> +This routine has been replaced by +<function>XtAppMainLoop .</function> +<!-- .sp --> +<!-- .IN "XtNextEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtNextEvent(<emphasis remap='I'>event_return</emphasis>) +<!-- .br --> + XEvent *<emphasis remap='I'>event_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>event_return</emphasis> + </term> + <listitem> + <para> +Returns the event information to the specified event structure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If no input is on the X input queue for the default application context, +<function>XtNextEvent</function> +flushes the X output buffer +and waits for an event while looking at the alternate input sources +and timeout values and calling any callback procedures triggered by them. +This routine has been replaced by +<function>XtAppNextEvent .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +<!-- .IN "XtProcessEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtProcessEvent(<emphasis remap='I'>mask</emphasis>) +<!-- .br --> + XtInputMask <emphasis remap='I'>mask</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>mask</emphasis> + </term> + <listitem> + <para> +Specifies the type of input to process. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtProcessEvent</function> +processes one X event, timeout, or alternate input source +(depending on the value of <emphasis remap='I'>mask</emphasis>), blocking if necessary. +It has been replaced by +<function>XtAppProcessEvent .</function> +<function>XtInitialize</function> +must be called before using this function. +<!-- .sp --> +<!-- .IN "XtPeekEvent" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtPeekEvent(<emphasis remap='I'>event_return</emphasis>) +<!-- .br --> + XEvent *<emphasis remap='I'>event_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>event_return</emphasis> + </term> + <listitem> + <para> +Returns the event information to the specified event structure. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If there is an event in the queue for the default application context, +<function>XtPeekEvent</function> +fills in the event and returns a nonzero value. +If no X input is on the queue, +<function>XtPeekEvent</function> +flushes the output buffer and blocks until input is available, possibly +calling some timeout callbacks in the process. +If the input is an event, +<function>XtPeekEvent</function> +fills in the event and returns a nonzero value. +Otherwise, the input is for an alternate input source, and +<function>XtPeekEvent</function> +returns zero. +This routine has been replaced by +<function>XtAppPeekEvent .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +<!-- .IN "XtPending" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Boolean XtPending() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtPending</function> +returns a nonzero value if there are +events pending from the X server or alternate input sources in the default +application context. +If there are no events pending, +it flushes the output buffer and returns a zero value. +It has been replaced by +<function>XtAppPending .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +<!-- .IN "XtAddInput" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtInputId XtAddInput(<emphasis remap='I'>source</emphasis>, <emphasis remap='I'>condition</emphasis>, <emphasis remap='I'>proc</emphasis>, \ +<emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + int <emphasis remap='I'>source</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>condition</emphasis>; +<!-- .br --> + XtInputCallbackProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>source</emphasis> + </term> + <listitem> + <para> +Specifies the source file descriptor on a POSIX-based system +or other operating-system-dependent device specification. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>condition</emphasis> + </term> + <listitem> + <para> +Specifies the mask that indicates either a read, write, or exception condition +or some operating-system-dependent condition. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure called when input is available. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the parameter to be passed to <emphasis remap='I'>proc</emphasis> when input is available. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAddInput</function> +function registers in the default application context a new +source of events, +which is usually file input but can also be file output. +(The word <emphasis remap='I'>file</emphasis> should be loosely interpreted to mean any sink +or source of data.) +<function>XtAddInput</function> +also specifies the conditions under which the source can generate events. +When input is pending on this source in the default application context, +the callback procedure is called. +This routine has been replaced by +<function>XtAppAddInput .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +<!-- .IN "XtAddTimeOut" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtIntervalId XtAddTimeOut(<emphasis remap='I'>interval</emphasis>, <emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + unsigned long <emphasis remap='I'>interval</emphasis>; +<!-- .br --> + XtTimerCallbackProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>interval</emphasis> + </term> + <listitem> + <para> +Specifies the time interval in milliseconds. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Specifies the procedure to be called when time expires. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Specifies the parameter to be passed to <emphasis remap='I'>proc</emphasis> when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtAddTimeOut</function> +function creates a timeout in the default application context +and returns an identifier for it. +The timeout value is set to <emphasis remap='I'>interval</emphasis>. +The callback procedure will be called after +the time interval elapses, after which the timeout is removed. +This routine has been replaced by +<function>XtAppAddTimeOut .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +<!-- .IN "XtAddWorkProc" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XtWorkProcId XtAddWorkProc(<emphasis remap='I'>proc</emphasis>, <emphasis remap='I'>client_data</emphasis>) +<!-- .br --> + XtWorkProc <emphasis remap='I'>proc</emphasis>; +<!-- .br --> + XtPointer <emphasis remap='I'>client_data</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>proc</emphasis> + </term> + <listitem> + <para> +Procedure to call to do the work. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>client_data</emphasis> + </term> + <listitem> + <para> +Client data to pass to <emphasis remap='I'>proc</emphasis> when it is called. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This routine registers a work procedure in the default application context. It has +been replaced by +<function>XtAppAddWorkProc .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +<!-- .IN "XtCreateApplicationShell" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +Widget XtCreateApplicationShell(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>widget_class</emphasis>, <emphasis remap='I'>args</emphasis>, \ +<emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + WidgetClass <emphasis remap='I'>widget_class</emphasis>; +<!-- .br --> + ArgList <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +This parameter is ignored; therefore, you can specify NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>widget_class</emphasis> + </term> + <listitem> + <para> +Specifies the widget class pointer for the created application shell widget. +This will usually be +<function>topLevelShellWidgetClass</function> +or a subclass thereof. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list to override any other resource specifications. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>args</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The procedure +<function>XtCreateApplicationShell</function> +calls +<function>XtAppCreateShell</function> +with <emphasis remap='I'>application_name</emphasis> NULL, the application class passed to +<function>XtInitialize ,</function> +and the default application context created by +<function>XtInitialize .</function> +This routine has been replaced by +<function>XtAppCreateShell .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +An old-format resource type converter procedure pointer is of type +<function>XtConverter .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConverter" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +typedef void (*XtConverter)(XrmValue*, Cardinal*, XrmValue*, XrmValue*); +<!-- .br --> + XrmValue *<emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>from</emphasis>; +<!-- .br --> + XrmValue *<emphasis remap='I'>to</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies a list of additional +<function>XrmValue</function> +arguments to the converter if additional context is needed +to perform the conversion, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>args</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from</emphasis> + </term> + <listitem> + <para> +Specifies the value to convert. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to</emphasis> + </term> + <listitem> + <para> +Specifies the descriptor to use to return the converted value. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Type converters should perform the following actions: +</para> +<itemizedlist> + <listitem> + <para> +Check to see that the number of arguments passed is correct. + </para> + </listitem> + <listitem> + <para> +Attempt the type conversion. + </para> + </listitem> + <listitem> + <para> +If successful, return the size and pointer to the data in the <emphasis remap='I'>to</emphasis> argument; +otherwise, call +<function>XtWarningMsg</function> +and return without modifying the <emphasis remap='I'>to</emphasis> argument. + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +Most type converters just take the data described by the specified <emphasis remap='I'>from</emphasis> +argument and return data by writing into the specified <emphasis remap='I'>to</emphasis> argument. +A few need other information, which is available in the specified +argument list. +A type converter can invoke another type converter, +which allows differing sources that may convert into a common intermediate +result to make maximum use of the type converter cache. +</para> +<para> +<!-- .LP --> +Note that the address returned in <emphasis remap='I'>to->addr</emphasis> cannot be that of a local variable of +the converter because this is not valid after the converter returns. +It should be a pointer to a static variable. +</para> +<para> +<!-- .LP --> +The procedure type +<function>XtConverter</function> +has been replaced by +<function>XtTypeConverter .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +The +<function>XtStringConversionWarning</function> +<!-- .IN "XtStringConversionWarning" "" "@DEF@" --> +function is a convenience routine for old-format resource converters +that convert from strings. +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtStringConversionWarning(<emphasis remap='I'>src</emphasis>, <emphasis remap='I'>dst_type</emphasis>) +<!-- .br --> + String <emphasis remap='I'>src</emphasis>, <emphasis remap='I'>dst_type</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>src</emphasis> + </term> + <listitem> + <para> +Specifies the string that could not be converted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>dst_type</emphasis> + </term> + <listitem> + <para> +Specifies the name of the type to which the string could not be converted. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtStringConversionWarning</function> +function issues a warning message with name ``conversionError'', +type ``string'', class ``XtToolkitError, and the default message string +``Cannot convert "<emphasis remap='I'>src</emphasis>" to type <emphasis remap='I'>dst_type</emphasis>''. This routine +has been superseded by +<function>XtDisplayStringConversionWarning .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register an old-format converter, use +<function>XtAddConverter</function> +<!-- .IN "XtAddConverter" "" "@DEF@" --> +or +<function>XtAppAddConverter .</function> +<!-- .IN "XtAppAddConverter" "" "@DEF@" --> +</para> +<para> +<!-- .LP --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddConverter(<emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>to_type</emphasis>, <emphasis remap='I'>converter</emphasis>, \ +<emphasis remap='I'>convert_args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + String <emphasis remap='I'>from_type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>to_type</emphasis>; +<!-- .br --> + XtConverter <emphasis remap='I'>converter</emphasis>; +<!-- .br --> + XtConvertArgList <emphasis remap='I'>convert_args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>from_type</emphasis> + </term> + <listitem> + <para> +Specifies the source type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the destination type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter</emphasis> + </term> + <listitem> + <para> +Specifies the type converter procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>convert_args</emphasis> + </term> + <listitem> + <para> +Specifies how to compute the additional arguments to the converter, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>convert_args</emphasis>. +<!-- .sp --> + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAddConverter</function> +is equivalent in function to +<function>XtSetTypeConverter</function> +with <emphasis remap='I'>cache_type</emphasis> equal to +<function>XtCacheAll</function> +for old-format type converters. It has been superseded by +<function>XtSetTypeConverter .</function> +<!-- .sp --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAppAddConverter(<emphasis remap='I'>app_context</emphasis>, <emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>to_type</emphasis>, \ +<emphasis remap='I'>converter</emphasis>, <emphasis remap='I'>convert_args</emphasis>, <emphasis remap='I'>num_args</emphasis>) +<!-- .br --> + XtAppContext <emphasis remap='I'>app_context</emphasis>; +<!-- .br --> + String <emphasis remap='I'>from_type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>to_type</emphasis>; +<!-- .br --> + XtConverter <emphasis remap='I'>converter</emphasis>; +<!-- .br --> + XtConvertArgList <emphasis remap='I'>convert_args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>app_context</emphasis> + </term> + <listitem> + <para> +Specifies the application context. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from_type</emphasis> + </term> + <listitem> + <para> +Specifies the source type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the destination type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>converter</emphasis> + </term> + <listitem> + <para> +Specifies the type converter procedure. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>convert_args</emphasis> + </term> + <listitem> + <para> +Specifies how to compute the additional arguments to the converter, or NULL. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>convert_args</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<function>XtAppAddConverter</function> +is equivalent in function to +<function>XtAppSetTypeConverter</function> +with <emphasis remap='I'>cache_type</emphasis> equal to +<function>XtCacheAll</function> +for old-format type converters. It has been superseded by +<function>XtAppSetTypeConverter .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To invoke resource conversions, a client may use +<function>XtConvert</function> +or, for old-format converters only, +<function>XtDirectConvert .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtConvert" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtConvert(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>from</emphasis>, <emphasis remap='I'>to_type</emphasis>, \ +<emphasis remap='I'>to_return</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + String <emphasis remap='I'>from_type</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>from</emphasis>; +<!-- .br --> + String <emphasis remap='I'>to_type</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>to_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies the widget to use for additional arguments, if any are +needed. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from_type</emphasis> + </term> + <listitem> + <para> +Specifies the source type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from</emphasis> + </term> + <listitem> + <para> +Specifies the value to be converted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_type</emphasis> + </term> + <listitem> + <para> +Specifies the destination type. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_return</emphasis> + </term> + <listitem> + <para> +Returns the converted value. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .IN "XtDirectConvert" "" "@DEF@" --> +</para> +<!-- .FD 0 --> +void XtDirectConvert(<emphasis remap='I'>converter</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>, <emphasis remap='I'>from</emphasis>, \ +<emphasis remap='I'>to_return</emphasis>) +<!-- .br --> + XtConverter <emphasis remap='I'>converter</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>args</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_args</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>from</emphasis>; +<!-- .br --> + XrmValuePtr <emphasis remap='I'>to_return</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>converter</emphasis> + </term> + <listitem> + <para> +Specifies the conversion procedure to be called. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>args</emphasis> + </term> + <listitem> + <para> +Specifies the argument list that contains the additional arguments +needed to perform the conversion (often NULL). + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_args</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>args</emphasis>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>from</emphasis> + </term> + <listitem> + <para> +Specifies the value to be converted. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>to_return</emphasis> + </term> + <listitem> + <para> +Returns the converted value. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtConvert</function> +function looks up the type converter registered to convert <emphasis remap='I'>from_type</emphasis> +to <emphasis remap='I'>to_type</emphasis>, computes any additional arguments needed, and then calls +<function>XtDirectConvert</function> +or +<function>XtCallConverter .</function> +The +<function>XtDirectConvert</function> +function looks in the converter cache to see if this conversion procedure +has been called with the specified arguments. +If so, it returns a descriptor for information stored in the cache; +otherwise, it calls the converter and enters the result in the cache. +</para> +<para> +<!-- .LP --> +Before calling the specified converter, +<function>XtDirectConvert</function> +sets the return value size to zero and the return value address to NULL. +To determine if the conversion was successful, +the client should check <emphasis remap='I'>to_return.addr</emphasis> for non-NULL. +The data returned by +<function>XtConvert</function> +must be copied immediately by the caller, +as it may point to static data in the type converter. +</para> +<para> +<!-- .LP --> +<function>XtConvert</function> +has been replaced by +<function>XtConvertAndStore ,</function> +and +<function>XtDirectConvert</function> +has been superseded by +<function>XtCallConverter .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To deallocate a shared GC when it is no longer needed, use +<function>XtDestroyGC .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtDestroyGC" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtDestroyGC(<emphasis remap='I'>w</emphasis>, <emphasis remap='I'>gc</emphasis>) +<!-- .br --> + Widget <emphasis remap='I'>w</emphasis>; +<!-- .br --> + GC <emphasis remap='I'>gc</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>w</emphasis> + </term> + <listitem> + <para> +Specifies any object on the display for which the shared GC was +created. (oI + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>gc</emphasis> + </term> + <listitem> + <para> +Specifies the shared GC to be deallocated. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +References to sharable GCs are counted and a free request is generated to the +server when the last user of a given GC destroys it. +Note that some earlier versions of +<function>XtDestroyGC</function> +had only a <emphasis remap='I'>gc</emphasis> argument. +Therefore, this function is not very portable, +and you are encouraged to use +<function>XtReleaseGC</function> +instead. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To declare an action table in the default application context +and register it with the translation manager, use +<function>XtAddActions .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtAddActions" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtAddActions(<emphasis remap='I'>actions</emphasis>, <emphasis remap='I'>num_actions</emphasis>) +<!-- .br --> + XtActionList <emphasis remap='I'>actions</emphasis>; +<!-- .br --> + Cardinal <emphasis remap='I'>num_actions</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>actions</emphasis> + </term> + <listitem> + <para> +Specifies the action table to register. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_actions</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>actions</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +If more than one action is registered with the same name, +the most recently registered action is used. +If duplicate actions exist in an action table, +the first is used. +The (xI register an action table for +<function>XtMenuPopup</function> +and +<function>XtMenuPopdown</function> +as part of (tk initialization. +This routine has been replaced by +<function>XtAppAddActions .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To set the (xI selection timeout in the default application context, use +<function>XtSetSelectionTimeout .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetSelectionTimeout" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetSelectionTimeout(<emphasis remap='I'>timeout</emphasis>) +<!-- .br --> + unsigned long <emphasis remap='I'>timeout</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>timeout</emphasis> + </term> + <listitem> + <para> +Specifies the selection timeout in milliseconds. +This routine has been replaced by +<function>XtAppSetSelectionTimeout .</function> +<function>XtInitialize</function> +must be called before using this routine. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To get the current selection timeout value in the default application +context, use +<function>XtGetSelectionTimeout .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetSelectionTimeout" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +unsigned long XtGetSelectionTimeout() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +The selection timeout is the time within which the two communicating +applications must respond to one another. +If one of them does not respond within this interval, +the (xI abort the selection request. +</para> +<para> +<!-- .LP --> +This routine has been replaced by +<function>XtAppGetSelectionTimeout .</function> +<function>XtInitialize</function> +must be called before using this routine. +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To obtain the global error database (for example, to merge with +an application- or widget-specific database), use +<function>XtGetErrorDatabase .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetErrorDatabase" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +XrmDatabase *XtGetErrorDatabase() +<!-- .FN --> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetErrorDatabase</function> +function returns the address of the error database. +The (xI do a lazy binding of the error database and do not merge in the +database file until the first call to +<function>XtGetErrorDatbaseText .</function> +This routine has been replaced by +<function>XtAppGetErrorDatabase .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +An error message handler can obtain the error database text for an +error or a warning by calling +<function>XtGetErrorDatabaseText .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtGetErrorDatabaseText" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtGetErrorDatabaseText(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>, \ +<emphasis remap='I'>default</emphasis>, <emphasis remap='I'>buffer_return</emphasis>, <emphasis remap='I'>nbytes</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>default</emphasis>; +<!-- .br --> + String <emphasis remap='I'>buffer_return</emphasis>; +<!-- .br --> + int <emphasis remap='I'>nbytes</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +<!-- .br --> +<!-- .ns --> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specify the name and type that are concatenated to form the resource name +of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class of the error message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>default</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if an error database entry is not found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>buffer_return</emphasis> + </term> + <listitem> + <para> +Specifies the buffer into which the error message is to be returned. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>nbytes</emphasis> + </term> + <listitem> + <para> +Specifies the size of the buffer in bytes. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The +<function>XtGetErrorDatabaseText</function> +returns the appropriate message from the error database +associated with the default application context +or returns the specified default message if one is not found in the +error database. +To form the full resource name and class when querying the database, +the <emphasis remap='I'>name</emphasis> and <emphasis remap='I'>type</emphasis> are concatenated with a single ``.'' +between them and the <emphasis remap='I'>class</emphasis> is concatenated with itself with a +single ``.'' if it does not already contain a ``.''. +This routine has been superseded by +<function>XtAppGetErrorDatabaseText .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on fatal error conditions, use +<function>XtSetErrorMsgHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetErrorMsgHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetErrorMsgHandler(<emphasis remap='I'>msg_handler</emphasis>) +<!-- .br --> + XtErrorMsgHandler <emphasis remap='I'>msg_handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>msg_handler</emphasis> + </term> + <listitem> + <para> +Specifies the new fatal error procedure, which should not return. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The default error handler provided by the (xI constructs a +string from the error resource database and calls +<function>XtError .</function> +Fatal error message handlers should not return. +If one does, +subsequent (xI behavior is undefined. +This routine has been superseded by +<function>XtAppSetErrorMsgHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the high-level error handler, use +<function>XtErrorMsg .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtErrorMsg" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtErrorMsg(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>, <emphasis remap='I'>default</emphasis>, \ +<emphasis remap='I'>params</emphasis>, <emphasis remap='I'>num_params</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>default</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the general kind of error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the detailed name of the error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>default</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if an error database entry is not found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to a list of values to be stored in the message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This routine has been superseded by +<function>XtAppErrorMsg .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on nonfatal error conditions, use +<function>XtSetWarningMsgHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetWarningMsgHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetWarningMsgHandler(<emphasis remap='I'>msg_handler</emphasis>) +<!-- .br --> + XtErrorMsgHandler <emphasis remap='I'>msg_handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>msg_handler</emphasis> + </term> + <listitem> + <para> +Specifies the new nonfatal error procedure, which usually returns. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The default warning handler provided by the (xI constructs a string +from the error resource database and calls +<function>XtWarning .</function> +This routine has been superseded by +<function>XtAppSetWarningMsgHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the installed high-level warning handler, use +<function>XtWarningMsg .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWarningMsg" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtWarningMsg(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>class</emphasis>, <emphasis remap='I'>default</emphasis>, \ +<emphasis remap='I'>params</emphasis>, <emphasis remap='I'>num_params</emphasis>) +<!-- .br --> + String <emphasis remap='I'>name</emphasis>; +<!-- .br --> + String <emphasis remap='I'>type</emphasis>; +<!-- .br --> + String <emphasis remap='I'>class</emphasis>; +<!-- .br --> + String <emphasis remap='I'>default</emphasis>; +<!-- .br --> + String *<emphasis remap='I'>params</emphasis>; +<!-- .br --> + Cardinal *<emphasis remap='I'>num_params</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>name</emphasis> + </term> + <listitem> + <para> +Specifies the general kind of error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>type</emphasis> + </term> + <listitem> + <para> +Specifies the detailed name of the error. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>class</emphasis> + </term> + <listitem> + <para> +Specifies the resource class. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>default</emphasis> + </term> + <listitem> + <para> +Specifies the default message to use if an error database entry is not found. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>params</emphasis> + </term> + <listitem> + <para> +Specifies a pointer to a list of values to be stored in the message. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis remap='I'>num_params</emphasis> + </term> + <listitem> + <para> +Specifies the number of entries in <emphasis remap='I'>params</emphasis>. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +This routine has been superseded by +<function>XtAppWarningMsg .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on fatal error conditions, use +<function>XtSetErrorHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetErrorHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetErrorHandler(<emphasis remap='I'>handler</emphasis>) +<!-- .br --> + XtErrorHandler <emphasis remap='I'>handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>handler</emphasis> + </term> + <listitem> + <para> +Specifies the new fatal error procedure, which should not return. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The default error handler provided by the (xI is +<function>_XtError .</function> +On POSIX-based systems, +it prints the message to standard error and terminates the application. +Fatal error message handlers should not return. +If one does, +subsequent (tk behavior is undefined. +This routine has been superseded by +<function>XtAppSetErrorHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the installed fatal error procedure, use +<function>XtError .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtError" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtError(<emphasis remap='I'>message</emphasis>) +<!-- .br --> + String <emphasis remap='I'>message</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>message</emphasis> + </term> + <listitem> + <para> +Specifies the message to be reported. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Most programs should use +<function>XtAppErrorMsg ,</function> +not +<function>XtError ,</function> +to provide for customization and internationalization of error +messages. This routine has been superseded by +<function>XtAppError .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To register a procedure to be called on nonfatal error conditions, use +<function>XtSetWarningHandler .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtSetWarningHandler" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtSetWarningHandler(<emphasis remap='I'>handler</emphasis>) +<!-- .br --> + XtErrorHandler <emphasis remap='I'>handler</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>handler</emphasis> + </term> + <listitem> + <para> +Specifies the new nonfatal error procedure, which usually returns. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +The default warning handler provided by the (xI is +<function>_XtWarning .</function> +On POSIX-based systems, +it prints the message to standard error and returns to the caller. +This routine has been superseded by +<function>XtAppSetWarningHandler .</function> +<!-- .sp --> +</para> +<para> +<!-- .LP --> +To call the installed nonfatal error procedure, use +<function>XtWarning .</function> +</para> +<para> +<!-- .LP --> +<!-- .IN "XtWarning" "" "@DEF@" --> +<!-- .sM --> +</para> +<!-- .FD 0 --> +void XtWarning(<emphasis remap='I'>message</emphasis>) +<!-- .br --> + String <emphasis remap='I'>message</emphasis>; +<!-- .FN --> +<variablelist> + <varlistentry> + <term> + <emphasis remap='I'>message</emphasis> + </term> + <listitem> + <para> +Specifies the nonfatal error message to be reported. + </para> + </listitem> + </varlistentry> +</variablelist> +<para> +<!-- .LP --> +<!-- .eM --> +Most programs should use +<function>XtAppWarningMsg ,</function> +not +<function>XtWarning ,</function> +to provide for customization and internationalization of warning messages. +This routine has been superseded by +<function>XtAppWarning .</function> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</para> +</chapter> +</book> diff --git a/specs/appD.xml b/specs/appD.xml new file mode 100644 index 0000000..21b0a94 --- /dev/null +++ b/specs/appD.xml @@ -0,0 +1,1997 @@ +<!-- .\" $Xorg: appD,v 1.3 2000/08/17 19:42:48 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +<!-- .bp --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Appendix D</function>\s-1 + +\s+1<function>Intrinsics Error Messages</function>\s-1 +<!-- .sp 2 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Appendix D \(em Intrinsics Error Messages</function> --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +All (xI errors and warnings have class +``XtToolkitError''. +The following two tables summarize the common errors and warnings that can be +generated by the (xI. +Additional implementation-dependent messages are permitted. +<!-- .SH --> +Error Messages +</para> +<para> +<!-- .LP --> +<!-- .ps 9 --> +<!-- .nr PS 9 --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.3i) lw(1.4i) lw(2.9i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Type</entry> + <entry>Default Message</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>allocError</entry> + <entry>calloc</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot perform calloc</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>allocError</entry> + <entry>malloc</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot perform malloc</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>allocError</entry> + <entry>realloc</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot perform realloc</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>internalError</entry> + <entry>xtMakeGeometryRequest</entry> + <entry>T{</entry> + </row> + <row> + <entry>internal error; ShellClassExtension is NULL</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidArgCount</entry> + <entry>xtGetValues</entry> + <entry>T{</entry> + </row> + <row> + <entry>Argument count > 0 on NULL argument list in XtGetValues</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidArgCount</entry> + <entry>xtSetValues</entry> + <entry>T{</entry> + </row> + <row> + <entry>Argument count > 0 on NULL argument list in XtSetValues</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>applicationShellInsertChild</entry> + <entry>T{</entry> + </row> + <row> + <entry>ApplicationShell does not accept RectObj children; ignored</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>constraintSetValue</entry> + <entry>T{</entry> + </row> + <row> + <entry>Subclass of Constraint required in CallConstraintSetValues</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>xtAppCreateShell</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtAppCreateShell requires non-NULL widget class</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>xtCreatePopupShell</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtCreatePopupShell requires non-NULL widget class</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>xtCreateWidget</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtCreateWidget requires non-NULL widget class</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>xtPopdown</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtPopdown requires a subclass of shellWidgetClass</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidClass</entry> + <entry>xtPopup</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtPopup requires a subclass of shellWidgetClass</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidDimension</entry> + <entry>xtCreateWindow</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget %s has zero width and/or height</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidDimension</entry> + <entry>shellRealize</entry> + <entry>T{</entry> + </row> + <row> + <entry>Shell widget %s has zero width and/or height</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidDisplay</entry> + <entry>xtInitialize</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't open display: %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidGetValues</entry> + <entry>xtGetValues</entry> + <entry>T{</entry> + </row> + <row> + <entry>NULL ArgVal in XtGetValues</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidExtension</entry> + <entry>shellClassPartInitialize</entry> + <entry>T{</entry> + </row> + <row> + <entry>widget class %s has invalid ShellClassExtension record</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidExtension</entry> + <entry>xtMakeGeometryRequest</entry> + <entry>T{</entry> + </row> + <row> + <entry>widget class %s has invalid ShellClassExtension record</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidGeometryManager</entry> + <entry>xtMakeGeometryRequest</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtMakeGeometryRequest - parent has no geometry manager</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParameter</entry> + <entry>xtAddInput</entry> + <entry>T{</entry> + </row> + <row> + <entry>invalid condition passed to XtAddInput</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParameter</entry> + <entry>xtAddInput</entry> + <entry>T{</entry> + </row> + <row> + <entry>invalid condition passed to XtAppAddInput</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtChangeManagedSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>Attempt to manage a child when parent is not Composite</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtChangeManagedSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>Attempt to unmanage a child when parent is not Composite</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtCreatePopupShell</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtCreatePopupShell requires non-NULL parent</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtCreateWidget</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtCreateWidget requires non-NULL parent</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtMakeGeometryRequest</entry> + <entry>T{</entry> + </row> + <row> + <entry>non-shell has no parent in XtMakeGeometryRequest</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtMakeGeometryRequest</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtMakeGeometryRequest - parent not composite</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtManageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>Attempt to manage a child when parent is not Composite</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtUnmanageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>Attempt to unmanage a child when parent is not Composite</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidProcedure</entry> + <entry>inheritanceProc</entry> + <entry>T{</entry> + </row> + <row> + <entry>Unresolved inheritance operation</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidProcedure</entry> + <entry>realizeProc</entry> + <entry>T{</entry> + </row> + <row> + <entry>No realize class procedure defined</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidWindow</entry> + <entry>eventHandler</entry> + <entry>T{</entry> + </row> + <row> + <entry>Event with wrong window</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>missingWidget</entry> + <entry>fetchDisplayArg</entry> + <entry>T{</entry> + </row> + <row> + <entry>FetchDisplayArg called without a widget to reference</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>nonWidget</entry> + <entry>xtCreateWidget</entry> + <entry>T{</entry> + </row> + <row> + <entry>attempt to add non-widget child "%s" to parent "%s" which supports only widgets</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noPerDisplay</entry> + <entry>closeDisplay</entry> + <entry>T{</entry> + </row> + <row> + <entry>Couldn't find per display information</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noPerDisplay</entry> + <entry>getPerDisplay</entry> + <entry>T{</entry> + </row> + <row> + <entry>Couldn't find per display information</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noSelectionProperties</entry> + <entry>freeSelectionProperty</entry> + <entry>T{</entry> + </row> + <row> + <entry>internal error: no selection property context for display</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noWidgetAncestor</entry> + <entry>windowedAncestor</entry> + <entry>T{</entry> + </row> + <row> + <entry>Object "%s" does not have windowed ancestor</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>nullDisplay</entry> + <entry>xtRegisterExtensionSelector</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtRegisterExtensionSelector requires a non-NULL display</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>nullProc</entry> + <entry>insertChild</entry> + <entry>T{</entry> + </row> + <row> + <entry>"%s" parent has NULL insert_child method</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>r2versionMismatch</entry> + <entry>widget</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget class %s must be re-compiled.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>R3versionMismatch</entry> + <entry>widget</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget class %s must be re-compiled.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>R4orR5versionMismatch</entry> + <entry>widget</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget class %s must be re-compiled.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>rangeError</entry> + <entry>xtRegisterExtensionSelector</entry> + <entry>T{</entry> + </row> + <row> + <entry>Attempt to register multiple selectors for one extension event type</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>sessionManagement</entry> + <entry>SmcOpenConnection</entry> + <entry>T{</entry> + </row> + <row> + <entry>Tried to connect to session manager, %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>subclassMismatch</entry> + <entry>xtCheckSubclass</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget class %s found when subclass of %s expected: %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .ps 11 --> +<!-- .nr PS 11 --> +<!-- .SH --> +Warning Messages +</para> +<para> +<!-- .LP --> +<!-- .ps 9 --> +<!-- .nr PS 9 --> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.3i) lw(1.4i) lw(2.9i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Name</entry> + <entry>Type</entry> + <entry>Default Message</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>ambiguousParent</entry> + <entry>xtChangeManagedSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>Not all children have same parent</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>ambiguousParent</entry> + <entry>xtManageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>Not all children have same parent in XtManageChildren</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>ambiguousParent</entry> + <entry>xtUnmanageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>Not all children have same parent in XtUnmanageChildren</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>badFormat</entry> + <entry>xtGetSelectionValue</entry> + <entry>T{</entry> + </row> + <row> + <entry>Selection owner returned type INCR property with format != 32</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>badGeometry</entry> + <entry>shellRealize</entry> + <entry>T{</entry> + </row> + <row> + <entry>Shell widget "%s" has an invalid geometry specification: "%s"</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>badValue</entry> + <entry>cvtStringToPixel</entry> + <entry>T{</entry> + </row> + <row> + <entry>Color name "%s" is not defined</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>communicationError</entry> + <entry>select</entry> + <entry>T{</entry> + </row> + <row> + <entry>Select failed; error code %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>conversionError</entry> + <entry>string</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot convert string "%s" to type %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>conversionError</entry> + <entry>stringToVisual</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find Visual of class %s for display %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>conversionFailed</entry> + <entry>xtConvertVarToArgList</entry> + <entry>T{</entry> + </row> + <row> + <entry>Type conversion failed</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>conversionFailed</entry> + <entry>xtGetTypedArg</entry> + <entry>T{</entry> + </row> + <row> + <entry>Type conversion (%s to %s) failed for widget '%s'</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>displayError</entry> + <entry>invalidDisplay</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't find display structure</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>grabError</entry> + <entry>xtAddGrab</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtAddGrab requires exclusive grab if spring_loaded is TRUE</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>grabError</entry> + <entry>xtRemoveGrab</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtRemoveGrab asked to remove a widget not on the list</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.3i) lw(1.4i) lw(2.9i).</entry> + </row> + <row> + <entry>initializationError</entry> + <entry>xtInitialize</entry> + <entry>T{</entry> + </row> + <row> + <entry>Initializing Resource Lists twice</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>insufficientSpace</entry> + <entry>xtGetTypedArg</entry> + <entry>T{</entry> + </row> + <row> + <entry>Insufficient space for converted type '%s' in widget '%s'</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>internalError</entry> + <entry>shell</entry> + <entry>T{</entry> + </row> + <row> + <entry>Shell's window manager interaction is broken</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidAddressMode</entry> + <entry>computeArgs</entry> + <entry>T{</entry> + </row> + <row> + <entry>Conversion arguments for widget '%s' contain an unsupported address mode</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidArgCount</entry> + <entry>getResources</entry> + <entry>T{</entry> + </row> + <row> + <entry>argument count > 0 on NULL argument list</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidCallbackList</entry> + <entry>xtAddCallback</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find callback list in XtAddCallback</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidCallbackList</entry> + <entry>xtAddCallback</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find callback list in XtAddCallbacks</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidCallbackList</entry> + <entry>xtCallCallback</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find callback list in XtCallCallbacks</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidCallbackList</entry> + <entry>xtRemoveAllCallback</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find callback list in XtRemoveAllCallbacks</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidCallbackList</entry> + <entry>xtRemoveCallback</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find callback list in XtRemoveCallbacks</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidChild</entry> + <entry>xtChangeManagedSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>Null child passed to UnmanageChildren</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidChild</entry> + <entry>xtManageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>null child passed to ManageChildren</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidChild</entry> + <entry>xtManageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>null child passed to XtManageChildren</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidChild</entry> + <entry>xtUnmanageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>Null child passed to XtUnmanageChildren</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidChild</entry> + <entry>xtUnmanageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>Null child found in argument list to unmanage</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidDepth</entry> + <entry>setValues</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't change widget depth</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidExtension</entry> + <entry>xtCreateWidget</entry> + <entry>T{</entry> + </row> + <row> + <entry>widget "%s" class %s has invalid CompositeClassExtension record</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidExtension</entry> + <entry>xtCreateWidget</entry> + <entry>T{</entry> + </row> + <row> + <entry>widget class %s has invalid ConstraintClassExtension record</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidGrab</entry> + <entry>ungrabKeyOrButton</entry> + <entry>T{</entry> + </row> + <row> + <entry>Attempt to remove nonexistent passive grab</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidGrabKind</entry> + <entry>xtPopup</entry> + <entry>T{</entry> + </row> + <row> + <entry>grab kind argument has invalid value; XtGrabNone assumed</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParameters</entry> + <entry>freeTranslations</entry> + <entry>T{</entry> + </row> + <row> + <entry>Freeing XtTranslations requires no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParameters</entry> + <entry>mergeTranslations</entry> + <entry>T{</entry> + </row> + <row> + <entry>MergeTM to TranslationTable needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParameters</entry> + <entry>xtMenuPopdown</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtMenuPopdown called with num_params != 0 or 1</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParameters</entry> + <entry>xtMenuPopupAction</entry> + <entry>T{</entry> + </row> + <row> + <entry>MenuPopup wants exactly one argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidParent</entry> + <entry>xtCopyFromParent</entry> + <entry>T{</entry> + </row> + <row> + <entry>CopyFromParent must have non-NULL parent</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidPopup</entry> + <entry>xtMenuPopup</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't find popup widget "%s" in XtMenuPopup</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidPopup</entry> + <entry>xtMenuPopdown</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't find popup in widget "%s" in XtMenuPopdown</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidPopup</entry> + <entry>unsupportedOperation</entry> + <entry>T{</entry> + </row> + <row> + <entry>Pop-up menu creation is only supported on ButtonPress, KeyPress or EnterNotify events.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidPopup</entry> + <entry>unsupportedOperation</entry> + <entry>T{</entry> + </row> + <row> + <entry>Pop-up menu creation is only supported on Button, Key or EnterNotify events.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidProcedure</entry> + <entry>deleteChild</entry> + <entry>T{</entry> + </row> + <row> + <entry>null delete_child procedure for class %s in XtDestroy</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidProcedure</entry> + <entry>inputHandler</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtRemoveInput: Input handler not found</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidProcedure</entry> + <entry>set_values_almost</entry> + <entry>T{</entry> + </row> + <row> + <entry>set_values_almost procedure shouldn't be NULL</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidResourceCount</entry> + <entry>getResources</entry> + <entry>T{</entry> + </row> + <row> + <entry>resource count > 0 on NULL resource list</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidResourceName</entry> + <entry>computeArgs</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot find resource name %s as argument to conversion</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidShell</entry> + <entry>xtTranslateCoords</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget has no shell ancestor</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>invalidSizeOverride</entry> + <entry>xtDependencies</entry> + <entry>T{</entry> + </row> + <row> + <entry>Representation size %d must match superclass's to override %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>missingCharsetList</entry> + <entry>cvtStringToFontSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>Missing charsets in String to FontSet conversion</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noActionProc</entry> + <entry>xtCallActionProc</entry> + <entry>T{</entry> + </row> + <row> + <entry>No action proc named "%s" is registered for widget "%s"</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noColormap</entry> + <entry>cvtStringToPixel</entry> + <entry>T{</entry> + </row> + <row> + <entry>Cannot allocate colormap entry for "%s"</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noFont</entry> + <entry>cvtStringToFont</entry> + <entry>T{</entry> + </row> + <row> + <entry>Unable to load any usable ISO8859-1 font</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noFont</entry> + <entry>cvtStringToFontSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>Unable to load any usable fontset</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>noFont</entry> + <entry>cvtStringToFontStruct</entry> + <entry>T{</entry> + </row> + <row> + <entry>Unable to load any usable ISO8859-1 font</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.3i) lw(1.4i) lw(2.9i).</entry> + </row> + <row> + <entry>notInConvertSelection</entry> + <entry>xtGetSelectionRequest</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtGetSelectionRequest or XtGetSelectionParameters called for widget "%s" outside of ConvertSelection proc</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>notRectObj</entry> + <entry>xtChangeManagedSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>child "%s", class %s is not a RectObj</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>notRectObj</entry> + <entry>xtManageChildren</entry> + <entry>T{</entry> + </row> + <row> + <entry>child "%s", class %s is not a RectObj</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>nullWidget</entry> + <entry>xtConvertVarToArgList</entry> + <entry>T{</entry> + </row> + <row> + <entry>XtVaTypedArg conversion needs non-NULL widget handle</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>r3versionMismatch</entry> + <entry>widget</entry> + <entry>T{</entry> + </row> + <row> + <entry>Shell Widget class %s binary compiled for R3</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>nullTable</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't remove accelerators from NULL table</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>nullTable</entry> + <entry>T{</entry> + </row> + <row> + <entry>Tried to remove nonexistent accelerators</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>ambiguousActions</entry> + <entry>T{</entry> + </row> + <row> + <entry>Overriding earlier translation manager actions.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>newActions</entry> + <entry>T{</entry> + </row> + <row> + <entry>New actions are:%s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>nullTable</entry> + <entry>T{</entry> + </row> + <row> + <entry>table to (un)merge must not be null</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>nullTable</entry> + <entry>T{</entry> + </row> + <row> + <entry>Can't translate event through NULL table</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>oldActions</entry> + <entry>T{</entry> + </row> + <row> + <entry>Previous entry was: %s %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>unboundActions</entry> + <entry>T{</entry> + </row> + <row> + <entry>Actions not found: %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationError</entry> + <entry>xtTranslateInitialize</entry> + <entry>T{</entry> + </row> + <row> + <entry>Initializing Translation manager twice.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationParseError</entry> + <entry>missingComma</entry> + <entry>T{</entry> + </row> + <row> + <entry> ... possibly due to missing ',' in event sequence.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationParseError</entry> + <entry>nonLatin1</entry> + <entry>T{</entry> + </row> + <row> + <entry> ... probably due to non-Latin1 character in quoted string</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationParseError</entry> + <entry>parseError</entry> + <entry>T{</entry> + </row> + <row> + <entry>translation table syntax error: %s</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationParseError</entry> + <entry>parseString</entry> + <entry>T{</entry> + </row> + <row> + <entry>Missing '"'.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>translationParseError</entry> + <entry>showLine</entry> + <entry>T{</entry> + </row> + <row> + <entry> ... found while parsing '%s'</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>typeConversionError</entry> + <entry>noConverter</entry> + <entry>T{</entry> + </row> + <row> + <entry>No type converter registered for '%s' to '%s' conversion.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>unknownType</entry> + <entry>xtConvertVarToArgList</entry> + <entry>T{</entry> + </row> + <row> + <entry>Unable to find type of resource for conversion</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>unknownType</entry> + <entry>xtGetTypedArg</entry> + <entry>T{</entry> + </row> + <row> + <entry>Unable to find type of resource for conversion</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>versionMismatch</entry> + <entry>widget</entry> + <entry>T{</entry> + </row> + <row> + <entry>Widget class %s version mismatch (recompilation needed):\\n widget %d vs. intrinsics %d.</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntOrPixelToXColor</entry> + <entry>T{</entry> + </row> + <row> + <entry>Pixel to color conversion needs screen and colormap arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToBool</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Bool conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToBoolean</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Boolean conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToFloat</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Float conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToFont</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Font conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToPixel</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Pixel conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToPixmap</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Pixmap conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToShort</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to Short conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtIntToUnsignedChar</entry> + <entry>T{</entry> + </row> + <row> + <entry>Integer to UnsignedChar conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToAcceleratorTable</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to AcceleratorTable conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToAtom</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Atom conversion needs Display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToBool</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Bool conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToBoolean</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Boolean conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToCommandArgArray</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to CommandArgArray conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToCursor</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to cursor conversion needs display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToDimension</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Dimension conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToDirectoryString</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to DirectoryString conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<informaltable> + <tgroup cols='3' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <colspec colname='c3'/> + <tbody> + <row> + <entry>lw(1.3i) lw(1.4i) lw(2.9i).</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToDisplay</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Display conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToFile</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to File conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToFloat</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Float conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToFont</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to font conversion needs display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToFontSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to FontSet conversion needs display and locale arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToFontStruct</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to font conversion needs display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToGravity</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Gravity conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToInitialState</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to InitialState conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToInt</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Integer conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToPixel</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to pixel conversion needs screen and colormap arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToRestartStyle</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to RestartStyle conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToShort</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Integer conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToTranslationTable</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to TranslationTable conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToUnsignedChar</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Integer conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtStringToVisual</entry> + <entry>T{</entry> + </row> + <row> + <entry>String to Visual conversion needs screen and depth arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>cvtXColorToPixel</entry> + <entry>T{</entry> + </row> + <row> + <entry>Color to Pixel conversion needs no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freeCursor</entry> + <entry>T{</entry> + </row> + <row> + <entry>Free Cursor requires display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freeDirectoryString</entry> + <entry>T{</entry> + </row> + <row> + <entry>Free Directory String requires no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freeFile</entry> + <entry>T{</entry> + </row> + <row> + <entry>Free File requires no extra arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freeFont</entry> + <entry>T{</entry> + </row> + <row> + <entry>Free Font needs display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freeFontSet</entry> + <entry>T{</entry> + </row> + <row> + <entry>FreeFontSet needs display and locale arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freeFontStruct</entry> + <entry>T{</entry> + </row> + <row> + <entry>Free FontStruct requires display argument</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>wrongParameters</entry> + <entry>freePixel</entry> + <entry>T{</entry> + </row> + <row> + <entry>Freeing a pixel requires screen and colormap arguments</entry> + </row> + <row> + <entry>T}</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .ps 11 --> +<!-- .nr PS 11 --> +</para> +</chapter> +</book> diff --git a/specs/appE.xml b/specs/appE.xml new file mode 100644 index 0000000..d26921a --- /dev/null +++ b/specs/appE.xml @@ -0,0 +1,1904 @@ +<!-- .\" $Xorg: appE,v 1.3 2000/08/17 19:42:48 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +<!-- .bp --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Appendix E</function>\s-1 + +\s+1<function>\fBDefined Strings</function>\s-1 +<!-- .sp 2 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Appendix E \(em Defined Strings</function> --> +<!-- .XE --> +</para> +<para> +<!-- .LP --> +The +<function>StringDefs.h</function> +header file contains definitions for the following resource name, +class, and representation type symbolic constants. +<!-- .IN "String Constants" "resource names" --> +</para> +<para> +<!-- .LP --> +Resource names: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNaccelerators</entry> + <entry>"accelerators"</entry> + </row> + <row> + <entry>XtNallowHoriz</entry> + <entry>"allowHoriz"</entry> + </row> + <row> + <entry>XtNallowVert</entry> + <entry>"allowVert"</entry> + </row> + <row> + <entry>XtNancestorSensitive</entry> + <entry>"ancestorSensitive"</entry> + </row> + <row> + <entry>XtNbackground</entry> + <entry>"background"</entry> + </row> + <row> + <entry>XtNbackgroundPixmap</entry> + <entry>"backgroundPixmap"</entry> + </row> + <row> + <entry>XtNbitmap</entry> + <entry>"bitmap"</entry> + </row> + <row> + <entry>XtNborder</entry> + <entry>"borderColor"</entry> + </row> + <row> + <entry>XtNborderColor</entry> + <entry>"borderColor"</entry> + </row> + <row> + <entry>XtNborderPixmap</entry> + <entry>"borderPixmap"</entry> + </row> + <row> + <entry>XtNborderWidth</entry> + <entry>"borderWidth"</entry> + </row> + <row> + <entry>XtNcallback</entry> + <entry>"callback"</entry> + </row> + <row> + <entry>XtNchangeHook</entry> + <entry>"changeHook"</entry> + </row> + <row> + <entry>XtNchildren</entry> + <entry>"children"</entry> + </row> + <row> + <entry>XtNcolormap</entry> + <entry>"colormap"</entry> + </row> + <row> + <entry>XtNconfigureHook</entry> + <entry>"configureHook"</entry> + </row> + <row> + <entry>XtNcreateHook</entry> + <entry>"createHook"</entry> + </row> + <row> + <entry>XtNdepth</entry> + <entry>"depth"</entry> + </row> + <row> + <entry>XtNdestroyCallback</entry> + <entry>"destroyCallback"</entry> + </row> + <row> + <entry>XtNdestroyHook</entry> + <entry>"destroyHook"</entry> + </row> + <row> + <entry>XtNeditType</entry> + <entry>"editType"</entry> + </row> + <row> + <entry>XtNfile</entry> + <entry>"file"</entry> + </row> + <row> + <entry>XtNfont</entry> + <entry>"font"</entry> + </row> + <row> + <entry>XtNfontSet</entry> + <entry>"fontSet"</entry> + </row> + <row> + <entry>XtNforceBars</entry> + <entry>"forceBars"</entry> + </row> + <row> + <entry>XtNforeground</entry> + <entry>"foreground"</entry> + </row> + <row> + <entry>XtNfunction</entry> + <entry>"function"</entry> + </row> + <row> + <entry>XtNgeometryHook</entry> + <entry>"geometryHook"</entry> + </row> + <row> + <entry>XtNheight</entry> + <entry>"height"</entry> + </row> + <row> + <entry>XtNhighlight</entry> + <entry>"highlight"</entry> + </row> + <row> + <entry>XtNhSpace</entry> + <entry>"hSpace"</entry> + </row> + <row> + <entry>XtNindex</entry> + <entry>"index"</entry> + </row> + <row> + <entry>XtNinitialResourcesPersistent</entry> + <entry>"initialResourcesPersistent"</entry> + </row> + <row> + <entry>XtNinnerHeight</entry> + <entry>"innerHeight"</entry> + </row> + <row> + <entry>XtNinnerWidth</entry> + <entry>"innerWidth"</entry> + </row> + <row> + <entry>XtNinnerWindow</entry> + <entry>"innerWindow"</entry> + </row> + <row> + <entry>XtNinsertPosition</entry> + <entry>"insertPosition"</entry> + </row> + <row> + <entry>XtNinternalHeight</entry> + <entry>"internalHeight"</entry> + </row> + <row> + <entry>XtNinternalWidth</entry> + <entry>"internalWidth"</entry> + </row> + <row> + <entry>XtNjumpProc</entry> + <entry>"jumpProc"</entry> + </row> + <row> + <entry>XtNjustify</entry> + <entry>"justify"</entry> + </row> + <row> + <entry>XtNknobHeight</entry> + <entry>"knobHeight"</entry> + </row> + <row> + <entry>XtNknobIndent</entry> + <entry>"knobIndent"</entry> + </row> + <row> + <entry>XtNknobPixel</entry> + <entry>"knobPixel"</entry> + </row> + <row> + <entry>XtNknobWidth</entry> + <entry>"knobWidth"</entry> + </row> + <row> + <entry>XtNlabel</entry> + <entry>"label"</entry> + </row> + <row> + <entry>XtNlength</entry> + <entry>"length"</entry> + </row> + <row> + <entry>XtNlowerRight</entry> + <entry>"lowerRight"</entry> + </row> + <row> + <entry>XtNmappedWhenManaged</entry> + <entry>"mappedWhenManaged"</entry> + </row> + <row> + <entry>XtNmenuEntry</entry> + <entry>"menuEntry"</entry> + </row> + <row> + <entry>XtNname</entry> + <entry>"name"</entry> + </row> + <row> + <entry>XtNnotify</entry> + <entry>"notify"</entry> + </row> + <row> + <entry>XtNnumChildren</entry> + <entry>"numChildren"</entry> + </row> + <row> + <entry>XtNnumShells</entry> + <entry>"numShells"</entry> + </row> + <row> + <entry>XtNorientation</entry> + <entry>"orientation"</entry> + </row> + <row> + <entry>XtNparameter</entry> + <entry>"parameter"</entry> + </row> + <row> + <entry>XtNpixmap</entry> + <entry>"pixmap"</entry> + </row> + <row> + <entry>XtNpopupCallback</entry> + <entry>"popupCallback"</entry> + </row> + <row> + <entry>XtNpopdownCallback</entry> + <entry>"popdownCallback"</entry> + </row> + <row> + <entry>XtNresize</entry> + <entry>"resize"</entry> + </row> + <row> + <entry>XtNreverseVideo</entry> + <entry>"reverseVideo"</entry> + </row> + <row> + <entry>XtNscreen</entry> + <entry>"screen"</entry> + </row> + <row> + <entry>XtNscrollProc</entry> + <entry>"scrollProc"</entry> + </row> + <row> + <entry>XtNscrollDCursor</entry> + <entry>"scrollDCursor"</entry> + </row> + <row> + <entry>XtNscrollHCursor</entry> + <entry>"scrollHCursor"</entry> + </row> + <row> + <entry>XtNscrollLCursor</entry> + <entry>"scrollLCursor"</entry> + </row> + <row> + <entry>XtNscrollRCursor</entry> + <entry>"scrollRCursor"</entry> + </row> + <row> + <entry>XtNscrollUCursor</entry> + <entry>"scrollUCursor"</entry> + </row> + <row> + <entry>XtNscrollVCursor</entry> + <entry>"scrollVCursor"</entry> + </row> + <row> + <entry>XtNselection</entry> + <entry>"selection"</entry> + </row> + <row> + <entry>XtNselectionArray</entry> + <entry>"selectionArray"</entry> + </row> + <row> + <entry>XtNsensitive</entry> + <entry>"sensitive"</entry> + </row> + <row> + <entry>XtNsession</entry> + <entry>"session"</entry> + </row> + <row> + <entry>XtNshells</entry> + <entry>"shells"</entry> + </row> + <row> + <entry>XtNshown</entry> + <entry>"shown"</entry> + </row> + <row> + <entry>XtNspace</entry> + <entry>"space"</entry> + </row> + <row> + <entry>XtNstring</entry> + <entry>"string"</entry> + </row> + <row> + <entry>XtNtextOptions</entry> + <entry>"textOptions"</entry> + </row> + <row> + <entry>XtNtextSink</entry> + <entry>"textSink"</entry> + </row> + <row> + <entry>XtNtextSource</entry> + <entry>"textSource"</entry> + </row> + <row> + <entry>XtNthickness</entry> + <entry>"thickness"</entry> + </row> + <row> + <entry>XtNthumb</entry> + <entry>"thumb"</entry> + </row> + <row> + <entry>XtNthumbProc</entry> + <entry>"thumbProc"</entry> + </row> + <row> + <entry>XtNtop</entry> + <entry>"top"</entry> + </row> + <row> + <entry>XtNtranslations</entry> + <entry>"translations"</entry> + </row> + <row> + <entry>XtNunrealizeCallback</entry> + <entry>"unrealizeCallback"</entry> + </row> + <row> + <entry>XtNupdate</entry> + <entry>"update"</entry> + </row> + <row> + <entry>XtNuseBottom</entry> + <entry>"useBottom"</entry> + </row> + <row> + <entry>XtNuseRight</entry> + <entry>"useRight"</entry> + </row> + <row> + <entry>XtNvalue</entry> + <entry>"value"</entry> + </row> + <row> + <entry>XtNvSpace</entry> + <entry>"vSpace"</entry> + </row> + <row> + <entry>XtNwidth</entry> + <entry>"width"</entry> + </row> + <row> + <entry>XtNwindow</entry> + <entry>"window"</entry> + </row> + <row> + <entry>XtNx</entry> + <entry>"x"</entry> + </row> + <row> + <entry>XtNy</entry> + <entry>"y"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +<!-- .IN "String Constants" "resource classes" --> +</para> +<para> +<!-- .LP --> +Resource classes: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtCAccelerators</entry> + <entry>"Accelerators"</entry> + </row> + <row> + <entry>XtCBackground</entry> + <entry>"Background"</entry> + </row> + <row> + <entry>XtCBitmap</entry> + <entry>"Bitmap"</entry> + </row> + <row> + <entry>XtCBoolean</entry> + <entry>"Boolean"</entry> + </row> + <row> + <entry>XtCBorderColor</entry> + <entry>"BorderColor"</entry> + </row> + <row> + <entry>XtCBorderWidth</entry> + <entry>"BorderWidth"</entry> + </row> + <row> + <entry>XtCCallback</entry> + <entry>"Callback"</entry> + </row> + <row> + <entry>XtCColormap</entry> + <entry>"Colormap"</entry> + </row> + <row> + <entry>XtCColor</entry> + <entry>"Color"</entry> + </row> + <row> + <entry>XtCCursor</entry> + <entry>"Cursor"</entry> + </row> + <row> + <entry>XtCDepth</entry> + <entry>"Depth"</entry> + </row> + <row> + <entry>XtCEditType</entry> + <entry>"EditType"</entry> + </row> + <row> + <entry>XtCEventBindings</entry> + <entry>"EventBindings"</entry> + </row> + <row> + <entry>XtCFile</entry> + <entry>"File"</entry> + </row> + <row> + <entry>XtCFont</entry> + <entry>"Font"</entry> + </row> + <row> + <entry>XtCFontSet</entry> + <entry>"FontSet"</entry> + </row> + <row> + <entry>XtCForeground</entry> + <entry>"Foreground"</entry> + </row> + <row> + <entry>XtCFraction</entry> + <entry>"Fraction"</entry> + </row> + <row> + <entry>XtCFunction</entry> + <entry>"Function"</entry> + </row> + <row> + <entry>XtCHeight</entry> + <entry>"Height"</entry> + </row> + <row> + <entry>XtCHSpace</entry> + <entry>"HSpace"</entry> + </row> + <row> + <entry>XtCIndex</entry> + <entry>"Index"</entry> + </row> + <row> + <entry>XtCInitialResourcesPersistent</entry> + <entry>"InitialResourcesPersistent"</entry> + </row> + <row> + <entry>XtCInsertPosition</entry> + <entry>"InsertPosition"</entry> + </row> + <row> + <entry>XtCInterval</entry> + <entry>"Interval"</entry> + </row> + <row> + <entry>XtCJustify</entry> + <entry>"Justify"</entry> + </row> + <row> + <entry>XtCKnobIndent</entry> + <entry>"KnobIndent"</entry> + </row> + <row> + <entry>XtCKnobPixel</entry> + <entry>"KnobPixel"</entry> + </row> + <row> + <entry>XtCLabel</entry> + <entry>"Label"</entry> + </row> + <row> + <entry>XtCLength</entry> + <entry>"Length"</entry> + </row> + <row> + <entry>XtCMappedWhenManaged</entry> + <entry>"MappedWhenManaged"</entry> + </row> + <row> + <entry>XtCMargin</entry> + <entry>"Margin"</entry> + </row> + <row> + <entry>XtCMenuEntry</entry> + <entry>"MenuEntry"</entry> + </row> + <row> + <entry>XtCNotify</entry> + <entry>"Notify"</entry> + </row> + <row> + <entry>XtCOrientation</entry> + <entry>"Orientation"</entry> + </row> + <row> + <entry>XtCParameter</entry> + <entry>"Parameter"</entry> + </row> + <row> + <entry>XtCPixmap</entry> + <entry>"Pixmap"</entry> + </row> + <row> + <entry>XtCPosition</entry> + <entry>"Position"</entry> + </row> + <row> + <entry>XtCReadOnly</entry> + <entry>"ReadOnly"</entry> + </row> + <row> + <entry>XtCResize</entry> + <entry>"Resize"</entry> + </row> + <row> + <entry>XtCReverseVideo</entry> + <entry>"ReverseVideo"</entry> + </row> + <row> + <entry>XtCScreen</entry> + <entry>"Screen"</entry> + </row> + <row> + <entry>XtCScrollProc</entry> + <entry>"ScrollProc"</entry> + </row> + <row> + <entry>XtCScrollDCursor</entry> + <entry>"ScrollDCursor"</entry> + </row> + <row> + <entry>XtCScrollHCursor</entry> + <entry>"ScrollHCursor"</entry> + </row> + <row> + <entry>XtCScrollLCursor</entry> + <entry>"ScrollLCursor"</entry> + </row> + <row> + <entry>XtCScrollRCursor</entry> + <entry>"ScrollRCursor"</entry> + </row> + <row> + <entry>XtCScrollUCursor</entry> + <entry>"ScrollUCursor"</entry> + </row> + <row> + <entry>XtCScrollVCursor</entry> + <entry>"ScrollVCursor"</entry> + </row> + <row> + <entry>XtCSelection</entry> + <entry>"Selection"</entry> + </row> + <row> + <entry>XtCSelectionArray</entry> + <entry>"SelectionArray"</entry> + </row> + <row> + <entry>XtCSensitive</entry> + <entry>"Sensitive"</entry> + </row> + <row> + <entry>XtCSession</entry> + <entry>"Session"</entry> + </row> + <row> + <entry>XtCSpace</entry> + <entry>"Space"</entry> + </row> + <row> + <entry>XtCString</entry> + <entry>"String"</entry> + </row> + <row> + <entry>XtCTextOptions</entry> + <entry>"TextOptions"</entry> + </row> + <row> + <entry>XtCTextPosition</entry> + <entry>"TextPosition"</entry> + </row> + <row> + <entry>XtCTextSink</entry> + <entry>"TextSink"</entry> + </row> + <row> + <entry>XtCTextSource</entry> + <entry>"TextSource"</entry> + </row> + <row> + <entry>XtCThickness</entry> + <entry>"Thickness"</entry> + </row> + <row> + <entry>XtCThumb</entry> + <entry>"Thumb"</entry> + </row> + <row> + <entry>XtCTranslations</entry> + <entry>"Translations"</entry> + </row> + <row> + <entry>XtCValue</entry> + <entry>"Value"</entry> + </row> + <row> + <entry>XtCVSpace</entry> + <entry>"VSpace"</entry> + </row> + <row> + <entry>XtCWidth</entry> + <entry>"Width"</entry> + </row> + <row> + <entry>XtCWindow</entry> + <entry>"Window"</entry> + </row> + <row> + <entry>XtCX</entry> + <entry>"X"</entry> + </row> + <row> + <entry>XtCY</entry> + <entry>"Y"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +<!-- .IN "String Constants" "representation types" --> +</para> +<para> +<!-- .LP --> +Resource representation types: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtRAcceleratorTable</entry> + <entry>"AcceleratorTable"</entry> + </row> + <row> + <entry>XtRAtom</entry> + <entry>"Atom"</entry> + </row> + <row> + <entry>XtRBitmap</entry> + <entry>"Bitmap"</entry> + </row> + <row> + <entry>XtRBool</entry> + <entry>"Bool"</entry> + </row> + <row> + <entry>XtRBoolean</entry> + <entry>"Boolean"</entry> + </row> + <row> + <entry>XtRCallback</entry> + <entry>"Callback"</entry> + </row> + <row> + <entry>XtRCallProc</entry> + <entry>"CallProc"</entry> + </row> + <row> + <entry>XtRCardinal</entry> + <entry>"Cardinal"</entry> + </row> + <row> + <entry>XtRColor</entry> + <entry>"Color"</entry> + </row> + <row> + <entry>XtRColormap</entry> + <entry>"Colormap"</entry> + </row> + <row> + <entry>XtRCommandArgArray</entry> + <entry>"CommandArgArray"</entry> + </row> + <row> + <entry>XtRCursor</entry> + <entry>"Cursor"</entry> + </row> + <row> + <entry>XtRDimension</entry> + <entry>"Dimension"</entry> + </row> + <row> + <entry>XtRDirectoryString</entry> + <entry>"DirectoryString"</entry> + </row> + <row> + <entry>XtRDisplay</entry> + <entry>"Display"</entry> + </row> + <row> + <entry>XtREditMode</entry> + <entry>"EditMode"</entry> + </row> + <row> + <entry>XtREnum</entry> + <entry>"Enum"</entry> + </row> + <row> + <entry>XtREnvironmentArray</entry> + <entry>"EnvironmentArray"</entry> + </row> + <row> + <entry>XtRFile</entry> + <entry>"File"</entry> + </row> + <row> + <entry>XtRFloat</entry> + <entry>"Float"</entry> + </row> + <row> + <entry>XtRFont</entry> + <entry>"Font"</entry> + </row> + <row> + <entry>XtRFontSet</entry> + <entry>"FontSet"</entry> + </row> + <row> + <entry>XtRFontStruct</entry> + <entry>"FontStruct"</entry> + </row> + <row> + <entry>XtRFunction</entry> + <entry>"Function"</entry> + </row> + <row> + <entry>XtRGeometry</entry> + <entry>"Geometry"</entry> + </row> + <row> + <entry>XtRGravity</entry> + <entry>"Gravity"</entry> + </row> + <row> + <entry>XtRImmediate</entry> + <entry>"Immediate"</entry> + </row> + <row> + <entry>XtRInitialState</entry> + <entry>"InitialState"</entry> + </row> + <row> + <entry>XtRInt</entry> + <entry>"Int"</entry> + </row> + <row> + <entry>XtRJustify</entry> + <entry>"Justify"</entry> + </row> + <row> + <entry>XtRLongBoolean</entry> + <entry>XtRBool</entry> + </row> + <row> + <entry>XtRObject</entry> + <entry>"Object"</entry> + </row> + <row> + <entry>XtROrientation</entry> + <entry>"Orientation"</entry> + </row> + <row> + <entry>XtRPixel</entry> + <entry>"Pixel"</entry> + </row> + <row> + <entry>XtRPixmap</entry> + <entry>"Pixmap"</entry> + </row> + <row> + <entry>XtRPointer</entry> + <entry>"Pointer"</entry> + </row> + <row> + <entry>XtRPosition</entry> + <entry>"Position"</entry> + </row> + <row> + <entry>XtRRestartStyle</entry> + <entry>"RestartStyle"</entry> + </row> + <row> + <entry>XtRScreen</entry> + <entry>"Screen"</entry> + </row> + <row> + <entry>XtRShort</entry> + <entry>"Short"</entry> + </row> + <row> + <entry>XtRSmcConn</entry> + <entry>"SmcConn"</entry> + </row> + <row> + <entry>XtRString</entry> + <entry>"String"</entry> + </row> + <row> + <entry>XtRStringArray</entry> + <entry>"StringArray"</entry> + </row> + <row> + <entry>XtRStringTable</entry> + <entry>"StringTable"</entry> + </row> + <row> + <entry>XtRUnsignedChar</entry> + <entry>"UnsignedChar"</entry> + </row> + <row> + <entry>XtRTranslationTable</entry> + <entry>"TranslationTable"</entry> + </row> + <row> + <entry>XtRVisual</entry> + <entry>"Visual"</entry> + </row> + <row> + <entry>XtRWidget</entry> + <entry>"Widget"</entry> + </row> + <row> + <entry>XtRWidgetClass</entry> + <entry>"WidgetClass"</entry> + </row> + <row> + <entry>XtRWidgetList</entry> + <entry>"WidgetList"</entry> + </row> + <row> + <entry>XtRWindow</entry> + <entry>"Window"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +Boolean enumeration constants: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtEoff</entry> + <entry>"off"</entry> + </row> + <row> + <entry>XtEfalse</entry> + <entry>"false"</entry> + </row> + <row> + <entry>XtEno</entry> + <entry>"no"</entry> + </row> + <row> + <entry>XtEon</entry> + <entry>"on"</entry> + </row> + <row> + <entry>XtEtrue</entry> + <entry>"true"</entry> + </row> + <row> + <entry>XtEyes</entry> + <entry>"yes"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +Orientation enumeration constants: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtEvertical</entry> + <entry>"vertical"</entry> + </row> + <row> + <entry>XtEhorizontal</entry> + <entry>"horizontal"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +Text edit enumeration constants: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtEtextRead</entry> + <entry>"read"</entry> + </row> + <row> + <entry>XtEtextAppend</entry> + <entry>"append"</entry> + </row> + <row> + <entry>XtEtextEdit</entry> + <entry>"edit"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +Color enumeration constants: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtExtdefaultbackground</entry> + <entry>"xtdefaultbackground"</entry> + </row> + <row> + <entry>XtExtdefaultforeground</entry> + <entry>"xtdefaultforeground"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +Font constant: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtExtdefaultfont</entry> + <entry>"xtdefaultfont"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +Hooks for External Agents constants: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtHcreate</entry> + <entry>"Xtcreate"</entry> + </row> + <row> + <entry>XtHsetValues</entry> + <entry>"Xtsetvalues"</entry> + </row> + <row> + <entry>XtHmanageChildren</entry> + <entry>"XtmanageChildren"</entry> + </row> + <row> + <entry>XtHunmanageChildren</entry> + <entry>"XtunmanageChildren"</entry> + </row> + <row> + <entry>XtHmanageSet</entry> + <entry>"XtmanageSet"</entry> + </row> + <row> + <entry>XtHunmanageSet</entry> + <entry>"XtunmanageSet"</entry> + </row> + <row> + <entry>XtHrealizeWidget</entry> + <entry>"XtrealizeWidget"</entry> + </row> + <row> + <entry>XtHunrealizeWidget</entry> + <entry>"XtunrealizeWidget"</entry> + </row> + <row> + <entry>XtHaddCallback</entry> + <entry>"XtaddCallback"</entry> + </row> + <row> + <entry>XtHaddCallbacks</entry> + <entry>"XtaddCallbacks"</entry> + </row> + <row> + <entry>XtHremoveCallback</entry> + <entry>"XtremoveCallback"</entry> + </row> + <row> + <entry>XtHremoveCallbacks</entry> + <entry>"XtremoveCallbacks"</entry> + </row> + <row> + <entry>XtHremoveAllCallbacks</entry> + <entry>"XtremoveAllCallbacks"</entry> + </row> + <row> + <entry>XtHaugmentTranslations</entry> + <entry>"XtaugmentTranslations"</entry> + </row> + <row> + <entry>XtHoverrideTranslations</entry> + <entry>"XtoverrideTranslations"</entry> + </row> + <row> + <entry>XtHuninstallTranslations</entry> + <entry>"XtuninstallTranslations"</entry> + </row> + <row> + <entry>XtHsetKeyboardFocus</entry> + <entry>"XtsetKeyboardFocus"</entry> + </row> + <row> + <entry>XtHsetWMColormapWindows</entry> + <entry>"XtsetWMColormapWindows"</entry> + </row> + <row> + <entry>XtHmapWidget</entry> + <entry>"XtmapWidget"</entry> + </row> + <row> + <entry>XtHunmapWidget</entry> + <entry>"XtunmapWidget"</entry> + </row> + <row> + <entry>XtHpopup</entry> + <entry>"Xtpopup"</entry> + </row> + <row> + <entry>XtHpopupSpringLoaded</entry> + <entry>"XtpopupSpringLoaded"</entry> + </row> + <row> + <entry>XtHpopdown</entry> + <entry>"Xtpopdown"</entry> + </row> + <row> + <entry>XtHconfigure</entry> + <entry>"Xtconfigure"</entry> + </row> + <row> + <entry>XtHpreGeometry</entry> + <entry>"XtpreGeometry"</entry> + </row> + <row> + <entry>XtHpostGeometry</entry> + <entry>"XtpostGeometry"</entry> + </row> + <row> + <entry>XtHdestroy</entry> + <entry>"Xtdestroy"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +</para> +<para> +<!-- .LP --> +The +<function>Shell.h</function> +header file contains definitions for the following resource name, +class, and representation type symbolic constants. +<!-- .IN "String Constants" "resource names" --> +</para> +<para> +<!-- .LP --> +Resource names: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtNallowShellResize</entry> + <entry>"allowShellResize"</entry> + </row> + <row> + <entry>XtNargc</entry> + <entry>"argc"</entry> + </row> + <row> + <entry>XtNargv</entry> + <entry>"argv"</entry> + </row> + <row> + <entry>XtNbaseHeight</entry> + <entry>"baseHeight"</entry> + </row> + <row> + <entry>XtNbaseWidth</entry> + <entry>"baseWidth"</entry> + </row> + <row> + <entry>XtNcancelCallback</entry> + <entry>"cancelCallback"</entry> + </row> + <row> + <entry>XtNclientLeader</entry> + <entry>"clientLeader"</entry> + </row> + <row> + <entry>XtNcloneCommand</entry> + <entry>"cloneCommand"</entry> + </row> + <row> + <entry>XtNconnection</entry> + <entry>"connection"</entry> + </row> + <row> + <entry>XtNcreatePopupChildProc</entry> + <entry>"createPopupChildProc"</entry> + </row> + <row> + <entry>XtNcurrentDirectory</entry> + <entry>"currentDirectory"</entry> + </row> + <row> + <entry>XtNdieCallback</entry> + <entry>"dieCallback"</entry> + </row> + <row> + <entry>XtNdiscardCommand</entry> + <entry>"discardCommand"</entry> + </row> + <row> + <entry>XtNenvironment</entry> + <entry>"environment"</entry> + </row> + <row> + <entry>XtNerrorCallback</entry> + <entry>"errorCallback"</entry> + </row> + <row> + <entry>XtNgeometry</entry> + <entry>"geometry"</entry> + </row> + <row> + <entry>XtNheightInc</entry> + <entry>"heightInc"</entry> + </row> + <row> + <entry>XtNiconMask</entry> + <entry>"iconMask"</entry> + </row> + <row> + <entry>XtNiconName</entry> + <entry>"iconName"</entry> + </row> + <row> + <entry>XtNiconNameEncoding</entry> + <entry>"iconNameEncoding"</entry> + </row> + <row> + <entry>XtNiconPixmap</entry> + <entry>"iconPixmap"</entry> + </row> + <row> + <entry>XtNiconWindow</entry> + <entry>"iconWindow"</entry> + </row> + <row> + <entry>XtNiconX</entry> + <entry>"iconX"</entry> + </row> + <row> + <entry>XtNiconY</entry> + <entry>"iconY"</entry> + </row> + <row> + <entry>XtNiconic</entry> + <entry>"iconic"</entry> + </row> + <row> + <entry>XtNinitialState</entry> + <entry>"initialState"</entry> + </row> + <row> + <entry>XtNinput</entry> + <entry>"input"</entry> + </row> + <row> + <entry>XtNinteractCallback</entry> + <entry>"interactCallback"</entry> + </row> + <row> + <entry>XtNjoinSession</entry> + <entry>"joinSession"</entry> + </row> + <row> + <entry>XtNmaxAspectX</entry> + <entry>"maxAspectX"</entry> + </row> + <row> + <entry>XtNmaxAspectY</entry> + <entry>"maxAspectY"</entry> + </row> + <row> + <entry>XtNmaxHeight</entry> + <entry>"maxHeight"</entry> + </row> + <row> + <entry>XtNmaxWidth</entry> + <entry>"maxWidth"</entry> + </row> + <row> + <entry>XtNminAspectX</entry> + <entry>"minAspectX"</entry> + </row> + <row> + <entry>XtNminAspectY</entry> + <entry>"minAspectY"</entry> + </row> + <row> + <entry>XtNminHeight</entry> + <entry>"minHeight"</entry> + </row> + <row> + <entry>XtNminWidth</entry> + <entry>"minWidth"</entry> + </row> + <row> + <entry>XtNoverrideRedirect</entry> + <entry>"overrideRedirect"</entry> + </row> + <row> + <entry>XtNprogramPath</entry> + <entry>"programPath"</entry> + </row> + <row> + <entry>XtNresignCommand</entry> + <entry>"resignCommand"</entry> + </row> + <row> + <entry>XtNrestartCommand</entry> + <entry>"restartCommand"</entry> + </row> + <row> + <entry>XtNrestartStyle</entry> + <entry>"restartStyle"</entry> + </row> + <row> + <entry>XtNsaveCallback</entry> + <entry>"saveCallback"</entry> + </row> + <row> + <entry>XtNsaveCompleteCallback</entry> + <entry>"saveCompleteCallback"</entry> + </row> + <row> + <entry>XtNsaveUnder</entry> + <entry>"saveUnder"</entry> + </row> + <row> + <entry>XtNsessionID</entry> + <entry>"sessionID"</entry> + </row> + <row> + <entry>XtNshutdownCommand</entry> + <entry>"shutdownCommand"</entry> + </row> + <row> + <entry>XtNtitle</entry> + <entry>"title"</entry> + </row> + <row> + <entry>XtNtitleEncoding</entry> + <entry>"titleEncoding"</entry> + </row> + <row> + <entry>XtNtransient</entry> + <entry>"transient"</entry> + </row> + <row> + <entry>XtNtransientFor</entry> + <entry>"transientFor"</entry> + </row> + <row> + <entry>XtNurgency</entry> + <entry>"urgency"</entry> + </row> + <row> + <entry>XtNvisual</entry> + <entry>"visual"</entry> + </row> + <row> + <entry>XtNwaitForWm</entry> + <entry>"waitforwm"</entry> + </row> + <row> + <entry>XtNwaitforwm</entry> + <entry>"waitforwm"</entry> + </row> + <row> + <entry>XtNwidthInc</entry> + <entry>"widthInc"</entry> + </row> + <row> + <entry>XtNwindowGroup</entry> + <entry>"windowGroup"</entry> + </row> + <row> + <entry>XtNwindowRole</entry> + <entry>"windowRole"</entry> + </row> + <row> + <entry>XtNwinGravity</entry> + <entry>"winGravity"</entry> + </row> + <row> + <entry>XtNwmTimeout</entry> + <entry>"wmTimeout"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +<!-- .IN "String Constants" "resource classes" --> +</para> +<para> +<!-- .LP --> +Resource classes: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtCAllowShellResize</entry> + <entry>"allowShellResize"</entry> + </row> + <row> + <entry>XtCArgc</entry> + <entry>"Argc"</entry> + </row> + <row> + <entry>XtCArgv</entry> + <entry>"Argv"</entry> + </row> + <row> + <entry>XtCBaseHeight</entry> + <entry>"BaseHeight"</entry> + </row> + <row> + <entry>XtCBaseWidth</entry> + <entry>"BaseWidth"</entry> + </row> + <row> + <entry>XtCClientLeader</entry> + <entry>"ClientLeader"</entry> + </row> + <row> + <entry>XtCCloneCommand</entry> + <entry>"CloneCommand"</entry> + </row> + <row> + <entry>XtCConnection</entry> + <entry>"Connection"</entry> + </row> + <row> + <entry>XtCCreatePopupChildProc</entry> + <entry>"CreatePopupChildProc"</entry> + </row> + <row> + <entry>XtCCurrentDirectory</entry> + <entry>"CurrentDirectory"</entry> + </row> + <row> + <entry>XtCDiscardCommand</entry> + <entry>"DiscardCommand"</entry> + </row> + <row> + <entry>XtCEnvironment</entry> + <entry>"Environment"</entry> + </row> + <row> + <entry>XtCGeometry</entry> + <entry>"Geometry"</entry> + </row> + <row> + <entry>XtCHeightInc</entry> + <entry>"HeightInc"</entry> + </row> + <row> + <entry>XtCIconMask</entry> + <entry>"IconMask"</entry> + </row> + <row> + <entry>XtCIconName</entry> + <entry>"IconName"</entry> + </row> + <row> + <entry>XtCIconNameEncoding</entry> + <entry>"IconNameEncoding"</entry> + </row> + <row> + <entry>XtCIconPixmap</entry> + <entry>"IconPixmap"</entry> + </row> + <row> + <entry>XtCIconWindow</entry> + <entry>"IconWindow"</entry> + </row> + <row> + <entry>XtCIconX</entry> + <entry>"IconX"</entry> + </row> + <row> + <entry>XtCIconY</entry> + <entry>"IconY"</entry> + </row> + <row> + <entry>XtCIconic</entry> + <entry>"Iconic"</entry> + </row> + <row> + <entry>XtCInitialState</entry> + <entry>"InitialState"</entry> + </row> + <row> + <entry>XtCInput</entry> + <entry>"Input"</entry> + </row> + <row> + <entry>XtCJoinSession</entry> + <entry>"JoinSession"</entry> + </row> + <row> + <entry>XtCMaxAspectX</entry> + <entry>"MaxAspectX"</entry> + </row> + <row> + <entry>XtCMaxAspectY</entry> + <entry>"MaxAspectY"</entry> + </row> + <row> + <entry>XtCMaxHeight</entry> + <entry>"MaxHeight"</entry> + </row> + <row> + <entry>XtCMaxWidth</entry> + <entry>"MaxWidth"</entry> + </row> + <row> + <entry>XtCMinAspectX</entry> + <entry>"MinAspectX"</entry> + </row> + <row> + <entry>XtCMinAspectY</entry> + <entry>"MinAspectY"</entry> + </row> + <row> + <entry>XtCMinHeight</entry> + <entry>"MinHeight"</entry> + </row> + <row> + <entry>XtCMinWidth</entry> + <entry>"MinWidth"</entry> + </row> + <row> + <entry>XtCOverrideRedirect</entry> + <entry>"OverrideRedirect"</entry> + </row> + <row> + <entry>XtCProgramPath</entry> + <entry>"ProgramPath"</entry> + </row> + <row> + <entry>XtCResignCommand</entry> + <entry>"ResignCommand"</entry> + </row> + <row> + <entry>XtCRestartCommand</entry> + <entry>"RestartCommand"</entry> + </row> + <row> + <entry>XtCRestartStyle</entry> + <entry>"RestartStyle"</entry> + </row> + <row> + <entry>XtCSaveUnder</entry> + <entry>"SaveUnder"</entry> + </row> + <row> + <entry>XtCSessionID</entry> + <entry>"SessionID"</entry> + </row> + <row> + <entry>XtCShutdownCommand</entry> + <entry>"ShutdownCommand"</entry> + </row> + <row> + <entry>XtCTitle</entry> + <entry>"Title"</entry> + </row> + <row> + <entry>XtCTitleEncoding</entry> + <entry>"TitleEncoding"</entry> + </row> + <row> + <entry>XtCTransient</entry> + <entry>"Transient"</entry> + </row> + <row> + <entry>XtCTransientFor</entry> + <entry>"TransientFor"</entry> + </row> + <row> + <entry>XtCUrgency</entry> + <entry>"Urgency"</entry> + </row> + <row> + <entry>XtCVisual</entry> + <entry>"Visual"</entry> + </row> + <row> + <entry>XtCWaitForWm</entry> + <entry>"Waitforwm"</entry> + </row> + <row> + <entry>XtCWaitforwm</entry> + <entry>"Waitforwm"</entry> + </row> + <row> + <entry>XtCWidthInc</entry> + <entry>"WidthInc"</entry> + </row> + <row> + <entry>XtCWindowGroup</entry> + <entry>"WindowGroup"</entry> + </row> + <row> + <entry>XtCWindowRole</entry> + <entry>"WindowRole"</entry> + </row> + <row> + <entry>XtCWinGravity</entry> + <entry>"WinGravity"</entry> + </row> + <row> + <entry>XtCWmTimeout</entry> + <entry>"WmTimeout"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +<!-- .sp 6p --> +<!-- .IN "String Constants" "representation types" --> +</para> +<para> +<!-- .LP --> +Resource representation types: +<informaltable> + <tgroup cols='2' align='center'> + <colspec colname='c1'/> + <colspec colname='c2'/> + <tbody> + <row> + <entry>lw(2i) lw(2.5i).</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>Symbol</entry> + <entry>Definition</entry> + </row> + <row> + <entry>_</entry> + </row> + <row> + <entry>XtRAtom</entry> + <entry>"Atom"</entry> + </row> + <row> + <entry>_</entry> + </row> + </tbody> + </tgroup> +</informaltable> +</para> +</chapter> +</book> diff --git a/specs/appF.xml b/specs/appF.xml new file mode 100644 index 0000000..a3f5bd8 --- /dev/null +++ b/specs/appF.xml @@ -0,0 +1,159 @@ +<!-- .\" $Xorg: appF,v 1.3 2000/08/17 19:42:49 cpqbld Exp $ --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" X Consortium --> +<!-- .\" --> +<!-- .\" Permission is hereby granted, free of charge, to any person obtaining --> +<!-- .\" a copy of this software and associated documentation files (the --> +<!-- .\" "Software"), to deal in the Software without restriction, including --> +<!-- .\" without limitation the rights to use, copy, modify, merge, publish, --> +<!-- .\" distribute, sublicense, and/or sell copies of the Software, and to --> +<!-- .\" permit persons to whom the Software is furnished to do so, subject to --> +<!-- .\" the following conditions: --> +<!-- .\" --> +<!-- .\" The above copyright notice and this permission notice shall be included --> +<!-- .\" in all copies or substantial portions of the Software. --> +<!-- .\" --> +<!-- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --> +<!-- .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --> +<!-- .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --> +<!-- .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR --> +<!-- .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, --> +<!-- .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR --> +<!-- .\" OTHER DEALINGS IN THE SOFTWARE. --> +<!-- .\" --> +<!-- .\" Except as contained in this notice, the name of the X Consortium shall --> +<!-- .\" not be used in advertising or otherwise to promote the sale, use or --> +<!-- .\" other dealings in this Software without prior written authorization --> +<!-- .\" from the X Consortium. --> +<!-- .\" --> +<!-- .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994 --> +<!-- .\" Digital Equipment Corporation, Maynard, Massachusetts. --> +<!-- .\" --> +<!-- .\" Permission to use, copy, modify and distribute this documentation for any --> +<!-- .\" purpose and without fee is hereby granted, provided that the above copyright --> +<!-- .\" notice appears in all copies and that both that copyright notice and this --> +<!-- .\" permission notice appear in supporting documentation, and that the name of --> +<!-- .\" Digital not be used in in advertising or publicity pertaining --> +<!-- .\" to distribution of the software without specific, written prior permission. --> +<!-- .\" Digital makes no representations about the suitability of the --> +<!-- .\" software described herein for any purpose. --> +<!-- .\" It is provided ``as is'' without express or implied warranty. --> +<!-- .\" --> +<!-- .bp --> +\& +<!-- .sp 1 --> +<!-- .ce 3 --> +\s+1<function>Appendix F</function>\s-1 + +\s+1<function>Resource Configuration Management</function>\s-1 +<!-- .sp 2 --> +<para> +<!-- .LP --> +<!-- .XS --> +<!-- <function>Appendix F \(em Resource Configuration Management</function> --> +<!-- .XE --> +Setting and changing resources in X applications can be difficult for +both the application programmer and the end user. \fBResource +Configuration Management (RCM)\fP addresses this problem by changing +the <function>X Intrinsics</function> to immediately modify a resource for a +specified widget and each child widget in the hierarchy. +In this context, immediate means: no sourcing of a resource +file is required; the application does not need to be restarted for the +new resource values to take effect; and the change +occurs immediately. +</para> +<para> +<!-- .LP --> +The main difference between <function>RCM</function> and the <function>Editres</function> +protocol is that the <function>RCM</function> +customizing hooks reside in the <function>Intrinsics</function> and thus are linked with +other toolkits such as Motif and the Athena widgets. However, the +<function>EditRes</function> protocol requires the application to link with the +<function>EditRes</function> +routines in the Xmu library and Xmu is not used by all applications that +use Motif. Also, the <function>EditRes</function> protocol uses ClientMessage, +whereas the +<function>RCM</function> <function>Intrinsics</function> hooks use <function>PropertyNotify</function> events. +</para> +<para> +<!-- .LP --> +X Properties and the <function>PropertyNotify</function> events are used +to implement <function>RCM</function> and +allow on-the-fly resource customization. When the X Toolkit is +initialized, two atoms are interned with the strings +<emphasis remap='I'>Custom Init</emphasis> and +<emphasis remap='I'>Custom Data</emphasis>. Both +<function>_XtCreatePopupShell</function> +and +<function>_XtAppCreateShell</function> +register a <function>PropertyNotify</function> event handler to handle these properties. +</para> +<para> +<!-- .LP --> +A customization tool uses the <emphasis remap='I'>Custom Init</emphasis> property to <emphasis remap='I'>ping</emphasis> an +application to get the application's toplevel window. When the +application's property notify event handler is invoked, the handler +deletes the property. No data is transferred in this property. +</para> +<para> +<!-- .LP --> +A customization tool uses the <emphasis remap='I'>Custom Data</emphasis> property to tell an +application that it should change a resource's value. The data in +the property contains the length of the resource name (the number +of bytes in the resource name), the resource name and the new +value for the resource. This property's type is <function>XA_STRING</function> and +the format of the string is: +</para> +<itemizedlist> + <listitem> + <para> +The length of the resource name (the number of bytes in +the resource name) + </para> + </listitem> + <listitem> + <para> +One space character + </para> + </listitem> + <listitem> + <para> +The resource name + </para> + </listitem> + <listitem> + <para> +One space character + </para> + </listitem> + <listitem> + <para> +The resource value + </para> + </listitem> +</itemizedlist> +<para> +<!-- .LP --> +When setting the application's resource, the event handler calls +functions to walk the application's widget tree, determining which +widgets are affected by the resource string, and then applying the value +with +<function>XtSetValues.</function> +As the widget tree is recursively descended, at +each level in the widget tree a resource part is tested for a match. +When the entire resource string has been matched, the value is applied +to the widget or widgets. +</para> +<para> +<!-- .LP --> +Before a value is set on a widget, it is first determined if the last +part of the resource is a valid resource for that widget. It must also +add the resource to the application's resource database and then query +it using specific resource strings that is builds from the widget +information. + + + +</para> +</chapter> +</book> |